From 04be1e9980a1f413446353393e713b4660176ca7 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 8 Feb 2021 01:30:49 +0100 Subject: [PATCH 001/519] Code quality: Refactor asset operators using C++ * Attempt to improve readability by using focused, coherent helper classes. * Replace ListBase with blender::Vector, which is more efficient and has a better API. * Split user reporting from error checking. * Use namespace (as we usually do for C++ code). * Remove unused headers --- source/blender/editors/asset/asset_ops.cc | 196 ++++++++++++---------- 1 file changed, 104 insertions(+), 92 deletions(-) diff --git a/source/blender/editors/asset/asset_ops.cc b/source/blender/editors/asset/asset_ops.cc index 6c4ef8923a2..8ca1b488a1d 100644 --- a/source/blender/editors/asset/asset_ops.cc +++ b/source/blender/editors/asset/asset_ops.cc @@ -18,124 +18,128 @@ * \ingroup edasset */ -#include - -#include "BKE_asset.h" #include "BKE_context.h" #include "BKE_report.h" -#include "BLI_listbase.h" -#include "BLI_string_utils.h" -#include "BLI_utildefines.h" - -#include "DNA_asset_types.h" -#include "DNA_userdef_types.h" +#include "BLI_vector.hh" #include "ED_asset.h" -#include "MEM_guardedalloc.h" - #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" /* -------------------------------------------------------------------- */ -struct AssetMarkResultStats { - int tot_created; - int tot_already_asset; - ID *last_id; -}; +using PointerRNAVec = blender::Vector; -static bool asset_ops_poll(bContext *UNUSED(C)) +static bool asset_operation_poll(bContext * /*C*/) { return U.experimental.use_asset_browser; } /** - * Return the IDs to operate on as list of #CollectionPointerLink links. Needs freeing. + * Return the IDs to operate on as PointerRNA vector. Either a single one ("id" context member) or + * multiple ones ("selected_ids" context member). */ -static ListBase /* CollectionPointerLink */ asset_operation_get_ids_from_context(const bContext *C) +static PointerRNAVec asset_operation_get_ids_from_context(const bContext *C) { - ListBase list = {0}; + PointerRNAVec ids; PointerRNA idptr = CTX_data_pointer_get_type(C, "id", &RNA_ID); - if (idptr.data) { - CollectionPointerLink *ctx_link = (CollectionPointerLink *)MEM_callocN(sizeof(*ctx_link), - __func__); - ctx_link->ptr = idptr; - BLI_addtail(&list, ctx_link); + /* Single ID. */ + ids.append(idptr); } else { + ListBase list; CTX_data_selected_ids(C, &list); + LISTBASE_FOREACH (CollectionPointerLink *, link, &list) { + ids.append(link->ptr); + } + BLI_freelistN(&list); } - return list; + return ids; } -static void asset_mark_for_idptr_list(const bContext *C, - const ListBase /* CollectionPointerLink */ *ids, - struct AssetMarkResultStats *r_stats) +/* -------------------------------------------------------------------- */ + +class AssetMarkHelper { + public: + void operator()(const bContext &C, PointerRNAVec &ids); + + void reportResults(ReportList &reports) const; + bool wasSuccessful() const; + + private: + struct Stats { + int tot_created = 0; + int tot_already_asset = 0; + ID *last_id = nullptr; + }; + + Stats stats; +}; + +void AssetMarkHelper::operator()(const bContext &C, PointerRNAVec &ids) { - memset(r_stats, 0, sizeof(*r_stats)); + for (PointerRNA &ptr : ids) { + BLI_assert(RNA_struct_is_ID(ptr.type)); - LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) { - BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type)); - - ID *id = (ID *)ctx_id->ptr.data; + ID *id = static_cast(ptr.data); if (id->asset_data) { - r_stats->tot_already_asset++; + stats.tot_already_asset++; continue; } - if (ED_asset_mark_id(C, id)) { - r_stats->last_id = id; - r_stats->tot_created++; + if (ED_asset_mark_id(&C, id)) { + stats.last_id = id; + stats.tot_created++; } } } -static bool asset_mark_results_report(const struct AssetMarkResultStats *stats, - ReportList *reports) +bool AssetMarkHelper::wasSuccessful() const +{ + return stats.tot_created > 0; +} + +void AssetMarkHelper::reportResults(ReportList &reports) const { /* User feedback on failure. */ - if ((stats->tot_created < 1) && (stats->tot_already_asset > 0)) { - BKE_report(reports, - RPT_ERROR, - "Selected data-blocks are already assets (or do not support use as assets)"); - return false; + if (!wasSuccessful()) { + if ((stats.tot_already_asset > 0)) { + BKE_report(&reports, + RPT_ERROR, + "Selected data-blocks are already assets (or do not support use as assets)"); + } + else { + BKE_report(&reports, + RPT_ERROR, + "No data-blocks to create assets for found (or do not support use as assets)"); + } } - if (stats->tot_created < 1) { - BKE_report(reports, - RPT_ERROR, - "No data-blocks to create assets for found (or do not support use as assets)"); - return false; - } - /* User feedback on success. */ - if (stats->tot_created == 1) { + else if (stats.tot_created == 1) { /* If only one data-block: Give more useful message by printing asset name. */ - BKE_reportf(reports, RPT_INFO, "Data-block '%s' is now an asset", stats->last_id->name + 2); + BKE_reportf(&reports, RPT_INFO, "Data-block '%s' is now an asset", stats.last_id->name + 2); } else { - BKE_reportf(reports, RPT_INFO, "%i data-blocks are now assets", stats->tot_created); + BKE_reportf(&reports, RPT_INFO, "%i data-blocks are now assets", stats.tot_created); } - - return true; } static int asset_mark_exec(bContext *C, wmOperator *op) { - ListBase ids = asset_operation_get_ids_from_context(C); + PointerRNAVec ids = asset_operation_get_ids_from_context(C); - struct AssetMarkResultStats stats; - asset_mark_for_idptr_list(C, &ids, &stats); - BLI_freelistN(&ids); + AssetMarkHelper mark_helper; + mark_helper(*C, ids); + mark_helper.reportResults(*op->reports); - if (!asset_mark_results_report(&stats, op->reports)) { + if (!mark_helper.wasSuccessful()) { return OPERATOR_CANCELLED; } @@ -154,67 +158,75 @@ static void ASSET_OT_mark(wmOperatorType *ot) ot->idname = "ASSET_OT_mark"; ot->exec = asset_mark_exec; - ot->poll = asset_ops_poll; + ot->poll = asset_operation_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /* -------------------------------------------------------------------- */ -struct AssetClearResultStats { - int tot_removed; - ID *last_id; +class AssetClearHelper { + public: + void operator()(PointerRNAVec &ids); + + void reportResults(ReportList &reports) const; + bool wasSuccessful() const; + + private: + struct Stats { + int tot_cleared = 0; + ID *last_id = nullptr; + }; + + Stats stats; }; -static void asset_clear_from_idptr_list(const ListBase /* CollectionPointerLink */ *ids, - AssetClearResultStats *r_stats) +void AssetClearHelper::operator()(PointerRNAVec &ids) { - memset(r_stats, 0, sizeof(*r_stats)); + for (PointerRNA &ptr : ids) { + BLI_assert(RNA_struct_is_ID(ptr.type)); - LISTBASE_FOREACH (CollectionPointerLink *, ctx_id, ids) { - BLI_assert(RNA_struct_is_ID(ctx_id->ptr.type)); - - ID *id = (ID *)ctx_id->ptr.data; + ID *id = static_cast(ptr.data); if (!id->asset_data) { continue; } if (ED_asset_clear_id(id)) { - r_stats->tot_removed++; - r_stats->last_id = id; + stats.tot_cleared++; + stats.last_id = id; } } } -static bool asset_clear_result_report(const AssetClearResultStats *stats, ReportList *reports) - +void AssetClearHelper::reportResults(ReportList &reports) const { - if (stats->tot_removed < 1) { - BKE_report(reports, RPT_ERROR, "No asset data-blocks selected/focused"); - return false; + if (!wasSuccessful()) { + BKE_report(&reports, RPT_ERROR, "No asset data-blocks selected/focused"); } - - if (stats->tot_removed == 1) { + else if (stats.tot_cleared == 1) { /* If only one data-block: Give more useful message by printing asset name. */ BKE_reportf( - reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats->last_id->name + 2); + &reports, RPT_INFO, "Data-block '%s' is no asset anymore", stats.last_id->name + 2); } else { - BKE_reportf(reports, RPT_INFO, "%i data-blocks are no assets anymore", stats->tot_removed); + BKE_reportf(&reports, RPT_INFO, "%i data-blocks are no assets anymore", stats.tot_cleared); } +} - return true; +bool AssetClearHelper::wasSuccessful() const +{ + return stats.tot_cleared > 0; } static int asset_clear_exec(bContext *C, wmOperator *op) { - ListBase ids = asset_operation_get_ids_from_context(C); + PointerRNAVec ids = asset_operation_get_ids_from_context(C); - AssetClearResultStats stats; - asset_clear_from_idptr_list(&ids, &stats); - BLI_freelistN(&ids); + AssetClearHelper clear_helper; + clear_helper(ids); + clear_helper.reportResults(*op->reports); - if (!asset_clear_result_report(&stats, op->reports)) { + if (!clear_helper.wasSuccessful()) { return OPERATOR_CANCELLED; } @@ -233,7 +245,7 @@ static void ASSET_OT_clear(wmOperatorType *ot) ot->idname = "ASSET_OT_clear"; ot->exec = asset_clear_exec; - ot->poll = asset_ops_poll; + ot->poll = asset_operation_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } From 8acd58a1a910663503b661d6cde40ead8302861b Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 8 Feb 2021 03:05:23 +0100 Subject: [PATCH 002/519] Cleanup: Remove dead code for keymap Outliner display mode This wasn't used for a long time and there are no plans to bring this back. --- .../editors/space_outliner/outliner_select.c | 21 --------- .../editors/space_outliner/outliner_tree.c | 47 ------------------- source/blender/makesdna/DNA_outliner_types.h | 18 ++++--- 3 files changed, 8 insertions(+), 78 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 1ef5735d7d2..4a58736966c 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -927,25 +927,6 @@ static eOLDrawState tree_element_active_sequence_dup(Scene *scene, return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_keymap_item(bContext *UNUSED(C), - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) -{ - wmKeyMapItem *kmi = te->directdata; - - if (set == OL_SETSEL_NONE) { - if (kmi->flag & KMI_INACTIVE) { - return OL_DRAWSEL_NONE; - } - return OL_DRAWSEL_NORMAL; - } - kmi->flag ^= KMI_INACTIVE; - return OL_DRAWSEL_NONE; -} - static eOLDrawState tree_element_active_master_collection(bContext *C, TreeElement *UNUSED(te), const eOLSetState set) @@ -1071,8 +1052,6 @@ eOLDrawState tree_element_type_active(bContext *C, return tree_element_active_sequence(C, tvc->scene, te, tselem, set); case TSE_SEQUENCE_DUP: return tree_element_active_sequence_dup(tvc->scene, te, tselem, set); - case TSE_KEYMAP_ITEM: - return tree_element_active_keymap_item(C, tvc->scene, tvc->view_layer, te, tselem, set); case TSE_GP_LAYER: return tree_element_active_gplayer(C, tvc->scene, te, tselem, set); break; diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c index 7df6115cb06..f94f19246fa 100644 --- a/source/blender/editors/space_outliner/outliner_tree.c +++ b/source/blender/editors/space_outliner/outliner_tree.c @@ -991,9 +991,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (type == TSE_ID_BASE) { /* pass */ } - else if (ELEM(type, TSE_KEYMAP, TSE_KEYMAP_ITEM)) { - /* pass */ - } else { /* Other cases must be caught above. */ BLI_assert(TSE_IS_REAL_ID(tselem)); @@ -1214,50 +1211,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, te->flag |= TE_FREE_NAME; } } - else if (type == TSE_KEYMAP) { - wmKeyMap *km = (wmKeyMap *)idv; - char opname[OP_MAX_TYPENAME]; - - te->directdata = idv; - te->name = km->idname; - - if (TSELEM_OPEN(tselem, space_outliner)) { - int a; - LISTBASE_FOREACH_INDEX (wmKeyMapItem *, kmi, &km->items, a) { - const char *key = WM_key_event_string(kmi->type, false); - - if (key[0]) { - wmOperatorType *ot = NULL; - - if (kmi->propvalue) { - /* pass */ - } - else { - ot = WM_operatortype_find(kmi->idname, 0); - } - - if (ot || kmi->propvalue) { - TreeElement *ten = outliner_add_element( - space_outliner, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a); - - ten->directdata = kmi; - - if (kmi->propvalue) { - ten->name = IFACE_("Modal map, not yet"); - } - else { - WM_operator_py_idname(opname, ot->idname); - ten->name = BLI_strdup(opname); - ten->flag |= TE_FREE_NAME; - } - } - } - } - } - else { - te->flag |= TE_LAZY_CLOSED; - } - } return te; } diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index 8a8a40a5069..44d808138d9 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -103,14 +103,14 @@ enum { #define TSE_SEQ_STRIP 27 /* NO ID */ #define TSE_SEQUENCE_DUP 28 /* NO ID */ #define TSE_LINKED_PSYS 29 -#define TSE_RNA_STRUCT 30 /* NO ID */ -#define TSE_RNA_PROPERTY 31 /* NO ID */ -#define TSE_RNA_ARRAY_ELEM 32 /* NO ID */ -#define TSE_NLA_TRACK 33 /* NO ID */ -#define TSE_KEYMAP 34 /* NO ID */ -#define TSE_KEYMAP_ITEM 35 /* NO ID */ -#define TSE_ID_BASE 36 /* NO ID */ -#define TSE_GP_LAYER 37 /* NO ID */ +#define TSE_RNA_STRUCT 30 /* NO ID */ +#define TSE_RNA_PROPERTY 31 /* NO ID */ +#define TSE_RNA_ARRAY_ELEM 32 /* NO ID */ +#define TSE_NLA_TRACK 33 /* NO ID */ +/* #define TSE_KEYMAP 34 */ /* UNUSED */ +/* #define TSE_KEYMAP_ITEM 35 */ /* UNUSED */ +#define TSE_ID_BASE 36 /* NO ID */ +#define TSE_GP_LAYER 37 /* NO ID */ #define TSE_LAYER_COLLECTION 38 #define TSE_SCENE_COLLECTION_BASE 39 #define TSE_VIEW_COLLECTION_BASE 40 @@ -132,8 +132,6 @@ enum { TSE_RNA_STRUCT, \ TSE_RNA_PROPERTY, \ TSE_RNA_ARRAY_ELEM, \ - TSE_KEYMAP, \ - TSE_KEYMAP_ITEM, \ TSE_ID_BASE, \ TSE_GP_LAYER)) From fd05e31d3f1e80544c33aa7217823ac9956c61f3 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 8 Feb 2021 03:08:35 +0100 Subject: [PATCH 003/519] Cleanup: Use enum for Outliner tree-store element types We generally prefer using enums over precompiler defines. This adds an actual type for the values, which the compiler can use to throw warnings, give better messages, etc. --- source/blender/makesdna/DNA_outliner_types.h | 94 ++++++++++---------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index 44d808138d9..cec133abd9f 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -72,53 +72,55 @@ enum { }; /** #TreeStoreElem.types */ -#define TSE_NLA 1 /* NO ID */ -#define TSE_NLA_ACTION 2 -#define TSE_DEFGROUP_BASE 3 -#define TSE_DEFGROUP 4 -#define TSE_BONE 5 -#define TSE_EBONE 6 -#define TSE_CONSTRAINT_BASE 7 -#define TSE_CONSTRAINT 8 -#define TSE_MODIFIER_BASE 9 -#define TSE_MODIFIER 10 -#define TSE_LINKED_OB 11 -/* #define TSE_SCRIPT_BASE 12 */ /* UNUSED */ -#define TSE_POSE_BASE 13 -#define TSE_POSE_CHANNEL 14 -#define TSE_ANIM_DATA 15 -#define TSE_DRIVER_BASE 16 /* NO ID */ -/* #define TSE_DRIVER 17 */ /* UNUSED */ +typedef enum eTreeStoreElemType { + TSE_NLA = 1, /* NO ID */ + TSE_NLA_ACTION = 2, + TSE_DEFGROUP_BASE = 3, + TSE_DEFGROUP = 4, + TSE_BONE = 5, + TSE_EBONE = 6, + TSE_CONSTRAINT_BASE = 7, + TSE_CONSTRAINT = 8, + TSE_MODIFIER_BASE = 9, + TSE_MODIFIER = 10, + TSE_LINKED_OB = 11, + /* TSE_SCRIPT_BASE = 12, */ /* UNUSED */ + TSE_POSE_BASE = 13, + TSE_POSE_CHANNEL = 14, + TSE_ANIM_DATA = 15, + TSE_DRIVER_BASE = 16, /* NO ID */ + /* TSE_DRIVER = 17, */ /* UNUSED */ -#define TSE_PROXY 18 -#define TSE_R_LAYER_BASE 19 -#define TSE_R_LAYER 20 -/* #define TSE_R_PASS 21 */ /* UNUSED */ -#define TSE_LINKED_MAT 22 -/* NOTE, is used for light group */ -#define TSE_LINKED_LAMP 23 -#define TSE_POSEGRP_BASE 24 -#define TSE_POSEGRP 25 -#define TSE_SEQUENCE 26 /* NO ID */ -#define TSE_SEQ_STRIP 27 /* NO ID */ -#define TSE_SEQUENCE_DUP 28 /* NO ID */ -#define TSE_LINKED_PSYS 29 -#define TSE_RNA_STRUCT 30 /* NO ID */ -#define TSE_RNA_PROPERTY 31 /* NO ID */ -#define TSE_RNA_ARRAY_ELEM 32 /* NO ID */ -#define TSE_NLA_TRACK 33 /* NO ID */ -/* #define TSE_KEYMAP 34 */ /* UNUSED */ -/* #define TSE_KEYMAP_ITEM 35 */ /* UNUSED */ -#define TSE_ID_BASE 36 /* NO ID */ -#define TSE_GP_LAYER 37 /* NO ID */ -#define TSE_LAYER_COLLECTION 38 -#define TSE_SCENE_COLLECTION_BASE 39 -#define TSE_VIEW_COLLECTION_BASE 40 -#define TSE_SCENE_OBJECTS_BASE 41 -#define TSE_GPENCIL_EFFECT_BASE 42 -#define TSE_GPENCIL_EFFECT 43 -#define TSE_LIBRARY_OVERRIDE_BASE 44 -#define TSE_LIBRARY_OVERRIDE 45 + TSE_PROXY = 18, + TSE_R_LAYER_BASE = 19, + TSE_R_LAYER = 20, + /* TSE_R_PASS = 21, */ /* UNUSED */ + TSE_LINKED_MAT = 22, + /* NOTE, is used for light group */ + TSE_LINKED_LAMP = 23, + TSE_POSEGRP_BASE = 24, + TSE_POSEGRP = 25, + TSE_SEQUENCE = 26, /* NO ID */ + TSE_SEQ_STRIP = 27, /* NO ID */ + TSE_SEQUENCE_DUP = 28, /* NO ID */ + TSE_LINKED_PSYS = 29, + TSE_RNA_STRUCT = 30, /* NO ID */ + TSE_RNA_PROPERTY = 31, /* NO ID */ + TSE_RNA_ARRAY_ELEM = 32, /* NO ID */ + TSE_NLA_TRACK = 33, /* NO ID */ + /* TSE_KEYMAP = 34, */ /* UNUSED */ + /* TSE_KEYMAP_ITEM = 35, */ /* UNUSED */ + TSE_ID_BASE = 36, /* NO ID */ + TSE_GP_LAYER = 37, /* NO ID */ + TSE_LAYER_COLLECTION = 38, + TSE_SCENE_COLLECTION_BASE = 39, + TSE_VIEW_COLLECTION_BASE = 40, + TSE_SCENE_OBJECTS_BASE = 41, + TSE_GPENCIL_EFFECT_BASE = 42, + TSE_GPENCIL_EFFECT = 43, + TSE_LIBRARY_OVERRIDE_BASE = 44, + TSE_LIBRARY_OVERRIDE = 45, +} eTreeStoreElemType; /** Check whether given #TreeStoreElem should have a real ID in #TreeStoreElem.id member. */ #define TSE_IS_REAL_ID(_tse) \ From 9d6059504c62f72d3b5f4f10676db27663d6a559 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 8 Feb 2021 03:19:13 +0100 Subject: [PATCH 004/519] Cleanup: Remove unused tree element types These weren't used since ages. Comment out the DNA define (value shouldn't be reused to avoid compatibility breakage) and remove icon code for the types. --- source/blender/editors/space_outliner/outliner_draw.c | 6 ------ source/blender/makesdna/DNA_outliner_types.h | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 35756ea5ac7..76c710b3db1 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -2287,12 +2287,6 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) case TSE_R_LAYER: data.icon = ICON_RENDER_RESULT; break; - case TSE_LINKED_LAMP: - data.icon = ICON_LIGHT_DATA; - break; - case TSE_LINKED_MAT: - data.icon = ICON_MATERIAL_DATA; - break; case TSE_POSEGRP_BASE: case TSE_POSEGRP: data.icon = ICON_GROUP_BONE; diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index cec133abd9f..16129768b60 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -95,9 +95,9 @@ typedef enum eTreeStoreElemType { TSE_R_LAYER_BASE = 19, TSE_R_LAYER = 20, /* TSE_R_PASS = 21, */ /* UNUSED */ - TSE_LINKED_MAT = 22, + /* TSE_LINKED_MAT = 22, */ /* NOTE, is used for light group */ - TSE_LINKED_LAMP = 23, + /* TSE_LINKED_LAMP = 23, */ TSE_POSEGRP_BASE = 24, TSE_POSEGRP = 25, TSE_SEQUENCE = 26, /* NO ID */ From 62ef35db6d7f06f7c84e66a86ea7b989305a3b2d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 8 Feb 2021 11:10:21 +0100 Subject: [PATCH 005/519] Fix strict uninitialized warning for C++ Allows to compile Blender without uninitialized warning in Bullet code. --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc19ca4393f..81f28d3c77e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1437,6 +1437,7 @@ if(CMAKE_COMPILER_IS_GNUCC) # gcc 4.2 gives annoying warnings on every file with this if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3") ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNINITIALIZED -Wuninitialized) + ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNINITIALIZED -Wuninitialized) endif() # versions before gcc4.6 give many BLI_math warnings @@ -1501,11 +1502,13 @@ if(CMAKE_COMPILER_IS_GNUCC) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_FORMAT -Wno-format) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_SWITCH -Wno-switch) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_VARIABLE -Wno-unused-variable) + ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_VARIABLE -Wno-uninitialized) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_CLASS_MEMACCESS -Wno-class-memaccess) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_COMMENT -Wno-comment) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_TYPEDEFS -Wno-unused-local-typedefs) ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_VARIABLE -Wno-unused-variable) + ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_VARIABLE -Wno-uninitialized) if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "7.0")) ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_IMPLICIT_FALLTHROUGH -Wno-implicit-fallthrough) From c33a3cfd9aaba9686d24349189bb2a9b6351cdfb Mon Sep 17 00:00:00 2001 From: Sebastian Koenig Date: Mon, 8 Feb 2021 11:11:33 +0100 Subject: [PATCH 006/519] Mask: Use control point position when handle is selected This is something what comes after an experiment, which makes behavior more desirable. Basically, for Lock-to-Selection functionality always use control point position if any of control point itself or handles are selected. Initial patch from Sebastian, modification from Sergey. Differential Revision: https://developer.blender.org/D10265 --- source/blender/editors/include/ED_mask.h | 2 +- source/blender/editors/mask/mask_query.c | 31 ++++++++++++++----- .../blender/editors/space_clip/clip_utils.c | 21 +++++++------ .../blender/editors/space_image/image_ops.c | 2 +- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/source/blender/editors/include/ED_mask.h b/source/blender/editors/include/ED_mask.h index b20dae694fc..247911bdc55 100644 --- a/source/blender/editors/include/ED_mask.h +++ b/source/blender/editors/include/ED_mask.h @@ -66,7 +66,7 @@ void ED_mask_cursor_location_get(struct ScrArea *area, float cursor[2]); bool ED_mask_selected_minmax(const struct bContext *C, float min[2], float max[2], - bool include_handles); + bool handles_as_control_point); /* mask_draw.c */ void ED_mask_draw(const struct bContext *C, const char draw_flag, const char draw_type); diff --git a/source/blender/editors/mask/mask_query.c b/source/blender/editors/mask/mask_query.c index eace146dbe9..401b6eac4f2 100644 --- a/source/blender/editors/mask/mask_query.c +++ b/source/blender/editors/mask/mask_query.c @@ -604,7 +604,22 @@ void ED_mask_point_pos__reverse( *yr = co[1]; } -bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2], bool include_handles) +static void handle_position_for_minmax(const MaskSplinePoint *point, + eMaskWhichHandle which_handle, + bool handles_as_control_point, + float r_handle[2]) +{ + if (handles_as_control_point) { + copy_v2_v2(r_handle, point->bezt.vec[1]); + return; + } + BKE_mask_point_handle(point, which_handle, r_handle); +} + +bool ED_mask_selected_minmax(const bContext *C, + float min[2], + float max[2], + bool handles_as_control_point) { Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Mask *mask = CTX_data_edit_mask(C); @@ -641,22 +656,22 @@ bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2], bool ok = true; } - if (!include_handles) { - /* Ignore handles. */ - } - else if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_STICK, handle); + if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_STICK, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } else { if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_LEFT, handle); + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_LEFT, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { - BKE_mask_point_handle(deform_point, MASK_WHICH_HANDLE_RIGHT, handle); + handle_position_for_minmax( + deform_point, MASK_WHICH_HANDLE_RIGHT, handles_as_control_point, handle); minmax_v2v2_v2(min, max, handle); ok = true; } diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index 271ec219809..bb79eb34129 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -484,7 +484,7 @@ static bool tracking_has_selection(SpaceClip *space_clip) return false; } -static bool mask_has_selection(const bContext *C, bool include_handles) +static bool mask_has_selection(const bContext *C) { Mask *mask = CTX_data_edit_mask(C); if (mask == NULL) { @@ -506,10 +506,7 @@ static bool mask_has_selection(const bContext *C, bool include_handles) return true; } - if (!include_handles) { - /* Ignore handles. */ - } - else if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { + if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { return true; } else { @@ -527,14 +524,17 @@ static bool mask_has_selection(const bContext *C, bool include_handles) return false; } -static bool selected_boundbox(const bContext *C, float min[2], float max[2], bool include_handles) +static bool selected_boundbox(const bContext *C, + float min[2], + float max[2], + bool handles_as_control_point) { SpaceClip *sc = CTX_wm_space_clip(C); if (sc->mode == SC_MODE_TRACKING) { return selected_tracking_boundbox(sc, min, max); } - if (ED_mask_selected_minmax(C, min, max, include_handles)) { + if (ED_mask_selected_minmax(C, min, max, handles_as_control_point)) { MovieClip *clip = ED_space_clip_get_clip(sc); int width, height; ED_space_clip_get_size(sc, &width, &height); @@ -563,12 +563,13 @@ bool clip_view_calculate_view_selection( /* NOTE: The `fit` argument is set to truth when doing "View to Selected" operator, and it set to * false when this function is used for Lock-to-Selection functionality. When locking to - * selection the handles are to be ignored. So we can derive the `include_handles` from `fit`. + * selection the handles are to use control point position. So we can derive the + * `handles_as_control_point` from `fit`. * * TODO(sergey): Make such decision more explicit. Maybe pass use-case for the calculation to * tell operator from lock-to-selection apart. */ float min[2], max[2]; - if (!selected_boundbox(C, min, max, fit)) { + if (!selected_boundbox(C, min, max, !fit)) { return false; } @@ -622,7 +623,7 @@ bool clip_view_has_locked_selection(const bContext *C) return tracking_has_selection(space_clip); } - return mask_has_selection(C, false); + return mask_has_selection(C); } void clip_draw_sfra_efra(View2D *v2d, Scene *scene) diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index e7f468f2f26..a3052a919e7 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -898,7 +898,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) } } else if (ED_space_image_check_show_maskedit(sima, obedit)) { - if (!ED_mask_selected_minmax(C, min, max, true)) { + if (!ED_mask_selected_minmax(C, min, max, false)) { return OPERATOR_CANCELLED; } } From 4402f43b7119c8ee1e76fdb261454e04e4bb9520 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Mon, 8 Feb 2021 11:30:26 +0100 Subject: [PATCH 007/519] Fix T85426: Speed effect stretch to input not working `seq_effect_speed_get_strip_content_length()` checked only for number of inputs of target strip, even if it's not an effect. Only effects are treated in different way, so check for type as well. Broken by 93c10797dc35e17bbd96f3711a151acf2d184848 Reviewed By: sergey Differential Revision: https://developer.blender.org/D10356 --- source/blender/sequencer/intern/effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/sequencer/intern/effects.c b/source/blender/sequencer/intern/effects.c index 65c768076c5..fc8a5c62744 100644 --- a/source/blender/sequencer/intern/effects.c +++ b/source/blender/sequencer/intern/effects.c @@ -3157,7 +3157,7 @@ static void store_icu_yrange_speed(Sequence *seq, short UNUSED(adrcode), float * */ static int seq_effect_speed_get_strip_content_length(const Sequence *seq) { - if (SEQ_effect_get_num_inputs(seq->type) == 0) { + if ((seq->type & SEQ_TYPE_EFFECT) != 0 && SEQ_effect_get_num_inputs(seq->type) == 0) { return seq->enddisp - seq->startdisp; } From 15d1a43445d67a8faf916a93efcb76c90c64de54 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 8 Feb 2021 12:26:27 +0100 Subject: [PATCH 008/519] install_deps: Update OpenXR to 1.0.14. --- build_files/build_environment/install_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 9c898a04d55..08f50dda9c6 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -569,7 +569,7 @@ FFMPEG_FORCE_REBUILD=false FFMPEG_SKIP=false _ffmpeg_list_sep=";" -XR_OPENXR_VERSION="1.0.8" +XR_OPENXR_VERSION="1.0.14" XR_OPENXR_VERSION_SHORT="1.0" XR_OPENXR_VERSION_MIN="1.0.8" XR_OPENXR_VERSION_MAX="2.0" From 2ca3a1d2ae7b2c08d348f49f90b1b697d80f47a9 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 8 Feb 2021 12:45:59 +0100 Subject: [PATCH 009/519] install_deps: Update TBB to 2020_U2 --- build_files/build_environment/install_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 08f50dda9c6..16cead024f7 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -445,11 +445,11 @@ BOOST_FORCE_BUILD=false BOOST_FORCE_REBUILD=false BOOST_SKIP=false -TBB_VERSION="2019" -TBB_VERSION_SHORT="2019" -TBB_VERSION_UPDATE="_U9" # Used for source packages... +TBB_VERSION="2020" +TBB_VERSION_SHORT="2020" +TBB_VERSION_UPDATE="_U2" # Used for source packages... TBB_VERSION_MIN="2018" -TBB_VERSION_MAX="2021" +TBB_VERSION_MAX="2022" TBB_FORCE_BUILD=false TBB_FORCE_REBUILD=false TBB_SKIP=false From bb0b250cbded8bb89d89e67cc2b39826bf3f7fa6 Mon Sep 17 00:00:00 2001 From: Sam Miller Date: Mon, 8 Feb 2021 13:32:57 +0100 Subject: [PATCH 010/519] Fix T85368: map range node clamps incorrectly in geometry nodes When clamp is enabled, it should clamp between the output min and max and not between 0 and 1. Differential Revision: https://developer.blender.org/D10324 --- source/blender/nodes/shader/nodes/node_shader_map_range.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_map_range.cc b/source/blender/nodes/shader/nodes/node_shader_map_range.cc index 4a6c9ec9a4d..c01e390c513 100644 --- a/source/blender/nodes/shader/nodes/node_shader_map_range.cc +++ b/source/blender/nodes/shader/nodes/node_shader_map_range.cc @@ -122,7 +122,8 @@ class MapRangeFunction : public blender::fn::MultiFunction { if (clamp_) { for (int64_t i : mask) { - CLAMP(results[i], 0.0f, 1.0f); + results[i] = (to_min[i] > to_max[i]) ? clamp_f(results[i], to_max[i], to_min[i]) : + clamp_f(results[i], to_min[i], to_max[i]); } } } From bc56c127704f937d7fdfee082975bc0fa01f4b52 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 3 Feb 2021 19:25:16 -0300 Subject: [PATCH 011/519] Cleanup: Rearrange and name the enums and flags used in the transform code Simple change that shows all the enums used in the transform code and helps to better understand the role of the members of the struct TransInfo. It also allows the IDE to show the name of the value represented by the member instead of a number that needs to be consulted. Differential Revision: https://developer.blender.org/D10312 --- source/blender/editors/include/ED_transform.h | 21 +- source/blender/editors/transform/transform.h | 457 ++++++++++-------- .../editors/transform/transform_convert.c | 2 +- .../editors/transform/transform_convert.h | 28 -- .../transform/transform_draw_cursors.c | 2 + 5 files changed, 261 insertions(+), 249 deletions(-) diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 2ab062a718c..8f1be847e2b 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -40,7 +40,7 @@ void transform_operatortypes(void); /* ******************** Macros & Prototypes *********************** */ /* MODE AND NUMINPUT FLAGS */ -enum TfmMode { +typedef enum { TFM_INIT = -1, TFM_DUMMY, TFM_TRANSLATION, @@ -77,24 +77,7 @@ enum TfmMode { TFM_BONE_ENVELOPE_DIST, TFM_NORMAL_ROTATION, TFM_GPENCIL_OPACITY, -}; - -/* TRANSFORM CONTEXTS */ -#define CTX_NONE 0 -#define CTX_TEXTURE (1 << 0) -#define CTX_EDGE (1 << 1) -#define CTX_NO_PET (1 << 2) -#define CTX_NO_MIRROR (1 << 3) -#define CTX_AUTOCONFIRM (1 << 4) -#define CTX_MOVIECLIP (1 << 6) -#define CTX_MASK (1 << 7) -#define CTX_PAINT_CURVE (1 << 8) -#define CTX_GPENCIL_STROKES (1 << 9) -#define CTX_CURSOR (1 << 10) -/** When transforming object's, adjust the object data so it stays in the same place. */ -#define CTX_OBMODE_XFORM_OBDATA (1 << 11) -/** Transform object parents without moving their children. */ -#define CTX_OBMODE_XFORM_SKIP_CHILDREN (1 << 12) +} eTfmMode; /* Standalone call to get the transformation center corresponding to the current situation * returns 1 if successful, 0 otherwise (usually means there's no selection) diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index fff7d47cc5b..72f43a14b11 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -36,6 +36,11 @@ #include "transform_data.h" +/* use node center for transform instead of upper-left corner. + * disabled since it makes absolute snapping not work so nicely + */ +// #define USE_NODE_CENTER + /* -------------------------------------------------------------------- */ /** \name Types/ * \{ */ @@ -60,6 +65,133 @@ struct wmKeyMap; struct wmOperator; struct wmTimer; +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Enums and Flags + * \{ */ + +/** #TransInfo.options */ +typedef enum { + CTX_NONE = 0, + CTX_TEXTURE = (1 << 0), + CTX_EDGE = (1 << 1), + CTX_NO_PET = (1 << 2), + CTX_NO_MIRROR = (1 << 3), + CTX_AUTOCONFIRM = (1 << 4), + CTX_MOVIECLIP = (1 << 6), + CTX_MASK = (1 << 7), + CTX_PAINT_CURVE = (1 << 8), + CTX_GPENCIL_STROKES = (1 << 9), + CTX_CURSOR = (1 << 10), + /** When transforming object's, adjust the object data so it stays in the same place. */ + CTX_OBMODE_XFORM_OBDATA = (1 << 11), + /** Transform object parents without moving their children. */ + CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 12), +} eTContext; + +/** #TransInfo.flag */ +typedef enum { + T_OBJECT = 1 << 0, + /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */ + T_EDIT = 1 << 1, + T_POSE = 1 << 2, + T_TEXTURE = 1 << 3, + /** Transforming the 3d view. */ + T_CAMERA = 1 << 4, + /** Transforming the 3D cursor. */ + T_CURSOR = 1 << 5, + /** Transform points, having no rotation/scale. */ + T_POINTS = 1 << 6, + /** restrictions flags */ + T_NO_CONSTRAINT = 1 << 7, + T_NULL_ONE = 1 << 8, + T_NO_ZERO = 1 << 9, + T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO, + + T_PROP_EDIT = 1 << 10, + T_PROP_CONNECTED = 1 << 11, + T_PROP_PROJECTED = 1 << 12, + T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, + + T_V3D_ALIGN = 1 << 13, + /** For 2D views such as UV or f-curve. */ + T_2D_EDIT = 1 << 14, + T_CLIP_UV = 1 << 15, + + /** Auto-IK is on. */ + T_AUTOIK = 1 << 16, + + /** Don't use mirror even if the data-block option is set. */ + T_NO_MIRROR = 1 << 17, + + /** To indicate that the value set in the `value` parameter is the final + * value of the transformation, modified only by the constrain. */ + T_INPUT_IS_VALUES_FINAL = 1 << 18, + + /** To specify if we save back settings at the end. */ + T_MODAL = 1 << 19, + + /** No re-topology (projection). */ + T_NO_PROJECT = 1 << 20, + + T_RELEASE_CONFIRM = 1 << 21, + + /** Alternative transformation. used to add offset to tracking markers. */ + T_ALT_TRANSFORM = 1 << 22, + + /** #TransInfo.center has been set, don't change it. */ + T_OVERRIDE_CENTER = 1 << 23, + + T_MODAL_CURSOR_SET = 1 << 24, + + T_CLNOR_REBUILD = 1 << 25, + + /** Merges unselected into selected after transforming (runs after transforming). */ + T_AUTOMERGE = 1 << 26, + /** Runs auto-merge & splits. */ + T_AUTOSPLIT = 1 << 27, +} eTFlag; + +/** #TransInfo.modifiers */ +typedef enum { + MOD_CONSTRAINT_SELECT = 1 << 0, + MOD_PRECISION = 1 << 1, + MOD_SNAP = 1 << 2, + MOD_SNAP_INVERT = 1 << 3, + MOD_CONSTRAINT_PLANE = 1 << 4, +} eTModifier; + +/** #TransSnap.status */ +typedef enum { + SNAP_FORCED = 1 << 0, + TARGET_INIT = 1 << 1, + POINT_INIT = 1 << 2, + MULTI_POINTS = 1 << 3, +} eTSnap; + +/** #TransCon.mode, #TransInfo.con.mode */ +typedef enum { + /** When set constraints are in use. */ + CON_APPLY = 1 << 0, + /** These are only used for modal execution. */ + CON_AXIS0 = 1 << 1, + CON_AXIS1 = 1 << 2, + CON_AXIS2 = 1 << 3, + CON_SELECT = 1 << 4, + /** Does not reorient vector to face viewport when on. */ + CON_NOFLIP = 1 << 5, + CON_USER = 1 << 6, +} eTConstraint; + +/** #TransInfo.state */ +typedef enum { + TRANS_STARTING = 0, + TRANS_RUNNING = 1, + TRANS_CONFIRM = 2, + TRANS_CANCEL = 3, +} eTState; + /** #TransInfo.redraw */ typedef enum { TREDRAW_NOTHING = 0, @@ -67,6 +199,95 @@ typedef enum { TREDRAW_SOFT = 2, } eRedrawFlag; +/** #TransInfo.helpline */ +typedef enum { + HLP_NONE = 0, + HLP_SPRING = 1, + HLP_ANGLE = 2, + HLP_HARROW = 3, + HLP_VARROW = 4, + HLP_CARROW = 5, + HLP_TRACKBALL = 6, +} eTHelpline; + +typedef enum { + TC_NONE = 0, + TC_ACTION_DATA, + TC_POSE, + TC_ARMATURE_VERTS, + TC_CURSOR_IMAGE, + TC_CURSOR_VIEW3D, + TC_CURVE_VERTS, + TC_GRAPH_EDIT_DATA, + TC_GPENCIL, + TC_LATTICE_VERTS, + TC_MASKING_DATA, + TC_MBALL_VERTS, + TC_MESH_VERTS, + TC_MESH_EDGES, + TC_MESH_SKIN, + TC_MESH_UV, + TC_NLA_DATA, + TC_NODE_DATA, + TC_OBJECT, + TC_OBJECT_TEXSPACE, + TC_PAINT_CURVE_VERTS, + TC_PARTICLE_VERTS, + TC_SCULPT, + TC_SEQ_DATA, + TC_TRACKING_DATA, +} eTConvertType; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Keymap Modal Items + * + * \note these values are saved in key-map files, do not change then but just add new ones. + * \{ */ + +enum { + TFM_MODAL_CANCEL = 1, + TFM_MODAL_CONFIRM = 2, + TFM_MODAL_TRANSLATE = 3, + TFM_MODAL_ROTATE = 4, + TFM_MODAL_RESIZE = 5, + TFM_MODAL_SNAP_INV_ON = 6, + TFM_MODAL_SNAP_INV_OFF = 7, + TFM_MODAL_SNAP_TOGGLE = 8, + TFM_MODAL_AXIS_X = 9, + TFM_MODAL_AXIS_Y = 10, + TFM_MODAL_AXIS_Z = 11, + TFM_MODAL_PLANE_X = 12, + TFM_MODAL_PLANE_Y = 13, + TFM_MODAL_PLANE_Z = 14, + TFM_MODAL_CONS_OFF = 15, + TFM_MODAL_ADD_SNAP = 16, + TFM_MODAL_REMOVE_SNAP = 17, + + /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */ + // NUM_MODAL_INCREMENT_UP = 18, + // NUM_MODAL_INCREMENT_DOWN = 19, + + TFM_MODAL_PROPSIZE_UP = 20, + TFM_MODAL_PROPSIZE_DOWN = 21, + TFM_MODAL_AUTOIK_LEN_INC = 22, + TFM_MODAL_AUTOIK_LEN_DEC = 23, + + TFM_MODAL_EDGESLIDE_UP = 24, + TFM_MODAL_EDGESLIDE_DOWN = 25, + + /** For analog input, like track-pad. */ + TFM_MODAL_PROPSIZE = 26, + /** Node editor insert offset (also called auto-offset) direction toggle. */ + TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27, + + TFM_MODAL_AUTOCONSTRAINT = 28, + TFM_MODAL_AUTOCONSTRAINTPLANE = 29, +}; + +/** \} */ + typedef struct TransSnapPoint { struct TransSnapPoint *next, *prev; float co[3]; @@ -82,7 +303,7 @@ typedef struct TransSnap { bool snap_self; bool peel; bool use_backface_culling; - char status; + eTSnap status; /* Snapped Element Type (currently for objects only). */ char snapElem; /** snapping from this point (in global-space). */ @@ -120,7 +341,7 @@ typedef struct TransCon { * the one in #TransInfo is not guarantee to stay the same (Rotates change it). */ int imval[2]; /** Mode flags of the constraint. */ - int mode; + eTConstraint mode; void (*drawExtra)(struct TransInfo *t); /* Note: if 'tc' is NULL, 'td' must also be NULL. @@ -266,37 +487,45 @@ typedef struct TransInfo { TransDataContainer *data_container; int data_container_len; - /** #eTransConvertType - * TODO: It should be a member of #TransDataContainer. */ - int data_type; - /** Combine length of all #TransDataContainer.data_len * Use to check if nothing is selected or if we have a single selection. */ int data_len_all; - /** Current mode. */ - int mode; - /** Generic flags for special behaviors. */ - int flag; - /** Special modifiers, by function, not key. */ - int modifiers; - /** Current state (running, canceled. */ - short state; + /** TODO: It should be a member of #TransDataContainer. */ + eTConvertType data_type; + /** Current context/options for transform. */ - int options; - void (*transform)(struct TransInfo *, const int[2]); - /** Transform function pointer. */ - eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *); - /* event handler function pointer RETURN 1 if redraw is needed */ - /** transformed constraint. */ - TransCon con; - TransSnap tsnap; - /** numerical input. */ - NumInput num; - /** mouse input. */ - MouseInput mouse; - /** redraw flag. */ + eTContext options; + /** Generic flags for special behaviors. */ + eTFlag flag; + /** Special modifiers, by function, not key. */ + eTModifier modifiers; + /** Current state (running, canceled. */ + eTState state; + /** Redraw flag. */ eRedrawFlag redraw; + /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */ + eTHelpline helpline; + /** Current mode. */ + eTfmMode mode; + + /** Main transform mode function. */ + void (*transform)(struct TransInfo *, const int[2]); + /* Event handler function that determines whether the viewport needs to be redrawn. */ + eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *); + + /** Constraint Data. */ + TransCon con; + + /** Snap Data. */ + TransSnap tsnap; + + /** Numerical input. */ + NumInput num; + + /** Mouse input. */ + MouseInput mouse; + /** proportional circle radius. */ float prop_size; /** proportional falloff text. */ @@ -333,8 +562,6 @@ typedef struct TransInfo { short around; /** space-type where transforming is. */ char spacetype; - /** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */ - char helpline; /** Avoid looking inside #TransDataContainer.obedit. */ short obedit_type; @@ -421,178 +648,6 @@ typedef struct TransInfo { /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Flags - * \{ */ - -/** #TransInfo.state */ -enum { - TRANS_STARTING = 0, - TRANS_RUNNING = 1, - TRANS_CONFIRM = 2, - TRANS_CANCEL = 3, -}; - -/** #TransInfo.flag */ -enum { - T_OBJECT = 1 << 0, - /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */ - T_EDIT = 1 << 1, - T_POSE = 1 << 2, - T_TEXTURE = 1 << 3, - /** Transforming the 3d view. */ - T_CAMERA = 1 << 4, - /** Transforming the 3D cursor. */ - T_CURSOR = 1 << 5, - /** Transform points, having no rotation/scale. */ - T_POINTS = 1 << 6, - /** restrictions flags */ - T_NO_CONSTRAINT = 1 << 7, - T_NULL_ONE = 1 << 8, - T_NO_ZERO = 1 << 9, - T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO, - - T_PROP_EDIT = 1 << 10, - T_PROP_CONNECTED = 1 << 11, - T_PROP_PROJECTED = 1 << 12, - T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, - - T_V3D_ALIGN = 1 << 13, - /** For 2D views such as UV or f-curve. */ - T_2D_EDIT = 1 << 14, - T_CLIP_UV = 1 << 15, - - /** Auto-IK is on. */ - T_AUTOIK = 1 << 16, - - /** Don't use mirror even if the data-block option is set. */ - T_NO_MIRROR = 1 << 17, - - /** To indicate that the value set in the `value` parameter is the final - * value of the transformation, modified only by the constrain. */ - T_INPUT_IS_VALUES_FINAL = 1 << 18, - - /** To specify if we save back settings at the end. */ - T_MODAL = 1 << 19, - - /** No re-topology (projection). */ - T_NO_PROJECT = 1 << 20, - - T_RELEASE_CONFIRM = 1 << 21, - - /** Alternative transformation. used to add offset to tracking markers. */ - T_ALT_TRANSFORM = 1 << 22, - - /** #TransInfo.center has been set, don't change it. */ - T_OVERRIDE_CENTER = 1 << 23, - - T_MODAL_CURSOR_SET = 1 << 24, - - T_CLNOR_REBUILD = 1 << 25, - - /** Merges unselected into selected after transforming (runs after transforming). */ - T_AUTOMERGE = 1 << 26, - /** Runs auto-merge & splits. */ - T_AUTOSPLIT = 1 << 27, -}; - -/** #TransInfo.modifiers */ -enum { - MOD_CONSTRAINT_SELECT = 1 << 0, - MOD_PRECISION = 1 << 1, - MOD_SNAP = 1 << 2, - MOD_SNAP_INVERT = 1 << 3, - MOD_CONSTRAINT_PLANE = 1 << 4, -}; - -/* use node center for transform instead of upper-left corner. - * disabled since it makes absolute snapping not work so nicely - */ -// #define USE_NODE_CENTER - -/** #TransInfo.helpline */ -enum { - HLP_NONE = 0, - HLP_SPRING = 1, - HLP_ANGLE = 2, - HLP_HARROW = 3, - HLP_VARROW = 4, - HLP_CARROW = 5, - HLP_TRACKBALL = 6, -}; - -/** #TransCon.mode, #TransInfo.con.mode */ -enum { - /** When set constraints are in use. */ - CON_APPLY = 1 << 0, - /** These are only used for modal execution. */ - CON_AXIS0 = 1 << 1, - CON_AXIS1 = 1 << 2, - CON_AXIS2 = 1 << 3, - CON_SELECT = 1 << 4, - /** Does not reorient vector to face viewport when on. */ - CON_NOFLIP = 1 << 5, - CON_USER = 1 << 6, -}; - -/** #TransSnap.status */ -enum { - SNAP_FORCED = 1 << 0, - TARGET_INIT = 1 << 1, - POINT_INIT = 1 << 2, - MULTI_POINTS = 1 << 3, -}; - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Keymap Modal Items - * - * \note these values are saved in key-map files, do not change then but just add new ones. - * \{ */ - -enum { - TFM_MODAL_CANCEL = 1, - TFM_MODAL_CONFIRM = 2, - TFM_MODAL_TRANSLATE = 3, - TFM_MODAL_ROTATE = 4, - TFM_MODAL_RESIZE = 5, - TFM_MODAL_SNAP_INV_ON = 6, - TFM_MODAL_SNAP_INV_OFF = 7, - TFM_MODAL_SNAP_TOGGLE = 8, - TFM_MODAL_AXIS_X = 9, - TFM_MODAL_AXIS_Y = 10, - TFM_MODAL_AXIS_Z = 11, - TFM_MODAL_PLANE_X = 12, - TFM_MODAL_PLANE_Y = 13, - TFM_MODAL_PLANE_Z = 14, - TFM_MODAL_CONS_OFF = 15, - TFM_MODAL_ADD_SNAP = 16, - TFM_MODAL_REMOVE_SNAP = 17, - - /* 18 and 19 used by number-input, defined in `ED_numinput.h`. */ - // NUM_MODAL_INCREMENT_UP = 18, - // NUM_MODAL_INCREMENT_DOWN = 19, - - TFM_MODAL_PROPSIZE_UP = 20, - TFM_MODAL_PROPSIZE_DOWN = 21, - TFM_MODAL_AUTOIK_LEN_INC = 22, - TFM_MODAL_AUTOIK_LEN_DEC = 23, - - TFM_MODAL_EDGESLIDE_UP = 24, - TFM_MODAL_EDGESLIDE_DOWN = 25, - - /** For analog input, like track-pad. */ - TFM_MODAL_PROPSIZE = 26, - /** Node editor insert offset (also called auto-offset) direction toggle. */ - TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27, - - TFM_MODAL_AUTOCONSTRAINT = 28, - TFM_MODAL_AUTOCONSTRAINTPLANE = 29, -}; - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Public Transform API * \{ */ diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 96a9690d891..0770f39453e 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -981,7 +981,7 @@ void createTransData(bContext *C, TransInfo *t) t->data_len_all = -1; - eTransConvertType convert_type = TC_NONE; + eTConvertType convert_type = TC_NONE; /* if tests must match recalcData for correct updates */ if (t->options & CTX_CURSOR) { diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index a1c7a6a39a6..4695d02b25a 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -52,34 +52,6 @@ int transform_convert_sequencer_get_snap_bound(TransInfo *t); void transform_convert_sequencer_channel_clamp(TransInfo *t); /********************* intern **********************/ -typedef enum eTransConvertType { - TC_NONE = 0, - TC_ACTION_DATA, - TC_POSE, - TC_ARMATURE_VERTS, - TC_CURSOR_IMAGE, - TC_CURSOR_VIEW3D, - TC_CURVE_VERTS, - TC_GRAPH_EDIT_DATA, - TC_GPENCIL, - TC_LATTICE_VERTS, - TC_MASKING_DATA, - TC_MBALL_VERTS, - TC_MESH_VERTS, - TC_MESH_EDGES, - TC_MESH_SKIN, - TC_MESH_UV, - TC_NLA_DATA, - TC_NODE_DATA, - TC_OBJECT, - TC_OBJECT_TEXSPACE, - TC_PAINT_CURVE_VERTS, - TC_PARTICLE_VERTS, - TC_SCULPT, - TC_SEQ_DATA, - TC_TRACKING_DATA, -} eTransConvertType; - /* transform_convert.c */ bool transform_mode_use_local_origins(const TransInfo *t); void transform_around_single_fallback_ex(TransInfo *t, int data_len_all); diff --git a/source/blender/editors/transform/transform_draw_cursors.c b/source/blender/editors/transform/transform_draw_cursors.c index b4b28ea0ac0..ead8eae0997 100644 --- a/source/blender/editors/transform/transform_draw_cursors.c +++ b/source/blender/editors/transform/transform_draw_cursors.c @@ -211,6 +211,8 @@ void transform_draw_cursor_draw(bContext *UNUSED(C), int x, int y, void *customd drawArrow(pos_id, DOWN); break; } + case HLP_NONE: + break; } GPU_matrix_pop(); From be60b3b23984ff7a9b973a37800522e4b5e7918f Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Fri, 5 Feb 2021 11:01:30 -0300 Subject: [PATCH 012/519] Transform: Grid snap target refactor The code takes many turns to get a suitable "target" for the snap to grid. Perhaps there were other reasons awaited for `transformCenter_from_type` and `TransCenterData center_cache[5]`. But since nothing is defined, it is better to simplify the code. No user functional changes --- source/blender/editors/transform/transform.h | 11 +- .../editors/transform/transform_convert.c | 4 - .../editors/transform/transform_generics.c | 24 ---- .../editors/transform/transform_snap.c | 116 +++++++++--------- 4 files changed, 66 insertions(+), 89 deletions(-) diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 72f43a14b11..9ee0aa1d6da 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -166,8 +166,10 @@ typedef enum { typedef enum { SNAP_FORCED = 1 << 0, TARGET_INIT = 1 << 1, - POINT_INIT = 1 << 2, - MULTI_POINTS = 1 << 3, + /* Special flag for snap to grid. */ + TARGET_GRID_INIT = 1 << 2, + POINT_INIT = 1 << 3, + MULTI_POINTS = 1 << 4, } eTSnap; /** #TransCon.mode, #TransInfo.con.mode */ @@ -310,6 +312,7 @@ typedef struct TransSnap { float snapPoint[3]; /** to this point (in global-space). */ float snapTarget[3]; + float snapTargetGrid[3]; float snapNormal[3]; char snapNodeBorder; ListBase points; @@ -539,9 +542,6 @@ typedef struct TransInfo { float center_global[3]; /** center in screen coordinates. */ float center2d[2]; - /* Lazy initialize center data for when we need other center values. - * V3D_AROUND_ACTIVE + 1 (static assert checks this) */ - TransCenterData center_cache[5]; /** maximum index on the input vector. */ short idx_max; /** Snapping Gears. */ @@ -764,7 +764,6 @@ void recalcData(TransInfo *t); void calculateCenter2D(TransInfo *t); void calculateCenterLocal(TransInfo *t, const float center_global[3]); -const TransCenterData *transformCenter_from_type(TransInfo *t, int around); void calculateCenter(TransInfo *t); /* API functions for getting center points */ diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 0770f39453e..8942a3a319b 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -993,10 +993,6 @@ void createTransData(bContext *C, TransInfo *t) else { convert_type = TC_CURSOR_VIEW3D; } - - /* Since we're transforming the cursor, initialize this value before it's modified. - * Needed for #snap_grid_apply to access the cursor location. */ - transformCenter_from_type(t, V3D_AROUND_CURSOR); } else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob && (ob->mode == OB_MODE_SCULPT) && ob->sculpt) { diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index e181593d28a..d230670993c 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1184,13 +1184,6 @@ void calculateCenter(TransInfo *t) } calculateCenterLocal(t, t->center_global); - /* avoid calculating again */ - { - TransCenterData *cd = &t->center_cache[t->around]; - copy_v3_v3(cd->global, t->center_global); - cd->is_set = true; - } - calculateCenter2D(t); /* For panning from the camera-view. */ @@ -1237,23 +1230,6 @@ void calculateCenter(TransInfo *t) } } -BLI_STATIC_ASSERT(ARRAY_SIZE(((TransInfo *)NULL)->center_cache) == (V3D_AROUND_ACTIVE + 1), - "test size"); - -/** - * Lazy initialize transform center data, when we need to access center values from other types. - */ -const TransCenterData *transformCenter_from_type(TransInfo *t, int around) -{ - BLI_assert(around <= V3D_AROUND_ACTIVE); - TransCenterData *cd = &t->center_cache[around]; - if (cd->is_set == false) { - calculateCenter_FromAround(t, around, cd->global); - cd->is_set = true; - } - return cd; -} - void calculatePropRatio(TransInfo *t) { int i; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 575c736cf51..8500ff25a1f 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -926,6 +926,64 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec)) /** \name Target * \{ */ +static void snap_target_median_impl(TransInfo *t, float r_median[3]) +{ + int i_accum = 0; + + zero_v3(r_median); + + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + TransData *td = tc->data; + int i; + float v[3]; + zero_v3(v); + + for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { + add_v3_v3(v, td->center); + } + + if (i == 0) { + /* Is this possible? */ + continue; + } + + mul_v3_fl(v, 1.0 / i); + + if (tc->use_local_mat) { + mul_m4_v3(tc->mat, v); + } + + add_v3_v3(r_median, v); + i_accum++; + } + + mul_v3_fl(r_median, 1.0 / i_accum); + + // TargetSnapOffset(t, NULL); +} + +static void snap_target_grid_ensure(TransInfo *t) +{ + /* Only need to calculate once. */ + if ((t->tsnap.status & TARGET_GRID_INIT) == 0) { + if (t->data_type == TC_CURSOR_VIEW3D) { + /* Use a fallback when transforming the cursor. + * In this case the center is _not_ derived from the cursor which is being transformed. */ + copy_v3_v3(t->tsnap.snapTargetGrid, TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->data->iloc); + } + else if (t->around == V3D_AROUND_CURSOR) { + /* Use a fallback for cursor selection, + * this isn't useful as a global center for absolute grid snapping + * since its not based on the position of the selection. */ + snap_target_median_impl(t, t->tsnap.snapTargetGrid); + } + else { + copy_v3_v3(t->tsnap.snapTargetGrid, t->center_global); + } + t->tsnap.status |= TARGET_GRID_INIT; + } +} + static void TargetSnapOffset(TransInfo *t, TransData *td) { if (t->spacetype == SPACE_NODE && td != NULL) { @@ -997,41 +1055,7 @@ static void TargetSnapMedian(TransInfo *t) { /* Only need to calculate once. */ if ((t->tsnap.status & TARGET_INIT) == 0) { - int i_accum = 0; - - t->tsnap.snapTarget[0] = 0; - t->tsnap.snapTarget[1] = 0; - t->tsnap.snapTarget[2] = 0; - - FOREACH_TRANS_DATA_CONTAINER (t, tc) { - TransData *td = tc->data; - int i; - float v[3]; - zero_v3(v); - - for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { - add_v3_v3(v, td->center); - } - - if (i == 0) { - /* Is this possible? */ - continue; - } - - mul_v3_fl(v, 1.0 / i); - - if (tc->use_local_mat) { - mul_m4_v3(tc->mat, v); - } - - add_v3_v3(t->tsnap.snapTarget, v); - i_accum++; - } - - mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum); - - TargetSnapOffset(t, NULL); - + snap_target_median_impl(t, t->tsnap.snapTarget); t->tsnap.status |= TARGET_INIT; } } @@ -1431,28 +1455,10 @@ static void snap_grid_apply( TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3]) { BLI_assert(max_index <= 2); - const float *center_global = t->center_global; + snap_target_grid_ensure(t); + const float *center_global = t->tsnap.snapTargetGrid; const float *asp = t->aspect; - if (t->options & CTX_CURSOR) { - /* Note that we must already have called #transformCenter_from_type, otherwise - * we would be lazy-initializing data which is being transformed, - * causing the transformed cursor location to be used instead of it's initial location. */ - BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set); - - /* Use a fallback when transforming the cursor. - * In this case the center is _not_ derived from the cursor which is being transformed. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR); - center_global = cd->global; - } - else if (t->around == V3D_AROUND_CURSOR) { - /* Use a fallback for cursor selection, - * this isn't useful as a global center for absolute grid snapping - * since its not based on the position of the selection. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN); - center_global = cd->global; - } - float in[3]; if (t->con.mode & CON_APPLY) { BLI_assert(t->tsnap.snapElem == 0); From 0bc07ea090251e26ef376fadc077dc37c3d56bfe Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Fri, 5 Feb 2021 11:56:43 -0300 Subject: [PATCH 013/519] Cleanup: Unify, move and rename transform flags Flags unified: T_CURSOR -> CTX_CURSOR T_TEXTURE -> CTX_TEXTURE Flags moved: T_CAMERA -> CTX_CAMERA T_POSE -> CTX_POSE_BONE T_OBJECT -> CTX_OBJECT T_TEXTURE -> CTX_TEXTURE_SPACE Flag renamed: CTX_EDGE -> CTX_EDGE_DATA --- source/blender/editors/transform/transform.c | 12 +-- source/blender/editors/transform/transform.h | 83 +++++++++---------- .../editors/transform/transform_constraints.c | 2 +- .../editors/transform/transform_convert.c | 19 ++--- .../transform/transform_convert_armature.c | 2 - .../transform/transform_convert_object.c | 4 +- .../editors/transform/transform_generics.c | 10 +-- .../editors/transform/transform_mode.c | 6 +- .../editors/transform/transform_mode_align.c | 2 +- .../editors/transform/transform_mode_mirror.c | 2 +- .../transform/transform_mode_translate.c | 2 +- .../editors/transform/transform_snap.c | 11 +-- 12 files changed, 76 insertions(+), 79 deletions(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 86a35949d1d..d46cdb62f30 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -440,7 +440,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) } else { /* Do we need more refined tags? */ - if (t->flag & T_POSE) { + if (t->options & CTX_POSE_BONE) { WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL); } else { @@ -484,7 +484,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) wmWindow *window = CTX_wm_window(C); WM_paint_cursor_tag_redraw(window, t->region); } - else if (t->flag & T_CURSOR) { + else if (t->options & CTX_CURSOR) { ED_area_tag_redraw(t->area); } else { @@ -895,7 +895,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; case TFM_MODAL_ROTATE: /* only switch when... */ - if (!(t->options & CTX_TEXTURE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) { + if (!(t->options & CTX_TEXTURE_SPACE) && !(t->options & (CTX_MOVIECLIP | CTX_MASK))) { if (transform_mode_is_changeable(t->mode)) { restoreTransObjects(t); resetTransModal(t); @@ -1069,7 +1069,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) t->modifiers &= ~(MOD_CONSTRAINT_SELECT | MOD_CONSTRAINT_PLANE); } else { - if (t->flag & T_CAMERA) { + if (t->options & CTX_CAMERA) { /* Exception for switching to dolly, or trackball, in camera view. */ if (t->mode == TFM_TRANSLATION) { setLocalConstraint(t, (CON_AXIS2), TIP_("along local Z")); @@ -1382,7 +1382,7 @@ static void drawTransformPixel(const struct bContext *C, ARegion *region, void * */ if ((U.autokey_flag & AUTOKEY_FLAG_NOWARNING) == 0) { if (region == t->region) { - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { if (ob && autokeyframe_cfra_can_key(scene, &ob->id)) { drawAutoKeyWarning(t, region); } @@ -1652,7 +1652,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if ((prop = RNA_struct_find_property(op->ptr, "texture_space")) && RNA_property_is_set(op->ptr, prop)) { if (RNA_property_boolean_get(op->ptr, prop)) { - options |= CTX_TEXTURE; + options |= CTX_TEXTURE_SPACE; } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 9ee0aa1d6da..fe2c3d2fcdf 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -74,83 +74,82 @@ struct wmTimer; /** #TransInfo.options */ typedef enum { CTX_NONE = 0, - CTX_TEXTURE = (1 << 0), - CTX_EDGE = (1 << 1), - CTX_NO_PET = (1 << 2), - CTX_NO_MIRROR = (1 << 3), - CTX_AUTOCONFIRM = (1 << 4), - CTX_MOVIECLIP = (1 << 6), - CTX_MASK = (1 << 7), - CTX_PAINT_CURVE = (1 << 8), - CTX_GPENCIL_STROKES = (1 << 9), - CTX_CURSOR = (1 << 10), + + /* These are similar to TransInfo::data_type. */ + CTX_CAMERA = (1 << 0), + CTX_CURSOR = (1 << 1), + CTX_EDGE_DATA = (1 << 2), + CTX_GPENCIL_STROKES = (1 << 3), + CTX_MASK = (1 << 4), + CTX_MOVIECLIP = (1 << 5), + CTX_OBJECT = (1 << 6), + CTX_PAINT_CURVE = (1 << 7), + CTX_POSE_BONE = (1 << 8), + CTX_TEXTURE_SPACE = (1 << 9), + + CTX_NO_PET = (1 << 10), + CTX_NO_MIRROR = (1 << 11), + CTX_AUTOCONFIRM = (1 << 12), /** When transforming object's, adjust the object data so it stays in the same place. */ - CTX_OBMODE_XFORM_OBDATA = (1 << 11), + CTX_OBMODE_XFORM_OBDATA = (1 << 13), /** Transform object parents without moving their children. */ - CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 12), + CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14), } eTContext; /** #TransInfo.flag */ typedef enum { - T_OBJECT = 1 << 0, /** \note We could remove 'T_EDIT' and use 'obedit_type', for now ensure they're in sync. */ - T_EDIT = 1 << 1, - T_POSE = 1 << 2, - T_TEXTURE = 1 << 3, - /** Transforming the 3d view. */ - T_CAMERA = 1 << 4, - /** Transforming the 3D cursor. */ - T_CURSOR = 1 << 5, + T_EDIT = 1 << 0, /** Transform points, having no rotation/scale. */ - T_POINTS = 1 << 6, + T_POINTS = 1 << 1, /** restrictions flags */ - T_NO_CONSTRAINT = 1 << 7, - T_NULL_ONE = 1 << 8, - T_NO_ZERO = 1 << 9, + T_NO_CONSTRAINT = 1 << 2, + T_NULL_ONE = 1 << 3, + T_NO_ZERO = 1 << 4, T_ALL_RESTRICTIONS = T_NO_CONSTRAINT | T_NULL_ONE | T_NO_ZERO, - T_PROP_EDIT = 1 << 10, - T_PROP_CONNECTED = 1 << 11, - T_PROP_PROJECTED = 1 << 12, + T_PROP_EDIT = 1 << 5, + T_PROP_CONNECTED = 1 << 6, + T_PROP_PROJECTED = 1 << 7, T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, - T_V3D_ALIGN = 1 << 13, + T_V3D_ALIGN = 1 << 8, /** For 2D views such as UV or f-curve. */ - T_2D_EDIT = 1 << 14, - T_CLIP_UV = 1 << 15, + T_2D_EDIT = 1 << 9, + T_CLIP_UV = 1 << 10, /** Auto-IK is on. */ - T_AUTOIK = 1 << 16, + T_AUTOIK = 1 << 11, /** Don't use mirror even if the data-block option is set. */ - T_NO_MIRROR = 1 << 17, + T_NO_MIRROR = 1 << 12, /** To indicate that the value set in the `value` parameter is the final * value of the transformation, modified only by the constrain. */ - T_INPUT_IS_VALUES_FINAL = 1 << 18, + T_INPUT_IS_VALUES_FINAL = 1 << 13, /** To specify if we save back settings at the end. */ - T_MODAL = 1 << 19, + T_MODAL = 1 << 14, /** No re-topology (projection). */ - T_NO_PROJECT = 1 << 20, + T_NO_PROJECT = 1 << 15, - T_RELEASE_CONFIRM = 1 << 21, + T_RELEASE_CONFIRM = 1 << 16, /** Alternative transformation. used to add offset to tracking markers. */ - T_ALT_TRANSFORM = 1 << 22, + T_ALT_TRANSFORM = 1 << 17, /** #TransInfo.center has been set, don't change it. */ - T_OVERRIDE_CENTER = 1 << 23, + T_OVERRIDE_CENTER = 1 << 18, - T_MODAL_CURSOR_SET = 1 << 24, + T_MODAL_CURSOR_SET = 1 << 19, - T_CLNOR_REBUILD = 1 << 25, + T_CLNOR_REBUILD = 1 << 20, /** Merges unselected into selected after transforming (runs after transforming). */ - T_AUTOMERGE = 1 << 26, + T_AUTOMERGE = 1 << 21, /** Runs auto-merge & splits. */ - T_AUTOSPLIT = 1 << 27, + T_AUTOSPLIT = 1 << 22, } eTFlag; /** #TransInfo.modifiers */ diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 4b7b16c2986..1f589a830fc 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -914,7 +914,7 @@ static void drawObjectConstraint(TransInfo *t) mul_m3_m3m3(tmp_axismtx, tc->mat3_unit, td->axismtx); axismtx = tmp_axismtx; } - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { mul_v3_m4v3(co, tc->mat, td->center); axismtx = td->axismtx; } diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 8942a3a319b..d18ffc0cd28 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -928,10 +928,10 @@ int special_transform_moving(TransInfo *t) if (t->spacetype == SPACE_GRAPH) { return G_TRANSFORM_FCURVES; } - if ((t->flag & T_EDIT) || (t->flag & T_POSE)) { + if ((t->flag & T_EDIT) || (t->options & CTX_POSE_BONE)) { return G_TRANSFORM_EDIT; } - if (t->flag & (T_OBJECT | T_TEXTURE)) { + if (t->options & (CTX_OBJECT | CTX_TEXTURE_SPACE)) { return G_TRANSFORM_OBJ; } @@ -985,8 +985,6 @@ void createTransData(bContext *C, TransInfo *t) /* if tests must match recalcData for correct updates */ if (t->options & CTX_CURSOR) { - t->flag |= T_CURSOR; - if (t->spacetype == SPACE_IMAGE) { convert_type = TC_CURSOR_IMAGE; } @@ -998,11 +996,10 @@ void createTransData(bContext *C, TransInfo *t) (ob->mode == OB_MODE_SCULPT) && ob->sculpt) { convert_type = TC_SCULPT; } - else if (t->options & CTX_TEXTURE) { - t->flag |= T_TEXTURE; + else if (t->options & CTX_TEXTURE_SPACE) { convert_type = TC_OBJECT_TEXSPACE; } - else if (t->options & CTX_EDGE) { + else if (t->options & CTX_EDGE_DATA) { t->flag |= T_EDIT; convert_type = TC_MESH_EDGES; /* Multi object editing. */ @@ -1142,6 +1139,8 @@ void createTransData(bContext *C, TransInfo *t) /* In grease pencil all transformations must be canceled if not Object or Edit. */ } else { + t->options |= CTX_OBJECT; + /* Needed for correct Object.obmat after duplication, see: T62135. */ BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context)); @@ -1152,7 +1151,6 @@ void createTransData(bContext *C, TransInfo *t) t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; } - t->flag |= T_OBJECT; convert_type = TC_OBJECT; } @@ -1164,6 +1162,7 @@ void createTransData(bContext *C, TransInfo *t) createTransActionData(C, t); break; case TC_POSE: + t->options |= CTX_POSE_BONE; createTransPose(t); /* Disable PET, its not usable in pose mode yet T32444. */ init_prop_edit = false; @@ -1225,11 +1224,11 @@ void createTransData(bContext *C, TransInfo *t) if ((rv3d->persp == RV3D_CAMOB) && v3d->camera) { /* we could have a flag to easily check an object is being transformed */ if (v3d->camera->id.tag & LIB_TAG_DOIT) { - t->flag |= T_CAMERA; + t->options |= CTX_CAMERA; } } else if (v3d->ob_center && v3d->ob_center->id.tag & LIB_TAG_DOIT) { - t->flag |= T_CAMERA; + t->options |= CTX_CAMERA; } } break; diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c index 7994d97581f..71b9e11b51f 100644 --- a/source/blender/editors/transform/transform_convert_armature.c +++ b/source/blender/editors/transform/transform_convert_armature.c @@ -870,8 +870,6 @@ void createTransPose(TransInfo *t) t->mode = TFM_RESIZE; } } - - t->flag |= T_POSE; } void createTransArmatureVerts(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c index 90ffccfdd7b..1b1573ecd73 100644 --- a/source/blender/editors/transform/transform_convert_object.c +++ b/source/blender/editors/transform/transform_convert_object.c @@ -963,7 +963,7 @@ void recalcData_objects(TransInfo *t) */ DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); - if (t->flag & T_TEXTURE) { + if (t->options & CTX_TEXTURE_SPACE) { DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } } @@ -991,7 +991,7 @@ void recalcData_objects(TransInfo *t) void special_aftertrans_update__object(bContext *C, TransInfo *t) { - BLI_assert(t->flag & (T_OBJECT | T_TEXTURE)); + BLI_assert(t->options & (CTX_OBJECT | CTX_TEXTURE_SPACE)); Object *ob; const bool canceled = (t->state == TRANS_CANCEL); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index d230670993c..16fb9cc6eab 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -225,7 +225,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->flag = 0; - if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE)) && + if (obact && !(t->options & (CTX_CURSOR | CTX_TEXTURE_SPACE)) && ELEM(object_mode, OB_MODE_EDIT, OB_MODE_EDIT_GPENCIL)) { t->obedit_type = obact->type; } @@ -272,7 +272,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve /* Crease needs edge flag */ if (ELEM(t->mode, TFM_CREASE, TFM_BWEIGHT)) { - t->options |= CTX_EDGE; + t->options |= CTX_EDGE_DATA; } t->remove_on_cancel = false; @@ -1110,7 +1110,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) return true; } } - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { ViewLayer *view_layer = t->view_layer; Object *ob = OBACT(view_layer); if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) { @@ -1187,10 +1187,10 @@ void calculateCenter(TransInfo *t) calculateCenter2D(t); /* For panning from the camera-view. */ - if ((t->flag & T_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) { + if ((t->options & CTX_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) { if (t->spacetype == SPACE_VIEW3D && t->region && t->region->regiontype == RGN_TYPE_WINDOW) { - if (t->flag & T_CAMERA) { + if (t->options & CTX_CAMERA) { float axis[3]; /* persinv is nasty, use viewinv instead, always right */ copy_v3_v3(axis, t->viewinv[2]); diff --git a/source/blender/editors/transform/transform_mode.c b/source/blender/editors/transform/transform_mode.c index be4f3daa3d2..9e6e4d8807e 100644 --- a/source/blender/editors/transform/transform_mode.c +++ b/source/blender/editors/transform/transform_mode.c @@ -70,7 +70,7 @@ int transform_mode_really_used(bContext *C, int mode) bool transdata_check_local_center(TransInfo *t, short around) { return ((around == V3D_AROUND_LOCAL_ORIGINS) && - ((t->flag & (T_OBJECT | T_POSE)) || + ((t->options & (CTX_OBJECT | CTX_POSE_BONE)) || /* implicit: (t->flag & T_EDIT) */ (ELEM(t->obedit_type, OB_MESH, OB_CURVE, OB_MBALL, OB_ARMATURE, OB_GPENCIL)) || (t->spacetype == SPACE_GRAPH) || @@ -629,7 +629,7 @@ void ElementRotation_ex(TransInfo *t, * matrix (and inverse). That is not all though. Once the proper translation * has been computed, it has to be converted back into the bone's space. */ - else if (t->flag & T_POSE) { + else if (t->options & CTX_POSE_BONE) { /* Extract and invert armature object matrix */ if ((td->flag & TD_NO_LOC) == 0) { @@ -1026,7 +1026,7 @@ void ElementResize(TransInfo *t, TransDataContainer *tc, TransData *td, float ma mul_v3_fl(vec, td->factor); } - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { mul_m3_v3(td->smtx, vec); } diff --git a/source/blender/editors/transform/transform_mode_align.c b/source/blender/editors/transform/transform_mode_align.c index f16021914f1..5bc2aa68443 100644 --- a/source/blender/editors/transform/transform_mode_align.c +++ b/source/blender/editors/transform/transform_mode_align.c @@ -55,7 +55,7 @@ static void applyAlign(TransInfo *t, const int UNUSED(mval[2])) } /* around local centers */ - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { copy_v3_v3(tc->center_local, td->center); } else { diff --git a/source/blender/editors/transform/transform_mode_mirror.c b/source/blender/editors/transform/transform_mode_mirror.c index 3aa99975fda..9891af8b9a4 100644 --- a/source/blender/editors/transform/transform_mode_mirror.c +++ b/source/blender/editors/transform/transform_mode_mirror.c @@ -152,7 +152,7 @@ static void ElementMirror(TransInfo *t, TransDataContainer *tc, TransData *td, i sub_v3_v3(vec, td->center); } - if (t->flag & (T_OBJECT | T_POSE)) { + if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { mul_m3_v3(td->smtx, vec); } diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c index 851e0feb5f5..41fc6ee0aaf 100644 --- a/source/blender/editors/transform/transform_mode_translate.c +++ b/source/blender/editors/transform/transform_mode_translate.c @@ -294,7 +294,7 @@ static void applyTranslationValue(TransInfo *t, const float vec[3]) const float *original_normal; /* In pose mode, we want to align normals with Y axis of bones... */ - if (t->flag & T_POSE) { + if (t->options & CTX_POSE_BONE) { original_normal = td->axismtx[1]; } else { diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 8500ff25a1f..6d04de34016 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -332,7 +332,7 @@ void applyProject(TransInfo *t) if (tc->use_local_mat) { mul_m4_v3(tc->mat, iloc); } - else if (t->flag & T_OBJECT) { + else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } @@ -366,7 +366,7 @@ void applyProject(TransInfo *t) add_v3_v3(td->loc, tvec); - if (t->tsnap.align && (t->flag & T_OBJECT)) { + if (t->tsnap.align && (t->options & CTX_OBJECT)) { /* handle alignment as well */ const float *original_normal; float mat[3][3]; @@ -422,7 +422,7 @@ void applyGridAbsolute(TransInfo *t) if (tc->use_local_mat) { mul_m4_v3(tc->mat, iloc); } - else if (t->flag & T_OBJECT) { + else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } @@ -571,7 +571,8 @@ static void initSnappingMode(TransInfo *t) } } - if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && (t->flag & T_CAMERA) == 0) { + if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && + (t->options & CTX_CAMERA) == 0) { /* Only 3D view or UV. */ /* Not with camera selected in camera view. */ @@ -1068,7 +1069,7 @@ static void TargetSnapClosest(TransInfo *t) TransData *closest = NULL; /* Object mode */ - if (t->flag & T_OBJECT) { + if (t->options & CTX_OBJECT) { int i; FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; From 711b65407fc37bf07d929d80824c00777ad7b3d2 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Sat, 6 Feb 2021 16:37:16 -0300 Subject: [PATCH 014/519] Transform: Refactor texture space 'transform_convert' data The changes are: - Split conversion of the texture space data to its own file. - Skip adding keyframes with AutoKeyframes. - Skip recalculation of the trasform dependencies between objects. - Skip `special_aftertrans_update_...`. No real user functional changes --- .../blender/editors/transform/CMakeLists.txt | 1 + .../editors/transform/transform_convert.c | 6 +- .../editors/transform/transform_convert.h | 5 +- .../transform/transform_convert_object.c | 72 +--------- .../transform_convert_object_texspace.c | 126 ++++++++++++++++++ 5 files changed, 137 insertions(+), 73 deletions(-) create mode 100644 source/blender/editors/transform/transform_convert_object_texspace.c diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index faed8abb202..b0bc5c6abda 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -55,6 +55,7 @@ set(SRC transform_convert_nla.c transform_convert_node.c transform_convert_object.c + transform_convert_object_texspace.c transform_convert_paintcurve.c transform_convert_particle.c transform_convert_sculpt.c diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index d18ffc0cd28..4f581ad962d 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -892,7 +892,6 @@ void special_aftertrans_update(bContext *C, TransInfo *t) special_aftertrans_update__node(C, t); break; case TC_OBJECT: - case TC_OBJECT_TEXSPACE: special_aftertrans_update__object(C, t); break; case TC_SCULPT: @@ -912,6 +911,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) case TC_LATTICE_VERTS: case TC_MBALL_VERTS: case TC_MESH_UV: + case TC_OBJECT_TEXSPACE: case TC_PAINT_CURVE_VERTS: case TC_PARTICLE_VERTS: case TC_NONE: @@ -1552,9 +1552,11 @@ void recalcData(TransInfo *t) flushTransNodes(t); break; case TC_OBJECT: - case TC_OBJECT_TEXSPACE: recalcData_objects(t); break; + case TC_OBJECT_TEXSPACE: + recalcData_texspace(t); + break; case TC_PAINT_CURVE_VERTS: flushTransPaintCurve(t); break; diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index 4695d02b25a..00aa72d97f2 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -187,10 +187,13 @@ void special_aftertrans_update__node(bContext *C, TransInfo *t); /* transform_convert_object.c */ void createTransObject(bContext *C, TransInfo *t); -void createTransTexspace(TransInfo *t); void recalcData_objects(TransInfo *t); void special_aftertrans_update__object(bContext *C, TransInfo *t); +/* transform_convert_object_texspace.c */ +void createTransTexspace(TransInfo *t); +void recalcData_texspace(TransInfo *t); + /* transform_convert_paintcurve.c */ void createTransPaintCurveVerts(bContext *C, TransInfo *t); void flushTransPaintCurve(TransInfo *t); diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c index 1b1573ecd73..5f6f00716f9 100644 --- a/source/blender/editors/transform/transform_convert_object.c +++ b/source/blender/editors/transform/transform_convert_object.c @@ -21,12 +21,8 @@ * \ingroup edtransform */ -#include "DNA_mesh_types.h" - #include "MEM_guardedalloc.h" -#include "BLI_compiler_compat.h" -#include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_math.h" @@ -46,11 +42,11 @@ #include "DEG_depsgraph_query.h" #include "transform.h" +#include "transform_orientations.h" #include "transform_snap.h" /* Own include. */ #include "transform_convert.h" -#include "transform_orientations.h" /* -------------------------------------------------------------------- */ /** \name Object Mode Custom Data @@ -712,66 +708,6 @@ void createTransObject(bContext *C, TransInfo *t) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Texture Space Transform Creation - * - * Instead of transforming the selection, move the 2D/3D cursor. - * - * \{ */ - -void createTransTexspace(TransInfo *t) -{ - ViewLayer *view_layer = t->view_layer; - TransData *td; - Object *ob; - ID *id; - short *texflag; - - ob = OBACT(view_layer); - - if (ob == NULL) { /* Shouldn't logically happen, but still. */ - return; - } - - id = ob->data; - if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) { - BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform"); - return; - } - - if (BKE_object_obdata_is_libdata(ob)) { - BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); - return; - } - - { - BLI_assert(t->data_container_len == 1); - TransDataContainer *tc = t->data_container; - tc->data_len = 1; - td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); - td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); - } - - td->flag = TD_SELECTED; - copy_v3_v3(td->center, ob->obmat[3]); - td->ob = ob; - - copy_m3_m4(td->mtx, ob->obmat); - copy_m3_m4(td->axismtx, ob->obmat); - normalize_m3(td->axismtx); - pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); - - if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) { - ob->dtx |= OB_TEXSPACE; - *texflag &= ~ME_AUTOSPACE; - } - - copy_v3_v3(td->iloc, td->loc); - copy_v3_v3(td->ext->isize, td->ext->size); -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Transform (Auto-Keyframing) * \{ */ @@ -962,10 +898,6 @@ void recalcData_objects(TransInfo *t) * otherwise proxies don't function correctly */ DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); - - if (t->options & CTX_TEXTURE_SPACE) { - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - } } } @@ -991,7 +923,7 @@ void recalcData_objects(TransInfo *t) void special_aftertrans_update__object(bContext *C, TransInfo *t) { - BLI_assert(t->options & (CTX_OBJECT | CTX_TEXTURE_SPACE)); + BLI_assert(t->options & CTX_OBJECT); Object *ob; const bool canceled = (t->state == TRANS_CANCEL); diff --git a/source/blender/editors/transform/transform_convert_object_texspace.c b/source/blender/editors/transform/transform_convert_object_texspace.c new file mode 100644 index 00000000000..195eb941b3b --- /dev/null +++ b/source/blender/editors/transform/transform_convert_object_texspace.c @@ -0,0 +1,126 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + */ + +/** \file + * \ingroup edtransform + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_math.h" + +#include "BKE_animsys.h" +#include "BKE_context.h" +#include "BKE_object.h" +#include "BKE_report.h" + +#include "DNA_mesh_types.h" + +#include "transform.h" +#include "transform_snap.h" + +/* Own include. */ +#include "transform_convert.h" + +/* -------------------------------------------------------------------- */ +/** \name Texture Space Transform Creation + * + * Instead of transforming the selection, move the 2D/3D cursor. + * + * \{ */ + +void createTransTexspace(TransInfo *t) +{ + ViewLayer *view_layer = t->view_layer; + TransData *td; + Object *ob; + ID *id; + short *texflag; + + ob = OBACT(view_layer); + + if (ob == NULL) { /* Shouldn't logically happen, but still. */ + return; + } + + id = ob->data; + if (id == NULL || !ELEM(GS(id->name), ID_ME, ID_CU, ID_MB)) { + BKE_report(t->reports, RPT_ERROR, "Unsupported object type for text-space transform"); + return; + } + + if (BKE_object_obdata_is_libdata(ob)) { + BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); + return; + } + + { + BLI_assert(t->data_container_len == 1); + TransDataContainer *tc = t->data_container; + tc->data_len = 1; + td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); + td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); + } + + td->flag = TD_SELECTED; + copy_v3_v3(td->center, ob->obmat[3]); + td->ob = ob; + + copy_m3_m4(td->mtx, ob->obmat); + copy_m3_m4(td->axismtx, ob->obmat); + normalize_m3(td->axismtx); + pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); + + if (BKE_object_obdata_texspace_get(ob, &texflag, &td->loc, &td->ext->size)) { + ob->dtx |= OB_TEXSPACE; + *texflag &= ~ME_AUTOSPACE; + } + + copy_v3_v3(td->iloc, td->loc); + copy_v3_v3(td->ext->isize, td->ext->size); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Recalc Data object + * + * \{ */ + +/* helper for recalcData() - for object transforms, typically in the 3D view */ +void recalcData_texspace(TransInfo *t) +{ + + if (t->state != TRANS_CANCEL) { + applyProject(t); + } + + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + TransData *td = tc->data; + + for (int i = 0; i < tc->data_len; i++, td++) { + if (td->flag & TD_SKIP) { + continue; + } + DEG_id_tag_update(&td->ob->id, ID_RECALC_GEOMETRY); + } + } +} + +/** \} */ From e35182fc057fb822e0215bf3c820931184e2967f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 8 Feb 2021 14:34:38 +0100 Subject: [PATCH 015/519] install_deps: Updare OpenVDB to 8.0.1. --- build_files/build_environment/install_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 16cead024f7..3aa8eee73d8 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -509,10 +509,10 @@ OSD_SKIP=false # OpenVDB needs to be compiled for now OPENVDB_BLOSC_VERSION="1.5.0" -OPENVDB_VERSION="7.0.0" -OPENVDB_VERSION_SHORT="7.0" -OPENVDB_VERSION_MIN="7.0" -OPENVDB_VERSION_MAX="7.1" +OPENVDB_VERSION="8.0.1" +OPENVDB_VERSION_SHORT="8.0" +OPENVDB_VERSION_MIN="8.0" +OPENVDB_VERSION_MAX="8.1" OPENVDB_FORCE_BUILD=false OPENVDB_FORCE_REBUILD=false OPENVDB_SKIP=false From db1e50262bc44b2b3e9f7122fd404e5b51877d1f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 8 Feb 2021 14:36:20 +0100 Subject: [PATCH 016/519] Fix compilation error after recent refactor Thanks Germano for review! --- source/blender/editors/transform/transform_ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 5b366e7f5fd..01c00247a7a 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -411,7 +411,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event) int exit_code; TransInfo *t = op->customdata; - const enum TfmMode mode_prev = t->mode; + const eTfmMode mode_prev = t->mode; #if defined(WITH_INPUT_NDOF) && 0 /* Stable 2D mouse coords map to different 3D coords while the 3D mouse is active From f5c781af5643b4660c0ce27468221b37248d8372 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 8 Feb 2021 14:44:54 +0100 Subject: [PATCH 017/519] install_deps: Updated OpenImageDenoise to 1.3.0 --- build_files/build_environment/install_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 3aa8eee73d8..eee8c32f8a5 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -550,10 +550,10 @@ EMBREE_FORCE_BUILD=false EMBREE_FORCE_REBUILD=false EMBREE_SKIP=false -OIDN_VERSION="1.2.3" -OIDN_VERSION_SHORT="1.2" -OIDN_VERSION_MIN="1.2.0" -OIDN_VERSION_MAX="1.3" +OIDN_VERSION="1.3.0" +OIDN_VERSION_SHORT="1.3" +OIDN_VERSION_MIN="1.3.0" +OIDN_VERSION_MAX="1.4" OIDN_FORCE_BUILD=false OIDN_FORCE_REBUILD=false OIDN_SKIP=false From df0bce3f7d0a91310ca88814a80e339f3da6c2c9 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 8 Feb 2021 15:42:59 +0100 Subject: [PATCH 018/519] Fix T81206: Do not limit gl texture size in image editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch will show textures in the image editor with the maximum available resolution determined by the GPU Hardware/Driver. Currently the size is limited by the user preference texture size limit. An image user can set the `IMA_SHOW_MAX_RESOLUTION` flag to request gpu textures in the max supported resolution. When this flag isn't set the gpu texture is limited by the user preference setting. When the gl resolution limit is disabled the GPU texture is always created for the max supported resolution. Reviewed By: Clément Foucault Maniphest Tasks: T81206 Differential Revision: https://developer.blender.org/D9160 --- source/blender/blenkernel/intern/image_gpu.c | 38 +++++++++++++------ source/blender/blenkernel/intern/movieclip.c | 3 +- .../blenloader/intern/versioning_290.c | 14 +++++++ .../blender/editors/space_image/space_image.c | 2 +- source/blender/gpu/GPU_capabilities.h | 2 +- source/blender/gpu/intern/gpu_capabilities.cc | 5 ++- source/blender/imbuf/IMB_imbuf.h | 3 +- source/blender/imbuf/intern/util_gpu.c | 6 ++- source/blender/makesdna/DNA_image_types.h | 6 +++ 9 files changed, 59 insertions(+), 20 deletions(-) diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index a6bd65227a0..2ee4505acf0 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -86,15 +86,15 @@ bool BKE_image_has_gpu_texture_premultiplied_alpha(Image *image, ImBuf *ibuf) /* -------------------------------------------------------------------- */ /** \name UDIM gpu texture * \{ */ - -static bool is_over_resolution_limit(int w, int h) +static bool is_over_resolution_limit(int w, int h, bool limit_gl_texture_size) { - return (w > GPU_texture_size_with_limit(w) || h > GPU_texture_size_with_limit(h)); + return (w > GPU_texture_size_with_limit(w, limit_gl_texture_size) || + h > GPU_texture_size_with_limit(h, limit_gl_texture_size)); } -static int smaller_power_of_2_limit(int num) +static int smaller_power_of_2_limit(int num, bool limit_gl_texture_size) { - return power_of_2_min_i(GPU_texture_size_with_limit(num)); + return power_of_2_min_i(GPU_texture_size_with_limit(num, limit_gl_texture_size)); } static GPUTexture *gpu_texture_create_tile_mapping(Image *ima, const int multiview_eye) @@ -153,6 +153,7 @@ static int compare_packtile(const void *a, const void *b) static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) { + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; int arraywidth = 0, arrayheight = 0; ListBase boxes = {NULL}; @@ -168,9 +169,10 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) packtile->boxpack.w = ibuf->x; packtile->boxpack.h = ibuf->y; - if (is_over_resolution_limit(packtile->boxpack.w, packtile->boxpack.h)) { - packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w); - packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h); + if (is_over_resolution_limit( + packtile->boxpack.w, packtile->boxpack.h, limit_gl_texture_size)) { + packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w, limit_gl_texture_size); + packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h, limit_gl_texture_size); } arraywidth = max_ii(arraywidth, packtile->boxpack.w); arrayheight = max_ii(arrayheight, packtile->boxpack.h); @@ -312,18 +314,26 @@ static GPUTexture *image_get_gpu_texture(Image *ima, short requested_pass = iuser ? iuser->pass : 0; short requested_layer = iuser ? iuser->layer : 0; short requested_view = iuser ? iuser->multi_index : 0; + const bool limit_resolution = U.glreslimit != 0 && + ((iuser && (iuser->flag & IMA_SHOW_MAX_RESOLUTION) == 0) || + (iuser == NULL)); + short requested_gpu_flags = limit_resolution ? 0 : IMA_GPU_MAX_RESOLUTION; +#define GPU_FLAGS_TO_CHECK (IMA_GPU_MAX_RESOLUTION) /* There is room for 2 multiview textures. When a higher number is requested we should always * target the first view slot. This is fine as multi view images aren't used together. */ if (requested_view < 2) { requested_view = 0; } if (ima->gpu_pass != requested_pass || ima->gpu_layer != requested_layer || - ima->gpu_view != requested_view) { + ima->gpu_view != requested_view || + ((ima->gpuflag & GPU_FLAGS_TO_CHECK) != requested_gpu_flags)) { ima->gpu_pass = requested_pass; ima->gpu_layer = requested_layer; ima->gpu_view = requested_view; - ima->gpuflag |= IMA_GPU_REFRESH; + ima->gpuflag &= ~GPU_FLAGS_TO_CHECK; + ima->gpuflag |= requested_gpu_flags | IMA_GPU_REFRESH; } +#undef GPU_FLAGS_TO_CHECK /* Check if image has been updated and tagged to be updated (full or partial). */ ImageTile *tile = BKE_image_get_tile(ima, 0); @@ -390,9 +400,13 @@ static GPUTexture *image_get_gpu_texture(Image *ima, const bool use_high_bitdepth = (ima->flag & IMA_HIGH_BITDEPTH); const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, ibuf_intern); + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; - *tex = IMB_create_gpu_texture( - ima->id.name + 2, ibuf_intern, use_high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture(ima->id.name + 2, + ibuf_intern, + use_high_bitdepth, + store_premultiplied, + limit_gl_texture_size); GPU_texture_wrap_mode(*tex, true, false); diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index b872c91cc29..e82ed62ed5b 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -2112,7 +2112,8 @@ GPUTexture *BKE_movieclip_get_gpu_texture(MovieClip *clip, MovieClipUser *cuser) /* This only means RGBA16F instead of RGBA32F. */ const bool high_bitdepth = false; const bool store_premultiplied = ibuf->rect_float ? false : true; - *tex = IMB_create_gpu_texture(clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture( + clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied, false); /* Do not generate mips for movieclips... too slow. */ GPU_texture_mipmap_mode(*tex, false, true); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index bb477745849..2911bb6a7fc 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1601,5 +1601,19 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) */ { /* Keep this block, even when empty. */ + + /* UV/Image Max resolution images in image editor. */ + if (!DNA_struct_find(fd->filesdna, "SpaceImageOverlay")) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; + } + } + } + } + } } } diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 776fa34d1c4..186f2d3a5a8 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -131,7 +131,7 @@ static SpaceLink *image_create(const ScrArea *UNUSED(area), const Scene *UNUSED( simage->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS; BKE_imageuser_default(&simage->iuser); - simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS; + simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS | IMA_SHOW_MAX_RESOLUTION; BKE_scopes_new(&simage->scopes); simage->sample_line_hist.height = 100; diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h index e02fbaa6d04..b95053a3715 100644 --- a/source/blender/gpu/GPU_capabilities.h +++ b/source/blender/gpu/GPU_capabilities.h @@ -38,7 +38,7 @@ int GPU_max_textures_vert(void); int GPU_max_textures_geom(void); int GPU_max_textures_frag(void); -int GPU_texture_size_with_limit(int res); +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size); bool GPU_mip_render_workaround(void); bool GPU_depth_blitting_workaround(void); diff --git a/source/blender/gpu/intern/gpu_capabilities.cc b/source/blender/gpu/intern/gpu_capabilities.cc index 1d2b0e5c7a8..6d9182dcf17 100644 --- a/source/blender/gpu/intern/gpu_capabilities.cc +++ b/source/blender/gpu/intern/gpu_capabilities.cc @@ -49,10 +49,11 @@ int GPU_max_texture_size(void) return GCaps.max_texture_size; } -int GPU_texture_size_with_limit(int res) +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size) { int size = GPU_max_texture_size(); - int reslimit = (U.glreslimit != 0) ? min_ii(U.glreslimit, size) : size; + int reslimit = (limit_gl_texture_size && (U.glreslimit != 0)) ? min_ii(U.glreslimit, size) : + size; return min_ii(reslimit, res); } diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 58ddc918f61..8866a8a8600 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -745,7 +745,8 @@ const char *IMB_ffmpeg_last_error(void); struct GPUTexture *IMB_create_gpu_texture(const char *name, struct ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult); + bool use_premult, + bool limit_gl_texture_size); struct GPUTexture *IMB_touch_gpu_texture( const char *name, struct ImBuf *ibuf, int w, int h, int layers, bool use_high_bitdepth); void IMB_update_gpu_texture_sub(struct GPUTexture *tex, diff --git a/source/blender/imbuf/intern/util_gpu.c b/source/blender/imbuf/intern/util_gpu.c index fc89de476a1..8bedf8eb93c 100644 --- a/source/blender/imbuf/intern/util_gpu.c +++ b/source/blender/imbuf/intern/util_gpu.c @@ -219,10 +219,12 @@ void IMB_update_gpu_texture_sub(GPUTexture *tex, GPUTexture *IMB_create_gpu_texture(const char *name, ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult) + bool use_premult, + bool limit_gl_texture_size) { GPUTexture *tex = NULL; - int size[2] = {GPU_texture_size_with_limit(ibuf->x), GPU_texture_size_with_limit(ibuf->y)}; + int size[2] = {GPU_texture_size_with_limit(ibuf->x, limit_gl_texture_size), + GPU_texture_size_with_limit(ibuf->y, limit_gl_texture_size)}; bool do_rescale = (ibuf->x != size[0]) || (ibuf->y != size[1]); #ifdef WITH_DDS diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index b1d752d6197..22408687daf 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -119,6 +119,10 @@ typedef struct ImageTile { /* #define IMA_UNUSED_2 (1 << 2) */ #define IMA_NEED_FRAME_RECALC (1 << 3) #define IMA_SHOW_STEREO (1 << 4) +/* Do not limit the resolution by the limit texture size option in the user preferences. + * Images in the image editor or used as a backdrop are always shown using the maximum + * possible resolution. */ +#define IMA_SHOW_MAX_RESOLUTION (1 << 5) /* Used to get the correct gpu texture from an Image datablock. */ typedef enum eGPUTextureTarget { @@ -229,6 +233,8 @@ enum { IMA_GPU_PARTIAL_REFRESH = (1 << 1), /** All mipmap levels in OpenGL texture set? */ IMA_GPU_MIPMAP_COMPLETE = (1 << 2), + /** Current texture resolution won't be limited by the GL Texture Limit user preference. */ + IMA_GPU_MAX_RESOLUTION = (1 << 3), }; /* Image.source, where the image comes from */ From 302625eb37e6df6a7a5a889c9dd7edbaa640e086 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 4 Feb 2021 15:21:29 +0100 Subject: [PATCH 019/519] Fix (studio-reported) crash in readfile code. Essentially, `lib_link_all` would perform some post-processing over data in given `bmain` that **may** fail when not all data from all libraries has been properly loaded yet. This happens when `lib_link_all` is called from `read_libraries`, where the bmains are split by libraries. Now those post-processing is put into its own utils function, which asserts that it is only called on a merged bmain. Bonus point, this will avoid re-runing those not-so-cheap operations more than once on the same data. Reproducible in r1442 of Sprite repository when opening `pro/animation_test/rex/performance/rex_crowdcamping/rex_crowdcamping.lighting.blend` NOTE: Not so sure why we have to call `lib_link_all` several times (once for each library, and then once on the whole merged bmain, including local IDs then). So that it can get called for libs while we still have that specific .blend file handle around? In any case, the overhead here is minimal since we do ensure a data-block is never lib-linked more than once, so this is not a serious concern right now. Differential Revision: https://developer.blender.org/D10307 --- source/blender/blenloader/intern/readfile.c | 29 ++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 89d4fe0b222..b86896b1a8e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3918,6 +3918,24 @@ static void lib_link_all(FileData *fd, Main *bmain) } FOREACH_MAIN_ID_END; +#ifndef NDEBUG + /* Double check we do not have any 'need link' tag remaining, this should never be the case once + * this function has run. */ + FOREACH_MAIN_ID_BEGIN (bmain, id) { + BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0); + } + FOREACH_MAIN_ID_END; +#endif +} + +/* Checks to perform after `lib_link_all`. + * Those operations cannot perfom properly in a split bmain case, since some data from other + * bmain's (aka libraries) may not have been processed yet. */ +static void after_liblink_merged_bmain_process(Main *bmain) +{ + /* We only expect a merged Main here, not a split one. */ + BLI_assert((bmain->prev == NULL) && (bmain->next == NULL)); + /* Check for possible cycles in scenes' 'set' background property. */ lib_link_scenes_check_set(bmain); @@ -3928,15 +3946,6 @@ static void lib_link_all(FileData *fd, Main *bmain) /* We have to rebuild that runtime information *after* all data-blocks have been properly linked. */ BKE_main_collections_parent_relations_rebuild(bmain); - -#ifndef NDEBUG - /* Double check we do not have any 'need link' tag remaining, this should never be the case once - * this function has run. */ - FOREACH_MAIN_ID_BEGIN (bmain, id) { - BLI_assert((id->tag & LIB_TAG_NEED_LINK) == 0); - } - FOREACH_MAIN_ID_END; -#endif } /** \} */ @@ -4159,6 +4168,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) blo_join_main(&mainlist); lib_link_all(fd, bfd->main); + after_liblink_merged_bmain_process(bfd->main); /* Skip in undo case. */ if (fd->memfile == NULL) { @@ -5107,6 +5117,7 @@ static void library_link_end(Main *mainl, mainl = NULL; /* blo_join_main free's mainl, cant use anymore */ lib_link_all(*fd, mainvar); + after_liblink_merged_bmain_process(mainvar); /* Some versioning code does expect some proper userrefcounting, e.g. in conversion from * groups to collections... We could optimize out that first call when we are reading a From 048135e2c826b46ecf77324b93246ad70171e91d Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 8 Feb 2021 16:09:35 +0100 Subject: [PATCH 020/519] Fix T85448: File Browser sidebar collapses when selecting a file The logic to ensure a valid region state was too aggressive in setting the region hiding. It would just always update it based on the operator's `hide_props_region` option, not only when file browser was newly opened. It's more selective now. --- source/blender/editors/space_file/space_file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index d4cd888c662..178ca264182 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -261,7 +261,7 @@ static void file_ensure_valid_region_state(bContext *C, } } /* If there's an file-operation, ensure we have the option and execute region */ - else if (sfile->op) { + else if (sfile->op && !BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS)) { ARegion *region_ui = file_ui_region_ensure(area, region_tools); ARegion *region_execute = file_execute_region_ensure(area, region_ui); ARegion *region_props = file_tool_props_region_ensure(area, region_execute); @@ -276,7 +276,7 @@ static void file_ensure_valid_region_state(bContext *C, needs_init = true; } /* If there's _no_ file-operation, ensure we _don't_ have the option and execute region */ - else { + else if (!sfile->op) { ARegion *region_props = BKE_area_find_region_type(area, RGN_TYPE_TOOL_PROPS); ARegion *region_execute = BKE_area_find_region_type(area, RGN_TYPE_EXECUTE); ARegion *region_ui = file_ui_region_ensure(area, region_tools); From 21a2b975b8192c2714625c8f5e98a08fde796ba7 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Mon, 8 Feb 2021 17:28:15 +0200 Subject: [PATCH 021/519] Cleanup: Remove using-directive from freestyle headers The header files in freestyle utilize the using-directive at the global file scope. This is a bad practice as it pollutes the global name space causing possible ambiguous reference compilation errors. In particular, the DNA files that are included by freestyle will cause those ambiguous reference errors when the developers adds a DNA member with a type name that also exist in the Freestyle name space, such as Curve and possibly others. This patch does the minimal work needed to resolve that by moving the using-directives from the headers into the corresponding translation units. Reviewed By: Brecht Differential Revision: https://developer.blender.org/D10351 --- .../freestyle/intern/python/BPy_BBox.cpp | 3 + .../freestyle/intern/python/BPy_BBox.h | 5 +- .../intern/python/BPy_BinaryPredicate0D.cpp | 2 + .../intern/python/BPy_BinaryPredicate0D.h | 4 +- .../intern/python/BPy_BinaryPredicate1D.cpp | 2 + .../intern/python/BPy_BinaryPredicate1D.h | 4 +- .../freestyle/intern/python/BPy_Convert.cpp | 3 + .../freestyle/intern/python/BPy_Convert.h | 122 +++++++++--------- .../intern/python/BPy_FrsMaterial.cpp | 2 + .../freestyle/intern/python/BPy_FrsMaterial.h | 4 +- .../freestyle/intern/python/BPy_FrsNoise.cpp | 2 + .../freestyle/intern/python/BPy_FrsNoise.h | 6 +- .../freestyle/intern/python/BPy_Id.cpp | 2 + .../blender/freestyle/intern/python/BPy_Id.h | 6 +- .../intern/python/BPy_IntegrationType.cpp | 2 + .../intern/python/BPy_IntegrationType.h | 2 - .../intern/python/BPy_Interface0D.cpp | 2 + .../freestyle/intern/python/BPy_Interface0D.h | 4 +- .../intern/python/BPy_Interface1D.cpp | 2 + .../freestyle/intern/python/BPy_Interface1D.h | 4 +- .../freestyle/intern/python/BPy_Iterator.cpp | 2 + .../freestyle/intern/python/BPy_Iterator.h | 4 +- .../intern/python/BPy_MediumType.cpp | 2 + .../freestyle/intern/python/BPy_MediumType.h | 2 - .../freestyle/intern/python/BPy_Nature.cpp | 2 + .../freestyle/intern/python/BPy_Nature.h | 2 - .../freestyle/intern/python/BPy_Operators.cpp | 2 + .../freestyle/intern/python/BPy_Operators.h | 2 - .../freestyle/intern/python/BPy_SShape.cpp | 2 + .../freestyle/intern/python/BPy_SShape.h | 4 +- .../intern/python/BPy_StrokeAttribute.cpp | 2 + .../intern/python/BPy_StrokeAttribute.h | 4 +- .../intern/python/BPy_StrokeShader.cpp | 2 + .../intern/python/BPy_StrokeShader.h | 6 +- .../intern/python/BPy_UnaryFunction0D.cpp | 2 + .../intern/python/BPy_UnaryFunction0D.h | 2 - .../intern/python/BPy_UnaryFunction1D.cpp | 2 + .../intern/python/BPy_UnaryFunction1D.h | 2 - .../intern/python/BPy_UnaryPredicate0D.cpp | 2 + .../intern/python/BPy_UnaryPredicate0D.h | 4 +- .../intern/python/BPy_UnaryPredicate1D.cpp | 2 + .../intern/python/BPy_UnaryPredicate1D.h | 4 +- .../freestyle/intern/python/BPy_ViewMap.cpp | 2 + .../freestyle/intern/python/BPy_ViewMap.h | 4 +- .../freestyle/intern/python/BPy_ViewShape.cpp | 2 + .../freestyle/intern/python/BPy_ViewShape.h | 4 +- .../BinaryPredicate1D/BPy_FalseBP1D.cpp | 2 + .../BinaryPredicate1D/BPy_Length2DBP1D.cpp | 2 + .../BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp | 2 + .../python/BinaryPredicate1D/BPy_TrueBP1D.cpp | 2 + .../BPy_ViewMapGradientNormBP1D.cpp | 2 + .../freestyle/intern/python/Director.cpp | 2 + .../freestyle/intern/python/Director.h | 33 ++--- .../python/Interface0D/BPy_CurvePoint.cpp | 2 + .../python/Interface0D/BPy_CurvePoint.h | 2 +- .../intern/python/Interface0D/BPy_SVertex.cpp | 2 + .../intern/python/Interface0D/BPy_SVertex.h | 2 +- .../python/Interface0D/BPy_ViewVertex.cpp | 2 + .../python/Interface0D/BPy_ViewVertex.h | 2 +- .../CurvePoint/BPy_StrokeVertex.cpp | 2 + .../Interface0D/CurvePoint/BPy_StrokeVertex.h | 2 +- .../Interface0D/ViewVertex/BPy_NonTVertex.cpp | 2 + .../Interface0D/ViewVertex/BPy_NonTVertex.h | 2 +- .../Interface0D/ViewVertex/BPy_TVertex.cpp | 2 + .../Interface0D/ViewVertex/BPy_TVertex.h | 2 +- .../intern/python/Interface1D/BPy_FEdge.cpp | 2 + .../intern/python/Interface1D/BPy_FEdge.h | 2 +- .../python/Interface1D/BPy_FrsCurve.cpp | 2 + .../intern/python/Interface1D/BPy_FrsCurve.h | 2 +- .../intern/python/Interface1D/BPy_Stroke.cpp | 2 + .../intern/python/Interface1D/BPy_Stroke.h | 2 +- .../python/Interface1D/BPy_ViewEdge.cpp | 2 + .../intern/python/Interface1D/BPy_ViewEdge.h | 2 +- .../python/Interface1D/Curve/BPy_Chain.cpp | 2 + .../python/Interface1D/Curve/BPy_Chain.h | 2 +- .../Interface1D/FEdge/BPy_FEdgeSharp.cpp | 2 + .../python/Interface1D/FEdge/BPy_FEdgeSharp.h | 2 +- .../Interface1D/FEdge/BPy_FEdgeSmooth.cpp | 2 + .../Interface1D/FEdge/BPy_FEdgeSmooth.h | 2 +- .../python/Iterator/BPy_AdjacencyIterator.cpp | 2 + .../python/Iterator/BPy_AdjacencyIterator.h | 2 +- .../Iterator/BPy_ChainPredicateIterator.cpp | 2 + .../Iterator/BPy_ChainPredicateIterator.h | 2 +- .../Iterator/BPy_ChainSilhouetteIterator.cpp | 2 + .../Iterator/BPy_ChainSilhouetteIterator.h | 2 +- .../python/Iterator/BPy_ChainingIterator.cpp | 2 + .../python/Iterator/BPy_ChainingIterator.h | 2 +- .../Iterator/BPy_CurvePointIterator.cpp | 2 + .../python/Iterator/BPy_CurvePointIterator.h | 2 +- .../Iterator/BPy_Interface0DIterator.cpp | 2 + .../python/Iterator/BPy_Interface0DIterator.h | 2 +- .../python/Iterator/BPy_SVertexIterator.cpp | 2 + .../python/Iterator/BPy_SVertexIterator.h | 2 +- .../Iterator/BPy_StrokeVertexIterator.cpp | 2 + .../Iterator/BPy_StrokeVertexIterator.h | 2 +- .../python/Iterator/BPy_ViewEdgeIterator.cpp | 2 + .../python/Iterator/BPy_ViewEdgeIterator.h | 2 +- .../Iterator/BPy_orientedViewEdgeIterator.cpp | 2 + .../Iterator/BPy_orientedViewEdgeIterator.h | 2 +- .../BPy_BackboneStretcherShader.cpp | 2 + .../StrokeShader/BPy_BezierCurveShader.cpp | 2 + .../StrokeShader/BPy_BlenderTextureShader.cpp | 2 + .../StrokeShader/BPy_CalligraphicShader.cpp | 2 + .../StrokeShader/BPy_ColorNoiseShader.cpp | 2 + .../StrokeShader/BPy_ConstantColorShader.cpp | 2 + .../BPy_ConstantThicknessShader.cpp | 2 + ...y_ConstrainedIncreasingThicknessShader.cpp | 2 + .../StrokeShader/BPy_GuidingLinesShader.cpp | 2 + .../BPy_IncreasingColorShader.cpp | 2 + .../BPy_IncreasingThicknessShader.cpp | 2 + .../BPy_PolygonalizationShader.cpp | 2 + .../StrokeShader/BPy_SamplingShader.cpp | 2 + .../StrokeShader/BPy_SmoothingShader.cpp | 2 + .../StrokeShader/BPy_SpatialNoiseShader.cpp | 2 + .../BPy_StrokeTextureStepShader.cpp | 2 + .../StrokeShader/BPy_ThicknessNoiseShader.cpp | 2 + .../StrokeShader/BPy_TipRemoverShader.cpp | 2 + .../BPy_UnaryFunction0DDouble.cpp | 2 + .../BPy_UnaryFunction0DDouble.h | 2 +- .../BPy_UnaryFunction0DEdgeNature.cpp | 2 + .../BPy_UnaryFunction0DEdgeNature.h | 2 +- .../BPy_UnaryFunction0DFloat.cpp | 2 + .../BPy_UnaryFunction0DFloat.h | 2 +- .../UnaryFunction0D/BPy_UnaryFunction0DId.cpp | 2 + .../UnaryFunction0D/BPy_UnaryFunction0DId.h | 2 +- .../BPy_UnaryFunction0DMaterial.cpp | 2 + .../BPy_UnaryFunction0DMaterial.h | 2 +- .../BPy_UnaryFunction0DUnsigned.cpp | 2 + .../BPy_UnaryFunction0DUnsigned.h | 2 +- .../BPy_UnaryFunction0DVec2f.cpp | 2 + .../BPy_UnaryFunction0DVec2f.h | 3 +- .../BPy_UnaryFunction0DVec3f.cpp | 2 + .../BPy_UnaryFunction0DVec3f.h | 3 +- .../BPy_UnaryFunction0DVectorViewShape.cpp | 2 + .../BPy_UnaryFunction0DVectorViewShape.h | 2 +- .../BPy_UnaryFunction0DViewShape.cpp | 2 + .../BPy_UnaryFunction0DViewShape.h | 2 +- .../UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp | 2 + .../BPy_MaterialF0D.cpp | 2 + .../BPy_CurveNatureF0D.cpp | 2 + .../UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp | 2 + .../BPy_VertexOrientation2DF0D.cpp | 2 + .../BPy_VertexOrientation3DF0D.cpp | 2 + .../BPy_GetOccludeeF0D.cpp | 2 + .../BPy_GetShapeF0D.cpp | 2 + .../BPy_Curvature2DAngleF0D.cpp | 2 + .../UnaryFunction0D_double/BPy_DensityF0D.cpp | 2 + .../BPy_GetProjectedXF0D.cpp | 2 + .../BPy_GetProjectedYF0D.cpp | 2 + .../BPy_GetProjectedZF0D.cpp | 2 + .../UnaryFunction0D_double/BPy_GetXF0D.cpp | 2 + .../UnaryFunction0D_double/BPy_GetYF0D.cpp | 2 + .../UnaryFunction0D_double/BPy_GetZF0D.cpp | 2 + .../BPy_LocalAverageDepthF0D.cpp | 2 + .../BPy_ZDiscontinuityF0D.cpp | 2 + .../BPy_GetCurvilinearAbscissaF0D.cpp | 2 + .../BPy_GetParameterF0D.cpp | 2 + .../BPy_GetViewMapGradientNormF0D.cpp | 2 + .../BPy_ReadCompleteViewMapPixelF0D.cpp | 2 + .../BPy_ReadMapPixelF0D.cpp | 2 + .../BPy_ReadSteerableViewMapPixelF0D.cpp | 2 + .../BPy_QuantitativeInvisibilityF0D.cpp | 2 + .../BPy_GetOccludersF0D.cpp | 2 + .../BPy_UnaryFunction1DDouble.cpp | 2 + .../BPy_UnaryFunction1DDouble.h | 2 +- .../BPy_UnaryFunction1DEdgeNature.cpp | 2 + .../BPy_UnaryFunction1DEdgeNature.h | 2 +- .../BPy_UnaryFunction1DFloat.cpp | 2 + .../BPy_UnaryFunction1DFloat.h | 2 +- .../BPy_UnaryFunction1DUnsigned.cpp | 2 + .../BPy_UnaryFunction1DUnsigned.h | 2 +- .../BPy_UnaryFunction1DVec2f.cpp | 2 + .../BPy_UnaryFunction1DVec2f.h | 3 +- .../BPy_UnaryFunction1DVec3f.cpp | 2 + .../BPy_UnaryFunction1DVec3f.h | 3 +- .../BPy_UnaryFunction1DVectorViewShape.cpp | 2 + .../BPy_UnaryFunction1DVectorViewShape.h | 2 +- .../BPy_UnaryFunction1DVoid.cpp | 2 + .../UnaryFunction1D/BPy_UnaryFunction1DVoid.h | 2 +- .../BPy_CurveNatureF1D.cpp | 2 + .../UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp | 2 + .../BPy_Orientation2DF1D.cpp | 2 + .../BPy_Orientation3DF1D.cpp | 2 + .../BPy_Curvature2DAngleF1D.cpp | 2 + .../UnaryFunction1D_double/BPy_DensityF1D.cpp | 2 + .../BPy_GetCompleteViewMapDensityF1D.cpp | 2 + .../BPy_GetDirectionalViewMapDensityF1D.cpp | 2 + .../BPy_GetProjectedXF1D.cpp | 2 + .../BPy_GetProjectedYF1D.cpp | 2 + .../BPy_GetProjectedZF1D.cpp | 2 + .../BPy_GetSteerableViewMapDensityF1D.cpp | 2 + .../BPy_GetViewMapGradientNormF1D.cpp | 2 + .../UnaryFunction1D_double/BPy_GetXF1D.cpp | 2 + .../UnaryFunction1D_double/BPy_GetYF1D.cpp | 2 + .../UnaryFunction1D_double/BPy_GetZF1D.cpp | 2 + .../BPy_LocalAverageDepthF1D.cpp | 2 + .../BPy_ZDiscontinuityF1D.cpp | 2 + .../BPy_QuantitativeInvisibilityF1D.cpp | 2 + .../BPy_GetOccludeeF1D.cpp | 2 + .../BPy_GetOccludersF1D.cpp | 2 + .../BPy_GetShapeF1D.cpp | 2 + .../BPy_ChainingTimeStampF1D.cpp | 2 + .../BPy_IncrementChainingTimeStampF1D.cpp | 2 + .../UnaryFunction1D_void/BPy_TimeStampF1D.cpp | 2 + .../python/UnaryPredicate0D/BPy_FalseUP0D.cpp | 2 + .../python/UnaryPredicate0D/BPy_TrueUP0D.cpp | 2 + .../UnaryPredicate1D/BPy_ContourUP1D.cpp | 2 + .../BPy_DensityLowerThanUP1D.cpp | 2 + .../BPy_EqualToChainingTimeStampUP1D.cpp | 2 + .../BPy_EqualToTimeStampUP1D.cpp | 2 + .../BPy_ExternalContourUP1D.cpp | 2 + .../python/UnaryPredicate1D/BPy_FalseUP1D.cpp | 2 + .../BPy_QuantitativeInvisibilityUP1D.cpp | 2 + .../python/UnaryPredicate1D/BPy_ShapeUP1D.cpp | 2 + .../python/UnaryPredicate1D/BPy_TrueUP1D.cpp | 2 + .../BPy_WithinImageBoundaryUP1D.cpp | 2 + 216 files changed, 442 insertions(+), 186 deletions(-) diff --git a/source/blender/freestyle/intern/python/BPy_BBox.cpp b/source/blender/freestyle/intern/python/BPy_BBox.cpp index d66a74bc83f..39dd55f0cc1 100644 --- a/source/blender/freestyle/intern/python/BPy_BBox.cpp +++ b/source/blender/freestyle/intern/python/BPy_BBox.cpp @@ -24,6 +24,9 @@ extern "C" { #endif +using namespace Freestyle; +using namespace Freestyle::Geometry; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_BBox.h b/source/blender/freestyle/intern/python/BPy_BBox.h index a284deed10c..889dbc62a41 100644 --- a/source/blender/freestyle/intern/python/BPy_BBox.h +++ b/source/blender/freestyle/intern/python/BPy_BBox.h @@ -27,9 +27,6 @@ extern "C" { #include "../geometry/BBox.h" #include "../geometry/Geom.h" -using namespace Freestyle; -using namespace Freestyle::Geometry; - #ifdef __cplusplus extern "C" { #endif @@ -42,7 +39,7 @@ extern PyTypeObject BBox_Type; /*---------------------------Python BPy_BBox structure definition----------*/ typedef struct { - PyObject_HEAD BBox *bb; + PyObject_HEAD Freestyle::BBox *bb; } BPy_BBox; /*---------------------------Python BPy_BBox visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp index 2359d79f7d0..d12804761f0 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h index cdf81f3e4fc..a368d4cd47e 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate0D_Type; /*---------------------------Python BPy_BinaryPredicate0D structure definition----------*/ typedef struct { - PyObject_HEAD BinaryPredicate0D *bp0D; + PyObject_HEAD Freestyle::BinaryPredicate0D *bp0D; } BPy_BinaryPredicate0D; /*---------------------------Python BPy_BinaryPredicate0D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp index 7d554e0abe1..969041702b5 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp @@ -33,6 +33,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h index b761f6f6ace..b34fad9e213 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject BinaryPredicate1D_Type; /*---------------------------Python BPy_BinaryPredicate1D structure definition----------*/ typedef struct { - PyObject_HEAD BinaryPredicate1D *bp1D; + PyObject_HEAD Freestyle::BinaryPredicate1D *bp1D; } BPy_BinaryPredicate1D; /*---------------------------Python BPy_BinaryPredicate1D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Convert.cpp b/source/blender/freestyle/intern/python/BPy_Convert.cpp index f1d7a242a93..99ba3090137 100644 --- a/source/blender/freestyle/intern/python/BPy_Convert.cpp +++ b/source/blender/freestyle/intern/python/BPy_Convert.cpp @@ -61,6 +61,9 @@ extern "C" { #endif +using namespace Freestyle; +using namespace Freestyle::Geometry; + /////////////////////////////////////////////////////////////////////////////////////////// //============================== diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h index 5a1c11ec086..e0916196808 100644 --- a/source/blender/freestyle/intern/python/BPy_Convert.h +++ b/source/blender/freestyle/intern/python/BPy_Convert.h @@ -28,9 +28,6 @@ extern "C" { #include "../geometry/Geom.h" -using namespace Freestyle; -using namespace Freestyle::Geometry; - // BBox #include "../geometry/BBox.h" @@ -94,76 +91,81 @@ extern "C" { //============================== PyObject *PyBool_from_bool(bool b); -PyObject *Vector_from_Vec2f(Vec2f &v); -PyObject *Vector_from_Vec3f(Vec3f &v); -PyObject *Vector_from_Vec3r(Vec3r &v); +PyObject *Vector_from_Vec2f(Freestyle::Geometry::Vec2f &v); +PyObject *Vector_from_Vec3f(Freestyle::Geometry::Vec3f &v); +PyObject *Vector_from_Vec3r(Freestyle::Geometry::Vec3r &v); -PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D &if0D); -PyObject *Any_BPy_Interface1D_from_Interface1D(Interface1D &if1D); -PyObject *Any_BPy_FEdge_from_FEdge(FEdge &fe); -PyObject *Any_BPy_ViewVertex_from_ViewVertex(ViewVertex &vv); +PyObject *Any_BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D); +PyObject *Any_BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D); +PyObject *Any_BPy_FEdge_from_FEdge(Freestyle::FEdge &fe); +PyObject *Any_BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv); -PyObject *BPy_BBox_from_BBox(const BBox &bb); -PyObject *BPy_CurvePoint_from_CurvePoint(CurvePoint &cp); -PyObject *BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge &dve); -PyObject *BPy_FEdge_from_FEdge(FEdge &fe); -PyObject *BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp &fes); -PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth &fes); -PyObject *BPy_Id_from_Id(Id &id); -PyObject *BPy_Interface0D_from_Interface0D(Interface0D &if0D); -PyObject *BPy_Interface1D_from_Interface1D(Interface1D &if1D); -PyObject *BPy_IntegrationType_from_IntegrationType(IntegrationType i); -PyObject *BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial &m); +PyObject *BPy_BBox_from_BBox(const Freestyle::BBox &bb); +PyObject *BPy_CurvePoint_from_CurvePoint(Freestyle::CurvePoint &cp); +PyObject *BPy_directedViewEdge_from_directedViewEdge(Freestyle::ViewVertex::directedViewEdge &dve); +PyObject *BPy_FEdge_from_FEdge(Freestyle::FEdge &fe); +PyObject *BPy_FEdgeSharp_from_FEdgeSharp(Freestyle::FEdgeSharp &fes); +PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(Freestyle::FEdgeSmooth &fes); +PyObject *BPy_Id_from_Id(Freestyle::Id &id); +PyObject *BPy_Interface0D_from_Interface0D(Freestyle::Interface0D &if0D); +PyObject *BPy_Interface1D_from_Interface1D(Freestyle::Interface1D &if1D); +PyObject *BPy_IntegrationType_from_IntegrationType(Freestyle::IntegrationType i); +PyObject *BPy_FrsMaterial_from_FrsMaterial(const Freestyle::FrsMaterial &m); PyObject *BPy_Nature_from_Nature(unsigned short n); -PyObject *BPy_MediumType_from_MediumType(Stroke::MediumType n); -PyObject *BPy_SShape_from_SShape(SShape &ss); -PyObject *BPy_Stroke_from_Stroke(Stroke &s); -PyObject *BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute &sa); -PyObject *BPy_StrokeVertex_from_StrokeVertex(StrokeVertex &sv); -PyObject *BPy_SVertex_from_SVertex(SVertex &sv); -PyObject *BPy_ViewVertex_from_ViewVertex(ViewVertex &vv); -PyObject *BPy_NonTVertex_from_NonTVertex(NonTVertex &ntv); -PyObject *BPy_TVertex_from_TVertex(TVertex &tv); -PyObject *BPy_ViewEdge_from_ViewEdge(ViewEdge &ve); -PyObject *BPy_Chain_from_Chain(Chain &c); -PyObject *BPy_ViewShape_from_ViewShape(ViewShape &vs); +PyObject *BPy_MediumType_from_MediumType(Freestyle::Stroke::MediumType n); +PyObject *BPy_SShape_from_SShape(Freestyle::SShape &ss); +PyObject *BPy_Stroke_from_Stroke(Freestyle::Stroke &s); +PyObject *BPy_StrokeAttribute_from_StrokeAttribute(Freestyle::StrokeAttribute &sa); +PyObject *BPy_StrokeVertex_from_StrokeVertex(Freestyle::StrokeVertex &sv); +PyObject *BPy_SVertex_from_SVertex(Freestyle::SVertex &sv); +PyObject *BPy_ViewVertex_from_ViewVertex(Freestyle::ViewVertex &vv); +PyObject *BPy_NonTVertex_from_NonTVertex(Freestyle::NonTVertex &ntv); +PyObject *BPy_TVertex_from_TVertex(Freestyle::TVertex &tv); +PyObject *BPy_ViewEdge_from_ViewEdge(Freestyle::ViewEdge &ve); +PyObject *BPy_Chain_from_Chain(Freestyle::Chain &c); +PyObject *BPy_ViewShape_from_ViewShape(Freestyle::ViewShape &vs); -PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator &a_it); -PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator &if0D_it, +PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(Freestyle::AdjacencyIterator &a_it); +PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Freestyle::Interface0DIterator &if0D_it, bool reversed); -PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator &cp_it); +PyObject *BPy_CurvePointIterator_from_CurvePointIterator( + Freestyle::CurveInternal::CurvePointIterator &cp_it); PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator( - StrokeInternal::StrokeVertexIterator &sv_it, bool reversed); -PyObject *BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator &sv_it); + Freestyle::StrokeInternal::StrokeVertexIterator &sv_it, bool reversed); +PyObject *BPy_SVertexIterator_from_SVertexIterator( + Freestyle::ViewEdgeInternal::SVertexIterator &sv_it); PyObject *BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator( - ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed); -PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator &ve_it); -PyObject *BPy_ChainingIterator_from_ChainingIterator(ChainingIterator &c_it); -PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator &cp_it); -PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator &cs_it); + Freestyle::ViewVertexInternal::orientedViewEdgeIterator &ove_it, bool reversed); +PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator( + Freestyle::ViewEdgeInternal::ViewEdgeIterator &ve_it); +PyObject *BPy_ChainingIterator_from_ChainingIterator(Freestyle::ChainingIterator &c_it); +PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator( + Freestyle::ChainPredicateIterator &cp_it); +PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator( + Freestyle::ChainSilhouetteIterator &cs_it); //============================== // Python => C++ //============================== bool bool_from_PyBool(PyObject *b); -IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj); -Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj); -Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj); -bool Vec2f_ptr_from_PyObject(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyObject(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyObject(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_Vector(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_Vector(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_Vector(PyObject *obj, Vec3r &vec); -bool Vec3f_ptr_from_Color(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_Color(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_PyList(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyList(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyList(PyObject *obj, Vec3r &vec); -bool Vec2f_ptr_from_PyTuple(PyObject *obj, Vec2f &vec); -bool Vec3f_ptr_from_PyTuple(PyObject *obj, Vec3f &vec); -bool Vec3r_ptr_from_PyTuple(PyObject *obj, Vec3r &vec); +Freestyle::IntegrationType IntegrationType_from_BPy_IntegrationType(PyObject *obj); +Freestyle::Stroke::MediumType MediumType_from_BPy_MediumType(PyObject *obj); +Freestyle::Nature::EdgeNature EdgeNature_from_BPy_Nature(PyObject *obj); +bool Vec2f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyObject(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_Vector(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec3f_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_Color(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyList(PyObject *obj, Freestyle::Geometry::Vec3r &vec); +bool Vec2f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec2f &vec); +bool Vec3f_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3f &vec); +bool Vec3r_ptr_from_PyTuple(PyObject *obj, Freestyle::Geometry::Vec3r &vec); bool float_array_from_PyObject(PyObject *obj, float *v, int n); diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp index 2aa08ec3ab5..e3e6ba5ab83 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp @@ -28,6 +28,8 @@ extern "C" { #include "BLI_hash_mm2a.h" +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h index 13a116d7ef2..084fcef9a62 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.h +++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.h @@ -26,8 +26,6 @@ extern "C" { #include "../scene_graph/FrsMaterial.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject FrsMaterial_Type; /*---------------------------Python BPy_FrsMaterial structure definition----------*/ typedef struct { - PyObject_HEAD FrsMaterial *m; + PyObject_HEAD Freestyle::FrsMaterial *m; } BPy_FrsMaterial; /*---------------------------Python BPy_FrsMaterial visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp index 943a9ca0e64..73e2abc8688 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.h b/source/blender/freestyle/intern/python/BPy_FrsNoise.h index 09bcc82ae94..0f8f2d3242c 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsNoise.h +++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.h @@ -27,8 +27,6 @@ extern "C" { #include "../geometry/Noise.h" #include "../system/PseudoNoise.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,8 +39,8 @@ extern PyTypeObject FrsNoise_Type; /*---------------------------Python BPy_FrsNoise structure definition----------*/ typedef struct { - PyObject_HEAD Noise *n; - PseudoNoise *pn; + PyObject_HEAD Freestyle::Noise *n; + Freestyle::PseudoNoise *pn; } BPy_FrsNoise; /*---------------------------Python BPy_FrsNoise visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Id.cpp b/source/blender/freestyle/intern/python/BPy_Id.cpp index 323e76fe249..5f9824db773 100644 --- a/source/blender/freestyle/intern/python/BPy_Id.cpp +++ b/source/blender/freestyle/intern/python/BPy_Id.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_Id.h b/source/blender/freestyle/intern/python/BPy_Id.h index f5952297c66..51a70a391b1 100644 --- a/source/blender/freestyle/intern/python/BPy_Id.h +++ b/source/blender/freestyle/intern/python/BPy_Id.h @@ -26,12 +26,8 @@ extern "C" { #include -using namespace std; - #include "../system/Id.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -44,7 +40,7 @@ extern PyTypeObject Id_Type; /*---------------------------Python BPy_Id structure definition----------*/ typedef struct { - PyObject_HEAD Id *id; + PyObject_HEAD Freestyle::Id *id; } BPy_Id; /*---------------------------Python BPy_Id visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp index 25f3c54ea7d..15f3f936b14 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------ MODULE FUNCTIONS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.h b/source/blender/freestyle/intern/python/BPy_IntegrationType.h index be815c6c95a..9176a504b24 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.h +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp index 3d0c57d5509..a1456a9491f 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp @@ -34,6 +34,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.h b/source/blender/freestyle/intern/python/BPy_Interface0D.h index 7e41a8888e1..9734378f446 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface0D.h +++ b/source/blender/freestyle/intern/python/BPy_Interface0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject Interface0D_Type; /*---------------------------Python BPy_Interface0D structure definition----------*/ typedef struct { - PyObject_HEAD Interface0D *if0D; + PyObject_HEAD Freestyle::Interface0D *if0D; bool borrowed; /* true if *if0D is a borrowed object */ } BPy_Interface0D; diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp index 8a4a6eb61db..2fe56eb952d 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp @@ -35,6 +35,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.h b/source/blender/freestyle/intern/python/BPy_Interface1D.h index 20a4af0b4d0..4ed562c24f7 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.h +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Interface1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject Interface1D_Type; /*---------------------------Python BPy_Interface1D structure definition----------*/ typedef struct { - PyObject_HEAD Interface1D *if1D; + PyObject_HEAD Freestyle::Interface1D *if1D; bool borrowed; /* true if *if1D is a borrowed object */ } BPy_Interface1D; diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.cpp b/source/blender/freestyle/intern/python/BPy_Iterator.cpp index bee30aa9e8c..5346c4a8dc0 100644 --- a/source/blender/freestyle/intern/python/BPy_Iterator.cpp +++ b/source/blender/freestyle/intern/python/BPy_Iterator.cpp @@ -36,6 +36,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.h b/source/blender/freestyle/intern/python/BPy_Iterator.h index 5d1e8422976..7094384140f 100644 --- a/source/blender/freestyle/intern/python/BPy_Iterator.h +++ b/source/blender/freestyle/intern/python/BPy_Iterator.h @@ -26,8 +26,6 @@ extern "C" { #include "../system/Iterator.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject Iterator_Type; /*---------------------------Python BPy_Iterator structure definition----------*/ typedef struct { - PyObject_HEAD Iterator *it; + PyObject_HEAD Freestyle::Iterator *it; } BPy_Iterator; /*---------------------------Python BPy_Iterator visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.cpp b/source/blender/freestyle/intern/python/BPy_MediumType.cpp index 547f46839b8..35f9dc17070 100644 --- a/source/blender/freestyle/intern/python/BPy_MediumType.cpp +++ b/source/blender/freestyle/intern/python/BPy_MediumType.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*-----------------------BPy_MediumType type definition ------------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.h b/source/blender/freestyle/intern/python/BPy_MediumType.h index 854f826291e..e34edc45f42 100644 --- a/source/blender/freestyle/intern/python/BPy_MediumType.h +++ b/source/blender/freestyle/intern/python/BPy_MediumType.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Stroke.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Nature.cpp b/source/blender/freestyle/intern/python/BPy_Nature.cpp index b0a620803d1..304364b60eb 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.cpp +++ b/source/blender/freestyle/intern/python/BPy_Nature.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// static PyObject *BPy_Nature_and(PyObject *a, PyObject *b); diff --git a/source/blender/freestyle/intern/python/BPy_Nature.h b/source/blender/freestyle/intern/python/BPy_Nature.h index 48d15c8e796..a105db22b2a 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.h +++ b/source/blender/freestyle/intern/python/BPy_Nature.h @@ -26,8 +26,6 @@ extern "C" { #include "../winged_edge/Nature.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_Operators.cpp b/source/blender/freestyle/intern/python/BPy_Operators.cpp index d911e7db447..5dbf18c24a7 100644 --- a/source/blender/freestyle/intern/python/BPy_Operators.cpp +++ b/source/blender/freestyle/intern/python/BPy_Operators.cpp @@ -36,6 +36,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_Operators.h b/source/blender/freestyle/intern/python/BPy_Operators.h index 3b060d63f3c..9ed6bc2305d 100644 --- a/source/blender/freestyle/intern/python/BPy_Operators.h +++ b/source/blender/freestyle/intern/python/BPy_Operators.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Operators.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp index ed83e76559f..bb1b07a8c4c 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_SShape.h b/source/blender/freestyle/intern/python/BPy_SShape.h index 9741a10f69e..a6fb090a537 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.h +++ b/source/blender/freestyle/intern/python/BPy_SShape.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Silhouette.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject SShape_Type; /*---------------------------Python BPy_SShape structure definition----------*/ typedef struct { - PyObject_HEAD SShape *ss; + PyObject_HEAD Freestyle::SShape *ss; bool borrowed; /* true if *ss is a borrowed object */ } BPy_SShape; diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp index 8f706f56f7d..c95abae3645 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h index 9068eb4c7a3..9c0a7368dcb 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Stroke.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject StrokeAttribute_Type; /*---------------------------Python BPy_StrokeAttribute structure definition----------*/ typedef struct { - PyObject_HEAD StrokeAttribute *sa; + PyObject_HEAD Freestyle::StrokeAttribute *sa; bool borrowed; /* true if *sa is a borrowed reference */ } BPy_StrokeAttribute; diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp index b55da256c22..01f8ec18022 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp @@ -46,6 +46,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.h b/source/blender/freestyle/intern/python/BPy_StrokeShader.h index 04fff8e8052..74c5df52312 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeShader.h +++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.h @@ -26,12 +26,8 @@ extern "C" { #include "../system/FreestyleConfig.h" -using namespace std; - #include "../stroke/StrokeShader.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -45,7 +41,7 @@ extern PyTypeObject StrokeShader_Type; /*---------------------------Python BPy_StrokeShader structure definition----------*/ typedef struct { - PyObject_HEAD StrokeShader *ss; + PyObject_HEAD Freestyle::StrokeShader *ss; } BPy_StrokeShader; /*---------------------------Python BPy_StrokeShader visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp index 78c93ddce31..de426183b6a 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp @@ -35,6 +35,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h index 1319cabe94a..ef3021faf48 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Functions0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp index 365850b748c..591f69b23df 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp @@ -33,6 +33,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h index 331c3b4aaa1..4613d58c2b7 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/Functions1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp index e3076d4615f..3c3b0fe82e3 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h index 2460b1f028b..3d45c2fc701 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates0D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate0D_Type; /*---------------------------Python BPy_UnaryPredicate0D structure definition----------*/ typedef struct { - PyObject_HEAD UnaryPredicate0D *up0D; + PyObject_HEAD Freestyle::UnaryPredicate0D *up0D; } BPy_UnaryPredicate0D; /*---------------------------Python BPy_UnaryPredicate0D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp index 4b5269a1434..26087d1a6ef 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp @@ -38,6 +38,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h index 8fad7f94caf..0139ed8af77 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.h @@ -26,8 +26,6 @@ extern "C" { #include "../stroke/Predicates1D.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -41,7 +39,7 @@ extern PyTypeObject UnaryPredicate1D_Type; /*---------------------------Python BPy_UnaryPredicate1D structure definition----------*/ typedef struct { - PyObject_HEAD UnaryPredicate1D *up1D; + PyObject_HEAD Freestyle::UnaryPredicate1D *up1D; } BPy_UnaryPredicate1D; /*---------------------------Python BPy_UnaryPredicate1D visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp index 8565a95fc1a..24925edecf9 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.h b/source/blender/freestyle/intern/python/BPy_ViewMap.h index 59738b6dce9..2222b327dc2 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewMap.h +++ b/source/blender/freestyle/intern/python/BPy_ViewMap.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/ViewMap.h" -using namespace Freestyle; - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +38,7 @@ extern PyTypeObject ViewMap_Type; /*---------------------------Python BPy_ViewMap structure definition----------*/ typedef struct { - PyObject_HEAD ViewMap *vm; + PyObject_HEAD Freestyle::ViewMap *vm; } BPy_ViewMap; /*---------------------------Python BPy_ViewMap visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp index 6c8551867fd..d6964d4d6ec 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.h b/source/blender/freestyle/intern/python/BPy_ViewShape.h index bd51fd0d5cb..8401c4378f0 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewShape.h +++ b/source/blender/freestyle/intern/python/BPy_ViewShape.h @@ -26,8 +26,6 @@ extern "C" { #include "../view_map/ViewMap.h" -using namespace Freestyle; - #include "BPy_SShape.h" #ifdef __cplusplus @@ -42,7 +40,7 @@ extern PyTypeObject ViewShape_Type; /*---------------------------Python BPy_ViewShape structure definition----------*/ typedef struct { - PyObject_HEAD ViewShape *vs; + PyObject_HEAD Freestyle::ViewShape *vs; bool borrowed; /* true if *vs a borrowed object */ BPy_SShape *py_ss; } BPy_ViewShape; diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp index e284f28cd0b..4299cfae214 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp index 2c84f69dd6e..fb057022290 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp index ab79ae4e209..96e35bd305b 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp index 47c3c6b53aa..eb53cfc5b0e 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp index 9d69b1c902c..9522a8da4f7 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Director.cpp b/source/blender/freestyle/intern/python/Director.cpp index ff1d63f5f58..4dd3f732be9 100644 --- a/source/blender/freestyle/intern/python/Director.cpp +++ b/source/blender/freestyle/intern/python/Director.cpp @@ -56,6 +56,8 @@ #include "UnaryFunction1D/BPy_UnaryFunction1DVec3f.h" #include "UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h" +using namespace Freestyle; + // BinaryPredicate0D: __call__ int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D, Interface0D &i1, diff --git a/source/blender/freestyle/intern/python/Director.h b/source/blender/freestyle/intern/python/Director.h index 468150524f1..0894911fe14 100644 --- a/source/blender/freestyle/intern/python/Director.h +++ b/source/blender/freestyle/intern/python/Director.h @@ -34,31 +34,34 @@ class Stroke; class StrokeShader; } // namespace Freestyle -using namespace Freestyle; - // BinaryPredicate0D: __call__ -int Director_BPy_BinaryPredicate0D___call__(BinaryPredicate0D *bp0D, - Interface0D &i1, - Interface0D &i2); +int Director_BPy_BinaryPredicate0D___call__(Freestyle::BinaryPredicate0D *bp0D, + Freestyle::Interface0D &i1, + Freestyle::Interface0D &i2); // BinaryPredicate1D: __call__ -int Director_BPy_BinaryPredicate1D___call__(BinaryPredicate1D *bp1D, - Interface1D &i1, - Interface1D &i2); +int Director_BPy_BinaryPredicate1D___call__(Freestyle::BinaryPredicate1D *bp1D, + Freestyle::Interface1D &i1, + Freestyle::Interface1D &i2); // UnaryFunction{0D,1D}: __call__ -int Director_BPy_UnaryFunction0D___call__(void *uf0D, void *py_uf0D, Interface0DIterator &if0D_it); -int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Interface1D &if1D); +int Director_BPy_UnaryFunction0D___call__(void *uf0D, + void *py_uf0D, + Freestyle::Interface0DIterator &if0D_it); +int Director_BPy_UnaryFunction1D___call__(void *uf1D, void *py_uf1D, Freestyle::Interface1D &if1D); // UnaryPredicate0D: __call__ -int Director_BPy_UnaryPredicate0D___call__(UnaryPredicate0D *up0D, Interface0DIterator &if0D_it); +int Director_BPy_UnaryPredicate0D___call__(Freestyle::UnaryPredicate0D *up0D, + Freestyle::Interface0DIterator &if0D_it); // UnaryPredicate1D: __call__ -int Director_BPy_UnaryPredicate1D___call__(UnaryPredicate1D *up1D, Interface1D &if1D); +int Director_BPy_UnaryPredicate1D___call__(Freestyle::UnaryPredicate1D *up1D, + Freestyle::Interface1D &if1D); // StrokeShader: shade -int Director_BPy_StrokeShader_shade(StrokeShader *ss, Stroke &s); +int Director_BPy_StrokeShader_shade(Freestyle::StrokeShader *ss, Freestyle::Stroke &s); // ChainingIterator: init, traverse -int Director_BPy_ChainingIterator_init(ChainingIterator *c_it); -int Director_BPy_ChainingIterator_traverse(ChainingIterator *c_it, AdjacencyIterator &a_it); +int Director_BPy_ChainingIterator_init(Freestyle::ChainingIterator *c_it); +int Director_BPy_ChainingIterator_traverse(Freestyle::ChainingIterator *c_it, + Freestyle::AdjacencyIterator &a_it); diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp index f70f70275df..57639b6161b 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------CurvePoint methods----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h index 6a550085817..0def155d22b 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.h @@ -37,7 +37,7 @@ extern PyTypeObject CurvePoint_Type; /*---------------------------Python BPy_CurvePoint structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - CurvePoint *cp; + Freestyle::CurvePoint *cp; } BPy_CurvePoint; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp index b245ecd81f1..63a9ead910e 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------SVertex methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h index 8d24576a98f..d2fa48d17d8 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject SVertex_Type; /*---------------------------Python BPy_SVertex structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - SVertex *sv; + Freestyle::SVertex *sv; } BPy_SVertex; /*---------------------------Python BPy_SVertex visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp index 696b3022e85..98fb460c3e4 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------ViewVertex methods----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h index cb9815fb3d4..b5881dcafb5 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject ViewVertex_Type; /*---------------------------Python BPy_ViewVertex structure definition----------*/ typedef struct { BPy_Interface0D py_if0D; - ViewVertex *vv; + Freestyle::ViewVertex *vv; } BPy_ViewVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp index 5e63e190356..da8cd9d2395 100644 --- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h index 44da0ed212a..d635a8541db 100644 --- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.h @@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertex_Type; /*---------------------------Python BPy_StrokeVertex structure definition----------*/ typedef struct { BPy_CurvePoint py_cp; - StrokeVertex *sv; + Freestyle::StrokeVertex *sv; } BPy_StrokeVertex; /*---------------------------Python BPy_StrokeVertex visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp index ed10f3e0af5..90522ba7f9f 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------NonTVertex methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h index 43f2c2b4a5c..6d84533aa6b 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject NonTVertex_Type; /*---------------------------Python BPy_NonTVertex structure definition----------*/ typedef struct { BPy_ViewVertex py_vv; - NonTVertex *ntv; + Freestyle::NonTVertex *ntv; } BPy_NonTVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp index 596eec7a4e5..5f90f0fa7a9 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------TVertex methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h index 253934bb4e7..009ba24d1e8 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.h @@ -37,7 +37,7 @@ extern PyTypeObject TVertex_Type; /*---------------------------Python BPy_TVertex structure definition----------*/ typedef struct { BPy_ViewVertex py_vv; - TVertex *tv; + Freestyle::TVertex *tv; } BPy_TVertex; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp index 0438abfd38c..2d019e2a979 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdge methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h index 25b1bc99860..3c259d77a44 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.h @@ -37,7 +37,7 @@ extern PyTypeObject FEdge_Type; /*---------------------------Python BPy_FEdge structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - FEdge *fe; + Freestyle::FEdge *fe; } BPy_FEdge; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp index d77a8007b1a..6a7d4aef08f 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------CurvePoint methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h index 9bdc3919a38..be3e98edefe 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.h @@ -37,7 +37,7 @@ extern PyTypeObject FrsCurve_Type; /*---------------------------Python BPy_FrsCurve structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - Curve *c; + Freestyle::Curve *c; } BPy_FrsCurve; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp index 90cc3e4f1ab..a5792d4bc5a 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp @@ -31,6 +31,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------Stroke methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h index 33c6aa70f91..eb919b4a376 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.h @@ -37,7 +37,7 @@ extern PyTypeObject Stroke_Type; /*---------------------------Python BPy_Stroke structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - Stroke *s; + Freestyle::Stroke *s; } BPy_Stroke; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp index c416d860c77..bfd093f694e 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------ViewEdge methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h index 519081cedbd..ffcdb46cff6 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.h @@ -37,7 +37,7 @@ extern PyTypeObject ViewEdge_Type; /*---------------------------Python BPy_ViewEdge structure definition----------*/ typedef struct { BPy_Interface1D py_if1D; - ViewEdge *ve; + Freestyle::ViewEdge *ve; } BPy_ViewEdge; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp index dcf6c149b7d..bbcbe98df3a 100644 --- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------Chain methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h index 73da253688c..279a9cdc945 100644 --- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h +++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.h @@ -37,7 +37,7 @@ extern PyTypeObject Chain_Type; /*---------------------------Python BPy_Chain structure definition----------*/ typedef struct { BPy_FrsCurve py_c; - Chain *c; + Freestyle::Chain *c; } BPy_Chain; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp index 454a2bb1c0f..f0aec671953 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdgeSharp methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h index 2b8b09a5990..c3d0298bc5c 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.h @@ -37,7 +37,7 @@ extern PyTypeObject FEdgeSharp_Type; /*---------------------------Python BPy_FEdgeSharp structure definition----------*/ typedef struct { BPy_FEdge py_fe; - FEdgeSharp *fes; + Freestyle::FEdgeSharp *fes; } BPy_FEdgeSharp; /*---------------------------Python BPy_FEdgeSharp visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp index c0d56ec949c..e6461dd6e8a 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// /*----------------------FEdgeSmooth methods ----------------------------*/ diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h index 97497281310..d8ddd6c573f 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.h @@ -38,7 +38,7 @@ extern PyTypeObject FEdgeSmooth_Type; /*---------------------------Python BPy_FEdgeSmooth structure definition----------*/ typedef struct { BPy_FEdge py_fe; - FEdgeSmooth *fes; + Freestyle::FEdgeSmooth *fes; } BPy_FEdgeSmooth; /*---------------------------Python BPy_FEdgeSmooth visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp index 9f5f8d07e26..d548396b229 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h index e5332e0d180..1de73dad015 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject AdjacencyIterator_Type; /*---------------------------Python BPy_AdjacencyIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - AdjacencyIterator *a_it; + Freestyle::AdjacencyIterator *a_it; bool at_start; } BPy_AdjacencyIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp index e4cd1cd073b..fe2fa32b184 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h index ece8018d285..ae6f7307e3c 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainPredicateIterator_Type; /*---------------------------Python BPy_ChainPredicateIterator structure definition----------*/ typedef struct { BPy_ChainingIterator py_c_it; - ChainPredicateIterator *cp_it; + Freestyle::ChainPredicateIterator *cp_it; PyObject *upred; PyObject *bpred; } BPy_ChainPredicateIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp index 9aa8984f4af..ac73b231dd0 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h index f91d0fb2585..7eb5ca8d70c 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainSilhouetteIterator_Type; /*---------------------------Python BPy_ChainSilhouetteIterator structure definition----------*/ typedef struct { BPy_ChainingIterator py_c_it; - ChainSilhouetteIterator *cs_it; + Freestyle::ChainSilhouetteIterator *cs_it; } BPy_ChainSilhouetteIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp index f2441fa9d18..c464d30f92e 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h index e950824764c..54fd6e08f05 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ChainingIterator_Type; /*---------------------------Python BPy_ChainingIterator structure definition----------*/ typedef struct { BPy_ViewEdgeIterator py_ve_it; - ChainingIterator *c_it; + Freestyle::ChainingIterator *c_it; } BPy_ChainingIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp index ff710e931d4..bd7ed9a48da 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h index db36bf386ec..2de21178e95 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject CurvePointIterator_Type; /*---------------------------Python BPy_CurvePointIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - CurveInternal::CurvePointIterator *cp_it; + Freestyle::CurveInternal::CurvePointIterator *cp_it; } BPy_CurvePointIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp index d0de53fa424..6afa9d25df7 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h index 663193bedee..82e44218634 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject Interface0DIterator_Type; /*---------------------------Python BPy_Interface0DIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - Interface0DIterator *if0D_it; + Freestyle::Interface0DIterator *if0D_it; bool reversed; bool at_start; } BPy_Interface0DIterator; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp index c0db79858b7..48452f341a5 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h index a34dc7a63c5..c7b18db8e48 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject SVertexIterator_Type; /*---------------------------Python BPy_SVertexIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewEdgeInternal::SVertexIterator *sv_it; + Freestyle::ViewEdgeInternal::SVertexIterator *sv_it; } BPy_SVertexIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp index ceb0d2a7546..fdcb4d34c70 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h index 629471a664c..d7ad3d99a54 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject StrokeVertexIterator_Type; /*---------------------------Python BPy_StrokeVertexIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - StrokeInternal::StrokeVertexIterator *sv_it; + Freestyle::StrokeInternal::StrokeVertexIterator *sv_it; bool reversed; /* attribute to make next() work correctly */ bool at_start; diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp index e01bbe928ce..3cc462a8294 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h index 7169a13f328..782f20c8884 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject ViewEdgeIterator_Type; /*---------------------------Python BPy_ViewEdgeIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewEdgeInternal::ViewEdgeIterator *ve_it; + Freestyle::ViewEdgeInternal::ViewEdgeIterator *ve_it; } BPy_ViewEdgeIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp index 735746e33be..924045c9702 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h index 7a13f6d2c72..c6b1a123324 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h @@ -38,7 +38,7 @@ extern PyTypeObject orientedViewEdgeIterator_Type; /*---------------------------Python BPy_orientedViewEdgeIterator structure definition----------*/ typedef struct { BPy_Iterator py_it; - ViewVertexInternal::orientedViewEdgeIterator *ove_it; + Freestyle::ViewVertexInternal::orientedViewEdgeIterator *ove_it; bool reversed; bool at_start; } BPy_orientedViewEdgeIterator; diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp index c3b98d12918..6b3a20dbd9b 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp index 50fc9938a87..fd9b3951c6b 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp index e1198266a98..756a6e46c0d 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp @@ -28,6 +28,8 @@ extern "C" { #include "../../../../python/generic/py_capi_utils.h" +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp index e8790df2dd0..a2540e53425 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp index 8fb6e26d8d7..7792fad3a68 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp index 2b108226e90..364f2ad72c2 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp index 0174107f27f..6ffcfec4f69 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp index b5c200c17b1..11153b9dfc5 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp index d1c3219b079..d6619934c16 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp index 7d1efebe71f..9f9c6e540dc 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp index f13930bd4b3..f91e5deacf7 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp index 48c63554f06..d087f6065b5 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp index 5f0a0bfb305..ed456230682 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp index 3d30fb4e11b..de9e67a93b2 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp index 876dd5f2f63..b975c1bb703 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp @@ -27,6 +27,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp index bd70d41717b..2c8451da43d 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp index fd7f5fabe77..cbbaaf2f82b 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp index ed575b12b8d..b52e10d21c7 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp index 5ce96212031..eec01c1ebb6 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp @@ -38,6 +38,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h index 60ebc646d74..abfc2609523 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DDouble_Type; /*---------------------------Python BPy_UnaryFunction0DDouble structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_double; + Freestyle::UnaryFunction0D *uf0D_double; } BPy_UnaryFunction0DDouble; /*---------------------------Python BPy_UnaryFunction0DDouble visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp index 8c988d55c91..6126ff571e6 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h index 9ce4b3bfd0b..83abc003393 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DEdgeNature_Type; /*---------------------------Python BPy_UnaryFunction0DEdgeNature structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_edgenature; + Freestyle::UnaryFunction0D *uf0D_edgenature; } BPy_UnaryFunction0DEdgeNature; /*---------------------------Python BPy_UnaryFunction0DEdgeNature visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp index 25b19e84b60..6b843817197 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp @@ -34,6 +34,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h index fd221201d99..a4c401f3dcd 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DFloat_Type; /*---------------------------Python BPy_UnaryFunction0DFloat structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_float; + Freestyle::UnaryFunction0D *uf0D_float; } BPy_UnaryFunction0DFloat; /*---------------------------Python BPy_UnaryFunction0DFloat visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp index b2426cab572..74f4ac9d392 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h index 14e5d48ce43..b13c976f0ac 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DId_Type; /*---------------------------Python BPy_UnaryFunction0DId structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_id; + Freestyle::UnaryFunction0D *uf0D_id; } BPy_UnaryFunction0DId; /*---------------------------Python BPy_UnaryFunction0DId visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp index 77f89265ba4..382dfdbd72d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h index bbd53c409eb..72054713a66 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DMaterial_Type; /*---------------------------Python BPy_UnaryFunction0DMaterial structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_material; + Freestyle::UnaryFunction0D *uf0D_material; } BPy_UnaryFunction0DMaterial; /*---------------------------Python BPy_UnaryFunction0DMaterial visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp index 52f990502ef..87241708d9c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h index 1a466ffc673..2958d10994c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction0DUnsigned_Type; /*---------------------------Python BPy_UnaryFunction0DUnsigned structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_unsigned; + Freestyle::UnaryFunction0D *uf0D_unsigned; } BPy_UnaryFunction0DUnsigned; /*---------------------------Python BPy_UnaryFunction0DUnsigned visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp index 45e1144cd32..b1451a89854 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h index 6c3d5fc85cc..2e570adbaee 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction0D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec2f_Type; /*---------------------------Python BPy_UnaryFunction0DVec2f structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_vec2f; + Freestyle::UnaryFunction0D *uf0D_vec2f; } BPy_UnaryFunction0DVec2f; /*---------------------------Python BPy_UnaryFunction0DVec2f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp index 18eeae86dd7..65b5f56f61c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h index 4be9b170311..6334988a0ef 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction0D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction0DVec3f_Type; /*---------------------------Python BPy_UnaryFunction0DVec3f structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_vec3f; + Freestyle::UnaryFunction0D *uf0D_vec3f; } BPy_UnaryFunction0DVec3f; /*---------------------------Python BPy_UnaryFunction0DVec3f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp index 28c4425b2a4..0c0c4930245 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp @@ -29,6 +29,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h index 2a36ae21002..4e49374273f 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.h @@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction0DVectorViewShape_Type; * definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D> *uf0D_vectorviewshape; + Freestyle::UnaryFunction0D> *uf0D_vectorviewshape; } BPy_UnaryFunction0DVectorViewShape; /*---------------------------Python BPy_UnaryFunction0DVectorViewShape visible diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp index 75773aaa8d0..d5122b27b35 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h index 8a8dcdceb1f..7a3c27a30c1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction0DViewShape_Type; /*---------------------------Python BPy_UnaryFunction0DViewShape structure definition----------*/ typedef struct { BPy_UnaryFunction0D py_uf0D; - UnaryFunction0D *uf0D_viewshape; + Freestyle::UnaryFunction0D *uf0D_viewshape; } BPy_UnaryFunction0DViewShape; /*---------------------------Python BPy_UnaryFunction0DViewShape visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp index b59e72e23d2..384d633fb2d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp index 9f7f2b234f7..2c76f6f303a 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp index 1cd1a4ab8ac..6de53794228 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp index 60cfed83713..5baf1ba448e 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp index 063f1651486..864e8573043 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp index b0188cd0244..b2cc62f6904 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp index ba890477782..2a9b521907d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp index 531020dc32a..e5e50dfcd4c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp index cb36e388306..71dda2e2c32 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp index ca306a55d1e..0bf7f0e7fa4 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp index 6a688212239..0c4abc60981 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp index 8efaaf1b699..a87e64ee2ce 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp index e13c990685f..52e0021d3b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp index 43cbb433bdd..98422fb45f3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp index 24bfe3be985..f60115a4240 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp index 84a985a134d..822c3256fd9 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp index 247473dcb41..06d759f0737 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp index e82b5f1c557..656749dfdff 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp index b4760d10b2c..e547ebacf7e 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp index d4c735e3572..8afeaed8518 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp index 6d5f1ed80c3..d9ab0edb53c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp index bbf2aee5204..125d0b8212d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp index 54401153d37..ed0782edb22 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp index 88ca0579870..f1dadedf183 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp index d6e00988e68..aca638ab972 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp index ddff11d7916..8fe266c4f19 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp index 57b2d61d5c1..ad20dc79d71 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp @@ -43,6 +43,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h index 1fb42a18337..a57e42ce528 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DDouble_Type; /*---------------------------Python BPy_UnaryFunction1DDouble structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_double; + Freestyle::UnaryFunction1D *uf1D_double; } BPy_UnaryFunction1DDouble; /*---------------------------Python BPy_UnaryFunction1DDouble visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp index a987dbb67f5..44937b3ebcc 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h index 886eb469d51..4227cc47efa 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.h @@ -38,7 +38,7 @@ extern PyTypeObject UnaryFunction1DEdgeNature_Type; /*---------------------------Python BPy_UnaryFunction1DEdgeNature structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_edgenature; + Freestyle::UnaryFunction1D *uf1D_edgenature; } BPy_UnaryFunction1DEdgeNature; /*---------------------------Python BPy_UnaryFunction1DEdgeNature visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp index 66499c68c65..2fc4cd4f2cb 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h index 8b977c9c96a..8be928eba77 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DFloat_Type; /*---------------------------Python BPy_UnaryFunction1DFloat structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_float; + Freestyle::UnaryFunction1D *uf1D_float; } BPy_UnaryFunction1DFloat; /*---------------------------Python BPy_UnaryFunction1DFloat visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp index 54c5c786367..d5211d66d16 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h index 9149275b610..30fe050c2ad 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DUnsigned_Type; /*---------------------------Python BPy_UnaryFunction1DUnsigned structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_unsigned; + Freestyle::UnaryFunction1D *uf1D_unsigned; } BPy_UnaryFunction1DUnsigned; /*---------------------------Python BPy_UnaryFunction1DUnsigned visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp index 8b23163fc95..684c9e189fe 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp @@ -31,6 +31,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h index b55f9af7c4d..2decb723a33 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction1D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec2f_Type; /*---------------------------Python BPy_UnaryFunction1DVec2f structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_vec2f; + Freestyle::UnaryFunction1D *uf1D_vec2f; } BPy_UnaryFunction1DVec2f; /*---------------------------Python BPy_UnaryFunction1DVec2f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp index 9b6a2445588..c45c61fd9ac 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp @@ -30,6 +30,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h index 9e4342979e4..9e7a899a371 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.h @@ -23,7 +23,6 @@ #include "../BPy_UnaryFunction1D.h" #include "../../geometry/Geom.h" -using namespace Geometry; #ifdef __cplusplus extern "C" { @@ -39,7 +38,7 @@ extern PyTypeObject UnaryFunction1DVec3f_Type; /*---------------------------Python BPy_UnaryFunction1DVec3f structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D *uf1D_vec3f; + Freestyle::UnaryFunction1D *uf1D_vec3f; } BPy_UnaryFunction1DVec3f; /*---------------------------Python BPy_UnaryFunction1DVec3f visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp index c95595dc953..da8855a3a19 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h index bfbcf5e451d..a8dfee7f9aa 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.h @@ -40,7 +40,7 @@ extern PyTypeObject UnaryFunction1DVectorViewShape_Type; * definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D> *uf1D_vectorviewshape; + Freestyle::UnaryFunction1D> *uf1D_vectorviewshape; } BPy_UnaryFunction1DVectorViewShape; /*---------------------------Python BPy_UnaryFunction1DVectorViewShape visible diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp index b258b0b27f7..5cfd12c42ff 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp @@ -32,6 +32,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //-------------------MODULE INITIALIZATION-------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h index 3a821bc2083..520ccc29c99 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.h @@ -36,7 +36,7 @@ extern PyTypeObject UnaryFunction1DVoid_Type; /*---------------------------Python BPy_UnaryFunction1DVoid structure definition----------*/ typedef struct { BPy_UnaryFunction1D py_uf1D; - UnaryFunction1D_void *uf1D_void; + Freestyle::UnaryFunction1D_void *uf1D_void; } BPy_UnaryFunction1DVoid; /*---------------------------Python BPy_UnaryFunction1DVoid visible prototypes-----------*/ diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp index 205820d9a92..e203016aee5 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp index d22a1ec99ef..620a74ddad1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp index f66bd4c668f..1d21f627305 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp index 2f408d45b74..60d6eeeef92 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp index 13455eb3a4c..ce0b9c0f231 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp index fcf2bebc161..0190201ce37 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp index 5c352c670c1..d9c9b7af7a2 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp index 45c6a1b0fb7..2c5854a72e6 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp index 0c7276a13ec..6f00bc0f844 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp index 1f1c01a5344..b9b43c13b88 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp index cfa06f9d8fd..f0b9fd192b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp index 985e10f2b83..ef59d19aba4 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp index 441ea2f5833..70b1a2cae2c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp index 716cfbfe37a..51c04ba82b3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp index 693c2453db2..f18d3cb647c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp index e9030625b10..4d5d3f18604 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp index 4ae2cd054e2..a2f233e6f6d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp index 9feb07552ca..6d9bff89d81 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp index 400b5a95fcf..280f44e2e0c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp index 7637153017f..4d7697d4078 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp index d532268b294..aae7a2597b1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp index dd1492e940e..703e2e50955 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp index c3750734efc..a3b5bb8fe05 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp index 85738684e44..23d254dd843 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp index 1f577820da4..cf94195cb01 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp @@ -28,6 +28,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp index 227aca2b5c6..f11a4d8c939 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp index 5f5c756b28d..018f44e4f07 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp index b3f9c225931..7c6b7b809f1 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp index f865fe5013d..0025b28137a 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp @@ -26,6 +26,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp index 154b44ff81a..34354349dfc 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp index 2bb9dbaf484..c9e8c80c3ce 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp index 7b9923d7b6c..3cc9a21c050 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp index ec1a02e13aa..58efd78619e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp index b9a76f91c21..cca81e6bc6e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp index 68f0ea7a913..a2eac6b41fe 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp index 362bcc4cea8..79b0fce790a 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp index 9329e3a7628..965945a1f79 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp @@ -24,6 +24,8 @@ extern "C" { #endif +using namespace Freestyle; + /////////////////////////////////////////////////////////////////////////////////////////// //------------------------INSTANCE METHODS ---------------------------------- From 694bc4d040a8bf762284598e98bf0575549a3e1c Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 8 Feb 2021 08:19:23 -0800 Subject: [PATCH 022/519] Fix for T84038: Improved Report Warnings Improved contrast for Status Bar report warning messages. Differential Revision: https://developer.blender.org/D10242 Reviewed by Hans Goudey --- .../datafiles/userdef/userdef_default_theme.c | 13 ++-- .../presets/interface_theme/Blender_Light.xml | 24 +++--- .../blenloader/intern/versioning_userdef.c | 9 +++ source/blender/editors/include/UI_interface.h | 2 + .../editors/interface/interface_templates.c | 73 ++++++++++--------- .../editors/interface/interface_utils.c | 69 ++++++++++++++++-- .../editors/interface/interface_widgets.c | 4 +- source/blender/editors/space_info/info_draw.c | 46 ++---------- source/blender/editors/space_info/info_ops.c | 10 +-- source/blender/editors/space_info/textview.c | 2 +- 10 files changed, 145 insertions(+), 107 deletions(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 2754b7f06f8..0477b0c9f23 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -489,16 +489,17 @@ const bTheme U_theme_default = { .facedot_size = 4, .info_selected = RGBA(0x3b5689ff), .info_selected_text = RGBA(0xffffffff), - .info_error = RGBA(0xff613dff), + .info_error = RGBA(0xb34c34ff), .info_error_text = RGBA(0xffffffff), - .info_warning = RGBA(0xf5bc41ff), + .info_warning = RGBA(0xac8737ff), .info_warning_text = RGBA(0xffffffff), - .info_info = RGBA(0x1d4383ff), + .info_info = RGBA(0x1f3862ff), .info_info_text = RGBA(0xffffffff), - .info_debug = RGBA(0xd3d3d3ff), - .info_property = RGBA(0x3ace87ff), + .info_debug = RGBA(0x6b3293ff), + .info_debug_text = RGBA(0xffffffff), + .info_property = RGBA(0x329364ff), .info_property_text = RGBA(0xffffffff), - .info_operator = RGBA(0x3ace87ff), + .info_operator = RGBA(0x329364ff), .info_operator_text = RGBA(0xffffffff), }, .space_action = { diff --git a/release/scripts/presets/interface_theme/Blender_Light.xml b/release/scripts/presets/interface_theme/Blender_Light.xml index 91ccd574c31..77908bb6bbf 100644 --- a/release/scripts/presets/interface_theme/Blender_Light.xml +++ b/release/scripts/presets/interface_theme/Blender_Light.xml @@ -1053,19 +1053,19 @@ widthfac * width), width); width = max_ii(width, 10 * UI_DPI_FAC); - /* make a box around the report to make it stand out */ UI_block_align_begin(block); - but = uiDefBut( - block, UI_BTYPE_ROUNDBOX, 0, "", 0, 0, UI_UNIT_X + 5, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); - /* set the report's bg color in but->col - UI_BTYPE_ROUNDBOX feature */ - rgba_float_to_uchar(but->col, rti->col); + /* Background for icon. */ but = uiDefBut(block, UI_BTYPE_ROUNDBOX, 0, "", - UI_UNIT_X + 5, + 0, + 0, + UI_UNIT_X + (6 * UI_DPI_FAC), + UI_UNIT_Y, + NULL, + 0.0f, + 0.0f, + 0, + 0, + ""); + /* UI_BTYPE_ROUNDBOX's bg color is set in but->col. */ + UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col); + + /* Background for the rest of the message. */ + but = uiDefBut(block, + UI_BTYPE_ROUNDBOX, + 0, + "", + UI_UNIT_X + (6 * UI_DPI_FAC), 0, UI_UNIT_X + width, UI_UNIT_Y, @@ -6852,46 +6866,39 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C) 0, 0, ""); - rgba_float_to_uchar(but->col, rti->col); + + /* Use icon background at low opacity to highlight, but still contrasting with area TH_TEXT. */ + UI_GetThemeColorType4ubv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, but->col); + but->col[3] = 64; UI_block_align_end(block); - - /* icon and report message on top */ - const int icon = UI_icon_from_report_type(report->type); - - /* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report - * to be shown instead of icon when appropriate... - */ UI_block_emboss_set(block, UI_EMBOSS_NONE); - if (reports->list.first != reports->list.last) { - uiDefIconButO(block, - UI_BTYPE_BUT, - "SCREEN_OT_info_log_show", - WM_OP_INVOKE_REGION_WIN, - icon, - 2, - 0, - UI_UNIT_X, - UI_UNIT_Y, - TIP_("Click to see the remaining reports in text block: 'Recent Reports'")); - } - else { - uiDefIconBut( - block, UI_BTYPE_LABEL, 0, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); - } + /* The report icon itself. */ + but = uiDefIconButO(block, + UI_BTYPE_BUT, + "SCREEN_OT_info_log_show", + WM_OP_INVOKE_REGION_WIN, + UI_icon_from_report_type(report->type), + (3 * UI_DPI_FAC), + 0, + UI_UNIT_X, + UI_UNIT_Y, + TIP_("Click to see the remaining reports in text block: 'Recent Reports'")); + UI_GetThemeColorType4ubv(UI_text_colorid_from_report_type(report->type), SPACE_INFO, but->col); + but->col[3] = 255; /* This theme color is RBG only, so have to set alpha here. */ + /* The report message. */ but = uiDefButO(block, UI_BTYPE_BUT, "SCREEN_OT_info_log_show", WM_OP_INVOKE_REGION_WIN, report->message, - UI_UNIT_X + 5, + UI_UNIT_X, 0, - UI_UNIT_X + width, + width + UI_UNIT_X, UI_UNIT_Y, "Show in Info Log"); - rgba_float_to_uchar(but->col, rti->col); } void uiTemplateInputStatus(uiLayout *layout, struct bContext *C) diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 958a0bc03cd..f9eba9eeb6f 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -544,15 +544,74 @@ int UI_icon_from_id(ID *id) int UI_icon_from_report_type(int type) { if (type & RPT_ERROR_ALL) { + return ICON_CANCEL; + } + else if (type & RPT_WARNING_ALL) { return ICON_ERROR; } - if (type & RPT_WARNING_ALL) { - return ICON_ERROR; - } - if (type & RPT_INFO_ALL) { + else if (type & RPT_INFO_ALL) { return ICON_INFO; } - return ICON_NONE; + else if (type & RPT_DEBUG_ALL) { + return ICON_SYSTEM; + } + else if (type & RPT_PROPERTY) { + return ICON_OPTIONS; + } + else if (type & RPT_OPERATOR) { + return ICON_CHECKMARK; + } + return ICON_INFO; +} + +int UI_icon_colorid_from_report_type(int type) +{ + if (type & RPT_ERROR_ALL) { + return TH_INFO_ERROR; + } + else if (type & RPT_WARNING_ALL) { + return TH_INFO_WARNING; + } + else if (type & RPT_INFO_ALL) { + return TH_INFO_INFO; + } + else if (type & RPT_DEBUG_ALL) { + return TH_INFO_DEBUG; + } + else if (type & RPT_PROPERTY) { + return TH_INFO_PROPERTY; + } + else if (type & RPT_OPERATOR) { + return TH_INFO_OPERATOR; + } + else { + return TH_INFO_WARNING; + } +} + +int UI_text_colorid_from_report_type(int type) +{ + if (type & RPT_ERROR_ALL) { + return TH_INFO_ERROR_TEXT; + } + else if (type & RPT_WARNING_ALL) { + return TH_INFO_WARNING_TEXT; + } + else if (type & RPT_INFO_ALL) { + return TH_INFO_INFO_TEXT; + } + else if (type & RPT_DEBUG_ALL) { + return TH_INFO_DEBUG_TEXT; + } + else if (type & RPT_PROPERTY) { + return TH_INFO_PROPERTY_TEXT; + } + else if (type & RPT_OPERATOR) { + return TH_INFO_OPERATOR_TEXT; + } + else { + return TH_INFO_WARNING_TEXT; + } } /********************************** Misc **************************************/ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 8b185f5dc20..5c59d0edeb5 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2410,7 +2410,9 @@ static void widget_draw_text_icon(const uiFontStyle *fstyle, rect->xmin += 0.2f * U.widget_unit; } - widget_draw_icon(but, icon, alpha, rect, wcol->text); + /* By default icon is the color of text, but can optionally override with but->col. */ + widget_draw_icon(but, icon, alpha, rect, (but->col[3] != 0) ? but->col : wcol->text); + if (show_menu_icon) { BLI_assert(but->block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT); widget_draw_submenu_tria(but, rect, wcol); diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c index dc926587367..f63a5530555 100644 --- a/source/blender/editors/space_info/info_draw.c +++ b/source/blender/editors/space_info/info_draw.c @@ -56,47 +56,11 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, int shade = (tvc->iter_tmp % 2) ? 4 : -4; UI_GetThemeColorShade4ubv(bg_id, shade, bg); - /* Icon color and background depend of report type. */ + /* Don't show icon on subsequent rows of multirow report. */ + *r_icon = (tvc->iter_char_begin != 0) ? ICON_NONE : UI_icon_from_report_type(report->type); - int icon_fg_id; - int icon_bg_id; - - if (tvc->iter_char_begin != 0) { - *r_icon = ICON_NONE; - } - else if (report->type & RPT_ERROR_ALL) { - icon_fg_id = TH_INFO_ERROR_TEXT; - icon_bg_id = TH_INFO_ERROR; - *r_icon = ICON_CANCEL; - } - else if (report->type & RPT_WARNING_ALL) { - icon_fg_id = TH_INFO_WARNING_TEXT; - icon_bg_id = TH_INFO_WARNING; - *r_icon = ICON_ERROR; - } - else if (report->type & RPT_INFO_ALL) { - icon_fg_id = TH_INFO_INFO_TEXT; - icon_bg_id = TH_INFO_INFO; - *r_icon = ICON_INFO; - } - else if (report->type & RPT_DEBUG_ALL) { - icon_fg_id = TH_INFO_DEBUG_TEXT; - icon_bg_id = TH_INFO_DEBUG; - *r_icon = ICON_SYSTEM; - } - else if (report->type & RPT_PROPERTY) { - icon_fg_id = TH_INFO_PROPERTY_TEXT; - icon_bg_id = TH_INFO_PROPERTY; - *r_icon = ICON_OPTIONS; - } - else if (report->type & RPT_OPERATOR) { - icon_fg_id = TH_INFO_OPERATOR_TEXT; - icon_bg_id = TH_INFO_OPERATOR; - *r_icon = ICON_CHECKMARK; - } - else { - *r_icon = ICON_NONE; - } + int icon_fg_id = UI_text_colorid_from_report_type(report->type); + int icon_bg_id = UI_icon_colorid_from_report_type(report->type); if (report->flag & SELECT) { icon_fg_id = TH_INFO_SELECTED; @@ -105,6 +69,8 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, if (*r_icon != ICON_NONE) { UI_GetThemeColor4ubv(icon_fg_id, r_icon_fg); + /* This theme color is RGB only, so set alpha. */ + r_icon_fg[3] = 255; UI_GetThemeColor4ubv(icon_bg_id, r_icon_bg); return TVC_LINE_FG | TVC_LINE_BG | TVC_LINE_ICON | TVC_LINE_ICON_FG | TVC_LINE_ICON_BG; } diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index 3bd23eab836..b6d47b74fdc 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -567,15 +567,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), co } /* set target color based on report type */ - if (report->type & RPT_ERROR_ALL) { - UI_GetThemeColorType3fv(TH_INFO_ERROR, SPACE_INFO, target_col); - } - else if (report->type & RPT_WARNING_ALL) { - UI_GetThemeColorType3fv(TH_INFO_WARNING, SPACE_INFO, target_col); - } - else if (report->type & RPT_INFO_ALL) { - UI_GetThemeColorType3fv(TH_INFO_INFO, SPACE_INFO, target_col); - } + UI_GetThemeColorType3fv(UI_icon_colorid_from_report_type(report->type), SPACE_INFO, target_col); target_col[3] = 0.65f; if (rti->widthfac == 0.0f) { diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c index ef5d9c0aab0..aef59e89325 100644 --- a/source/blender/editors/space_info/textview.c +++ b/source/blender/editors/space_info/textview.c @@ -225,7 +225,7 @@ static bool textview_draw_string(TextViewDrawState *tds, rgba_uchar_to_float(col, icon_bg); UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_aa( + UI_draw_roundbox_4fv( &(const rctf){ .xmin = hpadding, .xmax = bg_size + hpadding, From 13299a73675028c1d9bf3143ec808f9231e78e75 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Mon, 8 Feb 2021 15:27:49 -0500 Subject: [PATCH 023/519] Docs: Remove CLI arguments removed in recent commit This commit follows up on rBbc94036a76b63254181788ce5814fb946f52a287 and removes the arguments from the CLI args docs. --- source/creator/creator_args.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c index 98a8a7aa189..e31be24ec7b 100644 --- a/source/creator/creator_args.c +++ b/source/creator/creator_args.c @@ -590,8 +590,6 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo BLI_args_print_arg_doc(ba, "--debug-ghost"); BLI_args_print_arg_doc(ba, "--debug-gpu"); BLI_args_print_arg_doc(ba, "--debug-gpu-force-workarounds"); - BLI_args_print_arg_doc(ba, "--debug-gpu-shaders"); - BLI_args_print_arg_doc(ba, "--debug-gpumem"); BLI_args_print_arg_doc(ba, "--debug-wm"); # ifdef WITH_XR_OPENXR BLI_args_print_arg_doc(ba, "--debug-xr"); From cfa48c84d06ca8197f86b6d3ceef8a2c7c311a82 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 8 Feb 2021 15:09:49 -0600 Subject: [PATCH 024/519] Cleanup: Register node property layout callbacks in files This commit moves the property layout callbacks for node types to their implementation files from `drawnode.c`. This was proposed a while ago in T75724. **Benefits** - Fewer files need to be changed when adding a new node. - Makes it possible to reuse functions from the node's implementation in the layout code. - Except for RNA, all of the node "inputs" are in the same place. - Code gets shorter overall, avoids the large switch statements. **Downsides** - Requires including two UI headers. - Requires adding an editors dependency to the nodes folder. This commit only changes function nodes and geometry nodes, more can be moved later. Differential Revision: https://developer.blender.org/D10352 --- .../editors/include/UI_interface_icons.h | 5 +- source/blender/editors/space_node/drawnode.c | 391 ------------------ source/blender/nodes/CMakeLists.txt | 1 + .../function/nodes/node_fn_boolean_math.cc | 9 + .../function/nodes/node_fn_float_compare.cc | 9 + .../function/nodes/node_fn_input_vector.cc | 11 +- .../nodes/function/nodes/node_fn_switch.cc | 10 + .../node_geo_align_rotation_to_vector.cc | 15 + .../nodes/node_geo_attribute_color_ramp.cc | 11 + .../nodes/node_geo_attribute_compare.cc | 13 + .../geometry/nodes/node_geo_attribute_fill.cc | 10 + .../geometry/nodes/node_geo_attribute_math.cc | 44 +- .../geometry/nodes/node_geo_attribute_mix.cc | 13 + .../nodes/node_geo_attribute_proximity.cc | 19 +- .../nodes/node_geo_attribute_randomize.cc | 11 + .../node_geo_attribute_sample_texture.cc | 11 + .../nodes/node_geo_attribute_vector_math.cc | 61 ++- .../nodes/geometry/nodes/node_geo_boolean.cc | 9 + .../nodes/node_geo_collection_info.cc | 9 + .../geometry/nodes/node_geo_object_info.cc | 9 + .../nodes/node_geo_point_distribute.cc | 11 + .../geometry/nodes/node_geo_point_instance.cc | 12 + .../geometry/nodes/node_geo_point_rotate.cc | 21 + .../geometry/nodes/node_geo_point_scale.cc | 9 + .../nodes/node_geo_point_translate.cc | 9 + .../nodes/node_geo_points_to_volume.cc | 14 + .../nodes/node_geo_subdivision_surface.cc | 15 + .../geometry/nodes/node_geo_triangulate.cc | 10 + .../geometry/nodes/node_geo_volume_to_mesh.cc | 11 + 29 files changed, 354 insertions(+), 429 deletions(-) diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h index d77a87e7200..4d860be285d 100644 --- a/source/blender/editors/include/UI_interface_icons.h +++ b/source/blender/editors/include/UI_interface_icons.h @@ -23,6 +23,9 @@ #pragma once +/* Required for enum iconSizes which can't be forward declared if this file is included in C++. */ +#include "DNA_ID.h" + #ifdef __cplusplus extern "C" { #endif @@ -34,8 +37,6 @@ struct PreviewImage; struct Scene; struct bContext; -enum eIconSizes; - typedef struct IconFile { struct IconFile *next, *prev; char filename[256]; /* FILE_MAXFILE size */ diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 132dcd8a9fb..2d65302c656 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3126,393 +3126,6 @@ static void node_texture_set_butfunc(bNodeType *ntype) } } -/* ****************** BUTTON CALLBACKS FOR GEOMETRY NODES ***************** */ - -static void node_geometry_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_compare(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); -} - -static void node_geometry_buts_subdivision_surface(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *UNUSED(ptr)) -{ -#ifndef WITH_OPENSUBDIV - uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR); -#else - UNUSED_VARS(layout); -#endif -} - -static void node_geometry_buts_triangulate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "quad_method", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "ngon_method", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_random_attribute(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); -} - -static bool node_attribute_math_operation_use_input_b(const NodeMathOperation operation) -{ - switch (operation) { - case NODE_MATH_ADD: - case NODE_MATH_SUBTRACT: - case NODE_MATH_MULTIPLY: - case NODE_MATH_DIVIDE: - case NODE_MATH_POWER: - case NODE_MATH_LOGARITHM: - case NODE_MATH_MINIMUM: - case NODE_MATH_MAXIMUM: - case NODE_MATH_LESS_THAN: - case NODE_MATH_GREATER_THAN: - case NODE_MATH_MODULO: - case NODE_MATH_ARCTAN2: - case NODE_MATH_SNAP: - case NODE_MATH_WRAP: - case NODE_MATH_COMPARE: - case NODE_MATH_MULTIPLY_ADD: - case NODE_MATH_PINGPONG: - case NODE_MATH_SMOOTH_MIN: - case NODE_MATH_SMOOTH_MAX: - return true; - case NODE_MATH_SINE: - case NODE_MATH_COSINE: - case NODE_MATH_TANGENT: - case NODE_MATH_ARCSINE: - case NODE_MATH_ARCCOSINE: - case NODE_MATH_ARCTANGENT: - case NODE_MATH_ROUND: - case NODE_MATH_ABSOLUTE: - case NODE_MATH_FLOOR: - case NODE_MATH_CEIL: - case NODE_MATH_FRACTION: - case NODE_MATH_SQRT: - case NODE_MATH_INV_SQRT: - case NODE_MATH_SIGN: - case NODE_MATH_EXPONENT: - case NODE_MATH_RADIANS: - case NODE_MATH_DEGREES: - case NODE_MATH_SINH: - case NODE_MATH_COSH: - case NODE_MATH_TANH: - case NODE_MATH_TRUNC: - return false; - } - BLI_assert(false); - return false; -} - -static void node_geometry_buts_attribute_math(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - bNode *node = (bNode *)ptr->data; - NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage; - NodeMathOperation operation = (NodeMathOperation)node_storage->operation; - - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - - /* These "use input b / c" checks are copied from the node's code. - * They could be de-duplicated if the drawing code was moved to the node's file. */ - if (node_attribute_math_operation_use_input_b(operation)) { - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); - } - if (ELEM(operation, - NODE_MATH_MULTIPLY_ADD, - NODE_MATH_SMOOTH_MIN, - NODE_MATH_SMOOTH_MAX, - NODE_MATH_WRAP, - NODE_MATH_COMPARE)) { - uiItemR(layout, ptr, "input_type_c", DEFAULT_FLAGS, IFACE_("Type C"), ICON_NONE); - } -} - -static void node_geometry_buts_attribute_vector_math(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - bNode *node = (bNode *)ptr->data; - NodeAttributeVectorMath *node_storage = (NodeAttributeVectorMath *)node->storage; - - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("Type A"), ICON_NONE); - - /* These "use input b / c" checks are copied from the node's code. - * They could be de-duplicated if the drawing code was moved to the node's file. */ - if (!ELEM(node_storage->operation, - NODE_VECTOR_MATH_NORMALIZE, - NODE_VECTOR_MATH_FLOOR, - NODE_VECTOR_MATH_CEIL, - NODE_VECTOR_MATH_FRACTION, - NODE_VECTOR_MATH_ABSOLUTE, - NODE_VECTOR_MATH_SINE, - NODE_VECTOR_MATH_COSINE, - NODE_VECTOR_MATH_TANGENT, - NODE_VECTOR_MATH_LENGTH)) { - uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE); - } - if (ELEM(node_storage->operation, NODE_VECTOR_MATH_WRAP)) { - uiItemR(layout, ptr, "input_type_c", DEFAULT_FLAGS, IFACE_("Type C"), ICON_NONE); - } -} - -static void node_geometry_buts_point_instance(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "instance_type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) { - uiItemR(layout, ptr, "use_whole_collection", DEFAULT_FLAGS, NULL, ICON_NONE); - } -} - -static void node_geometry_buts_attribute_fill(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); - // uiItemR(layout, ptr, "domain", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_mix(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "blend_type", DEFAULT_FLAGS, "", ICON_NONE); - uiLayout *col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE); - uiItemR(col, ptr, "input_type_a", DEFAULT_FLAGS, IFACE_("A"), ICON_NONE); - uiItemR(col, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("B"), ICON_NONE); -} - -static void node_geometry_buts_attribute_point_distribute(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "distribute_method", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_attribute_color_ramp(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiTemplateColorRamp(layout, ptr, "color_ramp", 0); -} - -static void node_geometry_buts_point_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage; - - uiItemR(layout, ptr, "type", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - uiItemR(layout, ptr, "space", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - - uiLayout *col = uiLayoutColumn(layout, false); - if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { - uiItemR(col, ptr, "input_type_axis", DEFAULT_FLAGS, IFACE_("Axis"), ICON_NONE); - uiItemR(col, ptr, "input_type_angle", DEFAULT_FLAGS, IFACE_("Angle"), ICON_NONE); - } - else { - uiItemR(col, ptr, "input_type_rotation", DEFAULT_FLAGS, IFACE_("Rotation"), ICON_NONE); - } -} - -static void node_geometry_buts_align_rotation_to_vector(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "axis", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); - uiItemR(layout, ptr, "pivot_axis", DEFAULT_FLAGS, IFACE_("Pivot"), ICON_NONE); - uiLayout *col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "input_type_factor", DEFAULT_FLAGS, IFACE_("Factor"), ICON_NONE); - uiItemR(col, ptr, "input_type_vector", DEFAULT_FLAGS, IFACE_("Vector"), ICON_NONE); -} -static void node_geometry_buts_point_translate(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE); -} - -static void node_geometry_buts_point_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "input_type", DEFAULT_FLAGS, IFACE_("Type"), ICON_NONE); -} - -static void node_geometry_buts_object_info(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); -} - -static void node_geometry_buts_attribute_sample_texture(uiLayout *layout, - bContext *C, - PointerRNA *ptr) -{ - uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); -} - -static void node_geometry_buts_points_to_volume(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - uiItemR(layout, ptr, "resolution_mode", DEFAULT_FLAGS, IFACE_("Resolution"), ICON_NONE); - uiItemR(layout, ptr, "input_type_radius", DEFAULT_FLAGS, IFACE_("Radius"), ICON_NONE); -} - -static void node_geometry_buts_collection_info(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); -} - -static void node_geometry_buts_attribute_proximity(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "target_geometry_element", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_geometry_buts_volume_to_mesh(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - uiItemR(layout, ptr, "resolution_mode", DEFAULT_FLAGS, IFACE_("Resolution"), ICON_NONE); -} - -static void node_geometry_set_butfunc(bNodeType *ntype) -{ - switch (ntype->type) { - case GEO_NODE_BOOLEAN: - ntype->draw_buttons = node_geometry_buts_boolean_math; - break; - case GEO_NODE_SUBDIVISION_SURFACE: - ntype->draw_buttons = node_geometry_buts_subdivision_surface; - break; - case GEO_NODE_TRIANGULATE: - ntype->draw_buttons = node_geometry_buts_triangulate; - break; - case GEO_NODE_ATTRIBUTE_RANDOMIZE: - ntype->draw_buttons = node_geometry_buts_random_attribute; - break; - case GEO_NODE_ATTRIBUTE_MATH: - ntype->draw_buttons = node_geometry_buts_attribute_math; - break; - case GEO_NODE_ATTRIBUTE_COMPARE: - ntype->draw_buttons = node_geometry_buts_attribute_compare; - break; - case GEO_NODE_POINT_INSTANCE: - ntype->draw_buttons = node_geometry_buts_point_instance; - break; - case GEO_NODE_ATTRIBUTE_FILL: - ntype->draw_buttons = node_geometry_buts_attribute_fill; - break; - case GEO_NODE_ATTRIBUTE_MIX: - ntype->draw_buttons = node_geometry_buts_attribute_mix; - break; - case GEO_NODE_ATTRIBUTE_VECTOR_MATH: - ntype->draw_buttons = node_geometry_buts_attribute_vector_math; - break; - case GEO_NODE_POINT_DISTRIBUTE: - ntype->draw_buttons = node_geometry_buts_attribute_point_distribute; - break; - case GEO_NODE_ATTRIBUTE_COLOR_RAMP: - ntype->draw_buttons = node_geometry_buts_attribute_color_ramp; - break; - case GEO_NODE_POINT_ROTATE: - ntype->draw_buttons = node_geometry_buts_point_rotate; - break; - case GEO_NODE_ALIGN_ROTATION_TO_VECTOR: - ntype->draw_buttons = node_geometry_buts_align_rotation_to_vector; - break; - case GEO_NODE_POINT_TRANSLATE: - ntype->draw_buttons = node_geometry_buts_point_translate; - break; - case GEO_NODE_POINT_SCALE: - ntype->draw_buttons = node_geometry_buts_point_scale; - break; - case GEO_NODE_OBJECT_INFO: - ntype->draw_buttons = node_geometry_buts_object_info; - break; - case GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE: - ntype->draw_buttons = node_geometry_buts_attribute_sample_texture; - break; - case GEO_NODE_POINTS_TO_VOLUME: - ntype->draw_buttons = node_geometry_buts_points_to_volume; - break; - case GEO_NODE_COLLECTION_INFO: - ntype->draw_buttons = node_geometry_buts_collection_info; - break; - case GEO_NODE_ATTRIBUTE_PROXIMITY: - ntype->draw_buttons = node_geometry_buts_attribute_proximity; - break; - case GEO_NODE_VOLUME_TO_MESH: - ntype->draw_buttons = node_geometry_buts_volume_to_mesh; - break; - } -} - -/* ****************** BUTTON CALLBACKS FOR FUNCTION NODES ***************** */ - -static void node_function_buts_boolean_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_float_compare(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *ptr) -{ - uiItemR(layout, ptr, "operation", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_switch(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE); -} - -static void node_function_buts_input_vector(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) -{ - uiLayout *col = uiLayoutColumn(layout, true); - uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE); -} - -static void node_function_set_butfunc(bNodeType *ntype) -{ - switch (ntype->type) { - case FN_NODE_BOOLEAN_MATH: - ntype->draw_buttons = node_function_buts_boolean_math; - break; - case FN_NODE_FLOAT_COMPARE: - ntype->draw_buttons = node_function_buts_float_compare; - break; - case FN_NODE_SWITCH: - ntype->draw_buttons = node_function_buts_switch; - break; - case FN_NODE_INPUT_VECTOR: - ntype->draw_buttons = node_function_buts_input_vector; - break; - } -} - /* ****** init draw callbacks for all tree types, only called in usiblender.c, once ************ */ static void node_property_update_default(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr) @@ -3612,8 +3225,6 @@ void ED_node_init_butfuncs(void) ntype->draw_nodetype_prepare = node_update_default; ntype->select_area_func = node_select_area_default; ntype->tweak_area_func = node_tweak_area_default; - ntype->draw_buttons = NULL; - ntype->draw_buttons_ex = NULL; ntype->resize_area_func = node_resize_area_default; node_common_set_butfunc(ntype); @@ -3621,8 +3232,6 @@ void ED_node_init_butfuncs(void) node_composit_set_butfunc(ntype); node_shader_set_butfunc(ntype); node_texture_set_butfunc(ntype); - node_geometry_set_butfunc(ntype); - node_function_set_butfunc(ntype); /* define update callbacks for socket properties */ node_template_properties_update(ntype); diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index a209faa5d17..4656e2e5e4f 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -26,6 +26,7 @@ set(INC intern shader texture + ../editors/include ../blenkernel ../blenlib ../blentranslation diff --git a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc index 9148cef7805..7a83ff8e016 100644 --- a/source/blender/nodes/function/nodes/node_fn_boolean_math.cc +++ b/source/blender/nodes/function/nodes/node_fn_boolean_math.cc @@ -19,6 +19,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" static bNodeSocketTemplate fn_node_boolean_math_in[] = { @@ -32,6 +35,11 @@ static bNodeSocketTemplate fn_node_boolean_math_out[] = { {-1, ""}, }; +static void fn_node_boolean_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static void node_boolean_math_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sockB = (bNodeSocket *)BLI_findlink(&node->inputs, 1); @@ -86,5 +94,6 @@ void register_node_type_fn_boolean_math() node_type_label(&ntype, node_boolean_math_label); node_type_update(&ntype, node_boolean_math_update); ntype.expand_in_mf_network = node_boolean_expand_in_mf_network; + ntype.draw_buttons = fn_node_boolean_math_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_float_compare.cc b/source/blender/nodes/function/nodes/node_fn_float_compare.cc index 93c79a48571..6c8df8f2ea0 100644 --- a/source/blender/nodes/function/nodes/node_fn_float_compare.cc +++ b/source/blender/nodes/function/nodes/node_fn_float_compare.cc @@ -21,6 +21,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" static bNodeSocketTemplate fn_node_float_compare_in[] = { @@ -35,6 +38,11 @@ static bNodeSocketTemplate fn_node_float_compare_out[] = { {-1, ""}, }; +static void geo_node_float_compare_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static void node_float_compare_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sockEpsilon = (bNodeSocket *)BLI_findlink(&node->inputs, 2); @@ -105,5 +113,6 @@ void register_node_type_fn_float_compare() node_type_label(&ntype, node_float_compare_label); node_type_update(&ntype, node_float_compare_update); ntype.expand_in_mf_network = node_float_compare_expand_in_mf_network; + ntype.draw_buttons = geo_node_float_compare_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_input_vector.cc b/source/blender/nodes/function/nodes/node_fn_input_vector.cc index c2707f6307a..2cd4eb1d9df 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_vector.cc @@ -18,11 +18,20 @@ #include "BLI_hash.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate fn_node_input_vector_out[] = { {SOCK_VECTOR, N_("Vector")}, {-1, ""}, }; +static void fn_node_input_vector_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "vector", UI_ITEM_R_EXPAND, "", ICON_NONE); +} + static void fn_node_vector_input_expand_in_mf_network( blender::nodes::NodeMFNetworkBuilder &builder) { @@ -50,6 +59,6 @@ void register_node_type_fn_input_vector() node_type_storage( &ntype, "NodeInputVector", node_free_standard_storage, node_copy_standard_storage); ntype.expand_in_mf_network = fn_node_vector_input_expand_in_mf_network; - + ntype.draw_buttons = fn_node_input_vector_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/function/nodes/node_fn_switch.cc b/source/blender/nodes/function/nodes/node_fn_switch.cc index 281ddb05c76..5187decbbe5 100644 --- a/source/blender/nodes/function/nodes/node_fn_switch.cc +++ b/source/blender/nodes/function/nodes/node_fn_switch.cc @@ -15,8 +15,17 @@ */ #include "BLI_listbase.h" + +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_function_util.hh" +static void fn_node_switch_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); +} + static bNodeSocketTemplate fn_node_switch_in[] = { {SOCK_BOOLEAN, N_("Switch")}, @@ -72,5 +81,6 @@ void register_node_type_fn_switch() fn_node_type_base(&ntype, FN_NODE_SWITCH, "Switch", 0, 0); node_type_socket_templates(&ntype, fn_node_switch_in, fn_node_switch_out); node_type_update(&ntype, fn_node_switch_update); + ntype.draw_buttons = fn_node_switch_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index bdec3599bfa..e592bd0bda8 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -18,6 +18,9 @@ #include "BLI_math_rotation.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_align_rotation_to_vector_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Factor")}, @@ -32,6 +35,17 @@ static bNodeSocketTemplate geo_node_align_rotation_to_vector_out[] = { {-1, ""}, }; +static void geo_node_align_rotation_to_vector_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "pivot_axis", 0, IFACE_("Pivot"), ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); + uiItemR(col, ptr, "input_type_vector", 0, IFACE_("Vector"), ICON_NONE); +} + namespace blender::nodes { static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors, @@ -202,5 +216,6 @@ void register_node_type_geo_align_rotation_to_vector() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_align_rotation_to_vector_exec; + ntype.draw_buttons = geo_node_align_rotation_to_vector_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc index 9b0900e19ab..179e418214c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_attribute_color_ramp_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Attribute")}, @@ -30,6 +33,13 @@ static bNodeSocketTemplate geo_node_attribute_color_ramp_out[] = { {-1, ""}, }; +static void geo_node_attribute_color_ramp_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiTemplateColorRamp(layout, ptr, "color_ramp", 0); +} + namespace blender::nodes { static void execute_on_component(const GeoNodeExecParams ¶ms, GeometryComponent &component) @@ -104,5 +114,6 @@ void register_node_type_geo_attribute_color_ramp() node_type_init(&ntype, blender::nodes::geo_node_attribute_color_ramp_init); node_type_size_preset(&ntype, NODE_SIZE_LARGE); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_color_ramp_exec; + ntype.draw_buttons = geo_node_attribute_color_ramp_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index 194b062021d..5e434a7f96d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_compare_in[] = { @@ -48,6 +51,15 @@ static bNodeSocketTemplate geo_node_attribute_compare_out[] = { {-1, ""}, }; +static void geo_node_attribute_compare_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); +} + static void geo_node_attribute_compare_init(bNodeTree *UNUSED(tree), bNode *node) { NodeAttributeCompare *data = (NodeAttributeCompare *)MEM_callocN(sizeof(NodeAttributeCompare), @@ -327,6 +339,7 @@ void register_node_type_geo_attribute_compare() node_type_socket_templates( &ntype, geo_node_attribute_compare_in, geo_node_attribute_compare_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_compare_exec; + ntype.draw_buttons = geo_node_attribute_compare_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_compare_update); node_type_storage( &ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index 9cec4070f89..92b47769d1f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -21,6 +21,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_attribute_fill_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Attribute")}, @@ -36,6 +39,12 @@ static bNodeSocketTemplate geo_node_attribute_fill_out[] = { {-1, ""}, }; +static void geo_node_attribute_fill_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); + // uiItemR(layout, ptr, "domain", 0, "", ICON_NONE); +} + static void geo_node_attribute_fill_init(bNodeTree *UNUSED(tree), bNode *node) { node->custom1 = CD_PROP_FLOAT; @@ -131,5 +140,6 @@ void register_node_type_geo_attribute_fill() node_type_init(&ntype, geo_node_attribute_fill_init); node_type_update(&ntype, geo_node_attribute_fill_update); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_fill_exec; + ntype.draw_buttons = geo_node_attribute_fill_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index f3fc45fc1be..5844edfbbb7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_math_in[] = { @@ -45,18 +48,6 @@ static bNodeSocketTemplate geo_node_attribute_math_out[] = { {-1, ""}, }; -static void geo_node_attribute_math_init(bNodeTree *UNUSED(tree), bNode *node) -{ - NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath), - "NodeAttributeMath"); - - data->operation = NODE_MATH_ADD; - data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - node->storage = data; -} - static bool operation_use_input_c(const NodeMathOperation operation) { return ELEM(operation, @@ -117,6 +108,34 @@ static bool operation_use_input_b(const NodeMathOperation operation) return false; } +static void geo_node_attribute_math_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + NodeAttributeMath *node_storage = (NodeAttributeMath *)node->storage; + NodeMathOperation operation = (NodeMathOperation)node_storage->operation; + + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); + + if (operation_use_input_b(operation)) { + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); + } + if (operation_use_input_c(operation)) { + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("Type C"), ICON_NONE); + } +} + +static void geo_node_attribute_math_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeMath *data = (NodeAttributeMath *)MEM_callocN(sizeof(NodeAttributeMath), __func__); + + data->operation = NODE_MATH_ADD; + data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_c = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + namespace blender::nodes { static void geo_node_attribute_math_update(bNodeTree *UNUSED(ntree), bNode *node) @@ -267,6 +286,7 @@ void register_node_type_geo_attribute_math() geo_node_type_base(&ntype, GEO_NODE_ATTRIBUTE_MATH, "Attribute Math", NODE_CLASS_ATTRIBUTE, 0); node_type_socket_templates(&ntype, geo_node_attribute_math_in, geo_node_attribute_math_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_math_exec; + ntype.draw_buttons = geo_node_attribute_math_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_math_update); node_type_init(&ntype, geo_node_attribute_math_init); node_type_storage( diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index 58d67145e75..976970d06b1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -18,6 +18,9 @@ #include "DNA_material_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_attribute_mix_in[] = { @@ -41,6 +44,15 @@ static bNodeSocketTemplate geo_node_mix_attribute_out[] = { {-1, ""}, }; +static void geo_node_attribute_mix_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "blend_type", 0, "", ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); + uiItemR(col, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + uiItemR(col, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); +} + namespace blender::nodes { static void do_mix_operation_float(const int blend_mode, @@ -204,6 +216,7 @@ void register_node_type_geo_attribute_mix() node_type_socket_templates(&ntype, geo_node_attribute_mix_in, geo_node_mix_attribute_out); node_type_init(&ntype, blender::nodes::geo_node_attribute_mix_init); node_type_update(&ntype, blender::nodes::geo_node_attribute_mix_update); + ntype.draw_buttons = geo_node_attribute_mix_layout; node_type_storage( &ntype, "NodeAttributeMix", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_mix_exec; diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index 14b1c4e3a59..1067a1e8593 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -14,17 +14,20 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_kdopbvh.h" #include "BLI_kdtree.h" #include "BLI_task.hh" +#include "BLI_timeit.hh" + +#include "DNA_mesh_types.h" #include "BKE_bvhutils.h" -#include "BLI_kdopbvh.h" + +#include "UI_interface.h" +#include "UI_resources.h" #include "node_geometry_util.hh" -#include "BLI_timeit.hh" -#include "DNA_mesh_types.h" - static bNodeSocketTemplate geo_node_attribute_proximity_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_GEOMETRY, N_("Target")}, @@ -37,6 +40,13 @@ static bNodeSocketTemplate geo_node_attribute_proximity_out[] = { {-1, ""}, }; +static void geo_node_attribute_proximity_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "target_geometry_element", 0, "", ICON_NONE); +} + static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node) { NodeGeometryAttributeProximity *node_storage = (NodeGeometryAttributeProximity *)MEM_callocN( @@ -220,5 +230,6 @@ void register_node_type_geo_attribute_proximity() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_proximity_exec; + ntype.draw_buttons = geo_node_attribute_proximity_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index 3ee7df7fe72..f5765af83b3 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -19,6 +19,9 @@ #include "BLI_hash.h" #include "BLI_rand.hh" +#include "UI_interface.h" +#include "UI_resources.h" + #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" @@ -38,6 +41,13 @@ static bNodeSocketTemplate geo_node_attribute_randomize_out[] = { {-1, ""}, }; +static void geo_node_attribute_random_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); +} + static void geo_node_attribute_randomize_init(bNodeTree *UNUSED(tree), bNode *node) { node->custom1 = CD_PROP_FLOAT; @@ -215,5 +225,6 @@ void register_node_type_geo_attribute_randomize() node_type_init(&ntype, geo_node_attribute_randomize_init); node_type_update(&ntype, geo_node_attribute_randomize_update); ntype.geometry_node_execute = blender::nodes::geo_node_random_attribute_exec; + ntype.draw_buttons = geo_node_attribute_random_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc index 66495bfa53b..b6a960e5617 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc @@ -22,6 +22,9 @@ #include "RE_texture.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_attribute_sample_texture_in[] = { @@ -36,6 +39,13 @@ static bNodeSocketTemplate geo_node_attribute_sample_texture_out[] = { {-1, ""}, }; +static void geo_node_attribute_sample_texture_layout(uiLayout *layout, + bContext *C, + PointerRNA *ptr) +{ + uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); +} + namespace blender::nodes { static void execute_on_component(GeometryComponent &component, const GeoNodeExecParams ¶ms) @@ -103,5 +113,6 @@ void register_node_type_geo_sample_texture() node_type_socket_templates( &ntype, geo_node_attribute_sample_texture_in, geo_node_attribute_sample_texture_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_sample_texture_exec; + ntype.draw_buttons = geo_node_attribute_sample_texture_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc index 529906a35e7..62a291e8506 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc @@ -26,6 +26,9 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "NOD_math_functions.hh" static bNodeSocketTemplate geo_node_attribute_vector_math_in[] = { @@ -46,25 +49,6 @@ static bNodeSocketTemplate geo_node_attribute_vector_math_out[] = { {-1, ""}, }; -static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node) -{ - NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN( - sizeof(NodeAttributeVectorMath), __func__); - - data->operation = NODE_VECTOR_MATH_ADD; - data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; - node->storage = data; -} - -static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation) -{ - if (operation == NODE_VECTOR_MATH_SCALE) { - return CD_PROP_FLOAT; - } - return CD_PROP_FLOAT3; -} - static bool operation_use_input_b(const NodeVectorMathOperation operation) { return !ELEM(operation, @@ -84,6 +68,44 @@ static bool operation_use_input_c(const NodeVectorMathOperation operation) return operation == NODE_VECTOR_MATH_WRAP; } +static void geo_node_attribute_vector_math_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + const NodeAttributeVectorMath &node_storage = *(NodeAttributeVectorMath *)node->storage; + const NodeVectorMathOperation operation = (const NodeVectorMathOperation)node_storage.operation; + + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); + + if (operation_use_input_b(operation)) { + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); + } + if (operation_use_input_c(operation)) { + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("Type C"), ICON_NONE); + } +} + +static CustomDataType operation_get_read_type_b(const NodeVectorMathOperation operation) +{ + if (operation == NODE_VECTOR_MATH_SCALE) { + return CD_PROP_FLOAT; + } + return CD_PROP_FLOAT3; +} + +static void geo_node_attribute_vector_math_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeVectorMath *data = (NodeAttributeVectorMath *)MEM_callocN( + sizeof(NodeAttributeVectorMath), __func__); + + data->operation = NODE_VECTOR_MATH_ADD; + data->input_type_a = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + data->input_type_b = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + static CustomDataType operation_get_result_type(const NodeVectorMathOperation operation) { switch (operation) { @@ -419,6 +441,7 @@ void register_node_type_geo_attribute_vector_math() node_type_socket_templates( &ntype, geo_node_attribute_vector_math_in, geo_node_attribute_vector_math_out); ntype.geometry_node_execute = blender::nodes::geo_node_attribute_vector_math_exec; + ntype.draw_buttons = geo_node_attribute_vector_math_layout; node_type_update(&ntype, blender::nodes::geo_node_attribute_vector_math_update); node_type_init(&ntype, geo_node_attribute_vector_math_init); node_type_storage( diff --git a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc index 19178546e40..403b74b2fef 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc @@ -24,6 +24,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "BKE_mesh.h" #include "bmesh.h" @@ -42,6 +45,11 @@ static bNodeSocketTemplate geo_node_boolean_out[] = { {-1, ""}, }; +static void geo_node_boolean_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); +} + static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data)) { return BM_elem_flag_test(f, BM_ELEM_DRAW) ? 1 : 0; @@ -147,6 +155,7 @@ void register_node_type_geo_boolean() geo_node_type_base(&ntype, GEO_NODE_BOOLEAN, "Boolean", NODE_CLASS_GEOMETRY, 0); node_type_socket_templates(&ntype, geo_node_boolean_in, geo_node_boolean_out); + ntype.draw_buttons = geo_node_boolean_layout; ntype.geometry_node_execute = blender::nodes::geo_node_boolean_exec; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc index 637a117e2af..42ad434ffcd 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -20,6 +20,9 @@ #include "DNA_collection_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_collection_info_in[] = { {SOCK_COLLECTION, N_("Collection")}, {-1, ""}, @@ -30,6 +33,11 @@ static bNodeSocketTemplate geo_node_collection_info_out[] = { {-1, ""}, }; +static void geo_node_collection_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "transform_space", 0, NULL, ICON_NONE); +} + namespace blender::nodes { static void geo_node_collection_info_exec(GeoNodeExecParams params) @@ -95,5 +103,6 @@ void register_node_type_geo_collection_info() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_collection_info_exec; + ntype.draw_buttons = geo_node_collection_info_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc index d713c191d5d..4e26977b85a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc @@ -23,6 +23,9 @@ #include "BLI_math_matrix.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_object_info_in[] = { {SOCK_OBJECT, N_("Object")}, {-1, ""}, @@ -36,6 +39,11 @@ static bNodeSocketTemplate geo_node_object_info_out[] = { {-1, ""}, }; +static void geo_node_object_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); +} + namespace blender::nodes { static void geo_node_object_info_exec(GeoNodeExecParams params) { @@ -128,5 +136,6 @@ void register_node_type_geo_object_info() node_type_storage( &ntype, "NodeGeometryObjectInfo", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_object_info_exec; + ntype.draw_buttons = geo_node_object_info_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index eaf13b94eb9..93abed7926e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -33,6 +33,9 @@ #include "BKE_mesh_runtime.h" #include "BKE_pointcloud.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_point_distribute_in[] = { @@ -49,6 +52,13 @@ static bNodeSocketTemplate geo_node_point_distribute_out[] = { {-1, ""}, }; +static void geo_node_point_distribute_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "distribute_method", 0, "", ICON_NONE); +} + static void node_point_distribute_update(bNodeTree *UNUSED(ntree), bNode *node) { bNodeSocket *sock_min_dist = (bNodeSocket *)BLI_findlink(&node->inputs, 1); @@ -485,5 +495,6 @@ void register_node_type_geo_point_distribute() node_type_socket_templates(&ntype, geo_node_point_distribute_in, geo_node_point_distribute_out); node_type_update(&ntype, node_point_distribute_update); ntype.geometry_node_execute = blender::nodes::geo_node_point_distribute_exec; + ntype.draw_buttons = geo_node_point_distribute_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index 3bd8c355124..1e7cf21f921 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -24,6 +24,9 @@ #include "BLI_hash.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_point_instance_in[] = { @@ -39,6 +42,14 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = { {-1, ""}, }; +static void geo_node_point_instance_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "instance_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) { + uiItemR(layout, ptr, "use_whole_collection", 0, NULL, ICON_NONE); + } +} + namespace blender::nodes { static void geo_node_point_instance_update(bNodeTree *UNUSED(tree), bNode *node) @@ -216,6 +227,7 @@ void register_node_type_geo_point_instance() node_type_init(&ntype, blender::nodes::geo_node_point_instance_init); node_type_storage( &ntype, "NodeGeometryPointInstance", node_free_standard_storage, node_copy_standard_storage); + ntype.draw_buttons = geo_node_point_instance_layout; node_type_update(&ntype, blender::nodes::geo_node_point_instance_update); ntype.geometry_node_execute = blender::nodes::geo_node_point_instance_exec; nodeRegisterType(&ntype); diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc index b1451dfb89e..3ca898bfd83 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc @@ -18,6 +18,9 @@ #include "BLI_math_rotation.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_rotate_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Axis")}, @@ -34,6 +37,23 @@ static bNodeSocketTemplate geo_node_point_rotate_out[] = { {-1, ""}, }; +static void geo_node_point_rotate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage; + + uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + + uiLayout *col = uiLayoutColumn(layout, false); + if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { + uiItemR(col, ptr, "input_type_axis", 0, IFACE_("Axis"), ICON_NONE); + uiItemR(col, ptr, "input_type_angle", 0, IFACE_("Angle"), ICON_NONE); + } + else { + uiItemR(col, ptr, "input_type_rotation", 0, IFACE_("Rotation"), ICON_NONE); + } +} + namespace blender::nodes { static void point_rotate__axis_angle__object_space(const int domain_size, @@ -202,5 +222,6 @@ void register_node_type_geo_point_rotate() node_type_storage( &ntype, "NodeGeometryRotatePoints", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_rotate_exec; + ntype.draw_buttons = geo_node_point_rotate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc index 47fca93d2ab..78e23b783db 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_scale_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Factor")}, @@ -30,6 +33,11 @@ static bNodeSocketTemplate geo_node_point_scale_out[] = { {-1, ""}, }; +static void geo_node_point_scale_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + namespace blender::nodes { static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component) @@ -96,5 +104,6 @@ void register_node_type_geo_point_scale() node_type_storage( &ntype, "NodeGeometryPointScale", node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_scale_exec; + ntype.draw_buttons = geo_node_point_scale_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc index 72176b11fdb..f7f369f5d66 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc @@ -18,6 +18,9 @@ #include "BKE_colorband.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_point_translate_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Translation")}, @@ -30,6 +33,11 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = { {-1, ""}, }; +static void geo_node_point_translate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + namespace blender::nodes { static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component) @@ -97,5 +105,6 @@ void register_node_type_geo_point_translate() node_free_standard_storage, node_copy_standard_storage); ntype.geometry_node_execute = blender::nodes::geo_node_point_translate_exec; + ntype.draw_buttons = geo_node_point_translate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc index b90ef2034a8..428f129fb36 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc @@ -25,6 +25,9 @@ #include "BKE_lib_id.h" #include "BKE_volume.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_points_to_volume_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX}, @@ -40,6 +43,16 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = { {-1, ""}, }; +static void geo_node_points_to_volume_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE); + uiItemR(layout, ptr, "input_type_radius", 0, IFACE_("Radius"), ICON_NONE); +} + namespace blender::nodes { #ifdef WITH_OPENVDB @@ -255,5 +268,6 @@ void register_node_type_geo_points_to_volume() node_type_init(&ntype, blender::nodes::geo_node_points_to_volume_init); node_type_update(&ntype, blender::nodes::geo_node_points_to_volume_update); ntype.geometry_node_execute = blender::nodes::geo_node_points_to_volume_exec; + ntype.draw_buttons = geo_node_points_to_volume_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc index 543859aef3f..99f7339a1cc 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc @@ -20,6 +20,9 @@ #include "BKE_subdiv.h" #include "BKE_subdiv_mesh.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_subdivision_surface_in[] = { @@ -36,6 +39,17 @@ static bNodeSocketTemplate geo_node_subdivision_surface_out[] = { {-1, ""}, }; +static void geo_node_subdivision_surface_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *UNUSED(ptr)) +{ +#ifndef WITH_OPENSUBDIV + uiItemL(layout, IFACE_("Disabled, built without OpenSubdiv"), ICON_ERROR); +#else + UNUSED_VARS(layout); +#endif +} + namespace blender::nodes { static void geo_node_subdivision_surface_exec(GeoNodeExecParams params) { @@ -112,5 +126,6 @@ void register_node_type_geo_subdivision_surface() node_type_socket_templates( &ntype, geo_node_subdivision_surface_in, geo_node_subdivision_surface_out); ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_exec; + ntype.draw_buttons = geo_node_subdivision_surface_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc index c224731ad9f..32fa32a9f13 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc @@ -18,6 +18,9 @@ #include "RNA_enum_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "node_geometry_util.hh" extern "C" { @@ -39,6 +42,12 @@ static bNodeSocketTemplate geo_node_triangulate_out[] = { {-1, ""}, }; +static void geo_node_triangulate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "quad_method", 0, "", ICON_NONE); + uiItemR(layout, ptr, "ngon_method", 0, "", ICON_NONE); +} + static void geo_triangulate_init(bNodeTree *UNUSED(ntree), bNode *node) { node->custom1 = GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE; @@ -75,5 +84,6 @@ void register_node_type_geo_triangulate() node_type_socket_templates(&ntype, geo_node_triangulate_in, geo_node_triangulate_out); node_type_init(&ntype, geo_triangulate_init); ntype.geometry_node_execute = blender::nodes::geo_node_triangulate_exec; + ntype.draw_buttons = geo_node_triangulate_layout; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc index b1d1430bccd..54dccb613a1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc @@ -31,6 +31,9 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "UI_interface.h" +#include "UI_resources.h" + static bNodeSocketTemplate geo_node_volume_to_mesh_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_STRING, N_("Grid")}, @@ -46,6 +49,13 @@ static bNodeSocketTemplate geo_node_volume_to_mesh_out[] = { {-1, ""}, }; +static void geo_node_volume_to_mesh_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "resolution_mode", 0, IFACE_("Resolution"), ICON_NONE); +} + namespace blender::nodes { static void geo_node_volume_to_mesh_init(bNodeTree *UNUSED(ntree), bNode *node) @@ -156,5 +166,6 @@ void register_node_type_geo_volume_to_mesh() node_type_init(&ntype, blender::nodes::geo_node_volume_to_mesh_init); node_type_update(&ntype, blender::nodes::geo_node_volume_to_mesh_update); ntype.geometry_node_execute = blender::nodes::geo_node_volume_to_mesh_exec; + ntype.draw_buttons = geo_node_volume_to_mesh_layout; nodeRegisterType(&ntype); } From 3b1c7a6d6f2dfc4a72a1b33217366db6173d8d71 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 9 Feb 2021 09:42:58 +1100 Subject: [PATCH 025/519] Cleanup: move eIconSizes, ID_Type enums into own file This avoids adding DNA_ID.h into other headers, recently changed in cfa48c84d06ca8197f86b6d3ceef8a2c7c311a82 Note that other enums could be moved too, this is a smaller change to avoid indirectly including DNA_ID.h in many places. --- source/blender/CMakeLists.txt | 1 + .../editors/include/UI_interface_icons.h | 4 +- source/blender/makesdna/DNA_ID.h | 89 +------------ source/blender/makesdna/DNA_ID_enums.h | 118 ++++++++++++++++++ 4 files changed, 122 insertions(+), 90 deletions(-) create mode 100644 source/blender/makesdna/DNA_ID_enums.h diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index efd30ba8509..f875a990d0a 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -20,6 +20,7 @@ set(SRC_DNA_INC ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID.h + ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID_enums.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_action_types.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_anim_types.h ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_armature_types.h diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h index 4d860be285d..266a538b6c3 100644 --- a/source/blender/editors/include/UI_interface_icons.h +++ b/source/blender/editors/include/UI_interface_icons.h @@ -23,8 +23,8 @@ #pragma once -/* Required for enum iconSizes which can't be forward declared if this file is included in C++. */ -#include "DNA_ID.h" +/* Required for #eIconSizes which can't be forward declared if this file is included in C++. */ +#include "DNA_ID_enums.h" #ifdef __cplusplus extern "C" { diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 26824216337..d9c821d3ba7 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -24,6 +24,7 @@ #pragma once +#include "DNA_ID_enums.h" #include "DNA_defs.h" #include "DNA_listBase.h" @@ -367,13 +368,6 @@ typedef struct Library { short versionfile, subversionfile; } Library; -enum eIconSizes { - ICON_SIZE_ICON = 0, - ICON_SIZE_PREVIEW = 1, - - NUM_ICON_SIZES, -}; - /* for PreviewImage->flag */ enum ePreviewImage_Flag { PRV_CHANGED = (1 << 0), @@ -411,87 +405,6 @@ typedef struct PreviewImage { BLI_assert((prv)->tag & PRV_TAG_DEFFERED), \ (void *)((prv) + 1)) -/** - * Defines for working with IDs. - * - * The tags represent types! This is a dirty way of enabling RTTI. The - * sig_byte end endian defines aren't really used much. - */ - -#ifdef __BIG_ENDIAN__ -/* big endian */ -# define MAKE_ID2(c, d) ((c) << 8 | (d)) -#else -/* little endian */ -# define MAKE_ID2(c, d) ((d) << 8 | (c)) -#endif - -/** - * ID from database. - * - * Written to #BHead.code (for file IO) - * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro). - */ -typedef enum ID_Type { - ID_SCE = MAKE_ID2('S', 'C'), /* Scene */ - ID_LI = MAKE_ID2('L', 'I'), /* Library */ - ID_OB = MAKE_ID2('O', 'B'), /* Object */ - ID_ME = MAKE_ID2('M', 'E'), /* Mesh */ - ID_CU = MAKE_ID2('C', 'U'), /* Curve */ - ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */ - ID_MA = MAKE_ID2('M', 'A'), /* Material */ - ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */ - ID_IM = MAKE_ID2('I', 'M'), /* Image */ - ID_LT = MAKE_ID2('L', 'T'), /* Lattice */ - ID_LA = MAKE_ID2('L', 'A'), /* Light */ - ID_CA = MAKE_ID2('C', 'A'), /* Camera */ - ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */ - ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */ - ID_WO = MAKE_ID2('W', 'O'), /* World */ - ID_SCR = MAKE_ID2('S', 'R'), /* Screen */ - ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */ - ID_TXT = MAKE_ID2('T', 'X'), /* Text */ - ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */ - ID_SO = MAKE_ID2('S', 'O'), /* Sound */ - ID_GR = MAKE_ID2('G', 'R'), /* Collection */ - ID_AR = MAKE_ID2('A', 'R'), /* bArmature */ - ID_AC = MAKE_ID2('A', 'C'), /* bAction */ - ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */ - ID_BR = MAKE_ID2('B', 'R'), /* Brush */ - ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */ - ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */ - ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */ - ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */ - ID_MSK = MAKE_ID2('M', 'S'), /* Mask */ - ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */ - ID_PAL = MAKE_ID2('P', 'L'), /* Palette */ - ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */ - ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */ - ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */ - ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */ - ID_HA = MAKE_ID2('H', 'A'), /* Hair */ - ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */ - ID_VO = MAKE_ID2('V', 'O'), /* Volume */ - ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (geometry node groups) */ -} ID_Type; - -/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */ -#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */ - -/* Deprecated. */ -#define ID_SCRN MAKE_ID2('S', 'N') - -/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */ -#define ID_SEQ MAKE_ID2('S', 'Q') -/* constraint */ -#define ID_CO MAKE_ID2('C', 'O') -/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */ -#define ID_PO MAKE_ID2('A', 'C') -/* used in outliner... */ -#define ID_NLA MAKE_ID2('N', 'L') -/* fluidsim Ipo */ -#define ID_FLUIDSIM MAKE_ID2('F', 'S') - #define ID_FAKE_USERS(id) ((((const ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0) #define ID_REAL_USERS(id) (((const ID *)id)->us - ID_FAKE_USERS(id)) #define ID_EXTRA_USERS(id) (((const ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0) diff --git a/source/blender/makesdna/DNA_ID_enums.h b/source/blender/makesdna/DNA_ID_enums.h new file mode 100644 index 00000000000..c865c8ea973 --- /dev/null +++ b/source/blender/makesdna/DNA_ID_enums.h @@ -0,0 +1,118 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup DNA + * \brief Enumerations for `DNA_ID.h`. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +enum eIconSizes { + ICON_SIZE_ICON = 0, + ICON_SIZE_PREVIEW = 1, + + NUM_ICON_SIZES, +}; + +/** + * Defines for working with IDs. + * + * The tags represent types! This is a dirty way of enabling RTTI. The + * sig_byte end endian defines aren't really used much. + */ + +#ifdef __BIG_ENDIAN__ +/* big endian */ +# define MAKE_ID2(c, d) ((c) << 8 | (d)) +#else +/* little endian */ +# define MAKE_ID2(c, d) ((d) << 8 | (c)) +#endif + +/** + * ID from database. + * + * Written to #BHead.code (for file IO) + * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro). + */ +typedef enum ID_Type { + ID_SCE = MAKE_ID2('S', 'C'), /* Scene */ + ID_LI = MAKE_ID2('L', 'I'), /* Library */ + ID_OB = MAKE_ID2('O', 'B'), /* Object */ + ID_ME = MAKE_ID2('M', 'E'), /* Mesh */ + ID_CU = MAKE_ID2('C', 'U'), /* Curve */ + ID_MB = MAKE_ID2('M', 'B'), /* MetaBall */ + ID_MA = MAKE_ID2('M', 'A'), /* Material */ + ID_TE = MAKE_ID2('T', 'E'), /* Tex (Texture) */ + ID_IM = MAKE_ID2('I', 'M'), /* Image */ + ID_LT = MAKE_ID2('L', 'T'), /* Lattice */ + ID_LA = MAKE_ID2('L', 'A'), /* Light */ + ID_CA = MAKE_ID2('C', 'A'), /* Camera */ + ID_IP = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */ + ID_KE = MAKE_ID2('K', 'E'), /* Key (shape key) */ + ID_WO = MAKE_ID2('W', 'O'), /* World */ + ID_SCR = MAKE_ID2('S', 'R'), /* Screen */ + ID_VF = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */ + ID_TXT = MAKE_ID2('T', 'X'), /* Text */ + ID_SPK = MAKE_ID2('S', 'K'), /* Speaker */ + ID_SO = MAKE_ID2('S', 'O'), /* Sound */ + ID_GR = MAKE_ID2('G', 'R'), /* Collection */ + ID_AR = MAKE_ID2('A', 'R'), /* bArmature */ + ID_AC = MAKE_ID2('A', 'C'), /* bAction */ + ID_NT = MAKE_ID2('N', 'T'), /* bNodeTree */ + ID_BR = MAKE_ID2('B', 'R'), /* Brush */ + ID_PA = MAKE_ID2('P', 'A'), /* ParticleSettings */ + ID_GD = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */ + ID_WM = MAKE_ID2('W', 'M'), /* WindowManager */ + ID_MC = MAKE_ID2('M', 'C'), /* MovieClip */ + ID_MSK = MAKE_ID2('M', 'S'), /* Mask */ + ID_LS = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */ + ID_PAL = MAKE_ID2('P', 'L'), /* Palette */ + ID_PC = MAKE_ID2('P', 'C'), /* PaintCurve */ + ID_CF = MAKE_ID2('C', 'F'), /* CacheFile */ + ID_WS = MAKE_ID2('W', 'S'), /* WorkSpace */ + ID_LP = MAKE_ID2('L', 'P'), /* LightProbe */ + ID_HA = MAKE_ID2('H', 'A'), /* Hair */ + ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */ + ID_VO = MAKE_ID2('V', 'O'), /* Volume */ + ID_SIM = MAKE_ID2('S', 'I'), /* Simulation (geometry node groups) */ +} ID_Type; + +/* Only used as 'placeholder' in .blend files for directly linked data-blocks. */ +#define ID_LINK_PLACEHOLDER MAKE_ID2('I', 'D') /* (internal use only) */ + +/* Deprecated. */ +#define ID_SCRN MAKE_ID2('S', 'N') + +/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */ +#define ID_SEQ MAKE_ID2('S', 'Q') +/* constraint */ +#define ID_CO MAKE_ID2('C', 'O') +/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */ +#define ID_PO MAKE_ID2('A', 'C') +/* used in outliner... */ +#define ID_NLA MAKE_ID2('N', 'L') +/* fluidsim Ipo */ +#define ID_FLUIDSIM MAKE_ID2('F', 'S') + +#ifdef __cplusplus +} +#endif From eab9165c2512581b918d8bfca40ec98ded08a84a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 9 Feb 2021 10:42:00 +1100 Subject: [PATCH 026/519] Cleanup: spelling --- source/blender/blenkernel/intern/brush.c | 2 +- source/blender/blenkernel/intern/paint.c | 2 +- .../blender/blenkernel/intern/undo_system.c | 4 ++-- source/blender/blenlib/intern/convexhull_2d.c | 2 +- source/blender/blenlib/intern/delaunay_2d.cc | 2 +- source/blender/blenlib/intern/mesh_boolean.cc | 10 +++++----- source/blender/blenloader/intern/readfile.c | 8 +++++--- .../blenloader/intern/versioning_270.c | 2 +- source/blender/bmesh/intern/bmesh_error.h | 2 +- source/blender/bmesh/intern/bmesh_mods.c | 6 +++--- source/blender/bmesh/intern/bmesh_opdefines.c | 2 +- source/blender/bmesh/intern/bmesh_structure.c | 2 +- source/blender/bmesh/tools/bmesh_bevel.c | 20 +++++++++---------- source/blender/draw/intern/draw_manager.c | 2 +- .../blender/editors/space_image/image_ops.c | 2 +- source/blender/editors/space_info/info_draw.c | 2 +- source/blender/editors/undo/memfile_undo.c | 2 +- source/blender/editors/util/ed_util.c | 2 +- source/blender/makesdna/DNA_ID_enums.h | 4 ++-- source/blender/makesrna/intern/rna_rna.c | 4 ++-- source/blender/render/intern/texture_image.c | 2 +- 21 files changed, 43 insertions(+), 41 deletions(-) diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 9fbefacbece..8a2ab818464 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -375,7 +375,7 @@ static int brush_undo_preserve_cb(LibraryIDLinkCallbackData *cb_data) static void brush_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old) { - /* Whole Brush is preserved across undos. */ + /* Whole Brush is preserved across undoes. */ BKE_lib_id_swap(NULL, id_new, id_old); /* `id_new` now has content from `id_old`, we need to ensure those old ID pointers are valid. diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 98ee9e1da75..8b5137621a0 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -127,7 +127,7 @@ static void palette_blend_read_data(BlendDataReader *reader, ID *id) static void palette_undo_preserve(BlendLibReader *UNUSED(reader), ID *id_new, ID *id_old) { - /* Whole Palette is preserved across undos, and it has no extra pointer, simple. */ + /* Whole Palette is preserved across undoes, and it has no extra pointer, simple. */ /* Note: We do not care about potential internal references to self here, Palette has none. */ /* Note: We do not swap IDProperties, as dealing with potential ID pointers in those would be * fairly delicate. */ diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index 07e7d07f1ef..baa96ca1455 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -287,7 +287,7 @@ void BKE_undosys_stack_clear(UndoStack *ustack) void BKE_undosys_stack_clear_active(UndoStack *ustack) { - /* Remove active and all following undos. */ + /* Remove active and all following undoes. */ UndoStep *us = ustack->step_active; if (us) { @@ -517,7 +517,7 @@ UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, retval |= UNDO_PUSH_RET_OVERRIDE_CHANGED; } - /* Remove all undos after (also when 'ustack->step_active == NULL'). */ + /* Remove all undoes after (also when 'ustack->step_active == NULL'). */ while (ustack->steps.last != ustack->step_active) { UndoStep *us_iter = ustack->steps.last; undosys_step_free_and_unlink(ustack, us_iter); diff --git a/source/blender/blenlib/intern/convexhull_2d.c b/source/blender/blenlib/intern/convexhull_2d.c index a3d24787d27..cb4ef54bfb7 100644 --- a/source/blender/blenlib/intern/convexhull_2d.c +++ b/source/blender/blenlib/intern/convexhull_2d.c @@ -28,7 +28,7 @@ #include "BLI_strict_flags.h" #include "BLI_utildefines.h" -/* Copyright 2001, softSurfer (www.softsurfer.com) +/* Copyright 2001, softSurfer (http://www.softsurfer.com) * This code may be freely used and modified for any purpose * providing that this copyright notice is included with it. * SoftSurfer makes no warranty for this code, and cannot be held diff --git a/source/blender/blenlib/intern/delaunay_2d.cc b/source/blender/blenlib/intern/delaunay_2d.cc index 1cf2046ce16..06a749ab921 100644 --- a/source/blender/blenlib/intern/delaunay_2d.cc +++ b/source/blender/blenlib/intern/delaunay_2d.cc @@ -1500,7 +1500,7 @@ template static void re_delaunay_triangulate(CDTArrangement *cdt, cse = ss; } } - /* Add diagonals necessary to make abc a triangle. */ + /* Add diagonals necessary to make `abc` a triangle. */ CDTEdge *ebc = nullptr; CDTEdge *eca = nullptr; if (!exists_edge(b, c)) { diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 09b6ffc1fd9..6ca5be743f0 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -2403,8 +2403,8 @@ static void inside_shape_callback(void *userdata, * how likely we think it is that it is inside. * This is done by casting some rays from just on the positive side of a test * face in various directions and summing the parity of crossing faces of each face. - * The BVHtree \a tree contains all the triangles of \a tm and can be used for - * fast raycasting. + * + * \param tree: Contains all the triangles of \a tm and can be used for fast ray-casting. */ static void test_tri_inside_shapes(const IMesh &tm, std::function shape_fn, @@ -2424,7 +2424,7 @@ static void test_tri_inside_shapes(const IMesh &tm, return; } double3 test_point = calc_point_inside_tri_db(tri_test); - /* Offset the test point a tiny bit in the tri_test normal direcction. */ + /* Offset the test point a tiny bit in the tri_test normal direction. */ tri_test.populate_plane(false); double3 norm = tri_test.plane->norm.normalized(); const double offset_amount = 1e-5; @@ -2436,8 +2436,8 @@ static void test_tri_inside_shapes(const IMesh &tm, } /* Try six test rays almost along orthogonal axes. * Perturb their directions slightly to make it less likely to hit a seam. - * Raycast assumes they have unit length, so use r1 near 1 and - * ra near 0.5, and rb near .01, but normalized so sqrt(r1^2 + ra^2 + rb^2) == 1. */ + * Ray-cast assumes they have unit length, so use r1 near 1 and + * ra near 0.5, and rb near .01, but normalized so `sqrt(r1^2 + ra^2 + rb^2) == 1`. */ constexpr int num_rays = 6; constexpr float r1 = 0.9987025295199663f; constexpr float ra = 0.04993512647599832f; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index b86896b1a8e..c90572a68a6 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3928,9 +3928,11 @@ static void lib_link_all(FileData *fd, Main *bmain) #endif } -/* Checks to perform after `lib_link_all`. - * Those operations cannot perfom properly in a split bmain case, since some data from other - * bmain's (aka libraries) may not have been processed yet. */ +/** + * Checks to perform after `lib_link_all`. + * Those operations cannot perform properly in a split bmain case, since some data from other + * bmain's (aka libraries) may not have been processed yet. + */ static void after_liblink_merged_bmain_process(Main *bmain) { /* We only expect a merged Main here, not a split one. */ diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index e383d46858f..d8ab8d6f32a 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1657,7 +1657,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain) if (!DNA_struct_elem_find(fd->filesdna, "Brush", "float", "falloff_angle")) { for (Brush *br = bmain->brushes.first; br; br = br->id.next) { br->falloff_angle = DEG2RADF(80); - /* These flags are used for new feautres. They are not related to falloff_angle */ + /* These flags are used for new features. They are not related to `falloff_angle`. */ br->flag &= ~(BRUSH_INVERT_TO_SCRAPE_FILL | BRUSH_ORIGINAL_PLANE | BRUSH_GRAB_ACTIVE_VERTEX | BRUSH_SCENE_SPACING | BRUSH_FRONTFACE_FALLOFF); } diff --git a/source/blender/bmesh/intern/bmesh_error.h b/source/blender/bmesh/intern/bmesh_error.h index fdec043ec48..41d02e334fb 100644 --- a/source/blender/bmesh/intern/bmesh_error.h +++ b/source/blender/bmesh/intern/bmesh_error.h @@ -25,7 +25,7 @@ /*----------- bmop error system ----------*/ /* pushes an error onto the bmesh error stack. - * if msg is null, then the default message for the errorcode is used.*/ + * if msg is null, then the default message for the `errcode` is used. */ void BMO_error_raise(BMesh *bm, BMOperator *owner, int errcode, const char *msg); /* gets the topmost error from the stack. diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index 4c72b802396..8e5ed9c3bf0 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -802,7 +802,7 @@ void BM_edge_calc_rotate(BMEdge *e, const bool ccw, BMLoop **r_l1, BMLoop **r_l2 /* we know this will work */ BM_edge_face_pair(e, &fa, &fb); - /* so we can use ccw variable correctly, + /* so we can use `ccw` variable correctly, * otherwise we could use the edges verts direct */ BM_edge_ordered_verts(e, &v1, &v2); @@ -886,7 +886,7 @@ bool BM_edge_rotate_check_degenerate(BMEdge *e, BMLoop *l1, BMLoop *l2) /* verts from the loops passed */ BMVert *v1, *v2; - /* these are the opposite verts - the verts that _would_ be used if 'ccw' was inverted*/ + /* These are the opposite verts - the verts that _would_ be used if `ccw` was inverted. */ BMVert *v1_alt, *v2_alt; /* this should have already run */ @@ -1070,7 +1070,7 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const bool ccw, const short check_f BM_face_normal_flip(bm, fb); if (ccw) { - /* needed otherwise ccw toggles direction */ + /* Needed otherwise `ccw` toggles direction */ e_new->l = e_new->l->radial_next; } } diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index a4e0d46e544..bccac006e8e 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1394,7 +1394,7 @@ static BMOpDefine bmo_duplicate_def = { /* slots_out */ {{"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, - /* facemap maps from source faces to dupe + /* face_map maps from source faces to dupe * faces, and from dupe faces to source faces */ {"vert_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}}, {"edge_map.out", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_ELEM}}, diff --git a/source/blender/bmesh/intern/bmesh_structure.c b/source/blender/bmesh/intern/bmesh_structure.c index cd230e76aca..cfdce0b749b 100644 --- a/source/blender/bmesh/intern/bmesh_structure.c +++ b/source/blender/bmesh/intern/bmesh_structure.c @@ -143,7 +143,7 @@ void bmesh_disk_vert_replace(BMEdge *e, BMVert *v_dst, BMVert *v_src) * * The loop cycle keeps track of a faces vertices and edges. It should be noted that the * direction of a loop cycle is either CW or CCW depending on the face normal, and is - * not oriented to the faces editedges. + * not oriented to the faces edit-edges. * * Functions relating to this cycle: * - bmesh_cycle_XXX family of functions. diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 920307b42a2..0de909b5556 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -235,7 +235,7 @@ typedef struct BoundVert { /** Is this boundvert the side of the custom profile's start. */ bool is_profile_start; char _pad[3]; - /** Length of seam starting from current boundvert to next boundvert with ccw ordering. */ + /** Length of seam starting from current boundvert to next boundvert with CCW ordering. */ int seam_len; /** Same as seam_len but defines length of sharp edges. */ int sharp_len; @@ -1961,7 +1961,7 @@ static bool make_unit_square_map(const float va[3], /** * Like make_unit_square_map, but this one makes a matrix that transforms the * (1,1,1) corner of a unit cube into an arbitrary corner with corner vert d - * and verts around it a, b, c (in ccw order, viewed from d normal dir). + * and verts around it a, b, c (in CCW order, viewed from d normal dir). * The matrix mat is calculated to map: * (1,0,0) -> va * (0,1,0) -> vb @@ -1969,9 +1969,9 @@ static bool make_unit_square_map(const float va[3], * (1,1,1) -> vd * We want M to make M*A=B where A has the left side above, as columns * and B has the right side as columns - both extended into homogeneous coords. - * So M = B*(Ainverse). Doing Ainverse by hand gives the code below. - * The cols of M are 1/2{va-vb+vc-vd}, 1/2{-va+vb-vc+vd}, 1/2{-va-vb+vc+vd}, - * and 1/2{va+vb+vc-vd} + * So `M = B*(Ainverse)`. Doing `Ainverse` by hand gives the code below. + * The cols of M are `1/2{va-vb+vc-vd}`, `1/2{-va+vb-vc+vd}`, `1/2{-va-vb+vc+vd}`, + * and `1/2{va+vb+vc-vd}` * and Blender matrices have cols at m[i][*]. */ static void make_unit_cube_map( @@ -6378,7 +6378,7 @@ static bool bev_rebuild_polygon(BMesh *bm, BevelParams *bp, BMFace *f) go_ccw = (e->fnext != f); } else { - go_ccw = true; /* Going ccw around bv to trace this corner. */ + go_ccw = true; /* Going CCW around bv to trace this corner. */ } } else if (eprev->prev == e) { @@ -7230,17 +7230,17 @@ static void set_profile_spacing(BevelParams *bp, ProfileSpacing *pro_spacing, bo * B * * - * where edges are A, B, and C, following a face around vertices a, b, c, d. - * th1 is angle abc and th2 is angle bcd; + * where edges are A, B, and C, following a face around vertices `a, b, c, d`. + * `th1` is angle `abc` and th2 is angle `bcd`; * and the argument `EdgeHalf eb` is B, going from b to c. * In general case, edge offset specs for A, B, C have - * the form ka*t, kb*t, kc*t where ka, kb, kc are some factors + * the form `ka*t`, `kb*t`, `kc*t` where `ka`, `kb`, `kc` are some factors * (may be 0) and t is the current bp->offset. * We want to calculate t at which the clone of B parallel * to it collapses. This can be calculated using trig. * Another case of geometry collision that can happen is * When B slides along A because A is un-beveled. - * Then it might collide with a. Similarly for B sliding along C. + * Then it might collide with a. Similarly for B sliding along C. */ static float geometry_collide_offset(BevelParams *bp, EdgeHalf *eb) { diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index fd40d38d238..fd31a11b0a8 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1706,7 +1706,7 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, if (draw_background) { /* HACK(fclem): In this case we need to make sure the final alpha is 1. * We use the blend mode to ensure that. A better way to fix that would - * be to do that in the colormanagmeent shader. */ + * be to do that in the color-management shader. */ GPU_offscreen_bind(ofs, false); GPU_clear_color(0.0f, 0.0f, 0.0f, 1.0f); /* Premult Alpha over black background. */ diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index a3052a919e7..eae16b2cb71 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -2744,7 +2744,7 @@ static int image_flip_exec(bContext *C, wmOperator *op) ED_image_undo_push_end(); - /* force GPU reupload, all image is invalid. */ + /* force GPU re-upload, all image is invalid. */ BKE_image_free_gputextures(ima); WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, ima); diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c index f63a5530555..e3a82b8bd72 100644 --- a/source/blender/editors/space_info/info_draw.c +++ b/source/blender/editors/space_info/info_draw.c @@ -56,7 +56,7 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, int shade = (tvc->iter_tmp % 2) ? 4 : -4; UI_GetThemeColorShade4ubv(bg_id, shade, bg); - /* Don't show icon on subsequent rows of multirow report. */ + /* Don't show icon on subsequent rows of multi-row report. */ *r_icon = (tvc->iter_char_begin != 0) ? ICON_NONE : UI_icon_from_report_type(report->type); int icon_fg_id = UI_text_colorid_from_report_type(report->type); diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c index 51859b6a555..c0a1579b0fd 100644 --- a/source/blender/editors/undo/memfile_undo.c +++ b/source/blender/editors/undo/memfile_undo.c @@ -314,7 +314,7 @@ struct MemFile *ED_undosys_stack_memfile_get_active(UndoStack *ustack) * If the last undo step is a memfile one, find the first #MemFileChunk matching given ID * (using its session UUID), and tag it as "changed in the future". * - * Since non-memfile undos cannot automatically set this flag in the previous step as done with + * Since non-memfile undoes cannot automatically set this flag in the previous step as done with * memfile ones, this has to be called manually by relevant undo code. * * \note Only current known case for this is undoing a switch from Object to Sculpt mode (see diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index c59fbbe1646..4f24975fafa 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -183,7 +183,7 @@ void ED_editors_exit(Main *bmain, bool do_undo_system) return; } - /* frees all editmode undos */ + /* Frees all edit-mode undoes. */ if (do_undo_system && G_MAIN->wm.first) { wmWindowManager *wm = G_MAIN->wm.first; /* normally we don't check for NULL undo stack, diff --git a/source/blender/makesdna/DNA_ID_enums.h b/source/blender/makesdna/DNA_ID_enums.h index c865c8ea973..04cbf51dd62 100644 --- a/source/blender/makesdna/DNA_ID_enums.h +++ b/source/blender/makesdna/DNA_ID_enums.h @@ -102,11 +102,11 @@ typedef enum ID_Type { /* Deprecated. */ #define ID_SCRN MAKE_ID2('S', 'N') -/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */ +/* NOTE: Fake IDs, needed for `g.sipo->blocktype` or outliner. */ #define ID_SEQ MAKE_ID2('S', 'Q') /* constraint */ #define ID_CO MAKE_ID2('C', 'O') -/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */ +/* pose (action channel, used to be ID_AC in code, so we keep code for backwards compatible). */ #define ID_PO MAKE_ID2('A', 'C') /* used in outliner... */ #define ID_NLA MAKE_ID2('N', 'L') diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index cad0d77607b..b0a942cd39e 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -1471,8 +1471,8 @@ static int rna_property_override_diff_propptr(Main *bmain, } } else { - /* We could also use is_diff_pointer, but then we potentially lose the gt/lt info - - * and don't think performances are critical here for now anyway... */ + /* We could also use is_diff_pointer, but then we potentially lose the greater-than/less-than + * info - and don't think performances are critical here for now anyway. */ return !RNA_struct_equals(bmain, propptr_a, propptr_b, mode); } } diff --git a/source/blender/render/intern/texture_image.c b/source/blender/render/intern/texture_image.c index 5614318afbb..0299315beaf 100644 --- a/source/blender/render/intern/texture_image.c +++ b/source/blender/render/intern/texture_image.c @@ -630,7 +630,7 @@ static void boxsample(ImBuf *ibuf, const short imapextend) { /* Sample box, performs clip. minx etc are in range 0.0 - 1.0 . - * Enlarge with antialiased edges of pixels. + * Enlarge with anti-aliased edges of pixels. * If variable 'imaprepeat' has been set, the * clipped-away parts are sampled as well. */ From 10f44a413573089e132a411aa003ea3d9d634059 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 9 Feb 2021 08:11:56 +0100 Subject: [PATCH 027/519] Fix versioning code of previous commit --- source/blender/blenloader/intern/versioning_290.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 2911bb6a7fc..60256359ea0 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1603,14 +1603,12 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) /* Keep this block, even when empty. */ /* UV/Image Max resolution images in image editor. */ - if (!DNA_struct_find(fd->filesdna, "SpaceImageOverlay")) { - LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { - if (space->spacetype == SPACE_IMAGE) { - SpaceImage *sima = (SpaceImage *)space; - sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; - } + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; } } } From 549d9f87276a20036372317b1f988c4d0ef8c40c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 8 Feb 2021 15:42:59 +0100 Subject: [PATCH 028/519] Fix T81206: Do not limit gl texture size in image editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch will show textures in the image editor with the maximum available resolution determined by the GPU Hardware/Driver. Currently the size is limited by the user preference texture size limit. An image user can set the `IMA_SHOW_MAX_RESOLUTION` flag to request gpu textures in the max supported resolution. When this flag isn't set the gpu texture is limited by the user preference setting. When the gl resolution limit is disabled the GPU texture is always created for the max supported resolution. Reviewed By: Clément Foucault Maniphest Tasks: T81206 Differential Revision: https://developer.blender.org/D9160 --- source/blender/blenkernel/intern/image_gpu.c | 38 +++++++++++++------ source/blender/blenkernel/intern/movieclip.c | 3 +- .../blenloader/intern/versioning_290.c | 14 +++++++ .../blender/editors/space_image/space_image.c | 2 +- source/blender/gpu/GPU_capabilities.h | 2 +- source/blender/gpu/intern/gpu_capabilities.cc | 5 ++- source/blender/imbuf/IMB_imbuf.h | 3 +- source/blender/imbuf/intern/util_gpu.c | 6 ++- source/blender/makesdna/DNA_image_types.h | 6 +++ 9 files changed, 59 insertions(+), 20 deletions(-) diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index a6bd65227a0..2ee4505acf0 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -86,15 +86,15 @@ bool BKE_image_has_gpu_texture_premultiplied_alpha(Image *image, ImBuf *ibuf) /* -------------------------------------------------------------------- */ /** \name UDIM gpu texture * \{ */ - -static bool is_over_resolution_limit(int w, int h) +static bool is_over_resolution_limit(int w, int h, bool limit_gl_texture_size) { - return (w > GPU_texture_size_with_limit(w) || h > GPU_texture_size_with_limit(h)); + return (w > GPU_texture_size_with_limit(w, limit_gl_texture_size) || + h > GPU_texture_size_with_limit(h, limit_gl_texture_size)); } -static int smaller_power_of_2_limit(int num) +static int smaller_power_of_2_limit(int num, bool limit_gl_texture_size) { - return power_of_2_min_i(GPU_texture_size_with_limit(num)); + return power_of_2_min_i(GPU_texture_size_with_limit(num, limit_gl_texture_size)); } static GPUTexture *gpu_texture_create_tile_mapping(Image *ima, const int multiview_eye) @@ -153,6 +153,7 @@ static int compare_packtile(const void *a, const void *b) static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) { + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; int arraywidth = 0, arrayheight = 0; ListBase boxes = {NULL}; @@ -168,9 +169,10 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) packtile->boxpack.w = ibuf->x; packtile->boxpack.h = ibuf->y; - if (is_over_resolution_limit(packtile->boxpack.w, packtile->boxpack.h)) { - packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w); - packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h); + if (is_over_resolution_limit( + packtile->boxpack.w, packtile->boxpack.h, limit_gl_texture_size)) { + packtile->boxpack.w = smaller_power_of_2_limit(packtile->boxpack.w, limit_gl_texture_size); + packtile->boxpack.h = smaller_power_of_2_limit(packtile->boxpack.h, limit_gl_texture_size); } arraywidth = max_ii(arraywidth, packtile->boxpack.w); arrayheight = max_ii(arrayheight, packtile->boxpack.h); @@ -312,18 +314,26 @@ static GPUTexture *image_get_gpu_texture(Image *ima, short requested_pass = iuser ? iuser->pass : 0; short requested_layer = iuser ? iuser->layer : 0; short requested_view = iuser ? iuser->multi_index : 0; + const bool limit_resolution = U.glreslimit != 0 && + ((iuser && (iuser->flag & IMA_SHOW_MAX_RESOLUTION) == 0) || + (iuser == NULL)); + short requested_gpu_flags = limit_resolution ? 0 : IMA_GPU_MAX_RESOLUTION; +#define GPU_FLAGS_TO_CHECK (IMA_GPU_MAX_RESOLUTION) /* There is room for 2 multiview textures. When a higher number is requested we should always * target the first view slot. This is fine as multi view images aren't used together. */ if (requested_view < 2) { requested_view = 0; } if (ima->gpu_pass != requested_pass || ima->gpu_layer != requested_layer || - ima->gpu_view != requested_view) { + ima->gpu_view != requested_view || + ((ima->gpuflag & GPU_FLAGS_TO_CHECK) != requested_gpu_flags)) { ima->gpu_pass = requested_pass; ima->gpu_layer = requested_layer; ima->gpu_view = requested_view; - ima->gpuflag |= IMA_GPU_REFRESH; + ima->gpuflag &= ~GPU_FLAGS_TO_CHECK; + ima->gpuflag |= requested_gpu_flags | IMA_GPU_REFRESH; } +#undef GPU_FLAGS_TO_CHECK /* Check if image has been updated and tagged to be updated (full or partial). */ ImageTile *tile = BKE_image_get_tile(ima, 0); @@ -390,9 +400,13 @@ static GPUTexture *image_get_gpu_texture(Image *ima, const bool use_high_bitdepth = (ima->flag & IMA_HIGH_BITDEPTH); const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, ibuf_intern); + const bool limit_gl_texture_size = (ima->gpuflag & IMA_GPU_MAX_RESOLUTION) == 0; - *tex = IMB_create_gpu_texture( - ima->id.name + 2, ibuf_intern, use_high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture(ima->id.name + 2, + ibuf_intern, + use_high_bitdepth, + store_premultiplied, + limit_gl_texture_size); GPU_texture_wrap_mode(*tex, true, false); diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 175caf85b49..c1ebd06465b 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -2114,7 +2114,8 @@ GPUTexture *BKE_movieclip_get_gpu_texture(MovieClip *clip, MovieClipUser *cuser) /* This only means RGBA16F instead of RGBA32F. */ const bool high_bitdepth = false; const bool store_premultiplied = ibuf->rect_float ? false : true; - *tex = IMB_create_gpu_texture(clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied); + *tex = IMB_create_gpu_texture( + clip->id.name + 2, ibuf, high_bitdepth, store_premultiplied, false); /* Do not generate mips for movieclips... too slow. */ GPU_texture_mipmap_mode(*tex, false, true); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index f39883bc50d..9835d3b6e15 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1671,5 +1671,19 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) */ { /* Keep this block, even when empty. */ + + /* UV/Image Max resolution images in image editor. */ + if (!DNA_struct_find(fd->filesdna, "SpaceImageOverlay")) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; + } + } + } + } + } } } diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 0dd99824dcd..d6939a9100f 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -131,7 +131,7 @@ static SpaceLink *image_create(const ScrArea *UNUSED(area), const Scene *UNUSED( simage->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS; BKE_imageuser_default(&simage->iuser); - simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS; + simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS | IMA_SHOW_MAX_RESOLUTION; BKE_scopes_new(&simage->scopes); simage->sample_line_hist.height = 100; diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h index e02fbaa6d04..b95053a3715 100644 --- a/source/blender/gpu/GPU_capabilities.h +++ b/source/blender/gpu/GPU_capabilities.h @@ -38,7 +38,7 @@ int GPU_max_textures_vert(void); int GPU_max_textures_geom(void); int GPU_max_textures_frag(void); -int GPU_texture_size_with_limit(int res); +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size); bool GPU_mip_render_workaround(void); bool GPU_depth_blitting_workaround(void); diff --git a/source/blender/gpu/intern/gpu_capabilities.cc b/source/blender/gpu/intern/gpu_capabilities.cc index 1d2b0e5c7a8..6d9182dcf17 100644 --- a/source/blender/gpu/intern/gpu_capabilities.cc +++ b/source/blender/gpu/intern/gpu_capabilities.cc @@ -49,10 +49,11 @@ int GPU_max_texture_size(void) return GCaps.max_texture_size; } -int GPU_texture_size_with_limit(int res) +int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size) { int size = GPU_max_texture_size(); - int reslimit = (U.glreslimit != 0) ? min_ii(U.glreslimit, size) : size; + int reslimit = (limit_gl_texture_size && (U.glreslimit != 0)) ? min_ii(U.glreslimit, size) : + size; return min_ii(reslimit, res); } diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 58ddc918f61..8866a8a8600 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -745,7 +745,8 @@ const char *IMB_ffmpeg_last_error(void); struct GPUTexture *IMB_create_gpu_texture(const char *name, struct ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult); + bool use_premult, + bool limit_gl_texture_size); struct GPUTexture *IMB_touch_gpu_texture( const char *name, struct ImBuf *ibuf, int w, int h, int layers, bool use_high_bitdepth); void IMB_update_gpu_texture_sub(struct GPUTexture *tex, diff --git a/source/blender/imbuf/intern/util_gpu.c b/source/blender/imbuf/intern/util_gpu.c index fc89de476a1..8bedf8eb93c 100644 --- a/source/blender/imbuf/intern/util_gpu.c +++ b/source/blender/imbuf/intern/util_gpu.c @@ -219,10 +219,12 @@ void IMB_update_gpu_texture_sub(GPUTexture *tex, GPUTexture *IMB_create_gpu_texture(const char *name, ImBuf *ibuf, bool use_high_bitdepth, - bool use_premult) + bool use_premult, + bool limit_gl_texture_size) { GPUTexture *tex = NULL; - int size[2] = {GPU_texture_size_with_limit(ibuf->x), GPU_texture_size_with_limit(ibuf->y)}; + int size[2] = {GPU_texture_size_with_limit(ibuf->x, limit_gl_texture_size), + GPU_texture_size_with_limit(ibuf->y, limit_gl_texture_size)}; bool do_rescale = (ibuf->x != size[0]) || (ibuf->y != size[1]); #ifdef WITH_DDS diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index b1d752d6197..22408687daf 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -119,6 +119,10 @@ typedef struct ImageTile { /* #define IMA_UNUSED_2 (1 << 2) */ #define IMA_NEED_FRAME_RECALC (1 << 3) #define IMA_SHOW_STEREO (1 << 4) +/* Do not limit the resolution by the limit texture size option in the user preferences. + * Images in the image editor or used as a backdrop are always shown using the maximum + * possible resolution. */ +#define IMA_SHOW_MAX_RESOLUTION (1 << 5) /* Used to get the correct gpu texture from an Image datablock. */ typedef enum eGPUTextureTarget { @@ -229,6 +233,8 @@ enum { IMA_GPU_PARTIAL_REFRESH = (1 << 1), /** All mipmap levels in OpenGL texture set? */ IMA_GPU_MIPMAP_COMPLETE = (1 << 2), + /** Current texture resolution won't be limited by the GL Texture Limit user preference. */ + IMA_GPU_MAX_RESOLUTION = (1 << 3), }; /* Image.source, where the image comes from */ From 4601e3a5916c7746ad29d20add91651929c6f621 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 9 Feb 2021 11:24:28 +0100 Subject: [PATCH 029/519] Geometry Nodes: refactor internal attribute access architecture Goals: * Clarify the distinction between builtin and other attributes at the code level. * Reduce number of places that need to be modified to add more builtin attributes. * Reduce number of virtual methods that need to be implemented by e.g. `MeshComponent`. To achieve these goals, this patch implements the concept of "attribute providers". An attribute provider knows how to give access to attributes on a geometry component. Each geometry component can have multiple attribute providers, whereby each provider manages an different set of attributes. The separation of builtin and other attributes is now done at the attribute provider level. There are two types of attribute providers. One for builtin attributes and one for all others. This refactor also helps with T84297. Differential Revision: https://developer.blender.org/D10341 --- source/blender/blenkernel/BKE_geometry_set.hh | 66 +- .../blenkernel/intern/attribute_access.cc | 1392 +++++++++++------ .../blender/blenkernel/intern/geometry_set.cc | 11 + 3 files changed, 940 insertions(+), 529 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 2bed1a36ed7..9a871574f6f 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -68,6 +68,10 @@ template<> struct DefaultHash { }; } // namespace blender +namespace blender::bke { +struct ComponentAttributeProviders; +} + class GeometryComponent; /** @@ -152,23 +156,18 @@ class GeometryComponent { bool attribute_exists(const blender::StringRef attribute_name) const; /* Returns true when the geometry component supports this attribute domain. */ - virtual bool attribute_domain_supported(const AttributeDomain domain) const; - /* Returns true when the given data type is supported in the given domain. */ - virtual bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const; + bool attribute_domain_supported(const AttributeDomain domain) const; /* Can only be used with supported domain types. */ virtual int attribute_domain_size(const AttributeDomain domain) const; - /* Attributes with these names cannot be created or removed via this api. */ - virtual bool attribute_is_builtin(const blender::StringRef attribute_name) const; /* Get read-only access to the highest priority attribute with the given name. * Returns null if the attribute does not exist. */ - virtual blender::bke::ReadAttributePtr attribute_try_get_for_read( + blender::bke::ReadAttributePtr attribute_try_get_for_read( const blender::StringRef attribute_name) const; /* Get read and write access to the highest priority attribute with the given name. * Returns null if the attribute does not exist. */ - virtual blender::bke::WriteAttributePtr attribute_try_get_for_write( + blender::bke::WriteAttributePtr attribute_try_get_for_write( const blender::StringRef attribute_name); /* Get a read-only attribute for the domain based on the given attribute. This can be used to @@ -178,14 +177,14 @@ class GeometryComponent { blender::bke::ReadAttributePtr attribute, const AttributeDomain domain) const; /* Returns true when the attribute has been deleted. */ - virtual bool attribute_try_delete(const blender::StringRef attribute_name); + bool attribute_try_delete(const blender::StringRef attribute_name); /* Returns true when the attribute has been created. */ - virtual bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type); + bool attribute_try_create(const blender::StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type); - virtual blender::Set attribute_names() const; + blender::Set attribute_names() const; virtual bool is_empty() const; /* Get a read-only attribute for the given domain and data type. @@ -257,6 +256,9 @@ class GeometryComponent { const AttributeDomain domain, const CustomDataType data_type, const void *default_value = nullptr); + + private: + virtual const blender::bke::ComponentAttributeProviders *get_attribute_providers() const; }; template @@ -359,30 +361,20 @@ class MeshComponent : public GeometryComponent { Mesh *release(); void copy_vertex_group_names_from_object(const struct Object &object); + const blender::Map &vertex_group_names() const; + blender::Map &vertex_group_names(); const Mesh *get_for_read() const; Mesh *get_for_write(); - bool attribute_domain_supported(const AttributeDomain domain) const final; - bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const final; int attribute_domain_size(const AttributeDomain domain) const final; - bool attribute_is_builtin(const blender::StringRef attribute_name) const final; - blender::bke::ReadAttributePtr attribute_try_get_for_read( - const blender::StringRef attribute_name) const final; - blender::bke::WriteAttributePtr attribute_try_get_for_write( - const blender::StringRef attribute_name) final; - - bool attribute_try_delete(const blender::StringRef attribute_name) final; - bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) final; - - blender::Set attribute_names() const final; bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::Mesh; + + private: + const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final; }; /** A geometry component that stores a point cloud. */ @@ -405,26 +397,14 @@ class PointCloudComponent : public GeometryComponent { const PointCloud *get_for_read() const; PointCloud *get_for_write(); - bool attribute_domain_supported(const AttributeDomain domain) const final; - bool attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const final; int attribute_domain_size(const AttributeDomain domain) const final; - bool attribute_is_builtin(const blender::StringRef attribute_name) const final; - blender::bke::ReadAttributePtr attribute_try_get_for_read( - const blender::StringRef attribute_name) const final; - blender::bke::WriteAttributePtr attribute_try_get_for_write( - const blender::StringRef attribute_name) final; - - bool attribute_try_delete(const blender::StringRef attribute_name) final; - bool attribute_try_create(const blender::StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) final; - - blender::Set attribute_names() const final; bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::PointCloud; + + private: + const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final; }; /** A geometry component that stores instances. */ diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 85dabe4490c..772309349ff 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -323,29 +323,24 @@ template class ArrayReadAttribute final : public ReadAttribute { } }; -template +template class DerivedArrayWriteAttribute final : public WriteAttribute { private: MutableSpan data_; - GetFuncT get_function_; - SetFuncT set_function_; public: - DerivedArrayWriteAttribute(AttributeDomain domain, - MutableSpan data, - GetFuncT get_function, - SetFuncT set_function) - : WriteAttribute(domain, CPPType::get(), data.size()), - data_(data), - get_function_(std::move(get_function)), - set_function_(std::move(set_function)) + DerivedArrayWriteAttribute(AttributeDomain domain, MutableSpan data) + : WriteAttribute(domain, CPPType::get(), data.size()), data_(data) { } void get_internal(const int64_t index, void *r_value) const override { const StructT &struct_value = data_[index]; - const ElemT value = get_function_(struct_value); + const ElemT value = GetFunc(struct_value); new (r_value) ElemT(value); } @@ -353,28 +348,25 @@ class DerivedArrayWriteAttribute final : public WriteAttribute { { StructT &struct_value = data_[index]; const ElemT &typed_value = *reinterpret_cast(value); - set_function_(struct_value, typed_value); + SetFunc(struct_value, typed_value); } }; -template +template class DerivedArrayReadAttribute final : public ReadAttribute { private: Span data_; - GetFuncT get_function_; public: - DerivedArrayReadAttribute(AttributeDomain domain, Span data, GetFuncT get_function) - : ReadAttribute(domain, CPPType::get(), data.size()), - data_(data), - get_function_(std::move(get_function)) + DerivedArrayReadAttribute(AttributeDomain domain, Span data) + : ReadAttribute(domain, CPPType::get(), data.size()), data_(data) { } void get_internal(const int64_t index, void *r_value) const override { const StructT &struct_value = data_[index]; - const ElemT value = get_function_(struct_value); + const ElemT value = GetFunc(struct_value); new (r_value) ElemT(value); } }; @@ -492,144 +484,835 @@ CustomDataType cpp_type_to_custom_data_type(const blender::fn::CPPType &type) return static_cast(-1); } -} // namespace blender::bke +/** + * A #BuiltinAttributeProvider is responsible for exactly one attribute on a geometry component. + * The attribute is identified by its name and has a fixed domain and type. Builtin attributes do + * not follow the same loose rules as other attributes, because they are mapped to internal + * "legacy" data structures. For example, some builtin attributes cannot be deleted. */ +class BuiltinAttributeProvider { + public: + /* Some utility enums to avoid hard to read bools in function calls. */ + enum CreatableEnum { + Creatable, + NonCreatable, + }; + enum WritableEnum { + Writable, + Readonly, + }; + enum DeletableEnum { + Deletable, + NonDeletable, + }; -/* -------------------------------------------------------------------- */ -/** \name Utilities for Accessing Attributes - * \{ */ + protected: + const std::string name_; + const AttributeDomain domain_; + const CustomDataType data_type_; + const CreatableEnum createable_; + const WritableEnum writable_; + const DeletableEnum deletable_; -static ReadAttributePtr read_attribute_from_custom_data(const CustomData &custom_data, - const int size, - const StringRef attribute_name, - const AttributeDomain domain) -{ - using namespace blender; - using namespace blender::bke; - for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name != nullptr && layer.name == attribute_name) { - switch (layer.type) { + public: + BuiltinAttributeProvider(std::string name, + const AttributeDomain domain, + const CustomDataType data_type, + const CreatableEnum createable, + const WritableEnum writable, + const DeletableEnum deletable) + : name_(std::move(name)), + domain_(domain), + data_type_(data_type), + createable_(createable), + writable_(writable), + deletable_(deletable) + { + } + + virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component) const = 0; + virtual WriteAttributePtr try_get_for_write(GeometryComponent &component) const = 0; + virtual bool try_delete(GeometryComponent &component) const = 0; + virtual bool try_create(GeometryComponent &UNUSED(component)) const = 0; + virtual bool exists(const GeometryComponent &component) const = 0; + + StringRefNull name() const + { + return name_; + } + + AttributeDomain domain() const + { + return domain_; + } + + CustomDataType data_type() const + { + return data_type_; + } +}; + +/** + * A #DynamicAttributesProvider manages a set of named attributes on a geometry component. Each + * attribute has a name, domain and type. + */ +class DynamicAttributesProvider { + public: + virtual ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const = 0; + virtual WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const = 0; + virtual bool try_delete(GeometryComponent &component, const StringRef attribute_name) const = 0; + virtual bool try_create(GeometryComponent &UNUSED(component), + const StringRef UNUSED(attribute_name), + const AttributeDomain UNUSED(domain), + const CustomDataType UNUSED(data_type)) const + { + /* Some providers should not create new attributes. */ + return false; + }; + + virtual void list(const GeometryComponent &component, Set &r_names) const = 0; + virtual void supported_domains(Vector &r_domains) const = 0; +}; + +/** + * Utility to group together multiple functions that are used to access custom data on geometry + * components in a generic way. + */ +struct CustomDataAccessInfo { + using CustomDataGetter = CustomData *(*)(GeometryComponent &component); + using ConstCustomDataGetter = const CustomData *(*)(const GeometryComponent &component); + using UpdateCustomDataPointers = void (*)(GeometryComponent &component); + + CustomDataGetter get_custom_data; + ConstCustomDataGetter get_const_custom_data; + UpdateCustomDataPointers update_custom_data_pointers; +}; + +/** + * This provider is used to provide access to builtin attributes. It supports making internal types + * available as different types. For example, the vertex position attribute is stored as part of + * the #MVert struct, but is exposed as float3 attribute. + */ +class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { + using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); + using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); + const CustomDataType stored_type_; + const CustomDataAccessInfo custom_data_access_; + const AsReadAttribute as_read_attribute_; + const AsWriteAttribute as_write_attribute_; + + public: + BuiltinCustomDataLayerProvider(std::string attribute_name, + const AttributeDomain domain, + const CustomDataType attribute_type, + const CustomDataType stored_type, + const CreatableEnum creatable, + const WritableEnum writable, + const DeletableEnum deletable, + const CustomDataAccessInfo custom_data_access, + const AsReadAttribute as_read_attribute, + const AsWriteAttribute as_write_attribute) + : BuiltinAttributeProvider( + std::move(attribute_name), domain, attribute_type, creatable, writable, deletable), + stored_type_(stored_type), + custom_data_access_(custom_data_access), + as_read_attribute_(as_read_attribute), + as_write_attribute_(as_write_attribute) + { + } + + ReadAttributePtr try_get_for_read(const GeometryComponent &component) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + const void *data = CustomData_get_layer(custom_data, stored_type_); + if (data == nullptr) { + return {}; + } + return as_read_attribute_(data, domain_size); + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component) const final + { + if (writable_ != Writable) { + return {}; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + void *data = CustomData_get_layer(custom_data, stored_type_); + if (data == nullptr) { + return {}; + } + void *new_data = CustomData_duplicate_referenced_layer(custom_data, stored_type_, domain_size); + if (data != new_data) { + custom_data_access_.update_custom_data_pointers(component); + data = new_data; + } + return as_write_attribute_(data, domain_size); + } + + bool try_delete(GeometryComponent &component) const final + { + if (deletable_ != Deletable) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + + const int domain_size = component.attribute_domain_size(domain_); + const int layer_index = CustomData_get_layer_index(custom_data, stored_type_); + const bool delete_success = CustomData_free_layer( + custom_data, stored_type_, domain_size, layer_index); + if (delete_success) { + custom_data_access_.update_custom_data_pointers(component); + } + return delete_success; + } + + bool try_create(GeometryComponent &component) const final + { + if (createable_ != Creatable) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + if (CustomData_get_layer(custom_data, stored_type_) != nullptr) { + /* Exists already. */ + return false; + } + const int domain_size = component.attribute_domain_size(domain_); + const void *data = CustomData_add_layer( + custom_data, stored_type_, CD_DEFAULT, nullptr, domain_size); + const bool success = data != nullptr; + if (success) { + custom_data_access_.update_custom_data_pointers(component); + } + return success; + } + + bool exists(const GeometryComponent &component) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return false; + } + const void *data = CustomData_get_layer(custom_data, data_type_); + return data != nullptr; + } +}; + +/** + * This is the attribute provider for most user generated attributes. + */ +class CustomDataAttributeProvider final : public DynamicAttributesProvider { + private: + static constexpr uint64_t supported_types_mask = CD_MASK_PROP_FLOAT | CD_MASK_PROP_FLOAT2 | + CD_MASK_PROP_FLOAT3 | CD_MASK_PROP_INT32 | + CD_MASK_PROP_COLOR | CD_MASK_PROP_BOOL; + const AttributeDomain domain_; + const CustomDataAccessInfo custom_data_access_; + + public: + CustomDataAttributeProvider(const AttributeDomain domain, + const CustomDataAccessInfo custom_data_access) + : domain_(domain), custom_data_access_(custom_data_access) + { + } + + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.name != attribute_name) { + continue; + } + const CustomDataType data_type = (CustomDataType)layer.type; + switch (data_type) { case CD_PROP_FLOAT: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); + return this->layer_to_read_attribute(layer, domain_size); case CD_PROP_FLOAT2: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); + return this->layer_to_read_attribute(layer, domain_size); case CD_PROP_FLOAT3: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); + return this->layer_to_read_attribute(layer, domain_size); case CD_PROP_INT32: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); + return this->layer_to_read_attribute(layer, domain_size); case CD_PROP_COLOR: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); + return this->layer_to_read_attribute(layer, domain_size); case CD_PROP_BOOL: - return std::make_unique>( - domain, Span(static_cast(layer.data), size)); - case CD_MLOOPUV: - auto get_uv = [](const MLoopUV &uv) { return float2(uv.uv); }; - return std::make_unique>( - domain, Span(static_cast(layer.data), size), get_uv); + return this->layer_to_read_attribute(layer, domain_size); + default: + break; + } + } + return {}; + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return {}; + } + const int domain_size = component.attribute_domain_size(domain_); + for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) { + if (layer.name != attribute_name) { + continue; + } + CustomData_duplicate_referenced_layer_named( + custom_data, layer.type, layer.name, domain_size); + const CustomDataType data_type = (CustomDataType)layer.type; + switch (data_type) { + case CD_PROP_FLOAT: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_FLOAT2: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_FLOAT3: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_INT32: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_COLOR: + return this->layer_to_write_attribute(layer, domain_size); + case CD_PROP_BOOL: + return this->layer_to_write_attribute(layer, domain_size); + default: + break; + } + } + return {}; + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + const int domain_size = component.attribute_domain_size(domain_); + for (const int i : IndexRange(custom_data->totlayer)) { + const CustomDataLayer &layer = custom_data->layers[i]; + if (this->type_is_supported((CustomDataType)layer.type) && layer.name == attribute_name) { + CustomData_free_layer(custom_data, layer.type, domain_size, i); + return true; + } + } + return false; + } + + bool try_create(GeometryComponent &component, + const StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type) const final + { + if (domain_ != domain) { + return false; + } + if (!this->type_is_supported(data_type)) { + return false; + } + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { + return false; + } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.name == attribute_name) { + return false; + } + } + const int domain_size = component.attribute_domain_size(domain_); + char attribute_name_c[MAX_NAME]; + attribute_name.copy(attribute_name_c); + CustomData_add_layer_named( + custom_data, data_type, CD_DEFAULT, nullptr, domain_size, attribute_name_c); + return true; + } + + void list(const GeometryComponent &component, Set &r_names) const final + { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { + return; + } + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (this->type_is_supported((CustomDataType)layer.type)) { + r_names.add(layer.name); } } } - return {}; + + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(domain_); + } + + private: + template + ReadAttributePtr layer_to_read_attribute(const CustomDataLayer &layer, + const int domain_size) const + { + return std::make_unique>( + domain_, Span(static_cast(layer.data), domain_size)); + } + + template + WriteAttributePtr layer_to_write_attribute(CustomDataLayer &layer, const int domain_size) const + { + return std::make_unique>( + domain_, MutableSpan(static_cast(layer.data), domain_size)); + } + + bool type_is_supported(CustomDataType data_type) const + { + return ((1ULL << data_type) & supported_types_mask) != 0; + } +}; + +static Mesh *get_mesh_from_component_for_write(GeometryComponent &component) +{ + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + return mesh_component.get_for_write(); } -static WriteAttributePtr write_attribute_from_custom_data( - CustomData &custom_data, - const int size, - const StringRef attribute_name, - const AttributeDomain domain, - const std::function &update_customdata_pointers) +static const Mesh *get_mesh_from_component_for_read(const GeometryComponent &component) { + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + return mesh_component.get_for_read(); +} - using namespace blender; - using namespace blender::bke; - for (const CustomDataLayer &layer : Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name != nullptr && layer.name == attribute_name) { - const void *data_before = layer.data; - /* The data layer might be shared with someone else. Since the caller wants to modify it, we - * copy it first. */ - CustomData_duplicate_referenced_layer_named(&custom_data, layer.type, layer.name, size); - if (data_before != layer.data) { - update_customdata_pointers(); +/** + * This attribute provider makes uv maps available as float2 attributes. + */ +class MeshUVsAttributeProvider final : public DynamicAttributesProvider { + public: + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + const Mesh *mesh = get_mesh_from_component_for_read(component); + if (mesh == nullptr) { + return {}; + } + for (const CustomDataLayer &layer : Span(mesh->ldata.layers, mesh->ldata.totlayer)) { + if (layer.type == CD_MLOOPUV) { + if (layer.name == attribute_name) { + return std::make_unique>( + ATTR_DOMAIN_CORNER, Span(static_cast(layer.data), mesh->totloop)); + } } - switch (layer.type) { - case CD_PROP_FLOAT: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_FLOAT2: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_FLOAT3: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_INT32: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_COLOR: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_PROP_BOOL: - return std::make_unique>( - domain, MutableSpan(static_cast(layer.data), size)); - case CD_MLOOPUV: - auto get_uv = [](const MLoopUV &uv) { return float2(uv.uv); }; - auto set_uv = [](MLoopUV &uv, const float2 value) { copy_v2_v2(uv.uv, value); }; + } + return {}; + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh == nullptr) { + return {}; + } + for (CustomDataLayer &layer : MutableSpan(mesh->ldata.layers, mesh->ldata.totlayer)) { + if (layer.type == CD_MLOOPUV) { + if (layer.name == attribute_name) { + void *data_old = layer.data; + void *data_new = CustomData_duplicate_referenced_layer_named( + &mesh->ldata, CD_MLOOPUV, layer.name, mesh->totloop); + if (data_old != data_new) { + BKE_mesh_update_customdata_pointers(mesh, false); + } return std::make_unique< - DerivedArrayWriteAttribute>( - domain, MutableSpan(static_cast(layer.data), size), get_uv, set_uv); + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_CORNER, MutableSpan(static_cast(layer.data), mesh->totloop)); + } + } + } + return {}; + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh == nullptr) { + return false; + } + for (const int i : IndexRange(mesh->ldata.totlayer)) { + const CustomDataLayer &layer = mesh->ldata.layers[i]; + if (layer.type == CD_MLOOPUV && layer.name == attribute_name) { + CustomData_free_layer(&mesh->ldata, CD_MLOOPUV, mesh->totloop, i); + return true; + } + } + return false; + } + + void list(const GeometryComponent &component, Set &r_names) const final + { + const Mesh *mesh = get_mesh_from_component_for_read(component); + if (mesh == nullptr) { + return; + } + for (const CustomDataLayer &layer : Span(mesh->ldata.layers, mesh->ldata.totlayer)) { + if (layer.type == CD_MLOOPUV) { + r_names.add(layer.name); } } } - return {}; -} -/* Returns true when the layer was found and is deleted. */ -static bool delete_named_custom_data_layer(CustomData &custom_data, - const StringRef attribute_name, - const int size) -{ - for (const int index : blender::IndexRange(custom_data.totlayer)) { - const CustomDataLayer &layer = custom_data.layers[index]; - if (layer.name == attribute_name) { - CustomData_free_layer(&custom_data, layer.type, size, index); + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(ATTR_DOMAIN_CORNER); + } + + private: + static float2 get_loop_uv(const MLoopUV &uv) + { + return float2(uv.uv); + } + + static void set_loop_uv(MLoopUV &uv, const float2 &co) + { + copy_v2_v2(uv.uv, co); + } +}; + +/** + * This provider makes vertex groups available as float attributes. + */ +class VertexGroupsAttributeProvider final : public DynamicAttributesProvider { + public: + ReadAttributePtr try_get_for_read(const GeometryComponent &component, + const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + const Mesh *mesh = mesh_component.get_for_read(); + const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return {}; + } + if (mesh == nullptr || mesh->dvert == nullptr) { + static const float default_value = 0.0f; + return std::make_unique( + ATTR_DOMAIN_POINT, mesh->totvert, CPPType::get(), &default_value); + } + return std::make_unique( + mesh->dvert, mesh->totvert, vertex_group_index); + } + + WriteAttributePtr try_get_for_write(GeometryComponent &component, + const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + Mesh *mesh = mesh_component.get_for_write(); + if (mesh == nullptr) { + return {}; + } + const int vertex_group_index = mesh_component.vertex_group_names().lookup_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return {}; + } + if (mesh->dvert == nullptr) { + BKE_object_defgroup_data_create(&mesh->id); + } + else { + /* Copy the data layer if it is shared with some other mesh. */ + mesh->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer( + &mesh->vdata, CD_MDEFORMVERT, mesh->totvert); + } + return std::make_unique( + mesh->dvert, mesh->totvert, vertex_group_index); + } + + bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + MeshComponent &mesh_component = static_cast(component); + + const int vertex_group_index = mesh_component.vertex_group_names().pop_default_as( + attribute_name, -1); + if (vertex_group_index < 0) { + return false; + } + Mesh *mesh = mesh_component.get_for_write(); + if (mesh == nullptr) { return true; } + if (mesh->dvert == nullptr) { + return true; + } + for (MDeformVert &dvert : MutableSpan(mesh->dvert, mesh->totvert)) { + MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index); + BKE_defvert_remove_group(&dvert, weight); + } + return true; } - return false; -} -static void get_custom_data_layer_attribute_names(const CustomData &custom_data, - const GeometryComponent &component, - const AttributeDomain domain, - Set &r_names) -{ - for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) { - const CustomDataType data_type = static_cast(layer.type); - if (component.attribute_domain_with_type_supported(domain, data_type) || - ELEM(data_type, CD_MLOOPUV)) { - r_names.add(layer.name); + void list(const GeometryComponent &component, Set &r_names) const final + { + BLI_assert(component.type() == GeometryComponentType::Mesh); + const MeshComponent &mesh_component = static_cast(component); + mesh_component.vertex_group_names().foreach_item( + [&](StringRef name, const int vertex_group_index) { + if (vertex_group_index >= 0) { + r_names.add(name); + } + }); + } + + void supported_domains(Vector &r_domains) const final + { + r_domains.append_non_duplicates(ATTR_DOMAIN_POINT); + } +}; + +/** + * This is a container for multiple attribute providers that are used by one geometry component + * type (e.g. there is a set of attribute providers for mesh components). + */ +class ComponentAttributeProviders { + private: + /** + * Builtin attribute providers are identified by their name. Attribute names that are in this + * map will only be accessed using builtin attribute providers. Therefore, these providers have + * higher priority when an attribute name is looked up. Usually, that means that builtin + * providers are checked before dynamic ones. + */ + Map builtin_attribute_providers_; + /** + * An ordered list of dynamic attribute providers. The order is important because that is order + * in which they are checked when an attribute is looked up. + */ + Vector dynamic_attribute_providers_; + /** + * All the domains that are supported by at least one of the providers above. + */ + Vector supported_domains_; + + public: + ComponentAttributeProviders(Span builtin_attribute_providers, + Span dynamic_attribute_providers) + : dynamic_attribute_providers_(dynamic_attribute_providers) + { + Set domains; + for (const BuiltinAttributeProvider *provider : builtin_attribute_providers) { + /* Use #add_new to make sure that no two builtin attributes have the same name. */ + builtin_attribute_providers_.add_new(provider->name(), provider); + supported_domains_.append_non_duplicates(provider->domain()); + } + for (const DynamicAttributesProvider *provider : dynamic_attribute_providers) { + provider->supported_domains(supported_domains_); } } + + const Map &builtin_attribute_providers() const + { + return builtin_attribute_providers_; + } + + Span dynamic_attribute_providers() const + { + return dynamic_attribute_providers_; + } + + Span supported_domains() const + { + return supported_domains_; + } +}; + +static float3 get_vertex_position(const MVert &vert) +{ + return float3(vert.co); } -/** \} */ +static void set_vertex_position(MVert &vert, const float3 &position) +{ + copy_v3_v3(vert.co, position); +} + +static ReadAttributePtr make_vertex_position_read_attribute(const void *data, + const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_POINT, Span((const MVert *)data, domain_size)); +} + +static WriteAttributePtr make_vertex_position_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_POINT, MutableSpan((MVert *)data, domain_size)); +} + +template +static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>(Domain, Span((const T *)data, domain_size)); +} + +template +static WriteAttributePtr make_array_write_attribute(void *data, const int domain_size) +{ + return std::make_unique>(Domain, MutableSpan((T *)data, domain_size)); +} + +/** + * In this function all the attribute providers for a mesh component are created. Most data in this + * function is statically allocated, because it does not change over time. + */ +static ComponentAttributeProviders create_attribute_providers_for_mesh() +{ + static auto update_custom_data_pointers = [](GeometryComponent &component) { + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh != nullptr) { + BKE_mesh_update_customdata_pointers(mesh, false); + } + }; + +#define MAKE_MUTABLE_CUSTOM_DATA_GETTER(NAME) \ + [](GeometryComponent &component) -> CustomData * { \ + Mesh *mesh = get_mesh_from_component_for_write(component); \ + return mesh ? &mesh->NAME : nullptr; \ + } +#define MAKE_CONST_CUSTOM_DATA_GETTER(NAME) \ + [](const GeometryComponent &component) -> const CustomData * { \ + const Mesh *mesh = get_mesh_from_component_for_read(component); \ + return mesh ? &mesh->NAME : nullptr; \ + } + + static CustomDataAccessInfo corner_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(ldata), + MAKE_CONST_CUSTOM_DATA_GETTER(ldata), + update_custom_data_pointers}; + static CustomDataAccessInfo point_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(vdata), + MAKE_CONST_CUSTOM_DATA_GETTER(vdata), + update_custom_data_pointers}; + static CustomDataAccessInfo edge_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(edata), + MAKE_CONST_CUSTOM_DATA_GETTER(edata), + update_custom_data_pointers}; + static CustomDataAccessInfo polygon_access = {MAKE_MUTABLE_CUSTOM_DATA_GETTER(pdata), + MAKE_CONST_CUSTOM_DATA_GETTER(pdata), + update_custom_data_pointers}; + +#undef MAKE_CONST_CUSTOM_DATA_GETTER +#undef MAKE_MUTABLE_CUSTOM_DATA_GETTER + + static BuiltinCustomDataLayerProvider position("position", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT3, + CD_MVERT, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + point_access, + make_vertex_position_read_attribute, + make_vertex_position_write_attribute); + static MeshUVsAttributeProvider uvs; + static VertexGroupsAttributeProvider vertex_groups; + static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access); + static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); + static CustomDataAttributeProvider edge_custom_data(ATTR_DOMAIN_EDGE, edge_access); + static CustomDataAttributeProvider polygon_custom_data(ATTR_DOMAIN_POLYGON, polygon_access); + + return ComponentAttributeProviders({&position}, + {&uvs, + &corner_custom_data, + &vertex_groups, + &point_custom_data, + &edge_custom_data, + &polygon_custom_data}); +} + +/** + * In this function all the attribute providers for a point cloud component are created. Most data + * in this function is statically allocated, because it does not change over time. + */ +static ComponentAttributeProviders create_attribute_providers_for_point_cloud() +{ + static auto update_custom_data_pointers = [](GeometryComponent &component) { + PointCloudComponent &pointcloud_component = static_cast(component); + PointCloud *pointcloud = pointcloud_component.get_for_write(); + if (pointcloud != nullptr) { + BKE_pointcloud_update_customdata_pointers(pointcloud); + } + }; + static CustomDataAccessInfo point_access = { + [](GeometryComponent &component) -> CustomData * { + PointCloudComponent &pointcloud_component = static_cast(component); + PointCloud *pointcloud = pointcloud_component.get_for_write(); + return pointcloud ? &pointcloud->pdata : nullptr; + }, + [](const GeometryComponent &component) -> const CustomData * { + const PointCloudComponent &pointcloud_component = static_cast( + component); + const PointCloud *pointcloud = pointcloud_component.get_for_read(); + return pointcloud ? &pointcloud->pdata : nullptr; + }, + update_custom_data_pointers}; + + static BuiltinCustomDataLayerProvider position( + "position", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT3, + CD_PROP_FLOAT3, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + point_access, + make_array_read_attribute, + make_array_write_attribute); + static BuiltinCustomDataLayerProvider radius( + "radius", + ATTR_DOMAIN_POINT, + CD_PROP_FLOAT, + CD_PROP_FLOAT, + BuiltinAttributeProvider::Creatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::Deletable, + point_access, + make_array_read_attribute, + make_array_write_attribute); + static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); + return ComponentAttributeProviders({&position, &radius}, {&point_custom_data}); +} + +} // namespace blender::bke /* -------------------------------------------------------------------- */ /** \name Geometry Component * \{ */ -bool GeometryComponent::attribute_domain_supported(const AttributeDomain UNUSED(domain)) const +const blender::bke::ComponentAttributeProviders *GeometryComponent::get_attribute_providers() const { - return false; + return nullptr; } -bool GeometryComponent::attribute_domain_with_type_supported( - const AttributeDomain UNUSED(domain), const CustomDataType UNUSED(data_type)) const +bool GeometryComponent::attribute_domain_supported(const AttributeDomain domain) const { - return false; + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return false; + } + return providers->supported_domains().contains(domain); } int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain)) const @@ -638,14 +1321,26 @@ int GeometryComponent::attribute_domain_size(const AttributeDomain UNUSED(domain return 0; } -bool GeometryComponent::attribute_is_builtin(const StringRef UNUSED(attribute_name)) const -{ - return true; -} - ReadAttributePtr GeometryComponent::attribute_try_get_for_read( - const StringRef UNUSED(attribute_name)) const + const StringRef attribute_name) const { + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_get_for_read(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + ReadAttributePtr attribute = dynamic_provider->try_get_for_read(*this, attribute_name); + if (attribute) { + return attribute; + } + } return {}; } @@ -658,27 +1353,95 @@ ReadAttributePtr GeometryComponent::attribute_try_adapt_domain(ReadAttributePtr return {}; } -WriteAttributePtr GeometryComponent::attribute_try_get_for_write( - const StringRef UNUSED(attribute_name)) +WriteAttributePtr GeometryComponent::attribute_try_get_for_write(const StringRef attribute_name) { + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_get_for_write(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + WriteAttributePtr attribute = dynamic_provider->try_get_for_write(*this, attribute_name); + if (attribute) { + return attribute; + } + } return {}; } -bool GeometryComponent::attribute_try_delete(const StringRef UNUSED(attribute_name)) +bool GeometryComponent::attribute_try_delete(const StringRef attribute_name) { - return false; + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + return builtin_provider->try_delete(*this); + } + bool success = false; + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + success = dynamic_provider->try_delete(*this, attribute_name) || success; + } + return success; } -bool GeometryComponent::attribute_try_create(const StringRef UNUSED(attribute_name), - const AttributeDomain UNUSED(domain), - const CustomDataType UNUSED(data_type)) +bool GeometryComponent::attribute_try_create(const StringRef attribute_name, + const AttributeDomain domain, + const CustomDataType data_type) { + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + const BuiltinAttributeProvider *builtin_provider = + providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); + if (builtin_provider != nullptr) { + if (builtin_provider->domain() != domain) { + return false; + } + if (builtin_provider->data_type() != data_type) { + return false; + } + return builtin_provider->try_create(*this); + } + for (const DynamicAttributesProvider *dynamic_provider : + providers->dynamic_attribute_providers()) { + if (dynamic_provider->try_create(*this, attribute_name, domain, data_type)) { + return true; + } + } return false; } Set GeometryComponent::attribute_names() const { - return {}; + using namespace blender::bke; + const ComponentAttributeProviders *providers = this->get_attribute_providers(); + if (providers == nullptr) { + return {}; + } + Set names; + for (const BuiltinAttributeProvider *provider : + providers->builtin_attribute_providers().values()) { + if (provider->exists(*this)) { + names.add_new(provider->name()); + } + } + for (const DynamicAttributesProvider *provider : providers->dynamic_attribute_providers()) { + provider->list(*this, names); + } + return names; } bool GeometryComponent::attribute_exists(const blender::StringRef attribute_name) const @@ -712,10 +1475,6 @@ ReadAttributePtr GeometryComponent::attribute_try_get_for_read( const AttributeDomain domain, const CustomDataType data_type) const { - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return {}; - } - ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name); if (!attribute) { return {}; @@ -767,8 +1526,6 @@ ReadAttributePtr GeometryComponent::attribute_get_for_read(const StringRef attri const CustomDataType data_type, const void *default_value) const { - BLI_assert(this->attribute_domain_with_type_supported(domain, data_type)); - ReadAttributePtr attribute = this->attribute_try_get_for_read(attribute_name, domain, data_type); if (attribute) { return attribute; @@ -828,8 +1585,6 @@ OutputAttributePtr GeometryComponent::attribute_try_get_for_output(const StringR const CustomDataType data_type, const void *default_value) { - BLI_assert(this->attribute_domain_with_type_supported(domain, data_type)); - const blender::fn::CPPType *cpp_type = blender::bke::custom_data_type_to_cpp_type(data_type); BLI_assert(cpp_type != nullptr); @@ -957,21 +1712,12 @@ void OutputAttributePtr::apply_span_and_save() /** \name Point Cloud Component * \{ */ -bool PointCloudComponent::attribute_domain_supported(const AttributeDomain domain) const +const blender::bke::ComponentAttributeProviders *PointCloudComponent::get_attribute_providers() + const { - return domain == ATTR_DOMAIN_POINT; -} - -bool PointCloudComponent::attribute_domain_with_type_supported( - const AttributeDomain domain, const CustomDataType data_type) const -{ - return domain == ATTR_DOMAIN_POINT && ELEM(data_type, - CD_PROP_BOOL, - CD_PROP_FLOAT, - CD_PROP_FLOAT2, - CD_PROP_FLOAT3, - CD_PROP_INT32, - CD_PROP_COLOR); + static blender::bke::ComponentAttributeProviders providers = + blender::bke::create_attribute_providers_for_point_cloud(); + return &providers; } int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) const @@ -984,119 +1730,17 @@ int PointCloudComponent::attribute_domain_size(const AttributeDomain domain) con return pointcloud_->totpoint; } -bool PointCloudComponent::attribute_is_builtin(const StringRef attribute_name) const -{ - return attribute_name == "position"; -} - -ReadAttributePtr PointCloudComponent::attribute_try_get_for_read( - const StringRef attribute_name) const -{ - if (pointcloud_ == nullptr) { - return {}; - } - - return read_attribute_from_custom_data( - pointcloud_->pdata, pointcloud_->totpoint, attribute_name, ATTR_DOMAIN_POINT); -} - -WriteAttributePtr PointCloudComponent::attribute_try_get_for_write(const StringRef attribute_name) -{ - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return {}; - } - - return write_attribute_from_custom_data( - pointcloud->pdata, pointcloud->totpoint, attribute_name, ATTR_DOMAIN_POINT, [&]() { - BKE_pointcloud_update_customdata_pointers(pointcloud); - }); -} - -bool PointCloudComponent::attribute_try_delete(const StringRef attribute_name) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return false; - } - delete_named_custom_data_layer(pointcloud->pdata, attribute_name, pointcloud->totpoint); - return true; -} - -static bool custom_data_has_layer_with_name(const CustomData &custom_data, const StringRef name) -{ - for (const CustomDataLayer &layer : blender::Span(custom_data.layers, custom_data.totlayer)) { - if (layer.name == name) { - return true; - } - } - return false; -} - -bool PointCloudComponent::attribute_try_create(const StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return false; - } - PointCloud *pointcloud = this->get_for_write(); - if (pointcloud == nullptr) { - return false; - } - if (custom_data_has_layer_with_name(pointcloud->pdata, attribute_name)) { - return false; - } - - char attribute_name_c[MAX_NAME]; - attribute_name.copy(attribute_name_c); - CustomData_add_layer_named( - &pointcloud->pdata, data_type, CD_DEFAULT, nullptr, pointcloud_->totpoint, attribute_name_c); - return true; -} - -Set PointCloudComponent::attribute_names() const -{ - if (pointcloud_ == nullptr) { - return {}; - } - - Set names; - get_custom_data_layer_attribute_names(pointcloud_->pdata, *this, ATTR_DOMAIN_POINT, names); - return names; -} - /** \} */ /* -------------------------------------------------------------------- */ /** \name Mesh Component * \{ */ -bool MeshComponent::attribute_domain_supported(const AttributeDomain domain) const +const blender::bke::ComponentAttributeProviders *MeshComponent::get_attribute_providers() const { - return ELEM( - domain, ATTR_DOMAIN_CORNER, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE, ATTR_DOMAIN_POLYGON); -} - -bool MeshComponent::attribute_domain_with_type_supported(const AttributeDomain domain, - const CustomDataType data_type) const -{ - if (!this->attribute_domain_supported(domain)) { - return false; - } - return ELEM(data_type, - CD_PROP_BOOL, - CD_PROP_FLOAT, - CD_PROP_FLOAT2, - CD_PROP_FLOAT3, - CD_PROP_INT32, - CD_PROP_COLOR); + static blender::bke::ComponentAttributeProviders providers = + blender::bke::create_attribute_providers_for_mesh(); + return &providers; } int MeshComponent::attribute_domain_size(const AttributeDomain domain) const @@ -1121,228 +1765,4 @@ int MeshComponent::attribute_domain_size(const AttributeDomain domain) const return 0; } -bool MeshComponent::attribute_is_builtin(const StringRef attribute_name) const -{ - return attribute_name == "position"; -} - -ReadAttributePtr MeshComponent::attribute_try_get_for_read(const StringRef attribute_name) const -{ - if (mesh_ == nullptr) { - return {}; - } - - if (attribute_name == "position") { - auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); }; - return std::make_unique< - blender::bke::DerivedArrayReadAttribute>( - ATTR_DOMAIN_POINT, blender::Span(mesh_->mvert, mesh_->totvert), get_vertex_position); - } - - ReadAttributePtr corner_attribute = read_attribute_from_custom_data( - mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER); - if (corner_attribute) { - return corner_attribute; - } - - const int vertex_group_index = vertex_group_names_.lookup_default(attribute_name, -1); - if (vertex_group_index >= 0) { - return std::make_unique( - mesh_->dvert, mesh_->totvert, vertex_group_index); - } - - ReadAttributePtr vertex_attribute = read_attribute_from_custom_data( - mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT); - if (vertex_attribute) { - return vertex_attribute; - } - - ReadAttributePtr edge_attribute = read_attribute_from_custom_data( - mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE); - if (edge_attribute) { - return edge_attribute; - } - - ReadAttributePtr polygon_attribute = read_attribute_from_custom_data( - mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON); - if (polygon_attribute) { - return polygon_attribute; - } - - return {}; -} - -WriteAttributePtr MeshComponent::attribute_try_get_for_write(const StringRef attribute_name) -{ - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { - return {}; - } - - const std::function update_mesh_pointers = [&]() { - BKE_mesh_update_customdata_pointers(mesh, false); - }; - - if (attribute_name == "position") { - CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert); - update_mesh_pointers(); - - auto get_vertex_position = [](const MVert &vert) { return float3(vert.co); }; - auto set_vertex_position = [](MVert &vert, const float3 &co) { copy_v3_v3(vert.co, co); }; - return std::make_unique< - blender::bke::DerivedArrayWriteAttribute>( - ATTR_DOMAIN_POINT, - blender::MutableSpan(mesh_->mvert, mesh_->totvert), - get_vertex_position, - set_vertex_position); - } - - WriteAttributePtr corner_attribute = write_attribute_from_custom_data( - mesh_->ldata, mesh_->totloop, attribute_name, ATTR_DOMAIN_CORNER, update_mesh_pointers); - if (corner_attribute) { - return corner_attribute; - } - - const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1); - if (vertex_group_index >= 0) { - if (mesh_->dvert == nullptr) { - BKE_object_defgroup_data_create(&mesh_->id); - } - else { - /* Copy the data layer if it is shared with some other mesh. */ - mesh_->dvert = (MDeformVert *)CustomData_duplicate_referenced_layer( - &mesh_->vdata, CD_MDEFORMVERT, mesh_->totvert); - } - return std::make_unique( - mesh_->dvert, mesh_->totvert, vertex_group_index); - } - - WriteAttributePtr vertex_attribute = write_attribute_from_custom_data( - mesh_->vdata, mesh_->totvert, attribute_name, ATTR_DOMAIN_POINT, update_mesh_pointers); - if (vertex_attribute) { - return vertex_attribute; - } - - WriteAttributePtr edge_attribute = write_attribute_from_custom_data( - mesh_->edata, mesh_->totedge, attribute_name, ATTR_DOMAIN_EDGE, update_mesh_pointers); - if (edge_attribute) { - return edge_attribute; - } - - WriteAttributePtr polygon_attribute = write_attribute_from_custom_data( - mesh_->pdata, mesh_->totpoly, attribute_name, ATTR_DOMAIN_POLYGON, update_mesh_pointers); - if (polygon_attribute) { - return polygon_attribute; - } - - return {}; -} - -bool MeshComponent::attribute_try_delete(const StringRef attribute_name) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { - return false; - } - - delete_named_custom_data_layer(mesh_->ldata, attribute_name, mesh_->totloop); - delete_named_custom_data_layer(mesh_->vdata, attribute_name, mesh_->totvert); - delete_named_custom_data_layer(mesh_->edata, attribute_name, mesh_->totedge); - delete_named_custom_data_layer(mesh_->pdata, attribute_name, mesh_->totpoly); - - const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1); - if (vertex_group_index != -1) { - for (MDeformVert &dvert : blender::MutableSpan(mesh_->dvert, mesh_->totvert)) { - MDeformWeight *weight = BKE_defvert_find_index(&dvert, vertex_group_index); - BKE_defvert_remove_group(&dvert, weight); - } - vertex_group_names_.remove_as(attribute_name); - } - - return true; -} - -bool MeshComponent::attribute_try_create(const StringRef attribute_name, - const AttributeDomain domain, - const CustomDataType data_type) -{ - if (this->attribute_is_builtin(attribute_name)) { - return false; - } - if (!this->attribute_domain_with_type_supported(domain, data_type)) { - return false; - } - Mesh *mesh = this->get_for_write(); - if (mesh == nullptr) { - return false; - } - - char attribute_name_c[MAX_NAME]; - attribute_name.copy(attribute_name_c); - - switch (domain) { - case ATTR_DOMAIN_CORNER: { - if (custom_data_has_layer_with_name(mesh->ldata, attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->ldata, data_type, CD_DEFAULT, nullptr, mesh->totloop, attribute_name_c); - return true; - } - case ATTR_DOMAIN_POINT: { - if (custom_data_has_layer_with_name(mesh->vdata, attribute_name)) { - return false; - } - if (vertex_group_names_.contains_as(attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->vdata, data_type, CD_DEFAULT, nullptr, mesh->totvert, attribute_name_c); - return true; - } - case ATTR_DOMAIN_EDGE: { - if (custom_data_has_layer_with_name(mesh->edata, attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->edata, data_type, CD_DEFAULT, nullptr, mesh->totedge, attribute_name_c); - return true; - } - case ATTR_DOMAIN_POLYGON: { - if (custom_data_has_layer_with_name(mesh->pdata, attribute_name)) { - return false; - } - CustomData_add_layer_named( - &mesh->pdata, data_type, CD_DEFAULT, nullptr, mesh->totpoly, attribute_name_c); - return true; - } - default: - return false; - } -} - -Set MeshComponent::attribute_names() const -{ - if (mesh_ == nullptr) { - return {}; - } - - Set names; - names.add("position"); - for (StringRef name : vertex_group_names_.keys()) { - names.add(name); - } - get_custom_data_layer_attribute_names(mesh_->ldata, *this, ATTR_DOMAIN_CORNER, names); - get_custom_data_layer_attribute_names(mesh_->vdata, *this, ATTR_DOMAIN_POINT, names); - get_custom_data_layer_attribute_names(mesh_->edata, *this, ATTR_DOMAIN_EDGE, names); - get_custom_data_layer_attribute_names(mesh_->pdata, *this, ATTR_DOMAIN_POLYGON, names); - return names; -} - /** \} */ diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index dae0b757df0..2eaef8fc121 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -377,6 +377,17 @@ void MeshComponent::copy_vertex_group_names_from_object(const Object &object) } } +const blender::Map &MeshComponent::vertex_group_names() const +{ + return vertex_group_names_; +} + +/* This is only exposed for the internal attribute API. */ +blender::Map &MeshComponent::vertex_group_names() +{ + return vertex_group_names_; +} + /* Get the mesh from this component. This method can be used by multiple threads at the same * time. Therefore, the returned mesh should not be modified. No ownership is transferred. */ const Mesh *MeshComponent::get_for_read() const From 17672efa0e02172b77eed95bfb977c914a5305b9 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 9 Feb 2021 11:44:58 +0100 Subject: [PATCH 030/519] Geometry Nodes: initial attribute interpolation between domains This patch adds support for accessing corner attributes on the point domain. The immediate benefit of this is that now (interpolated) uv coordinates are available on points without having to use the Point Distribute node. This is also very useful for parts of T84297, because once we have vertex colors, those will also be available on points, even though they are stored per corner. Differential Revision: https://developer.blender.org/D10305 --- .../blender/blenkernel/BKE_attribute_math.hh | 164 +++++++++++++++++- source/blender/blenkernel/BKE_geometry_set.hh | 4 +- source/blender/blenkernel/CMakeLists.txt | 1 + .../blenkernel/intern/attribute_access.cc | 101 ++++++++++- .../blenkernel/intern/attribute_math.cc | 58 +++++++ 5 files changed, 323 insertions(+), 5 deletions(-) create mode 100644 source/blender/blenkernel/intern/attribute_math.cc diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh index b8bb2048d9d..606811ca12d 100644 --- a/source/blender/blenkernel/BKE_attribute_math.hh +++ b/source/blender/blenkernel/BKE_attribute_math.hh @@ -14,9 +14,11 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_array.hh" #include "BLI_color.hh" #include "BLI_float2.hh" #include "BLI_float3.hh" + #include "DNA_customdata_types.h" namespace blender::attribute_math { @@ -52,7 +54,12 @@ void convert_to_static_type(const CustomDataType data_type, const Func &func) } } -/* Interpolate between three values. */ +/* -------------------------------------------------------------------- */ +/** \name Mix three values of the same type. + * + * This is typically used to interpolate values within a triangle. + * \{ */ + template T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2); template<> inline bool mix3(const float3 &weights, const bool &v0, const bool &v1, const bool &v2) @@ -91,4 +98,159 @@ inline Color4f mix3(const float3 &weights, const Color4f &v0, const Color4f &v1, return result; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Mix a dynamic amount of values with weights for many elements. + * + * This section provides an abstraction for "mixers". The abstraction encapsulates details about + * how different types should be mixed. Usually #DefaultMixer should be used to get a mixer for + * a specific type. + * \{ */ + +template class SimpleMixer { + private: + MutableSpan buffer_; + T default_value_; + Array total_weights_; + + public: + /** + * \param buffer: Span where the interpolated values should be stored. + * \param default_value: Output value for an element that has not been affected by a #mix_in. + */ + SimpleMixer(MutableSpan buffer, T default_value = {}) + : buffer_(buffer), default_value_(default_value), total_weights_(buffer.size(), 0.0f) + { + BLI_STATIC_ASSERT(std::is_trivial_v, ""); + memset(buffer_.data(), 0, sizeof(T) * buffer_.size()); + } + + /** + * Mix a #value into the element with the given #index. + */ + void mix_in(const int64_t index, const T &value, const float weight = 1.0f) + { + BLI_assert(weight >= 0.0f); + buffer_[index] += value * weight; + total_weights_[index] += weight; + } + + /** + * Has to be called before the buffer provided in the constructor is used. + */ + void finalize() + { + for (const int64_t i : buffer_.index_range()) { + const float weight = total_weights_[i]; + if (weight > 0.0f) { + buffer_[i] *= 1.0f / weight; + } + else { + buffer_[i] = default_value_; + } + } + } +}; + +/** This mixer accumulates values in a type that is different from the one that is mixed. Some + * types cannot encode the floating point weights in their values (e.g. int and bool). */ +template +class SimpleMixerWithAccumulationType { + private: + struct Item { + /* Store both values together, because they are accessed together. */ + AccumulationT value = {0}; + float weight = 0.0f; + }; + + MutableSpan buffer_; + T default_value_; + Array accumulation_buffer_; + + public: + SimpleMixerWithAccumulationType(MutableSpan buffer, T default_value = {}) + : buffer_(buffer), default_value_(default_value), accumulation_buffer_(buffer.size()) + { + } + + void mix_in(const int64_t index, const T &value, const float weight = 1.0f) + { + const AccumulationT converted_value = static_cast(value); + Item &item = accumulation_buffer_[index]; + item.value += converted_value * weight; + item.weight += weight; + } + + void finalize() + { + for (const int64_t i : buffer_.index_range()) { + const Item &item = accumulation_buffer_[i]; + if (item.weight > 0.0f) { + const float weight_inv = 1.0f / item.weight; + const T converted_value = ConvertToT(item.value * weight_inv); + buffer_[i] = converted_value; + } + else { + buffer_[i] = default_value_; + } + } + } +}; + +class Color4fMixer { + private: + MutableSpan buffer_; + Color4f default_color_; + Array total_weights_; + + public: + Color4fMixer(MutableSpan buffer, Color4f default_color = {0, 0, 0, 1}); + void mix_in(const int64_t index, const Color4f &color, const float weight = 1.0f); + void finalize(); +}; + +template struct DefaultMixerStruct { + /* Use void by default. This can be check for in `if constexpr` statements. */ + using type = void; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + using type = SimpleMixer; +}; +template<> struct DefaultMixerStruct { + /* Use a special mixer for colors. Color4f can't be added/multiplied, because this is not + * something one should usually do with colors. */ + using type = Color4fMixer; +}; +template<> struct DefaultMixerStruct { + static int double_to_int(const double &value) + { + return static_cast(value); + } + /* Store interpolated ints in a double temporarily, so that weights are handled correctly. It + * uses double instead of float so that it is accurate for all 32 bit integers. */ + using type = SimpleMixerWithAccumulationType; +}; +template<> struct DefaultMixerStruct { + static bool float_to_bool(const float &value) + { + return value >= 0.5f; + } + /* Store interpolated bools in a float temporary. Otherwise information provided by weights is + * easily rounded away. */ + using type = SimpleMixerWithAccumulationType; +}; + +/* Utility to get a good default mixer for a given type. This is `void` when there is no default + * mixer for the given type. */ +template using DefaultMixer = typename DefaultMixerStruct::type; + +/** \} */ + } // namespace blender::attribute_math diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 9a871574f6f..6a987ee51e0 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -174,7 +174,7 @@ class GeometryComponent { * interpolate from one domain to another. * Returns null if the interpolation is not implemented. */ virtual blender::bke::ReadAttributePtr attribute_try_adapt_domain( - blender::bke::ReadAttributePtr attribute, const AttributeDomain domain) const; + blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const; /* Returns true when the attribute has been deleted. */ bool attribute_try_delete(const blender::StringRef attribute_name); @@ -368,6 +368,8 @@ class MeshComponent : public GeometryComponent { Mesh *get_for_write(); int attribute_domain_size(const AttributeDomain domain) const final; + blender::bke::ReadAttributePtr attribute_try_adapt_domain( + blender::bke::ReadAttributePtr attribute, const AttributeDomain new_domain) const final; bool is_empty() const final; diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 3f22612652c..6b6d2b45d02 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -81,6 +81,7 @@ set(SRC intern/asset.cc intern/attribute.c intern/attribute_access.cc + intern/attribute_math.cc intern/autoexec.c intern/blender.c intern/blender_copybuffer.c diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 772309349ff..cc833e094c8 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -17,6 +17,7 @@ #include #include "BKE_attribute_access.hh" +#include "BKE_attribute_math.hh" #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_geometry_set.hh" @@ -323,6 +324,29 @@ template class ArrayReadAttribute final : public ReadAttribute { } }; +template class OwnedArrayReadAttribute final : public ReadAttribute { + private: + Array data_; + + public: + OwnedArrayReadAttribute(AttributeDomain domain, Array data) + : ReadAttribute(domain, CPPType::get(), data.size()), data_(std::move(data)) + { + } + + void get_internal(const int64_t index, void *r_value) const override + { + new (r_value) T(data_[index]); + } + + void initialize_span() const override + { + /* The data will not be modified, so this const_cast is fine. */ + array_buffer_ = const_cast(data_.data()); + array_is_temporary_ = false; + } +}; + templatedomain() == domain) { + if (attribute && attribute->domain() == new_domain) { return attribute; } return {}; @@ -1765,4 +1789,75 @@ int MeshComponent::attribute_domain_size(const AttributeDomain domain) const return 0; } +namespace blender::bke { + +template +void adapt_mesh_domain_corner_to_point_impl(const Mesh &mesh, + const TypedReadAttribute &attribute, + MutableSpan r_values) +{ + BLI_assert(r_values.size() == mesh.totvert); + attribute_math::DefaultMixer mixer(r_values); + + for (const int loop_index : IndexRange(mesh.totloop)) { + const T value = attribute[loop_index]; + const MLoop &loop = mesh.mloop[loop_index]; + const int point_index = loop.v; + mixer.mix_in(point_index, value); + } + mixer.finalize(); +} + +static ReadAttributePtr adapt_mesh_domain_corner_to_point(const Mesh &mesh, + ReadAttributePtr attribute) +{ + ReadAttributePtr new_attribute; + const CustomDataType data_type = attribute->custom_data_type(); + attribute_math::convert_to_static_type(data_type, [&](auto dummy) { + using T = decltype(dummy); + if constexpr (!std::is_void_v>) { + /* We compute all interpolated values at once, because for this interpolation, one has to + * iterate over all loops anyway. */ + Array values(mesh.totvert); + adapt_mesh_domain_corner_to_point_impl(mesh, *attribute, values); + new_attribute = std::make_unique>(ATTR_DOMAIN_POINT, + std::move(values)); + } + }); + return new_attribute; +} + +} // namespace blender::bke + +ReadAttributePtr MeshComponent::attribute_try_adapt_domain(ReadAttributePtr attribute, + const AttributeDomain new_domain) const +{ + if (!attribute) { + return {}; + } + if (attribute->size() == 0) { + return {}; + } + const AttributeDomain old_domain = attribute->domain(); + if (old_domain == new_domain) { + return attribute; + } + + switch (old_domain) { + case ATTR_DOMAIN_CORNER: { + switch (new_domain) { + case ATTR_DOMAIN_POINT: + return blender::bke::adapt_mesh_domain_corner_to_point(*mesh_, std::move(attribute)); + default: + break; + } + break; + } + default: + break; + } + + return {}; +} + /** \} */ diff --git a/source/blender/blenkernel/intern/attribute_math.cc b/source/blender/blenkernel/intern/attribute_math.cc new file mode 100644 index 00000000000..4ff3a6ceff5 --- /dev/null +++ b/source/blender/blenkernel/intern/attribute_math.cc @@ -0,0 +1,58 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BKE_attribute_math.hh" + +namespace blender::attribute_math { + +Color4fMixer::Color4fMixer(MutableSpan output_buffer, Color4f default_color) + : buffer_(output_buffer), + default_color_(default_color), + total_weights_(output_buffer.size(), 0.0f) +{ + buffer_.fill(Color4f(0, 0, 0, 0)); +} + +void Color4fMixer::mix_in(const int64_t index, const Color4f &color, const float weight) +{ + BLI_assert(weight >= 0.0f); + Color4f &output_color = buffer_[index]; + output_color.r += color.r * weight; + output_color.g += color.g * weight; + output_color.b += color.b * weight; + output_color.a += color.a * weight; + total_weights_[index] += weight; +} + +void Color4fMixer::finalize() +{ + for (const int64_t i : buffer_.index_range()) { + const float weight = total_weights_[i]; + Color4f &output_color = buffer_[i]; + if (weight > 0.0f) { + const float weight_inv = 1.0f / weight; + output_color.r *= weight_inv; + output_color.g *= weight_inv; + output_color.b *= weight_inv; + output_color.a *= weight_inv; + } + else { + output_color = default_color_; + } + } +} + +} // namespace blender::attribute_math From ee585b9c213a28b3c9877482bde6254fdbd7a245 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 9 Feb 2021 11:47:49 +0100 Subject: [PATCH 031/519] Fix: use class instead of struct in forward declaration --- source/blender/blenkernel/BKE_geometry_set.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 6a987ee51e0..5f1ddea0f13 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -69,7 +69,7 @@ template<> struct DefaultHash { } // namespace blender namespace blender::bke { -struct ComponentAttributeProviders; +class ComponentAttributeProviders; } class GeometryComponent; From 62195fb5b37d3938e3878af149073f1b3ce945db Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 9 Feb 2021 20:30:54 +1100 Subject: [PATCH 032/519] Cleanup: comments, replace 'undoes' with 'undo-steps' --- source/blender/blenkernel/intern/brush.c | 2 +- source/blender/blenkernel/intern/paint.c | 2 +- source/blender/blenkernel/intern/scene.c | 2 +- source/blender/blenkernel/intern/undo_system.c | 4 ++-- source/blender/editors/undo/memfile_undo.c | 4 ++-- source/blender/editors/util/ed_util.c | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 8a2ab818464..1ba5571a26b 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -375,7 +375,7 @@ static int brush_undo_preserve_cb(LibraryIDLinkCallbackData *cb_data) static void brush_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old) { - /* Whole Brush is preserved across undoes. */ + /* Whole Brush is preserved across undo-steps. */ BKE_lib_id_swap(NULL, id_new, id_old); /* `id_new` now has content from `id_old`, we need to ensure those old ID pointers are valid. diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 8b5137621a0..3c770a85b2a 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -127,7 +127,7 @@ static void palette_blend_read_data(BlendDataReader *reader, ID *id) static void palette_undo_preserve(BlendLibReader *UNUSED(reader), ID *id_new, ID *id_old) { - /* Whole Palette is preserved across undoes, and it has no extra pointer, simple. */ + /* Whole Palette is preserved across undo-steps, and it has no extra pointer, simple. */ /* Note: We do not care about potential internal references to self here, Palette has none. */ /* Note: We do not swap IDProperties, as dealing with potential ID pointers in those would be * fairly delicate. */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 0ce5240b17d..25951fa3e6f 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -475,7 +475,7 @@ static void scene_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSE /** * This code is shared by both the regular `foreach_id` looper, and the code trying to restore or - * preserve ID pointers like brushes across undoes. + * preserve ID pointers like brushes across undo-steps. */ typedef enum eSceneForeachUndoPreserveProcess { /* Undo when preserving tool-settings from old scene, we also want to try to preserve that ID diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index baa96ca1455..bb871e84c7b 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -287,7 +287,7 @@ void BKE_undosys_stack_clear(UndoStack *ustack) void BKE_undosys_stack_clear_active(UndoStack *ustack) { - /* Remove active and all following undoes. */ + /* Remove active and all following undo-steps. */ UndoStep *us = ustack->step_active; if (us) { @@ -517,7 +517,7 @@ UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, retval |= UNDO_PUSH_RET_OVERRIDE_CHANGED; } - /* Remove all undoes after (also when 'ustack->step_active == NULL'). */ + /* Remove all undo-steps after (also when 'ustack->step_active == NULL'). */ while (ustack->steps.last != ustack->step_active) { UndoStep *us_iter = ustack->steps.last; undosys_step_free_and_unlink(ustack, us_iter); diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c index c0a1579b0fd..4fd8c180a4b 100644 --- a/source/blender/editors/undo/memfile_undo.c +++ b/source/blender/editors/undo/memfile_undo.c @@ -314,8 +314,8 @@ struct MemFile *ED_undosys_stack_memfile_get_active(UndoStack *ustack) * If the last undo step is a memfile one, find the first #MemFileChunk matching given ID * (using its session UUID), and tag it as "changed in the future". * - * Since non-memfile undoes cannot automatically set this flag in the previous step as done with - * memfile ones, this has to be called manually by relevant undo code. + * Since non-memfile undo-steps cannot automatically set this flag in the previous step as done + * with memfile ones, this has to be called manually by relevant undo code. * * \note Only current known case for this is undoing a switch from Object to Sculpt mode (see * T82388). diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index 4f24975fafa..695db9ba246 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -183,7 +183,7 @@ void ED_editors_exit(Main *bmain, bool do_undo_system) return; } - /* Frees all edit-mode undoes. */ + /* Frees all edit-mode undo-steps. */ if (do_undo_system && G_MAIN->wm.first) { wmWindowManager *wm = G_MAIN->wm.first; /* normally we don't check for NULL undo stack, From a7b931e87f91a85dd18aef395d4796e8e5bc47c3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 9 Feb 2021 20:37:40 +1100 Subject: [PATCH 033/519] Cleanup: comments, replace German expression with English --- source/blender/editors/uvedit/uvedit_unwrap_ops.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index be54df1ce9e..fc5f41e8ed5 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -1336,9 +1336,9 @@ static void uv_map_rotation_matrix_ex(float result[4][4], zero_m4(rotup); zero_m4(rotside); - /* compensate front/side.. against opengl x,y,z world definition */ - /* this is "kanonen gegen spatzen", a few plus minus 1 will do here */ - /* i wanted to keep the reason here, so we're rotating*/ + /* Compensate front/side.. against opengl x,y,z world definition. + * This is "a sledgehammer to crack a nut" (overkill), a few plus minus 1 will do here. + * I wanted to keep the reason here, so we're rotating. */ sideangle = (float)M_PI * (sideangledeg + 180.0f) / 180.0f; rotside[0][0] = cosf(sideangle); rotside[0][1] = -sinf(sideangle); From 5321e844d3fa8a3421df1c9d7aedc52e22ca5264 Mon Sep 17 00:00:00 2001 From: Ankit Meel Date: Tue, 9 Feb 2021 14:36:11 +0100 Subject: [PATCH 034/519] CMake/Linux: Add libharu to platform_linux.cmake Since GPencil changes depending on libharu may be committed to master before SVN libraries for all platforms are in place, avoid build issues. Extension of D9928. Reviewed By: sybren Differential Revision: https://developer.blender.org/D10280 --- build_files/cmake/platform/platform_unix.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 7ded075e8e3..fed70c5b8b2 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -470,6 +470,14 @@ if(WITH_POTRACE) endif() endif() +if(WITH_HARU) + find_package_wrapper(Haru) + if(NOT HARU_FOUND) + message(WARNING "Haru not found, disabling WITH_HARU") + set(WITH_HARU OFF) + endif() +endif() + if(EXISTS ${LIBDIR}) without_system_libs_end() endif() From 5213b18eb2d57153e0e394190af1624401fed74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 9 Feb 2021 14:49:33 +0100 Subject: [PATCH 035/519] Cycles: fix wrong flags used to tag device data as dirty Also fixes missing modified tag for float2 and float3 attributes arrays. --- intern/cycles/render/geometry.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index 9ea56b30ffa..f79b1689c14 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1388,8 +1388,8 @@ enum { ATTRS_NEED_REALLOC = (ATTR_FLOAT_NEEDS_REALLOC | ATTR_FLOAT2_NEEDS_REALLOC | ATTR_FLOAT3_NEEDS_REALLOC | ATTR_UCHAR4_NEEDS_REALLOC), - DEVICE_MESH_DATA_NEEDS_REALLOC = (CURVE_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), - DEVICE_CURVE_DATA_NEEDS_REALLOC = (MESH_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), + DEVICE_MESH_DATA_NEEDS_REALLOC = (MESH_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), + DEVICE_CURVE_DATA_NEEDS_REALLOC = (CURVE_DATA_NEED_REALLOC | ATTRS_NEED_REALLOC), }; static void update_device_flags_attribute(uint32_t &device_update_flags, @@ -1591,16 +1591,16 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro dscene->attributes_map.tag_realloc(); dscene->attributes_float2.tag_realloc(); } - else if (device_update_flags & ATTR_FLOAT_MODIFIED) { - dscene->attributes_float.tag_modified(); + else if (device_update_flags & ATTR_FLOAT2_MODIFIED) { + dscene->attributes_float2.tag_modified(); } if (device_update_flags & ATTR_FLOAT3_NEEDS_REALLOC) { dscene->attributes_map.tag_realloc(); dscene->attributes_float3.tag_realloc(); } - else if (device_update_flags & ATTR_FLOAT_MODIFIED) { - dscene->attributes_float.tag_modified(); + else if (device_update_flags & ATTR_FLOAT3_MODIFIED) { + dscene->attributes_float3.tag_modified(); } if (device_update_flags & ATTR_UCHAR4_NEEDS_REALLOC) { From 1352d81b174726639bbfb6f7aa32dbadf188a8dd Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Mon, 8 Feb 2021 16:28:42 +0100 Subject: [PATCH 036/519] GPencil: Fill tool refactor and Multiframe in Draw mode This commit is a refactor of the fill tool to solve several problems we had since the first version of the tool. Changes: * The filling speed has been improved for each step of the process with the optimization of each algorithm/function. * New `AutoFit` option to fill areas outside of the viewport. When enable, the total size of the frame is calculated to fit the filling area. * New support multiframe filling. Now it is possible to fill multiple similar frames in one go. * New `Stroke Extension` option to create temporary closing strokes. These strokes can be displayed and adjusted dynamically using wheel mouse or PageUp/Down keys. * Parameter `Resolution` now is named `Precision` and has been moved to topbar. * `Resolution` now has decimals and can be lower than 1 to allow quick filling in storyboarding workflows. Maximum value has been set as 5. * Parameter `Simplify` has been moved to Advanced panel. * Improved fill outline detection. In some cases, the outline penetrated the area to be filled with unexpected results. * Fixes some corner case bugs with infinite loops. As a result of this refactor, also these new functionalities has been added. * New support for multiframe in `Draw` mode. Any drawing in active frame is duplicated to all selected frame. * New multiframe display mode. Keyframes before or after of the active frame are displayed using onion colors. This can be disable using Onion overlay options. --- .../startup/bl_ui/properties_paint_common.py | 4 +- release/scripts/startup/bl_ui/space_view3d.py | 4 + .../startup/bl_ui/space_view3d_toolbar.py | 9 +- source/blender/blenkernel/BKE_gpencil.h | 2 + source/blender/blenkernel/BKE_gpencil_geom.h | 5 + source/blender/blenkernel/intern/brush.c | 4 +- source/blender/blenkernel/intern/gpencil.c | 32 + .../blender/blenkernel/intern/gpencil_geom.c | 39 + source/blender/editors/gpencil/drawgpencil.c | 11 +- source/blender/editors/gpencil/gpencil_data.c | 10 +- source/blender/editors/gpencil/gpencil_edit.c | 115 +- source/blender/editors/gpencil/gpencil_fill.c | 1092 ++++++++++++----- .../blender/editors/gpencil/gpencil_paint.c | 77 +- .../editors/gpencil/gpencil_primitive.c | 6 + .../blender/editors/gpencil/gpencil_utils.c | 14 +- source/blender/editors/include/ED_gpencil.h | 5 + source/blender/makesdna/DNA_brush_enums.h | 4 + source/blender/makesdna/DNA_brush_types.h | 6 +- source/blender/makesdna/DNA_gpencil_types.h | 8 +- source/blender/makesrna/intern/rna_brush.c | 26 +- 20 files changed, 1089 insertions(+), 384 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 5d241e8e216..30e50bde969 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -1218,11 +1218,13 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) row = layout.row(align=True) row.prop(gp_settings, "fill_direction", text="", expand=True) row = layout.row(align=True) + row.prop(gp_settings, "fill_factor") + row = layout.row(align=True) row.prop(gp_settings, "fill_leak", text="Leak Size") row = layout.row(align=True) row.prop(brush, "size", text="Thickness") row = layout.row(align=True) - row.prop(gp_settings, "fill_simplify_level", text="Simplify") + row.prop(gp_settings, "use_fill_autofit", text="", icon="SNAP_FACE_CENTER") else: # brush.gpencil_tool == 'DRAW/TINT': row = layout.row(align=True) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index ebb6280a42f..29e462026e1 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -695,6 +695,10 @@ class VIEW3D_HT_header(Header): row.prop(tool_settings, "use_gpencil_vertex_select_mask_stroke", text="") row.prop(tool_settings, "use_gpencil_vertex_select_mask_segment", text="") + if gpd.is_stroke_paint_mode: + row = layout.row(align=True) + row.prop(gpd, "use_multiedit", text="", icon='GP_MULTIFRAME_EDITING') + if ( gpd.use_stroke_edit_mode or gpd.is_stroke_sculpt_mode or diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 7c718ee8155..20ec26200f6 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1394,7 +1394,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_brush_settings' bl_category = "Tool" bl_options = {'DEFAULT_CLOSED'} - bl_ui_units_x = 11 + bl_ui_units_x = 13 @classmethod def poll(cls, context): @@ -1447,7 +1447,12 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): row.prop(gp_settings, "fill_layer_mode", text="Layers") col.separator() - col.prop(gp_settings, "fill_factor") + row = col.row(align=True) + row.prop(gp_settings, "extend_stroke_factor") + row.prop(gp_settings, "show_fill_extend", text="", icon='GRID') + + col.separator() + col.prop(gp_settings, "fill_simplify_level", text="Simplify") if gp_settings.fill_draw_mode != 'STROKE': col = layout.column(align=False, heading="Ignore Transparent") col.use_property_decorate = False diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index b7fad9c891a..a8caf317467 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -115,6 +115,8 @@ struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src, const bool dup_frames, const bool dup_strokes); void BKE_gpencil_frame_copy_strokes(struct bGPDframe *gpf_src, struct bGPDframe *gpf_dst); +void BKE_gpencil_frame_selected_hash(struct bGPdata *gpd, struct GHash *r_list); + struct bGPDcurve *BKE_gpencil_stroke_curve_duplicate(struct bGPDcurve *gpc_src); struct bGPDstroke *BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src, const bool dup_points, diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h index 1c86df73d3c..89a794f2df3 100644 --- a/source/blender/blenkernel/BKE_gpencil_geom.h +++ b/source/blender/blenkernel/BKE_gpencil_geom.h @@ -149,6 +149,11 @@ void BKE_gpencil_stroke_join(struct bGPDstroke *gps_a, struct bGPDstroke *gps_b, const bool leave_gaps, const bool fit_thickness); +void BKE_gpencil_stroke_copy_to_keyframes(struct bGPdata *gpd, + struct bGPDlayer *gpl, + struct bGPDframe *gpf, + struct bGPDstroke *gps, + const bool tail); bool BKE_gpencil_convert_mesh(struct Main *bmain, struct Depsgraph *depsgraph, diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 1ba5571a26b..59ff59b82e0 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -975,7 +975,7 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) break; } case GP_BRUSH_PRESET_FILL_AREA: { - brush->size = 20.0f; + brush->size = 5.0f; brush->gpencil_settings->fill_leak = 3; brush->gpencil_settings->fill_threshold = 0.1f; @@ -989,6 +989,8 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) brush->gpencil_settings->draw_smoothlvl = 1; brush->gpencil_settings->draw_subdivide = 1; + brush->gpencil_settings->flag |= GP_BRUSH_FILL_SHOW_EXTENDLINES; + brush->gpencil_settings->icon_id = GP_BRUSH_ICON_FILL; brush->gpencil_tool = GPAINT_TOOL_FILL; brush->gpencil_settings->vertex_mode = GPPAINT_MODE_FILL; diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 0c813c170ad..3d0152a6c7d 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -851,6 +851,7 @@ bGPDstroke *BKE_gpencil_stroke_new(int mat_idx, int totpoints, short thickness) gps->mat_nr = mat_idx; + gps->dvert = NULL; gps->editcurve = NULL; return gps; @@ -2606,6 +2607,15 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer, LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { if (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT)) { gpf->runtime.onion_id = 0; + if (do_onion) { + if (gpf->framenum < act_gpf->framenum) { + gpf->runtime.onion_id = -1; + } + else { + gpf->runtime.onion_id = 1; + } + } + if (sta_gpf == NULL) { sta_gpf = gpf; } @@ -2939,4 +2949,26 @@ int BKE_gpencil_material_find_index_by_name_prefix(Object *ob, const char *name_ return -1; } +/* Create a hash with the list of selected frame number. */ +void BKE_gpencil_frame_selected_hash(bGPdata *gpd, struct GHash *r_list) +{ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); + + LISTBASE_FOREACH (bGPDlayer *, gpl_iter, &gpd->layers) { + if ((gpl != NULL) && (!is_multiedit) && (gpl != gpl_iter)) { + continue; + } + + LISTBASE_FOREACH (bGPDframe *, gpf, &gpl_iter->frames) { + if (((gpf == gpl->actframe) && (!is_multiedit)) || + ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (!BLI_ghash_lookup(r_list, POINTER_FROM_INT(gpf->framenum))) { + BLI_ghash_insert(r_list, POINTER_FROM_INT(gpf->framenum), gpf); + } + } + } + } +} + /** \} */ diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c index 60ffa3c3e73..2ef85439a46 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.c +++ b/source/blender/blenkernel/intern/gpencil_geom.c @@ -3228,6 +3228,45 @@ void BKE_gpencil_stroke_join(bGPDstroke *gps_a, } } +/* Copy the stroke of the frame to all frames selected (except current). */ +void BKE_gpencil_stroke_copy_to_keyframes( + bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const bool tail) +{ + GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64); + BKE_gpencil_frame_selected_hash(gpd, frame_list); + + GHashIterator gh_iter; + GHASH_ITER (gh_iter, frame_list) { + int cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter)); + + if (gpf->framenum != cfra) { + bGPDframe *gpf_new = BKE_gpencil_layer_frame_find(gpl, cfra); + if (gpf_new == NULL) { + gpf_new = BKE_gpencil_frame_addnew(gpl, cfra); + } + + if (gpf_new == NULL) { + continue; + } + + bGPDstroke *gps_new = BKE_gpencil_stroke_duplicate(gps, true, true); + if (gps_new == NULL) { + continue; + } + + if (tail) { + BLI_addhead(&gpf_new->strokes, gps_new); + } + else { + BLI_addtail(&gpf_new->strokes, gps_new); + } + } + } + + /* Free hash table. */ + BLI_ghash_free(frame_list, NULL, NULL); +} + /* Stroke Uniform Subdivide ------------------------------------- */ typedef struct tSamplePoint { diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index 4e2951c3571..751f8333aaa 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -171,7 +171,8 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, int totpoints = tgpw->gps->totpoints; const float viewport[2] = {(float)tgpw->winx, (float)tgpw->winy}; - float curpressure = points[0].pressure; + const float min_thickness = 0.05f; + float fpt[3]; /* if cyclic needs more vertex */ @@ -205,7 +206,6 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, immUniform1i("fill_stroke", (int)tgpw->is_fill_stroke); /* draw stroke curve */ - GPU_line_width(max_ff(curpressure * thickness, 1.0f)); immBeginAtMost(GPU_PRIM_LINE_STRIP_ADJ, totpoints + cyclic_add + 2); const bGPDspoint *pt = points; @@ -215,18 +215,19 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw, gpencil_set_point_varying_color(points, ink, attr_id.color, (bool)tgpw->is_fill_stroke); if ((cyclic) && (totpoints > 2)) { - immAttr1f(attr_id.thickness, max_ff((points + totpoints - 1)->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, + max_ff((points + totpoints - 1)->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x); } else { - immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x); } immVertex3fv(attr_id.pos, fpt); } /* set point */ gpencil_set_point_varying_color(pt, ink, attr_id.color, (bool)tgpw->is_fill_stroke); - immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff(pt->pressure * thickness, min_thickness)); mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x); immVertex3fv(attr_id.pos, fpt); } diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index e297a806895..3be913f342d 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -466,9 +466,15 @@ static int gpencil_layer_copy_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* make copy of layer, and add it immediately after the existing layer */ + /* Make copy of layer, and add it immediately after or before the existing layer. */ new_layer = BKE_gpencil_layer_duplicate(gpl, true, dup_strokes); - BLI_insertlinkafter(&gpd->layers, gpl, new_layer); + if (dup_strokes) { + BLI_insertlinkafter(&gpd->layers, gpl, new_layer); + } + else { + /* For empty strokes is better add below. */ + BLI_insertlinkbefore(&gpd->layers, gpl, new_layer); + } /* ensure new layer has a unique name, and is now the active layer */ BLI_uniquename(&gpd->layers, diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index b5269bbfacf..aeff2acb04d 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -4948,11 +4948,14 @@ static int gpencil_cutter_lasso_select(bContext *C, GPencilTestFn is_inside_fn, void *user_data) { + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + Object *obact = CTX_data_active_object(C); bGPdata *gpd = ED_gpencil_data_get_active(C); ScrArea *area = CTX_wm_area(C); ToolSettings *ts = CTX_data_tool_settings(C); const float scale = ts->gp_sculpt.isect_threshold; const bool flat_caps = RNA_boolean_get(op->ptr, "flat_caps"); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); bGPDspoint *pt; GP_SpaceConversion gsc = {NULL}; @@ -4979,57 +4982,87 @@ static int gpencil_cutter_lasso_select(bContext *C, } CTX_DATA_END; - /* select points */ - GP_EDITABLE_STROKES_BEGIN (gpstroke_iter, C, gpl, gps) { - int tot_inside = 0; - const int oldtot = gps->totpoints; - for (int i = 0; i < gps->totpoints; i++) { - pt = &gps->points[i]; - if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) { - continue; - } - /* convert point coords to screen-space */ - const bool is_inside = is_inside_fn(gps, pt, &gsc, gpstroke_iter.diff_mat, user_data); - if (is_inside) { - tot_inside++; - changed = true; - pt->flag |= GP_SPOINT_SELECT; - gps->flag |= GP_STROKE_SELECT; - float r_hita[3], r_hitb[3]; - if (gps->totpoints > 1) { - ED_gpencil_select_stroke_segment(gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb); + /* Select points */ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if ((gpl->flag & GP_LAYER_LOCKED) || ((gpl->flag & GP_LAYER_HIDE))) { + continue; + } + + float diff_mat[4][4]; + BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat); + + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (gpf == NULL) { + continue; } - /* avoid infinite loops */ - if (gps->totpoints > oldtot) { + + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + if (ED_gpencil_stroke_can_use(C, gps) == false) { + continue; + } /* check if the color is editable */ + if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) { + continue; + } + int tot_inside = 0; + const int oldtot = gps->totpoints; + for (int i = 0; i < gps->totpoints; i++) { + pt = &gps->points[i]; + if ((pt->flag & GP_SPOINT_SELECT) || (pt->flag & GP_SPOINT_TAG)) { + continue; + } + /* convert point coords to screen-space */ + const bool is_inside = is_inside_fn(gps, pt, &gsc, diff_mat, user_data); + if (is_inside) { + tot_inside++; + changed = true; + pt->flag |= GP_SPOINT_SELECT; + gps->flag |= GP_STROKE_SELECT; + float r_hita[3], r_hitb[3]; + if (gps->totpoints > 1) { + ED_gpencil_select_stroke_segment( + gpd, gpl, gps, pt, true, true, scale, r_hita, r_hitb); + } + /* avoid infinite loops */ + if (gps->totpoints > oldtot) { + break; + } + } + } + /* if mark all points inside lasso set to remove all stroke */ + if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) { + for (int i = 0; i < gps->totpoints; i++) { + pt = &gps->points[i]; + pt->flag |= GP_SPOINT_SELECT; + } + } + } + /* if not multiedit, exit loop. */ + if (!is_multiedit) { break; } } } - /* if mark all points inside lasso set to remove all stroke */ - if ((tot_inside == oldtot) || ((tot_inside == 1) && (oldtot == 2))) { - for (int i = 0; i < gps->totpoints; i++) { - pt = &gps->points[i]; - pt->flag |= GP_SPOINT_SELECT; - } - } } - GP_EDITABLE_STROKES_END(gpstroke_iter); - /* dissolve selected points */ + /* Dissolve selected points. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - if (gpl->flag & GP_LAYER_LOCKED) { - continue; - } - - bGPDframe *gpf = gpl->actframe; - if (gpf == NULL) { - continue; - } - LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { - if (gps->flag & GP_STROKE_SELECT) { - gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps); + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + bGPDframe *gpf_act = gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + gpl->actframe = gpf; + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + if (gps->flag & GP_STROKE_SELECT) { + gpencil_cutter_dissolve(gpd, gpl, gps, flat_caps); + } + } + /* if not multiedit, exit loop. */ + if (!is_multiedit) { + break; } } + gpl->actframe = gpf_act; } /* updates */ diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index e3e73d5deb5..f595d0f5b35 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -26,6 +26,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_stack.h" #include "BLI_utildefines.h" @@ -83,6 +84,15 @@ #define LEAK_VERT 1 #define MIN_WINDOW_SIZE 128 +/* Set to 1 to debug filling internal image. By default, the value must be 0. */ +#define FILL_DEBUG 0 + +/* Duplicated: etempFlags */ +const enum { + GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */ + GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ +}; + /* Temporary fill operation data (op->customdata) */ typedef struct tGPDfill { bContext *C; @@ -112,6 +122,8 @@ typedef struct tGPDfill { struct bGPDlayer *gpl; /** frame */ struct bGPDframe *gpf; + /** Temp mouse position stroke. */ + struct bGPDstroke *gps_mouse; /** flags */ short flag; @@ -119,9 +131,12 @@ typedef struct tGPDfill { short oldkey; /** send to back stroke */ bool on_back; - + /** Flag for render mode */ + bool is_render; + /** Flag to check something was done. */ + bool done; /** mouse fill center position */ - int center[2]; + int mouse[2]; /** windows width */ int sizex; /** window height */ @@ -163,8 +178,178 @@ typedef struct tGPDfill { int bwiny; rcti brect; + /* Space Conversion Data */ + GP_SpaceConversion gsc; + + /** Zoom factor. */ + float zoom; + + /** Factor of extension. */ + float fill_extend_fac; + } tGPDfill; +bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index); +static void gpencil_draw_boundary_lines(const struct bContext *UNUSED(C), struct tGPDfill *tgpf); + +/* Delete any temporary stroke. */ +static void gpencil_delete_temp_stroke_extension(tGPDfill *tgpf, const bool all_frames) +{ + LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpf->gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + + bGPDframe *init_gpf = (all_frames) ? gpl->frames.first : + BKE_gpencil_layer_frame_get( + gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (init_gpf == NULL) { + continue; + } + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + /* free stroke */ + if ((gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG)) { + BLI_remlink(&gpf->strokes, gps); + BKE_gpencil_free_stroke(gps); + } + } + if (!all_frames) { + break; + } + } + } +} + +static void extrapolate_points_by_length(bGPDspoint *a, + bGPDspoint *b, + float length, + float r_point[3]) +{ + float ab[3]; + sub_v3_v3v3(ab, &b->x, &a->x); + normalize_v3(ab); + mul_v3_fl(ab, length); + add_v3_v3v3(r_point, &b->x, ab); +} + +/* Loop all layers create stroke extensions. */ +static void gpencil_create_extensions(tGPDfill *tgpf) +{ + Object *ob = tgpf->ob; + bGPdata *gpd = tgpf->gpd; + Brush *brush = tgpf->brush; + BrushGpencilSettings *brush_settings = brush->gpencil_settings; + + bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd); + BLI_assert(gpl_active != NULL); + + const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); + BLI_assert(gpl_active_index >= 0); + + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + + /* Decide if the strokes of layers are included or not depending on the layer mode. */ + const int gpl_index = BLI_findindex(&gpd->layers, gpl); + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); + if (skip) { + continue; + } + + bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (gpf == NULL) { + continue; + } + + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + /* Check if stroke can be drawn. */ + if ((gps->points == NULL) || (gps->totpoints < 2)) { + continue; + } + if (gps->flag & (GP_STROKE_NOFILL | GP_STROKE_TAG)) { + continue; + } + /* Check if the color is visible. */ + MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1); + if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) { + continue; + } + + /* Extend start. */ + bGPDspoint *pt0 = &gps->points[1]; + bGPDspoint *pt1 = &gps->points[0]; + bGPDstroke *gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness); + gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_new); + + bGPDspoint *pt = &gps_new->points[0]; + copy_v3_v3(&pt->x, &pt1->x); + pt->strength = 1.0f; + pt->pressure = 1.0f; + + pt = &gps_new->points[1]; + pt->strength = 1.0f; + pt->pressure = 1.0f; + extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x); + + /* Extend end. */ + pt0 = &gps->points[gps->totpoints - 2]; + pt1 = &gps->points[gps->totpoints - 1]; + gps_new = BKE_gpencil_stroke_new(gps->mat_nr, 2, gps->thickness); + gps_new->flag |= GP_STROKE_NOFILL | GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_new); + + pt = &gps_new->points[0]; + copy_v3_v3(&pt->x, &pt1->x); + pt->strength = 1.0f; + pt->pressure = 1.0f; + + pt = &gps_new->points[1]; + pt->strength = 1.0f; + pt->pressure = 1.0f; + extrapolate_points_by_length(pt0, pt1, tgpf->fill_extend_fac * 0.1f, &pt->x); + } + } +} + +static void gpencil_update_extend(tGPDfill *tgpf) +{ + gpencil_delete_temp_stroke_extension(tgpf, false); + + if (tgpf->fill_extend_fac > 0.0f) { + gpencil_create_extensions(tgpf); + } + WM_event_add_notifier(tgpf->C, NC_GPENCIL | NA_EDITED, NULL); +} + +static bool gpencil_stroke_is_drawable(tGPDfill *tgpf, bGPDstroke *gps) +{ + if (tgpf->is_render) { + return true; + } + + const bool show_help = (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) != 0; + const bool show_extend = (tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) != 0; + const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG); + + if ((!show_help) && (show_extend)) { + if (!is_extend) { + return false; + } + } + + if ((show_help) && (!show_extend)) { + if (is_extend) { + return false; + } + } + + return true; +} + /* draw a given stroke using same thickness and color for all points */ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, bGPDstroke *gps, @@ -172,7 +357,8 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, const bool cyclic, const float ink[4], const int flag, - const float thershold) + const float thershold, + const float thickness) { bGPDspoint *points = gps->points; @@ -182,9 +368,19 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, int totpoints = gps->totpoints; float fpt[3]; float col[4]; + const float extend_col[4] = {0.0f, 1.0f, 1.0f, 1.0f}; + const bool is_extend = (gps->flag & GP_STROKE_NOFILL) && (gps->flag & GP_STROKE_TAG); - copy_v4_v4(col, ink); + if (!gpencil_stroke_is_drawable(tgpf, gps)) { + return; + } + if ((is_extend) && (!tgpf->is_render)) { + copy_v4_v4(col, extend_col); + } + else { + copy_v4_v4(col, ink); + } /* if cyclic needs more vertex */ int cyclic_add = (cyclic) ? 1 : 0; @@ -195,7 +391,7 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR); /* draw stroke curve */ - GPU_line_width(1.0f); + GPU_line_width((!is_extend) ? thickness : thickness * 2.0f); immBeginAtMost(GPU_PRIM_LINE_STRIP, totpoints + cyclic_add); const bGPDspoint *pt = points; @@ -226,15 +422,77 @@ static void gpencil_draw_basic_stroke(tGPDfill *tgpf, immUnbindProgram(); } -/* loop all layers */ +static void draw_mouse_position(tGPDfill *tgpf) +{ + if (tgpf->gps_mouse == NULL) { + return; + } + uchar mouse_color[4] = {0, 0, 255, 255}; + + bGPDspoint *pt = &tgpf->gps_mouse->points[0]; + float point_size = (tgpf->zoom == 1.0f) ? 4.0f * tgpf->fill_factor : + (0.5f * tgpf->zoom) + tgpf->fill_factor; + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + + /* Draw mouse click position in Blue. */ + immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR); + GPU_point_size(point_size); + immBegin(GPU_PRIM_POINTS, 1); + immAttr4ubv(col, mouse_color); + immVertex3fv(pos, &pt->x); + immEnd(); + immUnbindProgram(); +} + +/* Helper: Check if must skip the layer */ +bool skip_layer_check(short fill_layer_mode, int gpl_active_index, int gpl_index) +{ + bool skip = false; + + switch (fill_layer_mode) { + case GP_FILL_GPLMODE_ACTIVE: { + if (gpl_index != gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ABOVE: { + if (gpl_index != gpl_active_index + 1) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_BELOW: { + if (gpl_index != gpl_active_index - 1) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ALL_ABOVE: { + if (gpl_index <= gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_ALL_BELOW: { + if (gpl_index >= gpl_active_index) { + skip = true; + } + break; + } + case GP_FILL_GPLMODE_VISIBLE: + default: + break; + } + + return skip; +} + +/* Loop all layers to draw strokes. */ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) { - /* duplicated: etempFlags */ - enum { - GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */ - GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ - }; - Object *ob = tgpf->ob; bGPdata *gpd = tgpf->gpd; Brush *brush = tgpf->brush; @@ -248,8 +506,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) tgpw.gpd = gpd; tgpw.offsx = 0; tgpw.offsy = 0; - tgpw.winx = tgpf->region->winx; - tgpw.winy = tgpf->region->winy; + tgpw.winx = tgpf->sizex; + tgpw.winy = tgpf->sizey; tgpw.dflag = 0; tgpw.disable_fill = 1; tgpw.dflag |= (GP_DRAWFILLS_ONLY3D | GP_DRAWFILLS_NOSTATUS); @@ -262,6 +520,9 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); BLI_assert(gpl_active_index >= 0); + /* Draw blue point where click with mouse. */ + draw_mouse_position(tgpf); + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { /* do not draw layer if hidden */ if (gpl->flag & GP_LAYER_HIDE) { @@ -273,43 +534,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) /* Decide if the strokes of layers are included or not depending on the layer mode. * Cannot skip the layer because it can use boundary strokes and must be used. */ - bool skip = false; const int gpl_index = BLI_findindex(&gpd->layers, gpl); - switch (brush_settings->fill_layer_mode) { - case GP_FILL_GPLMODE_ACTIVE: { - if (gpl_index != gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ABOVE: { - if (gpl_index != gpl_active_index + 1) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_BELOW: { - if (gpl_index != gpl_active_index - 1) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ALL_ABOVE: { - if (gpl_index <= gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_ALL_BELOW: { - if (gpl_index >= gpl_active_index) { - skip = true; - } - break; - } - case GP_FILL_GPLMODE_VISIBLE: - default: - break; - } + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); /* if active layer and no keyframe, create a new one */ if (gpl == tgpf->gpl) { @@ -352,17 +578,19 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) tgpw.gpf = gpf; tgpw.t_gpf = gpf; - /* reduce thickness to avoid gaps */ tgpw.is_fill_stroke = (tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) ? false : true; + /* Reduce thickness to avoid gaps. */ tgpw.lthick = gpl->line_change; tgpw.opacity = 1.0; copy_v4_v4(tgpw.tintcolor, ink); tgpw.onion = true; tgpw.custonion = true; - /* normal strokes */ + /* Normal strokes. */ if (ELEM(tgpf->fill_draw_mode, GP_FILL_DMODE_STROKE, GP_FILL_DMODE_BOTH)) { - ED_gpencil_draw_fill(&tgpw); + if (gpencil_stroke_is_drawable(tgpf, gps) && ((gps->flag & GP_STROKE_TAG) == 0)) { + ED_gpencil_draw_fill(&tgpw); + } } /* 3D Lines with basic shapes and invisible lines */ @@ -373,7 +601,8 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) gps->flag & GP_STROKE_CYCLIC, ink, tgpf->flag, - tgpf->fill_threshold); + tgpf->fill_threshold, + 1.0f); } } } @@ -392,8 +621,8 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) } /* set temporary new size */ - tgpf->bwinx = tgpf->region->winx; - tgpf->bwiny = tgpf->region->winy; + tgpf->bwinx = tgpf->region->sizex; + tgpf->bwiny = tgpf->region->sizey; tgpf->brect = tgpf->region->winrct; /* resize region */ @@ -408,12 +637,6 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) tgpf->sizex = (int)tgpf->region->winx; tgpf->sizey = (int)tgpf->region->winy; - /* adjust center */ - float center[2]; - center[0] = (float)tgpf->center[0] * ((float)tgpf->region->winx / (float)tgpf->bwinx); - center[1] = (float)tgpf->center[1] * ((float)tgpf->region->winy / (float)tgpf->bwiny); - round_v2i_v2fl(tgpf->center, center); - char err_out[256] = "unknown"; GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, tgpf->sizey, true, false, err_out); if (offscreen == NULL) { @@ -422,7 +645,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) } GPU_offscreen_bind(offscreen, true); - uint flag = IB_rect | IB_rectfloat; + uint flag = IB_rectfloat; ImBuf *ibuf = IMB_allocImBuf(tgpf->sizex, tgpf->sizey, 32, flag); rctf viewplane; @@ -437,6 +660,21 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) &clip_start, &clip_end, NULL); + + /* Rescale viewplane to fit all strokes. */ + float width = viewplane.xmax - viewplane.xmin; + float height = viewplane.ymax - viewplane.ymin; + + float width_new = width * tgpf->zoom; + float height_new = height * tgpf->zoom; + float scale_x = (width_new - width) / 2.0f; + float scale_y = (height_new - height) / 2.0f; + + viewplane.xmin -= scale_x; + viewplane.xmax += scale_x; + viewplane.ymin -= scale_y; + viewplane.ymax += scale_y; + if (is_ortho) { orthographic_m4(winmat, viewplane.xmin, @@ -506,35 +744,23 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) /* return pixel data (rgba) at index */ static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4]) { - if (ibuf->rect_float) { - const float *frgba = &ibuf->rect_float[idx * 4]; - copy_v4_v4(r_col, frgba); - } - else { - /* XXX: This case probably doesn't happen, as we only write to the float buffer, - * but we get compiler warnings about uninitialized vars otherwise - */ - BLI_assert(!"gpencil_fill.c - get_pixel() non-float case is used!"); - zero_v4(r_col); - } + BLI_assert(ibuf->rect_float != NULL); + memcpy(r_col, &ibuf->rect_float[idx * 4], sizeof(float[4])); } /* set pixel data (rgba) at index */ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) { - // BLI_assert(idx <= ibuf->x * ibuf->y); - if (ibuf->rect) { - uint *rrect = &ibuf->rect[idx]; - uchar ccol[4]; + BLI_assert(ibuf->rect_float != NULL); + float *rrectf = &ibuf->rect_float[idx * 4]; + copy_v4_v4(rrectf, col); +} - rgba_float_to_uchar(ccol, col); - *rrect = *((uint *)ccol); - } - - if (ibuf->rect_float) { - float *rrectf = &ibuf->rect_float[idx * 4]; - copy_v4_v4(rrectf, col); - } +/* Helper: Check if one image row is empty. */ +static bool is_row_filled(const ImBuf *ibuf, const int row_index) +{ + float *row = &ibuf->rect_float[ibuf->x * 4 * row_index]; + return (row[0] == 0.0f && memcmp(row, row + 1, ((ibuf->x * 4) - 1) * sizeof(float)) != 0); } /** @@ -542,6 +768,9 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) * this is used for strokes with small gaps between them to get a full fill * and do not get a full screen fill. * + * This function assumes that if the furthest pixel is occupied, + * the other pixels are occupied. + * * \param ibuf: Image pixel data. * \param maxpixel: Maximum index. * \param limit: Limit of pixels to analyze. @@ -551,10 +780,10 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index, int type) { float rgba[4]; - int i; int pt; bool t_a = false; bool t_b = false; + const int extreme = limit - 1; /* Horizontal leak (check vertical pixels) * X @@ -565,37 +794,29 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index */ if (type == LEAK_HORZ) { /* pixels on top */ - for (i = 1; i <= limit; i++) { - pt = index + (ibuf->x * i); - if (pt <= maxpixel) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_a = true; - break; - } - } - else { - /* edge of image*/ + pt = index + (ibuf->x * extreme); + if (pt <= maxpixel) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { t_a = true; - break; } } + else { + /* edge of image*/ + t_a = true; + } /* pixels on bottom */ - for (i = 1; i <= limit; i++) { - pt = index - (ibuf->x * i); - if (pt >= 0) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_b = true; - break; - } - } - else { - /* edge of image*/ + pt = index - (ibuf->x * extreme); + if (pt >= 0) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { t_b = true; - break; } } + else { + /* edge of image*/ + t_b = true; + } } /* Vertical leak (check horizontal pixels) @@ -609,35 +830,27 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index int higpix = lowpix + ibuf->x - 1; /* pixels to right */ - for (i = 0; i < limit; i++) { - pt = index - (limit - i); - if (pt >= lowpix) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_a = true; - break; - } - } - else { - t_a = true; /* edge of image*/ - break; + pt = index - extreme; + if (pt >= lowpix) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { + t_a = true; } } + else { + t_a = true; /* edge of image*/ + } /* pixels to left */ - for (i = 0; i < limit; i++) { - pt = index + (limit - i); - if (pt <= higpix) { - get_pixel(ibuf, pt, rgba); - if (rgba[0] == 1.0f) { - t_b = true; - break; - } - } - else { - t_b = true; /* edge of image */ - break; + pt = index + extreme; + if (pt <= higpix) { + get_pixel(ibuf, pt, rgba); + if (rgba[0] == 1.0f) { + t_b = true; } } + else { + t_b = true; /* edge of image */ + } } return (bool)(t_a && t_b); } @@ -660,10 +873,21 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__); - /* calculate index of the seed point using the position of the mouse */ - int index = (tgpf->sizex * tgpf->center[1]) + tgpf->center[0]; + /* Calculate index of the seed point using the position of the mouse looking + * for a blue pixel. */ + int index = -1; + for (int i = 0; i < maxpixel; i++) { + get_pixel(ibuf, i, rgba); + if (rgba[2] == 1.0f) { + index = i; + break; + } + } + if ((index >= 0) && (index <= maxpixel)) { - BLI_stack_push(stack, &index); + if (!FILL_DEBUG) { + BLI_stack_push(stack, &index); + } } /* the fill use a stack to save the pixel list instead of the common recursive @@ -774,18 +998,24 @@ static void gpencil_invert_image(tGPDfill *tgpf) ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); const int maxpixel = (ibuf->x * ibuf->y) - 1; + const int center = ibuf->x / 2; for (int v = maxpixel; v != 0; v--) { float color[4]; get_pixel(ibuf, v, color); - /* Green. */ + /* Green->Red. */ if (color[1] == 1.0f) { set_pixel(ibuf, v, fill_col[0]); } + /* Red->Green */ else if (color[0] == 1.0f) { set_pixel(ibuf, v, fill_col[1]); + /* Add thickness of 2 pixels to avoid too thin lines. */ + int offset = (v % ibuf->x < center) ? 1 : -1; + set_pixel(ibuf, v + offset, fill_col[1]); } else { + /* Set to Transparent. */ set_pixel(ibuf, v, fill_col[2]); } } @@ -822,21 +1052,37 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf) float rgba[4]; for (int idy = 0; idy < ibuf->y; idy++) { - bool clear = false; + int init = -1; + int end = -1; for (int idx = 0; idx < ibuf->x; idx++) { int image_idx = ibuf->x * idy + idx; get_pixel(ibuf, image_idx, rgba); /* Blue. */ if (rgba[2] == 1.0f) { - clear = true; + if (init < 0) { + init = image_idx; + } + else { + end = image_idx; + } } /* Red. */ else if (rgba[0] == 1.0f) { - clear = false; + if (init > -1) { + for (int i = init; i <= max_ii(init, end); i++) { + set_pixel(ibuf, i, clear_col); + } + init = -1; + end = -1; + } } - if (clear) { - set_pixel(ibuf, image_idx, clear_col); + } + /* Check last segment. */ + if (init > -1) { + for (int i = init; i <= max_ii(init, end); i++) { + set_pixel(ibuf, i, clear_col); } + set_pixel(ibuf, init, clear_col); } } @@ -857,87 +1103,98 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf) * XXXX * ----------- */ -static void dilate_shape(ImBuf *ibuf) +static bool dilate_shape(ImBuf *ibuf) { + bool done = false; + BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__); const float green[4] = {0.0f, 1.0f, 0.0f, 1.0f}; - const int maxpixel = (ibuf->x * ibuf->y) - 1; + // const int maxpixel = (ibuf->x * ibuf->y) - 1; /* detect pixels and expand into red areas */ - for (int v = maxpixel; v != 0; v--) { - float color[4]; - int index; - int tp = 0; - int bm = 0; - int lt = 0; - int rt = 0; - get_pixel(ibuf, v, color); - if (color[1] == 1.0f) { - /* pixel left */ - if (v - 1 >= 0) { - index = v - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - lt = index; + for (int row = 0; row < ibuf->y; row++) { + if (!is_row_filled(ibuf, row)) { + continue; + } + int maxpixel = (ibuf->x * (row + 1)) - 1; + int minpixel = ibuf->x * row; + + for (int v = maxpixel; v != minpixel; v--) { + float color[4]; + int index; + get_pixel(ibuf, v, color); + if (color[1] == 1.0f) { + int tp = 0; + int bm = 0; + int lt = 0; + int rt = 0; + + /* pixel left */ + if (v - 1 >= 0) { + index = v - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + lt = index; + } } - } - /* pixel right */ - if (v + 1 <= maxpixel) { - index = v + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - rt = index; + /* pixel right */ + if (v + 1 <= maxpixel) { + index = v + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + rt = index; + } } - } - /* pixel top */ - if (v + ibuf->x <= maxpixel) { - index = v + ibuf->x; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - tp = index; + /* pixel top */ + if (v + (ibuf->x * 1) <= maxpixel) { + index = v + (ibuf->x * 1); + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + tp = index; + } } - } - /* pixel bottom */ - if (v - ibuf->x >= 0) { - index = v - ibuf->x; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); - bm = index; + /* pixel bottom */ + if (v - (ibuf->x * 1) >= 0) { + index = v - (ibuf->x * 1); + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + bm = index; + } } - } - /* pixel top-left */ - if (tp && lt) { - index = tp - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel top-left */ + if (tp && lt) { + index = tp - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel top-right */ - if (tp && rt) { - index = tp + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel top-right */ + if (tp && rt) { + index = tp + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel bottom-left */ - if (bm && lt) { - index = bm - 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel bottom-left */ + if (bm && lt) { + index = bm - 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } - } - /* pixel bottom-right */ - if (bm && rt) { - index = bm + 1; - get_pixel(ibuf, index, color); - if (color[0] == 1.0f) { - BLI_stack_push(stack, &index); + /* pixel bottom-right */ + if (bm && rt) { + index = bm + 1; + get_pixel(ibuf, index, color); + if (color[0] == 1.0f) { + BLI_stack_push(stack, &index); + } } } } @@ -947,8 +1204,11 @@ static void dilate_shape(ImBuf *ibuf) int v; BLI_stack_pop(stack, &v); set_pixel(ibuf, v, green); + done = true; } BLI_stack_free(stack); + + return done; } /* Get the outline points of a shape using Moore Neighborhood algorithm @@ -964,11 +1224,12 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) int v[2]; int boundary_co[2]; int start_co[2]; + int first_co[2] = {-1, -1}; int backtracked_co[2]; int current_check_co[2]; int prev_check_co[2]; int backtracked_offset[1][2] = {{0, 0}}; - // bool boundary_found = false; + bool first_pixel = false; bool start_found = false; const int NEIGHBOR_COUNT = 8; @@ -993,7 +1254,6 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) dilate_shape(ibuf); } - /* find the initial point to start outline analysis */ for (int idx = imagesize - 1; idx != 0; idx--) { get_pixel(ibuf, idx, rgba); if (rgba[1] == 1.0f) { @@ -1046,12 +1306,17 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) cur_back_offset++; loop++; } - /* current pixel is equal to starting pixel */ - if (boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) { + /* Current pixel is equal to starting or firt pixel. */ + if ((boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) || + (boundary_co[0] == first_co[0] && boundary_co[1] == first_co[1])) { BLI_stack_pop(tgpf->stack, &v); - // boundary_found = true; break; } + + if (!first_pixel) { + first_pixel = true; + copy_v2_v2_int(first_co, boundary_co); + } } /* release ibuf */ @@ -1172,6 +1437,9 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) return; } + /* Set as done. */ + tgpf->done = true; + /* Get frame or create a new one. */ tgpf->gpf = BKE_gpencil_layer_frame_get(tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW); @@ -1327,7 +1595,6 @@ static void gpencil_fill_draw_3d(const bContext *C, ARegion *UNUSED(region), voi if (region != tgpf->region) { return; } - gpencil_draw_boundary_lines(C, tgpf); } @@ -1378,6 +1645,10 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->win = CTX_wm_window(C); tgpf->active_cfra = CFRA; + /* Setup space conversions. */ + gpencil_point_conversion_init(C, &tgpf->gsc); + tgpf->zoom = 1.0f; + /* set GP datablock */ tgpf->gpd = gpd; tgpf->gpl = BKE_gpencil_layer_active_get(gpd); @@ -1388,6 +1659,7 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->lock_axis = ts->gp_sculpt.lock_axis; tgpf->oldkey = -1; + tgpf->is_render = false; tgpf->sbuffer_used = 0; tgpf->sbuffer = NULL; tgpf->depth_arr = NULL; @@ -1399,8 +1671,9 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->fill_threshold = brush->gpencil_settings->fill_threshold; tgpf->fill_simplylvl = brush->gpencil_settings->fill_simplylvl; tgpf->fill_draw_mode = brush->gpencil_settings->fill_draw_mode; + tgpf->fill_extend_fac = brush->gpencil_settings->fill_extend_fac; tgpf->fill_factor = max_ff(GPENCIL_MIN_FILL_FAC, - min_ff(brush->gpencil_settings->fill_factor, 8.0f)); + min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC)); tgpf->fill_leak = (int)ceil((float)brush->gpencil_settings->fill_leak * tgpf->fill_factor); int totcol = tgpf->ob->totcol; @@ -1426,7 +1699,6 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) /* end operator */ static void gpencil_fill_exit(bContext *C, wmOperator *op) { - Main *bmain = CTX_data_main(C); Object *ob = CTX_data_active_object(C); /* clear undo stack */ @@ -1445,16 +1717,14 @@ static void gpencil_fill_exit(bContext *C, wmOperator *op) MEM_SAFE_FREE(tgpf->sbuffer); MEM_SAFE_FREE(tgpf->depth_arr); + /* Remove any temp stroke. */ + gpencil_delete_temp_stroke_extension(tgpf, true); + /* remove drawing handler */ if (tgpf->draw_handle_3d) { ED_region_draw_cb_exit(tgpf->region->type, tgpf->draw_handle_3d); } - /* Delete temp image. */ - if (tgpf->ima) { - BKE_id_free(bmain, tgpf->ima); - } - /* finally, free memory used by temp data */ MEM_freeN(tgpf); } @@ -1538,7 +1808,11 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE tgpf = op->customdata; /* Enable custom drawing handlers to show help lines */ - if (tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) { + const bool do_extend = (tgpf->fill_extend_fac > 0.0f); + const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) || + ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend))); + + if (help_lines) { tgpf->draw_handle_3d = ED_region_draw_cb_activate( tgpf->region->type, gpencil_fill_draw_3d, tgpf, REGION_DRAW_POST_VIEW); } @@ -1556,17 +1830,210 @@ static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE return OPERATOR_RUNNING_MODAL; } +/* Helper: Calc the maximum bounding box size of strokes to get the zoom level of the viewport. + * For each stroke, the 2D projected bounding box is calculated and using this data, the total + * object bounding box (all strokes) is calculated. */ +static void gpencil_zoom_level_set(tGPDfill *tgpf) +{ + Brush *brush = tgpf->brush; + if (brush->gpencil_settings->flag & GP_BRUSH_FILL_FIT_DISABLE) { + tgpf->zoom = 1.0f; + return; + } + + Object *ob = tgpf->ob; + bGPdata *gpd = tgpf->gpd; + BrushGpencilSettings *brush_settings = tgpf->brush->gpencil_settings; + bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(gpd); + BLI_assert(gpl_active != NULL); + + const int gpl_active_index = BLI_findindex(&gpd->layers, gpl_active); + BLI_assert(gpl_active_index >= 0); + + /* Init maximum boundbox size. */ + rctf rect_max; + const float winx_half = tgpf->region->winx / 2.0f; + const float winy_half = tgpf->region->winy / 2.0f; + BLI_rctf_init(&rect_max, + 0.0f - winx_half, + tgpf->region->winx + winx_half, + 0.0f - winy_half, + tgpf->region->winy + winy_half); + + float objectbox_min[2], objectbox_max[2]; + INIT_MINMAX2(objectbox_min, objectbox_max); + rctf rect_bound; + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (gpl->flag & GP_LAYER_HIDE) { + continue; + } + float diff_mat[4][4]; + /* calculate parent matrix */ + BKE_gpencil_layer_transform_matrix_get(tgpf->depsgraph, ob, gpl, diff_mat); + + /* Decide if the strokes of layers are included or not depending on the layer mode. + * Cannot skip the layer because it can use boundary strokes and must be used. */ + const int gpl_index = BLI_findindex(&gpd->layers, gpl); + bool skip = skip_layer_check(brush_settings->fill_layer_mode, gpl_active_index, gpl_index); + + /* Get frame to check. */ + bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, tgpf->active_cfra, GP_GETFRAME_USE_PREV); + if (gpf == NULL) { + continue; + } + + /* Read all strokes. */ + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + /* check if stroke can be drawn */ + if ((gps->points == NULL) || (gps->totpoints < 2)) { + continue; + } + /* check if the color is visible */ + MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(ob, gps->mat_nr + 1); + if ((gp_style == NULL) || (gp_style->flag & GP_MATERIAL_HIDE)) { + continue; + } + + /* If the layer must be skipped, but the stroke is not boundary, skip stroke. */ + if ((skip) && ((gps->flag & GP_STROKE_NOFILL) == 0)) { + continue; + } + + float boundbox_min[2]; + float boundbox_max[2]; + ED_gpencil_projected_2d_bound_box(&tgpf->gsc, gps, diff_mat, boundbox_min, boundbox_max); + minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_min); + minmax_v2v2_v2(objectbox_min, objectbox_max, boundbox_max); + } + } + /* Clamp max bound box. */ + BLI_rctf_init( + &rect_bound, objectbox_min[0], objectbox_max[0], objectbox_min[1], objectbox_max[1]); + float r_xy[2]; + BLI_rctf_clamp(&rect_bound, &rect_max, r_xy); + + /* Calculate total width used. */ + float width = tgpf->region->winx; + if (rect_bound.xmin < 0.0f) { + width -= rect_bound.xmin; + } + if (rect_bound.xmax > tgpf->region->winx) { + width += rect_bound.xmax - tgpf->region->winx; + } + /* Calculate total height used. */ + float height = tgpf->region->winy; + if (rect_bound.ymin < 0.0f) { + height -= rect_bound.ymin; + } + if (rect_bound.ymax > tgpf->region->winy) { + height += rect_bound.ymax - tgpf->region->winy; + } + + width = ceilf(width); + height = ceilf(height); + + float zoomx = (width > tgpf->region->winx) ? width / (float)tgpf->region->winx : 1.0f; + float zoomy = (height > tgpf->region->winy) ? height / (float)tgpf->region->winy : 1.0f; + if ((zoomx != 1.0f) || (zoomy != 1.0f)) { + tgpf->zoom = min_ff(max_ff(zoomx, zoomy) * 1.5f, 5.0f); + } +} + +static bool gpencil_do_frame_fill(tGPDfill *tgpf, const bool is_inverted) +{ + wmWindow *win = CTX_wm_window(tgpf->C); + + /* render screen to temp image */ + int totpoints = 1; + if (gpencil_render_offscreen(tgpf)) { + + /* Set red borders to create a external limit. */ + gpencil_set_borders(tgpf, true); + + /* apply boundary fill */ + gpencil_boundaryfill_area(tgpf); + + /* Invert direction if press Ctrl. */ + if (is_inverted) { + gpencil_invert_image(tgpf); + } + + /* Clean borders to avoid infinite loops. */ + gpencil_set_borders(tgpf, false); + WM_cursor_time(win, 50); + int totpoints_prv = 0; + int loop_limit = 0; + while (totpoints > 0) { + /* analyze outline */ + gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); + + /* create array of points from stack */ + totpoints = gpencil_points_from_stack(tgpf); + + /* create z-depth array for reproject */ + gpencil_get_depth_array(tgpf); + + /* create stroke and reproject */ + gpencil_stroke_from_buffer(tgpf); + + if (is_inverted) { + gpencil_erase_processed_area(tgpf); + } + else { + /* Exit of the loop. */ + totpoints = 0; + } + + /* free temp stack data */ + if (tgpf->stack) { + BLI_stack_free(tgpf->stack); + } + WM_cursor_time(win, 100); + + /* Free memory. */ + MEM_SAFE_FREE(tgpf->sbuffer); + MEM_SAFE_FREE(tgpf->depth_arr); + + /* Limit very small areas. */ + if (totpoints < 3) { + break; + } + /* Limit infinite loops is some corner cases. */ + if (totpoints_prv == totpoints) { + loop_limit++; + if (loop_limit > 3) { + break; + } + } + totpoints_prv = totpoints; + } + + /* Delete temp image. */ + if ((tgpf->ima) && (!FILL_DEBUG)) { + BKE_id_free(tgpf->bmain, tgpf->ima); + } + + return true; + } + + return false; +} + /* events handling during interactive part of operator */ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) { tGPDfill *tgpf = op->customdata; - Scene *scene = tgpf->scene; Brush *brush = tgpf->brush; BrushGpencilSettings *brush_settings = brush->gpencil_settings; + tgpf->on_back = RNA_boolean_get(op->ptr, "on_back"); + const bool is_brush_inv = brush_settings->fill_direction == BRUSH_DIR_IN; const bool is_inverted = (is_brush_inv && !event->ctrl) || (!is_brush_inv && event->ctrl); - - int estate = OPERATOR_PASS_THROUGH; /* default exit state - pass through */ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(tgpf->gpd); + const bool do_extend = (tgpf->fill_extend_fac > 0.0f); + const bool help_lines = ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) || + ((tgpf->flag & GP_BRUSH_FILL_SHOW_EXTENDLINES) && (do_extend))); + int estate = OPERATOR_RUNNING_MODAL; switch (event->type) { case EVT_ESCKEY: @@ -1574,82 +2041,104 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) estate = OPERATOR_CANCELLED; break; case LEFTMOUSE: - tgpf->on_back = RNA_boolean_get(op->ptr, "on_back"); /* first time the event is not enabled to show help lines. */ - if ((tgpf->oldkey != -1) || ((tgpf->flag & GP_BRUSH_FILL_SHOW_HELPLINES) == 0)) { + if ((tgpf->oldkey != -1) || (!help_lines)) { ARegion *region = BKE_area_find_region_xy( CTX_wm_area(C), RGN_TYPE_ANY, event->x, event->y); if (region) { bool in_bounds = false; - /* Perform bounds check */ in_bounds = BLI_rcti_isect_pt(®ion->winrct, event->x, event->y); if ((in_bounds) && (region->regiontype == RGN_TYPE_WINDOW)) { - tgpf->center[0] = event->mval[0]; - tgpf->center[1] = event->mval[1]; + tgpf->mouse[0] = event->mval[0]; + tgpf->mouse[1] = event->mval[1]; + tgpf->is_render = true; + /* Define Zoom level. */ + gpencil_zoom_level_set(tgpf); - /* Set active frame as current for filling. */ - tgpf->active_cfra = CFRA; + /* Create Temp stroke. */ + tgpf->gps_mouse = BKE_gpencil_stroke_new(0, 1, 10.0f); + tGPspoint point2D; + bGPDspoint *pt = &tgpf->gps_mouse->points[0]; + copy_v2fl_v2i(&point2D.x, tgpf->mouse); + gpencil_stroke_convertcoords_tpoint( + tgpf->scene, tgpf->region, tgpf->ob, &point2D, NULL, &pt->x); - /* render screen to temp image */ - int totpoints = 1; - if (gpencil_render_offscreen(tgpf)) { - - /* Set red borders to create a external limit. */ - gpencil_set_borders(tgpf, true); - - /* apply boundary fill */ - gpencil_boundaryfill_area(tgpf); - - /* Invert direction if press Ctrl. */ - if (is_inverted) { - gpencil_invert_image(tgpf); - } - - /* Clean borders to avoid infinite loops. */ - gpencil_set_borders(tgpf, false); - - while (totpoints > 0) { - /* analyze outline */ - gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); - - /* create array of points from stack */ - totpoints = gpencil_points_from_stack(tgpf); - - /* create z-depth array for reproject */ - gpencil_get_depth_array(tgpf); - - /* create stroke and reproject */ - gpencil_stroke_from_buffer(tgpf); - - if (is_inverted) { - gpencil_erase_processed_area(tgpf); - } - else { - /* Exit of the loop. */ - totpoints = 0; - } - - /* free temp stack data */ - if (tgpf->stack) { - BLI_stack_free(tgpf->stack); - } - - /* Free memory. */ - MEM_SAFE_FREE(tgpf->sbuffer); - MEM_SAFE_FREE(tgpf->depth_arr); - } + /* If not multiframe and there is no frame in CFRA for the active layer, create + * a new frame before to make the hash function can find something. */ + if (!is_multiedit) { + tgpf->gpf = BKE_gpencil_layer_frame_get( + tgpf->gpl, tgpf->active_cfra, GP_GETFRAME_ADD_NEW); + tgpf->gpf->flag |= GP_FRAME_SELECT; } - /* restore size */ - tgpf->region->winx = (short)tgpf->bwinx; - tgpf->region->winy = (short)tgpf->bwiny; - tgpf->region->winrct = tgpf->brect; + /* Hash of selected frames.*/ + GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64); + BKE_gpencil_frame_selected_hash(tgpf->gpd, frame_list); + + /* Loop all frames. */ + wmWindow *win = CTX_wm_window(C); + + GHashIterator gh_iter; + int total = BLI_ghash_len(frame_list); + int i = 1; + GHASH_ITER (gh_iter, frame_list) { + /* Set active frame as current for filling. */ + tgpf->active_cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter)); + int step = ((float)i / (float)total) * 100.0f; + WM_cursor_time(win, step); + + if (do_extend) { + gpencil_update_extend(tgpf); + } + + /* Repeat loop until get something. */ + tgpf->done = false; + int loop_limit = 0; + while ((!tgpf->done) && (loop_limit < 2)) { + WM_cursor_time(win, loop_limit + 1); + /* Render screen to temp image and do fill. */ + gpencil_do_frame_fill(tgpf, is_inverted); + + /* restore size */ + tgpf->region->winx = (short)tgpf->bwinx; + tgpf->region->winy = (short)tgpf->bwiny; + tgpf->region->winrct = tgpf->brect; + if (!tgpf->done) { + /* If the zoom was not set before, avoid a loop. */ + if (tgpf->zoom == 1.0f) { + loop_limit++; + } + else { + tgpf->zoom = 1.0f; + tgpf->fill_factor = max_ff( + GPENCIL_MIN_FILL_FAC, + min_ff(brush->gpencil_settings->fill_factor, GPENCIL_MAX_FILL_FAC)); + } + } + loop_limit++; + } + + if (do_extend) { + gpencil_delete_temp_stroke_extension(tgpf, true); + } + + i++; + } + WM_cursor_modal_restore(win); + /* Free hash table. */ + BLI_ghash_free(frame_list, NULL, NULL); + + /* Free temp stroke. */ + BKE_gpencil_free_stroke(tgpf->gps_mouse); /* push undo data */ gpencil_undo_push(tgpf->gpd); + /* Save extend value for next operation. */ + brush_settings->fill_extend_fac = tgpf->fill_extend_fac; + estate = OPERATOR_FINISHED; } else { @@ -1660,8 +2149,29 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) estate = OPERATOR_CANCELLED; } } + else if (do_extend) { + gpencil_update_extend(tgpf); + } tgpf->oldkey = event->type; break; + case EVT_PAGEUPKEY: + case WHEELUPMOUSE: + if (tgpf->oldkey == 1) { + tgpf->fill_extend_fac -= (event->shift) ? 0.01f : 0.1f; + CLAMP_MIN(tgpf->fill_extend_fac, 0.0f); + gpencil_update_extend(tgpf); + } + break; + case EVT_PAGEDOWNKEY: + case WHEELDOWNMOUSE: + if (tgpf->oldkey == 1) { + tgpf->fill_extend_fac += (event->shift) ? 0.01f : 0.1f; + CLAMP_MAX(tgpf->fill_extend_fac, 100.0f); + gpencil_update_extend(tgpf); + } + break; + default: + break; } /* process last operations before exiting */ switch (estate) { @@ -1674,7 +2184,7 @@ static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent *event) gpencil_fill_exit(C, op); break; - case OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH: + default: break; } diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 2d5491e7569..b833125cf34 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1306,6 +1306,12 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, gps); + /* In Multiframe mode, duplicate the stroke in other frames. */ + if (GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd)) { + const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK); + BKE_gpencil_stroke_copy_to_keyframes(gpd, gpl, p->gpf, gps, tail); + } + gpencil_stroke_added_enable(p); } @@ -1323,10 +1329,8 @@ static float view3d_point_depth(const RegionView3D *rv3d, const float co[3]) } /* only erase stroke points that are visible */ -static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p, - const bGPDspoint *pt, - const int x, - const int y) +static bool gpencil_stroke_eraser_is_occluded( + tGPsdata *p, bGPDlayer *gpl, const bGPDspoint *pt, const int x, const int y) { Object *obact = (Object *)p->ownerPtr.data; Brush *brush = p->brush; @@ -1343,7 +1347,6 @@ static bool gpencil_stroke_eraser_is_occluded(tGPsdata *p, if ((gp_settings != NULL) && (p->area->spacetype == SPACE_VIEW3D) && (gp_settings->flag & GP_BRUSH_OCCLUDE_ERASER)) { RegionView3D *rv3d = p->region->regiondata; - bGPDlayer *gpl = p->gpl; const int mval_i[2] = {x, y}; float mval_3d[3]; @@ -1454,6 +1457,7 @@ static void gpencil_stroke_soft_refine(bGPDstroke *gps) /* eraser tool - evaluation per stroke */ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, + bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const float mval[2], @@ -1579,9 +1583,9 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, * - this assumes that linewidth is irrelevant */ if (gpencil_stroke_inside_circle(mval, radius, pc0[0], pc0[1], pc2[0], pc2[1])) { - if ((gpencil_stroke_eraser_is_occluded(p, pt0, pc0[0], pc0[1]) == false) || - (gpencil_stroke_eraser_is_occluded(p, pt1, pc1[0], pc1[1]) == false) || - (gpencil_stroke_eraser_is_occluded(p, pt2, pc2[0], pc2[1]) == false)) { + if ((gpencil_stroke_eraser_is_occluded(p, gpl, pt0, pc0[0], pc0[1]) == false) || + (gpencil_stroke_eraser_is_occluded(p, gpl, pt1, pc1[0], pc1[1]) == false) || + (gpencil_stroke_eraser_is_occluded(p, gpl, pt2, pc2[0], pc2[1]) == false)) { /* Point is affected: */ /* Adjust thickness * - Influence of eraser falls off with distance from the middle of the eraser @@ -1683,6 +1687,8 @@ static void gpencil_stroke_eraser_dostroke(tGPsdata *p, /* erase strokes which fall under the eraser strokes */ static void gpencil_stroke_doeraser(tGPsdata *p) { + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(p->gpd); + rcti rect; Brush *brush = p->brush; Brush *eraser = p->eraser; @@ -1723,40 +1729,53 @@ static void gpencil_stroke_doeraser(tGPsdata *p) * on multiple layers... */ LISTBASE_FOREACH (bGPDlayer *, gpl, &p->gpd->layers) { - bGPDframe *gpf = gpl->actframe; - /* only affect layer if it's editable (and visible) */ if (BKE_gpencil_layer_is_editable(gpl) == false) { continue; } - if (gpf == NULL) { + + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + if (init_gpf == NULL) { continue; } - /* calculate difference matrix */ - BKE_gpencil_layer_transform_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat); - /* loop over strokes, checking segments for intersections */ - LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(p->ob, gpl, gps) == false) { - continue; - } + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { + if (gpf == NULL) { + continue; + } + /* calculate difference matrix */ + BKE_gpencil_layer_transform_matrix_get(p->depsgraph, p->ob, gpl, p->diff_mat); - /* Check if the stroke collide with mouse. */ - if (!ED_gpencil_stroke_check_collision(&p->gsc, gps, p->mval, calc_radius, p->diff_mat)) { - continue; - } + /* loop over strokes, checking segments for intersections */ + LISTBASE_FOREACH_MUTABLE (bGPDstroke *, gps, &gpf->strokes) { + /* check if the color is editable */ + if (ED_gpencil_stroke_material_editable(p->ob, gpl, gps) == false) { + continue; + } - /* Not all strokes in the datablock may be valid in the current editor/context - * (e.g. 2D space strokes in the 3D view, if the same datablock is shared) - */ - if (ED_gpencil_stroke_can_use_direct(p->area, gps)) { - gpencil_stroke_eraser_dostroke(p, gpf, gps, p->mval, calc_radius, &rect); + /* Check if the stroke collide with mouse. */ + if (!ED_gpencil_stroke_check_collision( + &p->gsc, gps, p->mval, calc_radius, p->diff_mat)) { + continue; + } + + /* Not all strokes in the datablock may be valid in the current editor/context + * (e.g. 2D space strokes in the 3D view, if the same datablock is shared) + */ + if (ED_gpencil_stroke_can_use_direct(p->area, gps)) { + gpencil_stroke_eraser_dostroke(p, gpl, gpf, gps, p->mval, calc_radius, &rect); + } + } + + /* if not multiedit, exit loop*/ + if (!is_multiedit) { + break; + } } } } } - /* ******************************************* */ /* Sketching Operator */ diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index d94a02204a2..bcdde49b93d 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -1377,6 +1377,12 @@ static void gpencil_primitive_interaction_end(bContext *C, BKE_gpencil_stroke_geometry_update(tgpi->gpd, gps); } + /* In Multiframe mode, duplicate the stroke in other frames. */ + if (GPENCIL_MULTIEDIT_SESSIONS_ON(tgpi->gpd)) { + const bool tail = (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK); + BKE_gpencil_stroke_copy_to_keyframes(tgpi->gpd, tgpi->gpl, gpf, gps, tail); + } + DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index 42e3055ef65..9b12772bc9b 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -3032,12 +3032,12 @@ void ED_gpencil_sbuffer_vertex_color_set(Depsgraph *depsgraph, } } -/* Helper to get the bigger 2D bound box points. */ -static void gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc, - bGPDstroke *gps, - const float diff_mat[4][4], - float r_min[2], - float r_max[2]) +/* Get the bigger 2D bound box points. */ +void ED_gpencil_projected_2d_bound_box(GP_SpaceConversion *gsc, + bGPDstroke *gps, + const float diff_mat[4][4], + float r_min[2], + float r_max[2]) { float bounds[8][2]; BoundBox bb; @@ -3082,7 +3082,7 @@ bool ED_gpencil_stroke_check_collision(GP_SpaceConversion *gsc, BKE_gpencil_stroke_boundingbox_calc(gps); } - gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max); + ED_gpencil_projected_2d_bound_box(gsc, gps, diff_mat, boundbox_min, boundbox_max); rcti rect_stroke = {boundbox_min[0], boundbox_max[0], boundbox_min[1], boundbox_max[1]}; diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 0136d599e8a..12aef6e9464 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -370,6 +370,11 @@ bool ED_gpencil_stroke_point_is_inside(struct bGPDstroke *gps, struct GP_SpaceConversion *gsc, int mouse[2], const float diff_mat[4][4]); +void ED_gpencil_projected_2d_bound_box(struct GP_SpaceConversion *gsc, + struct bGPDstroke *gps, + const float diff_mat[4][4], + float r_min[2], + float r_max[2]); struct bGPDstroke *ED_gpencil_stroke_nearest_to_ends(struct bContext *C, struct GP_SpaceConversion *gsc, diff --git a/source/blender/makesdna/DNA_brush_enums.h b/source/blender/makesdna/DNA_brush_enums.h index f12934c9104..093a1a00ece 100644 --- a/source/blender/makesdna/DNA_brush_enums.h +++ b/source/blender/makesdna/DNA_brush_enums.h @@ -75,6 +75,10 @@ typedef enum eGPDbrush_Flag { GP_BRUSH_USE_STRENGTH_PRESSURE = (1 << 1), /* brush use pressure for alpha factor */ GP_BRUSH_USE_JITTER_PRESSURE = (1 << 2), + /* Disable automatic zoom for filling. */ + GP_BRUSH_FILL_FIT_DISABLE = (1 << 3), + /* Show extend fill help lines. */ + GP_BRUSH_FILL_SHOW_EXTENDLINES = (1 << 4), /* fill hide transparent */ GP_BRUSH_FILL_HIDE = (1 << 6), /* show fill help lines */ diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 91e0bc0ffa1..a11e7d77c67 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -47,8 +47,6 @@ typedef struct BrushClone { char _pad[4]; } BrushClone; -#define GPENCIL_MIN_FILL_FAC 0.05f - typedef struct BrushGpencilSettings { /** Amount of smoothing to apply to newly created strokes. */ float draw_smoothfac; @@ -133,6 +131,10 @@ typedef struct BrushGpencilSettings { /** Randomness for Value. */ float random_value; + /** Factor to extend stroke extremes using fill tool. */ + float fill_extend_fac; + char _pad3[4]; + struct CurveMapping *curve_sensitivity; struct CurveMapping *curve_strength; struct CurveMapping *curve_jitter; diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 1dbfd547673..e02757c1249 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -45,6 +45,9 @@ struct MDeformVert; #define GP_DEFAULT_CURVE_ERROR 0.1f #define GP_DEFAULT_CURVE_EDIT_CORNER_ANGLE M_PI_2 +#define GPENCIL_MIN_FILL_FAC 0.05f +#define GPENCIL_MAX_FILL_FAC 5.0f + /* ***************************************** */ /* GP Stroke Points */ @@ -809,8 +812,9 @@ typedef enum eGP_DrawMode { /* Check if 'multiedit sessions' is enabled */ #define GPENCIL_MULTIEDIT_SESSIONS_ON(gpd) \ ((gpd) && \ - ((gpd)->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \ - GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \ + ((gpd)->flag & \ + (GP_DATA_STROKE_PAINTMODE | GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | \ + GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE)) && \ ((gpd)->flag & GP_DATA_STROKE_MULTIEDIT)) #define GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd) \ diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 756841dd283..6e2e986ebf8 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -1466,7 +1466,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna) /* fill factor size */ prop = RNA_def_property(srna, "fill_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fill_factor"); - RNA_def_property_range(prop, GPENCIL_MIN_FILL_FAC, 8.0f); + RNA_def_property_range(prop, GPENCIL_MIN_FILL_FAC, GPENCIL_MAX_FILL_FAC); RNA_def_property_ui_text( prop, "Precision", @@ -1608,6 +1608,15 @@ static void rna_def_gpencil_options(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Value", "Random factor to modify original value"); RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); + /* Factor to extend stroke extremes in Fill tool. */ + prop = RNA_def_property(srna, "extend_stroke_factor", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fill_extend_fac"); + RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_ui_text( + prop, "Stroke Extension", "Strokes end extension for closing gaps, use zero to disable"); + RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); + /* Flags */ prop = RNA_def_property(srna, "use_pressure", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_PRESSURE); @@ -1827,6 +1836,12 @@ static void rna_def_gpencil_options(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Lines", "Show help lines for filling to see boundaries"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "show_fill_extend", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_SHOW_EXTENDLINES); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_ui_text(prop, "Show Extend Lines", "Show help lines for stroke extension"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_HIDE); RNA_def_property_boolean_default(prop, true); @@ -1834,6 +1849,15 @@ static void rna_def_gpencil_options(BlenderRNA *brna) prop, "Show Fill", "Show transparent lines to use as boundary for filling"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "use_fill_autofit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_FIT_DISABLE); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_ui_text( + prop, + "Automatic Fit", + "Fit the shape of the stroke to try to fill areas outside visible viewport"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + prop = RNA_def_property(srna, "use_default_eraser", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_DEFAULT_ERASER); RNA_def_property_boolean_default(prop, true); From e44b2ada3e4ad1a5f89f5effd5bf493fd30fc6f2 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Tue, 9 Feb 2021 16:08:45 +0100 Subject: [PATCH 037/519] GPencil: Basic block drawing in Dopesheet Add a bar between keyframes to indicate that keyframe is still used. This is part of a change to make the rec button be used by gpencil. Example: Before: {F9592704} After: {F9592702} Reviewed By: #user_interface, #grease_pencil, pepeland, Severin Maniphest Tasks: T85463 Differential Revision: https://developer.blender.org/D10179 --- .../editors/animation/keyframes_draw.c | 96 ++++++++++++------- .../editors/include/ED_keyframes_draw.h | 2 + 2 files changed, 64 insertions(+), 34 deletions(-) diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c index 542a6d45db7..b9ef69cf8bd 100644 --- a/source/blender/editors/animation/keyframes_draw.c +++ b/source/blender/editors/animation/keyframes_draw.c @@ -258,6 +258,10 @@ static DLRBT_Node *nalloc_ak_gpframe(void *data) /* count keyframes in this column */ ak->totkey = 1; + /* Set as visible block. */ + ak->totblock = 1; + ak->block.sel = ak->sel; + ak->block.flag |= ACTKEYBLOCK_FLAG_GPENCIL; return (DLRBT_Node *)ak; } @@ -689,6 +693,7 @@ static void draw_keylist(View2D *v2d, { const float icon_sz = U.widget_unit * 0.5f * yscale_fac; const float half_icon_sz = 0.5f * icon_sz; + const float quarter_icon_sz = 0.25f * icon_sz; const float smaller_sz = 0.35f * icon_sz; const float ipo_sz = 0.1f * icon_sz; @@ -724,6 +729,7 @@ static void draw_keylist(View2D *v2d, ipo_color_mix[3] *= 0.5f; uint block_len = 0; + uint gpencil_len = 0; LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { if (actkeyblock_get_valid_hold(ab)) { block_len++; @@ -731,50 +737,72 @@ static void draw_keylist(View2D *v2d, if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { block_len++; } + if ((ab->next != NULL) && (ab->block.flag & ACTKEYBLOCK_FLAG_GPENCIL)) { + gpencil_len++; + } } - if (block_len > 0) { + if ((block_len > 0) || (gpencil_len > 0)) { GPUVertFormat *format = immVertexFormat(); uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR); - immBegin(GPU_PRIM_TRIS, 6 * block_len); - LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { - int valid_hold = actkeyblock_get_valid_hold(ab); - if (valid_hold != 0) { - if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) { - /* draw "moving hold" long-keyframe block - slightly smaller */ - immRectf_fast_with_color(pos_id, - color_id, - ab->cfra, - ypos - smaller_sz, - ab->next->cfra, - ypos + smaller_sz, - (ab->block.sel) ? sel_mhcol : unsel_mhcol); + /* Normal Dopesheet. */ + if (block_len > 0) { + immBegin(GPU_PRIM_TRIS, 6 * block_len); + LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { + int valid_hold = actkeyblock_get_valid_hold(ab); + if (valid_hold != 0) { + if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) { + /* draw "moving hold" long-keyframe block - slightly smaller */ + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - smaller_sz, + ab->next->cfra, + ypos + smaller_sz, + (ab->block.sel) ? sel_mhcol : unsel_mhcol); + } + else { + /* draw standard long-keyframe block */ + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - half_icon_sz, + ab->next->cfra, + ypos + half_icon_sz, + (ab->block.sel) ? sel_color : unsel_color); + } } - else { - /* draw standard long-keyframe block */ - immRectf_fast_with_color(pos_id, - color_id, - ab->cfra, - ypos - half_icon_sz, - ab->next->cfra, - ypos + half_icon_sz, - (ab->block.sel) ? sel_color : unsel_color); + if (show_ipo && actkeyblock_is_valid(ab) && + (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { + /* draw an interpolation line */ + immRectf_fast_with_color( + pos_id, + color_id, + ab->cfra, + ypos - ipo_sz, + ab->next->cfra, + ypos + ipo_sz, + (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color); } } - if (show_ipo && actkeyblock_is_valid(ab) && - (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) { - /* draw an interpolation line */ - immRectf_fast_with_color( - pos_id, - color_id, - ab->cfra, - ypos - ipo_sz, - ab->next->cfra, - ypos + ipo_sz, - (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color); + } + /* Grease Pencil Dopesheet. */ + else { + immBegin(GPU_PRIM_TRIS, 6 * gpencil_len); + LISTBASE_FOREACH (ActKeyColumn *, ab, keys) { + if (ab->next == NULL) { + continue; + } + immRectf_fast_with_color(pos_id, + color_id, + ab->cfra, + ypos - quarter_icon_sz, + ab->next->cfra, + ypos + quarter_icon_sz, + (ab->block.sel) ? sel_mhcol : unsel_mhcol); } } immEnd(); diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h index 3cc77887b1a..2f8faf1b2bd 100644 --- a/source/blender/editors/include/ED_keyframes_draw.h +++ b/source/blender/editors/include/ED_keyframes_draw.h @@ -95,6 +95,8 @@ typedef enum eActKeyBlock_Hold { ACTKEYBLOCK_FLAG_ANY_HOLD = (1 << 2), /* The curve segment uses non-bezier interpolation */ ACTKEYBLOCK_FLAG_NON_BEZIER = (1 << 3), + /* The block is grease pencil */ + ACTKEYBLOCK_FLAG_GPENCIL = (1 << 4), } eActKeyBlock_Flag; /* *********************** Keyframe Drawing ****************************** */ From b926c9f34587651b6c39dc43608a79dd6367e9a8 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Tue, 9 Feb 2021 12:28:51 -0300 Subject: [PATCH 038/519] Transform: Expose the hardcoded Precision Key As shown on the T85383, attempts are made to edit the precision mode key. But that key was hardcoded. That key now appears among the custom modal keymap items. --- .../keyconfig/keymap_data/blender_default.py | 2 ++ .../keymap_data/industry_compatible_data.py | 2 ++ source/blender/editors/transform/transform.c | 16 +++++++++++-- source/blender/editors/transform/transform.h | 5 ++-- .../editors/transform/transform_input.c | 24 ------------------- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index 73f05fb3d80..fd9d699ed01 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -5131,6 +5131,8 @@ def km_transform_modal_map(_params): ("INSERTOFS_TOGGLE_DIR", {"type": 'T', "value": 'PRESS'}, None), ("AUTOCONSTRAIN", {"type": 'MIDDLEMOUSE', "value": 'ANY'}, None), ("AUTOCONSTRAINPLANE", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True}, None), + ("PRECISION", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None), + ("PRECISION", {"type": 'RIGHT_SHIFT', "value": 'ANY', "any": True}, None), ]) return keymap diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index 4cffb6805a0..234781b7bc8 100644 --- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -3962,6 +3962,8 @@ def km_transform_modal_map(_params): ("INSERTOFS_TOGGLE_DIR", {"type": 'T', "value": 'PRESS'}, None), ("AUTOCONSTRAIN", {"type": 'MIDDLEMOUSE', "value": 'ANY'}, None), ("AUTOCONSTRAINPLANE", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True}, None), + ("PRECISION", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None), + ("PRECISION", {"type": 'RIGHT_SHIFT', "value": 'ANY', "any": True}, None), ]) return keymap diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index d46cdb62f30..2fbcbe22349 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -695,6 +695,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf) {TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""}, {TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""}, {TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""}, + {TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -806,8 +807,6 @@ int transformEvent(TransInfo *t, const wmEvent *event) const int modifiers_prev = t->modifiers; const int mode_prev = t->mode; - t->redraw |= handleMouseInput(t, &t->mouse, event); - /* Handle modal numinput events first, if already activated. */ if (((event->val == KM_PRESS) || (event->type == EVT_MODAL_MAP)) && hasNumInput(&t->num) && handleNumInput(t->context, &(t->num), event)) { @@ -1095,6 +1094,19 @@ int transformEvent(TransInfo *t, const wmEvent *event) handled = true; } break; + case TFM_MODAL_PRECISION: + if (event->prevval == KM_PRESS) { + t->modifiers |= MOD_PRECISION; + /* Shift is modifier for higher precision transform. */ + t->mouse.precision = 1; + t->redraw |= TREDRAW_HARD; + } + else if (event->prevval == KM_RELEASE) { + t->modifiers &= ~MOD_PRECISION; + t->mouse.precision = 0; + t->redraw |= TREDRAW_HARD; + } + break; /* Those two are only handled in transform's own handler, see T44634! */ case TFM_MODAL_EDGESLIDE_UP: case TFM_MODAL_EDGESLIDE_DOWN: diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index fe2c3d2fcdf..be04feb17c8 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -285,6 +285,8 @@ enum { TFM_MODAL_AUTOCONSTRAINT = 28, TFM_MODAL_AUTOCONSTRAINTPLANE = 29, + + TFM_MODAL_PRECISION = 30, }; /** \} */ @@ -720,9 +722,6 @@ typedef enum { void initMouseInput( TransInfo *t, MouseInput *mi, const float center[2], const int mval[2], const bool precision); void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode); -eRedrawFlag handleMouseInput(struct TransInfo *t, - struct MouseInput *mi, - const struct wmEvent *event); void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, const int mval[2], diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index ec84eab27a9..bfeb96d18c4 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -499,28 +499,4 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const int mval[2], float outp } } -eRedrawFlag handleMouseInput(TransInfo *t, MouseInput *mi, const wmEvent *event) -{ - eRedrawFlag redraw = TREDRAW_NOTHING; - - switch (event->type) { - case EVT_LEFTSHIFTKEY: - case EVT_RIGHTSHIFTKEY: - if (event->val == KM_PRESS) { - t->modifiers |= MOD_PRECISION; - /* Shift is modifier for higher precision transform. */ - mi->precision = 1; - redraw = TREDRAW_HARD; - } - else if (event->val == KM_RELEASE) { - t->modifiers &= ~MOD_PRECISION; - mi->precision = 0; - redraw = TREDRAW_HARD; - } - break; - } - - return redraw; -} - /** \} */ From 9e1065ead2aceeaa99a708f0cb1b65fbd771d50a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 15:36:15 +0100 Subject: [PATCH 039/519] LibOverride: cleanup: code consistency. Properly fully extract `lib_override_hierarchy_dependencies_recursive_tag` from `lib_override_linked_group_tag`. Was supposed to be that way already (see comment of `lib_override_linked_group_tag`), for some reasons this case was missed. --- source/blender/blenkernel/intern/lib_override.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 6911248d198..576fac8a641 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -503,8 +503,6 @@ static void lib_override_linked_group_tag( } } - lib_override_hierarchy_dependencies_recursive_tag(bmain, id, tag, missing_tag); - if (create_bmain_relations) { BKE_main_relations_free(bmain); } @@ -795,6 +793,9 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING, false); + lib_override_hierarchy_dependencies_recursive_tag( + bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); + /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */ GHash *linkedref_to_old_override = BLI_ghash_new( BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__); From 4e92be6d720162c1463d8bcc41a9474e9a10f1ff Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 16:31:09 +0100 Subject: [PATCH 040/519] LibOverride: Verious minor cleanups and fixes to code tagging IDs in an override hierarchy. --- .../blender/blenkernel/intern/lib_override.c | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 576fac8a641..f3f524cf9ad 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -369,9 +369,10 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain) } /* Tag all IDs in dependency relationships within an override hierarchy/group. + * + * Requires existing `Main.relations`. * * Note: this is typically called to complete `lib_override_linked_group_tag()`. - * Note: BMain's relations mapping won't be valid anymore after that call. */ static bool lib_override_hierarchy_dependencies_recursive_tag(Main *bmain, ID *id, @@ -463,6 +464,8 @@ static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) } /* This will tag at least all 'boundary' linked IDs for a potential override group. + * + * Requires existing `Main.relations`. * * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to * complete tagging of all dependencies within the override group. @@ -470,13 +473,11 @@ static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) * We currently only consider Collections and Objects (that are not used as bone shapes) as valid * boundary IDs to define an override group. */ -static void lib_override_linked_group_tag( - Main *bmain, ID *id, const uint tag, const uint missing_tag, const bool create_bmain_relations) +static void lib_override_linked_group_tag(Main *bmain, + ID *id, + const uint tag, + const uint missing_tag) { - if (create_bmain_relations) { - BKE_main_relations_create(bmain, 0); - } - if ((id->tag & LIB_TAG_MISSING)) { id->tag |= missing_tag; } @@ -502,10 +503,6 @@ static void lib_override_linked_group_tag( } } } - - if (create_bmain_relations) { - BKE_main_relations_free(bmain); - } } static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) @@ -564,14 +561,7 @@ static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) return IDWALK_RET_NOP; } -/* This will tag at least all 'boundary' linked IDs for a potential override group. - * - * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to - * complete tagging of all dependencies within the override group. - * - * We currently only consider Collections and Objects (that are not used as bone shapes) as valid - * boundary IDs to define an override group. - */ +/* This will tag all override IDs of an override group defined by the given `id_root`. */ static void lib_override_local_group_tag(Main *bmain, ID *id, const uint tag, @@ -589,7 +579,7 @@ static bool lib_override_library_create_do(Main *bmain, ID *id_root) { BKE_main_relations_create(bmain, 0); - lib_override_linked_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING, false); + lib_override_linked_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); lib_override_hierarchy_dependencies_recursive_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); BKE_main_relations_free(bmain); @@ -791,7 +781,7 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); - lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING, false); + lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); lib_override_hierarchy_dependencies_recursive_tag( bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); From 34155dd29bdd08295ec089866a12aed71a7665b4 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Tue, 9 Feb 2021 16:04:00 +0100 Subject: [PATCH 041/519] install_deps: Update OpenXR repository info The repository information for cloning the OpenXR repository, rather than just downloading the source archive, was outdated. * Use the OpenXR-SDK repository link, not the OpenXR-SDK-Source one. Only the former is needed, it contains pregenerated files with minimum dependencies. The latter contains additional tools and the un-generated source files. * Update the commit hash to the version we currently use, 1.0.14 (was 1.0.6). Differential Revision: https://developer.blender.org/D10373 Reviewed by: Bastien Montagne --- build_files/build_environment/install_deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index eee8c32f8a5..da2a6535142 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -1101,8 +1101,8 @@ FFMPEG_SOURCE=( "http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" ) XR_OPENXR_USE_REPO=false XR_OPENXR_SOURCE=("https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_VERSION}.tar.gz") -#~ XR_OPENXR_SOURCE_REPO=("https://github.com/KhronosGroup/OpenXR-SDK-Source.git") -#~ XR_OPENXR_REPO_UID="5292e57fda47561e672fba0a4b6e545c0f25dd8d" +#~ XR_OPENXR_SOURCE_REPO=("https://github.com/KhronosGroup/OpenXR-SDK.git") +#~ XR_OPENXR_REPO_UID="5900c51562769b03bea699dc0352cae56acb6419d" #~ XR_OPENXR_REPO_BRANCH="master" # C++11 is required now From a2ba37e5b6310bed0d4381619a8edeae2d05fbd2 Mon Sep 17 00:00:00 2001 From: Wannes Malfait Date: Tue, 9 Feb 2021 11:12:24 -0600 Subject: [PATCH 042/519] Geometry Nodes: Add Combine and Separate XYZ nodes for attributes These are similar to the regular "Combine XYZ" and "Separate XYZ" nodes, but they work on attributes. They will make it easier to switch between vector attributes and float attributes. Differential Revision: https://developer.blender.org/D10308 --- release/scripts/startup/nodeitems_builtins.py | 2 + source/blender/blenkernel/BKE_node.h | 2 + source/blender/blenkernel/intern/node.cc | 2 + source/blender/makesdna/DNA_node_types.h | 14 ++ source/blender/makesrna/intern/rna_nodetree.c | 33 ++++ source/blender/nodes/CMakeLists.txt | 2 + source/blender/nodes/NOD_geometry.h | 2 + source/blender/nodes/NOD_static_types.h | 2 + .../nodes/node_geo_attribute_combine_xyz.cc | 135 ++++++++++++++++ .../nodes/node_geo_attribute_separate_xyz.cc | 148 ++++++++++++++++++ 10 files changed, 342 insertions(+) create mode 100644 source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc create mode 100644 source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 40b57fd10de..9d7485a0837 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -491,6 +491,8 @@ geometry_node_categories = [ NodeItem("GeometryNodeAttributeColorRamp"), NodeItem("GeometryNodeAttributeVectorMath"), NodeItem("GeometryNodeAttributeSampleTexture"), + NodeItem("GeometryNodeAttributeCombineXYZ"), + NodeItem("GeometryNodeAttributeSeparateXYZ"), ]), GeometryNodeCategory("GEO_COLOR", "Color", items=[ NodeItem("ShaderNodeValToRGB"), diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index f4f753c4084..7984bbc980a 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1370,6 +1370,8 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_IS_VIEWPORT 1024 #define GEO_NODE_ATTRIBUTE_PROXIMITY 1025 #define GEO_NODE_VOLUME_TO_MESH 1026 +#define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027 +#define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index a4440d3d9f3..ed8dd84a9bb 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -4753,12 +4753,14 @@ static void registerGeometryNodes() register_node_type_geo_align_rotation_to_vector(); register_node_type_geo_attribute_color_ramp(); + register_node_type_geo_attribute_combine_xyz(); register_node_type_geo_attribute_compare(); register_node_type_geo_attribute_fill(); register_node_type_geo_attribute_math(); register_node_type_geo_attribute_mix(); register_node_type_geo_attribute_proximity(); register_node_type_geo_attribute_randomize(); + register_node_type_geo_attribute_separate_xyz(); register_node_type_geo_attribute_vector_math(); register_node_type_geo_boolean(); register_node_type_geo_collection_info(); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index e8748e28776..61b0b469426 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1216,6 +1216,20 @@ typedef struct NodeGeometryVolumeToMesh { char _pad[7]; } NodeGeometryVolumeToMesh; +typedef struct NodeAttributeCombineXYZ { + /* GeometryNodeAttributeInputMode. */ + uint8_t input_type_x; + uint8_t input_type_y; + uint8_t input_type_z; + + char _pad[1]; +} NodeAttributeCombineXYZ; + +typedef struct NodeAttributeSeparateXYZ { + /* GeometryNodeAttributeInputMode. */ + uint8_t input_type; +} NodeAttributeSeparateXYZ; + /* script node mode */ #define NODE_SCRIPT_INTERNAL 0 #define NODE_SCRIPT_EXTERNAL 1 diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index c67a3e4448b..c00f843c76e 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -9029,6 +9029,39 @@ static void def_geo_volume_to_mesh(StructRNA *srna) prop = RNA_def_property(srna, "resolution_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, resolution_mode_items); RNA_def_property_ui_text(prop, "Resolution Mode", "How the voxel size is specified"); +} + +static void def_geo_attribute_combine_xyz(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeCombineXYZ", "storage"); + + prop = RNA_def_property(srna, "input_type_x", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type X", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); + + prop = RNA_def_property(srna, "input_type_y", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type Y", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); + + prop = RNA_def_property(srna, "input_type_z", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); + RNA_def_property_ui_text(prop, "Input Type Z", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); +} + +static void def_geo_attribute_separate_xyz(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeSeparateXYZ", "storage"); + + prop = RNA_def_property(srna, "input_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector); + RNA_def_property_ui_text(prop, "Input Type", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 4656e2e5e4f..64c240eb5fd 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -143,6 +143,7 @@ set(SRC geometry/nodes/node_geo_align_rotation_to_vector.cc geometry/nodes/node_geo_attribute_color_ramp.cc + geometry/nodes/node_geo_attribute_combine_xyz.cc geometry/nodes/node_geo_attribute_compare.cc geometry/nodes/node_geo_attribute_fill.cc geometry/nodes/node_geo_attribute_math.cc @@ -150,6 +151,7 @@ set(SRC geometry/nodes/node_geo_attribute_sample_texture.cc geometry/nodes/node_geo_attribute_proximity.cc geometry/nodes/node_geo_attribute_randomize.cc + geometry/nodes/node_geo_attribute_separate_xyz.cc geometry/nodes/node_geo_attribute_vector_math.cc geometry/nodes/node_geo_boolean.cc geometry/nodes/node_geo_collection_info.cc diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index 39338ab14dc..8980855fd51 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -28,12 +28,14 @@ void register_node_type_geo_group(void); void register_node_type_geo_align_rotation_to_vector(void); void register_node_type_geo_attribute_color_ramp(void); +void register_node_type_geo_attribute_combine_xyz(void); void register_node_type_geo_attribute_compare(void); void register_node_type_geo_attribute_fill(void); void register_node_type_geo_attribute_math(void); void register_node_type_geo_attribute_mix(void); void register_node_type_geo_attribute_proximity(void); void register_node_type_geo_attribute_randomize(void); +void register_node_type_geo_attribute_separate_xyz(void); void register_node_type_geo_attribute_vector_math(void); void register_node_type_geo_boolean(void); void register_node_type_geo_collection_info(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 980790af766..15f078cebf2 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -295,6 +295,8 @@ DefNode(GeometryNode, GEO_NODE_COLLECTION_INFO, def_geo_collection_info, "COLLEC DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "") DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_PROXIMITY, def_geo_attribute_proximity, "ATTRIBUTE_PROXIMITY", AttributeProximity, "Attribute Proximity", "") DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "") +DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, def_geo_attribute_combine_xyz, "ATTRIBUTE_COMBINE_XYZ", AttributeCombineXYZ, "Attribute Combine XYZ", "") +DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, def_geo_attribute_separate_xyz, "ATTRIBUTE_SEPARATE_XYZ", AttributeSeparateXYZ, "Attribute Separate XYZ", "") /* undefine macros */ #undef DefNode diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc new file mode 100644 index 00000000000..a231b4f9e92 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc @@ -0,0 +1,135 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "node_geometry_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate geo_node_attribute_combine_xyz_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_STRING, N_("X")}, + {SOCK_FLOAT, N_("X"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Y")}, + {SOCK_FLOAT, N_("Y"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Z")}, + {SOCK_FLOAT, N_("Z"), 0.0, 0.0, 0.0, 0.0, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Result")}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_attribute_combine_xyz_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +static void geo_node_attribute_combine_xyz_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "input_type_x", 0, IFACE_("Type X"), ICON_NONE); + uiItemR(layout, ptr, "input_type_y", 0, IFACE_("Type Y"), ICON_NONE); + uiItemR(layout, ptr, "input_type_z", 0, IFACE_("Type Z"), ICON_NONE); +} + +namespace blender::nodes { + +static void geo_node_attribute_combine_xyz_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeCombineXYZ *data = (NodeAttributeCombineXYZ *)MEM_callocN( + sizeof(NodeAttributeCombineXYZ), __func__); + + data->input_type_x = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + data->input_type_y = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + data->input_type_z = GEO_NODE_ATTRIBUTE_INPUT_FLOAT; + node->storage = data; +} + +static void geo_node_attribute_combine_xyz_update(bNodeTree *UNUSED(ntree), bNode *node) +{ + NodeAttributeCombineXYZ *node_storage = (NodeAttributeCombineXYZ *)node->storage; + update_attribute_input_socket_availabilities( + *node, "X", (GeometryNodeAttributeInputMode)node_storage->input_type_x); + update_attribute_input_socket_availabilities( + *node, "Y", (GeometryNodeAttributeInputMode)node_storage->input_type_y); + update_attribute_input_socket_availabilities( + *node, "Z", (GeometryNodeAttributeInputMode)node_storage->input_type_z); +} + +static void combine_attributes(GeometryComponent &component, const GeoNodeExecParams ¶ms) +{ + const std::string result_name = params.get_input("Result"); + /* The result domain is always point for now. */ + const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + if (result_name.empty()) { + return; + } + + OutputAttributePtr attribute_result = component.attribute_try_get_for_output( + result_name, result_domain, CD_PROP_FLOAT3); + if (!attribute_result) { + return; + } + FloatReadAttribute attribute_x = params.get_input_attribute( + "X", component, result_domain, 0.0f); + FloatReadAttribute attribute_y = params.get_input_attribute( + "Y", component, result_domain, 0.0f); + FloatReadAttribute attribute_z = params.get_input_attribute( + "Z", component, result_domain, 0.0f); + + MutableSpan results = attribute_result->get_span_for_write_only(); + for (const int i : results.index_range()) { + const float x = attribute_x[i]; + const float y = attribute_y[i]; + const float z = attribute_z[i]; + const float3 result = float3(x, y, z); + results[i] = result; + } + attribute_result.apply_span_and_save(); +} + +static void geo_node_attribute_combine_xyz_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + if (geometry_set.has()) { + combine_attributes(geometry_set.get_component_for_write(), params); + } + if (geometry_set.has()) { + combine_attributes(geometry_set.get_component_for_write(), params); + } + + params.set_output("Geometry", geometry_set); +} + +} // namespace blender::nodes + +void register_node_type_geo_attribute_combine_xyz() +{ + static bNodeType ntype; + + geo_node_type_base( + &ntype, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, "Attribute Combine XYZ", NODE_CLASS_ATTRIBUTE, 0); + node_type_socket_templates( + &ntype, geo_node_attribute_combine_xyz_in, geo_node_attribute_combine_xyz_out); + node_type_init(&ntype, blender::nodes::geo_node_attribute_combine_xyz_init); + node_type_update(&ntype, blender::nodes::geo_node_attribute_combine_xyz_update); + node_type_storage( + &ntype, "NodeAttributeCombineXYZ", node_free_standard_storage, node_copy_standard_storage); + ntype.geometry_node_execute = blender::nodes::geo_node_attribute_combine_xyz_exec; + ntype.draw_buttons = geo_node_attribute_combine_xyz_layout; + nodeRegisterType(&ntype); +} diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc new file mode 100644 index 00000000000..07941f7db79 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -0,0 +1,148 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "DNA_material_types.h" + +#include "node_geometry_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate geo_node_attribute_separate_xyz_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_STRING, N_("Vector")}, + {SOCK_VECTOR, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_STRING, N_("Result X")}, + {SOCK_STRING, N_("Result Y")}, + {SOCK_STRING, N_("Result Z")}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_attribute_separate_xyz_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +static void geo_node_attribute_separate_xyz_layout(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) +{ + uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); +} + +namespace blender::nodes { + +static void geo_node_attribute_separate_xyz_init(bNodeTree *UNUSED(tree), bNode *node) +{ + NodeAttributeSeparateXYZ *data = (NodeAttributeSeparateXYZ *)MEM_callocN( + sizeof(NodeAttributeSeparateXYZ), __func__); + data->input_type = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE; + node->storage = data; +} + +static void geo_node_attribute_separate_xyz_update(bNodeTree *UNUSED(ntree), bNode *node) +{ + NodeAttributeSeparateXYZ *node_storage = (NodeAttributeSeparateXYZ *)node->storage; + update_attribute_input_socket_availabilities( + *node, "Vector", (GeometryNodeAttributeInputMode)node_storage->input_type); +} + +static void extract_input(const int index, const Span &input, MutableSpan result) +{ + for (const int i : result.index_range()) { + /* Get the component of the float3. (0: X, 1: Y, 2: Z). */ + const float component = input[i][index]; + result[i] = component; + } +} + +static void separate_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms) +{ + const std::string result_name_x = params.get_input("Result X"); + const std::string result_name_y = params.get_input("Result Y"); + const std::string result_name_z = params.get_input("Result Z"); + /* The node is only for float3 to float conversions. */ + const CustomDataType input_type = CD_PROP_FLOAT3; + const CustomDataType result_type = CD_PROP_FLOAT; + /* The result domain is always point for now. */ + const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + + /* No output to write to. */ + if (result_name_x.empty() && result_name_y.empty() && result_name_z.empty()) { + return; + } + + ReadAttributePtr attribute_input = params.get_input_attribute( + "Vector", component, result_domain, input_type, nullptr); + if (!attribute_input) { + return; + } + const Span input_span = attribute_input->get_span(); + + OutputAttributePtr attribute_result_x = component.attribute_try_get_for_output( + result_name_x, result_domain, result_type); + OutputAttributePtr attribute_result_y = component.attribute_try_get_for_output( + result_name_y, result_domain, result_type); + OutputAttributePtr attribute_result_z = component.attribute_try_get_for_output( + result_name_z, result_domain, result_type); + + /* Only extract the components for the outputs with a given attribute. */ + if (attribute_result_x) { + extract_input(0, input_span, attribute_result_x->get_span_for_write_only()); + attribute_result_x.apply_span_and_save(); + } + if (attribute_result_y) { + extract_input(1, input_span, attribute_result_y->get_span_for_write_only()); + attribute_result_y.apply_span_and_save(); + } + if (attribute_result_z) { + extract_input(2, input_span, attribute_result_z->get_span_for_write_only()); + attribute_result_z.apply_span_and_save(); + } +} + +static void geo_node_attribute_separate_xyz_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + if (geometry_set.has()) { + separate_attribute(geometry_set.get_component_for_write(), params); + } + if (geometry_set.has()) { + separate_attribute(geometry_set.get_component_for_write(), params); + } + + params.set_output("Geometry", geometry_set); +} + +} // namespace blender::nodes + +void register_node_type_geo_attribute_separate_xyz() +{ + static bNodeType ntype; + + geo_node_type_base( + &ntype, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, "Attribute Separate XYZ", NODE_CLASS_ATTRIBUTE, 0); + node_type_socket_templates( + &ntype, geo_node_attribute_separate_xyz_in, geo_node_attribute_separate_xyz_out); + node_type_init(&ntype, blender::nodes::geo_node_attribute_separate_xyz_init); + node_type_update(&ntype, blender::nodes::geo_node_attribute_separate_xyz_update); + node_type_storage( + &ntype, "NodeAttributeSeparateXYZ", node_free_standard_storage, node_copy_standard_storage); + ntype.geometry_node_execute = blender::nodes::geo_node_attribute_separate_xyz_exec; + ntype.draw_buttons = geo_node_attribute_separate_xyz_layout; + nodeRegisterType(&ntype); +} From ebdaa52fa7090382b22d08086c3bb5821db815b4 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 18:51:52 +0100 Subject: [PATCH 043/519] LibOverride: Refactor a bit override hierarchy utils. Use LibOverrideGroupTagData helper struct a bit more widely. --- .../blender/blenkernel/intern/lib_override.c | 91 ++++++++++--------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index f3f524cf9ad..03ce1b8c9ca 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -368,23 +368,30 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain) return success; } +typedef struct LibOverrideGroupTagData { + Main *bmain; + ID *id_root; + uint tag; + uint missing_tag; +} LibOverrideGroupTagData; + /* Tag all IDs in dependency relationships within an override hierarchy/group. * * Requires existing `Main.relations`. * * Note: this is typically called to complete `lib_override_linked_group_tag()`. */ -static bool lib_override_hierarchy_dependencies_recursive_tag(Main *bmain, - ID *id, - const uint tag, - const uint missing_tag) +static bool lib_override_hierarchy_dependencies_recursive_tag(LibOverrideGroupTagData *data) { + Main *bmain = data->bmain; + ID *id = data->id_root; + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, id); BLI_assert(entry != NULL); if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { /* This ID has already been processed. */ - return (*(uint *)&id->tag & tag) != 0; + return (*(uint *)&id->tag & data->tag) != 0; } /* This way we won't process again that ID, should we encounter it again through another * relationship hierarchy. */ @@ -400,21 +407,17 @@ static bool lib_override_hierarchy_dependencies_recursive_tag(Main *bmain, /* We only consider IDs from the same library. */ ID *to_id = *to_id_entry->id_pointer.to; if (to_id != NULL && to_id->lib == id->lib) { - if (lib_override_hierarchy_dependencies_recursive_tag(bmain, to_id, tag, missing_tag)) { - id->tag |= tag; + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + if (lib_override_hierarchy_dependencies_recursive_tag(&sub_data)) { + id->tag |= data->tag; } } } - return (*(uint *)&id->tag & tag) != 0; + return (*(uint *)&id->tag & data->tag) != 0; } -typedef struct LibOverrideGroupTagData { - ID *id_root; - uint tag; - uint missing_tag; -} LibOverrideGroupTagData; - static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) { if (cb_data->cb_flag & (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK)) { @@ -473,31 +476,30 @@ static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) * We currently only consider Collections and Objects (that are not used as bone shapes) as valid * boundary IDs to define an override group. */ -static void lib_override_linked_group_tag(Main *bmain, - ID *id, - const uint tag, - const uint missing_tag) +static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) { - if ((id->tag & LIB_TAG_MISSING)) { - id->tag |= missing_tag; + Main *bmain = data->bmain; + ID *id_root = data->id_root; + + if ((id_root->tag & LIB_TAG_MISSING)) { + id_root->tag |= data->missing_tag; } else { - id->tag |= tag; + id_root->tag |= data->tag; } - if (ELEM(GS(id->name), ID_OB, ID_GR)) { - LibOverrideGroupTagData data = {.id_root = id, .tag = tag, .missing_tag = missing_tag}; + if (ELEM(GS(id_root->name), ID_OB, ID_GR)) { /* Tag all collections and objects. */ BKE_library_foreach_ID_link( - bmain, id, lib_override_linked_group_tag_cb, &data, IDWALK_READONLY | IDWALK_RECURSE); + bmain, id_root, lib_override_linked_group_tag_cb, data, IDWALK_READONLY | IDWALK_RECURSE); /* Then, we remove (untag) bone shape objects, you shall never want to directly/explicitly * override those. */ LISTBASE_FOREACH (Object *, ob, &bmain->objects) { - if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & tag)) { + if (ob->type == OB_ARMATURE && ob->pose != NULL && (ob->id.tag & data->tag)) { for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan != NULL; pchan = pchan->next) { if (pchan->custom != NULL) { - pchan->custom->id.tag &= ~(tag | missing_tag); + pchan->custom->id.tag &= ~(data->tag | data->missing_tag); } } } @@ -562,25 +564,26 @@ static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) } /* This will tag all override IDs of an override group defined by the given `id_root`. */ -static void lib_override_local_group_tag(Main *bmain, - ID *id, - const uint tag, - const uint missing_tag) +static void lib_override_local_group_tag(LibOverrideGroupTagData *data) { - id->tag |= tag; + Main *bmain = data->bmain; + ID *id_root = data->id_root; + + id_root->tag |= data->tag; - LibOverrideGroupTagData data = {.id_root = id, .tag = tag, .missing_tag = missing_tag}; /* Tag all local overrides in id_root's group. */ BKE_library_foreach_ID_link( - bmain, id, lib_override_local_group_tag_cb, &data, IDWALK_READONLY | IDWALK_RECURSE); + bmain, id_root, lib_override_local_group_tag_cb, data, IDWALK_READONLY | IDWALK_RECURSE); } static bool lib_override_library_create_do(Main *bmain, ID *id_root) { BKE_main_relations_create(bmain, 0); - lib_override_linked_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); - lib_override_hierarchy_dependencies_recursive_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_linked_group_tag(&data); + lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); @@ -779,12 +782,13 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ BKE_main_relations_create(bmain, 0); - lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_local_group_tag(&data); - lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); - - lib_override_hierarchy_dependencies_recursive_tag( - bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); + data.id_root = id_root_reference; + lib_override_linked_group_tag(&data); + lib_override_hierarchy_dependencies_recursive_tag(&data); /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */ GHash *linkedref_to_old_override = BLI_ghash_new( @@ -826,8 +830,7 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ FOREACH_MAIN_ID_END; /* Code above may have added some tags, we need to update this too. */ - lib_override_hierarchy_dependencies_recursive_tag( - bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING); + lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); @@ -984,7 +987,9 @@ void BKE_lib_override_library_delete(Main *bmain, ID *id_root) BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root)); /* Tag all library overrides in the chains of dependencies from the given root one. */ - lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_DOIT); + LibOverrideGroupTagData data = { + .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; + lib_override_local_group_tag(&data); ID *id; FOREACH_MAIN_ID_BEGIN (bmain, id) { From bace031b654fec17fd23541b4b667253870e3355 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 18:53:52 +0100 Subject: [PATCH 044/519] Fix (unreported) assert in liboverride reset code. Invalid override properties ( i.e. invalid RNA paths) are not strictly speaking errors, many things can lead to that situation. Just ignore and skip those cases. --- .../blender/blenkernel/intern/lib_override.c | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 03ce1b8c9ca..68a75e469fd 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -1647,24 +1647,26 @@ static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root) &ptr_root_lib); bool prop_exists = RNA_path_resolve_property(&ptr_root, op->rna_path, &ptr, &prop); - BLI_assert(prop_exists); - prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib); - if (prop_exists) { - BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION)); - BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib)); - if (is_collection) { - ptr.type = RNA_property_pointer_type(&ptr, prop); - ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib); - } - else { - ptr = RNA_property_pointer_get(&ptr, prop); - ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib); - } - if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) { - BLI_assert(ptr.type == ptr_lib.type); - do_op_delete = !(RNA_struct_is_ID(ptr.type) && ptr.owner_id->override_library != NULL && - ptr.owner_id->override_library->reference == ptr_lib.owner_id); + prop_exists = RNA_path_resolve_property(&ptr_root_lib, op->rna_path, &ptr_lib, &prop_lib); + + if (prop_exists) { + BLI_assert(ELEM(RNA_property_type(prop), PROP_POINTER, PROP_COLLECTION)); + BLI_assert(RNA_property_type(prop) == RNA_property_type(prop_lib)); + if (is_collection) { + ptr.type = RNA_property_pointer_type(&ptr, prop); + ptr_lib.type = RNA_property_pointer_type(&ptr_lib, prop_lib); + } + else { + ptr = RNA_property_pointer_get(&ptr, prop); + ptr_lib = RNA_property_pointer_get(&ptr_lib, prop_lib); + } + if (ptr.owner_id != NULL && ptr_lib.owner_id != NULL) { + BLI_assert(ptr.type == ptr_lib.type); + do_op_delete = !(RNA_struct_is_ID(ptr.type) && + ptr.owner_id->override_library != NULL && + ptr.owner_id->override_library->reference == ptr_lib.owner_id); + } } } } From 510db9512fc64d1739ee427f69d8674fbc7ca629 Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Mon, 8 Feb 2021 20:34:48 -0700 Subject: [PATCH 045/519] Outliner: Enable render visibility column by default The render visibility column in the outliner should be enabled by default. This change makes it more obvious which objects will be rendered which can be misleading when only viewport visibility toggles are shown by default. This commit enables the render visibility column in all existing and new Outliner editors. Differential Revision: https://developer.blender.org/D10365 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_290.c | 31 ++++++++++++------- .../editors/space_outliner/space_outliner.c | 2 +- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 6b76e69a7a6..549651dff6f 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 5 +#define BLENDER_FILE_SUBVERSION 6 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index b39ba25ea99..1c6d4d2dbe4 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1660,6 +1660,25 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) FOREACH_NODETREE_END; } + if (!MAIN_VERSION_ATLEAST(bmain, 293, 6)) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + /* UV/Image Max resolution images in image editor. */ + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; + } + /* Enable Outliner render visibilty column. */ + else if (space->spacetype == SPACE_OUTLINER) { + SpaceOutliner *space_outliner = (SpaceOutliner *)space; + space_outliner->show_restrict_flags |= SO_RESTRICT_RENDER; + } + } + } + } + } + /** * Versioning code until next subversion bump goes here. * @@ -1671,17 +1690,5 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) */ { /* Keep this block, even when empty. */ - - /* UV/Image Max resolution images in image editor. */ - LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { - if (space->spacetype == SPACE_IMAGE) { - SpaceImage *sima = (SpaceImage *)space; - sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; - } - } - } - } } } diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 88e88ab0c66..9082e0047c6 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -328,7 +328,7 @@ static SpaceLink *outliner_create(const ScrArea *UNUSED(area), const Scene *UNUS space_outliner = MEM_callocN(sizeof(SpaceOutliner), "initoutliner"); space_outliner->spacetype = SPACE_OUTLINER; space_outliner->filter_id_type = ID_GR; - space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE; + space_outliner->show_restrict_flags = SO_RESTRICT_ENABLE | SO_RESTRICT_HIDE | SO_RESTRICT_RENDER; space_outliner->outlinevis = SO_VIEW_LAYER; space_outliner->sync_select_dirty |= WM_OUTLINER_SYNC_SELECT_FROM_ALL; space_outliner->flag = SO_SYNC_SELECT | SO_MODE_COLUMN; From 87c75767b3b4bba8b6cd6b147dbd475d9154e0ae Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 21:38:57 +0100 Subject: [PATCH 046/519] Fixed (unreported) memleak in recent BMain relations new code. Forgot to free the GHash iterator. --- source/blender/blenkernel/intern/main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c index d5cbcb62af2..6f94b3355fa 100644 --- a/source/blender/blenkernel/intern/main.c +++ b/source/blender/blenkernel/intern/main.c @@ -317,7 +317,9 @@ void BKE_main_relations_tag_set(struct Main *bmain, if (bmain->relations == NULL) { return; } - for (GHashIterator *gh_iter = BLI_ghashIterator_new(bmain->relations->relations_from_pointers); + + GHashIterator *gh_iter; + for (gh_iter = BLI_ghashIterator_new(bmain->relations->relations_from_pointers); !BLI_ghashIterator_done(gh_iter); BLI_ghashIterator_step(gh_iter)) { MainIDRelationsEntry *entry = BLI_ghashIterator_getValue(gh_iter); @@ -328,6 +330,7 @@ void BKE_main_relations_tag_set(struct Main *bmain, entry->tags &= ~tag; } } + BLI_ghashIterator_free(gh_iter); } /** From a86605fffd884bd29fc9d984a93df3fc572ef210 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 9 Feb 2021 21:53:47 +0100 Subject: [PATCH 047/519] LibOverride: Refactor: Switch more code to using Main.relations. This potentially could fix some missed cases in dependency tagging (when dealing with overrides hierarchies), since relying on tag in ID itself is not a good idea to check whether an ID has been propcessed or not (exterior code may have forced that tag on some IDs e.g., which would prevent them from ever being processed properly). --- .../blender/blenkernel/intern/lib_override.c | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 68a75e469fd..0f753018c46 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -418,52 +418,60 @@ static bool lib_override_hierarchy_dependencies_recursive_tag(LibOverrideGroupTa return (*(uint *)&id->tag & data->tag) != 0; } -static int lib_override_linked_group_tag_cb(LibraryIDLinkCallbackData *cb_data) +static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *data) { - if (cb_data->cb_flag & (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK)) { - return IDWALK_RET_STOP_RECURSION; + Main *bmain = data->bmain; + ID *id_owner = data->id_root; + BLI_assert(ID_IS_LINKED(id_owner)); + + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id_owner); + BLI_assert(entry != NULL); + + if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { + /* This ID has already been processed. */ + printf("%s already processed\n", id_owner->name); + return; } + /* This way we won't process again that ID, should we encounter it again through another + * relationship hierarchy. */ + entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; - LibOverrideGroupTagData *data = cb_data->user_data; - const uint tag = data->tag; - const uint missing_tag = data->missing_tag; - - ID *id_root = data->id_root; - Library *library_root = id_root->lib; - ID *id = *cb_data->id_pointer; - ID *id_owner = cb_data->id_owner; - - BLI_assert(id_owner == cb_data->id_self); - - if (ELEM(id, NULL, id_owner)) { - return IDWALK_RET_NOP; - } - - BLI_assert(id_owner->lib == library_root); - - if (*(uint *)&id->tag & (tag | missing_tag)) { - /* Already processed and tagged, nothing else to do here. */ - return IDWALK_RET_STOP_RECURSION; - } - - if (id->lib != library_root) { - /* We do not override data-blocks from other libraries, nor do we process them. */ - return IDWALK_RET_STOP_RECURSION; - } - - /* We tag all collections and objects for override. And we also tag all other data-blocks which - * would use one of those. - * Note: missing IDs (aka placeholders) are never overridden. */ - if (ELEM(GS(id->name), ID_OB, ID_GR)) { - if ((id->tag & LIB_TAG_MISSING)) { - id->tag |= missing_tag; + for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL; + to_id_entry = to_id_entry->next) { + if ((to_id_entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) { + /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers) as + * actual dependencies. */ + continue; } - else { - id->tag |= tag; - } - } - return IDWALK_RET_NOP; + ID *to_id = *to_id_entry->id_pointer.to; + if (ELEM(to_id, NULL, id_owner)) { + continue; + } + /* We only consider IDs from the same library. */ + if (to_id->lib != id_owner->lib) { + continue; + } + BLI_assert(ID_IS_LINKED(to_id)); + + /* We tag all collections and objects for override. And we also tag all other data-blocks which + * would use one of those. + * Note: missing IDs (aka placeholders) are never overridden. */ + if (ELEM(GS(to_id->name), ID_OB, ID_GR)) { + if ((to_id->tag & LIB_TAG_MISSING)) { + to_id->tag |= data->missing_tag; + } + else { + to_id->tag |= data->tag; + } + } + + /* Recursively process the dependencies. */ + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + lib_override_linked_group_tag_recursive(&sub_data); + } } /* This will tag at least all 'boundary' linked IDs for a potential override group. @@ -490,8 +498,7 @@ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) if (ELEM(GS(id_root->name), ID_OB, ID_GR)) { /* Tag all collections and objects. */ - BKE_library_foreach_ID_link( - bmain, id_root, lib_override_linked_group_tag_cb, data, IDWALK_READONLY | IDWALK_RECURSE); + lib_override_linked_group_tag_recursive(data); /* Then, we remove (untag) bone shape objects, you shall never want to directly/explicitly * override those. */ @@ -583,6 +590,8 @@ static bool lib_override_library_create_do(Main *bmain, ID *id_root) LibOverrideGroupTagData data = { .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; lib_override_linked_group_tag(&data); + + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); @@ -788,6 +797,8 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ data.id_root = id_root_reference; lib_override_linked_group_tag(&data); + + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); lib_override_hierarchy_dependencies_recursive_tag(&data); /* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */ @@ -830,6 +841,7 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ FOREACH_MAIN_ID_END; /* Code above may have added some tags, we need to update this too. */ + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); lib_override_hierarchy_dependencies_recursive_tag(&data); BKE_main_relations_free(bmain); From 722790e8d23091e776d67c5e27c9719923b2f4c3 Mon Sep 17 00:00:00 2001 From: Victor-Louis De Gusseme Date: Tue, 9 Feb 2021 16:24:21 -0600 Subject: [PATCH 048/519] Fix T85493: Attribute glitches while using Attribute Proximity node The span fill was in multithreaded code, so calculated values were sometimes reset. The fix is to move FLT_MAX fill outside of parallel_for. Differential Revision: https://developer.blender.org/D10378 --- .../geometry/nodes/node_geo_attribute_proximity.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index 1067a1e8593..45f20ca553a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -66,6 +66,11 @@ static void proximity_calc(MutableSpan distance_span, const bool bvh_mesh_success, const bool bvh_pointcloud_success) { + /* The pointcloud loop uses the values already in the span, + * which is only set if the mesh BVH is used (because it's first). */ + if (!bvh_mesh_success) { + distance_span.fill(FLT_MAX); + } IndexRange range = positions.index_range(); parallel_for(range, 512, [&](IndexRange range) { @@ -86,11 +91,6 @@ static void proximity_calc(MutableSpan distance_span, } } - /* The next loop(s) use the values already in the span. */ - if (!bvh_mesh_success) { - distance_span.fill(FLT_MAX); - } - if (bvh_pointcloud_success) { copy_v3_fl(nearest.co, FLT_MAX); nearest.index = -1; From 048dd8454cb9c50dc757a4bcbcacecf3fd8966e1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 07:57:50 +1100 Subject: [PATCH 049/519] Cleanup: warning (useless type qualifier) --- source/blender/editors/gpencil/gpencil_fill.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index f595d0f5b35..72d58b78219 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -88,7 +88,7 @@ #define FILL_DEBUG 0 /* Duplicated: etempFlags */ -const enum { +enum { GP_DRAWFILLS_NOSTATUS = (1 << 0), /* don't draw status info */ GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ }; From de0801c3d6e143cfa639e1df4fc852b0493a1308 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 07:57:51 +1100 Subject: [PATCH 050/519] Cleanup: clang-format --- .../editors/transform/transform_mode_shrink_fatten.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/transform/transform_mode_shrink_fatten.c b/source/blender/editors/transform/transform_mode_shrink_fatten.c index a392a354449..6e497d85417 100644 --- a/source/blender/editors/transform/transform_mode_shrink_fatten.c +++ b/source/blender/editors/transform/transform_mode_shrink_fatten.c @@ -84,8 +84,13 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2])) else { /* default header print */ if (unit != NULL) { - ofs += BKE_unit_value_as_string( - str + ofs, sizeof(str) - ofs, distance * unit->scale_length, 4, B_UNIT_LENGTH, unit, true); + ofs += BKE_unit_value_as_string(str + ofs, + sizeof(str) - ofs, + distance * unit->scale_length, + 4, + B_UNIT_LENGTH, + unit, + true); } else { ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, "%.4f", distance); From 201865b6f7e5a55fbbdc6d524f2001f1a13bea8b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 09:37:11 +1100 Subject: [PATCH 051/519] Cleanup: update old comments --- source/blender/bmesh/intern/bmesh_interp.c | 8 ++++++-- source/blender/editors/uvedit/uvedit_smart_stitch.c | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index a15408d43be..6857a1f3929 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -342,8 +342,12 @@ static void mdisp_axis_from_quad(const float v1[3], normalize_v3(r_axis_y); } -/* tl is loop to project onto, l is loop whose internal displacement, co, is being - * projected. x and y are location in loop's mdisps grid of point co. */ +/** + * \param l_src: is loop whose internal displacement. + * \param l_dst: is loop to project onto. + * \param p: The point being projected. + * \param r_axis_x, r_axis_y: The location in loop's #CD_MDISPS grid of point `p`. + */ static bool mdisp_in_mdispquad(BMLoop *l_src, BMLoop *l_dst, const float l_dst_f_center[3], diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c index 5c4dc90f112..8ebf000baaa 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.c +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c @@ -129,8 +129,10 @@ typedef struct UvEdge { /** general use flag * (Used to check if edge is boundary here, and propagates to adjacency elements) */ uchar flag; - /** element that guarantees element->face - * has the edge on element->tfindex and element->tfindex+1 is the second uv */ + /** + * Element that guarantees `element.l` has the edge on + * `element.loop_of_poly_index` and `element->loop_of_poly_index + 1` is the second UV. + */ UvElement *element; /** next uv edge with the same exact vertices as this one. * Calculated at startup to save time */ From 7b84a5a370a59eabfe798d8209889a2c05645854 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 07:57:52 +1100 Subject: [PATCH 052/519] Cleanup: spelling --- .../blender/blenkernel/BKE_attribute_math.hh | 4 +- source/blender/blenkernel/intern/armature.c | 7 ++- .../blenkernel/intern/attribute_access.cc | 2 +- source/blender/blenlib/intern/math_interp.c | 8 ++-- .../blenloader/intern/versioning_290.c | 2 +- .../blender/bmesh/operators/bmo_fill_grid.c | 4 +- .../operations/COM_TonemapOperation.h | 2 +- .../draw/engines/eevee/eevee_shaders.c | 2 +- source/blender/editors/gpencil/gpencil_fill.c | 48 +++++++++++-------- source/blender/editors/object/object_add.c | 2 +- source/blender/makesdna/DNA_anim_types.h | 5 +- 11 files changed, 46 insertions(+), 40 deletions(-) diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh index 606811ca12d..0294a8c09d5 100644 --- a/source/blender/blenkernel/BKE_attribute_math.hh +++ b/source/blender/blenkernel/BKE_attribute_math.hh @@ -242,8 +242,8 @@ template<> struct DefaultMixerStruct { { return value >= 0.5f; } - /* Store interpolated bools in a float temporary. Otherwise information provided by weights is - * easily rounded away. */ + /* Store interpolated booleans in a float temporary. + * Otherwise information provided by weights is easily rounded away. */ using type = SimpleMixerWithAccumulationType; }; diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index b8a0ed087e0..a59ead84aca 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1891,9 +1891,8 @@ void BKE_armature_mat_pose_to_bone_ex(struct Depsgraph *depsgraph, * bone loc/sca/rot is ignored, scene and frame are not used. */ BKE_pose_where_is_bone(depsgraph, NULL, ob, &work_pchan, 0.0f, false); - /* find the matrix, need to remove the bone transforms first so this is - * calculated as a matrix to set rather than a difference ontop of what's - * already there. */ + /* Find the matrix, need to remove the bone transforms first so this is calculated + * as a matrix to set rather than a difference on top of what's already there. */ unit_m4(outmat); BKE_pchan_apply_mat4(&work_pchan, outmat, false); @@ -1945,7 +1944,7 @@ void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3]) float quat[4]; /* NOTE: we now don't normalize the stored values anymore, - * since this was kindof evil in some cases but if this proves to be too problematic, + * since this was kind of evil in some cases but if this proves to be too problematic, * switch back to the old system of operating directly on the stored copy. */ normalize_qt_qt(quat, pchan->quat); quat_to_mat3(r_mat, quat); diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index cc833e094c8..d6ceb9beb70 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -515,7 +515,7 @@ CustomDataType cpp_type_to_custom_data_type(const blender::fn::CPPType &type) * "legacy" data structures. For example, some builtin attributes cannot be deleted. */ class BuiltinAttributeProvider { public: - /* Some utility enums to avoid hard to read bools in function calls. */ + /* Some utility enums to avoid hard to read booleans in function calls. */ enum CreatableEnum { Creatable, NonCreatable, diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c index 3cec3db9806..163a3ab5fe3 100644 --- a/source/blender/blenlib/intern/math_interp.c +++ b/source/blender/blenlib/intern/math_interp.c @@ -139,10 +139,10 @@ BLI_INLINE void bicubic_interpolation(const unsigned char *byte_buffer, y1 = j + m; CLAMP(y1, 0, height - 1); - /* normally we could do this */ - /* w = P(n-a) * P(b-m); */ - /* except that would call P() 16 times per pixel therefor pow() 64 times, - * better precalc these */ + /* Normally we could do this: + * `w = P(n-a) * P(b-m);` + * except that would call `P()` 16 times per pixel therefor `pow()` 64 times, + * better pre-calculate these. */ w = wx * wy[m + 1]; if (float_output) { diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 1c6d4d2dbe4..8891197a7d9 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1669,7 +1669,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) SpaceImage *sima = (SpaceImage *)space; sima->iuser.flag |= IMA_SHOW_MAX_RESOLUTION; } - /* Enable Outliner render visibilty column. */ + /* Enable Outliner render visibility column. */ else if (space->spacetype == SPACE_OUTLINER) { SpaceOutliner *space_outliner = (SpaceOutliner *)space; space_outliner->show_restrict_flags |= SO_RESTRICT_RENDER; diff --git a/source/blender/bmesh/operators/bmo_fill_grid.c b/source/blender/bmesh/operators/bmo_fill_grid.c index 3aad37b3b02..df15778558b 100644 --- a/source/blender/bmesh/operators/bmo_fill_grid.c +++ b/source/blender/bmesh/operators/bmo_fill_grid.c @@ -326,8 +326,8 @@ static void bm_grid_fill_array(BMesh *bm, v = BM_vert_create(bm, co, NULL, BM_CREATE_NOP); v_grid[(y * xtot) + x] = v; - /* interpolate only along one axis, this could be changed - * but from user pov gives predictable results since these are selected loop */ + /* Interpolate only along one axis, this could be changed + * but from user POV gives predictable results since these are selected loop. */ if (use_vert_interp) { const float *w = weight_table[XY(x, y)]; diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h index 3870593b423..cb8816b93b3 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.h +++ b/source/blender/compositor/operations/COM_TonemapOperation.h @@ -22,7 +22,7 @@ #include "DNA_node_types.h" /** - * \brief temporarily storage during execution of Tonemap + * \brief temporarily storage during execution of Tone-map * \ingroup operation */ typedef struct AvgLogLum { diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 52d330c3ad2..82b2395cc6e 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -438,7 +438,7 @@ GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void) } /* -------------------------------------------------------------------- */ -/** \name Downsampling +/** \name Down-sampling * \{ */ GPUShader *EEVEE_shaders_effect_downsample_sh_get(void) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 72d58b78219..832191c8321 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -93,7 +93,7 @@ enum { GP_DRAWFILLS_ONLY3D = (1 << 1), /* only draw 3d-strokes */ }; -/* Temporary fill operation data (op->customdata) */ +/* Temporary fill operation data `op->customdata`. */ typedef struct tGPDfill { bContext *C; struct Main *bmain; @@ -112,7 +112,7 @@ typedef struct tGPDfill { struct View3D *v3d; /** region where painting originated */ struct ARegion *region; - /** current GP datablock */ + /** Current GP data-block. */ struct bGPdata *gpd; /** current material */ struct Material *mat; @@ -172,9 +172,9 @@ typedef struct tGPDfill { /** handle for drawing strokes while operator is running 3d stuff */ void *draw_handle_3d; - /* tmp size x */ + /* Temporary size x. */ int bwinx; - /* tmp size y */ + /* Temporary size y. */ int bwiny; rcti brect; @@ -610,7 +610,7 @@ static void gpencil_draw_datablock(tGPDfill *tgpf, const float ink[4]) GPU_blend(GPU_BLEND_NONE); } -/* draw strokes in offscreen buffer */ +/* Draw strokes in off-screen buffer. */ static bool gpencil_render_offscreen(tGPDfill *tgpf) { bool is_ortho = false; @@ -661,7 +661,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) &clip_end, NULL); - /* Rescale viewplane to fit all strokes. */ + /* Rescale `viewplane` to fit all strokes. */ float width = viewplane.xmax - viewplane.xmin; float height = viewplane.ymax - viewplane.ymin; @@ -734,21 +734,21 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) BKE_image_release_ibuf(tgpf->ima, ibuf, NULL); - /* switch back to window-system-provided framebuffer */ + /* Switch back to window-system-provided frame-buffer. */ GPU_offscreen_unbind(offscreen, true); GPU_offscreen_free(offscreen); return true; } -/* return pixel data (rgba) at index */ +/* Return pixel data (RGBA) at index. */ static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4]) { BLI_assert(ibuf->rect_float != NULL); memcpy(r_col, &ibuf->rect_float[idx * 4], sizeof(float[4])); } -/* set pixel data (rgba) at index */ +/* Set pixel data (RGBA) at index. */ static void set_pixel(ImBuf *ibuf, int idx, const float col[4]) { BLI_assert(ibuf->rect_float != NULL); @@ -890,17 +890,20 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) } } - /* the fill use a stack to save the pixel list instead of the common recursive + /** + * The fill use a stack to save the pixel list instead of the common recursive * 4-contact point method. * The problem with recursive calls is that for big fill areas, we can get max limit * of recursive calls and STACK_OVERFLOW error. * * The 4-contact point analyze the pixels to the left, right, bottom and top - * ----------- - * | X | - * | XoX | - * | X | - * ----------- + *
+   * -----------
+   * |    X    |
+   * |   XoX   |
+   * |    X    |
+   * -----------
+   * 
*/ while (!BLI_stack_is_empty(stack)) { int v; @@ -988,7 +991,7 @@ static void gpencil_set_borders(tGPDfill *tgpf, const bool transparent) tgpf->ima->id.tag |= LIB_TAG_DOIT; } -/* Invert image to paint invese area. */ +/* Invert image to paint inverse area. */ static void gpencil_invert_image(tGPDfill *tgpf) { ImBuf *ibuf; @@ -1092,16 +1095,19 @@ static void gpencil_erase_processed_area(tGPDfill *tgpf) tgpf->ima->id.tag |= LIB_TAG_DOIT; } -/* Naive dilate +/** + * Naive dilate * * Expand green areas into enclosing red areas. * Using stack prevents creep when replacing colors directly. + *
  * -----------
  *  XXXXXXX
  *  XoooooX
  *  XXooXXX
  *   XXXX
  * -----------
+ * 
*/ static bool dilate_shape(ImBuf *ibuf) { @@ -1276,7 +1282,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) int cur_back_offset = -1; for (int i = 0; i < NEIGHBOR_COUNT; i++) { if (backtracked_offset[0][0] == offset[i][0] && backtracked_offset[0][1] == offset[i][1]) { - /* Finding the bracktracked pixel offset index */ + /* Finding the back-tracked pixel offset index */ cur_back_offset = i; break; } @@ -1306,7 +1312,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) cur_back_offset++; loop++; } - /* Current pixel is equal to starting or firt pixel. */ + /* Current pixel is equal to starting or first pixel. */ if ((boundary_co[0] == start_co[0] && boundary_co[1] == start_co[1]) || (boundary_co[0] == first_co[0] && boundary_co[1] == first_co[1])) { BLI_stack_pop(tgpf->stack, &v); @@ -1323,7 +1329,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf, const bool dilate) BKE_image_release_ibuf(tgpf->ima, ibuf, lock); } -/* get z-depth array to reproject on surface */ +/* Get z-depth array to reproject on surface. */ static void gpencil_get_depth_array(tGPDfill *tgpf) { tGPspoint *ptc; @@ -1374,7 +1380,7 @@ static void gpencil_get_depth_array(tGPDfill *tgpf) } if (found_depth == false) { - /* eeh... not much we can do.. :/, ignore depth in this case */ + /* Sigh! not much we can do here. Ignore depth in this case. */ for (i = totpoints - 1; i >= 0; i--) { tgpf->depth_arr[i] = 0.9999f; } diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 2d3505fa9d0..b6b6dcfaa59 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -516,7 +516,7 @@ bool ED_object_add_generic_get_opts(bContext *C, if (RNA_struct_property_is_set(op->ptr, "rotation")) { /* If rotation is set, always use it. Alignment (and corresponding user preference) * can be ignored since this is in world space anyways. - * To not confuse (e.g. on redo), dont set it to ALIGN_WORLD in the op UI though. */ + * To not confuse (e.g. on redo), don't set it to #ALIGN_WORLD in the op UI though. */ *is_view_aligned = false; RNA_float_get_array(op->ptr, "rotation", rot); } diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index 1eafa655195..c66618c0acd 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -438,9 +438,10 @@ typedef enum eDriverVar_Types { /** 'final' transform for object/bones */ DVAR_TYPE_TRANSFORM_CHAN, - /** Maximum number of variable types. + /** + * Maximum number of variable types. * - * \note This must always be th last item in this list, + * \note This must always be the last item in this list, * so add new types above this line. */ MAX_DVAR_TYPES, From bdb42c2c2d08aeccef99d2d70e50186fa6fd8001 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 07:57:53 +1100 Subject: [PATCH 053/519] Cleanup: remove redundant headers in source/blender/editors/ Remove redundant headers using `./source/tools/utils_maintenance/code_clean.py` Reviewed By: jmonteath Ref D10364 --- source/blender/editors/animation/anim_ops.c | 4 ---- source/blender/editors/animation/drivers.c | 1 - .../editors/animation/keyframes_general.c | 2 -- .../blender/editors/armature/armature_ops.c | 2 -- .../editors/armature/armature_skinning.c | 3 --- source/blender/editors/armature/pose_utils.c | 1 - source/blender/editors/asset/asset_edit.cc | 2 -- .../editors/geometry/geometry_attributes.c | 2 -- .../gizmo_library/gizmo_library_presets.c | 7 ------ .../gizmo_library/gizmo_types/blank3d_gizmo.c | 3 --- .../editors/gpencil/gpencil_add_monkey.c | 3 --- .../editors/gpencil/gpencil_add_stroke.c | 3 --- .../editors/gpencil/gpencil_armature.c | 3 --- .../editors/gpencil/gpencil_edit_curve.c | 3 --- .../editors/gpencil/gpencil_interpolate.c | 9 -------- .../blender/editors/gpencil/gpencil_merge.c | 3 --- source/blender/editors/gpencil/gpencil_mesh.c | 2 -- source/blender/editors/gpencil/gpencil_ops.c | 5 ---- .../editors/gpencil/gpencil_ops_versioning.c | 5 ---- .../editors/gpencil/gpencil_trace_ops.c | 10 -------- source/blender/editors/gpencil/gpencil_uv.c | 1 - .../editors/gpencil/gpencil_vertex_ops.c | 10 -------- .../editors/interface/interface_eyedropper.c | 2 -- .../interface/interface_eyedropper_depth.c | 2 -- .../interface_template_search_operator.c | 3 --- source/blender/editors/io/io_alembic.c | 3 --- source/blender/editors/io/io_cache.c | 1 - source/blender/editors/io/io_collada.c | 2 -- source/blender/editors/lattice/lattice_ops.c | 5 ---- source/blender/editors/mesh/editmesh_add.c | 2 -- .../blender/editors/mesh/editmesh_automerge.c | 3 --- source/blender/editors/mesh/editmesh_bevel.c | 2 -- .../editors/mesh/editmesh_extrude_spin.c | 4 ---- source/blender/editors/mesh/mesh_ops.c | 3 --- source/blender/editors/metaball/mball_ops.c | 2 -- .../editors/object/object_data_transfer.c | 2 -- source/blender/editors/object/object_ops.c | 8 ------- .../blender/editors/object/object_shapekey.c | 2 -- source/blender/editors/object/object_volume.c | 3 --- source/blender/editors/object/object_warp.c | 1 - .../blender/editors/physics/particle_boids.c | 1 - .../blender/editors/physics/physics_fluid.c | 6 ----- source/blender/editors/physics/physics_ops.c | 5 ---- .../editors/physics/physics_pointcache.c | 1 - .../editors/physics/rigidbody_object.c | 2 -- .../blender/editors/render/render_internal.c | 10 -------- source/blender/editors/render/render_update.c | 6 ----- source/blender/editors/screen/area_utils.c | 1 - .../editors/sculpt_paint/sculpt_detail.c | 17 -------------- source/blender/editors/sound/sound_ops.c | 1 - .../editors/space_action/action_buttons.c | 23 ------------------- .../blender/editors/space_action/action_ops.c | 3 --- .../editors/space_action/space_action.c | 1 - .../editors/space_buttons/buttons_context.c | 3 --- .../editors/space_buttons/buttons_texture.c | 3 --- .../blender/editors/space_clip/clip_buttons.c | 1 - .../blender/editors/space_clip/clip_toolbar.c | 12 ---------- .../blender/editors/space_clip/space_clip.c | 3 --- .../editors/space_clip/tracking_ops_detect.c | 4 ---- .../space_clip/tracking_ops_stabilize.c | 2 -- .../editors/space_clip/tracking_ops_track.c | 1 - .../editors/space_clip/tracking_ops_utils.c | 4 ---- .../editors/space_console/space_console.c | 1 - .../blender/editors/space_file/file_utils.c | 1 - .../blender/editors/space_graph/graph_ops.c | 4 ---- .../blender/editors/space_graph/graph_utils.c | 2 -- .../blender/editors/space_image/image_ops.c | 7 ------ .../editors/space_image/image_sequence.c | 4 ---- .../blender/editors/space_image/space_image.c | 14 ----------- source/blender/editors/space_info/info_draw.c | 1 - source/blender/editors/space_info/info_ops.c | 3 --- .../blender/editors/space_info/space_info.c | 5 ---- source/blender/editors/space_nla/nla_edit.c | 1 - source/blender/editors/space_nla/nla_ops.c | 5 ---- source/blender/editors/space_nla/space_nla.c | 2 -- .../blender/editors/space_node/node_buttons.c | 1 - source/blender/editors/space_node/node_ops.c | 4 ---- .../blender/editors/space_node/node_select.c | 1 - .../editors/space_node/node_templates.c | 1 - .../blender/editors/space_node/node_toolbar.c | 3 --- source/blender/editors/space_node/node_view.c | 1 - .../blender/editors/space_node/space_node.c | 1 - .../editors/space_outliner/outliner_context.c | 2 -- .../editors/space_outliner/outliner_ops.c | 13 ----------- .../editors/space_outliner/outliner_sync.c | 1 - .../editors/space_outliner/space_outliner.c | 3 --- .../space_outliner/tree/tree_display.cc | 2 -- .../space_outliner/tree/tree_element.cc | 2 -- .../editors/space_script/space_script.c | 2 -- .../editors/space_sequencer/sequencer_add.c | 2 -- .../space_sequencer/sequencer_buttons.c | 4 ---- .../editors/space_sequencer/sequencer_edit.c | 1 - .../editors/space_sequencer/sequencer_ops.c | 5 ---- .../editors/space_sequencer/sequencer_proxy.c | 1 - .../space_sequencer/sequencer_scopes.c | 2 -- .../editors/space_sequencer/space_sequencer.c | 1 - .../editors/space_statusbar/space_statusbar.c | 1 - .../blender/editors/space_text/space_text.c | 2 -- .../editors/space_topbar/space_topbar.c | 1 - .../editors/space_userpref/userpref_ops.c | 4 ---- .../space_view3d/view3d_camera_control.c | 4 ---- .../space_view3d/view3d_gizmo_forcefield.c | 1 - .../space_view3d/view3d_gizmo_navigate.c | 1 - .../space_view3d/view3d_gizmo_preselect.c | 1 - .../editors/space_view3d/view3d_header.c | 3 --- .../blender/editors/space_view3d/view3d_ops.c | 3 --- .../editors/space_view3d/view3d_snap.c | 1 - 107 files changed, 369 deletions(-) diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index a5514f6517e..72d9bff545a 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -29,12 +29,10 @@ #include "BLI_math_base.h" #include "BLI_utildefines.h" -#include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -50,10 +48,8 @@ #include "ED_screen.h" #include "ED_sequencer.h" #include "ED_time_scrub_ui.h" -#include "ED_util.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "SEQ_sequencer.h" #include "SEQ_time.h" diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index b2a9d6ac9b7..43d5efe9ea9 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -33,7 +33,6 @@ #include "DNA_anim_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_texture_types.h" #include "BKE_anim_data.h" diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 6ed9803dbd3..72e65272f13 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -39,13 +39,11 @@ #include "BKE_action.h" #include "BKE_curve.h" -#include "BKE_deform.h" #include "BKE_fcurve.h" #include "BKE_main.h" #include "BKE_report.h" #include "RNA_access.h" -#include "RNA_enum_types.h" #include "ED_anim_api.h" #include "ED_keyframes_edit.h" diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index da1b29307b1..a0face26bae 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -28,8 +28,6 @@ #include "ED_armature.h" #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "armature_intern.h" diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c index 6951ed6f305..f86ec545712 100644 --- a/source/blender/editors/armature/armature_skinning.c +++ b/source/blender/editors/armature/armature_skinning.c @@ -30,7 +30,6 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_string_utils.h" @@ -50,8 +49,6 @@ #include "ED_armature.h" #include "ED_mesh.h" -#include "eigen_capi.h" - #include "armature_intern.h" #include "meshlaplacian.h" diff --git a/source/blender/editors/armature/pose_utils.c b/source/blender/editors/armature/pose_utils.c index 7e6da7f96b0..c75e9c9ef69 100644 --- a/source/blender/editors/armature/pose_utils.c +++ b/source/blender/editors/armature/pose_utils.c @@ -33,7 +33,6 @@ #include "BKE_action.h" #include "BKE_anim_data.h" -#include "BKE_armature.h" #include "BKE_idprop.h" #include "BKE_layer.h" #include "BKE_object.h" diff --git a/source/blender/editors/asset/asset_edit.cc b/source/blender/editors/asset/asset_edit.cc index 7aee467286f..d20de4141cb 100644 --- a/source/blender/editors/asset/asset_edit.cc +++ b/source/blender/editors/asset/asset_edit.cc @@ -20,11 +20,9 @@ #include "BKE_asset.h" #include "BKE_context.h" -#include "BKE_idtype.h" #include "BKE_lib_id.h" #include "DNA_ID.h" -#include "DNA_asset_types.h" #include "UI_interface_icons.h" diff --git a/source/blender/editors/geometry/geometry_attributes.c b/source/blender/editors/geometry/geometry_attributes.c index 4106c03f17d..2807e7c4392 100644 --- a/source/blender/editors/geometry/geometry_attributes.c +++ b/source/blender/editors/geometry/geometry_attributes.c @@ -23,7 +23,6 @@ #include "BKE_attribute.h" #include "BKE_context.h" -#include "BKE_report.h" #include "RNA_access.h" #include "RNA_define.h" @@ -34,7 +33,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_geometry.h" #include "ED_object.h" #include "geometry_intern.h" diff --git a/source/blender/editors/gizmo_library/gizmo_library_presets.c b/source/blender/editors/gizmo_library/gizmo_library_presets.c index 9039851da01..4e56ceb9fd4 100644 --- a/source/blender/editors/gizmo_library/gizmo_library_presets.c +++ b/source/blender/editors/gizmo_library/gizmo_library_presets.c @@ -22,12 +22,9 @@ * \brief Preset shapes that can be drawn from any gizmo type. */ -#include "MEM_guardedalloc.h" - #include "BLI_math.h" #include "DNA_object_types.h" -#include "DNA_view3d_types.h" #include "BKE_context.h" @@ -36,12 +33,8 @@ #include "DEG_depsgraph.h" -#include "RNA_access.h" - -#include "WM_api.h" #include "WM_types.h" -#include "ED_screen.h" #include "ED_view3d.h" /* own includes */ diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c index 5617b6e125e..1b1f1151053 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c @@ -28,14 +28,11 @@ #include "BKE_context.h" #include "ED_gizmo_library.h" -#include "ED_view3d.h" #include "WM_api.h" #include "WM_types.h" /* own includes */ -#include "../gizmo_geometry.h" -#include "../gizmo_library_intern.h" static void gizmo_blank_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz)) { diff --git a/source/blender/editors/gpencil/gpencil_add_monkey.c b/source/blender/editors/gpencil/gpencil_add_monkey.c index 65141442237..d86bad7ef3c 100644 --- a/source/blender/editors/gpencil/gpencil_add_monkey.c +++ b/source/blender/editors/gpencil/gpencil_add_monkey.c @@ -29,16 +29,13 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_material.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "ED_gpencil.h" diff --git a/source/blender/editors/gpencil/gpencil_add_stroke.c b/source/blender/editors/gpencil/gpencil_add_stroke.c index 0c8cc621a3b..1e1a70f9c1d 100644 --- a/source/blender/editors/gpencil/gpencil_add_stroke.c +++ b/source/blender/editors/gpencil/gpencil_add_stroke.c @@ -29,16 +29,13 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_material.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "ED_gpencil.h" diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c index 5cc5e7ecdcd..3271096c433 100644 --- a/source/blender/editors/gpencil/gpencil_armature.c +++ b/source/blender/editors/gpencil/gpencil_armature.c @@ -31,12 +31,9 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "DNA_armature_types.h" #include "DNA_gpencil_types.h" #include "DNA_meshdata_types.h" diff --git a/source/blender/editors/gpencil/gpencil_edit_curve.c b/source/blender/editors/gpencil/gpencil_edit_curve.c index 60d1d2169b4..031bbd61173 100644 --- a/source/blender/editors/gpencil/gpencil_edit_curve.c +++ b/source/blender/editors/gpencil/gpencil_edit_curve.c @@ -28,13 +28,10 @@ #include #include -#include "MEM_guardedalloc.h" - #include "DNA_gpencil_types.h" #include "DNA_view3d_types.h" #include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_gpencil.h" #include "BKE_gpencil_curve.h" #include "BKE_gpencil_geom.h" diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 2e756cf9c8d..ecd243ed595 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -48,31 +48,22 @@ #include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_deform.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" #include "BKE_report.h" #include "UI_interface.h" -#include "UI_resources.h" #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" - -#include "UI_view2d.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_space_api.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_merge.c b/source/blender/editors/gpencil/gpencil_merge.c index 272dff56291..435bff34998 100644 --- a/source/blender/editors/gpencil/gpencil_merge.c +++ b/source/blender/editors/gpencil/gpencil_merge.c @@ -48,12 +48,9 @@ #include "RNA_define.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c index 53beaeaa6a0..ffe676f0520 100644 --- a/source/blender/editors/gpencil/gpencil_mesh.c +++ b/source/blender/editors/gpencil/gpencil_mesh.c @@ -36,8 +36,6 @@ #include "BKE_anim_data.h" #include "BKE_context.h" #include "BKE_duplilist.h" -#include "BKE_global.h" -#include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" #include "BKE_layer.h" #include "BKE_main.h" diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index 0a29b83bc4f..1a6cb5670c4 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -27,9 +27,7 @@ #include "BLI_sys_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_gpencil.h" #include "BKE_paint.h" #include "DNA_brush_types.h" @@ -45,9 +43,6 @@ #include "RNA_access.h" #include "ED_gpencil.h" -#include "ED_object.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_ops_versioning.c b/source/blender/editors/gpencil/gpencil_ops_versioning.c index 815bbbaa254..45842c28dff 100644 --- a/source/blender/editors/gpencil/gpencil_ops_versioning.c +++ b/source/blender/editors/gpencil/gpencil_ops_versioning.c @@ -34,16 +34,12 @@ #include "DNA_gpencil_types.h" #include "DNA_material_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_deform.h" #include "BKE_gpencil.h" #include "BKE_main.h" -#include "BKE_material.h" #include "BKE_object.h" #include "WM_api.h" @@ -53,7 +49,6 @@ #include "RNA_define.h" #include "ED_gpencil.h" -#include "ED_object.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c index 8d3ae9567cf..0f344909692 100644 --- a/source/blender/editors/gpencil/gpencil_trace_ops.c +++ b/source/blender/editors/gpencil/gpencil_trace_ops.c @@ -23,7 +23,6 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLT_translation.h" @@ -31,34 +30,26 @@ #include "DNA_gpencil_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" -#include "BKE_duplilist.h" #include "BKE_global.h" #include "BKE_gpencil.h" #include "BKE_image.h" #include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" -#include "BKE_material.h" #include "BKE_object.h" #include "BKE_report.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" -#include "UI_interface.h" -#include "UI_resources.h" - #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" -#include "IMB_imbuf.h" #include "IMB_imbuf_types.h" #include "ED_gpencil.h" @@ -66,7 +57,6 @@ #include "gpencil_intern.h" #include "gpencil_trace.h" -#include "potracelib.h" typedef struct TraceJob { /* from wmJob */ diff --git a/source/blender/editors/gpencil/gpencil_uv.c b/source/blender/editors/gpencil/gpencil_uv.c index ec2ccabddfe..677451eaabc 100644 --- a/source/blender/editors/gpencil/gpencil_uv.c +++ b/source/blender/editors/gpencil/gpencil_uv.c @@ -31,7 +31,6 @@ #include "BKE_context.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" -#include "BKE_unit.h" #include "RNA_access.h" #include "RNA_define.h" diff --git a/source/blender/editors/gpencil/gpencil_vertex_ops.c b/source/blender/editors/gpencil/gpencil_vertex_ops.c index 49f45acdb11..bf46fa2544f 100644 --- a/source/blender/editors/gpencil/gpencil_vertex_ops.c +++ b/source/blender/editors/gpencil/gpencil_vertex_ops.c @@ -28,16 +28,11 @@ #include "BLI_ghash.h" #include "BLI_math.h" -#include "BLT_translation.h" - #include "DNA_brush_types.h" #include "DNA_gpencil_types.h" #include "DNA_material_types.h" -#include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_gpencil.h" -#include "BKE_gpencil_modifier.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_paint.h" @@ -48,16 +43,11 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" - -#include "UI_view2d.h" #include "ED_gpencil.h" #include "ED_screen.h" -#include "ED_view3d.h" #include "DEG_depsgraph.h" -#include "DEG_depsgraph_query.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c index 4d0e1584156..de39484bc1e 100644 --- a/source/blender/editors/interface/interface_eyedropper.c +++ b/source/blender/editors/interface/interface_eyedropper.c @@ -24,8 +24,6 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "BLI_blenlib.h" - #include "BKE_context.h" #include "BKE_screen.h" diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c index e71a0b9196c..a4adbef0b94 100644 --- a/source/blender/editors/interface/interface_eyedropper_depth.c +++ b/source/blender/editors/interface/interface_eyedropper_depth.c @@ -41,8 +41,6 @@ #include "BKE_screen.h" #include "BKE_unit.h" -#include "DEG_depsgraph.h" - #include "RNA_access.h" #include "UI_interface.h" diff --git a/source/blender/editors/interface/interface_template_search_operator.c b/source/blender/editors/interface/interface_template_search_operator.c index 21529a97c01..ff0f9a2e5cd 100644 --- a/source/blender/editors/interface/interface_template_search_operator.c +++ b/source/blender/editors/interface/interface_template_search_operator.c @@ -23,11 +23,8 @@ #include -#include "DNA_gpencil_modifier_types.h" -#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_shader_fx_types.h" #include "DNA_texture_types.h" #include "BLI_alloca.h" diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c index 636e6688971..a66f53ea839 100644 --- a/source/blender/editors/io/io_alembic.c +++ b/source/blender/editors/io/io_alembic.c @@ -35,19 +35,16 @@ # include "MEM_guardedalloc.h" -# include "DNA_mesh_types.h" # include "DNA_modifier_types.h" # include "DNA_object_types.h" # include "DNA_scene_types.h" # include "DNA_space_types.h" # include "BKE_context.h" -# include "BKE_global.h" # include "BKE_main.h" # include "BKE_report.h" # include "BLI_listbase.h" -# include "BLI_math_vector.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_utildefines.h" diff --git a/source/blender/editors/io/io_cache.c b/source/blender/editors/io/io_cache.c index b73b8abccfe..1e66a86c8fd 100644 --- a/source/blender/editors/io/io_cache.c +++ b/source/blender/editors/io/io_cache.c @@ -26,7 +26,6 @@ #include "DNA_cachefile_types.h" #include "DNA_space_types.h" -#include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c index 200786ca99d..2bf975cc4f5 100644 --- a/source/blender/editors/io/io_collada.c +++ b/source/blender/editors/io/io_collada.c @@ -29,7 +29,6 @@ # include "BLI_utildefines.h" # include "BKE_context.h" -# include "BKE_global.h" # include "BKE_main.h" # include "BKE_object.h" # include "BKE_report.h" @@ -37,7 +36,6 @@ # include "DEG_depsgraph.h" # include "ED_object.h" -# include "ED_screen.h" # include "RNA_access.h" # include "RNA_define.h" diff --git a/source/blender/editors/lattice/lattice_ops.c b/source/blender/editors/lattice/lattice_ops.c index d5505c00132..3f96b8a303b 100644 --- a/source/blender/editors/lattice/lattice_ops.c +++ b/source/blender/editors/lattice/lattice_ops.c @@ -23,15 +23,10 @@ #include "DNA_scene_types.h" -#include "RNA_access.h" - #include "WM_api.h" -#include "WM_types.h" #include "ED_lattice.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "lattice_intern.h" diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index a5dd29c9d73..d60d83850a5 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -24,7 +24,6 @@ #include "BLI_math.h" #include "BLI_sys_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -42,7 +41,6 @@ #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_uvedit.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/mesh/editmesh_automerge.c b/source/blender/editors/mesh/editmesh_automerge.c index f9910f01f47..2bd5b9b26ca 100644 --- a/source/blender/editors/mesh/editmesh_automerge.c +++ b/source/blender/editors/mesh/editmesh_automerge.c @@ -26,12 +26,9 @@ * - #EDBM_automerge_and_split */ -#include "MEM_guardedalloc.h" - #include "BKE_editmesh.h" #include "DNA_object_types.h" -#include "DNA_scene_types.h" #include "ED_mesh.h" diff --git a/source/blender/editors/mesh/editmesh_bevel.c b/source/blender/editors/mesh/editmesh_bevel.c index 644aa3903f6..66a7b97b440 100644 --- a/source/blender/editors/mesh/editmesh_bevel.c +++ b/source/blender/editors/mesh/editmesh_bevel.c @@ -28,11 +28,9 @@ #include "BLT_translation.h" #include "BKE_context.h" -#include "BKE_curveprofile.h" #include "BKE_editmesh.h" #include "BKE_global.h" #include "BKE_layer.h" -#include "BKE_mesh.h" #include "BKE_unit.h" #include "DNA_curveprofile_types.h" diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.c b/source/blender/editors/mesh/editmesh_extrude_spin.c index 7b3fabf07fc..187652ae00f 100644 --- a/source/blender/editors/mesh/editmesh_extrude_spin.c +++ b/source/blender/editors/mesh/editmesh_extrude_spin.c @@ -33,17 +33,13 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" -#include "WM_api.h" #include "WM_types.h" #include "ED_mesh.h" #include "ED_screen.h" #include "ED_view3d.h" -#include "UI_resources.h" - #include "MEM_guardedalloc.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 2cf97b7235f..27d73497b49 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -21,7 +21,6 @@ * \ingroup edmesh */ -#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "RNA_access.h" @@ -30,9 +29,7 @@ #include "WM_types.h" #include "ED_mesh.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "mesh_intern.h" /* own include */ diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 100ca4691ca..a54ec384d8e 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -29,9 +29,7 @@ #include "WM_types.h" #include "ED_mball.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "mball_intern.h" diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index a80810cc734..b251e617a4c 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -51,8 +51,6 @@ #include "ED_object.h" -#include "UI_interface.h" - #include "object_intern.h" /* All possible data to transfer. diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 964d9898ac0..2124d242ee2 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -25,23 +25,15 @@ #include #include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "BLI_utildefines.h" #include "BKE_context.h" #include "RNA_access.h" -#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "ED_object.h" -#include "ED_screen.h" -#include "ED_select_utils.h" - -#include "DEG_depsgraph.h" #include "object_intern.h" diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 1bb0246deb5..fd649854d8f 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -36,7 +36,6 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" @@ -44,7 +43,6 @@ #include "DNA_object_types.h" #include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_key.h" #include "BKE_lattice.h" #include "BKE_main.h" diff --git a/source/blender/editors/object/object_volume.c b/source/blender/editors/object/object_volume.c index 6b46d43e5bf..fbdee00c29c 100644 --- a/source/blender/editors/object/object_volume.c +++ b/source/blender/editors/object/object_volume.c @@ -23,9 +23,6 @@ #include -#include "MEM_guardedalloc.h" - -#include "BLI_fileops.h" #include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_path_util.h" diff --git a/source/blender/editors/object/object_warp.c b/source/blender/editors/object/object_warp.c index 8f5a60ace2e..4b15385b537 100644 --- a/source/blender/editors/object/object_warp.c +++ b/source/blender/editors/object/object_warp.c @@ -36,7 +36,6 @@ #include "WM_types.h" #include "ED_transverts.h" -#include "ED_view3d.h" #include "object_intern.h" diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c index 22cfa50aee9..9b8622e6eac 100644 --- a/source/blender/editors/physics/particle_boids.c +++ b/source/blender/editors/physics/particle_boids.c @@ -33,7 +33,6 @@ #include "BKE_boids.h" #include "BKE_context.h" #include "BKE_main.h" -#include "BKE_particle.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 32d2e39d6f6..a94a2b9b764 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -33,21 +33,17 @@ #include "DNA_object_types.h" #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_path_util.h" #include "BLI_utildefines.h" #include "BLT_translation.h" #include "BKE_context.h" -#include "BKE_customdata.h" #include "BKE_fluid.h" #include "BKE_global.h" #include "BKE_main.h" #include "BKE_modifier.h" -#include "BKE_object.h" #include "BKE_report.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "DEG_depsgraph.h" @@ -59,11 +55,9 @@ #include "WM_api.h" #include "WM_types.h" -#include "manta_fluid_API.h" #include "physics_intern.h" /* own include */ #include "DNA_fluid_types.h" -#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #define FLUID_JOB_BAKE_ALL "FLUID_OT_bake_all" diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index eb154b97eb0..f5b80679689 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -23,14 +23,9 @@ #include -#include "RNA_access.h" - #include "WM_api.h" -#include "WM_types.h" -#include "ED_object.h" #include "ED_physics.h" -#include "ED_select_utils.h" #include "physics_intern.h" /* own include */ diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c index 1d5903bf417..ea8a4ce2a79 100644 --- a/source/blender/editors/physics/physics_pointcache.c +++ b/source/blender/editors/physics/physics_pointcache.c @@ -34,7 +34,6 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_layer.h" -#include "BKE_particle.h" #include "BKE_pointcache.h" #include "DEG_depsgraph.h" diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c index 4fd304ea71d..81a8b57776b 100644 --- a/source/blender/editors/physics/rigidbody_object.c +++ b/source/blender/editors/physics/rigidbody_object.c @@ -34,9 +34,7 @@ #include "BLT_translation.h" -#include "BKE_collection.h" #include "BKE_context.h" -#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_report.h" #include "BKE_rigidbody.h" diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 4b84894c23d..50ba5907703 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -43,14 +43,10 @@ #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" -#include "BKE_blender_undo.h" -#include "BKE_blender_version.h" -#include "BKE_camera.h" #include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_image.h" -#include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" @@ -58,19 +54,15 @@ #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_screen.h" -#include "BKE_undo_system.h" #include "DEG_depsgraph.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_render.h" #include "ED_screen.h" -#include "ED_undo.h" #include "ED_util.h" -#include "ED_view3d.h" #include "BIF_glutil.h" @@ -85,8 +77,6 @@ #include "SEQ_relations.h" -#include "BLO_undofile.h" - #include "render_intern.h" /* Render Callbacks */ diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c index 499ffac6028..4ed1cbd60a5 100644 --- a/source/blender/editors/render/render_update.c +++ b/source/blender/editors/render/render_update.c @@ -25,7 +25,6 @@ #include "DNA_light_types.h" #include "DNA_material_types.h" -#include "DNA_meshdata_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -33,7 +32,6 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" -#include "DNA_workspace_types.h" #include "DNA_world_types.h" #include "DRW_engine.h" @@ -44,13 +42,11 @@ #include "BKE_context.h" #include "BKE_icons.h" -#include "BKE_layer.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_node.h" #include "BKE_paint.h" #include "BKE_scene.h" -#include "BKE_workspace.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -65,8 +61,6 @@ #include "WM_api.h" -#include "render_intern.h" /* own include */ - #include /***************************** Render Engines ********************************/ diff --git a/source/blender/editors/screen/area_utils.c b/source/blender/editors/screen/area_utils.c index b784a4b0056..30553bb7f07 100644 --- a/source/blender/editors/screen/area_utils.c +++ b/source/blender/editors/screen/area_utils.c @@ -34,7 +34,6 @@ #include "ED_screen.h" -#include "UI_interface.h" #include "UI_interface_icons.h" /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/sculpt_paint/sculpt_detail.c b/source/blender/editors/sculpt_paint/sculpt_detail.c index aa1d407dc24..ddf7ba1e412 100644 --- a/source/blender/editors/sculpt_paint/sculpt_detail.c +++ b/source/blender/editors/sculpt_paint/sculpt_detail.c @@ -24,46 +24,29 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_hash.h" #include "BLI_math.h" -#include "BLI_task.h" #include "BLT_translation.h" #include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_mesh.h" -#include "BKE_mesh_mapping.h" -#include "BKE_object.h" #include "BKE_paint.h" #include "BKE_pbvh.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "DEG_depsgraph.h" #include "WM_api.h" -#include "WM_message.h" -#include "WM_toolsystem.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_sculpt.h" #include "ED_view3d.h" -#include "paint_intern.h" #include "sculpt_intern.h" #include "RNA_access.h" #include "RNA_define.h" -#include "UI_interface.h" - -#include "bmesh.h" - #include #include diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 391bc5dab45..85616f6356d 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -31,7 +31,6 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_sound_types.h" diff --git a/source/blender/editors/space_action/action_buttons.c b/source/blender/editors/space_action/action_buttons.c index 5e1c205f1d4..dfc3789a26c 100644 --- a/source/blender/editors/space_action/action_buttons.c +++ b/source/blender/editors/space_action/action_buttons.c @@ -26,33 +26,10 @@ #include #include -#include "DNA_anim_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "MEM_guardedalloc.h" - #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" -#include "BKE_curve.h" -#include "BKE_fcurve.h" #include "BKE_screen.h" -#include "BKE_unit.h" - -#include "WM_api.h" -#include "WM_types.h" - -#include "RNA_access.h" - -#include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_screen.h" - -#include "UI_interface.h" -#include "UI_resources.h" #include "action_intern.h" /* own include */ diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c index 7422c05511c..7821458d1e5 100644 --- a/source/blender/editors/space_action/action_ops.c +++ b/source/blender/editors/space_action/action_ops.c @@ -27,9 +27,6 @@ #include "DNA_space_types.h" #include "ED_anim_api.h" -#include "ED_markers.h" -#include "ED_object.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "action_intern.h" diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 691287a543f..722005235d3 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -55,7 +55,6 @@ #include "ED_space_api.h" #include "ED_time_scrub_ui.h" -#include "GPU_framebuffer.h" #include "action_intern.h" /* own include */ /* ******************** default callbacks for action space ***************** */ diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index e2b889bece1..5f347451c4a 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -33,8 +33,6 @@ #include "DNA_armature_types.h" #include "DNA_brush_types.h" -#include "DNA_collection_types.h" -#include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" @@ -53,7 +51,6 @@ #include "BKE_paint.h" #include "BKE_particle.h" #include "BKE_screen.h" -#include "BKE_texture.h" #include "RNA_access.h" diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c index 6f743eb1a6b..4847e8738df 100644 --- a/source/blender/editors/space_buttons/buttons_texture.c +++ b/source/blender/editors/space_buttons/buttons_texture.c @@ -52,10 +52,7 @@ #include "BKE_node.h" #include "BKE_paint.h" #include "BKE_particle.h" -#include "BKE_scene.h" -#include "BKE_workspace.h" #ifdef WITH_FREESTYLE -# include "BKE_freestyle.h" #endif #include "RNA_access.h" diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c index 81bae26efeb..632f3c5147f 100644 --- a/source/blender/editors/space_clip/clip_buttons.c +++ b/source/blender/editors/space_clip/clip_buttons.c @@ -46,7 +46,6 @@ #include "DEG_depsgraph.h" #include "ED_clip.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c index b02f3fe16f6..da9e82043f0 100644 --- a/source/blender/editors/space_clip/clip_toolbar.c +++ b/source/blender/editors/space_clip/clip_toolbar.c @@ -23,29 +23,17 @@ #include -#include "DNA_windowmanager_types.h" -#include "DNA_workspace_types.h" - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" #include "BKE_screen.h" -#include "RNA_access.h" - -#include "WM_api.h" #include "WM_types.h" #include "ED_screen.h" -#include "ED_undo.h" - -#include "UI_interface.h" -#include "UI_resources.h" #include "clip_intern.h" /* own include */ diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 33783f19a79..2a7c64a83f7 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -47,15 +47,12 @@ #include "ED_clip.h" #include "ED_mask.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_space_api.h" #include "ED_time_scrub_ui.h" -#include "ED_transform.h" #include "ED_uvedit.h" /* just for ED_image_draw_cursor */ #include "IMB_imbuf.h" -#include "GPU_framebuffer.h" #include "GPU_matrix.h" #include "WM_api.h" diff --git a/source/blender/editors/space_clip/tracking_ops_detect.c b/source/blender/editors/space_clip/tracking_ops_detect.c index 54ec439471d..86ee94df731 100644 --- a/source/blender/editors/space_clip/tracking_ops_detect.c +++ b/source/blender/editors/space_clip/tracking_ops_detect.c @@ -21,14 +21,10 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_gpencil_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "BKE_movieclip.h" #include "BKE_report.h" diff --git a/source/blender/editors/space_clip/tracking_ops_stabilize.c b/source/blender/editors/space_clip/tracking_ops_stabilize.c index 5e43b7c7ec6..d0b4d18c6d9 100644 --- a/source/blender/editors/space_clip/tracking_ops_stabilize.c +++ b/source/blender/editors/space_clip/tracking_ops_stabilize.c @@ -21,8 +21,6 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_screen_types.h" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c index 585b13b426e..e480ec2db05 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.c +++ b/source/blender/editors/space_clip/tracking_ops_track.c @@ -30,7 +30,6 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_movieclip.h" -#include "BKE_report.h" #include "BKE_tracking.h" #include "WM_api.h" diff --git a/source/blender/editors/space_clip/tracking_ops_utils.c b/source/blender/editors/space_clip/tracking_ops_utils.c index 1f959e94309..0f6bd6e039a 100644 --- a/source/blender/editors/space_clip/tracking_ops_utils.c +++ b/source/blender/editors/space_clip/tracking_ops_utils.c @@ -21,12 +21,8 @@ * \ingroup spclip */ -#include "MEM_guardedalloc.h" - #include "DNA_space_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "BKE_tracking.h" diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 790ea379e54..b24579d9871 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -41,7 +41,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "console_intern.h" /* own include */ /* ******************** default callbacks for console space ***************** */ diff --git a/source/blender/editors/space_file/file_utils.c b/source/blender/editors/space_file/file_utils.c index 9d85996c559..186bc04fafe 100644 --- a/source/blender/editors/space_file/file_utils.c +++ b/source/blender/editors/space_file/file_utils.c @@ -19,7 +19,6 @@ */ #include "BLI_fileops.h" -#include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_rect.h" #include "BLI_string.h" diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 63acc2a1774..32396a70cce 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -32,15 +32,11 @@ #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_main.h" #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_markers.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "graph_intern.h" diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c index 8463c21b1ad..c37d9f42c12 100644 --- a/source/blender/editors/space_graph/graph_utils.c +++ b/source/blender/editors/space_graph/graph_utils.c @@ -38,8 +38,6 @@ #include "BKE_fcurve.h" #include "BKE_screen.h" -#include "WM_api.h" - #include "ED_anim_api.h" #include "ED_screen.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index eae16b2cb71..4008ca228ac 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -36,9 +36,7 @@ #include "BLI_blenlib.h" #include "BLI_fileops.h" -#include "BLI_fileops_types.h" #include "BLI_ghash.h" -#include "BLI_linklist.h" #include "BLI_math.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -48,7 +46,6 @@ #include "DNA_camera_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" -#include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -62,14 +59,10 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_packedFile.h" -#include "BKE_paint.h" #include "BKE_report.h" -#include "BKE_scene.h" -#include "BKE_screen.h" #include "DEG_depsgraph.h" -#include "GPU_immediate.h" #include "GPU_state.h" #include "IMB_colormanagement.h" diff --git a/source/blender/editors/space_image/image_sequence.c b/source/blender/editors/space_image/image_sequence.c index 81f2ced7dee..02546e3e3b3 100644 --- a/source/blender/editors/space_image/image_sequence.c +++ b/source/blender/editors/space_image/image_sequence.c @@ -27,7 +27,6 @@ #include "BLI_fileops.h" #include "BLI_fileops_types.h" -#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_path_util.h" @@ -35,7 +34,6 @@ #include "BLI_utildefines.h" #include "DNA_image_types.h" -#include "DNA_space_types.h" #include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -45,8 +43,6 @@ #include "ED_image.h" -#include "WM_types.h" - typedef struct ImageFrame { struct ImageFrame *next, *prev; int framenr; diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index d6939a9100f..69976bc088c 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -24,8 +24,6 @@ #include "DNA_gpencil_types.h" #include "DNA_image_types.h" #include "DNA_mask_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -37,14 +35,9 @@ #include "BKE_colortools.h" #include "BKE_context.h" -#include "BKE_editmesh.h" #include "BKE_image.h" -#include "BKE_layer.h" #include "BKE_lib_id.h" -#include "BKE_material.h" -#include "BKE_scene.h" #include "BKE_screen.h" -#include "BKE_workspace.h" #include "RNA_access.h" #include "RNA_define.h" @@ -56,7 +49,6 @@ #include "ED_image.h" #include "ED_mask.h" -#include "ED_mesh.h" #include "ED_node.h" #include "ED_render.h" #include "ED_screen.h" @@ -65,19 +57,13 @@ #include "ED_uvedit.h" #include "WM_api.h" -#include "WM_message.h" #include "WM_types.h" #include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_batch_presets.h" -#include "GPU_framebuffer.h" -#include "GPU_viewport.h" - #include "DRW_engine.h" -#include "DRW_engine_types.h" #include "image_intern.h" diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c index e3a82b8bd72..be3b60d581b 100644 --- a/source/blender/editors/space_info/info_draw.c +++ b/source/blender/editors/space_info/info_draw.c @@ -35,7 +35,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "info_intern.h" #include "textview.h" diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index b6d47b74fdc..0583628be43 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_packedFile_types.h" #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" @@ -52,8 +51,6 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "IMB_imbuf_types.h" - #include "RNA_access.h" #include "RNA_define.h" diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index e2ab139aa07..dfc0abee704 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -29,8 +29,6 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.h" - #include "BKE_context.h" #include "BKE_screen.h" @@ -43,12 +41,9 @@ #include "RNA_access.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "BLO_readfile.h" -#include "GPU_framebuffer.h" #include "info_intern.h" /* own include */ /* ******************** default callbacks for info space ***************** */ diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 031cf7c6376..893d2c0e2c8 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -62,7 +62,6 @@ #include "DEG_depsgraph_build.h" #include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "nla_intern.h" /* own include */ diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index 2e32c496170..631dc2e550c 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -30,16 +30,11 @@ #include "BKE_screen.h" #include "ED_anim_api.h" -#include "ED_markers.h" #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" - #include "nla_intern.h" /* own include */ /* ************************** poll callbacks for operators **********************************/ diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index efe851c64ed..011cd7e2651 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_anim_types.h" #include "DNA_collection_types.h" #include "DNA_scene_types.h" @@ -52,7 +51,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "nla_intern.h" /* own include */ /* ******************** default callbacks for nla space ***************** */ diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index c9a0c827a09..fa4d6997c83 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -40,7 +40,6 @@ #include "RNA_access.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "UI_resources.h" diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 11933ef0811..d55fd06ddea 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -23,14 +23,10 @@ #include "DNA_node_types.h" -#include "BLI_utildefines.h" - #include "BKE_context.h" #include "ED_node.h" /* own include */ #include "ED_screen.h" -#include "ED_select_utils.h" -#include "ED_transform.h" #include "RNA_access.h" diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index a41f99afb4c..1e6ca66dd31 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -26,7 +26,6 @@ #include "DNA_node_types.h" #include "DNA_windowmanager_types.h" -#include "BLI_alloca.h" #include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_math.h" diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index 553971cd0a5..f0e3f5442cc 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -35,7 +35,6 @@ #include "BKE_context.h" #include "BKE_lib_id.h" #include "BKE_main.h" -#include "BKE_scene.h" #include "RNA_access.h" diff --git a/source/blender/editors/space_node/node_toolbar.c b/source/blender/editors/space_node/node_toolbar.c index 7afd3fef4db..2e7d6ab6cd5 100644 --- a/source/blender/editors/space_node/node_toolbar.c +++ b/source/blender/editors/space_node/node_toolbar.c @@ -29,9 +29,6 @@ #include "BKE_screen.h" #include "WM_api.h" -#include "WM_types.h" - -#include "ED_screen.h" #include "node_intern.h" /* own include */ diff --git a/source/blender/editors/space_node/node_view.c b/source/blender/editors/space_node/node_view.c index d938cb38270..8f1dc3c8c3e 100644 --- a/source/blender/editors/space_node/node_view.c +++ b/source/blender/editors/space_node/node_view.c @@ -52,7 +52,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "NOD_composite.h" #include "node_intern.h" /* own include */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 94915022ce9..73c6a28a5dc 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -35,7 +35,6 @@ #include "BKE_context.h" #include "BKE_lib_id.h" #include "BKE_node.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "ED_node.h" diff --git a/source/blender/editors/space_outliner/outliner_context.c b/source/blender/editors/space_outliner/outliner_context.c index a314a640e42..e2b3b79e027 100644 --- a/source/blender/editors/space_outliner/outliner_context.c +++ b/source/blender/editors/space_outliner/outliner_context.c @@ -27,8 +27,6 @@ #include "DNA_space_types.h" -#include "RNA_access.h" - #include "outliner_intern.h" static void outliner_context_selected_ids_recursive(const ListBase *subtree, diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index acda5ae82f0..7e5b0c90714 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -21,22 +21,9 @@ * \ingroup spoutliner */ -#include "MEM_guardedalloc.h" - -#include "DNA_collection_types.h" - -#include "BLT_translation.h" - -#include "RNA_access.h" - -#include "UI_interface.h" -#include "UI_view2d.h" - #include "WM_api.h" -#include "WM_types.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "outliner_intern.h" diff --git a/source/blender/editors/space_outliner/outliner_sync.c b/source/blender/editors/space_outliner/outliner_sync.c index 81b8974fba4..8bd5e3a130a 100644 --- a/source/blender/editors/space_outliner/outliner_sync.c +++ b/source/blender/editors/space_outliner/outliner_sync.c @@ -38,7 +38,6 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" -#include "BKE_object.h" #include "DEG_depsgraph.h" diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 9082e0047c6..87f81a2cc0e 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -31,9 +31,7 @@ #include "BLI_utildefines.h" #include "BKE_context.h" -#include "BKE_layer.h" #include "BKE_outliner_treehash.h" -#include "BKE_scene.h" #include "BKE_screen.h" #include "ED_screen.h" @@ -51,7 +49,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "GPU_framebuffer.h" #include "outliner_intern.h" #include "tree/tree_display.h" diff --git a/source/blender/editors/space_outliner/tree/tree_display.cc b/source/blender/editors/space_outliner/tree/tree_display.cc index d2070fb9b1c..6632c057814 100644 --- a/source/blender/editors/space_outliner/tree/tree_display.cc +++ b/source/blender/editors/space_outliner/tree/tree_display.cc @@ -18,8 +18,6 @@ * \ingroup spoutliner */ -#include "BLI_listbase.h" - #include "DNA_listBase.h" #include "tree_display.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index ce2a8fa634d..27846614994 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -20,8 +20,6 @@ #include "DNA_listBase.h" -#include "../outliner_intern.h" - #include "tree_element_anim_data.hh" #include "tree_element_driver_base.hh" #include "tree_element_nla.hh" diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c index 47de18e8faf..4ce0e454df8 100644 --- a/source/blender/editors/space_script/space_script.c +++ b/source/blender/editors/space_script/space_script.c @@ -36,7 +36,6 @@ #include "ED_space_api.h" #include "WM_api.h" -#include "WM_types.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -44,7 +43,6 @@ #ifdef WITH_PYTHON #endif -#include "GPU_framebuffer.h" #include "script_intern.h" /* own include */ // static script_run_python(char *funcname, ) diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 516d3bba16f..e605cf4a889 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -66,8 +66,6 @@ #include "UI_interface.h" -#include "BKE_sound.h" - #ifdef WITH_AUDASPACE # include #endif diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c index a8c13d63259..11614d94862 100644 --- a/source/blender/editors/space_sequencer/sequencer_buttons.c +++ b/source/blender/editors/space_sequencer/sequencer_buttons.c @@ -35,13 +35,9 @@ #include "BKE_global.h" #include "BKE_screen.h" -#include "ED_gpencil.h" #include "ED_screen.h" #include "ED_sequencer.h" -#include "WM_api.h" -#include "WM_types.h" - #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 7474f8034de..608e220c582 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -28,7 +28,6 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_timecode.h" #include "BLI_utildefines.h" diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index 7bfc8600544..48e6cfcdcd0 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -29,12 +29,7 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_markers.h" -#include "ED_select_utils.h" #include "ED_sequencer.h" -#include "ED_transform.h" /* Transform keymap. */ - -#include "SEQ_sequencer.h" #include "sequencer_intern.h" diff --git a/source/blender/editors/space_sequencer/sequencer_proxy.c b/source/blender/editors/space_sequencer/sequencer_proxy.c index b9698492aa5..24fa4ad7a17 100644 --- a/source/blender/editors/space_sequencer/sequencer_proxy.c +++ b/source/blender/editors/space_sequencer/sequencer_proxy.c @@ -25,7 +25,6 @@ #include "BLI_blenlib.h" #include "BLI_ghash.h" -#include "BLI_timecode.h" #include "DNA_scene_types.h" diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c index f5707d1ea65..16768e09cb8 100644 --- a/source/blender/editors/space_sequencer/sequencer_scopes.c +++ b/source/blender/editors/space_sequencer/sequencer_scopes.c @@ -30,8 +30,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "atomic_ops.h" - #include "sequencer_intern.h" /* XXX, why is this function better than BLI_math version? diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index d7937725705..b17482cd3a4 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -51,7 +51,6 @@ #include "RNA_access.h" -#include "SEQ_sequencer.h" #include "SEQ_utils.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_statusbar/space_statusbar.c b/source/blender/editors/space_statusbar/space_statusbar.c index e877cf8ffcf..0b4f483c114 100644 --- a/source/blender/editors/space_statusbar/space_statusbar.c +++ b/source/blender/editors/space_statusbar/space_statusbar.c @@ -34,7 +34,6 @@ #include "RNA_access.h" #include "UI_interface.h" -#include "UI_view2d.h" #include "WM_api.h" #include "WM_message.h" diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 045305e0f5d..ea55eaea388 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -33,7 +33,6 @@ #include "BKE_global.h" #include "BKE_lib_id.h" #include "BKE_screen.h" -#include "BKE_text.h" #include "ED_screen.h" #include "ED_space_api.h" @@ -47,7 +46,6 @@ #include "RNA_access.h" -#include "GPU_framebuffer.h" #include "text_format.h" #include "text_intern.h" /* own include */ diff --git a/source/blender/editors/space_topbar/space_topbar.c b/source/blender/editors/space_topbar/space_topbar.c index 6a7439df6e3..419721cf89e 100644 --- a/source/blender/editors/space_topbar/space_topbar.c +++ b/source/blender/editors/space_topbar/space_topbar.c @@ -38,7 +38,6 @@ #include "ED_screen.h" #include "ED_space_api.h" -#include "ED_undo.h" #include "UI_interface.h" #include "UI_resources.h" diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c index f05d6df9944..7c799f0d97b 100644 --- a/source/blender/editors/space_userpref/userpref_ops.c +++ b/source/blender/editors/space_userpref/userpref_ops.c @@ -28,10 +28,8 @@ #include "BLI_listbase.h" #include "BKE_context.h" -#include "BKE_global.h" #include "BKE_main.h" #include "BKE_preferences.h" -#include "BKE_report.h" #include "RNA_access.h" #include "RNA_define.h" @@ -39,8 +37,6 @@ #include "UI_interface.h" -#include "../interface/interface_intern.h" - #include "WM_api.h" #include "WM_types.h" diff --git a/source/blender/editors/space_view3d/view3d_camera_control.c b/source/blender/editors/space_view3d/view3d_camera_control.c index 11643960595..0edd6aeb2ca 100644 --- a/source/blender/editors/space_view3d/view3d_camera_control.c +++ b/source/blender/editors/space_view3d/view3d_camera_control.c @@ -50,12 +50,8 @@ #include "DEG_depsgraph.h" -#include "ED_screen.h" - #include "view3d_intern.h" /* own include */ -#include "BLI_strict_flags.h" - typedef struct View3DCameraControl { /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c index 242a0a802a6..98597cb2986 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.c @@ -22,7 +22,6 @@ #include "BKE_context.h" #include "BKE_layer.h" -#include "BKE_object.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c index c145497fa09..6fa974cdb09 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c @@ -22,7 +22,6 @@ #include "BLI_utildefines.h" #include "BKE_context.h" -#include "BKE_object.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c index 3f07653fb2f..171cf721343 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c @@ -30,7 +30,6 @@ #include "UI_resources.h" #include "WM_api.h" -#include "WM_toolsystem.h" #include "WM_types.h" #include "view3d_intern.h" /* own include */ diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index f2e42cd1725..607ca110d0f 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -40,14 +40,11 @@ #include "DEG_depsgraph.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "ED_mesh.h" -#include "ED_screen.h" #include "ED_undo.h" #include "UI_interface.h" diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 0770bac1313..344168e895b 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -24,7 +24,6 @@ #include #include -#include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -36,7 +35,6 @@ #include "BKE_appdir.h" #include "BKE_blender_copybuffer.h" -#include "BKE_collection.h" #include "BKE_context.h" #include "BKE_main.h" #include "BKE_report.h" @@ -49,7 +47,6 @@ #include "ED_outliner.h" #include "ED_screen.h" -#include "ED_select_utils.h" #include "ED_transform.h" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 148a0986c5c..cce9287679c 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -27,7 +27,6 @@ #include "DNA_object_types.h" #include "BLI_array.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_utildefines.h" From 5bddfde217b1477c02de9dcfa8c078969d432519 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 10 Feb 2021 09:24:47 +1100 Subject: [PATCH 054/519] cmake/deps: update Python to 3.9.1 The following packages also have received updates: - IDNA 2.10 - CHARDET 4.0.0 - URLLIB3 1.26.3 - CERTIFI 2020.12.5 - REQUESTS 2.25.1 - NUMPY 1.19.5 numpy has gained a hard dependency on cython: - CYTHON 0.29.21 Notes: - This only updates the build environment files, once these are built, Blender can default to Python 3.9. - The 'm' suffix for Python binaries/libs has been removed. - The macOS patch in Python 3.7 is has been removed. Reviewed By: sybren, campbellbarton, sebbas Ref D10257 --- .../build_environment/cmake/harvest.cmake | 2 +- .../build_environment/cmake/numpy.cmake | 1 + .../build_environment/cmake/python.cmake | 3 +- .../cmake/python_site_packages.cmake | 2 +- .../build_environment/cmake/versions.cmake | 25 +- .../patches/python_linux.diff | 26 +- .../patches/python_macos.diff | 289 ------------------ 7 files changed, 30 insertions(+), 318 deletions(-) delete mode 100644 build_files/build_environment/patches/python_macos.diff diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 6785b727a69..308cb77144c 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -162,7 +162,7 @@ harvest(png/include png/include "*.h") harvest(png/lib png/lib "*.a") harvest(pugixml/include pugixml/include "*.hpp") harvest(pugixml/lib pugixml/lib "*.a") -harvest(python/bin python/bin "python${PYTHON_SHORT_VERSION}m") +harvest(python/bin python/bin "python${PYTHON_SHORT_VERSION}") harvest(python/include python/include "*h") harvest(python/lib python/lib "*") harvest(sdl/include/SDL2 sdl/include "*.h") diff --git a/build_files/build_environment/cmake/numpy.cmake b/build_files/build_environment/cmake/numpy.cmake index 03316a8fc63..7a1b00895f4 100644 --- a/build_files/build_environment/cmake/numpy.cmake +++ b/build_files/build_environment/cmake/numpy.cmake @@ -47,4 +47,5 @@ ExternalProject_Add(external_numpy add_dependencies( external_numpy external_python + external_python_site_packages ) diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index dfb2437d3cb..5731a0e0ae8 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -43,7 +43,7 @@ if(WIN32) PREFIX ${BUILD_DIR}/python CONFIGURE_COMMAND "" BUILD_COMMAND cd ${BUILD_DIR}/python/src/external_python/pcbuild/ && set IncludeTkinter=false && call build.bat -e -p x64 -c ${BUILD_MODE} - INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py -b ${PYTHON_SRC}/PCbuild/amd64 -s ${PYTHON_SRC} -t ${PYTHON_SRC}/tmp/ --include-underpth --include-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python + INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py -b ${PYTHON_SRC}/PCbuild/amd64 -s ${PYTHON_SRC} -t ${PYTHON_SRC}/tmp/ --include-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python ) else() @@ -74,7 +74,6 @@ else() endif() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV} && ${PYTHON_FUNC_CONFIGS}) set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python.exe) - set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_macos.diff) else() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV}) set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python) diff --git a/build_files/build_environment/cmake/python_site_packages.cmake b/build_files/build_environment/cmake/python_site_packages.cmake index d17f65a152b..58d95326ee9 100644 --- a/build_files/build_environment/cmake/python_site_packages.cmake +++ b/build_files/build_environment/cmake/python_site_packages.cmake @@ -21,7 +21,7 @@ ExternalProject_Add(external_python_site_packages CONFIGURE_COMMAND "" BUILD_COMMAND "" PREFIX ${BUILD_DIR}/site_packages - INSTALL_COMMAND ${PYTHON_BINARY} -m pip install idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: + INSTALL_COMMAND ${PYTHON_BINARY} -m pip install cython==${CYTHON_VERSION} idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: ) add_dependencies( diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 98558721cb3..76417b59bb3 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -138,11 +138,11 @@ set(OSL_VERSION 1.10.10) set(OSL_URI https://github.com/imageworks/OpenShadingLanguage/archive/Release-${OSL_VERSION}.tar.gz) set(OSL_HASH 00dec08a93c8084e53848b9ad047889f) -set(PYTHON_VERSION 3.7.7) -set(PYTHON_SHORT_VERSION 3.7) -set(PYTHON_SHORT_VERSION_NO_DOTS 37) +set(PYTHON_VERSION 3.9.1) +set(PYTHON_SHORT_VERSION 3.9) +set(PYTHON_SHORT_VERSION_NO_DOTS 39) set(PYTHON_URI https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz) -set(PYTHON_HASH 172c650156f7bea68ce31b2fd01fa766) +set(PYTHON_HASH 61981498e75ac8f00adcb908281fadb6) set(TBB_VERSION 2019_U9) set(TBB_URI https://github.com/oneapi-src/oneTBB/archive/${TBB_VERSION}.tar.gz) @@ -156,16 +156,17 @@ set(NANOVDB_GIT_UID e62f7a0bf1e27397223c61ddeaaf57edf111b77f) set(NANOVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/${NANOVDB_GIT_UID}.tar.gz) set(NANOVDB_HASH 90919510bc6ccd630fedc56f748cb199) -set(IDNA_VERSION 2.9) -set(CHARDET_VERSION 3.0.4) -set(URLLIB3_VERSION 1.25.9) -set(CERTIFI_VERSION 2020.4.5.2) -set(REQUESTS_VERSION 2.23.0) +set(IDNA_VERSION 2.10) +set(CHARDET_VERSION 4.0.0) +set(URLLIB3_VERSION 1.26.3) +set(CERTIFI_VERSION 2020.12.5) +set(REQUESTS_VERSION 2.25.1) +set(CYTHON_VERSION 0.29.21) -set(NUMPY_VERSION 1.17.5) -set(NUMPY_SHORT_VERSION 1.17) +set(NUMPY_VERSION 1.19.5) +set(NUMPY_SHORT_VERSION 1.19) set(NUMPY_URI https://github.com/numpy/numpy/releases/download/v${NUMPY_VERSION}/numpy-${NUMPY_VERSION}.zip) -set(NUMPY_HASH 763a5646fa6eef7a22f4895bca0524f2) +set(NUMPY_HASH f6a1b48717c552bbc18f1adc3cc1fe0e) set(LAME_VERSION 3.100) set(LAME_URI http://downloads.sourceforge.net/project/lame/lame/3.100/lame-${LAME_VERSION}.tar.gz) diff --git a/build_files/build_environment/patches/python_linux.diff b/build_files/build_environment/patches/python_linux.diff index 24d625c7ceb..a9baae8ce32 100644 --- a/build_files/build_environment/patches/python_linux.diff +++ b/build_files/build_environment/patches/python_linux.diff @@ -2,23 +2,23 @@ diff --git a/setup.py.orig b/setup.py index a97a755..07ce853 100644 --- a/setup.py.orig +++ b/setup.py -@@ -1422,13 +1422,13 @@ class PyBuildExt(build_ext): +@@ -1603,13 +1603,13 @@ version = line.split()[2] break if version >= version_req: -- if (self.compiler.find_library_file(lib_dirs, 'z')): -+ if (self.compiler.find_library_file(lib_dirs, 'z_pic')): - if host_platform == "darwin": +- if (self.compiler.find_library_file(self.lib_dirs, 'z')): ++ if (self.compiler.find_library_file(self.lib_dirs, 'z_pic')): + if MACOS: zlib_extra_link_args = ('-Wl,-search_paths_first',) else: zlib_extra_link_args = () - exts.append( Extension('zlib', ['zlibmodule.c'], -- libraries = ['z'], -+ libraries = ['z_pic'], - extra_link_args = zlib_extra_link_args)) + self.add(Extension('zlib', ['zlibmodule.c'], +- libraries=['z'], ++ libraries=['z_pic'], + extra_link_args=zlib_extra_link_args)) have_zlib = True else: -@@ -1442,7 +1442,7 @@ class PyBuildExt(build_ext): +@@ -1623,7 +1623,7 @@ # crc32 if we have it. Otherwise binascii uses its own. if have_zlib: extra_compile_args = ['-DUSE_ZLIB_CRC32'] @@ -27,12 +27,12 @@ index a97a755..07ce853 100644 extra_link_args = zlib_extra_link_args else: extra_compile_args = [] -@@ -1991,7 +1991,7 @@ class PyBuildExt(build_ext): +@@ -2168,7 +2168,7 @@ + ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc: - for lib_name in ('ffi', 'ffi_pic'): + for lib_name in ('ffi_pic', ): - if (self.compiler.find_library_file(lib_dirs, lib_name)): + if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break diff --git a/build_files/build_environment/patches/python_macos.diff b/build_files/build_environment/patches/python_macos.diff deleted file mode 100644 index 22ccbebee2f..00000000000 --- a/build_files/build_environment/patches/python_macos.diff +++ /dev/null @@ -1,289 +0,0 @@ -diff -ru a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst ---- a/Doc/library/ctypes.rst 2020-03-10 07:11:12.000000000 +0100 -+++ b/Doc/library/ctypes.rst 2020-07-14 08:10:10.000000000 +0200 -@@ -1551,6 +1551,13 @@ - value usable as argument (integer, string, ctypes instance). This allows - defining adapters that can adapt custom objects as function parameters. - -+ .. attribute:: variadic -+ -+ Assign a boolean to specify that the function takes a variable number of -+ arguments. This does not matter on most platforms, but for Apple arm64 -+ platforms variadic functions have a different calling convention than -+ normal functions. -+ - .. attribute:: errcheck - - Assign a Python function or another callable to this attribute. The -diff -ru a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c ---- a/Modules/_ctypes/_ctypes.c 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/_ctypes.c 2020-07-14 08:14:41.000000000 +0200 -@@ -3175,6 +3175,35 @@ - } - - static int -+PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) -+{ -+ StgDictObject *dict = PyObject_stgdict((PyObject *)self); -+ assert(dict); -+ int r = PyObject_IsTrue(ob); -+ if (r == 1) { -+ dict->flags |= FUNCFLAG_VARIADIC; -+ return 0; -+ } else if (r == 0) { -+ dict->flags &= ~FUNCFLAG_VARIADIC; -+ return 0; -+ } else { -+ return -1; -+ } -+} -+ -+static PyObject * -+PyCFuncPtr_get_variadic(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) -+{ -+ StgDictObject *dict = PyObject_stgdict((PyObject *)self); -+ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ -+ if (dict->flags & FUNCFLAG_VARIADIC) -+ Py_RETURN_TRUE; -+ else -+ Py_RETURN_FALSE; -+} -+ -+ -+static int - PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) - { - PyObject *converters; -@@ -5632,6 +5661,7 @@ - PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); - PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); - PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); -+ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); - PyModule_AddStringConstant(m, "__version__", "1.1.0"); - - PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); -diff -ru a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c ---- a/Modules/_ctypes/callproc.c 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/callproc.c 2020-07-14 08:18:33.000000000 +0200 -@@ -767,7 +767,8 @@ - ffi_type **atypes, - ffi_type *restype, - void *resmem, -- int argcount) -+ int argcount, -+ int argtypecount) - { - PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ - PyObject *error_object = NULL; -@@ -793,15 +794,38 @@ - if ((flags & FUNCFLAG_CDECL) == 0) - cc = FFI_STDCALL; - #endif -- if (FFI_OK != ffi_prep_cif(&cif, -- cc, -- argcount, -- restype, -- atypes)) { -- PyErr_SetString(PyExc_RuntimeError, -- "ffi_prep_cif failed"); -- return -1; -- } -+#if HAVE_FFI_PREP_CIF_VAR -+ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but -+ * lots of existing code will not. If there's at least one arg and more -+ * args are passed than are defined in the prototype, then it must be a -+ * variadic function. */ -+ if ((flags & FUNCFLAG_VARIADIC) || -+ (argtypecount != 0 && argcount > argtypecount)) -+ { -+ if (FFI_OK != ffi_prep_cif_var(&cif, -+ cc, -+ argtypecount, -+ argcount, -+ restype, -+ atypes)) { -+ PyErr_SetString(PyExc_RuntimeError, -+ "ffi_prep_cif_var failed"); -+ return -1; -+ } -+ } else { -+#endif -+ if (FFI_OK != ffi_prep_cif(&cif, -+ cc, -+ argcount, -+ restype, -+ atypes)) { -+ PyErr_SetString(PyExc_RuntimeError, -+ "ffi_prep_cif failed"); -+ return -1; -+ } -+#if HAVE_FFI_PREP_CIF_VAR -+ } -+#endif - - if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { - error_object = _ctypes_get_errobj(&space); -@@ -1185,9 +1209,8 @@ - - if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, - rtype, resbuf, -- Py_SAFE_DOWNCAST(argcount, -- Py_ssize_t, -- int))) -+ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), -+ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) - goto cleanup; - - #ifdef WORDS_BIGENDIAN -diff -ru a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h ---- a/Modules/_ctypes/ctypes.h 2020-03-10 07:11:12.000000000 +0100 -+++ b/Modules/_ctypes/ctypes.h 2020-07-14 08:30:53.000000000 +0200 -@@ -285,6 +285,7 @@ - #define FUNCFLAG_PYTHONAPI 0x4 - #define FUNCFLAG_USE_ERRNO 0x8 - #define FUNCFLAG_USE_LASTERROR 0x10 -+#define FUNCFLAG_VARIADIC 0x20 - - #define TYPEFLAG_ISPOINTER 0x100 - #define TYPEFLAG_HASPOINTER 0x200 -diff -ru a/configure b/configure ---- a/configure 2020-03-10 07:11:12.000000000 +0100 -+++ b/configure 2020-07-14 08:03:27.000000000 +0200 -@@ -3374,7 +3374,7 @@ - # has no effect, don't bother defining them - Darwin/[6789].*) - define_xopen_source=no;; -- Darwin/1[0-9].*) -+ Darwin/[12][0-9].*) - define_xopen_source=no;; - # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but - # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined -@@ -9251,6 +9251,9 @@ - ppc) - MACOSX_DEFAULT_ARCH="ppc64" - ;; -+ arm64) -+ MACOSX_DEFAULT_ARCH="arm64" -+ ;; - *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 - ;; -diff -ru a/configure.ac b/configure.ac ---- a/configure.ac 2020-03-10 07:11:12.000000000 +0100 -+++ b/configure.ac 2020-07-14 08:03:27.000000000 +0200 -@@ -2456,6 +2456,9 @@ - ppc) - MACOSX_DEFAULT_ARCH="ppc64" - ;; -+ arm64) -+ MACOSX_DEFAULT_ARCH="arm64" -+ ;; - *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) - ;; -diff -ru a/setup.py b/setup.py ---- a/setup.py 2020-03-10 07:11:12.000000000 +0100 -+++ b/setup.py 2020-07-14 08:28:12.000000000 +0200 -@@ -141,6 +141,13 @@ - os.unlink(tmpfile) - - return MACOS_SDK_ROOT -+ -+def is_macosx_at_least(vers): -+ if host_platform == 'darwin': -+ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') -+ if dep_target: -+ return tuple(map(int, dep_target.split('.'))) >= vers -+ return False - - def is_macosx_sdk_path(path): - """ -@@ -150,6 +157,13 @@ - or path.startswith('/System/') - or path.startswith('/Library/') ) - -+def grep_headers_for(function, headers): -+ for header in headers: -+ with open(header, 'r') as f: -+ if function in f.read(): -+ return True -+ return False -+ - def find_file(filename, std_dirs, paths): - """Searches for the directory where a given file is located, - and returns a possibly-empty list of additional directories, or None -@@ -1972,7 +1986,11 @@ - return True - - def detect_ctypes(self, inc_dirs, lib_dirs): -- self.use_system_libffi = False -+ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): -+ self.use_system_libffi = True -+ else: -+ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") -+ - include_dirs = [] - extra_compile_args = [] - extra_link_args = [] -@@ -2016,32 +2034,48 @@ - ext_test = Extension('_ctypes_test', - sources=['_ctypes/_ctypes_test.c'], - libraries=['m']) -+ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") -+ ffi_lib = None -+ - self.extensions.extend([ext, ext_test]) - - if host_platform == 'darwin': -- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): -+ if not self.use_system_libffi: - return -- # OS X 10.5 comes with libffi.dylib; the include files are -- # in /usr/include/ffi -- inc_dirs.append('/usr/include/ffi') -- -- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] -- if not ffi_inc or ffi_inc[0] == '': -- ffi_inc = find_file('ffi.h', [], inc_dirs) -- if ffi_inc is not None: -- ffi_h = ffi_inc[0] + '/ffi.h' -+ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") -+ if os.path.exists(ffi_in_sdk): -+ ffi_inc = ffi_in_sdk -+ ffi_lib = 'ffi' -+ else: -+ # OS X 10.5 comes with libffi.dylib; the include files are -+ # in /usr/include/ffi -+ ffi_inc_dirs.append('/usr/include/ffi') -+ -+ if not ffi_inc: -+ found = find_file('ffi.h', [], ffi_inc_dirs) -+ if found: -+ ffi_inc = found[0] -+ if ffi_inc: -+ ffi_h = ffi_inc + '/ffi.h' - if not os.path.exists(ffi_h): - ffi_inc = None - print('Header file {} does not exist'.format(ffi_h)) -- ffi_lib = None -- if ffi_inc is not None: -+ if ffi_lib is None and ffi_inc: - for lib_name in ('ffi', 'ffi_pic'): - if (self.compiler.find_library_file(lib_dirs, lib_name)): - ffi_lib = lib_name - break - - if ffi_inc and ffi_lib: -- ext.include_dirs.extend(ffi_inc) -+ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) -+ if grep_headers_for('ffi_closure_alloc', ffi_headers): -+ try: -+ sources.remove('_ctypes/malloc_closure.c') -+ except ValueError: -+ pass -+ if grep_headers_for('ffi_prep_cif_var', ffi_headers): -+ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") -+ ext.include_dirs.append(ffi_inc) - ext.libraries.append(ffi_lib) - self.use_system_libffi = True - From 8fcf3e96fedc3641d44e8b3e230149f935f901f0 Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Tue, 26 Jan 2021 18:12:38 +0100 Subject: [PATCH 055/519] Fix T85079: Thumb brush unstable when producing larger displacements The thumb brush was updating the area normal per brush sample, which was making unstable sampled normals for setting the displacement direction when the vertices are moved too much from their original positions. Now it always uses the original normal except when using anchored strokes. In those cases, the normal always needs to be updated. Reviewed By: JacquesLucke Maniphest Tasks: T85079 Differential Revision: https://developer.blender.org/D10214 --- source/blender/editors/sculpt_paint/sculpt.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 410b83217b4..cb5d708908b 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -2721,11 +2721,11 @@ static void update_sculpt_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int t const Brush *brush = BKE_paint_brush(&sd->paint); StrokeCache *cache = ob->sculpt->cache; /* Grab brush does not update the sculpt normal during a stroke. */ - const bool update_normal = !(brush->flag & BRUSH_ORIGINAL_NORMAL) && - !(brush->sculpt_tool == SCULPT_TOOL_GRAB) && - !(brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) && - !(brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK && - cache->normal_weight > 0.0f); + const bool update_normal = + !(brush->flag & BRUSH_ORIGINAL_NORMAL) && !(brush->sculpt_tool == SCULPT_TOOL_GRAB) && + !(brush->sculpt_tool == SCULPT_TOOL_THUMB && !(brush->flag & BRUSH_ANCHORED)) && + !(brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) && + !(brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK && cache->normal_weight > 0.0f); if (cache->mirror_symmetry_pass == 0 && cache->radial_symmetry_pass == 0 && (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(cache) || update_normal)) { From 2a670a34be01e5d8da54fedfbf85f4c89e259adc Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Tue, 26 Jan 2021 19:41:17 +0100 Subject: [PATCH 056/519] Fix T83047: Texture paint symmetry options not in topbar The texture paint mode was accidentally removed from the list Reviewed By: JacquesLucke Maniphest Tasks: T83047 Differential Revision: https://developer.blender.org/D10216 --- release/scripts/startup/bl_ui/space_view3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 3ed50a8c0a3..b9a57674a6e 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -158,7 +158,7 @@ class VIEW3D_HT_tool_header(Header): elif mode_string == 'POSE': _row, sub = row_for_mirror() sub.prop(context.object.pose, "use_mirror_x", text="X", toggle=True) - elif mode_string in {'EDIT_MESH', 'PAINT_WEIGHT', 'SCULPT', 'PAINT_VERTEX'}: + elif mode_string in {'EDIT_MESH', 'PAINT_WEIGHT', 'SCULPT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}: # Mesh Modes, Use Mesh Symmetry row, sub = row_for_mirror() sub.prop(context.object.data, "use_mirror_x", text="X", toggle=True) From 1c4ae8a11c820e33da725816d7cccb2668680e51 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Tue, 9 Feb 2021 16:14:31 -0800 Subject: [PATCH 057/519] UI: Removal of GHOST_CreateDialogWindow Simplification of window creation code to allow greater flexibility. Differential Revision: https://developer.blender.org/D10311 Reviewed by Brecht Van Lommel --- intern/ghost/GHOST_C-api.h | 17 ++---- intern/ghost/intern/GHOST_C-api.cpp | 21 +------ intern/ghost/intern/GHOST_WindowX11.cpp | 61 ++++--------------- intern/ghost/test/gears/GHOST_C-Test.c | 4 ++ intern/ghost/test/multitest/MultiTest.c | 6 ++ .../windowmanager/intern/wm_playanim.c | 2 + .../blender/windowmanager/intern/wm_window.c | 43 ++++--------- 7 files changed, 44 insertions(+), 110 deletions(-) diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 2bc73f7eb22..d79111b742f 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -25,6 +25,8 @@ #include "GHOST_Types.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -160,6 +162,7 @@ extern void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, * The new window is added to the list of windows managed. * Never explicitly delete the window, use disposeWindow() instead. * \param systemhandle: The handle to the system. + * \param parentWindow: Handle of parent (or owner) window, or NULL * \param title: The name of the window. * (displayed in the title bar of the window if the OS supports it). * \param left: The coordinate of the left edge of the window. @@ -167,31 +170,23 @@ extern void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, * \param width: The width the window. * \param height: The height the window. * \param state: The state of the window when opened. + * \param is_dialog: Stay on top of parent window, no icon in taskbar, can't be minimized. * \param type: The type of drawing context installed in this window. * \param glSettings: Misc OpenGL options. * \return A handle to the new window ( == NULL if creation failed). */ extern GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, + GHOST_WindowHandle parent_windowhandle, const char *title, GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, GHOST_TWindowState state, + bool is_dialog, GHOST_TDrawingContextType type, GHOST_GLSettings glSettings); -extern GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle parent_windowhandle, - const char *title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - GHOST_GLSettings glSettings); - /** * Create a new offscreen context. * Never explicitly delete the context, use disposeContext() instead. diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index e4bb908fec8..af65e1cd4d2 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -153,34 +153,19 @@ GHOST_TSuccess GHOST_DisposeOpenGLContext(GHOST_SystemHandle systemhandle, } GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, + GHOST_WindowHandle parent_windowhandle, const char *title, GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, GHOST_TWindowState state, + bool is_dialog, GHOST_TDrawingContextType type, GHOST_GLSettings glSettings) { GHOST_ISystem *system = (GHOST_ISystem *)systemhandle; - return (GHOST_WindowHandle)system->createWindow( - title, left, top, width, height, state, type, glSettings, false, false); -} - -GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle parent_windowhandle, - const char *title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - GHOST_GLSettings glSettings) -{ - GHOST_ISystem *system = (GHOST_ISystem *)systemhandle; - return (GHOST_WindowHandle)system->createWindow(title, left, top, @@ -190,7 +175,7 @@ GHOST_WindowHandle GHOST_CreateDialogWindow(GHOST_SystemHandle systemhandle, type, glSettings, false, - true, + is_dialog, (GHOST_IWindow *)parent_windowhandle); } diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 86a7246a284..fc006c62803 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -293,55 +293,18 @@ GHOST_WindowX11::GHOST_WindowX11(GHOST_SystemX11 *system, m_display, RootWindow(m_display, m_visualInfo->screen), m_visualInfo->visual, AllocNone); /* create the window! */ - if ((parentWindow == 0) || is_dialog) { - m_window = XCreateWindow(m_display, - RootWindow(m_display, m_visualInfo->screen), - left, - top, - width, - height, - 0, /* no border. */ - m_visualInfo->depth, - InputOutput, - m_visualInfo->visual, - xattributes_valuemask, - &xattributes); - } - else { - Window root_return; - int x_return, y_return; - unsigned int w_return, h_return, border_w_return, depth_return; - - XGetGeometry(m_display, - parentWindow->m_window, - &root_return, - &x_return, - &y_return, - &w_return, - &h_return, - &border_w_return, - &depth_return); - - left = 0; - top = 0; - width = w_return; - height = h_return; - - m_window = XCreateWindow(m_display, - parentWindow->m_window, /* reparent against embedder */ - left, - top, - width, - height, - 0, /* no border. */ - m_visualInfo->depth, - InputOutput, - m_visualInfo->visual, - xattributes_valuemask, - &xattributes); - - XSelectInput(m_display, parentWindow->m_window, SubstructureNotifyMask); - } + m_window = XCreateWindow(m_display, + RootWindow(m_display, m_visualInfo->screen), + left, + top, + width, + height, + 0, /* no border. */ + m_visualInfo->depth, + InputOutput, + m_visualInfo->visual, + xattributes_valuemask, + &xattributes); #ifdef WITH_XDND /* initialize drop target for newly created window */ diff --git a/intern/ghost/test/gears/GHOST_C-Test.c b/intern/ghost/test/gears/GHOST_C-Test.c index 3419f70dfcf..4283f990cfb 100644 --- a/intern/ghost/test/gears/GHOST_C-Test.c +++ b/intern/ghost/test/gears/GHOST_C-Test.c @@ -440,12 +440,14 @@ int main(int argc, char **argv) if (shSystem) { /* Create the main window */ sMainWindow = GHOST_CreateWindow(shSystem, + NULL, title1, 10, 64, 320, 200, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); if (!sMainWindow) { @@ -455,12 +457,14 @@ int main(int argc, char **argv) /* Create a secondary window */ sSecondaryWindow = GHOST_CreateWindow(shSystem, + NULL, title2, 340, 64, 320, 200, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); if (!sSecondaryWindow) { diff --git a/intern/ghost/test/multitest/MultiTest.c b/intern/ghost/test/multitest/MultiTest.c index b6b83f2a47d..8c8858fc6d8 100644 --- a/intern/ghost/test/multitest/MultiTest.c +++ b/intern/ghost/test/multitest/MultiTest.c @@ -318,12 +318,14 @@ MainWindow *mainwindow_new(MultiTestApp *app) GHOST_GLSettings glSettings = {0}; win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Main", 40, 40, 400, 400, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); @@ -573,12 +575,14 @@ LoggerWindow *loggerwindow_new(MultiTestApp *app) GHOST_GetMainDisplayDimensions(sys, &screensize[0], &screensize[1]); win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Logger", 40, screensize[1] - 432, 800, 300, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); @@ -773,12 +777,14 @@ ExtraWindow *extrawindow_new(MultiTestApp *app) GHOST_WindowHandle win; win = GHOST_CreateWindow(sys, + NULL, "MultiTest:Extra", 500, 40, 400, 400, GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glSettings); diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c index 60bcb687dbf..1b1ebc70fd9 100644 --- a/source/blender/windowmanager/intern/wm_playanim.c +++ b/source/blender/windowmanager/intern/wm_playanim.c @@ -1097,6 +1097,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size posy = (scr_h - posy - sizey); g_WS.ghost_window = GHOST_CreateWindow(g_WS.ghost_system, + NULL, title, posx, posy, @@ -1104,6 +1105,7 @@ static void playanim_window_open(const char *title, int posx, int posy, int size sizey, /* could optionally start fullscreen */ GHOST_kWindowStateNormal, + false, GHOST_kDrawingContextTypeOpenGL, glsettings); } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index c4b50f1c889..6433cd7d12d 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -560,14 +560,6 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, wmWindow *win, bool is_dialog) { - /* On Windows, if there is a parent window then force is_dialog. Otherwise the parent - handle is not used in window creation and they do not stay on top of parents. */ -#ifdef WIN32 - if (win->parent) { - is_dialog = true; - } -#endif - /* a new window is created when pageflip mode is required for a window */ GHOST_GLSettings glSettings = {0}; if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) { @@ -586,30 +578,17 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, wmWindow *prev_windrawable = wm->windrawable; wm_window_clear_drawable(wm); - GHOST_WindowHandle ghostwin; - if (is_dialog && win->parent) { - ghostwin = GHOST_CreateDialogWindow(g_system, - win->parent->ghostwin, - title, - win->posx, - posy, - win->sizex, - win->sizey, - (GHOST_TWindowState)win->windowstate, - GHOST_kDrawingContextTypeOpenGL, - glSettings); - } - else { - ghostwin = GHOST_CreateWindow(g_system, - title, - win->posx, - posy, - win->sizex, - win->sizey, - (GHOST_TWindowState)win->windowstate, - GHOST_kDrawingContextTypeOpenGL, - glSettings); - } + GHOST_WindowHandle ghostwin = GHOST_CreateWindow(g_system, + (win->parent) ? win->parent->ghostwin : NULL, + title, + win->posx, + posy, + win->sizex, + win->sizey, + (GHOST_TWindowState)win->windowstate, + is_dialog, + GHOST_kDrawingContextTypeOpenGL, + glSettings); if (ghostwin) { win->gpuctx = GPU_context_create(ghostwin); From f617782fc101c844959c799ad584a37f3b6e523a Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Wed, 10 Feb 2021 01:16:33 +0100 Subject: [PATCH 058/519] Fix Sculpt Gestures using normal orientation with translated objects This fixes two issues that were preveting normal orientation for working: - The translation of component of the object matrix should not be considered when converting a normal to world space. - Whe using cursor for depth, the depth for the shape should be taken directly from the cursor (which is already unprojected and updated) instead of from the brush, which may have not been updated. Reviewed By: dbystedt, JacquesLucke Differential Revision: https://developer.blender.org/D10231 --- .../blender/editors/sculpt_paint/paint_mask.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index 17d13041f28..bacb3b549e3 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -1016,12 +1016,15 @@ static void sculpt_gesture_trim_shape_origin_normal_get(SculptGestureContext *sg break; case SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE: mul_v3_m4v3(r_origin, sgcontext->vc.obact->obmat, sgcontext->ss->gesture_initial_location); - mul_v3_m4v3(r_normal, sgcontext->vc.obact->obmat, sgcontext->ss->gesture_initial_normal); + /* Transforming the normal does not take non uniform scaling into account. Sculpt mode is not + * expected to work on object with non uniform scaling. */ + copy_v3_v3(r_normal, sgcontext->ss->gesture_initial_normal); + mul_mat3_m4_v3(sgcontext->vc.obact->obmat, r_normal); break; } } -static void sculpt_gesture_trim_calculate_depth(bContext *C, SculptGestureContext *sgcontext) +static void sculpt_gesture_trim_calculate_depth(SculptGestureContext *sgcontext) { SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; @@ -1070,13 +1073,11 @@ static void sculpt_gesture_trim_calculate_depth(bContext *C, SculptGestureContex mid_point_depth = ss->gesture_initial_hit ? 0.0f : (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; + + } - Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Brush *brush = BKE_paint_brush(&sd->paint); - Scene *scene = CTX_data_scene(C); - const float depth_radius = BKE_brush_unprojected_radius_get(scene, brush); - + const float depth_radius = ss->cursor_radius; trim_operation->depth_front = mid_point_depth - depth_radius; trim_operation->depth_back = mid_point_depth + depth_radius; } @@ -1312,7 +1313,7 @@ static void sculpt_gesture_apply_trim(SculptGestureContext *sgcontext) static void sculpt_gesture_trim_begin(bContext *C, SculptGestureContext *sgcontext) { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - sculpt_gesture_trim_calculate_depth(C, sgcontext); + sculpt_gesture_trim_calculate_depth(sgcontext); sculpt_gesture_trim_geometry_generate(sgcontext); BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, true, false, false); SCULPT_undo_push_node(sgcontext->vc.obact, NULL, SCULPT_UNDO_GEOMETRY); From d72595a5943e8c81bb8c901d3ec8cc52b553da22 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 9 Feb 2021 20:26:58 -0600 Subject: [PATCH 059/519] Cleanup: Remove unecessary padding from small DNA structs After {rBa0867f05a48e2017a}, it is no longer necessary to pad structs with 1 and 2 byte sizes. Most of these are geometry node structs, where we've been avoiding using `node.custom1`. I only found two others, the freestyle flags in custom data DNA. Differential Revision: https://developer.blender.org/D10335 --- source/blender/makesdna/DNA_meshdata_types.h | 2 -- source/blender/makesdna/DNA_node_types.h | 25 -------------------- 2 files changed, 27 deletions(-) diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 780115a31be..f9af7a011e0 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -414,7 +414,6 @@ typedef struct OrigSpaceLoop { typedef struct FreestyleEdge { char flag; - char _pad[3]; } FreestyleEdge; /** #FreestyleEdge.flag */ @@ -424,7 +423,6 @@ enum { typedef struct FreestyleFace { char flag; - char _pad[3]; } FreestyleFace; /** #FreestyleFace.flag */ diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 61b0b469426..c5d2384b1aa 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -551,7 +551,6 @@ typedef struct bNodeSocketValueFloat { typedef struct bNodeSocketValueBoolean { char value; - char _pad[3]; } bNodeSocketValueBoolean; typedef struct bNodeSocketValueVector { @@ -831,7 +830,6 @@ typedef struct NodeColorspill { typedef struct NodeDilateErode { char falloff; - char _pad[7]; } NodeDilateErode; typedef struct NodeMask { @@ -840,7 +838,6 @@ typedef struct NodeMask { typedef struct NodeSetAlpha { char mode; - char _pad[7]; } NodeSetAlpha; typedef struct NodeTexBase { @@ -997,7 +994,6 @@ typedef struct NodeTrackPosData { typedef struct NodeTranslateData { char wrap_axis; char relative; - char _pad[6]; } NodeTranslateData; typedef struct NodePlaneTrackDeformData { @@ -1076,7 +1072,6 @@ typedef struct NodeCryptomatte { typedef struct NodeDenoise { char hdr; - char _pad[7]; } NodeDenoise; typedef struct NodeAttributeCompare { @@ -1098,8 +1093,6 @@ typedef struct NodeAttributeMath { uint8_t input_type_a; uint8_t input_type_b; uint8_t input_type_c; - - char _pad[4]; } NodeAttributeMath; typedef struct NodeAttributeMix { @@ -1120,8 +1113,6 @@ typedef struct NodeAttributeVectorMath { uint8_t input_type_a; uint8_t input_type_b; uint8_t input_type_c; - - char _pad[4]; } NodeAttributeVectorMath; typedef struct NodeAttributeColorRamp { @@ -1159,22 +1150,16 @@ typedef struct NodeGeometryAlignRotationToVector { typedef struct NodeGeometryPointScale { /* GeometryNodeAttributeInputMode */ uint8_t input_type; - - char _pad[7]; } NodeGeometryPointScale; typedef struct NodeGeometryPointTranslate { /* GeometryNodeAttributeInputMode */ uint8_t input_type; - - char _pad[7]; } NodeGeometryPointTranslate; typedef struct NodeGeometryObjectInfo { /* GeometryNodeTransformSpace. */ uint8_t transform_space; - - char _pad[7]; } NodeGeometryObjectInfo; typedef struct NodeGeometryPointInstance { @@ -1182,8 +1167,6 @@ typedef struct NodeGeometryPointInstance { uint8_t instance_type; /* GeometryNodePointInstanceFlag. */ uint8_t flag; - - char _pad[6]; } NodeGeometryPointInstance; typedef struct NodeGeometryPointsToVolume { @@ -1191,29 +1174,21 @@ typedef struct NodeGeometryPointsToVolume { uint8_t resolution_mode; /* GeometryNodeAttributeInputMode */ uint8_t input_type_radius; - - char _pad[6]; } NodeGeometryPointsToVolume; typedef struct NodeGeometryCollectionInfo { /* GeometryNodeTransformSpace. */ uint8_t transform_space; - - char _pad[7]; } NodeGeometryCollectionInfo; typedef struct NodeGeometryAttributeProximity { /* GeometryNodeAttributeProximityTargetGeometryElement. */ uint8_t target_geometry_element; - - char _pad[7]; } NodeGeometryAttributeProximity; typedef struct NodeGeometryVolumeToMesh { /* VolumeToMeshResolutionMode */ uint8_t resolution_mode; - - char _pad[7]; } NodeGeometryVolumeToMesh; typedef struct NodeAttributeCombineXYZ { From 328a8c68b79daeb74542d3551a3957a4a89731d6 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 9 Feb 2021 22:55:59 -0600 Subject: [PATCH 060/519] Fix Geometry Nodes: Broken built-in attribute exists check Fixes an issue in a node setup with the point separate node, where muting a node that does nothing breaks the operation, resulting in the point separate not copying the position attrbute to either result. The fix is straightfoward, it looks just like a typo. Differential Revision: https://developer.blender.org/D10379 --- source/blender/blenkernel/intern/attribute_access.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index d6ceb9beb70..378fdfd27f2 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -731,7 +731,7 @@ class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { if (custom_data == nullptr) { return false; } - const void *data = CustomData_get_layer(custom_data, data_type_); + const void *data = CustomData_get_layer(custom_data, stored_type_); return data != nullptr; } }; From db9d40b9d36fcbc50900bb6e2e134eb8453c2643 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Feb 2021 17:42:31 +1100 Subject: [PATCH 061/519] CMake: set compiler-ccache & build-type-init variables as advanced These settings aren't useful for basic configuration. --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 81f28d3c77e..00674809095 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,9 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build_files/cmake/platform") # avoid having empty buildtype if(NOT DEFINED CMAKE_BUILD_TYPE_INIT) set(CMAKE_BUILD_TYPE_INIT "Release") + # Internal logic caches this variable, avoid showing it by default + # since it's easy to accidentally set instead of the build type. + mark_as_advanced(CMAKE_BUILD_TYPE_INIT) endif() # Omit superfluous "Up-to-date" messages. @@ -614,6 +617,7 @@ endif() if(UNIX) # See WITH_WINDOWS_SCCACHE for Windows. option(WITH_COMPILER_CCACHE "Use ccache to improve rebuild times (Works with Ninja, Makefiles and Xcode)" OFF) + mark_as_advanced(WITH_COMPILER_CCACHE) endif() # The following only works with the Ninja generator in CMake >= 3.0. From d76890bfb0bba78d7ad617c5ad8fb284cd9814d4 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 10 Feb 2021 12:48:17 +0100 Subject: [PATCH 062/519] Fix T85492: fix check if object has visible instances Without this, `OB_VISIBLE_INSTANCES` would be added to `visibility` incorrectly, leading to unexpected visibility changes down the line. --- source/blender/blenkernel/intern/object.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 155508e9caa..70af46569a8 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1957,7 +1957,8 @@ int BKE_object_visibility(const Object *ob, const int dag_eval_mode) visibility |= OB_VISIBLE_INSTANCES; } - if (ob->runtime.geometry_set_eval != NULL) { + if (ob->runtime.geometry_set_eval != NULL && + BKE_geometry_set_has_instances(ob->runtime.geometry_set_eval)) { visibility |= OB_VISIBLE_INSTANCES; } From 97cc130f472fa2e5e12ae07312abae2de7d409aa Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Wed, 10 Feb 2021 12:46:43 +0100 Subject: [PATCH 063/519] Fix T85395: Texture paint external edit wrong projection on reapply Caused by rB5b34d11b55e0. Above commit restored the view matrices in ED_view3d_draw_offscreen _before_ they can be stored in the ImBuff (see ED_view3d_draw_offscreen / texture_paint_image_from_view_exec). Now make restoring the view matrices optional and dont do this in case of reprojection, so the used matrices can still be saved in the ImBuff later. Reviewed By: campbellbarton Maniphest Tasks: T85395 Differential Revision: https://developer.blender.org/D10331 --- source/blender/editors/include/ED_view3d_offscreen.h | 2 ++ source/blender/editors/render/render_opengl.c | 1 + .../blender/editors/sculpt_paint/paint_image_proj.c | 1 + source/blender/editors/space_view3d/view3d_draw.c | 11 ++++++++++- source/blender/python/gpu/gpu_py_offscreen.c | 1 + source/blender/windowmanager/intern/wm_files.c | 1 + 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/include/ED_view3d_offscreen.h b/source/blender/editors/include/ED_view3d_offscreen.h index e854982c796..c490e96031f 100644 --- a/source/blender/editors/include/ED_view3d_offscreen.h +++ b/source/blender/editors/include/ED_view3d_offscreen.h @@ -54,6 +54,7 @@ void ED_view3d_draw_offscreen(struct Depsgraph *depsgraph, bool draw_background, const char *viewname, const bool do_color_management, + const bool restore_rv3d_mats, struct GPUOffScreen *ofs, struct GPUViewport *viewport); void ED_view3d_draw_offscreen_simple(struct Depsgraph *depsgraph, @@ -84,6 +85,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Depsgraph *depsgraph, eImBufFlags imbuf_flag, int alpha_mode, const char *viewname, + const bool restore_rv3d_mats, struct GPUOffScreen *ofs, char err_out[256]); struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(struct Depsgraph *depsgraph, diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 1069f942a7a..4cb6994bc4b 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -381,6 +381,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R imbuf_flags, alpha_mode, viewname, + true, oglrender->ofs, err_out); diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index 6e6386b24aa..5c15fd05116 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -6250,6 +6250,7 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op) IB_rect, R_ALPHAPREMUL, NULL, + false, NULL, err_out); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 8ae0e3b94fe..9982d44b6be 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1667,6 +1667,7 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, bool draw_background, const char *viewname, const bool do_color_management, + const bool restore_rv3d_mats, GPUOffScreen *ofs, GPUViewport *viewport) { @@ -1755,7 +1756,11 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, region->winy = orig.region_winy; region->winrct = orig.region_winrct; - ED_view3d_mats_rv3d_restore(region->regiondata, orig.rv3d_mats); + /* Optionally do _not_ restore rv3d matrices (e.g. they are used/stored in the ImBuff for + * reprojection, see texture_paint_image_from_view_exec(). */ + if (restore_rv3d_mats) { + ED_view3d_mats_rv3d_restore(region->regiondata, orig.rv3d_mats); + } MEM_freeN(orig.rv3d_mats); UI_Theme_Restore(&orig.theme_state); @@ -1847,6 +1852,7 @@ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph, draw_background, viewname, do_color_management, + true, ofs, viewport); } @@ -1867,6 +1873,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, eImBufFlags imbuf_flag, int alpha_mode, const char *viewname, + const bool restore_rv3d_mats, /* output vars */ GPUOffScreen *ofs, char err_out[256]) @@ -1974,6 +1981,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, draw_sky, viewname, do_color_management, + restore_rv3d_mats, ofs, NULL); @@ -2099,6 +2107,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, imbuf_flag, alpha_mode, viewname, + true, ofs, err_out); } diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 51038aae598..8d2df826722 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -268,6 +268,7 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, true, "", false, + true, self->ofs, NULL); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 7680a786634..42d17387d77 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1363,6 +1363,7 @@ static ImBuf *blend_file_thumb(const bContext *C, IB_rect, R_ALPHAPREMUL, NULL, + true, NULL, err_out); } From bdb83cc32cbd0997752420ef95c791f66dca54c8 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 10 Feb 2021 12:27:01 -0300 Subject: [PATCH 064/519] Fix T85471: Wrong orientation in transforming objects in weight paint mode The local orientation chosen was that of the active object, but as confirmed in other parts of the code, the orientation of the selected Bone has priority. --- source/blender/editors/transform/transform.h | 2 ++ .../editors/transform/transform_convert.c | 22 ++++++------------- .../editors/transform/transform_generics.c | 21 ++++++++++++++++++ .../transform/transform_orientations.c | 6 +++++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index be04feb17c8..02a7f41b384 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -776,6 +776,8 @@ void calculatePropRatio(TransInfo *t); void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot); +struct Object *transform_object_deform_pose_armature_get(TransInfo *t, struct Object *ob); + void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data); /* TODO. transform_query.c */ diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 4f581ad962d..848aa06238e 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -1103,21 +1103,13 @@ void createTransData(bContext *C, TransInfo *t) convert_type = TC_POSE; } else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { - /* Important that ob_armature can be set even when its not selected T23412. - * Lines below just check is also visible. */ - Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob); - if (ob_armature && ob_armature->mode & OB_MODE_POSE) { - Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature); - if (base_arm) { - View3D *v3d = t->view; - if (BASE_VISIBLE(v3d, base_arm)) { - Object *objects[1]; - objects[0] = ob_armature; - uint objects_len = 1; - initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len); - convert_type = TC_POSE; - } - } + Object *ob_armature = transform_object_deform_pose_armature_get(t, ob); + if (ob_armature) { + Object *objects[1]; + objects[0] = ob_armature; + uint objects_len = 1; + initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len); + convert_type = TC_POSE; } } else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) && diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 16fb9cc6eab..92719933afb 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -44,6 +44,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_mask.h" +#include "BKE_modifier.h" #include "BKE_paint.h" #include "ED_clip.h" @@ -1454,3 +1455,23 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) copy_v3_v3(td->ext->rot, eul); } } + +Object *transform_object_deform_pose_armature_get(TransInfo *t, Object *ob) +{ + if (!(ob->mode & OB_MODE_ALL_WEIGHT_PAINT)) { + return NULL; + } + /* Important that ob_armature can be set even when its not selected T23412. + * Lines below just check is also visible. */ + Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob); + if (ob_armature && ob_armature->mode & OB_MODE_POSE) { + Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature); + if (base_arm) { + View3D *v3d = t->view; + if (BASE_VISIBLE(v3d, base_arm)) { + return ob_armature; + } + } + } + return NULL; +} diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index 6d1bb9cc0de..1470d3b7059 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -609,6 +609,12 @@ short transform_orientation_matrix_get( orientation_index_custom = orientation - V3D_ORIENT_CUSTOM; orientation = V3D_ORIENT_CUSTOM; } + else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { + Object *ob_armature = transform_object_deform_pose_armature_get(t, ob); + if (ob_armature) { + ob = ob_armature; + } + } if ((t->spacetype == SPACE_VIEW3D) && t->region && (t->region->regiontype == RGN_TYPE_WINDOW)) { rv3d = t->region->regiondata; From 806b22d13093f7f90bc53849290db6b10a1cbe7e Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 10 Feb 2021 16:45:02 +0100 Subject: [PATCH 065/519] Cleanup: typo Committing this to the release branch, to avoid merge conflicts with an upcoming fix. --- source/blender/blenlib/intern/string_search.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc index d64587b85b4..22ba1b07e9c 100644 --- a/source/blender/blenlib/intern/string_search.cc +++ b/source/blender/blenlib/intern/string_search.cc @@ -250,7 +250,7 @@ static int get_shortest_word_index_that_startswith(StringRef query, Span word_is_usable) { int best_word_size = INT32_MAX; - int bset_word_index = -1; + int best_word_index = -1; for (const int i : words.index_range()) { if (!word_is_usable[i]) { continue; @@ -258,11 +258,11 @@ static int get_shortest_word_index_that_startswith(StringRef query, StringRef word = words[i]; if (word.startswith(query)) { if (word.size() < best_word_size) { - bset_word_index = i; + best_word_index = i; } } } - return bset_word_index; + return best_word_index; } static int get_word_index_that_fuzzy_matches(StringRef query, From 40a18612651873373ea267195ecc654e9fc344bb Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 10 Feb 2021 16:51:39 +0100 Subject: [PATCH 066/519] Fix T85514: exact match is not showing up in search menu The `get_shortest_word_index_that_startswith` function was not doing what it was supposed to do. This resulted in wrong matches. --- source/blender/blenlib/intern/string_search.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc index 22ba1b07e9c..a45909f92d8 100644 --- a/source/blender/blenlib/intern/string_search.cc +++ b/source/blender/blenlib/intern/string_search.cc @@ -259,6 +259,7 @@ static int get_shortest_word_index_that_startswith(StringRef query, if (word.startswith(query)) { if (word.size() < best_word_size) { best_word_index = i; + best_word_size = word.size(); } } } From f269fbd64a5a0cb7cab894284b37334888e72aaf Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 10 Feb 2021 17:10:24 +0100 Subject: [PATCH 067/519] LibOverride: Refactor: Switch more code to using Main.relations. This potentially could fix some missed cases in dependency tagging (when dealing with overrides hierarchies), since relying on tag in ID itself is not a good idea to check whether an ID has been propcessed or not (exterior code may have forced that tag on some IDs e.g., which would prevent them from ever being processed properly). --- .../blender/blenkernel/intern/lib_override.c | 99 ++++++++++++++++--- source/blender/makesdna/DNA_ID.h | 4 + 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 0f753018c46..63709080b5c 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -423,6 +423,8 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat Main *bmain = data->bmain; ID *id_owner = data->id_root; BLI_assert(ID_IS_LINKED(id_owner)); + const uint tag = data->tag; + const uint missing_tag = data->missing_tag; MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, id_owner); @@ -430,7 +432,6 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { /* This ID has already been processed. */ - printf("%s already processed\n", id_owner->name); return; } /* This way we won't process again that ID, should we encounter it again through another @@ -439,9 +440,10 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL; to_id_entry = to_id_entry->next) { - if ((to_id_entry->usage_flag & IDWALK_CB_LOOPBACK) != 0) { - /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers) as - * actual dependencies. */ + if ((to_id_entry->usage_flag & + (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) { + /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor + * override references or embedded ID pointers, as actual dependencies. */ continue; } @@ -460,10 +462,10 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat * Note: missing IDs (aka placeholders) are never overridden. */ if (ELEM(GS(to_id->name), ID_OB, ID_GR)) { if ((to_id->tag & LIB_TAG_MISSING)) { - to_id->tag |= data->missing_tag; + to_id->tag |= missing_tag; } else { - to_id->tag |= data->tag; + to_id->tag |= tag; } } @@ -570,23 +572,93 @@ static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) return IDWALK_RET_NOP; } +static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data) +{ + Main *bmain = data->bmain; + ID *id_owner = data->id_root; + BLI_assert(ID_IS_OVERRIDE_LIBRARY(id_owner)); + const uint tag = data->tag; + const uint missing_tag = data->missing_tag; + + MainIDRelationsEntry *entry = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id_owner); + BLI_assert(entry != NULL); + + if (entry->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) { + /* This ID has already been processed. */ + return; + } + /* This way we won't process again that ID, should we encounter it again through another + * relationship hierarchy. */ + entry->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; + + for (MainIDRelationsEntryItem *to_id_entry = entry->to_ids; to_id_entry != NULL; + to_id_entry = to_id_entry->next) { + if ((to_id_entry->usage_flag & + (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) != 0) { + /* Never consider 'loop back' relationships ('from', 'parents', 'owner' etc. pointers), nor + * override references or embedded ID pointers, as actual dependencies. */ + continue; + } + + ID *to_id = *to_id_entry->id_pointer.to; + if (ELEM(to_id, NULL, id_owner)) { + continue; + } + if (!ID_IS_OVERRIDE_LIBRARY(to_id) || ID_IS_LINKED(to_id)) { + continue; + } + + /* Do not tag 'virtual' overrides (shape keys here, as we already rejected embedded case + * above). */ + if (ID_IS_OVERRIDE_LIBRARY_REAL(to_id)) { + ID *reference_lib = NULL; + if (GS(id_owner->name) == ID_KE) { + reference_lib = ((Key *)id_owner)->from->override_library->reference->lib; + } + else { + reference_lib = id_owner->override_library->reference->lib; + } + if (to_id->override_library->reference->lib != reference_lib) { + /* We do not override data-blocks from other libraries, nor do we process them. */ + continue; + } + + if (to_id->override_library->reference->tag & LIB_TAG_MISSING) { + to_id->tag |= missing_tag; + } + else { + to_id->tag |= tag; + } + } + + /* Recursively process the dependencies. */ + LibOverrideGroupTagData sub_data = *data; + sub_data.id_root = to_id; + lib_override_local_group_tag_recursive(&sub_data); + } +} + /* This will tag all override IDs of an override group defined by the given `id_root`. */ static void lib_override_local_group_tag(LibOverrideGroupTagData *data) { - Main *bmain = data->bmain; ID *id_root = data->id_root; + BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root) && !ID_IS_LINKED(id_root)); - id_root->tag |= data->tag; + if ((id_root->override_library->reference->tag & LIB_TAG_MISSING)) { + id_root->tag |= data->missing_tag; + } + else { + id_root->tag |= data->tag; + } /* Tag all local overrides in id_root's group. */ - BKE_library_foreach_ID_link( - bmain, id_root, lib_override_local_group_tag_cb, data, IDWALK_READONLY | IDWALK_RECURSE); + lib_override_local_group_tag_recursive(data); } static bool lib_override_library_create_do(Main *bmain, ID *id_root) { BKE_main_relations_create(bmain, 0); - LibOverrideGroupTagData data = { .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; lib_override_linked_group_tag(&data); @@ -790,11 +862,11 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_ ID *id_root_reference = id_root->override_library->reference; BKE_main_relations_create(bmain, 0); - LibOverrideGroupTagData data = { .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; lib_override_local_group_tag(&data); + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); data.id_root = id_root_reference; lib_override_linked_group_tag(&data); @@ -999,10 +1071,13 @@ void BKE_lib_override_library_delete(Main *bmain, ID *id_root) BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root)); /* Tag all library overrides in the chains of dependencies from the given root one. */ + BKE_main_relations_create(bmain, 0); LibOverrideGroupTagData data = { .bmain = bmain, .id_root = id_root, .tag = LIB_TAG_DOIT, .missing_tag = LIB_TAG_MISSING}; lib_override_local_group_tag(&data); + BKE_main_relations_free(bmain); + ID *id; FOREACH_MAIN_ID_BEGIN (bmain, id) { if (id->tag & LIB_TAG_DOIT) { diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index d9c821d3ba7..00d0d4e3626 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -427,6 +427,10 @@ typedef struct PreviewImage { (ID_IS_LINKED(_id) && !ID_MISSING(_id) && (((const ID *)(_id))->tag & LIB_TAG_EXTERN) != 0 && \ (BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0) +/* NOTE: The three checks below do not take into account whether given ID is linked or not (when + * chaining overrides over several libraries). User must ensure the ID is not linked itself + * currently. */ +/* TODO: add `_EDITABLE` versions of those macros (that would check if ID is linked or not)? */ #define ID_IS_OVERRIDE_LIBRARY_REAL(_id) \ (((const ID *)(_id))->override_library != NULL && \ ((const ID *)(_id))->override_library->reference != NULL) From e03cfc23742826db5ca195f06ba41c73171f40f3 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 10 Feb 2021 17:29:52 +0100 Subject: [PATCH 068/519] Fix T85420: moving color ramp handles via position input does not work This just needed some special case handling for the new attribute color ramp node... --- source/blender/makesrna/intern/rna_color.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index 39aeeb430c2..ea019c70445 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -185,7 +185,11 @@ static char *rna_ColorRamp_path(PointerRNA *ptr) char *node_path; for (node = ntree->nodes.first; node; node = node->next) { - if (ELEM(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + if (ELEM(node->type, + SH_NODE_VALTORGB, + CMP_NODE_VALTORGB, + TEX_NODE_VALTORGB, + GEO_NODE_ATTRIBUTE_COLOR_RAMP)) { if (node->storage == ptr->data) { /* all node color ramp properties called 'color_ramp' * prepend path from ID to the node @@ -312,7 +316,11 @@ static void rna_ColorRamp_update(Main *bmain, Scene *UNUSED(scene), PointerRNA * bNode *node; for (node = ntree->nodes.first; node; node = node->next) { - if (ELEM(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + if (ELEM(node->type, + SH_NODE_VALTORGB, + CMP_NODE_VALTORGB, + TEX_NODE_VALTORGB, + GEO_NODE_ATTRIBUTE_COLOR_RAMP)) { ED_node_tag_update_nodetree(bmain, ntree, node); } } From 54cbfeedd7852b160696ca1571de5f28e4e88511 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 10 Feb 2021 17:48:49 +0100 Subject: [PATCH 069/519] Cleanup/fix warnings. Own dummy mistakes in rBf269fbd64a5a0cb7. --- .../blender/blenkernel/intern/lib_override.c | 58 +------------------ 1 file changed, 1 insertion(+), 57 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 63709080b5c..602c560cedd 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -516,62 +516,6 @@ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) } } -static int lib_override_local_group_tag_cb(LibraryIDLinkCallbackData *cb_data) -{ - if (cb_data->cb_flag & - (IDWALK_CB_EMBEDDED | IDWALK_CB_LOOPBACK | IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE)) { - return IDWALK_RET_STOP_RECURSION; - } - - LibOverrideGroupTagData *data = cb_data->user_data; - const uint tag = data->tag; - const uint missing_tag = data->missing_tag; - - ID *id_root = data->id_root; - Library *library_reference_root = id_root->override_library->reference->lib; - ID *id = *cb_data->id_pointer; - ID *id_owner = cb_data->id_owner; - - BLI_assert(id_owner == cb_data->id_self); - - if (ELEM(id, NULL, id_owner)) { - return IDWALK_RET_NOP; - } - - if (*(uint *)&id->tag & (tag | missing_tag)) { - /* Already processed and tagged, nothing else to do here. */ - return IDWALK_RET_STOP_RECURSION; - } - - if (!ID_IS_OVERRIDE_LIBRARY(id) || ID_IS_LINKED(id)) { - /* Fully local, or linked ID, those are never part of a local override group. */ - return IDWALK_RET_STOP_RECURSION; - } - - /* NOTE: Since we rejected embedded data too at the beginning of this function, id should only be - * a real override now. - * - * However, our usual trouble maker, Key, is not considered as an embedded ID currently, yet it - * is never a real override either. Enjoy. */ - if (!ID_IS_OVERRIDE_LIBRARY_REAL(id)) { - return IDWALK_RET_NOP; - } - - if (id->override_library->reference->lib != library_reference_root) { - /* We do not override data-blocks from other libraries, nor do we process them. */ - return IDWALK_RET_STOP_RECURSION; - } - - if (id->override_library->reference->tag & LIB_TAG_MISSING) { - id->tag |= missing_tag; - } - else { - id->tag |= tag; - } - - return IDWALK_RET_NOP; -} - static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data) { Main *bmain = data->bmain; @@ -612,7 +556,7 @@ static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data /* Do not tag 'virtual' overrides (shape keys here, as we already rejected embedded case * above). */ if (ID_IS_OVERRIDE_LIBRARY_REAL(to_id)) { - ID *reference_lib = NULL; + Library *reference_lib = NULL; if (GS(id_owner->name) == ID_KE) { reference_lib = ((Key *)id_owner)->from->override_library->reference->lib; } From 4818ed1c76cad447b59a36056b170282732dde0d Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Wed, 10 Feb 2021 01:38:28 +0100 Subject: [PATCH 070/519] Cleanup: Unindent if statements in sculpt tools code This removes indentations from if statements by converting them to early returns and continue. Most of the code of brushes and tools has loops with a full indented body inside of an if, which was also copied into some of the new tools. Reviewed By: JacquesLucke Differential Revision: https://developer.blender.org/D10333 --- source/blender/editors/sculpt_paint/sculpt.c | 2767 +++++++++-------- .../editors/sculpt_paint/sculpt_automasking.c | 26 +- .../editors/sculpt_paint/sculpt_boundary.c | 315 +- .../editors/sculpt_paint/sculpt_cloth.c | 293 +- .../editors/sculpt_paint/sculpt_face_set.c | 152 +- .../sculpt_paint/sculpt_multiplane_scrape.c | 152 +- .../editors/sculpt_paint/sculpt_paint_color.c | 220 +- .../editors/sculpt_paint/sculpt_pose.c | 72 +- .../editors/sculpt_paint/sculpt_smooth.c | 158 +- 9 files changed, 2151 insertions(+), 2004 deletions(-) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 42dece9ddd5..d1028e5f542 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -391,13 +391,14 @@ void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visibl case PBVH_FACES: case PBVH_GRIDS: for (int i = 0; i < ss->totfaces; i++) { - if (abs(ss->face_sets[i]) == face_set) { - if (visible) { - ss->face_sets[i] = abs(ss->face_sets[i]); - } - else { - ss->face_sets[i] = -abs(ss->face_sets[i]); - } + if (abs(ss->face_sets[i]) != face_set) { + continue; + } + if (visible) { + ss->face_sets[i] = abs(ss->face_sets[i]); + } + else { + ss->face_sets[i] = -abs(ss->face_sets[i]); } } break; @@ -1057,12 +1058,13 @@ bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], char symm) { for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - float location[3]; - flip_v3_v3(location, br_co, (char)i); - if (len_squared_v3v3(location, vertex) < radius * radius) { - return true; - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + float location[3]; + flip_v3_v3(location, br_co, (char)i); + if (len_squared_v3v3(location, vertex) < radius * radius) { + return true; } } return false; @@ -1107,20 +1109,22 @@ void SCULPT_floodfill_add_initial_with_symmetry( /* Add active vertex and symmetric vertices to the queue. */ const char symm = SCULPT_mesh_symmetry_xyz_get(ob); for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - int v = -1; - if (i == 0) { - v = index; - } - else if (radius > 0.0f) { - float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; - float location[3]; - flip_v3_v3(location, SCULPT_vertex_co_get(ss, index), i); - v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); - } - if (v != -1) { - SCULPT_floodfill_add_initial(flood, v); - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + int v = -1; + if (i == 0) { + v = index; + } + else if (radius > 0.0f) { + float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; + float location[3]; + flip_v3_v3(location, SCULPT_vertex_co_get(ss, index), i); + v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); + } + + if (v != -1) { + SCULPT_floodfill_add_initial(flood, v); } } } @@ -1131,20 +1135,22 @@ void SCULPT_floodfill_add_active( /* Add active vertex and symmetric vertices to the queue. */ const char symm = SCULPT_mesh_symmetry_xyz_get(ob); for (char i = 0; i <= symm; ++i) { - if (SCULPT_is_symmetry_iteration_valid(i, symm)) { - int v = -1; - if (i == 0) { - v = SCULPT_active_vertex_get(ss); - } - else if (radius > 0.0f) { - float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; - float location[3]; - flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i); - v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); - } - if (v != -1) { - SCULPT_floodfill_add_initial(flood, v); - } + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; + } + int v = -1; + if (i == 0) { + v = SCULPT_active_vertex_get(ss); + } + else if (radius > 0.0f) { + float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius; + float location[3]; + flip_v3_v3(location, SCULPT_active_vertex_co_get(ss), i); + v = SCULPT_nearest_vertex_get(sd, ob, location, radius_squared, false); + } + + if (v != -1) { + SCULPT_floodfill_add_initial(flood, v); } } } @@ -1161,12 +1167,19 @@ void SCULPT_floodfill_execute( SculptVertexNeighborIter ni; SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) { const int to_v = ni.index; - if (!BLI_BITMAP_TEST(flood->visited_vertices, to_v) && SCULPT_vertex_visible_get(ss, to_v)) { - BLI_BITMAP_ENABLE(flood->visited_vertices, to_v); - if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) { - BLI_gsqueue_push(flood->queue, &to_v); - } + if (BLI_BITMAP_TEST(flood->visited_vertices, to_v)) { + continue; + } + + if (!SCULPT_vertex_visible_get(ss, to_v)) { + continue; + } + + BLI_BITMAP_ENABLE(flood->visited_vertices, to_v); + + if (func(ss, from_v, to_v, ni.is_duplicate, userdata)) { + BLI_gsqueue_push(flood->queue, &to_v); } } SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); @@ -1466,40 +1479,42 @@ static void paint_mesh_restore_co_task_cb(void *__restrict userdata, unode = SCULPT_undo_get_node(data->nodes[n]); } - if (unode) { - PBVHVertexIter vd; - SculptOrigVertData orig_data; + if (!unode) { + return; + } - SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode); + PBVHVertexIter vd; + SculptOrigVertData orig_data; - BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) - { - SCULPT_orig_vert_data_update(&orig_data, &vd); + SCULPT_orig_vert_data_unode_init(&orig_data, data->ob, unode); - if (orig_data.unode->type == SCULPT_UNDO_COORDS) { - copy_v3_v3(vd.co, orig_data.co); - if (vd.no) { - copy_v3_v3_short(vd.no, orig_data.no); - } - else { - normal_short_to_float_v3(vd.fno, orig_data.no); - } + BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) + { + SCULPT_orig_vert_data_update(&orig_data, &vd); + + if (orig_data.unode->type == SCULPT_UNDO_COORDS) { + copy_v3_v3(vd.co, orig_data.co); + if (vd.no) { + copy_v3_v3_short(vd.no, orig_data.no); } - else if (orig_data.unode->type == SCULPT_UNDO_MASK) { - *vd.mask = orig_data.mask; - } - else if (orig_data.unode->type == SCULPT_UNDO_COLOR) { - copy_v4_v4(vd.col, orig_data.col); - } - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + else { + normal_short_to_float_v3(vd.fno, orig_data.no); } } - BKE_pbvh_vertex_iter_end; + else if (orig_data.unode->type == SCULPT_UNDO_MASK) { + *vd.mask = orig_data.mask; + } + else if (orig_data.unode->type == SCULPT_UNDO_COLOR) { + copy_v4_v4(vd.col, orig_data.col); + } - BKE_pbvh_node_mark_update(data->nodes[n]); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } } + BKE_pbvh_vertex_iter_end; + + BKE_pbvh_node_mark_update(data->nodes[n]); } static void paint_mesh_restore_co(Sculpt *sd, Object *ob) @@ -1545,11 +1560,15 @@ static void sculpt_extend_redraw_rect_previous(Object *ob, rcti *rect) * mesh parts could disappear from screen (sergey). */ SculptSession *ss = ob->sculpt; - if (ss->cache) { - if (!BLI_rcti_is_empty(&ss->cache->previous_r)) { - BLI_rcti_union(rect, &ss->cache->previous_r); - } + if (!ss->cache) { + return; } + + if (BLI_rcti_is_empty(&ss->cache->previous_r)) { + return; + } + + BLI_rcti_union(rect, &ss->cache->previous_r); } /* Get a screen-space rectangle of the modified area. */ @@ -1651,28 +1670,30 @@ bool SCULPT_brush_test_sphere(SculptBrushTest *test, const float co[3]) { float distsq = len_squared_v3v3(co, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = sqrtf(distsq); - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + + test->dist = sqrtf(distsq); + return true; } bool SCULPT_brush_test_sphere_sq(SculptBrushTest *test, const float co[3]) { float distsq = len_squared_v3v3(co, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = distsq; - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + test->dist = distsq; + return true; } bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3]) @@ -1689,14 +1710,16 @@ bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3]) closest_to_plane_normalized_v3(co_proj, test->plane_view, co); float distsq = len_squared_v3v3(co_proj, test->location); - if (distsq <= test->radius_squared) { - if (sculpt_brush_test_clipping(test, co)) { - return false; - } - test->dist = distsq; - return true; + if (distsq > test->radius_squared) { + return false; } - return false; + + if (sculpt_brush_test_clipping(test, co)) { + return false; + } + + test->dist = distsq; + return true; } bool SCULPT_brush_test_cube(SculptBrushTest *test, @@ -1724,25 +1747,26 @@ bool SCULPT_brush_test_cube(SculptBrushTest *test, const float constant_side = hardness * side; const float falloff_side = roundness * side; - if (local_co[0] <= side && local_co[1] <= side && local_co[2] <= side) { + if (!(local_co[0] <= side && local_co[1] <= side && local_co[2] <= side)) { + /* Outside the square. */ + return false; + } + if (min_ff(local_co[0], local_co[1]) > constant_side) { /* Corner, distance to the center of the corner circle. */ - if (min_ff(local_co[0], local_co[1]) > constant_side) { - float r_point[3]; - copy_v3_fl(r_point, constant_side); - test->dist = len_v2v2(r_point, local_co) / falloff_side; - return true; - } - /* Side, distance to the square XY axis. */ - if (max_ff(local_co[0], local_co[1]) > constant_side) { - test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side; - return true; - } - /* Inside the square, constant distance. */ - test->dist = 0.0f; + float r_point[3]; + copy_v3_fl(r_point, constant_side); + test->dist = len_v2v2(r_point, local_co) / falloff_side; return true; } - /* Outside the square. */ - return false; + if (max_ff(local_co[0], local_co[1]) > constant_side) { + /* Side, distance to the square XY axis. */ + test->dist = (max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side; + return true; + } + + /* Inside the square, constant distance. */ + test->dist = 0.0f; + return true; } SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss, @@ -1777,21 +1801,21 @@ static float frontface(const Brush *br, const short no[3], const float fno[3]) { - if (br->flag & BRUSH_FRONTFACE) { - float dot; - - if (no) { - float tmp[3]; - - normal_short_to_float_v3(tmp, no); - dot = dot_v3v3(tmp, sculpt_normal); - } - else { - dot = dot_v3v3(fno, sculpt_normal); - } - return dot > 0.0f ? dot : 0.0f; + if (!(br->flag & BRUSH_FRONTFACE)) { + return 1.0f; } - return 1.0f; + + float dot; + if (no) { + float tmp[3]; + + normal_short_to_float_v3(tmp, no); + dot = dot_v3v3(tmp, sculpt_normal); + } + else { + dot = dot_v3v3(fno, sculpt_normal); + } + return dot > 0.0f ? dot : 0.0f; } #if 0 @@ -1871,25 +1895,25 @@ static float calc_radial_symmetry_feather(Sculpt *sd, static float calc_symmetry_feather(Sculpt *sd, StrokeCache *cache) { - if (sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER) { - float overlap; - const int symm = cache->symmetry; + if (!(sd->paint.symmetry_flags & PAINT_SYMMETRY_FEATHER)) { + return 1.0f; + } + float overlap; + const int symm = cache->symmetry; - overlap = 0.0f; - for (int i = 0; i <= symm; i++) { - if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { - - overlap += calc_overlap(cache, i, 0, 0); - - overlap += calc_radial_symmetry_feather(sd, cache, i, 'X'); - overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y'); - overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z'); - } + overlap = 0.0f; + for (int i = 0; i <= symm; i++) { + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; } - return 1.0f / overlap; + overlap += calc_overlap(cache, i, 0, 0); + + overlap += calc_radial_symmetry_feather(sd, cache, i, 'X'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z'); } - return 1.0f; + return 1.0f / overlap; } /* -------------------------------------------------------------------- */ @@ -1991,35 +2015,37 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata, normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co); area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co); - if (normal_test_r || area_test_r) { - float no[3]; - int flip_index; + if (!normal_test_r && !area_test_r) { + continue; + } - normal_tri_v3(no, UNPACK3(co_tri)); + float no[3]; + int flip_index; - flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f); - if (use_area_cos && area_test_r) { - /* Weight the coordinates towards the center. */ - float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); - const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + normal_tri_v3(no, UNPACK3(co_tri)); - float disp[3]; - sub_v3_v3v3(disp, co, area_test.location); - mul_v3_fl(disp, 1.0f - afactor); - add_v3_v3v3(co, area_test.location, disp); - add_v3_v3(anctd->area_cos[flip_index], co); + flip_index = (dot_v3v3(ss->cache->view_normal, no) <= 0.0f); + if (use_area_cos && area_test_r) { + /* Weight the coordinates towards the center. */ + float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); + const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - anctd->count_co[flip_index] += 1; - } - if (use_area_nos && normal_test_r) { - /* Weight the normals towards the center. */ - float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); - const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - mul_v3_fl(no, nfactor); + float disp[3]; + sub_v3_v3v3(disp, co, area_test.location); + mul_v3_fl(disp, 1.0f - afactor); + add_v3_v3v3(co, area_test.location, disp); + add_v3_v3(anctd->area_cos[flip_index], co); - add_v3_v3(anctd->area_nos[flip_index], no); - anctd->count_no[flip_index] += 1; - } + anctd->count_co[flip_index] += 1; + } + if (use_area_nos && normal_test_r) { + /* Weight the normals towards the center. */ + float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); + const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + mul_v3_fl(no, nfactor); + + add_v3_v3(anctd->area_nos[flip_index], no); + anctd->count_no[flip_index] += 1; } } } @@ -2051,49 +2077,51 @@ static void calc_area_normal_and_center_task_cb(void *__restrict userdata, normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co); area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co); - if (normal_test_r || area_test_r) { - float no[3]; - int flip_index; + if (!normal_test_r && !area_test_r) { + continue; + } - data->any_vertex_sampled = true; + float no[3]; + int flip_index; - if (use_original) { - normal_short_to_float_v3(no, no_s); + data->any_vertex_sampled = true; + + if (use_original) { + normal_short_to_float_v3(no, no_s); + } + else { + if (vd.no) { + normal_short_to_float_v3(no, vd.no); } else { - if (vd.no) { - normal_short_to_float_v3(no, vd.no); - } - else { - copy_v3_v3(no, vd.fno); - } + copy_v3_v3(no, vd.fno); } + } - flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <= - 0.0f); + flip_index = (dot_v3v3(ss->cache ? ss->cache->view_normal : ss->cursor_view_normal, no) <= + 0.0f); - if (use_area_cos && area_test_r) { - /* Weight the coordinates towards the center. */ - float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); - const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + if (use_area_cos && area_test_r) { + /* Weight the coordinates towards the center. */ + float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius); + const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - float disp[3]; - sub_v3_v3v3(disp, co, area_test.location); - mul_v3_fl(disp, 1.0f - afactor); - add_v3_v3v3(co, area_test.location, disp); + float disp[3]; + sub_v3_v3v3(disp, co, area_test.location); + mul_v3_fl(disp, 1.0f - afactor); + add_v3_v3v3(co, area_test.location, disp); - add_v3_v3(anctd->area_cos[flip_index], co); - anctd->count_co[flip_index] += 1; - } - if (use_area_nos && normal_test_r) { - /* Weight the normals towards the center. */ - float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); - const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); - mul_v3_fl(no, nfactor); + add_v3_v3(anctd->area_cos[flip_index], co); + anctd->count_co[flip_index] += 1; + } + if (use_area_nos && normal_test_r) { + /* Weight the normals towards the center. */ + float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius); + const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f); + mul_v3_fl(no, nfactor); - add_v3_v3(anctd->area_nos[flip_index], no); - anctd->count_no[flip_index] += 1; - } + add_v3_v3(anctd->area_nos[flip_index], no); + anctd->count_no[flip_index] += 1; } } BKE_pbvh_vertex_iter_end; @@ -2150,10 +2178,12 @@ static void calc_area_center( /* For flatten center. */ for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) { - if (anctd.count_co[n] != 0) { - mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); - break; + if (anctd.count_co[n] == 0) { + continue; } + + mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); + break; } if (n == 2) { @@ -2249,10 +2279,12 @@ static void calc_area_normal_and_center( /* For flatten center. */ for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) { - if (anctd.count_co[n] != 0) { - mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); - break; + if (anctd.count_co[n] == 0) { + continue; } + + mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]); + break; } if (n == 2) { @@ -2892,26 +2924,27 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = - bstrength * - SCULPT_brush_strength_factor( - ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.index, thread_id) * - ss->cache->pressure; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = + bstrength * + SCULPT_brush_strength_factor( + ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, *vd.mask, vd.index, thread_id) * + ss->cache->pressure; - float avg[3], val[3]; + float avg[3], val[3]; - SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert); + SCULPT_bmesh_four_neighbor_average(avg, direction, vd.bm_vert); - sub_v3_v3v3(val, avg, vd.co); + sub_v3_v3v3(val, avg, vd.co); - madd_v3_v3v3fl(val, vd.co, val, fade); + madd_v3_v3v3fl(val, vd.co, val, fade); - SCULPT_clip(sd, ss, vd.co, val); + SCULPT_clip(sd, ss, vd.co, val); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -2964,21 +2997,23 @@ static void do_mask_brush_draw_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = SCULPT_brush_strength_factor( - ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.index, thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (bstrength > 0.0f) { - (*vd.mask) += fade * bstrength * (1.0f - *vd.mask); - } - else { - (*vd.mask) += fade * bstrength * (*vd.mask); - } - *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f); + const float fade = SCULPT_brush_strength_factor( + ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, 0.0f, vd.index, thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (bstrength > 0.0f) { + (*vd.mask) += fade * bstrength * (1.0f - *vd.mask); + } + else { + (*vd.mask) += fade * bstrength * (*vd.mask); + } + *vd.mask = clamp_f(*vd.mask, 0.0f, 1.0f); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } BKE_pbvh_vertex_iter_end; } @@ -3039,26 +3074,27 @@ static void do_displacement_eraser_brush_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - float limit_co[3]; - float disp[3]; - SCULPT_vertex_limit_surface_get(ss, vd.index, limit_co); - sub_v3_v3v3(disp, limit_co, vd.co); - mul_v3_v3fl(proxy[vd.i], disp, fade); + float limit_co[3]; + float disp[3]; + SCULPT_vertex_limit_surface_get(ss, vd.index, limit_co); + sub_v3_v3v3(disp, limit_co, vd.co); + mul_v3_v3fl(proxy[vd.i], disp, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3151,12 +3187,15 @@ static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata, ss->cache->limit_surface_co[vd.index]); const float *neighbor_limit_surface_disp = ss->cache->prev_displacement[ni.index]; normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) { - const float disp_interp = clamp_f( - -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); - madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp); - weights_accum += disp_interp; + + if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) { + continue; } + + const float disp_interp = clamp_f( + -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); + madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp); + weights_accum += disp_interp; } SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); @@ -3246,23 +3285,24 @@ static void do_draw_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + mul_v3_v3fl(proxy[vd.i], offset, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3325,23 +3365,24 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + mul_v3_v3fl(proxy[vd.i], offset, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3407,52 +3448,53 @@ static void do_topology_slide_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - float current_disp[3]; - float current_disp_norm[3]; - float final_disp[3] = {0.0f, 0.0f, 0.0f}; + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + float current_disp[3]; + float current_disp_norm[3]; + float final_disp[3] = {0.0f, 0.0f, 0.0f}; - switch (brush->slide_deform_type) { - case BRUSH_SLIDE_DEFORM_DRAG: - sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); - break; - case BRUSH_SLIDE_DEFORM_PINCH: - sub_v3_v3v3(current_disp, ss->cache->location, vd.co); - break; - case BRUSH_SLIDE_DEFORM_EXPAND: - sub_v3_v3v3(current_disp, vd.co, ss->cache->location); - break; + switch (brush->slide_deform_type) { + case BRUSH_SLIDE_DEFORM_DRAG: + sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); + break; + case BRUSH_SLIDE_DEFORM_PINCH: + sub_v3_v3v3(current_disp, ss->cache->location, vd.co); + break; + case BRUSH_SLIDE_DEFORM_EXPAND: + sub_v3_v3v3(current_disp, vd.co, ss->cache->location); + break; + } + + normalize_v3_v3(current_disp_norm, current_disp); + mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) { + float vertex_disp[3]; + float vertex_disp_norm[3]; + sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co); + normalize_v3_v3(vertex_disp_norm, vertex_disp); + if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) { + madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp)); } + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - normalize_v3_v3(current_disp_norm, current_disp); - mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + mul_v3_v3fl(proxy[vd.i], final_disp, fade); - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) { - float vertex_disp[3]; - float vertex_disp_norm[3]; - sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co); - normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) { - madd_v3_v3fl(final_disp, vertex_disp_norm, dot_v3v3(current_disp, vertex_disp)); - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - - mul_v3_v3fl(proxy[vd.i], final_disp, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3482,16 +3524,17 @@ void SCULPT_relax_vertex(SculptSession *ss, /* When the vertex to relax is boundary, use only connected boundary vertices for the average * position. */ if (is_boundary) { - if (SCULPT_vertex_is_boundary(ss, ni.index)) { - add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index)); - avg_count++; - - /* Calculate a normal for the constraint plane using the edges of the boundary. */ - float to_neighbor[3]; - sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.index), vd->co); - normalize_v3(to_neighbor); - add_v3_v3(boundary_normal, to_neighbor); + if (!SCULPT_vertex_is_boundary(ss, ni.index)) { + continue; } + add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index)); + avg_count++; + + /* Calculate a normal for the constraint plane using the edges of the boundary. */ + float to_neighbor[3]; + sub_v3_v3v3(to_neighbor, SCULPT_vertex_co_get(ss, ni.index), vd->co); + normalize_v3(to_neighbor); + add_v3_v3(boundary_normal, to_neighbor); } else { add_v3_v3(smooth_pos, SCULPT_vertex_co_get(ss, ni.index)); @@ -3563,21 +3606,22 @@ static void do_topology_relax_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + SCULPT_relax_vertex(ss, &vd, fade * bstrength, false, vd.co); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3728,38 +3772,39 @@ static void do_crease_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* Offset vertex. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - float val1[3]; - float val2[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* Offset vertex. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + float val1[3]; + float val2[3]; - /* First we pinch. */ - sub_v3_v3v3(val1, test.location, vd.co); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(val1, val1, ss->cache->view_normal); - } + /* First we pinch. */ + sub_v3_v3v3(val1, test.location, vd.co); + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(val1, val1, ss->cache->view_normal); + } - mul_v3_fl(val1, fade * flippedbstrength); + mul_v3_fl(val1, fade * flippedbstrength); - sculpt_project_v3(spvc, val1, val1); + sculpt_project_v3(spvc, val1, val1); - /* Then we draw. */ - mul_v3_v3fl(val2, offset, fade); + /* Then we draw. */ + mul_v3_v3fl(val2, offset, fade); - add_v3_v3v3(proxy[vd.i], val1, val2); + add_v3_v3v3(proxy[vd.i], val1, val2); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3845,40 +3890,41 @@ static void do_pinch_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - float disp_center[3]; - float x_disp[3]; - float z_disp[3]; - /* Calculate displacement from the vertex to the brush center. */ - sub_v3_v3v3(disp_center, test.location, vd.co); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + float disp_center[3]; + float x_disp[3]; + float z_disp[3]; + /* Calculate displacement from the vertex to the brush center. */ + sub_v3_v3v3(disp_center, test.location, vd.co); - /* Project the displacement into the X vector (aligned to the stroke). */ - mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); + /* Project the displacement into the X vector (aligned to the stroke). */ + mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); - /* Project the displacement into the Z vector (aligned to the surface normal). */ - mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); + /* Project the displacement into the Z vector (aligned to the surface normal). */ + mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); - /* Add the two projected vectors to calculate the final displacement. - * The Y component is removed. */ - add_v3_v3v3(disp_center, x_disp, z_disp); + /* Add the two projected vectors to calculate the final displacement. + * The Y component is removed. */ + add_v3_v3v3(disp_center, x_disp, z_disp); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal); - } - mul_v3_v3fl(proxy[vd.i], disp_center, fade); + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(disp_center, disp_center, ss->cache->view_normal); + } + mul_v3_v3fl(proxy[vd.i], disp_center, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -3961,33 +4007,34 @@ static void do_grab_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (grab_silhouette) { - float silhouette_test_dir[3]; - normalize_v3_v3(silhouette_test_dir, grab_delta); - if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) { - mul_v3_fl(silhouette_test_dir, -1.0f); - } - float vno[3]; - normal_short_to_float_v3(vno, orig_data.no); - fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f); + if (grab_silhouette) { + float silhouette_test_dir[3]; + normalize_v3_v3(silhouette_test_dir, grab_delta); + if (dot_v3v3(ss->cache->initial_normal, ss->cache->grab_delta_symmetry) < 0.0f) { + mul_v3_fl(silhouette_test_dir, -1.0f); } + float vno[3]; + normal_short_to_float_v3(vno, orig_data.no); + fade *= max_ff(dot_v3v3(vno, silhouette_test_dir), 0.0f); + } - mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4149,13 +4196,14 @@ void SCULPT_flip_v3_by_symm_area(float v[3], { for (int i = 0; i < 3; i++) { ePaintSymmetryFlags symm_it = 1 << i; - if (symm & symm_it) { - if (symmarea & symm_it) { - flip_v3(v, symm_it); - } - if (pivot[i] < 0.0f) { - flip_v3(v, symm_it); - } + if (!(symm & symm_it)) { + continue; + } + if (symmarea & symm_it) { + flip_v3(v, symm_it); + } + if (pivot[i] < 0.0f) { + flip_v3(v, symm_it); } } } @@ -4167,13 +4215,14 @@ void SCULPT_flip_quat_by_symm_area(float quat[3], { for (int i = 0; i < 3; i++) { ePaintSymmetryFlags symm_it = 1 << i; - if (symm & symm_it) { - if (symmarea & symm_it) { - flip_qt(quat, symm_it); - } - if (pivot[i] < 0.0f) { - flip_qt(quat, symm_it); - } + if (!(symm & symm_it)) { + continue; + } + if (symmarea & symm_it) { + flip_qt(quat, symm_it); + } + if (pivot[i] < 0.0f) { + flip_qt(quat, symm_it); } } } @@ -4289,22 +4338,23 @@ static void do_nudge_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], cono, fade); + mul_v3_v3fl(proxy[vd.i], cono, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4368,75 +4418,76 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (do_elastic || sculpt_brush_test_sq_fn(&test, vd.co)) { + if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - float fade; - if (do_elastic) { - fade = 1.0f; - } - else { - fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + float fade; + if (do_elastic) { + fade = 1.0f; + } + else { + fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + } + + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + + /* Negative pinch will inflate, helps maintain volume. */ + if (do_pinch) { + float delta_pinch_init[3], delta_pinch[3]; + + sub_v3_v3v3(delta_pinch, vd.co, test.location); + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal); } - mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + /* Important to calculate based on the grabbed location + * (intentionally ignore fade here). */ + add_v3_v3(delta_pinch, grab_delta); - /* Negative pinch will inflate, helps maintain volume. */ - if (do_pinch) { - float delta_pinch_init[3], delta_pinch[3]; + sculpt_project_v3(spvc, delta_pinch, delta_pinch); - sub_v3_v3v3(delta_pinch, vd.co, test.location); - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(delta_pinch, delta_pinch, ss->cache->true_view_normal); - } + copy_v3_v3(delta_pinch_init, delta_pinch); - /* Important to calculate based on the grabbed location - * (intentionally ignore fade here). */ - add_v3_v3(delta_pinch, grab_delta); - - sculpt_project_v3(spvc, delta_pinch, delta_pinch); - - copy_v3_v3(delta_pinch_init, delta_pinch); - - float pinch_fade = pinch * fade; - /* When reducing, scale reduction back by how close to the center we are, - * so we don't pinch into nothingness. */ - if (pinch > 0.0f) { - /* Square to have even less impact for close vertices. */ - pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius)); - } - mul_v3_fl(delta_pinch, 1.0f + pinch_fade); - sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch); - add_v3_v3(proxy[vd.i], delta_pinch); + float pinch_fade = pinch * fade; + /* When reducing, scale reduction back by how close to the center we are, + * so we don't pinch into nothingness. */ + if (pinch > 0.0f) { + /* Square to have even less impact for close vertices. */ + pinch_fade *= pow2f(min_ff(1.0f, len_v3(delta_pinch) / ss->cache->radius)); } + mul_v3_fl(delta_pinch, 1.0f + pinch_fade); + sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch); + add_v3_v3(proxy[vd.i], delta_pinch); + } - if (do_rake_rotation) { - float delta_rotate[3]; - sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate); - add_v3_v3(proxy[vd.i], delta_rotate); - } + if (do_rake_rotation) { + float delta_rotate[3]; + sculpt_rake_rotate(ss, test.location, vd.co, fade, delta_rotate); + add_v3_v3(proxy[vd.i], delta_rotate); + } - if (do_elastic) { - float disp[3]; - BKE_kelvinlet_grab_triscale(disp, ¶ms, vd.co, ss->cache->location, proxy[vd.i]); - mul_v3_fl(disp, bstrength * 20.0f); - if (vd.mask) { - mul_v3_fl(disp, 1.0f - *vd.mask); - } - mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index)); - copy_v3_v3(proxy[vd.i], disp); + if (do_elastic) { + float disp[3]; + BKE_kelvinlet_grab_triscale(disp, ¶ms, vd.co, ss->cache->location, proxy[vd.i]); + mul_v3_fl(disp, bstrength * 20.0f); + if (vd.mask) { + mul_v3_fl(disp, 1.0f - *vd.mask); } + mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index)); + copy_v3_v3(proxy[vd.i], disp); + } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4507,22 +4558,23 @@ static void do_thumb_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], cono, fade); + mul_v3_v3fl(proxy[vd.i], cono, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4580,27 +4632,28 @@ static void do_rotate_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - float vec[3], rot[3][3]; - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - orig_data.co, - sqrtf(test.dist), - orig_data.no, - NULL, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + float vec[3], rot[3][3]; + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + orig_data.co, + sqrtf(test.dist), + orig_data.no, + NULL, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - sub_v3_v3v3(vec, orig_data.co, ss->cache->location); - axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade); - mul_v3_m3v3(proxy[vd.i], rot, vec); - add_v3_v3(proxy[vd.i], ss->cache->location); - sub_v3_v3(proxy[vd.i], orig_data.co); + sub_v3_v3v3(vec, orig_data.co, ss->cache->location); + axis_angle_normalized_to_mat3(rot, ss->cache->sculpt_normal_symm, angle * fade); + mul_v3_m3v3(proxy[vd.i], rot, vec); + add_v3_v3(proxy[vd.i], ss->cache->location); + sub_v3_v3(proxy[vd.i], orig_data.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4652,70 +4705,71 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata, { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, orig_data.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, orig_data.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - const int vi = vd.index; - float *disp_factor; - if (use_persistent_base) { - disp_factor = &ss->persistent_base[vi].disp; - } - else { - disp_factor = &ss->cache->layer_displacement_factor[vi]; - } + const int vi = vd.index; + float *disp_factor; + if (use_persistent_base) { + disp_factor = &ss->persistent_base[vi].disp; + } + else { + disp_factor = &ss->cache->layer_displacement_factor[vi]; + } - /* When using persistent base, the layer brush (holding Control) invert mode resets the - * height of the layer to 0. This makes possible to clean edges of previously added layers - * on top of the base. */ - /* The main direction of the layers is inverted using the regular brush strength with the - * brush direction property. */ - if (use_persistent_base && ss->cache->invert) { - (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) * - ((*disp_factor) > 0.0f ? -1.0f : 1.0f); - } - else { - (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor)); - } - if (vd.mask) { - const float clamp_mask = 1.0f - *vd.mask; - *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask); - } - else { - *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f); - } + /* When using persistent base, the layer brush (holding Control) invert mode resets the + * height of the layer to 0. This makes possible to clean edges of previously added layers + * on top of the base. */ + /* The main direction of the layers is inverted using the regular brush strength with the + * brush direction property. */ + if (use_persistent_base && ss->cache->invert) { + (*disp_factor) += fabsf(fade * bstrength * (*disp_factor)) * + ((*disp_factor) > 0.0f ? -1.0f : 1.0f); + } + else { + (*disp_factor) += fade * bstrength * (1.05f - fabsf(*disp_factor)); + } + if (vd.mask) { + const float clamp_mask = 1.0f - *vd.mask; + *disp_factor = clamp_f(*disp_factor, -clamp_mask, clamp_mask); + } + else { + *disp_factor = clamp_f(*disp_factor, -1.0f, 1.0f); + } - float final_co[3]; - float normal[3]; + float final_co[3]; + float normal[3]; - if (use_persistent_base) { - SCULPT_vertex_persistent_normal_get(ss, vi, normal); - mul_v3_fl(normal, brush->height); - madd_v3_v3v3fl(final_co, SCULPT_vertex_persistent_co_get(ss, vi), normal, *disp_factor); - } - else { - normal_short_to_float_v3(normal, orig_data.no); - mul_v3_fl(normal, brush->height); - madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor); - } + if (use_persistent_base) { + SCULPT_vertex_persistent_normal_get(ss, vi, normal); + mul_v3_fl(normal, brush->height); + madd_v3_v3v3fl(final_co, SCULPT_vertex_persistent_co_get(ss, vi), normal, *disp_factor); + } + else { + normal_short_to_float_v3(normal, orig_data.no); + mul_v3_fl(normal, brush->height); + madd_v3_v3v3fl(final_co, orig_data.co, normal, *disp_factor); + } - float vdisp[3]; - sub_v3_v3v3(vdisp, final_co, vd.co); - mul_v3_fl(vdisp, fabsf(fade)); - add_v3_v3v3(final_co, vd.co, vdisp); + float vdisp[3]; + sub_v3_v3v3(vdisp, final_co, vd.co); + mul_v3_fl(vdisp, fabsf(fade)); + add_v3_v3v3(final_co, vd.co, vdisp); - SCULPT_clip(sd, ss, vd.co, final_co); + SCULPT_clip(sd, ss, vd.co, final_co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4764,31 +4818,32 @@ static void do_inflate_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + float val[3]; - if (vd.fno) { - copy_v3_v3(val, vd.fno); - } - else { - normal_short_to_float_v3(val, vd.no); - } + if (vd.fno) { + copy_v3_v3(val, vd.fno); + } + else { + normal_short_to_float_v3(val, vd.no); + } - mul_v3_fl(val, fade * ss->cache->radius); - mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale); + mul_v3_fl(val, fade * ss->cache->radius); + mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -4869,30 +4924,31 @@ static void do_flatten_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float intr[3]; + float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - sub_v3_v3v3(val, intr, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (SCULPT_plane_trim(ss->cache, brush, val)) { + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], val, fade); + mul_v3_v3fl(proxy[vd.i], val, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } } @@ -4975,16 +5031,17 @@ static void calc_clay_surface_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float plane_dist = dist_signed_to_plane_v3(vd.co, plane); - float plane_dist_abs = fabsf(plane_dist); - if (plane_dist > 0.0f) { - csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs); - } - else { - csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs); - } + float plane_dist = dist_signed_to_plane_v3(vd.co, plane); + float plane_dist_abs = fabsf(plane_dist); + if (plane_dist > 0.0f) { + csd->plane_dist[0] = MIN2(csd->plane_dist[0], plane_dist_abs); + } + else { + csd->plane_dist[1] = MIN2(csd->plane_dist[1], plane_dist_abs); } BKE_pbvh_vertex_iter_end; } @@ -5025,28 +5082,30 @@ static void do_clay_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float intr[3]; - float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + sub_v3_v3v3(val, intr, vd.co); - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5143,35 +5202,37 @@ static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) { - if (plane_point_side_flip(vd.co, test.plane_tool, flip)) { - float intr[3]; - float val[3]; + if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!plane_point_side_flip(vd.co, test.plane_tool, flip)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */ - const float fade = bstrength * - SCULPT_brush_strength_factor(ss, - brush, - vd.co, - ss->cache->radius * test.dist, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } + /* The normal from the vertices is ignored, it causes glitch with planes, see: T44390. */ + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + ss->cache->radius * test.dist, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], val, fade); + mul_v3_v3fl(proxy[vd.i], val, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5295,33 +5356,37 @@ static void do_fill_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (SCULPT_plane_point_side(vd.co, test.plane_tool)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5390,33 +5455,37 @@ static void do_scrape_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (!SCULPT_plane_point_side(vd.co, test.plane_tool)) { - float intr[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + if (SCULPT_plane_point_side(vd.co, test.plane_tool)) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); + float intr[3]; + float val[3]; + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } - mul_v3_v3fl(proxy[vd.i], val, fade); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5501,38 +5570,39 @@ static void do_clay_thumb_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - mul_v3_m4v3(local_co, mat, vd.co); - float intr[3], intr_tilt[3]; - float val[3]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float local_co[3]; + mul_v3_m4v3(local_co, mat, vd.co); + float intr[3], intr_tilt[3]; + float val[3]; - closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); - closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co); + closest_to_plane_normalized_v3(intr, test.plane_tool, vd.co); + closest_to_plane_normalized_v3(intr_tilt, plane_tilt, vd.co); - /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex - * coordinates. */ - /* We can also control the mix with a curve if it produces noticeable artifacts in the center - * of the brush. */ - const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f; - interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix); - sub_v3_v3v3(val, intr_tilt, vd.co); + /* Mix the deformation of the aligned and the tilted plane based on the brush space vertex + * coordinates. */ + /* We can also control the mix with a curve if it produces noticeable artifacts in the center + * of the brush. */ + const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f; + interp_v3_v3v3(intr, intr, intr_tilt, tilt_mix); + sub_v3_v3v3(val, intr_tilt, vd.co); - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], val, fade); + mul_v3_v3fl(proxy[vd.i], val, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5656,22 +5726,23 @@ static void do_gravity_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - mul_v3_v3fl(proxy[vd.i], offset, fade); + mul_v3_v3fl(proxy[vd.i], offset, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -5766,49 +5837,51 @@ static void sculpt_topology_update(Sculpt *sd, ob, sd, brush, use_original, radius_scale, &totnode); /* Only act if some verts are inside the brush area. */ - if (totnode) { - PBVHTopologyUpdateMode mode = 0; - float location[3]; + if (totnode == 0) { + return; + } - if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) { - if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) { - mode |= PBVH_Subdivide; - } + PBVHTopologyUpdateMode mode = 0; + float location[3]; - if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) { - mode |= PBVH_Collapse; - } + if (!(sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL)) { + if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) { + mode |= PBVH_Subdivide; } - for (n = 0; n < totnode; n++) { - SCULPT_undo_push_node(ob, - nodes[n], - brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK : - SCULPT_UNDO_COORDS); - BKE_pbvh_node_mark_update(nodes[n]); - - if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) { - BKE_pbvh_node_mark_topology_update(nodes[n]); - BKE_pbvh_bmesh_node_save_orig(ss->bm, nodes[n]); - } + if ((sd->flags & SCULPT_DYNTOPO_COLLAPSE) || (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY)) { + mode |= PBVH_Collapse; } + } + + for (n = 0; n < totnode; n++) { + SCULPT_undo_push_node(ob, + nodes[n], + brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK : + SCULPT_UNDO_COORDS); + BKE_pbvh_node_mark_update(nodes[n]); if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) { - BKE_pbvh_bmesh_update_topology(ss->pbvh, - mode, - ss->cache->location, - ss->cache->view_normal, - ss->cache->radius, - (brush->flag & BRUSH_FRONTFACE) != 0, - (brush->falloff_shape != PAINT_FALLOFF_SHAPE_SPHERE)); + BKE_pbvh_node_mark_topology_update(nodes[n]); + BKE_pbvh_bmesh_node_save_orig(ss->bm, nodes[n]); } - - MEM_SAFE_FREE(nodes); - - /* Update average stroke position. */ - copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->obmat, location); } + + if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) { + BKE_pbvh_bmesh_update_topology(ss->pbvh, + mode, + ss->cache->location, + ss->cache->view_normal, + ss->cache->radius, + (brush->flag & BRUSH_FRONTFACE) != 0, + (brush->falloff_shape != PAINT_FALLOFF_SHAPE_SPHERE)); + } + + MEM_SAFE_FREE(nodes); + + /* Update average stroke position. */ + copy_v3_v3(location, ss->cache->true_location); + mul_m4_v3(ob->obmat, location); } static void do_brush_action_task_cb(void *__restrict userdata, @@ -5914,202 +5987,199 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe } /* Only act if some verts are inside the brush area. */ - if (totnode) { - float location[3]; + if (totnode == 0) { + return; + } + float location[3]; - SculptThreadedTaskData task_data = { - .sd = sd, - .ob = ob, - .brush = brush, - .nodes = nodes, - }; + SculptThreadedTaskData task_data = { + .sd = sd, + .ob = ob, + .brush = brush, + .nodes = nodes, + }; - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, totnode); - BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings); + TaskParallelSettings settings; + BKE_pbvh_parallel_range_settings(&settings, true, totnode); + BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings); - if (sculpt_brush_needs_normal(ss, brush)) { - update_sculpt_normal(sd, ob, nodes, totnode); + if (sculpt_brush_needs_normal(ss, brush)) { + update_sculpt_normal(sd, ob, nodes, totnode); + } + + if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) { + update_brush_local_mat(sd, ob); + } + + if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) { + SCULPT_pose_brush_init(sd, ob, ss, brush); + } + + if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { + if (!ss->cache->cloth_sim) { + ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create( + ss, 1.0f, 0.0f, 0.0f, false, true); + SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim); } + SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim); + SCULPT_cloth_brush_ensure_nodes_constraints( + sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX); + } - if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_AREA) { - update_brush_local_mat(sd, ob); - } + bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN; - if (brush->sculpt_tool == SCULPT_TOOL_POSE && SCULPT_stroke_is_first_brush_step(ss->cache)) { - SCULPT_pose_brush_init(sd, ob, ss, brush); - } - - if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { - if (!ss->cache->cloth_sim) { - ss->cache->cloth_sim = SCULPT_cloth_brush_simulation_create( - ss, 1.0f, 0.0f, 0.0f, false, true); - SCULPT_cloth_brush_simulation_init(ss, ss->cache->cloth_sim); + /* Apply one type of brush action. */ + switch (brush->sculpt_tool) { + case SCULPT_TOOL_DRAW: + do_draw_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SMOOTH: + if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) { + SCULPT_do_smooth_brush(sd, ob, nodes, totnode); } - SCULPT_cloth_brush_store_simulation_state(ss, ss->cache->cloth_sim); - SCULPT_cloth_brush_ensure_nodes_constraints( - sd, ob, nodes, totnode, ss->cache->cloth_sim, ss->cache->location, FLT_MAX); - } - - bool invert = ss->cache->pen_flip || ss->cache->invert || brush->flag & BRUSH_DIR_IN; - - /* Apply one type of brush action. */ - switch (brush->sculpt_tool) { - case SCULPT_TOOL_DRAW: - do_draw_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SMOOTH: - if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_LAPLACIAN) { - SCULPT_do_smooth_brush(sd, ob, nodes, totnode); - } - else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) { - SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_CREASE: - do_crease_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_BLOB: - do_crease_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_PINCH: - do_pinch_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_INFLATE: - do_inflate_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_GRAB: - do_grab_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_ROTATE: - do_rotate_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SNAKE_HOOK: - do_snake_hook_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_NUDGE: - do_nudge_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_THUMB: - do_thumb_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_LAYER: - do_layer_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_FLATTEN: - do_flatten_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY: - do_clay_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY_STRIPS: - do_clay_strips_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_MULTIPLANE_SCRAPE: - SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLAY_THUMB: - do_clay_thumb_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_FILL: - if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { - do_scrape_brush(sd, ob, nodes, totnode); - } - else { - do_fill_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_SCRAPE: - if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { - do_fill_brush(sd, ob, nodes, totnode); - } - else { - do_scrape_brush(sd, ob, nodes, totnode); - } - break; - case SCULPT_TOOL_MASK: - do_mask_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_POSE: - SCULPT_do_pose_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DRAW_SHARP: - do_draw_sharp_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_ELASTIC_DEFORM: - do_elastic_deform_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SLIDE_RELAX: - do_slide_relax_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_BOUNDARY: - SCULPT_do_boundary_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_CLOTH: - SCULPT_do_cloth_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DRAW_FACE_SETS: - SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DISPLACEMENT_ERASER: - do_displacement_eraser_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_DISPLACEMENT_SMEAR: - do_displacement_smear_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_PAINT: - SCULPT_do_paint_brush(sd, ob, nodes, totnode); - break; - case SCULPT_TOOL_SMEAR: - SCULPT_do_smear_brush(sd, ob, nodes, totnode); - break; - } - - if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) && - brush->autosmooth_factor > 0) { - if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { - SCULPT_smooth(sd, - ob, - nodes, - totnode, - brush->autosmooth_factor * (1.0f - ss->cache->pressure), - false); + else if (brush->smooth_deform_type == BRUSH_SMOOTH_DEFORM_SURFACE) { + SCULPT_do_surface_smooth_brush(sd, ob, nodes, totnode); + } + break; + case SCULPT_TOOL_CREASE: + do_crease_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_BLOB: + do_crease_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_PINCH: + do_pinch_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_INFLATE: + do_inflate_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_GRAB: + do_grab_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_ROTATE: + do_rotate_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SNAKE_HOOK: + do_snake_hook_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_NUDGE: + do_nudge_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_THUMB: + do_thumb_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_LAYER: + do_layer_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_FLATTEN: + do_flatten_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY: + do_clay_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY_STRIPS: + do_clay_strips_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_MULTIPLANE_SCRAPE: + SCULPT_do_multiplane_scrape_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLAY_THUMB: + do_clay_thumb_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_FILL: + if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { + do_scrape_brush(sd, ob, nodes, totnode); } else { - SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false); + do_fill_brush(sd, ob, nodes, totnode); } - } - - if (sculpt_brush_use_topology_rake(ss, brush)) { - bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor); - } - - /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */ - if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool, - SCULPT_TOOL_CLOTH, - SCULPT_TOOL_DRAW_FACE_SETS, - SCULPT_TOOL_BOUNDARY)) { - do_gravity(sd, ob, nodes, totnode, sd->gravity_factor); - } - - if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { - if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) { - SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode); - SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode); + break; + case SCULPT_TOOL_SCRAPE: + if (invert && brush->flag & BRUSH_INVERT_TO_SCRAPE_FILL) { + do_fill_brush(sd, ob, nodes, totnode); } - } - - MEM_SAFE_FREE(nodes); - - /* Update average stroke position. */ - copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->obmat, location); - - add_v3_v3(ups->average_stroke_accum, location); - ups->average_stroke_counter++; - /* Update last stroke position. */ - ups->last_stroke_valid = true; + else { + do_scrape_brush(sd, ob, nodes, totnode); + } + break; + case SCULPT_TOOL_MASK: + do_mask_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_POSE: + SCULPT_do_pose_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DRAW_SHARP: + do_draw_sharp_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_ELASTIC_DEFORM: + do_elastic_deform_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SLIDE_RELAX: + do_slide_relax_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_BOUNDARY: + SCULPT_do_boundary_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_CLOTH: + SCULPT_do_cloth_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DRAW_FACE_SETS: + SCULPT_do_draw_face_sets_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DISPLACEMENT_ERASER: + do_displacement_eraser_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_DISPLACEMENT_SMEAR: + do_displacement_smear_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_PAINT: + SCULPT_do_paint_brush(sd, ob, nodes, totnode); + break; + case SCULPT_TOOL_SMEAR: + SCULPT_do_smear_brush(sd, ob, nodes, totnode); + break; } + + if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) && + brush->autosmooth_factor > 0) { + if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { + SCULPT_smooth( + sd, ob, nodes, totnode, brush->autosmooth_factor * (1.0f - ss->cache->pressure), false); + } + else { + SCULPT_smooth(sd, ob, nodes, totnode, brush->autosmooth_factor, false); + } + } + + if (sculpt_brush_use_topology_rake(ss, brush)) { + bmesh_topology_rake(sd, ob, nodes, totnode, brush->topology_rake_factor); + } + + /* The cloth brush adds the gravity as a regular force and it is processed in the solver. */ + if (ss->cache->supports_gravity && !ELEM(brush->sculpt_tool, + SCULPT_TOOL_CLOTH, + SCULPT_TOOL_DRAW_FACE_SETS, + SCULPT_TOOL_BOUNDARY)) { + do_gravity(sd, ob, nodes, totnode, sd->gravity_factor); + } + + if (brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) { + if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) { + SCULPT_cloth_sim_activate_nodes(ss->cache->cloth_sim, nodes, totnode); + SCULPT_cloth_brush_do_simulation_step(sd, ob, ss->cache->cloth_sim, nodes, totnode); + } + } + + MEM_SAFE_FREE(nodes); + + /* Update average stroke position. */ + copy_v3_v3(location, ss->cache->true_location); + mul_m4_v3(ob->obmat, location); + + add_v3_v3(ups->average_stroke_accum, location); + ups->average_stroke_counter++; + /* Update last stroke position. */ + ups->last_stroke_valid = true; } /* Flush displacement from deformed PBVH vertex to original mesh. */ @@ -6199,22 +6269,22 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob) PBVHNode **nodes; int totnode; - BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode); - - /* First line is tools that don't support proxies. */ - if (ss->cache->supports_gravity || (sculpt_tool_is_proxy_used(brush->sculpt_tool) == false)) { - SculptThreadedTaskData data = { - .sd = sd, - .ob = ob, - .brush = brush, - .nodes = nodes, - }; - - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, totnode); - BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings); + if (!ss->cache->supports_gravity && sculpt_tool_is_proxy_used(brush->sculpt_tool)) { + /* First line is tools that don't support proxies. */ + return; } + BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode); + SculptThreadedTaskData data = { + .sd = sd, + .ob = ob, + .brush = brush, + .nodes = nodes, + }; + + TaskParallelSettings settings; + BKE_pbvh_parallel_range_settings(&settings, true, totnode); + BLI_task_parallel_range(0, totnode, &data, sculpt_combine_proxies_task_cb, &settings); MEM_SAFE_FREE(nodes); } @@ -6235,12 +6305,14 @@ static void sculpt_update_keyblock(Object *ob) vertCos = BKE_pbvh_vert_coords_alloc(ss->pbvh); } - if (vertCos) { - SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos); + if (!vertCos) { + return; + } - if (vertCos != ss->orig_cos) { - MEM_freeN(vertCos); - } + SCULPT_vertcos_to_key(ob, ss->shapekey_active, vertCos); + + if (vertCos != ss->orig_cos) { + MEM_freeN(vertCos); } } @@ -6259,10 +6331,12 @@ static void SCULPT_flush_stroke_deform_task_cb(void *__restrict userdata, { sculpt_flush_pbvhvert_deform(ob, &vd); - if (vertCos) { - int index = vd.vert_indices[vd.i]; - copy_v3_v3(vertCos[index], ss->orig_cos[index]); + if (!vertCos) { + continue; } + + int index = vd.vert_indices[vd.i]; + copy_v3_v3(vertCos[index], ss->orig_cos[index]); } BKE_pbvh_vertex_iter_end; } @@ -6490,17 +6564,18 @@ static void do_symmetrical_brush_actions(Sculpt *sd, /* `symm` is a bit combination of XYZ - * 1 is mirror X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ for (int i = 0; i <= symm; i++) { - if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { - cache->mirror_symmetry_pass = i; - cache->radial_symmetry_pass = 0; - - SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0); - do_tiled(sd, ob, brush, ups, action); - - do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather); - do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather); - do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather); + if (!SCULPT_is_symmetry_iteration_valid(i, symm)) { + continue; } + cache->mirror_symmetry_pass = i; + cache->radial_symmetry_pass = 0; + + SCULPT_cache_calc_brushdata_symm(cache, i, 0, 0); + do_tiled(sd, ob, brush, ups, action); + + do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather); + do_radial_symmetry(sd, ob, brush, ups, action, i, 'Y', feather); + do_radial_symmetry(sd, ob, brush, ups, action, i, 'Z', feather); } } @@ -6668,22 +6743,25 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) ModifierData *md; for (md = ob->modifiers.first; md; md = md->next) { - if (md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) { - MirrorModifierData *mmd = (MirrorModifierData *)md; + if (!(md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime))) { + continue; + } + MirrorModifierData *mmd = (MirrorModifierData *)md; - if (mmd->flag & MOD_MIR_CLIPPING) { - /* Check each axis for mirroring. */ - for (int i = 0; i < 3; i++) { - if (mmd->flag & (MOD_MIR_AXIS_X << i)) { - /* Enable sculpt clipping. */ - ss->cache->flag |= CLIP_X << i; + if (!(mmd->flag & MOD_MIR_CLIPPING)) { + continue; + } + /* Check each axis for mirroring. */ + for (int i = 0; i < 3; i++) { + if (!(mmd->flag & (MOD_MIR_AXIS_X << i))) { + continue; + } + /* Enable sculpt clipping. */ + ss->cache->flag |= CLIP_X << i; - /* Update the clip tolerance. */ - if (mmd->tolerance > ss->cache->clip_tolerance[i]) { - ss->cache->clip_tolerance[i] = mmd->tolerance; - } - } - } + /* Update the clip tolerance. */ + if (mmd->tolerance > ss->cache->clip_tolerance[i]) { + ss->cache->clip_tolerance[i] = mmd->tolerance; } } } @@ -6926,150 +7004,151 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru }; int tool = brush->sculpt_tool; - if (ELEM(tool, - SCULPT_TOOL_PAINT, - SCULPT_TOOL_GRAB, - SCULPT_TOOL_ELASTIC_DEFORM, - SCULPT_TOOL_CLOTH, - SCULPT_TOOL_NUDGE, - SCULPT_TOOL_CLAY_STRIPS, - SCULPT_TOOL_PINCH, - SCULPT_TOOL_MULTIPLANE_SCRAPE, - SCULPT_TOOL_CLAY_THUMB, - SCULPT_TOOL_SNAKE_HOOK, - SCULPT_TOOL_POSE, - SCULPT_TOOL_BOUNDARY, - SCULPT_TOOL_THUMB) || - sculpt_brush_use_topology_rake(ss, brush)) { - float grab_location[3], imat[4][4], delta[3], loc[3]; + if (!ELEM(tool, + SCULPT_TOOL_PAINT, + SCULPT_TOOL_GRAB, + SCULPT_TOOL_ELASTIC_DEFORM, + SCULPT_TOOL_CLOTH, + SCULPT_TOOL_NUDGE, + SCULPT_TOOL_CLAY_STRIPS, + SCULPT_TOOL_PINCH, + SCULPT_TOOL_MULTIPLANE_SCRAPE, + SCULPT_TOOL_CLAY_THUMB, + SCULPT_TOOL_SNAKE_HOOK, + SCULPT_TOOL_POSE, + SCULPT_TOOL_BOUNDARY, + SCULPT_TOOL_THUMB) && + !sculpt_brush_use_topology_rake(ss, brush)) { + return; + } + float grab_location[3], imat[4][4], delta[3], loc[3]; - if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { - copy_v3_v3(cache->orig_grab_location, - SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss))); - } - else { - copy_v3_v3(cache->orig_grab_location, cache->true_location); - } - } - else if (tool == SCULPT_TOOL_SNAKE_HOOK || - (tool == SCULPT_TOOL_CLOTH && - brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) { - add_v3_v3(cache->true_location, cache->grab_delta); - } - - /* Compute 3d coordinate at same z from original location + mouse. */ - mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location); - ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location); - - /* Compute delta to move verts by. */ - if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - if (sculpt_needs_delta_from_anchored_origin(brush)) { - sub_v3_v3v3(delta, grab_location, cache->old_grab_location); - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, delta); - add_v3_v3(cache->grab_delta, delta); - } - else if (sculpt_needs_delta_for_tip_orientation(brush)) { - if (brush->flag & BRUSH_ANCHORED) { - float orig[3]; - mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location); - sub_v3_v3v3(cache->grab_delta, grab_location, orig); - } - else { - sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); - } - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, cache->grab_delta); - } - else { - /* Use for 'Brush.topology_rake_factor'. */ - sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); - } + if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { + copy_v3_v3(cache->orig_grab_location, + SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss))); } else { - zero_v3(cache->grab_delta); - } - - if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { - project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal); - } - - copy_v3_v3(cache->old_grab_location, grab_location); - - if (tool == SCULPT_TOOL_GRAB) { - if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { - copy_v3_v3(cache->anchored_location, cache->orig_grab_location); - } - else { - copy_v3_v3(cache->anchored_location, cache->true_location); - } - } - else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) { - copy_v3_v3(cache->anchored_location, cache->true_location); - } - else if (tool == SCULPT_TOOL_THUMB) { - copy_v3_v3(cache->anchored_location, cache->orig_grab_location); - } - - if (sculpt_needs_delta_from_anchored_origin(brush)) { - /* Location stays the same for finding vertices in brush radius. */ - copy_v3_v3(cache->true_location, cache->orig_grab_location); - - ups->draw_anchored = true; - copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse); - ups->anchored_size = ups->pixel_radius; - } - - /* Handle 'rake' */ - cache->is_rake_rotation_valid = false; - - invert_m4_m4(imat, ob->obmat); - mul_mat3_m4_v3(imat, grab_location); - - if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - copy_v3_v3(cache->rake_data.follow_co, grab_location); - } - - if (sculpt_brush_needs_rake_rotation(brush)) { - cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR; - - if (!is_zero_v3(cache->grab_delta)) { - const float eps = 0.00001f; - - float v1[3], v2[3]; - - copy_v3_v3(v1, cache->rake_data.follow_co); - copy_v3_v3(v2, cache->rake_data.follow_co); - sub_v3_v3(v2, cache->grab_delta); - - sub_v3_v3(v1, grab_location); - sub_v3_v3(v2, grab_location); - - if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) && - (len_squared_v3v3(v1, v2) > eps)) { - const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location); - const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ? - 1.0f : - sqrtf(rake_dist_sq) / cache->rake_data.follow_dist; - - float axis[3], angle; - float tquat[4]; - - rotation_between_vecs_to_quat(tquat, v1, v2); - - /* Use axis-angle to scale rotation since the factor may be above 1. */ - quat_to_axis_angle(axis, &angle, tquat); - normalize_v3(axis); - - angle *= brush->rake_factor * rake_fade; - axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle); - cache->is_rake_rotation_valid = true; - } - } - sculpt_rake_data_update(&cache->rake_data, grab_location); + copy_v3_v3(cache->orig_grab_location, cache->true_location); } } + else if (tool == SCULPT_TOOL_SNAKE_HOOK || + (tool == SCULPT_TOOL_CLOTH && + brush->cloth_deform_type == BRUSH_CLOTH_DEFORM_SNAKE_HOOK)) { + add_v3_v3(cache->true_location, cache->grab_delta); + } + + /* Compute 3d coordinate at same z from original location + mouse. */ + mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location); + ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location); + + /* Compute delta to move verts by. */ + if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + if (sculpt_needs_delta_from_anchored_origin(brush)) { + sub_v3_v3v3(delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, delta); + add_v3_v3(cache->grab_delta, delta); + } + else if (sculpt_needs_delta_for_tip_orientation(brush)) { + if (brush->flag & BRUSH_ANCHORED) { + float orig[3]; + mul_v3_m4v3(orig, ob->obmat, cache->orig_grab_location); + sub_v3_v3v3(cache->grab_delta, grab_location, orig); + } + else { + sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + } + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, cache->grab_delta); + } + else { + /* Use for 'Brush.topology_rake_factor'. */ + sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + } + } + else { + zero_v3(cache->grab_delta); + } + + if (brush->falloff_shape == PAINT_FALLOFF_SHAPE_TUBE) { + project_plane_v3_v3v3(cache->grab_delta, cache->grab_delta, ss->cache->true_view_normal); + } + + copy_v3_v3(cache->old_grab_location, grab_location); + + if (tool == SCULPT_TOOL_GRAB) { + if (brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { + copy_v3_v3(cache->anchored_location, cache->orig_grab_location); + } + else { + copy_v3_v3(cache->anchored_location, cache->true_location); + } + } + else if (tool == SCULPT_TOOL_ELASTIC_DEFORM || SCULPT_is_cloth_deform_brush(brush)) { + copy_v3_v3(cache->anchored_location, cache->true_location); + } + else if (tool == SCULPT_TOOL_THUMB) { + copy_v3_v3(cache->anchored_location, cache->orig_grab_location); + } + + if (sculpt_needs_delta_from_anchored_origin(brush)) { + /* Location stays the same for finding vertices in brush radius. */ + copy_v3_v3(cache->true_location, cache->orig_grab_location); + + ups->draw_anchored = true; + copy_v2_v2(ups->anchored_initial_mouse, cache->initial_mouse); + ups->anchored_size = ups->pixel_radius; + } + + /* Handle 'rake' */ + cache->is_rake_rotation_valid = false; + + invert_m4_m4(imat, ob->obmat); + mul_mat3_m4_v3(imat, grab_location); + + if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { + copy_v3_v3(cache->rake_data.follow_co, grab_location); + } + + if (!sculpt_brush_needs_rake_rotation(brush)) { + return; + } + cache->rake_data.follow_dist = cache->radius * SCULPT_RAKE_BRUSH_FACTOR; + + if (!is_zero_v3(cache->grab_delta)) { + const float eps = 0.00001f; + + float v1[3], v2[3]; + + copy_v3_v3(v1, cache->rake_data.follow_co); + copy_v3_v3(v2, cache->rake_data.follow_co); + sub_v3_v3(v2, cache->grab_delta); + + sub_v3_v3(v1, grab_location); + sub_v3_v3(v2, grab_location); + + if ((normalize_v3(v2) > eps) && (normalize_v3(v1) > eps) && (len_squared_v3v3(v1, v2) > eps)) { + const float rake_dist_sq = len_squared_v3v3(cache->rake_data.follow_co, grab_location); + const float rake_fade = (rake_dist_sq > square_f(cache->rake_data.follow_dist)) ? + 1.0f : + sqrtf(rake_dist_sq) / cache->rake_data.follow_dist; + + float axis[3], angle; + float tquat[4]; + + rotation_between_vecs_to_quat(tquat, v1, v2); + + /* Use axis-angle to scale rotation since the factor may be above 1. */ + quat_to_axis_angle(axis, &angle, tquat); + normalize_v3(axis); + + angle *= brush->rake_factor * rake_fade; + axis_angle_normalized_to_quat(cache->rake_rotation, axis, angle); + cache->is_rake_rotation_valid = true; + } + } + sculpt_rake_data_update(&cache->rake_data, grab_location); } static void sculpt_update_cache_paint_variants(StrokeCache *cache, const Brush *brush) @@ -7257,70 +7336,72 @@ void SCULPT_stroke_modifiers_check(const bContext *C, Object *ob, const Brush *b static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin) { - if (BKE_pbvh_node_get_tmin(node) < *tmin) { - SculptRaycastData *srd = data_v; - float(*origco)[3] = NULL; - bool use_origco = false; + if (BKE_pbvh_node_get_tmin(node) >= *tmin) { + return; + } + SculptRaycastData *srd = data_v; + float(*origco)[3] = NULL; + bool use_origco = false; - if (srd->original && srd->ss->cache) { - if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { - use_origco = true; - } - else { - /* Intersect with coordinates from before we started stroke. */ - SculptUndoNode *unode = SCULPT_undo_get_node(node); - origco = (unode) ? unode->co : NULL; - use_origco = origco ? true : false; - } + if (srd->original && srd->ss->cache) { + if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { + use_origco = true; } + else { + /* Intersect with coordinates from before we started stroke. */ + SculptUndoNode *unode = SCULPT_undo_get_node(node); + origco = (unode) ? unode->co : NULL; + use_origco = origco ? true : false; + } + } - if (BKE_pbvh_node_raycast(srd->ss->pbvh, - node, - origco, - use_origco, - srd->ray_start, - srd->ray_normal, - &srd->isect_precalc, - &srd->depth, - &srd->active_vertex_index, - &srd->active_face_grid_index, - srd->face_normal)) { - srd->hit = true; - *tmin = srd->depth; - } + if (BKE_pbvh_node_raycast(srd->ss->pbvh, + node, + origco, + use_origco, + srd->ray_start, + srd->ray_normal, + &srd->isect_precalc, + &srd->depth, + &srd->active_vertex_index, + &srd->active_face_grid_index, + srd->face_normal)) { + srd->hit = true; + *tmin = srd->depth; } } static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *tmin) { - if (BKE_pbvh_node_get_tmin(node) < *tmin) { - SculptFindNearestToRayData *srd = data_v; - float(*origco)[3] = NULL; - bool use_origco = false; + if (BKE_pbvh_node_get_tmin(node) >= *tmin) { + return; + } + SculptFindNearestToRayData *srd = data_v; + float(*origco)[3] = NULL; + bool use_origco = false; - if (srd->original && srd->ss->cache) { - if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { - use_origco = true; - } - else { - /* Intersect with coordinates from before we started stroke. */ - SculptUndoNode *unode = SCULPT_undo_get_node(node); - origco = (unode) ? unode->co : NULL; - use_origco = origco ? true : false; - } + if (srd->original && srd->ss->cache) { + if (BKE_pbvh_type(srd->ss->pbvh) == PBVH_BMESH) { + use_origco = true; } + else { + /* Intersect with coordinates from before we started stroke. */ + SculptUndoNode *unode = SCULPT_undo_get_node(node); + origco = (unode) ? unode->co : NULL; + use_origco = origco ? true : false; + } + } - if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh, - node, - origco, - use_origco, - srd->ray_start, - srd->ray_normal, - &srd->depth, - &srd->dist_sq_to_ray)) { - srd->hit = true; - *tmin = srd->dist_sq_to_ray; - } + if (BKE_pbvh_node_find_nearest_to_ray(srd->ss->pbvh, + node, + origco, + use_origco, + srd->ray_start, + srd->ray_normal, + &srd->depth, + &srd->dist_sq_to_ray)) { + srd->hit = true; + *tmin = srd->dist_sq_to_ray; } } @@ -7546,26 +7627,30 @@ bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2]) } } - if (!hit) { - if (ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) { - SculptFindNearestToRayData srd = { - .original = original, - .ss = ob->sculpt, - .hit = false, - .ray_start = ray_start, - .ray_normal = ray_normal, - .depth = FLT_MAX, - .dist_sq_to_ray = FLT_MAX, - }; - BKE_pbvh_find_nearest_to_ray( - ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original); - if (srd.hit) { - hit = true; - copy_v3_v3(out, ray_normal); - mul_v3_fl(out, srd.depth); - add_v3_v3(out, ray_start); - } - } + if (hit) { + return hit; + } + + if (!ELEM(brush->falloff_shape, PAINT_FALLOFF_SHAPE_TUBE)) { + return hit; + } + + SculptFindNearestToRayData srd = { + .original = original, + .ss = ob->sculpt, + .hit = false, + .ray_start = ray_start, + .ray_normal = ray_normal, + .depth = FLT_MAX, + .dist_sq_to_ray = FLT_MAX, + }; + BKE_pbvh_find_nearest_to_ray( + ss->pbvh, sculpt_find_nearest_to_ray_cb, &srd, ray_start, ray_normal, srd.original); + if (srd.hit) { + hit = true; + copy_v3_v3(out, ray_normal); + mul_v3_fl(out, srd.depth); + add_v3_v3(out, ray_start); } return hit; @@ -7748,19 +7833,20 @@ void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType up bScreen *screen = WM_window_get_active_screen(win); LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { SpaceLink *sl = area->spacedata.first; - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - if (v3d != current_v3d) { - need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d); - } + if (sl->spacetype != SPACE_VIEW3D) { + continue; + } + View3D *v3d = (View3D *)sl; + if (v3d != current_v3d) { + need_tag |= !BKE_sculptsession_use_pbvh_draw(ob, v3d); + } - /* Tag all 3D viewports for redraw now that we are done. Others - * viewports did not get a full redraw, and anti-aliasing for the - * current viewport was deactivated. */ - LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { - if (region->regiontype == RGN_TYPE_WINDOW) { - ED_region_tag_redraw(region); - } + /* Tag all 3D viewports for redraw now that we are done. Others + * viewports did not get a full redraw, and anti-aliasing for the + * current viewport was deactivated. */ + LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { + if (region->regiontype == RGN_TYPE_WINDOW) { + ED_region_tag_redraw(region); } } } @@ -7920,55 +8006,56 @@ static void sculpt_stroke_done(const bContext *C, struct PaintStroke *UNUSED(str Sculpt *sd = CTX_data_tool_settings(C)->sculpt; /* Finished. */ - if (ss->cache) { - UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings; - Brush *brush = BKE_paint_brush(&sd->paint); - BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */ - ups->draw_inverted = false; + if (!ss->cache) { + sculpt_brush_exit_tex(sd); + return; + } + UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings; + Brush *brush = BKE_paint_brush(&sd->paint); + BLI_assert(brush == ss->cache->brush); /* const, so we shouldn't change. */ + ups->draw_inverted = false; - SCULPT_stroke_modifiers_check(C, ob, brush); - - /* Alt-Smooth. */ - if (ss->cache->alt_smooth) { - if (brush->sculpt_tool == SCULPT_TOOL_MASK) { - brush->mask_tool = ss->cache->saved_mask_brush_tool; - } - else if (ELEM(brush->sculpt_tool, - SCULPT_TOOL_SLIDE_RELAX, - SCULPT_TOOL_DRAW_FACE_SETS, - SCULPT_TOOL_PAINT, - SCULPT_TOOL_SMEAR)) { - /* Do nothing. */ - } - else { - BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size); - brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name); - if (brush) { - BKE_paint_brush_set(&sd->paint, brush); - } - } - } - - if (SCULPT_is_automasking_enabled(sd, ss, brush)) { - SCULPT_automasking_cache_free(ss->cache->automasking); - } - - BKE_pbvh_node_color_buffer_free(ss->pbvh); - SCULPT_cache_free(ss->cache); - ss->cache = NULL; - - SCULPT_undo_push_end(); + SCULPT_stroke_modifiers_check(C, ob, brush); + /* Alt-Smooth. */ + if (ss->cache->alt_smooth) { if (brush->sculpt_tool == SCULPT_TOOL_MASK) { - SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); + brush->mask_tool = ss->cache->saved_mask_brush_tool; + } + else if (ELEM(brush->sculpt_tool, + SCULPT_TOOL_SLIDE_RELAX, + SCULPT_TOOL_DRAW_FACE_SETS, + SCULPT_TOOL_PAINT, + SCULPT_TOOL_SMEAR)) { + /* Do nothing. */ } else { - SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS); + BKE_brush_size_set(scene, brush, ss->cache->saved_smooth_size); + brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, ss->cache->saved_active_brush_name); + if (brush) { + BKE_paint_brush_set(&sd->paint, brush); + } } - - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); } + if (SCULPT_is_automasking_enabled(sd, ss, brush)) { + SCULPT_automasking_cache_free(ss->cache->automasking); + } + + BKE_pbvh_node_color_buffer_free(ss->pbvh); + SCULPT_cache_free(ss->cache); + ss->cache = NULL; + + SCULPT_undo_push_end(); + + if (brush->sculpt_tool == SCULPT_TOOL_MASK) { + SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); + } + else { + SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COORDS); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); sculpt_brush_exit_tex(sd); } @@ -8090,21 +8177,22 @@ static int sculpt_set_persistent_base_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; - if (ss) { - SCULPT_vertex_random_access_ensure(ss); - BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false); + if (!ss) { + return OPERATOR_FINISHED; + } + SCULPT_vertex_random_access_ensure(ss); + BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false); - MEM_SAFE_FREE(ss->persistent_base); + MEM_SAFE_FREE(ss->persistent_base); - const int totvert = SCULPT_vertex_count_get(ss); - ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert, - "layer persistent base"); + const int totvert = SCULPT_vertex_count_get(ss); + ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert, + "layer persistent base"); - for (int i = 0; i < totvert; i++) { - copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, i)); - SCULPT_vertex_normal_get(ss, i, ss->persistent_base[i].no); - ss->persistent_base[i].disp = 0.0f; - } + for (int i = 0; i < totvert; i++) { + copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, i)); + SCULPT_vertex_normal_get(ss, i, ss->persistent_base[i].no); + ss->persistent_base[i].disp = 0.0f; } return OPERATOR_FINISHED; @@ -8564,12 +8652,13 @@ void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession *ss, float totpoints++; ss->preview_vert_index_list[totpoints] = to_v; totpoints++; - if (!BLI_BITMAP_TEST(visited_vertices, to_v)) { - BLI_BITMAP_ENABLE(visited_vertices, to_v); - const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v); - if (len_squared_v3v3(brush_co, co) < radius * radius) { - BLI_gsqueue_push(not_visited_vertices, &to_v); - } + if (BLI_BITMAP_TEST(visited_vertices, to_v)) { + continue; + } + BLI_BITMAP_ENABLE(visited_vertices, to_v); + const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v); + if (len_squared_v3v3(brush_co, co) < radius * radius) { + BLI_gsqueue_push(not_visited_vertices, &to_v); } } } @@ -9099,11 +9188,12 @@ static void do_mask_by_color_contiguous_update_nodes_cb( const float current_mask = *vd.mask; const float new_mask = data->mask_by_color_floodfill[vd.index]; *vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask); - if (current_mask != *vd.mask) { - update_node = true; - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (current_mask == *vd.mask) { + continue; + } + update_node = true; + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -9206,11 +9296,12 @@ static void do_mask_by_color_task_cb(void *__restrict userdata, const float new_mask = sculpt_mask_by_color_delta_get(active_color, vd.col, threshold, invert); *vd.mask = sculpt_mask_by_color_final_mask_get(current_mask, new_mask, invert, preserve_mask); - if (current_mask != *vd.mask) { - update_node = true; - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (current_mask == *vd.mask) { + continue; + } + update_node = true; + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.c b/source/blender/editors/sculpt_paint/sculpt_automasking.c index bb68ec56b25..5f5fb51d75f 100644 --- a/source/blender/editors/sculpt_paint/sculpt_automasking.c +++ b/source/blender/editors/sculpt_paint/sculpt_automasking.c @@ -298,24 +298,26 @@ float *SCULPT_boundary_automasking_init(Object *ob, for (int propagation_it = 0; propagation_it < propagation_steps; propagation_it++) { for (int i = 0; i < totvert; i++) { - if (edge_distance[i] == EDGE_DISTANCE_INF) { - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, i, ni) { - if (edge_distance[ni.index] == propagation_it) { - edge_distance[i] = propagation_it + 1; - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + if (edge_distance[i] != EDGE_DISTANCE_INF) { + continue; } + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, i, ni) { + if (edge_distance[ni.index] == propagation_it) { + edge_distance[i] = propagation_it + 1; + } + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); } } for (int i = 0; i < totvert; i++) { - if (edge_distance[i] != EDGE_DISTANCE_INF) { - const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps); - const float edge_boundary_automask = pow2f(p); - automask_factor[i] *= (1.0f - edge_boundary_automask); + if (edge_distance[i] == EDGE_DISTANCE_INF) { + continue; } + const float p = 1.0f - ((float)edge_distance[i] / (float)propagation_steps); + const float edge_boundary_automask = pow2f(p); + automask_factor[i] *= (1.0f - edge_boundary_automask); } MEM_SAFE_FREE(edge_distance); diff --git a/source/blender/editors/sculpt_paint/sculpt_boundary.c b/source/blender/editors/sculpt_paint/sculpt_boundary.c index 0cfb6f17adb..fca19c04b98 100644 --- a/source/blender/editors/sculpt_paint/sculpt_boundary.c +++ b/source/blender/editors/sculpt_paint/sculpt_boundary.c @@ -227,19 +227,19 @@ static bool boundary_floodfill_cb( { BoundaryFloodFillData *data = userdata; SculptBoundary *boundary = data->boundary; - if (SCULPT_vertex_is_boundary(ss, to_v)) { - const float edge_len = len_v3v3(SCULPT_vertex_co_get(ss, from_v), - SCULPT_vertex_co_get(ss, to_v)); - const float distance_boundary_to_dst = boundary->distance ? - boundary->distance[from_v] + edge_len : - 0.0f; - sculpt_boundary_index_add(boundary, to_v, distance_boundary_to_dst, data->included_vertices); - if (!is_duplicate) { - sculpt_boundary_preview_edge_add(boundary, from_v, to_v); - } - return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v); + if (!SCULPT_vertex_is_boundary(ss, to_v)) { + return false; } - return false; + const float edge_len = len_v3v3(SCULPT_vertex_co_get(ss, from_v), + SCULPT_vertex_co_get(ss, to_v)); + const float distance_boundary_to_dst = boundary->distance ? + boundary->distance[from_v] + edge_len : + 0.0f; + sculpt_boundary_index_add(boundary, to_v, distance_boundary_to_dst, data->included_vertices); + if (!is_duplicate) { + sculpt_boundary_preview_edge_add(boundary, from_v, to_v); + } + return sculpt_boundary_is_vertex_in_editable_boundary(ss, to_v); } static void sculpt_boundary_indices_init(SculptSession *ss, @@ -360,49 +360,50 @@ static void sculpt_boundary_edit_data_init(SculptSession *ss, SculptVertexNeighborIter ni; SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) { const bool is_visible = SCULPT_vertex_visible_get(ss, ni.index); - if (is_visible && - boundary->edit_info[ni.index].num_propagation_steps == BOUNDARY_STEPS_NONE) { - boundary->edit_info[ni.index].original_vertex = - boundary->edit_info[from_v].original_vertex; + if (!is_visible || + boundary->edit_info[ni.index].num_propagation_steps != BOUNDARY_STEPS_NONE) { + continue; + } + boundary->edit_info[ni.index].original_vertex = + boundary->edit_info[from_v].original_vertex; - BLI_BITMAP_ENABLE(visited_vertices, ni.index); + BLI_BITMAP_ENABLE(visited_vertices, ni.index); - if (ni.is_duplicate) { - /* Grids duplicates handling. */ - boundary->edit_info[ni.index].num_propagation_steps = - boundary->edit_info[from_v].num_propagation_steps; - } - else { - boundary->edit_info[ni.index].num_propagation_steps = - boundary->edit_info[from_v].num_propagation_steps + 1; + if (ni.is_duplicate) { + /* Grids duplicates handling. */ + boundary->edit_info[ni.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps; + } + else { + boundary->edit_info[ni.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps + 1; - BLI_gsqueue_push(next_iteration, &ni.index); + BLI_gsqueue_push(next_iteration, &ni.index); - /* When copying the data to the neighbor for the next iteration, it has to be copied to - * all its duplicates too. This is because it is not possible to know if the updated - * neighbor or one if its uninitialized duplicates is going to come first in order to - * copy the data in the from_v neighbor iterator. */ - if (has_duplicates) { - SculptVertexNeighborIter ni_duplis; - SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, ni.index, ni_duplis) { - if (ni_duplis.is_duplicate) { - boundary->edit_info[ni_duplis.index].original_vertex = - boundary->edit_info[from_v].original_vertex; - boundary->edit_info[ni_duplis.index].num_propagation_steps = - boundary->edit_info[from_v].num_propagation_steps + 1; - } + /* When copying the data to the neighbor for the next iteration, it has to be copied to + * all its duplicates too. This is because it is not possible to know if the updated + * neighbor or one if its uninitialized duplicates is going to come first in order to + * copy the data in the from_v neighbor iterator. */ + if (has_duplicates) { + SculptVertexNeighborIter ni_duplis; + SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN (ss, ni.index, ni_duplis) { + if (ni_duplis.is_duplicate) { + boundary->edit_info[ni_duplis.index].original_vertex = + boundary->edit_info[from_v].original_vertex; + boundary->edit_info[ni_duplis.index].num_propagation_steps = + boundary->edit_info[from_v].num_propagation_steps + 1; } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis); } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni_duplis); + } - /* Check the distance using the vertex that was propagated from the initial vertex that - * was used to initialize the boundary. */ - if (boundary->edit_info[from_v].original_vertex == initial_vertex) { - boundary->pivot_vertex = ni.index; - copy_v3_v3(boundary->initial_pivot_position, SCULPT_vertex_co_get(ss, ni.index)); - accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v), - SCULPT_vertex_co_get(ss, ni.index)); - } + /* Check the distance using the vertex that was propagated from the initial vertex that + * was used to initialize the boundary. */ + if (boundary->edit_info[from_v].original_vertex == initial_vertex) { + boundary->pivot_vertex = ni.index; + copy_v3_v3(boundary->initial_pivot_position, SCULPT_vertex_co_get(ss, ni.index)); + accum_distance += len_v3v3(SCULPT_vertex_co_get(ss, from_v), + SCULPT_vertex_co_get(ss, ni.index)); } } } @@ -552,28 +553,30 @@ static void sculpt_boundary_bend_data_init(SculptSession *ss, SculptBoundary *bo totvert, 3 * sizeof(float), "pivot positions"); for (int i = 0; i < totvert; i++) { - if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) { - float dir[3]; - float normal[3]; - SCULPT_vertex_normal_get(ss, i, normal); - sub_v3_v3v3(dir, - SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), - SCULPT_vertex_co_get(ss, i)); - cross_v3_v3v3( - boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex], dir, normal); - normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); - copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex], - SCULPT_vertex_co_get(ss, i)); + if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) { + continue; } + float dir[3]; + float normal[3]; + SCULPT_vertex_normal_get(ss, i, normal); + sub_v3_v3v3(dir, + SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), + SCULPT_vertex_co_get(ss, i)); + cross_v3_v3v3( + boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex], dir, normal); + normalize_v3(boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); + copy_v3_v3(boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex], + SCULPT_vertex_co_get(ss, i)); } for (int i = 0; i < totvert; i++) { - if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) { - copy_v3_v3(boundary->bend.pivot_positions[i], - boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex]); - copy_v3_v3(boundary->bend.pivot_rotation_axis[i], - boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); + if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) { + continue; } + copy_v3_v3(boundary->bend.pivot_positions[i], + boundary->bend.pivot_positions[boundary->edit_info[i].original_vertex]); + copy_v3_v3(boundary->bend.pivot_rotation_axis[i], + boundary->bend.pivot_rotation_axis[boundary->edit_info[i].original_vertex]); } } @@ -583,19 +586,20 @@ static void sculpt_boundary_slide_data_init(SculptSession *ss, SculptBoundary *b boundary->slide.directions = MEM_calloc_arrayN(totvert, 3 * sizeof(float), "slide directions"); for (int i = 0; i < totvert; i++) { - if (boundary->edit_info[i].num_propagation_steps == boundary->max_propagation_steps) { - sub_v3_v3v3(boundary->slide.directions[boundary->edit_info[i].original_vertex], - SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), - SCULPT_vertex_co_get(ss, i)); - normalize_v3(boundary->slide.directions[boundary->edit_info[i].original_vertex]); + if (boundary->edit_info[i].num_propagation_steps != boundary->max_propagation_steps) { } + sub_v3_v3v3(boundary->slide.directions[boundary->edit_info[i].original_vertex], + SCULPT_vertex_co_get(ss, boundary->edit_info[i].original_vertex), + SCULPT_vertex_co_get(ss, i)); + normalize_v3(boundary->slide.directions[boundary->edit_info[i].original_vertex]); } for (int i = 0; i < totvert; i++) { - if (boundary->edit_info[i].num_propagation_steps != BOUNDARY_STEPS_NONE) { - copy_v3_v3(boundary->slide.directions[i], - boundary->slide.directions[boundary->edit_info[i].original_vertex]); + if (boundary->edit_info[i].num_propagation_steps == BOUNDARY_STEPS_NONE) { + continue; } + copy_v3_v3(boundary->slide.directions[i], + boundary->slide.directions[boundary->edit_info[i].original_vertex]); } } @@ -662,24 +666,27 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); - float t_orig_co[3]; - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]); - rotate_v3_v3v3fl(target_co, - t_orig_co, - boundary->bend.pivot_rotation_axis[vd.index], - angle * boundary->edit_info[vd.index].strength_factor * mask * automask); - add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float t_orig_co[3]; + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]); + rotate_v3_v3v3fl(target_co, + t_orig_co, + boundary->bend.pivot_rotation_axis[vd.index], + angle * boundary->edit_info[vd.index].strength_factor * mask * automask); + add_v3_v3(target_co, boundary->bend.pivot_positions[vd.index]); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -708,22 +715,25 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - madd_v3_v3v3fl(target_co, - orig_data.co, - boundary->slide.directions[vd.index], - boundary->edit_info[vd.index].strength_factor * disp * mask * automask * - strength); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + boundary->slide.directions[vd.index], + boundary->edit_info[vd.index].strength_factor * disp * mask * automask * + strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -752,24 +762,27 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); - float normal[3]; - normal_short_to_float_v3(normal, orig_data.no); - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - madd_v3_v3v3fl(target_co, - orig_data.co, - normal, - boundary->edit_info[vd.index].strength_factor * disp * mask * automask * - strength); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float normal[3]; + normal_short_to_float_v3(normal, orig_data.no); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + normal, + boundary->edit_info[vd.index].strength_factor * disp * mask * automask * + strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -796,21 +809,24 @@ static void do_boundary_brush_grab_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - madd_v3_v3v3fl(target_co, - orig_data.co, - ss->cache->grab_delta_symmetry, - boundary->edit_info[vd.index].strength_factor * mask * automask * strength); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + madd_v3_v3v3fl(target_co, + orig_data.co, + ss->cache->grab_delta_symmetry, + boundary->edit_info[vd.index].strength_factor * mask * automask * strength); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } @@ -845,24 +861,27 @@ static void do_boundary_brush_twist_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - - if (boundary->edit_info[vd.index].num_propagation_steps != -1) { - SCULPT_orig_vert_data_update(&orig_data, &vd); - if (SCULPT_check_vertex_pivot_symmetry( - orig_data.co, boundary->initial_vertex_position, symm)) { - const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; - const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); - float t_orig_co[3]; - float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); - sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position); - rotate_v3_v3v3fl(target_co, - t_orig_co, - boundary->twist.rotation_axis, - angle * mask * automask * boundary->edit_info[vd.index].strength_factor); - add_v3_v3(target_co, boundary->twist.pivot_position); - } + if (boundary->edit_info[vd.index].num_propagation_steps == -1) { + continue; } + SCULPT_orig_vert_data_update(&orig_data, &vd); + if (!SCULPT_check_vertex_pivot_symmetry( + orig_data.co, boundary->initial_vertex_position, symm)) { + continue; + } + + const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f; + const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index); + float t_orig_co[3]; + float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd); + sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position); + rotate_v3_v3v3fl(target_co, + t_orig_co, + boundary->twist.rotation_axis, + angle * mask * automask * boundary->edit_info[vd.index].strength_factor); + add_v3_v3(target_co, boundary->twist.pivot_position); + if (vd.mvert) { vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c index c97f31fa682..16d10f6d6bb 100644 --- a/source/blender/editors/sculpt_paint/sculpt_cloth.c +++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c @@ -540,97 +540,98 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata, cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, vertex_gravity, vd.index); /* When using the plane falloff mode the falloff is not constrained by the brush radius. */ - if (sculpt_brush_test_sq_fn(&test, current_vertex_location) || use_falloff_plane) { - - float dist = sqrtf(test.dist); - - if (use_falloff_plane) { - dist = dist_to_plane_v3(current_vertex_location, deform_plane); - } - - const float fade = sim_factor * bstrength * - SCULPT_brush_strength_factor(ss, - brush, - current_vertex_location, - dist, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - - float brush_disp[3]; - float normal[3]; - if (vd.no) { - normal_short_to_float_v3(normal, vd.no); - } - else { - copy_v3_v3(normal, vd.fno); - } - - switch (brush->cloth_deform_type) { - case BRUSH_CLOTH_DEFORM_DRAG: - sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location); - normalize_v3(brush_disp); - mul_v3_v3fl(force, brush_disp, fade); - break; - case BRUSH_CLOTH_DEFORM_PUSH: - /* Invert the fade to push inwards. */ - mul_v3_v3fl(force, offset, -fade); - break; - case BRUSH_CLOTH_DEFORM_GRAB: - madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index], - cloth_sim->init_pos[vd.index], - ss->cache->grab_delta_symmetry, - fade); - if (use_falloff_plane) { - cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f); - } - else { - cloth_sim->deformation_strength[vd.index] = 1.0f; - } - zero_v3(force); - break; - case BRUSH_CLOTH_DEFORM_SNAKE_HOOK: - copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]); - madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade); - cloth_sim->deformation_strength[vd.index] = fade; - zero_v3(force); - break; - case BRUSH_CLOTH_DEFORM_PINCH_POINT: - if (use_falloff_plane) { - float distance = dist_signed_to_plane_v3(vd.co, deform_plane); - copy_v3_v3(brush_disp, plane_normal); - mul_v3_fl(brush_disp, -distance); - } - else { - sub_v3_v3v3(brush_disp, ss->cache->location, vd.co); - } - normalize_v3(brush_disp); - mul_v3_v3fl(force, brush_disp, fade); - break; - case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: { - float disp_center[3]; - float x_disp[3]; - float z_disp[3]; - sub_v3_v3v3(disp_center, ss->cache->location, vd.co); - normalize_v3(disp_center); - mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); - mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); - add_v3_v3v3(disp_center, x_disp, z_disp); - mul_v3_v3fl(force, disp_center, fade); - } break; - case BRUSH_CLOTH_DEFORM_INFLATE: - mul_v3_v3fl(force, normal, fade); - break; - case BRUSH_CLOTH_DEFORM_EXPAND: - cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f; - zero_v3(force); - break; - } - - cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index); + if (!sculpt_brush_test_sq_fn(&test, current_vertex_location) && !use_falloff_plane) { + continue; } + + float dist = sqrtf(test.dist); + + if (use_falloff_plane) { + dist = dist_to_plane_v3(current_vertex_location, deform_plane); + } + + const float fade = sim_factor * bstrength * + SCULPT_brush_strength_factor(ss, + brush, + current_vertex_location, + dist, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + + float brush_disp[3]; + float normal[3]; + if (vd.no) { + normal_short_to_float_v3(normal, vd.no); + } + else { + copy_v3_v3(normal, vd.fno); + } + + switch (brush->cloth_deform_type) { + case BRUSH_CLOTH_DEFORM_DRAG: + sub_v3_v3v3(brush_disp, ss->cache->location, ss->cache->last_location); + normalize_v3(brush_disp); + mul_v3_v3fl(force, brush_disp, fade); + break; + case BRUSH_CLOTH_DEFORM_PUSH: + /* Invert the fade to push inwards. */ + mul_v3_v3fl(force, offset, -fade); + break; + case BRUSH_CLOTH_DEFORM_GRAB: + madd_v3_v3v3fl(cloth_sim->deformation_pos[vd.index], + cloth_sim->init_pos[vd.index], + ss->cache->grab_delta_symmetry, + fade); + if (use_falloff_plane) { + cloth_sim->deformation_strength[vd.index] = clamp_f(fade, 0.0f, 1.0f); + } + else { + cloth_sim->deformation_strength[vd.index] = 1.0f; + } + zero_v3(force); + break; + case BRUSH_CLOTH_DEFORM_SNAKE_HOOK: + copy_v3_v3(cloth_sim->deformation_pos[vd.index], cloth_sim->pos[vd.index]); + madd_v3_v3fl(cloth_sim->deformation_pos[vd.index], ss->cache->grab_delta_symmetry, fade); + cloth_sim->deformation_strength[vd.index] = fade; + zero_v3(force); + break; + case BRUSH_CLOTH_DEFORM_PINCH_POINT: + if (use_falloff_plane) { + float distance = dist_signed_to_plane_v3(vd.co, deform_plane); + copy_v3_v3(brush_disp, plane_normal); + mul_v3_fl(brush_disp, -distance); + } + else { + sub_v3_v3v3(brush_disp, ss->cache->location, vd.co); + } + normalize_v3(brush_disp); + mul_v3_v3fl(force, brush_disp, fade); + break; + case BRUSH_CLOTH_DEFORM_PINCH_PERPENDICULAR: { + float disp_center[3]; + float x_disp[3]; + float z_disp[3]; + sub_v3_v3v3(disp_center, ss->cache->location, vd.co); + normalize_v3(disp_center); + mul_v3_v3fl(x_disp, x_object_space, dot_v3v3(disp_center, x_object_space)); + mul_v3_v3fl(z_disp, z_object_space, dot_v3v3(disp_center, z_object_space)); + add_v3_v3v3(disp_center, x_disp, z_disp); + mul_v3_v3fl(force, disp_center, fade); + } break; + case BRUSH_CLOTH_DEFORM_INFLATE: + mul_v3_v3fl(force, normal, fade); + break; + case BRUSH_CLOTH_DEFORM_EXPAND: + cloth_sim->length_constraint_tweak[vd.index] += fade * 0.1f; + zero_v3(force); + break; + } + + cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index); } BKE_pbvh_vertex_iter_end; } @@ -644,17 +645,22 @@ static ListBase *cloth_brush_collider_cache_create(Depsgraph *depsgraph) DEG_ITER_OBJECT_FLAG_DUPLI) { CollisionModifierData *cmd = (CollisionModifierData *)BKE_modifiers_findby_type( ob, eModifierType_Collision); - if (cmd && cmd->bvhtree) { - if (cache == NULL) { - cache = MEM_callocN(sizeof(ListBase), "ColliderCache array"); - } - - ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); - col->ob = ob; - col->collmd = cmd; - collision_move_object(cmd, 1.0, 0.0, true); - BLI_addtail(cache, col); + if (!cmd) { + continue; } + + if (!cmd->bvhtree) { + continue; + } + if (cache == NULL) { + cache = MEM_callocN(sizeof(ListBase), "ColliderCache array"); + } + + ColliderCache *col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); + col->ob = ob; + col->collmd = cmd; + collision_move_object(cmd, 1.0, 0.0, true); + BLI_addtail(cache, col); } DEG_OBJECT_ITER_END; return cache; @@ -734,26 +740,27 @@ static void cloth_brush_solve_collision(Object *object, &col, raycast_flag); - if (hit.index != -1) { - - float collision_disp[3]; - float movement_disp[3]; - mul_v3_v3fl(collision_disp, hit.no, 0.005f); - sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space); - float friction_plane[4]; - float pos_on_friction_plane[3]; - plane_from_point_normal_v3(friction_plane, hit.co, hit.no); - closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space); - sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co); - - /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */ - mul_v3_fl(movement_disp, 0.35f); - - copy_v3_v3(cloth_sim->pos[i], hit.co); - add_v3_v3(cloth_sim->pos[i], movement_disp); - add_v3_v3(cloth_sim->pos[i], collision_disp); - mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]); + if (hit.index == -1) { + continue; } + + float collision_disp[3]; + float movement_disp[3]; + mul_v3_v3fl(collision_disp, hit.no, 0.005f); + sub_v3_v3v3(movement_disp, pos_world_space, prev_pos_world_space); + float friction_plane[4]; + float pos_on_friction_plane[3]; + plane_from_point_normal_v3(friction_plane, hit.co, hit.no); + closest_to_plane_v3(pos_on_friction_plane, friction_plane, pos_world_space); + sub_v3_v3v3(movement_disp, pos_on_friction_plane, hit.co); + + /* TODO(pablodp606): This can be exposed in a brush/filter property as friction. */ + mul_v3_fl(movement_disp, 0.35f); + + copy_v3_v3(cloth_sim->pos[i], hit.co); + add_v3_v3(cloth_sim->pos[i], movement_disp); + add_v3_v3(cloth_sim->pos[i], collision_disp); + mul_v3_m4v3(cloth_sim->pos[i], obmat_inv, cloth_sim->pos[i]); } } @@ -784,38 +791,40 @@ static void do_cloth_brush_solve_simulation_task_cb_ex( ss->cache ? cloth_brush_simulation_falloff_get( brush, ss->cache->radius, sim_location, cloth_sim->init_pos[vd.index]) : 1.0f; - if (sim_factor > 0.0f) { - int i = vd.index; - float temp[3]; - copy_v3_v3(temp, cloth_sim->pos[i]); + if (sim_factor <= 0.0f) { + continue; + } - mul_v3_fl(cloth_sim->acceleration[i], time_step); + int i = vd.index; + float temp[3]; + copy_v3_v3(temp, cloth_sim->pos[i]); - float pos_diff[3]; - sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]); - mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor); + mul_v3_fl(cloth_sim->acceleration[i], time_step); - const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) * - SCULPT_automasking_factor_get(automasking, ss, vd.index); + float pos_diff[3]; + sub_v3_v3v3(pos_diff, cloth_sim->pos[i], cloth_sim->prev_pos[i]); + mul_v3_fl(pos_diff, (1.0f - cloth_sim->damping) * sim_factor); - madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v); - madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v); + const float mask_v = (1.0f - (vd.mask ? *vd.mask : 0.0f)) * + SCULPT_automasking_factor_get(automasking, ss, vd.index); - if (cloth_sim->collider_list != NULL) { - cloth_brush_solve_collision(data->ob, cloth_sim, i); - } + madd_v3_v3fl(cloth_sim->pos[i], pos_diff, mask_v); + madd_v3_v3fl(cloth_sim->pos[i], cloth_sim->acceleration[i], mask_v); - copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); + if (cloth_sim->collider_list != NULL) { + cloth_brush_solve_collision(data->ob, cloth_sim, i); + } - copy_v3_v3(cloth_sim->prev_pos[i], temp); - copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); - copy_v3_fl(cloth_sim->acceleration[i], 0.0f); + copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); - copy_v3_v3(vd.co, cloth_sim->pos[vd.index]); + copy_v3_v3(cloth_sim->prev_pos[i], temp); + copy_v3_v3(cloth_sim->last_iteration_pos[i], cloth_sim->pos[i]); + copy_v3_fl(cloth_sim->acceleration[i], 0.0f); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + copy_v3_v3(vd.co, cloth_sim->pos[vd.index]); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.c b/source/blender/editors/sculpt_paint/sculpt_face_set.c index 20d8e136d12..df03d2adeaf 100644 --- a/source/blender/editors/sculpt_paint/sculpt_face_set.c +++ b/source/blender/editors/sculpt_paint/sculpt_face_set.c @@ -148,40 +148,42 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata, float poly_center[3]; BKE_mesh_calc_poly_center(p, &ss->mloop[p->loopstart], mvert, poly_center); - if (sculpt_brush_test_sq_fn(&test, poly_center)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, poly_center)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) { - ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set); - } + if (fade > 0.05f && ss->face_sets[vert_map->indices[j]] > 0) { + ss->face_sets[vert_map->indices[j]] = abs(ss->cache->paint_face_set); } } } else if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) { { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (fade > 0.05f) { - SCULPT_vertex_face_set_set(ss, vd.index, ss->cache->paint_face_set); - } + if (fade > 0.05f) { + SCULPT_vertex_face_set_set(ss, vd.index, ss->cache->paint_face_set); } } } @@ -214,23 +216,26 @@ static void do_relax_face_sets_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - if (relax_face_sets != SCULPT_vertex_has_unique_face_set(ss, vd.index)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + if (relax_face_sets == SCULPT_vertex_has_unique_face_set(ss, vd.index)) { + continue; + } - SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + + SCULPT_relax_vertex(ss, &vd, fade * bstrength, relax_face_sets, vd.co); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -582,44 +587,49 @@ static void sculpt_face_sets_init_flood_fill(Object *ob, int next_face_set = 1; for (int i = 0; i < totfaces; i++) { - if (!BLI_BITMAP_TEST(visited_faces, i)) { - GSQueue *queue; - queue = BLI_gsqueue_new(sizeof(int)); + if (BLI_BITMAP_TEST(visited_faces, i)) { + continue; + } + GSQueue *queue; + queue = BLI_gsqueue_new(sizeof(int)); - face_sets[i] = next_face_set; - BLI_BITMAP_ENABLE(visited_faces, i); - BLI_gsqueue_push(queue, &i); + face_sets[i] = next_face_set; + BLI_BITMAP_ENABLE(visited_faces, i); + BLI_gsqueue_push(queue, &i); - while (!BLI_gsqueue_is_empty(queue)) { - int from_f; - BLI_gsqueue_pop(queue, &from_f); + while (!BLI_gsqueue_is_empty(queue)) { + int from_f; + BLI_gsqueue_pop(queue, &from_f); - BMFace *f, *f_neighbor; - BMEdge *ed; - BMIter iter_a, iter_b; + BMFace *f, *f_neighbor; + BMEdge *ed; + BMIter iter_a, iter_b; - f = BM_face_at_index(bm, from_f); + f = BM_face_at_index(bm, from_f); - BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) { - BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) { - if (f_neighbor != f) { - int neighbor_face_index = BM_elem_index_get(f_neighbor); - if (!BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) { - if (test(bm, f, ed, f_neighbor, threshold)) { - face_sets[neighbor_face_index] = next_face_set; - BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index); - BLI_gsqueue_push(queue, &neighbor_face_index); - } - } - } + BM_ITER_ELEM (ed, &iter_a, f, BM_EDGES_OF_FACE) { + BM_ITER_ELEM (f_neighbor, &iter_b, ed, BM_FACES_OF_EDGE) { + if (f_neighbor == f) { + continue; } + int neighbor_face_index = BM_elem_index_get(f_neighbor); + if (BLI_BITMAP_TEST(visited_faces, neighbor_face_index)) { + continue; + } + if (!test(bm, f, ed, f_neighbor, threshold)) { + continue; + } + + face_sets[neighbor_face_index] = next_face_set; + BLI_BITMAP_ENABLE(visited_faces, neighbor_face_index); + BLI_gsqueue_push(queue, &neighbor_face_index); } } - - next_face_set += 1; - - BLI_gsqueue_free(queue); } + + next_face_set += 1; + + BLI_gsqueue_free(queue); } MEM_SAFE_FREE(visited_faces); diff --git a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c index e47a94dff90..cfc31e1dcdd 100644 --- a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c +++ b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c @@ -88,38 +88,39 @@ static void calc_multiplane_scrape_surface_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - float normal[3]; - if (vd.no) { - normal_short_to_float_v3(normal, vd.no); - } - else { - copy_v3_v3(normal, vd.fno); - } - mul_v3_m4v3(local_co, mat, vd.co); - /* Use the brush falloff to weight the sampled normals. */ - const float fade = SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + float local_co[3]; + float normal[3]; + if (vd.no) { + normal_short_to_float_v3(normal, vd.no); + } + else { + copy_v3_v3(normal, vd.fno); + } + mul_v3_m4v3(local_co, mat, vd.co); + /* Use the brush falloff to weight the sampled normals. */ + const float fade = SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - /* Sample the normal and area of the +X and -X axis individually. */ - if (local_co[0] > 0.0f) { - madd_v3_v3fl(mssd->area_nos[0], normal, fade); - add_v3_v3(mssd->area_cos[0], vd.co); - mssd->area_count[0]++; - } - else { - madd_v3_v3fl(mssd->area_nos[1], normal, fade); - add_v3_v3(mssd->area_cos[1], vd.co); - mssd->area_count[1]++; - } + /* Sample the normal and area of the +X and -X axis individually. */ + if (local_co[0] > 0.0f) { + madd_v3_v3fl(mssd->area_nos[0], normal, fade); + add_v3_v3(mssd->area_cos[0], vd.co); + mssd->area_count[0]++; + } + else { + madd_v3_v3fl(mssd->area_nos[1], normal, fade); + add_v3_v3(mssd->area_cos[1], vd.co); + mssd->area_count[1]++; } BKE_pbvh_vertex_iter_end; } @@ -168,56 +169,61 @@ static void do_multiplane_scrape_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - float local_co[3]; - bool deform = false; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - mul_v3_m4v3(local_co, mat, vd.co); + float local_co[3]; + bool deform = false; - if (local_co[0] > 0.0f) { - deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]); - } - else { - deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]); - } + mul_v3_m4v3(local_co, mat, vd.co); - if (angle < 0.0f) { - deform = true; - } + if (local_co[0] > 0.0f) { + deform = !SCULPT_plane_point_side(vd.co, scrape_planes[0]); + } + else { + deform = !SCULPT_plane_point_side(vd.co, scrape_planes[1]); + } - if (deform) { - float intr[3]; - float val[3]; + if (angle < 0.0f) { + deform = true; + } - if (local_co[0] > 0.0f) { - closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co); - } - else { - closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co); - } + if (!deform) { + continue; + } - sub_v3_v3v3(val, intr, vd.co); - if (SCULPT_plane_trim(ss->cache, brush, val)) { - /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */ - /* This produces a not round brush tip. */ - local_co[1] *= 2.0f; - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - len_v3(local_co), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + float intr[3]; + float val[3]; - mul_v3_v3fl(proxy[vd.i], val, fade); + if (local_co[0] > 0.0f) { + closest_to_plane_normalized_v3(intr, scrape_planes[0], vd.co); + } + else { + closest_to_plane_normalized_v3(intr, scrape_planes[1], vd.co); + } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } - } - } + sub_v3_v3v3(val, intr, vd.co); + if (!SCULPT_plane_trim(ss->cache, brush, val)) { + continue; + } + /* Deform the local space along the Y axis to avoid artifacts on curved strokes. */ + /* This produces a not round brush tip. */ + local_co[1] *= 2.0f; + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + len_v3(local_co), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + + mul_v3_v3fl(proxy[vd.i], val, fade); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.c b/source/blender/editors/sculpt_paint/sculpt_paint_color.c index 39320f3f558..5fdf8415f28 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_color.c +++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.c @@ -87,24 +87,25 @@ static void do_color_smooth_task_cb_exec(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - float smooth_color[4]; - SCULPT_neighbor_color_average(ss, smooth_color, vd.index); - blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade); + float smooth_color[4]; + SCULPT_neighbor_color_average(ss, smooth_color, vd.index); + blend_color_interpolate_float(vd.col, vd.col, smooth_color, fade); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -153,46 +154,49 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata, distance_to_stroke_location = sqrtf(test.dist); } - if (affect_vertex) { - float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - distance_to_stroke_location, - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - - /* Density. */ - float noise = 1.0f; - const float density = ss->cache->paint_brush.density; - if (density < 1.0f) { - const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index); - if (hash_noise > density) { - noise = density * hash_noise; - fade = fade * noise; - } - } - - /* Brush paint color, brush test falloff and flow. */ - float paint_color[4]; - float wet_mix_color[4]; - float buffer_color[4]; - - mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow); - mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow); - - /* Interpolate with the wet_mix color for wet paint mixing. */ - blend_color_interpolate_float( - paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix); - blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color); - - /* Final mix over the original color using brush alpha. */ - mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha); - - IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend); + if (!affect_vertex) { + continue; } + + float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + distance_to_stroke_location, + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + + /* Density. */ + float noise = 1.0f; + const float density = ss->cache->paint_brush.density; + if (density < 1.0f) { + const float hash_noise = BLI_hash_int_01(ss->cache->density_seed * 1000 * vd.index); + if (hash_noise > density) { + noise = density * hash_noise; + fade = fade * noise; + } + } + + /* Brush paint color, brush test falloff and flow. */ + float paint_color[4]; + float wet_mix_color[4]; + float buffer_color[4]; + + mul_v4_v4fl(paint_color, brush_color, fade * ss->cache->paint_brush.flow); + mul_v4_v4fl(wet_mix_color, data->wet_mix_sampled_color, fade * ss->cache->paint_brush.flow); + + /* Interpolate with the wet_mix color for wet paint mixing. */ + blend_color_interpolate_float( + paint_color, paint_color, wet_mix_color, ss->cache->paint_brush.wet_mix); + blend_color_mix_float(color_buffer->color[vd.i], color_buffer->color[vd.i], paint_color); + + /* Final mix over the original color using brush alpha. */ + mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha); + + IMB_blend_color_float(vd.col, orig_data.col, buffer_color, brush->blend); + CLAMP4(vd.col, 0.0f, 1.0f); if (vd.mvert) { @@ -225,10 +229,12 @@ static void do_sample_wet_paint_task_cb(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - add_v4_v4(swptd->color, vd.col); - swptd->tot_samples++; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } + + add_v4_v4(swptd->color, vd.col); + swptd->tot_samples++; } BKE_pbvh_vertex_iter_end; } @@ -380,59 +386,61 @@ static void do_smear_brush_task_cb_exec(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - float current_disp[3]; - float current_disp_norm[3]; - float interp_color[4]; - copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]); + float current_disp[3]; + float current_disp_norm[3]; + float interp_color[4]; + copy_v4_v4(interp_color, ss->cache->prev_colors[vd.index]); - switch (brush->smear_deform_type) { - case BRUSH_SMEAR_DEFORM_DRAG: - sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); - break; - case BRUSH_SMEAR_DEFORM_PINCH: - sub_v3_v3v3(current_disp, ss->cache->location, vd.co); - break; - case BRUSH_SMEAR_DEFORM_EXPAND: - sub_v3_v3v3(current_disp, vd.co, ss->cache->location); - break; + switch (brush->smear_deform_type) { + case BRUSH_SMEAR_DEFORM_DRAG: + sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location); + break; + case BRUSH_SMEAR_DEFORM_PINCH: + sub_v3_v3v3(current_disp, ss->cache->location, vd.co); + break; + case BRUSH_SMEAR_DEFORM_EXPAND: + sub_v3_v3v3(current_disp, vd.co, ss->cache->location); + break; + } + normalize_v3_v3(current_disp_norm, current_disp); + mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) { + float vertex_disp[3]; + float vertex_disp_norm[3]; + sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co); + const float *neighbor_color = ss->cache->prev_colors[ni.index]; + normalize_v3_v3(vertex_disp_norm, vertex_disp); + if (dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) { + continue; } - normalize_v3_v3(current_disp_norm, current_disp); - mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength); + const float color_interp = clamp_f( + -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); + float color_mix[4]; + copy_v4_v4(color_mix, neighbor_color); + mul_v4_fl(color_mix, color_interp * fade); + blend_color_mix_float(interp_color, interp_color, color_mix); + } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) { - float vertex_disp[3]; - float vertex_disp_norm[3]; - sub_v3_v3v3(vertex_disp, SCULPT_vertex_co_get(ss, ni.index), vd.co); - const float *neighbor_color = ss->cache->prev_colors[ni.index]; - normalize_v3_v3(vertex_disp_norm, vertex_disp); - if (dot_v3v3(current_disp_norm, vertex_disp_norm) < 0.0f) { - const float color_interp = clamp_f( - -dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f); - float color_mix[4]; - copy_v4_v4(color_mix, neighbor_color); - mul_v4_fl(color_mix, color_interp * fade); - blend_color_mix_float(interp_color, interp_color, color_mix); - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade); - blend_color_interpolate_float(vd.col, ss->cache->prev_colors[vd.index], interp_color, fade); - - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_pose.c b/source/blender/editors/sculpt_paint/sculpt_pose.c index f9ccbbb849c..a85f805894b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_pose.c +++ b/source/blender/editors/sculpt_paint/sculpt_pose.c @@ -490,50 +490,52 @@ static bool pose_face_sets_floodfill_cb( is_vertex_valid = SCULPT_vertex_has_face_set(ss, index, data->current_face_set); } - if (is_vertex_valid) { + if (!is_vertex_valid) { + return visit_next; + } - if (!BLI_BITMAP_TEST(data->is_weighted, index)) { - data->pose_factor[index] = 1.0f; - BLI_BITMAP_ENABLE(data->is_weighted, index); - visit_next = true; - } + if (!BLI_BITMAP_TEST(data->is_weighted, index)) { + data->pose_factor[index] = 1.0f; + BLI_BITMAP_ENABLE(data->is_weighted, index); + visit_next = true; + } - /* Fallback origin accumulation. */ - if (symmetry_check) { - add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, index)); - data->fallback_count++; - } + /* Fallback origin accumulation. */ + if (symmetry_check) { + add_v3_v3(data->fallback_origin, SCULPT_vertex_co_get(ss, index)); + data->fallback_count++; + } - if (symmetry_check && !SCULPT_vertex_has_unique_face_set(ss, index)) { + if (!symmetry_check || SCULPT_vertex_has_unique_face_set(ss, index)) { + return visit_next; + } - /* We only add coordinates for calculating the origin when it is possible to go from this - * vertex to another vertex in a valid face set for the next iteration. */ - bool count_as_boundary = false; + /* We only add coordinates for calculating the origin when it is possible to go from this + * vertex to another vertex in a valid face set for the next iteration. */ + bool count_as_boundary = false; - SculptVertexNeighborIter ni; - SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, index, ni) { - int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.index); + SculptVertexNeighborIter ni; + SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, index, ni) { + int next_face_set_candidate = SCULPT_vertex_face_set_get(ss, ni.index); - /* Check if we can get a valid face set for the next iteration from this neighbor. */ - if (SCULPT_vertex_has_unique_face_set(ss, ni.index) && - !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) { - if (!data->next_face_set_found) { - data->next_face_set = next_face_set_candidate; - data->next_vertex = ni.index; - data->next_face_set_found = true; - } - count_as_boundary = true; - } - } - SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); - - /* Origin accumulation. */ - if (count_as_boundary) { - add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, index)); - data->tot_co++; + /* Check if we can get a valid face set for the next iteration from this neighbor. */ + if (SCULPT_vertex_has_unique_face_set(ss, ni.index) && + !BLI_gset_haskey(data->visited_face_sets, POINTER_FROM_INT(next_face_set_candidate))) { + if (!data->next_face_set_found) { + data->next_face_set = next_face_set_candidate; + data->next_vertex = ni.index; + data->next_face_set_found = true; } + count_as_boundary = true; } } + SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); + + /* Origin accumulation. */ + if (count_as_boundary) { + add_v3_v3(data->pose_origin, SCULPT_vertex_co_get(ss, index)); + data->tot_co++; + } return visit_next; } diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.c b/source/blender/editors/sculpt_paint/sculpt_smooth.c index 87ee7480c92..4c0795eb0f7 100644 --- a/source/blender/editors/sculpt_paint/sculpt_smooth.c +++ b/source/blender/editors/sculpt_paint/sculpt_smooth.c @@ -231,24 +231,26 @@ static void do_enhance_details_brush_task_cb_ex(void *__restrict userdata, const int thread_id = BLI_task_parallel_thread_id(tls); BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - float disp[3]; - madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade); - SCULPT_clip(sd, ss, vd.co, disp); + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + float disp[3]; + madd_v3_v3v3fl(disp, vd.co, ss->cache->detail_directions[vd.index], fade); + SCULPT_clip(sd, ss, vd.co, disp); + + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -312,33 +314,34 @@ static void do_smooth_brush_task_cb_ex(void *__restrict userdata, BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor( - ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f), - vd.index, - thread_id); - if (smooth_mask) { - float val = SCULPT_neighbor_mask_average(ss, vd.index) - *vd.mask; - val *= fade * bstrength; - *vd.mask += val; - CLAMP(*vd.mask, 0.0f, 1.0f); - } - else { - float avg[3], val[3]; - SCULPT_neighbor_coords_average_interior(ss, avg, vd.index); - sub_v3_v3v3(val, avg, vd.co); - madd_v3_v3v3fl(val, vd.co, val, fade); - SCULPT_clip(sd, ss, vd.co, val); - } - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor( + ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + smooth_mask ? 0.0f : (vd.mask ? *vd.mask : 0.0f), + vd.index, + thread_id); + if (smooth_mask) { + float val = SCULPT_neighbor_mask_average(ss, vd.index) - *vd.mask; + val *= fade * bstrength; + *vd.mask += val; + CLAMP(*vd.mask, 0.0f, 1.0f); + } + else { + float avg[3], val[3]; + SCULPT_neighbor_coords_average_interior(ss, avg, vd.index); + sub_v3_v3v3(val, avg, vd.co); + madd_v3_v3v3fl(val, vd.co, val, fade); + SCULPT_clip(sd, ss, vd.co, val); + } + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BKE_pbvh_vertex_iter_end; @@ -473,32 +476,28 @@ static void SCULPT_do_surface_smooth_brush_laplacian_task_cb_ex( BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { SCULPT_orig_vert_data_update(&orig_data, &vd); - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - - float disp[3]; - SCULPT_surface_smooth_laplacian_step(ss, - disp, - vd.co, - ss->cache->surface_smooth_laplacian_disp, - vd.index, - orig_data.co, - alpha); - madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f)); - if (vd.mvert) { - vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + + float disp[3]; + SCULPT_surface_smooth_laplacian_step( + ss, disp, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, orig_data.co, alpha); + madd_v3_v3fl(vd.co, disp, clamp_f(fade, 0.0f, 1.0f)); + if (vd.mvert) { + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } - BKE_pbvh_vertex_iter_end; } + BKE_pbvh_vertex_iter_end; } static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex( @@ -519,19 +518,20 @@ static void SCULPT_do_surface_smooth_brush_displace_task_cb_ex( BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float fade = bstrength * SCULPT_brush_strength_factor(ss, - brush, - vd.co, - sqrtf(test.dist), - vd.no, - vd.fno, - vd.mask ? *vd.mask : 0.0f, - vd.index, - thread_id); - SCULPT_surface_smooth_displace_step( - ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, beta, fade); + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } + const float fade = bstrength * SCULPT_brush_strength_factor(ss, + brush, + vd.co, + sqrtf(test.dist), + vd.no, + vd.fno, + vd.mask ? *vd.mask : 0.0f, + vd.index, + thread_id); + SCULPT_surface_smooth_displace_step( + ss, vd.co, ss->cache->surface_smooth_laplacian_disp, vd.index, beta, fade); } BKE_pbvh_vertex_iter_end; } From f75a71117895f2ca61e3bde935df5db24d7e5360 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 10 Feb 2021 11:20:49 -0700 Subject: [PATCH 071/519] CMake/Deps: Fix building cython on windows For the debug version of cython pip was trying to link against the release version of python for some strange reason. Passing some flags to explicitly target the debug version fixes the issue. Given other platforms do not have different builds for debug/release this is not an issue there. --- .../build_environment/cmake/python_site_packages.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build_files/build_environment/cmake/python_site_packages.cmake b/build_files/build_environment/cmake/python_site_packages.cmake index 58d95326ee9..a3b9c3bf796 100644 --- a/build_files/build_environment/cmake/python_site_packages.cmake +++ b/build_files/build_environment/cmake/python_site_packages.cmake @@ -16,12 +16,16 @@ # # ***** END GPL LICENSE BLOCK ***** +if(WIN32 AND BUILD_MODE STREQUAL Debug) + set(SITE_PACKAGES_EXTRA --global-option build --global-option --debug) +endif() + ExternalProject_Add(external_python_site_packages DOWNLOAD_COMMAND "" CONFIGURE_COMMAND "" BUILD_COMMAND "" PREFIX ${BUILD_DIR}/site_packages - INSTALL_COMMAND ${PYTHON_BINARY} -m pip install cython==${CYTHON_VERSION} idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: + INSTALL_COMMAND ${PYTHON_BINARY} -m pip install ${SITE_PACKAGES_EXTRA} cython==${CYTHON_VERSION} idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: ) add_dependencies( From 62f0d51681a9d810b8d5481467679194df6f4b83 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 10 Feb 2021 14:10:28 -0300 Subject: [PATCH 072/519] Fix T85494: Click and drag of the 3d cursor turns off proportional editing Missed `CTX_NO_PET`. This commit also reorganizes the code to make it clearer when using flags. --- .../editors/transform/transform_convert.c | 129 ++++++++++-------- 1 file changed, 75 insertions(+), 54 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 848aa06238e..ee2dd6d9b1f 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -973,6 +973,80 @@ static int countAndCleanTransDataContainer(TransInfo *t) return t->data_len_all; } +static void init_proportional_edit(TransInfo *t) +{ + eTConvertType convert_type = t->data_type; + switch (convert_type) { + case TC_ACTION_DATA: + case TC_ARMATURE_VERTS: + case TC_CURVE_VERTS: + case TC_GRAPH_EDIT_DATA: + case TC_GPENCIL: + case TC_LATTICE_VERTS: + case TC_MASKING_DATA: + case TC_MBALL_VERTS: + case TC_MESH_VERTS: + case TC_MESH_EDGES: + case TC_MESH_SKIN: + case TC_MESH_UV: + case TC_NODE_DATA: + case TC_OBJECT: + case TC_PARTICLE_VERTS: + break; + case TC_POSE: /* See T32444. */ + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_NLA_DATA: + case TC_OBJECT_TEXSPACE: + case TC_PAINT_CURVE_VERTS: + case TC_SCULPT: + case TC_SEQ_DATA: + case TC_TRACKING_DATA: + case TC_NONE: + default: + t->options |= CTX_NO_PET; + t->flag &= ~T_PROP_EDIT_ALL; + return; + } + + if (t->data_len_all && (t->flag & T_PROP_EDIT)) { + if (convert_type == TC_OBJECT) { + /* Selected objects are already first, no need to presort. */ + } + else { + sort_trans_data_selected_first(t); + } + + if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) { + /* Distance has already been set. */ + } + else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) { + if (t->flag & T_PROP_CONNECTED) { + /* Already calculated by transform_convert_mesh_connectivity_distance. */ + } + else { + set_prop_dist(t, false); + } + } + else if (convert_type == TC_MESH_UV && t->flag & T_PROP_CONNECTED) { + /* Already calculated by uv_set_connectivity_distance. */ + } + else if (convert_type == TC_CURVE_VERTS && t->obedit_type == OB_CURVE) { + set_prop_dist(t, false); + } + else { + set_prop_dist(t, true); + } + + sort_trans_data_dist(t); + } + else if (ELEM(t->obedit_type, OB_CURVE)) { + /* Needed because bezier handles can be partially selected + * and are still added into transform data. */ + sort_trans_data_selected_first(t); + } +} + void createTransData(bContext *C, TransInfo *t) { Scene *scene = t->scene; @@ -1147,8 +1221,6 @@ void createTransData(bContext *C, TransInfo *t) } t->data_type = convert_type; - bool init_prop_edit = (t->flag & T_PROP_EDIT) != 0; - switch (convert_type) { case TC_ACTION_DATA: createTransActionData(C, t); @@ -1157,18 +1229,15 @@ void createTransData(bContext *C, TransInfo *t) t->options |= CTX_POSE_BONE; createTransPose(t); /* Disable PET, its not usable in pose mode yet T32444. */ - init_prop_edit = false; break; case TC_ARMATURE_VERTS: createTransArmatureVerts(t); break; case TC_CURSOR_IMAGE: createTransCursor_image(t); - init_prop_edit = false; break; case TC_CURSOR_VIEW3D: createTransCursor_view3d(t); - init_prop_edit = false; break; case TC_CURVE_VERTS: createTransCurveVerts(t); @@ -1202,7 +1271,6 @@ void createTransData(bContext *C, TransInfo *t) break; case TC_NLA_DATA: createTransNlaData(C, t); - init_prop_edit = false; break; case TC_NODE_DATA: createTransNodeData(t); @@ -1226,26 +1294,21 @@ void createTransData(bContext *C, TransInfo *t) break; case TC_OBJECT_TEXSPACE: createTransTexspace(t); - init_prop_edit = false; break; case TC_PAINT_CURVE_VERTS: createTransPaintCurveVerts(C, t); - init_prop_edit = false; break; case TC_PARTICLE_VERTS: createTransParticleVerts(C, t); break; case TC_SCULPT: createTransSculpt(C, t); - init_prop_edit = false; break; case TC_SEQ_DATA: createTransSeqData(t); - init_prop_edit = false; break; case TC_TRACKING_DATA: createTransTrackingData(C, t); - init_prop_edit = false; break; case TC_NONE: default: @@ -1256,49 +1319,7 @@ void createTransData(bContext *C, TransInfo *t) } countAndCleanTransDataContainer(t); - - if (t->data_len_all && init_prop_edit) { - if (convert_type == TC_OBJECT) { - /* Selected objects are already first, no need to presort. */ - } - else { - sort_trans_data_selected_first(t); - } - - if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) { - /* Distance has already been set. */ - } - else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) { - if (t->flag & T_PROP_CONNECTED) { - /* Already calculated by transform_convert_mesh_connectivity_distance. */ - } - else { - set_prop_dist(t, false); - } - } - else if (convert_type == TC_MESH_UV && t->flag & T_PROP_CONNECTED) { - /* Already calculated by uv_set_connectivity_distance. */ - } - else if (convert_type == TC_CURVE_VERTS && t->obedit_type == OB_CURVE) { - set_prop_dist(t, false); - } - else { - set_prop_dist(t, true); - } - - sort_trans_data_dist(t); - } - else { - if (ELEM(t->obedit_type, OB_CURVE)) { - /* Needed because bezier handles can be partially selected - * and are still added into transform data. */ - sort_trans_data_selected_first(t); - } - - if (!init_prop_edit) { - t->flag &= ~T_PROP_EDIT_ALL; - } - } + init_proportional_edit(t); BLI_assert((!(t->flag & T_EDIT)) == (!(t->obedit_type != -1))); } From 69c7ffff8bbdaa585b51fe3e4e36a7f37b5759b7 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 10 Feb 2021 15:19:51 -0300 Subject: [PATCH 073/519] Transform: refactor createTransData splitting into more specific functions Currently, `createTransData` is doing much more than the name implies. This commit makes it clearer through smaller and more specific functions what the real purpose of that function. --- source/blender/editors/transform/transform.h | 6 +- .../editors/transform/transform_convert.c | 263 +++++++++++++----- .../editors/transform/transform_generics.c | 76 +---- 3 files changed, 200 insertions(+), 145 deletions(-) diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 02a7f41b384..24335b6b6b7 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -737,10 +737,6 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val /** \name Generics * \{ */ -void initTransDataContainers_FromObjectData(TransInfo *t, - struct Object *obact, - struct Object **objects, - uint objects_len); void initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, @@ -776,7 +772,7 @@ void calculatePropRatio(TransInfo *t); void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot); -struct Object *transform_object_deform_pose_armature_get(TransInfo *t, struct Object *ob); +struct Object *transform_object_deform_pose_armature_get(const TransInfo *t, struct Object *ob); void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data); diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index ee2dd6d9b1f..6caa4727924 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -23,6 +23,7 @@ #include "DNA_anim_types.h" #include "DNA_constraint_types.h" +#include "DNA_mesh_types.h" #include "MEM_guardedalloc.h" @@ -911,6 +912,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) case TC_LATTICE_VERTS: case TC_MBALL_VERTS: case TC_MESH_UV: + case TC_MESH_SKIN: case TC_OBJECT_TEXSPACE: case TC_PAINT_CURVE_VERTS: case TC_PARTICLE_VERTS: @@ -978,7 +980,6 @@ static void init_proportional_edit(TransInfo *t) eTConvertType convert_type = t->data_type; switch (convert_type) { case TC_ACTION_DATA: - case TC_ARMATURE_VERTS: case TC_CURVE_VERTS: case TC_GRAPH_EDIT_DATA: case TC_GPENCIL: @@ -993,7 +994,8 @@ static void init_proportional_edit(TransInfo *t) case TC_OBJECT: case TC_PARTICLE_VERTS: break; - case TC_POSE: /* See T32444. */ + case TC_POSE: /* Disable PET, its not usable in pose mode yet T32444. */ + case TC_ARMATURE_VERTS: case TC_CURSOR_IMAGE: case TC_CURSOR_VIEW3D: case TC_NLA_DATA: @@ -1047,14 +1049,155 @@ static void init_proportional_edit(TransInfo *t) } } -void createTransData(bContext *C, TransInfo *t) +/* For multi object editing. */ +static void init_TransDataContainers(TransInfo *t, + Object *obact, + Object **objects, + uint objects_len) +{ + switch (t->data_type) { + case TC_POSE: + case TC_ARMATURE_VERTS: + case TC_CURVE_VERTS: + case TC_GPENCIL: + case TC_LATTICE_VERTS: + case TC_MBALL_VERTS: + case TC_MESH_VERTS: + case TC_MESH_EDGES: + case TC_MESH_SKIN: + case TC_MESH_UV: + break; + case TC_ACTION_DATA: + case TC_GRAPH_EDIT_DATA: + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_MASKING_DATA: + case TC_NLA_DATA: + case TC_NODE_DATA: + case TC_OBJECT: + case TC_OBJECT_TEXSPACE: + case TC_PAINT_CURVE_VERTS: + case TC_PARTICLE_VERTS: + case TC_SCULPT: + case TC_SEQ_DATA: + case TC_TRACKING_DATA: + case TC_NONE: + default: + /* Does not support Multi object editing. */ + return; + } + + const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT; + const short object_type = obact ? obact->type : -1; + + if ((object_mode & OB_MODE_EDIT) || (t->data_type == TC_GPENCIL) || + ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) { + if (t->data_container) { + MEM_freeN(t->data_container); + } + + bool free_objects = false; + if (objects == NULL) { + objects = BKE_view_layer_array_from_objects_in_mode( + t->view_layer, + (t->spacetype == SPACE_VIEW3D) ? t->view : NULL, + &objects_len, + { + .object_mode = object_mode, + .no_dup_data = true, + }); + free_objects = true; + } + + t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); + t->data_container_len = objects_len; + + for (int i = 0; i < objects_len; i++) { + TransDataContainer *tc = &t->data_container[i]; + if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) && + (objects[i]->type == OB_MESH)) { + tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0; + tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0; + tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0; + } + + if (object_mode & OB_MODE_EDIT) { + tc->obedit = objects[i]; + /* Check needed for UV's */ + if ((t->flag & T_2D_EDIT) == 0) { + tc->use_local_mat = true; + } + } + else if (object_mode & OB_MODE_POSE) { + tc->poseobj = objects[i]; + tc->use_local_mat = true; + } + else if (t->data_type == TC_GPENCIL) { + tc->use_local_mat = true; + } + + if (tc->use_local_mat) { + BLI_assert((t->flag & T_2D_EDIT) == 0); + copy_m4_m4(tc->mat, objects[i]->obmat); + copy_m3_m4(tc->mat3, tc->mat); + /* for non-invertible scale matrices, invert_m4_m4_fallback() + * can still provide a valid pivot */ + invert_m4_m4_fallback(tc->imat, tc->mat); + invert_m3_m3(tc->imat3, tc->mat3); + normalize_m3_m3(tc->mat3_unit, tc->mat3); + } + /* Otherwise leave as zero. */ + } + + if (free_objects) { + MEM_freeN(objects); + } + } +} + +static eTFlag flags_from_data_type(eTConvertType data_type) +{ + switch (data_type) { + case TC_ACTION_DATA: + case TC_GRAPH_EDIT_DATA: + case TC_MASKING_DATA: + case TC_NLA_DATA: + case TC_NODE_DATA: + case TC_PAINT_CURVE_VERTS: + case TC_SEQ_DATA: + case TC_TRACKING_DATA: + return T_POINTS | T_2D_EDIT; + case TC_ARMATURE_VERTS: + case TC_CURVE_VERTS: + case TC_GPENCIL: + case TC_LATTICE_VERTS: + case TC_MBALL_VERTS: + case TC_MESH_VERTS: + case TC_MESH_SKIN: + return T_EDIT | T_POINTS; + case TC_MESH_EDGES: + return T_EDIT; + case TC_MESH_UV: + return T_EDIT | T_POINTS | T_2D_EDIT; + case TC_PARTICLE_VERTS: + return T_POINTS; + case TC_POSE: + case TC_CURSOR_IMAGE: + case TC_CURSOR_VIEW3D: + case TC_OBJECT: + case TC_OBJECT_TEXSPACE: + case TC_SCULPT: + case TC_NONE: + default: + break; + } + return 0; +} + +static eTConvertType convert_type_get(const TransInfo *t, const Object **r_obj_armature) { - Scene *scene = t->scene; ViewLayer *view_layer = t->view_layer; Object *ob = OBACT(view_layer); - - t->data_len_all = -1; - eTConvertType convert_type = TC_NONE; /* if tests must match recalcData for correct updates */ @@ -1074,19 +1217,12 @@ void createTransData(bContext *C, TransInfo *t) convert_type = TC_OBJECT_TEXSPACE; } else if (t->options & CTX_EDGE_DATA) { - t->flag |= T_EDIT; convert_type = TC_MESH_EDGES; - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); } else if (t->options & CTX_GPENCIL_STROKES) { - t->options |= CTX_GPENCIL_STROKES; - t->flag |= T_POINTS | T_EDIT; convert_type = TC_GPENCIL; - initTransDataContainers_FromObjectData(t, ob, NULL, 0); } else if (t->spacetype == SPACE_IMAGE) { - t->flag |= T_POINTS | T_2D_EDIT; if (t->options & CTX_MASK) { convert_type = TC_MASKING_DATA; } @@ -1096,41 +1232,25 @@ void createTransData(bContext *C, TransInfo *t) } } else if (t->obedit_type == OB_MESH) { - t->flag |= T_EDIT; convert_type = TC_MESH_UV; - initTransDataContainers_FromObjectData(t, ob, NULL, 0); } } else if (t->spacetype == SPACE_ACTION) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; convert_type = TC_ACTION_DATA; } else if (t->spacetype == SPACE_NLA) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; convert_type = TC_NLA_DATA; } else if (t->spacetype == SPACE_SEQ) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */ convert_type = TC_SEQ_DATA; } else if (t->spacetype == SPACE_GRAPH) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; convert_type = TC_GRAPH_EDIT_DATA; } else if (t->spacetype == SPACE_NODE) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; convert_type = TC_NODE_DATA; } else if (t->spacetype == SPACE_CLIP) { - t->flag |= T_POINTS | T_2D_EDIT; - t->obedit_type = -1; - if (t->options & CTX_MOVIECLIP) { convert_type = TC_TRACKING_DATA; } @@ -1139,11 +1259,6 @@ void createTransData(bContext *C, TransInfo *t) } } else if (t->obedit_type != -1) { - t->flag |= T_EDIT | T_POINTS; - - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); - if (t->obedit_type == OB_MESH) { if (t->mode == TFM_SKIN_RESIZE) { convert_type = TC_MESH_SKIN; @@ -1162,38 +1277,25 @@ void createTransData(bContext *C, TransInfo *t) convert_type = TC_MBALL_VERTS; } else if (t->obedit_type == OB_ARMATURE) { - t->flag &= ~T_PROP_EDIT; convert_type = TC_ARMATURE_VERTS; } } else if (ob && (ob->mode & OB_MODE_POSE)) { - /* XXX this is currently limited to active armature only... */ - - /* XXX active-layer checking isn't done - * as that should probably be checked through context instead. */ - - /* Multi object editing. */ - initTransDataContainers_FromObjectData(t, ob, NULL, 0); convert_type = TC_POSE; } else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { Object *ob_armature = transform_object_deform_pose_armature_get(t, ob); if (ob_armature) { - Object *objects[1]; - objects[0] = ob_armature; - uint objects_len = 1; - initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len); + *r_obj_armature = ob_armature; convert_type = TC_POSE; } } else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) && - PE_start_edit(PE_get_current(t->depsgraph, scene, ob))) { - t->flag |= T_POINTS; + PE_start_edit(PE_get_current(t->depsgraph, t->scene, ob))) { convert_type = TC_PARTICLE_VERTS; } else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) { if ((t->options & CTX_PAINT_CURVE) && !ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) { - t->flag |= T_POINTS | T_2D_EDIT; convert_type = TC_PAINT_CURVE_VERTS; } } @@ -1205,30 +1307,40 @@ void createTransData(bContext *C, TransInfo *t) /* In grease pencil all transformations must be canceled if not Object or Edit. */ } else { - t->options |= CTX_OBJECT; - - /* Needed for correct Object.obmat after duplication, see: T62135. */ - BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context)); - - if ((scene->toolsettings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) { - t->options |= CTX_OBMODE_XFORM_OBDATA; - } - if ((scene->toolsettings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) { - t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; - } - convert_type = TC_OBJECT; } - t->data_type = convert_type; - switch (convert_type) { + return convert_type; +} + +void createTransData(bContext *C, TransInfo *t) +{ + t->data_len_all = -1; + + Object *ob_armature = NULL; + t->data_type = convert_type_get(t, &ob_armature); + t->flag |= flags_from_data_type(t->data_type); + + if (ob_armature) { + init_TransDataContainers(t, ob_armature, &ob_armature, 1); + } + else { + ViewLayer *view_layer = t->view_layer; + Object *ob = OBACT(view_layer); + init_TransDataContainers(t, ob, NULL, 0); + } + + switch (t->data_type) { case TC_ACTION_DATA: + t->obedit_type = -1; createTransActionData(C, t); break; case TC_POSE: t->options |= CTX_POSE_BONE; + + /* XXX active-layer checking isn't done + * as that should probably be checked through context instead. */ createTransPose(t); - /* Disable PET, its not usable in pose mode yet T32444. */ break; case TC_ARMATURE_VERTS: createTransArmatureVerts(t); @@ -1243,6 +1355,7 @@ void createTransData(bContext *C, TransInfo *t) createTransCurveVerts(t); break; case TC_GRAPH_EDIT_DATA: + t->obedit_type = -1; createTransGraphEditData(C, t); break; case TC_GPENCIL: @@ -1252,6 +1365,9 @@ void createTransData(bContext *C, TransInfo *t) createTransLatticeVerts(t); break; case TC_MASKING_DATA: + if (t->spacetype == SPACE_CLIP) { + t->obedit_type = -1; + } createTransMaskingData(C, t); break; case TC_MBALL_VERTS: @@ -1270,12 +1386,25 @@ void createTransData(bContext *C, TransInfo *t) createTransUVs(C, t); break; case TC_NLA_DATA: + t->obedit_type = -1; createTransNlaData(C, t); break; case TC_NODE_DATA: + t->obedit_type = -1; createTransNodeData(t); break; case TC_OBJECT: + t->options |= CTX_OBJECT; + + /* Needed for correct Object.obmat after duplication, see: T62135. */ + BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context)); + + if ((t->settings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) { + t->options |= CTX_OBMODE_XFORM_OBDATA; + } + if ((t->settings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) { + t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; + } createTransObject(C, t); /* Check if we're transforming the camera from the camera */ if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) { @@ -1305,9 +1434,12 @@ void createTransData(bContext *C, TransInfo *t) createTransSculpt(C, t); break; case TC_SEQ_DATA: + t->obedit_type = -1; + t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */ createTransSeqData(t); break; case TC_TRACKING_DATA: + t->obedit_type = -1; createTransTrackingData(C, t); break; case TC_NONE: @@ -1319,6 +1451,7 @@ void createTransData(bContext *C, TransInfo *t) } countAndCleanTransDataContainer(t); + init_proportional_edit(t); BLI_assert((!(t->flag & T_EDIT)) == (!(t->obedit_type != -1))); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 92719933afb..6fca49495e9 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -26,7 +26,6 @@ #include "MEM_guardedalloc.h" #include "DNA_gpencil_types.h" -#include "DNA_mesh_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -120,79 +119,6 @@ void resetTransRestrictions(TransInfo *t) t->flag &= ~T_ALL_RESTRICTIONS; } -void initTransDataContainers_FromObjectData(TransInfo *t, - Object *obact, - Object **objects, - uint objects_len) -{ - const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT; - const short object_type = obact ? obact->type : -1; - - if ((object_mode & OB_MODE_EDIT) || (t->options & CTX_GPENCIL_STROKES) || - ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) { - if (t->data_container) { - MEM_freeN(t->data_container); - } - - bool free_objects = false; - if (objects == NULL) { - objects = BKE_view_layer_array_from_objects_in_mode( - t->view_layer, - (t->spacetype == SPACE_VIEW3D) ? t->view : NULL, - &objects_len, - { - .object_mode = object_mode, - .no_dup_data = true, - }); - free_objects = true; - } - - t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); - t->data_container_len = objects_len; - - for (int i = 0; i < objects_len; i++) { - TransDataContainer *tc = &t->data_container[i]; - if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) && - (objects[i]->type == OB_MESH)) { - tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0; - tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0; - tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0; - } - - if (object_mode & OB_MODE_EDIT) { - tc->obedit = objects[i]; - /* Check needed for UV's */ - if ((t->flag & T_2D_EDIT) == 0) { - tc->use_local_mat = true; - } - } - else if (object_mode & OB_MODE_POSE) { - tc->poseobj = objects[i]; - tc->use_local_mat = true; - } - else if (t->options & CTX_GPENCIL_STROKES) { - tc->use_local_mat = true; - } - - if (tc->use_local_mat) { - BLI_assert((t->flag & T_2D_EDIT) == 0); - copy_m4_m4(tc->mat, objects[i]->obmat); - copy_m3_m4(tc->mat3, tc->mat); - /* for non-invertible scale matrices, invert_m4_m4_fallback() - * can still provide a valid pivot */ - invert_m4_m4_fallback(tc->imat, tc->mat); - invert_m3_m3(tc->imat3, tc->mat3); - normalize_m3_m3(tc->mat3_unit, tc->mat3); - } - /* Otherwise leave as zero. */ - } - - if (free_objects) { - MEM_freeN(objects); - } - } -} - /** * Setup internal data, mouse, vectors * @@ -1456,7 +1382,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) } } -Object *transform_object_deform_pose_armature_get(TransInfo *t, Object *ob) +Object *transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob) { if (!(ob->mode & OB_MODE_ALL_WEIGHT_PAINT)) { return NULL; From 677e63d51869bb89f2ca1adee2e8350ed379005d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 10 Feb 2021 18:17:23 +0100 Subject: [PATCH 074/519] TBB: fix deprecation warnings with newer TBB versions * USD and OpenVDB headers use deprecated TBB headers, suppress all deprecation warnings there since we have no control over them. * For our own TBB includes, use the individual headers rather than the tbb.h that includes everything to avoid warnings, rather than suppressing all. This is in anticipation of the TBB 2020 upgrade in D10359. Ref D10361. --- CMakeLists.txt | 3 +++ extern/mantaflow/CMakeLists.txt | 2 ++ intern/cycles/util/util_tbb.h | 7 +++++-- source/blender/blenlib/BLI_task.hh | 6 +++--- source/blender/blenlib/intern/task_graph.cc | 3 --- source/blender/blenlib/intern/task_pool.cc | 6 +++--- source/blender/blenlib/intern/task_range.cc | 7 ++++--- source/blender/blenlib/intern/task_scheduler.cc | 6 +++--- source/blender/io/usd/CMakeLists.txt | 3 +++ 9 files changed, 26 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00674809095..44385d81ff6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1026,6 +1026,9 @@ if(WITH_OPENVDB) list(APPEND OPENVDB_DEFINITIONS -DOPENVDB_3_ABI_COMPATIBLE) endif() + # OpenVDB headers use deprecated TBB headers, silence warning. + list(APPEND OPENVDB_DEFINITIONS -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) + list(APPEND OPENVDB_INCLUDE_DIRS ${BOOST_INCLUDE_DIR} ${TBB_INCLUDE_DIRS} diff --git a/extern/mantaflow/CMakeLists.txt b/extern/mantaflow/CMakeLists.txt index 82bf95a9742..c1fa13420b8 100644 --- a/extern/mantaflow/CMakeLists.txt +++ b/extern/mantaflow/CMakeLists.txt @@ -75,6 +75,8 @@ endif() if(WITH_OPENVDB) add_definitions(-DOPENVDB=1) + # OpenVDB headers use deprecated TBB headers, silence warning. + add_definitions(-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) endif() if(WITH_OPENVDB_BLOSC) diff --git a/intern/cycles/util/util_tbb.h b/intern/cycles/util/util_tbb.h index 168bd5db961..73e0f92d19c 100644 --- a/intern/cycles/util/util_tbb.h +++ b/intern/cycles/util/util_tbb.h @@ -21,11 +21,14 @@ * WIN32_LEAN_AND_MEAN and similar are defined beforehand. */ #include "util_windows.h" -#define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -#include +#include +#include +#include +#include #if TBB_INTERFACE_VERSION_MAJOR >= 10 # define WITH_TBB_GLOBAL_CONTROL +# include #endif CCL_NAMESPACE_BEGIN diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh index 0da03d84793..8e963c958b2 100644 --- a/source/blender/blenlib/BLI_task.hh +++ b/source/blender/blenlib/BLI_task.hh @@ -22,15 +22,15 @@ #ifdef WITH_TBB /* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 - # if defined(WIN32) && !defined(NOMINMAX) /* TBB includes Windows.h which will define min/max macros causing issues * when we try to use std::min and std::max later on. */ # define NOMINMAX # define TBB_MIN_MAX_CLEANUP # endif -# include +# include +# include +# include # ifdef WIN32 /* We cannot keep this defined, since other parts of the code deal with this on their own, leading * to multiple define warnings unless we un-define this, however we can only undefine this if we diff --git a/source/blender/blenlib/intern/task_graph.cc b/source/blender/blenlib/intern/task_graph.cc index 5b804cd1df8..32450c16630 100644 --- a/source/blender/blenlib/intern/task_graph.cc +++ b/source/blender/blenlib/intern/task_graph.cc @@ -28,10 +28,7 @@ #include #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 # include -# include #endif /* Task Graph */ diff --git a/source/blender/blenlib/intern/task_pool.cc b/source/blender/blenlib/intern/task_pool.cc index 10f15f8749c..00ba659a9c8 100644 --- a/source/blender/blenlib/intern/task_pool.cc +++ b/source/blender/blenlib/intern/task_pool.cc @@ -34,9 +34,9 @@ #include "BLI_threads.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +# include +# include +# include #endif /* Task diff --git a/source/blender/blenlib/intern/task_range.cc b/source/blender/blenlib/intern/task_range.cc index c2498de1af8..a27241e91dd 100644 --- a/source/blender/blenlib/intern/task_range.cc +++ b/source/blender/blenlib/intern/task_range.cc @@ -32,9 +32,10 @@ #include "atomic_ops.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +# include +# include +# include +# include #endif #ifdef WITH_TBB diff --git a/source/blender/blenlib/intern/task_scheduler.cc b/source/blender/blenlib/intern/task_scheduler.cc index b0245da0385..b22334a5676 100644 --- a/source/blender/blenlib/intern/task_scheduler.cc +++ b/source/blender/blenlib/intern/task_scheduler.cc @@ -26,10 +26,10 @@ #include "BLI_threads.h" #ifdef WITH_TBB -/* Quiet top level deprecation message, unrelated to API usage here. */ -# define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 -# include +/* Need to include at least one header to get the version define. */ +# include # if TBB_INTERFACE_VERSION_MAJOR >= 10 +# include # define WITH_TBB_GLOBAL_CONTROL # endif #endif diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt index 79b15c60b94..6ea30f48a13 100644 --- a/source/blender/io/usd/CMakeLists.txt +++ b/source/blender/io/usd/CMakeLists.txt @@ -30,6 +30,9 @@ if(WIN32) endif() add_definitions(-DPXR_STATIC) +# USD headers use deprecated TBB headers, silence warning. +add_definitions(-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1) + set(INC . ../common From 9274bd457a251961557d5a132e31a5b0159c540c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 10 Feb 2021 19:48:15 +0100 Subject: [PATCH 075/519] Fix T85515: missing viewport update when toggling Hidden Wire This is in the overlay popover but also affects shading. --- source/blender/makesrna/intern/rna_space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 8f3b254e6e1..f5ec0751015 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -3990,7 +3990,7 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE); RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display"); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS); From 4719836eca2e661ac79fbd1448fdc876b62af458 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 11 Feb 2021 08:27:28 +1100 Subject: [PATCH 076/519] BLI_math: add mid_v2_v2v2v2 --- source/blender/blenlib/BLI_math_vector.h | 1 + source/blender/blenlib/intern/math_vector.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 0bddff9101e..16585e34419 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -310,6 +310,7 @@ void interp_v4_v4v4_uchar(unsigned char target[4], void mid_v3_v3v3(float r[3], const float a[3], const float b[3]); void mid_v2_v2v2(float r[2], const float a[2], const float b[2]); void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3]); +void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2]); void mid_v3_v3v3v3v3( float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3]); void mid_v3_v3_array(float r[3], const float (*vec_arr)[3], const unsigned int nbr); diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 5f3297134c6..da16fb4a9fb 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -281,6 +281,12 @@ void mid_v2_v2v2(float r[2], const float a[2], const float b[2]) r[1] = 0.5f * (a[1] + b[1]); } +void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2]) +{ + v[0] = (v1[0] + v2[0] + v3[0]) / 3.0f; + v[1] = (v1[1] + v2[1] + v3[1]) / 3.0f; +} + void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3]) { v[0] = (v1[0] + v2[0] + v3[0]) / 3.0f; From 2d252b6d26f90f81f2a2dc7a3031c407dc8a643c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 11 Feb 2021 08:27:47 +1100 Subject: [PATCH 077/519] Fix T85508: UV select overlap fails on identical faces The triangle overlap test failed for exactly overlapping triangles. When none of the segments intersect, testing a if a single corner is inside the other triangle fails when the triangles share UV coordinates. Resolve by comparing the triangle centers. --- source/blender/editors/uvedit/uvedit_select.c | 64 +++++++++++++------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/source/blender/editors/uvedit/uvedit_select.c b/source/blender/editors/uvedit/uvedit_select.c index 0bc1943802a..88802e0d868 100644 --- a/source/blender/editors/uvedit/uvedit_select.c +++ b/source/blender/editors/uvedit/uvedit_select.c @@ -3546,6 +3546,51 @@ struct UVOverlapData { float tri[3][2]; }; +/** + * Specialized 2D triangle intersection for detecting UV overlap: + * + * \return + * - false when single corners or edges touch (common for UV coordinates). + * - true when all corners touch (an exactly overlapping triangle). + */ +static bool overlap_tri_tri_uv_test(const float t1[3][2], + const float t2[3][2], + const float endpoint_bias) +{ + float vi[2]; + + /* Don't use 'isect_tri_tri_v2' here + * because it's important to ignore overlap at end-points. */ + if (isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[1], t2[2], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[2], t2[0], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[1], t2[2], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[2], t2[0], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[0], t2[1], endpoint_bias, vi) == 1 || + isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[1], t2[2], endpoint_bias, vi) == 1) { + return true; + } + + /* When none of the segments intersect, checking if either of the triangles corners + * is inside the others is almost always sufficient to test if the two triangles intersect. + * + * However, the `endpoint_bias` on segment intersections causes _exact_ overlapping + * triangles not to be detected. + * + * Resolve this problem at the small cost of calculating the triangle center, see T85508. */ + mid_v2_v2v2v2(vi, UNPACK3(t1)); + if (isect_point_tri_v2(vi, UNPACK3(t2)) != 0) { + return true; + } + mid_v2_v2v2v2(vi, UNPACK3(t2)); + if (isect_point_tri_v2(vi, UNPACK3(t1)) != 0) { + return true; + } + + return false; +} + static int uv_select_overlap(bContext *C, const bool extend) { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); @@ -3689,24 +3734,7 @@ static int uv_select_overlap(bContext *C, const bool extend) /* Main tri-tri overlap test. */ const float endpoint_bias = -1e-4f; - const float(*t1)[2] = o_a->tri; - const float(*t2)[2] = o_b->tri; - float vi[2]; - bool result = ( - /* Don't use 'isect_tri_tri_v2' here - * because it's important to ignore overlap at end-points. */ - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[0], t1[1], t2[2], t2[0], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[1], t1[2], t2[2], t2[0], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[0], t2[1], endpoint_bias, vi) == 1 || - isect_seg_seg_v2_point_ex(t1[2], t1[0], t2[1], t2[2], endpoint_bias, vi) == 1 || - isect_point_tri_v2(t1[0], t2[0], t2[1], t2[2]) != 0 || - isect_point_tri_v2(t2[0], t1[0], t1[1], t1[2]) != 0); - - if (result) { + if (overlap_tri_tri_uv_test(o_a->tri, o_b->tri, endpoint_bias)) { uvedit_face_select_enable(scene, em_a, face_a, false, cd_loop_uv_offset_a); uvedit_face_select_enable(scene, em_b, face_b, false, cd_loop_uv_offset_b); } From f1ee345f9924478f97c26f1df61a917036a0e1d1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 11 Feb 2021 08:38:52 +1100 Subject: [PATCH 078/519] Cleanup: incompatible-pointer-types warning --- source/blender/editors/transform/transform_convert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 6caa4727924..47674c33733 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -1194,7 +1194,7 @@ static eTFlag flags_from_data_type(eTConvertType data_type) return 0; } -static eTConvertType convert_type_get(const TransInfo *t, const Object **r_obj_armature) +static eTConvertType convert_type_get(const TransInfo *t, Object **r_obj_armature) { ViewLayer *view_layer = t->view_layer; Object *ob = OBACT(view_layer); From 52cfc620c8cc3125282d8dd66df312ffb576569c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 11 Feb 2021 12:34:41 +1100 Subject: [PATCH 079/519] Fix T83013: Annotation with hidden object in sculpt mode crashes This just avoids the crash, the annotation tool still doesn't work. Larger changes will be needed to resolve this, see T85532. --- source/blender/editors/include/ED_sculpt.h | 6 +++--- source/blender/editors/sculpt_paint/sculpt_transform.c | 9 +++------ source/blender/editors/transform/transform_convert.c | 2 +- source/blender/editors/transform/transform_convert.h | 2 +- .../editors/transform/transform_convert_gpencil.c | 2 +- .../editors/transform/transform_convert_particle.c | 4 ++-- .../editors/transform/transform_convert_sculpt.c | 10 ++++++---- 7 files changed, 17 insertions(+), 18 deletions(-) diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h index 1175d08399e..348ea503372 100644 --- a/source/blender/editors/include/ED_sculpt.h +++ b/source/blender/editors/include/ED_sculpt.h @@ -43,9 +43,9 @@ bool ED_sculpt_mask_box_select(struct bContext *C, bool select); /* transform */ -void ED_sculpt_update_modal_transform(struct bContext *C); -void ED_sculpt_init_transform(struct bContext *C); -void ED_sculpt_end_transform(struct bContext *C); +void ED_sculpt_update_modal_transform(struct bContext *C, struct Object *ob); +void ED_sculpt_init_transform(struct bContext *C, struct Object *ob); +void ED_sculpt_end_transform(struct bContext *C, struct Object *ob); /* sculpt_undo.c */ void ED_sculpt_undosys_type(struct UndoType *ut); diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.c b/source/blender/editors/sculpt_paint/sculpt_transform.c index da8204fd57c..4554ea178ab 100644 --- a/source/blender/editors/sculpt_paint/sculpt_transform.c +++ b/source/blender/editors/sculpt_paint/sculpt_transform.c @@ -60,10 +60,9 @@ #include #include -void ED_sculpt_init_transform(struct bContext *C) +void ED_sculpt_init_transform(struct bContext *C, Object *ob) { Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); @@ -220,10 +219,9 @@ static void sculpt_transform_all_vertices(Sculpt *sd, Object *ob) 0, ss->filter_cache->totnode, &data, sculpt_transform_task_cb, &settings); } -void ED_sculpt_update_modal_transform(struct bContext *C) +void ED_sculpt_update_modal_transform(struct bContext *C, Object *ob) { Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); @@ -243,9 +241,8 @@ void ED_sculpt_update_modal_transform(struct bContext *C) SCULPT_flush_update_step(C, SCULPT_UPDATE_COORDS); } -void ED_sculpt_end_transform(struct bContext *C) +void ED_sculpt_end_transform(struct bContext *C, Object *ob) { - Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; if (ss->filter_cache) { SCULPT_filter_cache_free(ss); diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index fb365da6b43..3ea0b0a0a70 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -1246,7 +1246,7 @@ void createTransData(bContext *C, TransInfo *t) init_prop_edit = false; break; case TC_PARTICLE_VERTS: - createTransParticleVerts(C, t); + createTransParticleVerts(t); break; case TC_SCULPT: createTransSculpt(C, t); diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index be4322b42e2..466bfd6b226 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -224,7 +224,7 @@ void createTransPaintCurveVerts(bContext *C, TransInfo *t); void flushTransPaintCurve(TransInfo *t); /* transform_convert_particle.c */ -void createTransParticleVerts(bContext *C, TransInfo *t); +void createTransParticleVerts(TransInfo *t); void recalcData_particles(TransInfo *t); /* transform_convert_sculpt.c */ diff --git a/source/blender/editors/transform/transform_convert_gpencil.c b/source/blender/editors/transform/transform_convert_gpencil.c index 0a742ec4470..deb18b50a22 100644 --- a/source/blender/editors/transform/transform_convert_gpencil.c +++ b/source/blender/editors/transform/transform_convert_gpencil.c @@ -688,7 +688,7 @@ void createTransGPencil(bContext *C, TransInfo *t) Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); const Scene *scene = CTX_data_scene(C); ToolSettings *ts = scene->toolsettings; - Object *obact = CTX_data_active_object(C); + Object *obact = OBACT(t->view_layer); bGPdata *gpd = obact->data; BLI_assert(gpd != NULL); diff --git a/source/blender/editors/transform/transform_convert_particle.c b/source/blender/editors/transform/transform_convert_particle.c index fbe9c07ebe9..6366eff2f4c 100644 --- a/source/blender/editors/transform/transform_convert_particle.c +++ b/source/blender/editors/transform/transform_convert_particle.c @@ -45,13 +45,13 @@ * * \{ */ -void createTransParticleVerts(bContext *C, TransInfo *t) +void createTransParticleVerts(TransInfo *t) { FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = NULL; TransDataExtension *tx; - Object *ob = CTX_data_active_object(C); + Object *ob = OBACT(t->view_layer); ParticleEditSettings *pset = PE_settings(t->scene); PTCacheEdit *edit = PE_get_current(t->depsgraph, t->scene, ob); ParticleSystem *psys = NULL; diff --git a/source/blender/editors/transform/transform_convert_sculpt.c b/source/blender/editors/transform/transform_convert_sculpt.c index 0ac6bd9264f..70fec49d77d 100644 --- a/source/blender/editors/transform/transform_convert_sculpt.c +++ b/source/blender/editors/transform/transform_convert_sculpt.c @@ -49,7 +49,7 @@ void createTransSculpt(bContext *C, TransInfo *t) return; } - Object *ob = CTX_data_active_object(t->context); + Object *ob = OBACT(t->view_layer); SculptSession *ss = ob->sculpt; { @@ -101,7 +101,7 @@ void createTransSculpt(bContext *C, TransInfo *t) copy_m3_m4(td->axismtx, ob->obmat); BLI_assert(!(t->options & CTX_PAINT_CURVE)); - ED_sculpt_init_transform(C); + ED_sculpt_init_transform(C, ob); } /** \} */ @@ -113,7 +113,8 @@ void createTransSculpt(bContext *C, TransInfo *t) void recalcData_sculpt(TransInfo *t) { - ED_sculpt_update_modal_transform(t->context); + Object *ob = OBACT(t->view_layer); + ED_sculpt_update_modal_transform(t->context, ob); } void special_aftertrans_update__sculpt(bContext *C, TransInfo *t) @@ -124,8 +125,9 @@ void special_aftertrans_update__sculpt(bContext *C, TransInfo *t) return; } + Object *ob = OBACT(t->view_layer); BLI_assert(!(t->options & CTX_PAINT_CURVE)); - ED_sculpt_end_transform(C); + ED_sculpt_end_transform(C, ob); } /** \} */ From b0e483c373c5eb047d021636804d7d01d6b05da2 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 10 Feb 2021 22:54:45 -0600 Subject: [PATCH 080/519] Fix ASAN report when creating attribute math node The DNA struct name for the node storage was incorrect. --- source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index 5844edfbbb7..076f7a9ee28 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -290,6 +290,6 @@ void register_node_type_geo_attribute_math() node_type_update(&ntype, blender::nodes::geo_node_attribute_math_update); node_type_init(&ntype, geo_node_attribute_math_init); node_type_storage( - &ntype, "NodeAttributeCompare", node_free_standard_storage, node_copy_standard_storage); + &ntype, "NodeAttributeMath", node_free_standard_storage, node_copy_standard_storage); nodeRegisterType(&ntype); } From faad487b5825157cc953c54340647f71d3a06e9b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 11 Feb 2021 15:56:53 +1100 Subject: [PATCH 081/519] Cleanup: remove version check for unsupported cmake version --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44385d81ff6..78f49942a13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,10 +167,6 @@ if(APPLE) endif() option(WITH_BUILDINFO "Include extra build details (only disable for development & faster builds)" ON) -if(${CMAKE_VERSION} VERSION_LESS 2.8.8) - # add_library OBJECT arg unsupported - set(WITH_BUILDINFO OFF) -endif() set(BUILDINFO_OVERRIDE_DATE "" CACHE STRING "Use instead of the current date for reproducible builds (empty string disables this option)") set(BUILDINFO_OVERRIDE_TIME "" CACHE STRING "Use instead of the current time for reproducible builds (empty string disables this option)") set(CPACK_OVERRIDE_PACKAGENAME "" CACHE STRING "Use instead of the standard packagename (empty string disables this option)") From 9a9e19fdcc48622dba8f98c9afb10a6750ff22b0 Mon Sep 17 00:00:00 2001 From: Fabian Schempp Date: Thu, 11 Feb 2021 00:23:15 -0600 Subject: [PATCH 082/519] Geometry Nodes: Use multi-input socket in join geometry node This updates the join node to use the new multi-input socket from D10067. The change just requires slightly changing the arguments of the exec function, and changing the socket input list. Note that this commit does not contain the UI changes, it only allows for more input links, and combines the two sockets into one. The UI changes will come next. Reviewed By: Hans Goudey Differential Revision: https://developer.blender.org/D10069 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_290.c | 25 ++++++++++++++ .../geometry/nodes/node_geo_join_geometry.cc | 33 +++++++++++-------- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 549651dff6f..c6fe02202a6 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 6 +#define BLENDER_FILE_SUBVERSION 7 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 8891197a7d9..78d60715aa5 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -735,6 +735,23 @@ static void version_node_socket_name(bNodeTree *ntree, } } +static void version_node_join_geometry_for_multi_input_socket(bNodeTree *ntree) +{ + LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) { + if (link->tonode->type == GEO_NODE_JOIN_GEOMETRY && !(link->tosock->flag & SOCK_MULTI_INPUT)) { + link->tosock = link->tonode->inputs.first; + } + } + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + if (node->type == GEO_NODE_JOIN_GEOMETRY) { + bNodeSocket *socket = node->inputs.first; + socket->flag |= SOCK_MULTI_INPUT; + socket->limit = 4095; + nodeRemoveSocket(ntree, node, socket->next); + } + } +} + /* NOLINTNEXTLINE: readability-function-size */ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) { @@ -1679,6 +1696,14 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + if (!MAIN_VERSION_ATLEAST(bmain, 293, 7)) { + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type == NTREE_GEOMETRY) { + version_node_join_geometry_for_multi_input_socket(ntree); + } + } + FOREACH_NODETREE_END; + } /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index 384094b6d8c..a56939a43c7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -24,8 +24,16 @@ #include "node_geometry_util.hh" static bNodeSocketTemplate geo_node_join_geometry_in[] = { - {SOCK_GEOMETRY, N_("Geometry")}, - {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_GEOMETRY, + N_("Geometry"), + 0.0f, + 0.0f, + 0.0f, + 1.0f, + -1.0f, + 1.0f, + PROP_NONE, + SOCK_MULTI_INPUT}, {-1, ""}, }; @@ -252,11 +260,11 @@ static void join_components(Span src_components, Geomet } template -static void join_component_type(Span src_geometry_sets, GeometrySet &result) +static void join_component_type(Span src_geometry_sets, GeometrySet &result) { Vector components; - for (const GeometrySet *geometry_set : src_geometry_sets) { - const Component *component = geometry_set->get_component_for_read(); + for (const GeometrySet &geometry_set : src_geometry_sets) { + const Component *component = geometry_set.get_component_for_read(); if (component != nullptr && !component->is_empty()) { components.append(component); } @@ -274,16 +282,13 @@ static void join_component_type(Span src_geometry_sets, Geo static void geo_node_join_geometry_exec(GeoNodeExecParams params) { - GeometrySet geometry_set_a = params.extract_input("Geometry"); - GeometrySet geometry_set_b = params.extract_input("Geometry_001"); + Vector geometry_sets = params.extract_multi_input("Geometry"); + GeometrySet geometry_set_result; - - std::array src_geometry_sets = {&geometry_set_a, &geometry_set_b}; - - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); - join_component_type(src_geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); + join_component_type(geometry_sets, geometry_set_result); params.set_output("Geometry", std::move(geometry_set_result)); } From 8f707a72e81833bb835324ddc635b29dfbe87a9f Mon Sep 17 00:00:00 2001 From: Fabian Schempp Date: Thu, 11 Feb 2021 01:16:17 -0600 Subject: [PATCH 083/519] UI: Multi-input node socket spacing and interaction This commit makes links connected to multi-input sockets spread verticaly along the socket. Sockets grow if more links are connected and the node layout updates accordingly. Links are sorted by their incoming angle to avoid crossing links. Also, link picking is updated to work with spread links and bezier links. Currently the multi-input sockets are used in the join geometry node. The mutli-input sockets look like a vertical rounded rectangle. Currently they do not support the other custom socket shapes. Reviewed By Hans Goudey, with cleanup and additional edits Differential Revision: https://developer.blender.org/D10181 --- source/blender/blenkernel/intern/node.cc | 1 + source/blender/editors/space_node/drawnode.c | 21 +- source/blender/editors/space_node/node_draw.c | 154 ++++++++++++++- source/blender/editors/space_node/node_edit.c | 45 ++++- .../blender/editors/space_node/node_intern.h | 8 + .../editors/space_node/node_relationships.c | 186 +++++++++++++++--- source/blender/makesdna/DNA_node_types.h | 10 +- 7 files changed, 391 insertions(+), 34 deletions(-) diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index ed8dd84a9bb..e34afd1ce17 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -573,6 +573,7 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock) sock->typeinfo = nullptr; BLO_read_data_address(reader, &sock->storage); BLO_read_data_address(reader, &sock->default_value); + sock->total_inputs = 0; /* Clear runtime data set before drawing. */ sock->cache = nullptr; } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 2d65302c656..4716f1c29ea 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3560,10 +3560,10 @@ void draw_nodespace_back_pix(const bContext *C, } /* return quadratic beziers points for a given nodelink and clip if v2d is not NULL. */ -static bool node_link_bezier_handles(const View2D *v2d, - const SpaceNode *snode, - const bNodeLink *link, - float vec[4][2]) +bool node_link_bezier_handles(const View2D *v2d, + const SpaceNode *snode, + const bNodeLink *link, + float vec[4][2]) { float cursor[2] = {0.0f, 0.0f}; @@ -3591,6 +3591,9 @@ static bool node_link_bezier_handles(const View2D *v2d, if (link->tosock) { vec[3][0] = link->tosock->locx; vec[3][1] = link->tosock->locy; + if (!(link->tonode->flag & NODE_HIDDEN) && link->tosock->flag & SOCK_MULTI_INPUT) { + node_link_calculate_multi_input_position(link, vec[3]); + } toreroute = (link->tonode && link->tonode->type == NODE_REROUTE); } else { @@ -3902,7 +3905,7 @@ void node_draw_link_bezier(const View2D *v2d, int th_col3) { float vec[4][2]; - + const bool highlighted = link->flag & NODE_LINK_TEMP_HIGHLIGHT; if (node_link_bezier_handles(v2d, snode, link, vec)) { int drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) && (link->fromnode && (link->fromnode->type == NODE_REROUTE))); @@ -3911,7 +3914,7 @@ void node_draw_link_bezier(const View2D *v2d, nodelink_batch_init(); } - if (g_batch_link.enabled) { + if (g_batch_link.enabled && !highlighted) { /* Add link to batch. */ nodelink_batch_add_link( snode, vec[0], vec[1], vec[2], vec[3], th_col1, th_col2, th_col3, drawarrow); @@ -3925,6 +3928,12 @@ void node_draw_link_bezier(const View2D *v2d, UI_GetThemeColor4fv(th_col1, colors[1]); UI_GetThemeColor4fv(th_col2, colors[2]); + if (highlighted) { + float link_preselection_highlight_color[4]; + UI_GetThemeColor4fv(TH_SELECT, link_preselection_highlight_color); + copy_v4_v4(colors[2], link_preselection_highlight_color); + } + GPUBatch *batch = g_batch_link.batch_single; GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_NODELINK); GPU_batch_uniform_2fv_array(batch, "bezierPts", 4, vec); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 4dd945c4cf1..9ef914af75b 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -22,6 +22,8 @@ * \brief higher level node drawing for the node editor. */ +#include "MEM_guardedalloc.h" + #include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" @@ -500,6 +502,16 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) PointerRNA sockptr; RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr); + /* Add the half the height of a multi-input socket to cursor Y + * to account for the increased height of the taller sockets. */ + float multi_input_socket_offset = 0.0f; + if (nsock->flag & SOCK_MULTI_INPUT) { + if (nsock->total_inputs > 2) { + multi_input_socket_offset = (nsock->total_inputs - 2) * NODE_MULTI_INPUT_LINK_GAP; + } + } + dy -= multi_input_socket_offset * 0.5f; + uiLayout *layout = UI_block_layout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, @@ -533,7 +545,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) /* place the socket circle in the middle of the layout */ nsock->locy = 0.5f * (dy + buty); - dy = buty; + dy = buty - multi_input_socket_offset * 0.5; if (nsock->next) { dy -= NODE_SOCKDY; } @@ -751,6 +763,27 @@ static void node_socket_draw(const bNodeSocket *sock, immVertex2f(pos_id, locx, locy); } +static void node_socket_draw_multi_input(const float color[4], + const float color_outline[4], + const float width, + const float height, + const int locx, + const int locy) +{ + const float outline_width = 1.0f; + /* UI_draw_roundbox draws the outline on the outer side, so compensate for the outline width. */ + const rctf rect = { + .xmin = locx - width + outline_width * 0.5f, + .xmax = locx + width - outline_width * 0.5f, + .ymin = locy - height + outline_width * 0.5f, + .ymax = locy + height - outline_width * 0.5f, + }; + + UI_draw_roundbox_corner_set(UI_CNR_ALL); + UI_draw_roundbox_4fv_ex( + &rect, color, NULL, 1.0f, color_outline, outline_width, width - outline_width * 0.5f); +} + static void node_socket_outline_color_get(bool selected, float r_outline_color[4]) { if (selected) { @@ -1006,6 +1039,10 @@ void node_draw_sockets(const View2D *v2d, selected_input_len++; continue; } + /* Don't draw multi-input sockets here since they are drawn in a different batch. */ + if (sock->flag & SOCK_MULTI_INPUT) { + continue; + } node_socket_draw_nested(C, ntree, @@ -1115,6 +1152,28 @@ void node_draw_sockets(const View2D *v2d, GPU_program_point_size(false); GPU_blend(GPU_BLEND_NONE); + + /* Draw multi-nput sockets after the others because they are drawn with "UI_roundbox" + * rather than with GL_POINT. */ + LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { + if (nodeSocketIsHidden(socket)) { + continue; + } + if (!(socket->flag & SOCK_MULTI_INPUT)) { + continue; + } + + const bool is_node_hidden = (node->flag & NODE_HIDDEN); + const float width = NODE_SOCKSIZE; + float height = is_node_hidden ? width : node_socket_calculate_height(socket) - width; + + float color[4]; + float outline_color[4]; + node_socket_color_get((bContext *)C, ntree, &node_ptr, socket, color); + node_socket_outline_color_get(selected, outline_color); + + node_socket_draw_multi_input(color, outline_color, width, height, socket->locx, socket->locy); + } } static void node_draw_basis(const bContext *C, @@ -1590,17 +1649,67 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) } } +static void count_mutli_input_socket_links(bNodeTree *ntree, SpaceNode *snode) +{ + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + LISTBASE_FOREACH (struct bNodeSocket *, socket, &node->inputs) { + if (socket->flag & SOCK_MULTI_INPUT) { + socket->total_inputs = 0; + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { + if (link->tosock == socket) { + socket->total_inputs++; + } + } + /* Count temporary links going into this socket. */ + LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { + LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) { + bNodeLink *link = (bNodeLink *)linkdata->data; + if (link->tosock == socket) { + socket->total_inputs++; + } + } + } + } + } + } +} + void node_update_nodetree(const bContext *C, bNodeTree *ntree) { /* make sure socket "used" tags are correct, for displaying value buttons */ + SpaceNode *snode = CTX_wm_space_node(C); ntreeTagUsedSockets(ntree); + count_mutli_input_socket_links(ntree, snode); + /* update nodes front to back, so children sizes get updated before parents */ LISTBASE_FOREACH_BACKWARD (bNode *, node, &ntree->nodes) { node_update(C, ntree, node); } } +static int compare_link_by_angle_to_node(const void *a, const void *b) +{ + const bNodeLink *link_a = *(const bNodeLink **)a; + const bNodeLink *link_b = *(const bNodeLink **)b; + + BLI_assert(link_a->tosock == link_b->tosock); + const float socket_location[2] = {link_a->tosock->locx, link_a->tosock->locy}; + const float up_direction[2] = {0.0f, 1.0f}; + + float delta_a[2] = {link_a->fromsock->locx - socket_location[0], + link_a->fromsock->locy - socket_location[1]}; + normalize_v2(delta_a); + const float angle_a = angle_normalized_v2v2(up_direction, delta_a); + + float delta_b[2] = {link_b->fromsock->locx - socket_location[0], + link_b->fromsock->locy - socket_location[1]}; + normalize_v2(delta_b); + const float angle_b = angle_normalized_v2v2(up_direction, delta_b); + + return angle_a < angle_b ? 1 : -1; +} + static void node_draw(const bContext *C, ARegion *region, SpaceNode *snode, @@ -1615,6 +1724,46 @@ static void node_draw(const bContext *C, #define USE_DRAW_TOT_UPDATE +/** + * Automatically sort the input links to multi-input sockets to avoid crossing noodles. + */ +static void sort_multi_input_socket_links(bNodeTree *ntree, SpaceNode *snode) +{ + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { + if (socket->flag & SOCK_MULTI_INPUT) { + /* The total is calculated in #node_update_nodetree, which runs before this draw step. */ + const int total_inputs = socket->total_inputs; + bNodeLink **input_links = MEM_malloc_arrayN(total_inputs, sizeof(bNodeLink *), __func__); + + int index = 0; + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { + if (link->tosock == socket) { + input_links[index] = (bNodeLink *)link; + index++; + } + } + LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { + LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) { + bNodeLink *link = (bNodeLink *)linkdata->data; + if (link->tosock == socket) { + input_links[index] = (bNodeLink *)link; + index++; + } + } + } + + qsort(input_links, total_inputs, sizeof(bNodeLink *), compare_link_by_angle_to_node); + for (int i = 0; i < total_inputs; i++) { + input_links[i]->multi_input_socket_index = i; + } + + MEM_freeN(input_links); + } + } + } +} + void node_draw_nodetree(const bContext *C, ARegion *region, SpaceNode *snode, @@ -1650,6 +1799,9 @@ void node_draw_nodetree(const bContext *C, /* node lines */ GPU_blend(GPU_BLEND_ALPHA); nodelink_batch_start(snode); + + sort_multi_input_socket_links(ntree, snode); + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { if (!nodeLinkIsHidden(link)) { node_draw_link(®ion->v2d, snode, link); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index c006889f0f7..04787748937 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -98,6 +98,25 @@ typedef struct CompoJob { float *progress; } CompoJob; +float node_socket_calculate_height(const bNodeSocket *socket) +{ + float sock_height = NODE_SOCKSIZE * 2.0f; + if (socket->flag & SOCK_MULTI_INPUT) { + sock_height += max_ii(NODE_MULTI_INPUT_LINK_GAP * 0.5f * socket->total_inputs, NODE_SOCKSIZE); + } + return sock_height; +} + +void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]) +{ + float offset = (link->tosock->total_inputs * NODE_MULTI_INPUT_LINK_GAP - + NODE_MULTI_INPUT_LINK_GAP) * + 0.5; + r[0] = link->tosock->locx - NODE_SOCKSIZE * 0.5f; + r[1] = link->tosock->locy - offset + + (link->multi_input_socket_index * NODE_MULTI_INPUT_LINK_GAP); +} + static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags) { LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) { @@ -1104,6 +1123,21 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) } /* checks snode->mouse position, and returns found node/socket */ +static bool cursor_isect_multi_input_socket(const float cursor[2], const bNodeSocket *socket) +{ + const float node_socket_height = node_socket_calculate_height(socket); + const rctf multi_socket_rect = { + .xmin = socket->locx - NODE_SOCKSIZE * 4, + .xmax = socket->locx + NODE_SOCKSIZE, + .ymin = socket->locy - node_socket_height * 0.5 - NODE_SOCKSIZE * 2.0f, + .ymax = socket->locy + node_socket_height * 0.5 + NODE_SOCKSIZE * 2.0f, + }; + if (BLI_rctf_isect_pt(&multi_socket_rect, cursor[0], cursor[1])) { + return true; + } + return false; +} + /* type is SOCK_IN and/or SOCK_OUT */ int node_find_indicated_socket( SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, float cursor[2], int in_out) @@ -1132,7 +1166,16 @@ int node_find_indicated_socket( if (in_out & SOCK_IN) { LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (!nodeSocketIsHidden(sock)) { - if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) { + if (sock->flag & SOCK_MULTI_INPUT && !(node->flag & NODE_HIDDEN)) { + if (cursor_isect_multi_input_socket(cursor, sock)) { + if (node == visible_node(snode, &rect)) { + *nodep = node; + *sockp = sock; + return 1; + } + } + } + else if (BLI_rctf_isect_pt(&rect, sock->locx, sock->locy)) { if (node == visible_node(snode, &rect)) { *nodep = node; *sockp = sock; diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 51333fd5a09..2f3fa6996af 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -78,6 +78,9 @@ typedef struct SpaceNode_Runtime { void space_node_group_offset(struct SpaceNode *snode, float *x, float *y); /* node_draw.c */ +float node_socket_calculate_height(const bNodeSocket *socket); +void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]); + int node_get_colorid(struct bNode *node); int node_get_resize_cursor(int directions); void node_draw_shadow(const struct SpaceNode *snode, @@ -178,6 +181,10 @@ bool node_link_bezier_points(const struct View2D *v2d, const struct bNodeLink *link, float coord_array[][2], const int resol); +bool node_link_bezier_handles(const struct View2D *v2d, + const struct SpaceNode *snode, + const struct bNodeLink *link, + float vec[4][2]); void draw_nodespace_back_pix(const struct bContext *C, struct ARegion *region, struct SpaceNode *snode, @@ -290,6 +297,7 @@ extern const char *node_context_dir[]; #define NODE_HEIGHT(node) (node->height * UI_DPI_FAC) #define NODE_MARGIN_X (1.10f * U.widget_unit) #define NODE_SOCKSIZE (0.25f * U.widget_unit) +#define NODE_MULTI_INPUT_LINK_GAP (0.25f * U.widget_unit) #define NODE_RESIZE_MARGIN (0.20f * U.widget_unit) #define NODE_LINK_RESOL 12 diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c index f3ce60bbcd9..93accad319f 100644 --- a/source/blender/editors/space_node/node_relationships.c +++ b/source/blender/editors/space_node/node_relationships.c @@ -32,6 +32,7 @@ #include "BKE_anim_data.h" #include "BKE_context.h" +#include "BKE_curve.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" @@ -179,6 +180,137 @@ typedef struct NodeInsertOfsData { float offset_x; /* offset to apply to node chain */ } NodeInsertOfsData; +static void clear_picking_highlight(ListBase *links) +{ + LISTBASE_FOREACH (bNodeLink *, link, links) { + link->flag &= ~NODE_LINK_TEMP_HIGHLIGHT; + } +} + +static LinkData *create_drag_link(Main *bmain, SpaceNode *snode, bNode *node, bNodeSocket *sock) +{ + LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); + bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); + linkdata->data = oplink; + if (sock->in_out == SOCK_OUT) { + oplink->fromnode = node; + oplink->fromsock = sock; + } + else { + oplink->tonode = node; + oplink->tosock = sock; + } + oplink->flag |= NODE_LINK_VALID; + oplink->flag &= ~NODE_LINK_TEST; + if (node_connected_to_output(bmain, snode->edittree, node)) { + oplink->flag |= NODE_LINK_TEST; + } + return linkdata; +} + +static void pick_link(const bContext *C, + wmOperator *op, + bNodeLinkDrag *nldrag, + SpaceNode *snode, + bNode *node, + bNodeLink *link_to_pick) +{ + clear_picking_highlight(&snode->edittree->links); + RNA_boolean_set(op->ptr, "has_link_picked", true); + + Main *bmain = CTX_data_main(C); + LinkData *linkdata = create_drag_link( + bmain, snode, link_to_pick->fromnode, link_to_pick->fromsock); + + BLI_addtail(&nldrag->links, linkdata); + nodeRemLink(snode->edittree, link_to_pick); + /* Send changed event to original link->tonode. */ + if (node) { + snode_update(snode, node); + } +} + +static void pick_input_link_by_link_intersect(const bContext *C, + wmOperator *op, + bNodeLinkDrag *nldrag, + const float *cursor) +{ + SpaceNode *snode = CTX_wm_space_node(C); + const ARegion *region = CTX_wm_region(C); + const View2D *v2d = ®ion->v2d; + + float drag_start[2]; + RNA_float_get_array(op->ptr, "drag_start", drag_start); + bNode *node; + bNodeSocket *socket; + node_find_indicated_socket(snode, &node, &socket, drag_start, SOCK_IN); + + const float trigger_drag_distance = 25.0f; + const float cursor_link_touch_distance = 25.0f; + + const float socket_height = node_socket_calculate_height(socket); + + float cursor_to_socket_relative[2]; + float socket_position[2] = {socket->locx, socket->locy}; + sub_v2_v2v2(cursor_to_socket_relative, cursor, socket_position); + float distance_from_socket_v2[2] = { + max_ff(0, fabs(cursor_to_socket_relative[0]) - NODE_SOCKSIZE * 0.5), + max_ff(0, fabs(cursor_to_socket_relative[1]) - socket_height)}; + const float distance_from_socket = len_v2(distance_from_socket_v2); + + const int resolution = NODE_LINK_RESOL; + + bNodeLink *link_to_pick = NULL; + clear_picking_highlight(&snode->edittree->links); + LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { + if (link->tosock == socket) { + /* Test if the cursor is near a link. */ + float vec[4][2]; + node_link_bezier_handles(v2d, snode, link, vec); + + float data[NODE_LINK_RESOL * 2 + 2]; + BKE_curve_forward_diff_bezier( + vec[0][0], vec[1][0], vec[2][0], vec[3][0], data, resolution, sizeof(float[2])); + BKE_curve_forward_diff_bezier( + vec[0][1], vec[1][1], vec[2][1], vec[3][1], data + 1, resolution, sizeof(float[2])); + + for (int i = 0; i < resolution * 2; i += 2) { + float *l1 = &data[i]; + float *l2 = &data[i + 2]; + float distance = dist_squared_to_line_segment_v2(cursor, l1, l2); + if (distance < cursor_link_touch_distance) { + link_to_pick = link; + RNA_int_set(op->ptr, "last_picked_link_index", link->multi_input_socket_index); + } + } + } + } + + /* If no linked was picked in this call, try using the one picked in the previous call. + * Not essential for the basic behavior, but can make interaction feel a bit better if + * the mouse moves to the right and loses the "selection." */ + if (!link_to_pick) { + int last_picked_link_index = RNA_int_get(op->ptr, "last_picked_link_index"); + if (last_picked_link_index > -1) { + LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { + if (link->multi_input_socket_index == last_picked_link_index) { + link_to_pick = link; + } + } + } + } + + if (link_to_pick) { + /* Highlight is set here and cleared in the next iteration or if the operation finishes. */ + link_to_pick->flag |= NODE_LINK_TEMP_HIGHLIGHT; + ED_area_tag_redraw(CTX_wm_area(C)); + + if (distance_from_socket > trigger_drag_distance) { + pick_link(C, op, nldrag, snode, node, link_to_pick); + } + } +} + static int sort_nodes_locx(const void *a, const void *b) { const bNodeListItem *nli1 = a; @@ -600,6 +732,13 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeLink *link) tlink = NULL; to_count--; } + /* Also remove link if it comes from the same output. */ + if (tlink->fromsock == from) { + nodeRemLink(ntree, tlink); + tlink = NULL; + to_count--; + from_count--; + } } } } @@ -748,10 +887,15 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event) switch (event->type) { case MOUSEMOVE: - node_link_find_socket(C, op, cursor); + if (nldrag->from_multi_input_socket && !RNA_boolean_get(op->ptr, "has_link_picked")) { + pick_input_link_by_link_intersect(C, op, nldrag, cursor); + } + else { + node_link_find_socket(C, op, cursor); - node_link_update_header(C, nldrag); - ED_region_tag_redraw(region); + node_link_update_header(C, nldrag); + ED_region_tag_redraw(region); + } break; case LEFTMOUSE: @@ -762,6 +906,8 @@ static int node_link_modal(bContext *C, wmOperator *op, const wmEvent *event) ED_workspace_status_text(C, NULL); ED_region_tag_redraw(region); + SpaceNode *snode = CTX_wm_space_node(C); + clear_picking_highlight(&snode->edittree->links); return OPERATOR_FINISHED; } break; @@ -817,16 +963,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor /* dragged links are fixed on output side */ nldrag->in_out = SOCK_OUT; /* create a new link */ - LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); - bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); - linkdata->data = oplink; - oplink->fromnode = node; - oplink->fromsock = sock; - oplink->flag |= NODE_LINK_VALID; - oplink->flag &= ~NODE_LINK_TEST; - if (node_connected_to_output(bmain, snode->edittree, node)) { - oplink->flag |= NODE_LINK_TEST; - } + LinkData *linkdata = create_drag_link(bmain, snode, node, sock); BLI_addtail(&nldrag->links, linkdata); } @@ -875,16 +1012,7 @@ static bNodeLinkDrag *node_link_init(Main *bmain, SpaceNode *snode, float cursor /* dragged links are fixed on input side */ nldrag->in_out = SOCK_IN; /* create a new link */ - LinkData *linkdata = MEM_callocN(sizeof(LinkData), "drag link op link data"); - bNodeLink *oplink = MEM_callocN(sizeof(bNodeLink), "drag link op link"); - linkdata->data = oplink; - oplink->tonode = node; - oplink->tosock = sock; - oplink->flag |= NODE_LINK_VALID; - oplink->flag &= ~NODE_LINK_TEST; - if (node_connected_to_output(bmain, snode->edittree, node)) { - oplink->flag |= NODE_LINK_TEST; - } + LinkData *linkdata = create_drag_link(bmain, snode, node, sock); BLI_addtail(&nldrag->links, linkdata); } @@ -904,6 +1032,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, const wmEvent *event) float cursor[2]; UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &cursor[0], &cursor[1]); RNA_float_set_array(op->ptr, "drag_start", cursor); + RNA_int_set(op->ptr, "last_picked_link_index", -1); RNA_boolean_set(op->ptr, "has_link_picked", false); ED_preview_kill_jobs(CTX_wm_manager(C), bmain); @@ -931,6 +1060,7 @@ static void node_link_cancel(bContext *C, wmOperator *op) BLI_freelistN(&nldrag->links); MEM_freeN(nldrag); + clear_picking_highlight(&snode->edittree->links); } void NODE_OT_link(wmOperatorType *ot) @@ -972,6 +1102,16 @@ void NODE_OT_link(wmOperatorType *ot) -UI_PRECISION_FLOAT_MAX, UI_PRECISION_FLOAT_MAX); RNA_def_property_flag(prop, PROP_HIDDEN); + RNA_def_int(ot->srna, + "last_picked_link_index", + -1, + -1, + 4095, + "Last Picked Link Index", + "The index of the last picked link on a multi-input socket", + -1, + 4095); + RNA_def_property_flag(prop, PROP_HIDDEN); } /* ********************** Make Link operator ***************** */ diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index c5d2384b1aa..43c5fa81651 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -118,7 +118,9 @@ typedef struct bNodeSocket { /* XXX deprecated, kept for forward compatibility */ short stack_type DNA_DEPRECATED; char display_shape; - char _pad[3]; + char _pad[1]; + /* Runtime-only cache of the number of input links, for multi-input sockets. */ + short total_inputs; /** Custom dynamic defined label, MAX_NAME. */ char label[64]; @@ -391,13 +393,15 @@ typedef struct bNodeLink { bNodeSocket *fromsock, *tosock; int flag; - char _pad[4]; + /* A runtime storage for automatically sorted links to multi-input sockets. */ + int multi_input_socket_index; } bNodeLink; /* link->flag */ #define NODE_LINKFLAG_HILITE (1 << 0) /* link has been successfully validated */ #define NODE_LINK_VALID (1 << 1) -#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */ +#define NODE_LINK_TEST (1 << 2) /* free test flag, undefined */ +#define NODE_LINK_TEMP_HIGHLIGHT (1 << 3) /* Link is highlighted for picking. */ /* tree->edit_quality/tree->render_quality */ #define NTREE_QUALITY_HIGH 0 From 69e191604b55b5c64acfb3d29253aca33fb023bb Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 11 Feb 2021 11:50:12 +0100 Subject: [PATCH 084/519] Fix T85541: crash when replacing an existing node link It's not necessary to check if the link has to be removed, if it was removed already. This regression was caused by rB8f707a72e81833bb835324ddc635b29dfbe87a9f. --- source/blender/editors/space_node/node_relationships.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c index 93accad319f..d6edfcce8e8 100644 --- a/source/blender/editors/space_node/node_relationships.c +++ b/source/blender/editors/space_node/node_relationships.c @@ -732,8 +732,8 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeLink *link) tlink = NULL; to_count--; } - /* Also remove link if it comes from the same output. */ - if (tlink->fromsock == from) { + else if (tlink->fromsock == from) { + /* Also remove link if it comes from the same output. */ nodeRemLink(ntree, tlink); tlink = NULL; to_count--; From 349c17cf5436d3726d22bcf61160b1e3cb320e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Thu, 11 Feb 2021 11:54:29 +0100 Subject: [PATCH 085/519] Fix T85462: crash in render mode while removing instances This crash is caused by accessing object data in the kernel at an out of bound index from a deleted instance. Cycles represents instances as Object nodes sharing the same Geometry node, so we need to tag the GeometryManager for an update if some objects are added or removed as no geometry might have been added or removed in order to properly update the BVH and its associated data arrays. Regression caused by rBbbe6d4492823. --- intern/cycles/render/object.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 0f16a4fc12c..e837be9e6fb 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -915,7 +915,15 @@ void ObjectManager::tag_update(Scene *scene, uint32_t flag) /* avoid infinite loops if the geometry manager tagged us for an update */ if ((flag & GEOMETRY_MANAGER) == 0) { - scene->geometry_manager->tag_update(scene, GeometryManager::OBJECT_MANAGER); + uint32_t geometry_flag = GeometryManager::OBJECT_MANAGER; + + /* Also notify in case added or removed objects were instances, as no Geometry might have been + * added or removed, but the BVH still needs to updated. */ + if ((flag & (OBJECT_ADDED | OBJECT_REMOVED)) != 0) { + geometry_flag |= (GeometryManager::GEOMETRY_ADDED | GeometryManager::GEOMETRY_REMOVED); + } + + scene->geometry_manager->tag_update(scene, geometry_flag); } scene->light_manager->tag_update(scene, LightManager::OBJECT_MANAGER); From b20872d36ebcf8777b8a6970425ebbdd81eac29d Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 11 Feb 2021 11:48:53 +0100 Subject: [PATCH 086/519] Fix T85543: Object Types Visibility missing shading notifier Caused by rB0f95f51361d7. Similar to T85515, T84717 and their related fixes. In this case, add missing shading notifier as in rB9274bd457a25. Maniphest Tasks: T85543 Differential Revision: https://developer.blender.org/D10395 --- source/blender/makesrna/intern/rna_space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index f5ec0751015..251845ee5b0 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4636,7 +4636,7 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna( prop, NULL, view_mask_member[mask_index], info[type_index].type_mask); RNA_def_property_ui_text(prop, info[type_index].name, ""); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); } } From dabf96f732d1ce5f44f53230317ff0d0b8a380df Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 11 Feb 2021 13:44:58 +0100 Subject: [PATCH 087/519] Attributes: support bool attribute in rna Differential Revision: https://developer.blender.org/D10387 --- source/blender/makesdna/DNA_meshdata_types.h | 3 ++ source/blender/makesrna/RNA_access.h | 1 + .../blender/makesrna/intern/rna_attribute.c | 35 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index f9af7a011e0..05be31262a6 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -271,6 +271,9 @@ typedef struct MIntProperty { typedef struct MStringProperty { char s[255], s_len; } MStringProperty; +typedef struct MBoolProperty { + uint8_t b; +} MBoolProperty; /** \} */ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 35b174f0da8..eaa2675573c 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -91,6 +91,7 @@ extern StructRNA RNA_BoidSettings; extern StructRNA RNA_BoidState; extern StructRNA RNA_Bone; extern StructRNA RNA_BoneGroup; +extern StructRNA RNA_BoolAttribute; extern StructRNA RNA_BoolProperty; extern StructRNA RNA_BooleanModifier; extern StructRNA RNA_Brush; diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c index 7cd6e375a82..21b26b51e0a 100644 --- a/source/blender/makesrna/intern/rna_attribute.c +++ b/source/blender/makesrna/intern/rna_attribute.c @@ -169,6 +169,9 @@ static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRN case CD_PROP_STRING: struct_size = sizeof(MStringProperty); break; + case CD_PROP_BOOL: + struct_size = sizeof(MBoolProperty); + break; default: struct_size = 0; length = 0; @@ -299,6 +302,9 @@ PointerRNA rna_AttributeGroup_iterator_get(CollectionPropertyIterator *iter) case CD_PROP_STRING: type = &RNA_StringAttribute; break; + case CD_PROP_BOOL: + type = &RNA_BoolAttribute; + break; default: return PointerRNA_NULL; } @@ -555,6 +561,34 @@ static void rna_def_attribute_string(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); } +static void rna_def_attribute_bool(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "BoolAttribute", "Attribute"); + RNA_def_struct_sdna(srna, "CustomDataLayer"); + RNA_def_struct_ui_text(srna, "Bool Attribute", "Bool geometry attribute"); + + prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "BoolAttributeValue"); + RNA_def_property_collection_funcs(prop, + "rna_Attribute_data_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + "rna_Attribute_data_length", + NULL, + NULL, + NULL); + + srna = RNA_def_struct(brna, "BoolAttributeValue", NULL); + RNA_def_struct_sdna(srna, "MBoolProperty"); + RNA_def_struct_ui_text(srna, "Bool Attribute Value", "Bool value in geometry attribute"); + prop = RNA_def_property(srna, "value", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "b", 0x01); +} + static void rna_def_attribute(BlenderRNA *brna) { PropertyRNA *prop; @@ -592,6 +626,7 @@ static void rna_def_attribute(BlenderRNA *brna) rna_def_attribute_byte_color(brna); rna_def_attribute_int(brna); rna_def_attribute_string(brna); + rna_def_attribute_bool(brna); } /* Mesh/PointCloud/Hair.attributes */ From 196dfc01a3e99c3bef0e44acf599bca50ae0300e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 00:09:48 +1100 Subject: [PATCH 088/519] Fix T84114: Existence of vertex groups slows down mesh editing Having a vertex group in a mesh slowed down unrelated operations such as selection. De-duplicating custom-data arrays for layers that contain pointers can become slow without any benefit as the content never matches. Use full copies when storing custom-data for edit-mesh undo. --- source/blender/blenkernel/BKE_customdata.h | 1 + source/blender/blenkernel/intern/customdata.c | 12 ++++++++++ source/blender/editors/mesh/editmesh_undo.c | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 51650d161ea..57fdafaf8d9 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -421,6 +421,7 @@ int CustomData_sizeof(int type); /* get the name of a layer type */ const char *CustomData_layertype_name(int type); bool CustomData_layertype_is_singleton(int type); +bool CustomData_layertype_is_dynamic(int type); int CustomData_layertype_layers_max(const int type); /* make sure the name of layer at index is unique */ diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index b0994fb683a..1121df0d568 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -4290,6 +4290,18 @@ bool CustomData_layertype_is_singleton(int type) return typeInfo->defaultname == NULL; } +/** + * Has dynamically allocated members. + * This is useful to know if operations such as #memcmp are + * valid when comparing data from two layers. + */ +bool CustomData_layertype_is_dynamic(int type) +{ + const LayerTypeInfo *typeInfo = layerType_getInfo(type); + + return (typeInfo->free != NULL); +} + /** * \return Maximum number of layers of given \a type, -1 means 'no limit'. */ diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index 1cbbbccdfa9..41bb3faa135 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -153,6 +153,23 @@ static void um_arraystore_cd_compact(struct CustomData *cdata, for (int layer_start = 0, layer_end; layer_start < cdata->totlayer; layer_start = layer_end) { const CustomDataType type = cdata->layers[layer_start].type; + /* Perform a full copy on dynamic layers. + * + * Unfortunately we can't compare dynamic layer types as they contain allocated pointers, + * which burns CPU cycles looking for duplicate data that doesn't exist. + * The array data isn't comparable once copied from the mesh, + * this bottlenecks on high poly meshes, see T84114. + * + * Notes: + * + * - Ideally the data would be expanded into a format that could be de-duplicated effectively, + * this would require a flat representation of each dynamic custom-data layer. + * + * - The data in the layer could be kept as-is to save on the extra copy, + * it would complicate logic in this function. + */ + const bool layer_type_is_dynamic = CustomData_layertype_is_dynamic(type); + layer_end = layer_start + 1; while ((layer_end < cdata->totlayer) && (type == cdata->layers[layer_end].type)) { layer_end++; @@ -209,6 +226,11 @@ static void um_arraystore_cd_compact(struct CustomData *cdata, i < bcd_reference_current->states_len) ? bcd_reference_current->states[i] : NULL; + /* See comment on `layer_type_is_dynamic` above. */ + if (layer_type_is_dynamic) { + state_reference = NULL; + } + bcd->states[i] = BLI_array_store_state_add( bs, layer->data, (size_t)data_len * stride, state_reference); } From 4f8bc3e35ca2bdf3907f6506b113ebecdcd37957 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 11 Feb 2021 15:55:33 +0100 Subject: [PATCH 089/519] GPencil: Move Autofit parameter from topbar to advanced panel As this is used only in corner cases, it is better keep in advanced panel. Also renamed to "Limit to Viewport" --- release/scripts/startup/bl_ui/properties_paint_common.py | 2 -- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 4 ++++ source/blender/makesrna/intern/rna_brush.c | 9 +++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 30e50bde969..54c6de30ef8 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -1223,8 +1223,6 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) row.prop(gp_settings, "fill_leak", text="Leak Size") row = layout.row(align=True) row.prop(brush, "size", text="Thickness") - row = layout.row(align=True) - row.prop(gp_settings, "use_fill_autofit", text="", icon="SNAP_FACE_CENTER") else: # brush.gpencil_tool == 'DRAW/TINT': row = layout.row(align=True) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 20ec26200f6..f93a6f3346b 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1463,6 +1463,10 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): sub.active = gp_settings.show_fill sub.prop(gp_settings, "fill_threshold", text="") + col.separator() + row = col.row(align=True) + row.prop(gp_settings, "use_fill_limit") + class VIEW3D_PT_tools_grease_pencil_brush_stroke(Panel, View3DPanel): bl_context = ".greasepencil_paint" diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 6e2e986ebf8..3dcc9471906 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -1849,13 +1849,10 @@ static void rna_def_gpencil_options(BlenderRNA *brna) prop, "Show Fill", "Show transparent lines to use as boundary for filling"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - prop = RNA_def_property(srna, "use_fill_autofit", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_FIT_DISABLE); + prop = RNA_def_property(srna, "use_fill_limit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_FIT_DISABLE); RNA_def_property_boolean_default(prop, true); - RNA_def_property_ui_text( - prop, - "Automatic Fit", - "Fit the shape of the stroke to try to fill areas outside visible viewport"); + RNA_def_property_ui_text(prop, "Limit to Viewport", "Fill only visible areas in viewport"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); prop = RNA_def_property(srna, "use_default_eraser", PROP_BOOLEAN, PROP_NONE); From 314525b8cfae9ca6a6aab79cd9b7061dda3f2db4 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 11 Feb 2021 10:22:57 -0600 Subject: [PATCH 090/519] Fix T85555: Geometry Nodes: Attribute Vector Math Wrap is broken This was just a copy and paste error / typo. The proper DNA variable wasn't used. Thanks @charlie for finding the issue. --- source/blender/makesrna/intern/rna_nodetree.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 5afc892820c..f9b5041b1cf 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -8609,9 +8609,9 @@ static void def_geo_attribute_vector_math(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); prop = RNA_def_property(srna, "input_type_c", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_b"); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_c"); RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector); - RNA_def_property_ui_text(prop, "Input Type B", ""); + RNA_def_property_ui_text(prop, "Input Type C", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } From 6a5d17bfb2b714d2b662f3fbb6cc6f73fb0293a3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 11 Feb 2021 10:27:25 -0600 Subject: [PATCH 091/519] Cleanup: Remove unused variable --- .../blender/nodes/geometry/nodes/node_geo_collection_info.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc index 42ad434ffcd..8391c4e2bc0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -72,9 +72,6 @@ static void geo_node_collection_info_exec(GeoNodeExecParams params) copy_v3_v3(transform_mat[3], collection->instance_offset); mul_m4_m4_pre(transform_mat, self_object->imat); - - float3 self_loc; - copy_v3_v3(self_loc, self_object->obmat[3]); } instances.add_instance(instance, transform_mat, -1); From 916e3b6e3d0c1e881ff6afb845f7dbddede7f8bd Mon Sep 17 00:00:00 2001 From: Habib Gahbiche Date: Thu, 11 Feb 2021 22:56:51 +0530 Subject: [PATCH 092/519] Cleanup: delete comments with test index Tests are not identified with indexes, so no need to maintain comments with indexes anymore Reviewed By: calra, mont29 Differential Revision: https://developer.blender.org/D10277 --- tests/python/modules/mesh_test.py | 2 +- tests/python/operators.py | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/tests/python/modules/mesh_test.py b/tests/python/modules/mesh_test.py index b1dadfdb5af..a58b803b22d 100644 --- a/tests/python/modules/mesh_test.py +++ b/tests/python/modules/mesh_test.py @@ -580,7 +580,7 @@ class MeshTest: compare_success = (compare_result == 'Same') # Also check if invalid geometry (which is never expected) had to be corrected... - validation_success = evaluated_test_mesh.validate(verbose=True) == False + validation_success = not evaluated_test_mesh.validate(verbose=True) if compare_success and validation_success: if self.verbose: diff --git a/tests/python/operators.py b/tests/python/operators.py index 93cdfebab7b..db7e70c09c4 100644 --- a/tests/python/operators.py +++ b/tests/python/operators.py @@ -37,7 +37,6 @@ MONKEY_LOOP_EDGE = {131, 278, 299, 305, 307, 334, 337, 359, 384, 396, 399, 412, def main(): tests = [ - #### 0 # bisect MeshTest("CubeBisect", "testCubeBisect", "expectedCubeBisect", [OperatorSpecEditMode("bisect", @@ -57,7 +56,6 @@ def main(): [OperatorSpecEditMode("decimate", {"ratio": 0.1}, "FACE", {i for i in range(500)})]), - ### 4 # delete MeshTest("CubeDeleteVertices", "testCubeDeleteVertices", "expectedCubeDeleteVertices", [OperatorSpecEditMode("delete", {}, "VERT", {3})]), @@ -75,7 +73,6 @@ def main(): "expectedMonkeyDeleteEdgeLoopEdges", [OperatorSpecEditMode("delete_edgeloop", {}, "EDGE", MONKEY_LOOP_EDGE)]), - ### 9 # delete loose MeshTest("CubeDeleteLooseVertices", "testCubeDeleteLooseVertices", "expectedCubeDeleteLooseVertices", @@ -98,7 +95,6 @@ def main(): "expectedCubeDissolveDegenerate", [OperatorSpecEditMode("dissolve_degenerate", {}, "VERT", {i for i in range(8)})]), - ### 13 # dissolve edges MeshTest("CylinderDissolveEdges", "testCylinderDissolveEdges", "expectedCylinderDissolveEdges", [OperatorSpecEditMode("dissolve_edges", {}, "EDGE", {0, 5, 6, 9})]), @@ -107,7 +103,6 @@ def main(): MeshTest("CubeDissolveFaces", "testCubeDissolveFaces", "expectedCubeDissolveFaces", [OperatorSpecEditMode("dissolve_faces", {}, "VERT", {5, 34, 47, 49, 83, 91, 95})]), - ### 15 # dissolve verts MeshTest("CubeDissolveVerts", "testCubeDissolveVerts", "expectedCubeDissolveVerts", [OperatorSpecEditMode("dissolve_verts", {}, "VERT", {16, 20, 22, 23, 25})]), @@ -124,7 +119,6 @@ def main(): MeshTest("ConeDuplicateEdges", "testConeDuplicateEdges", "expectedConeDuplicateEdges", [OperatorSpecEditMode("duplicate", {}, "EDGE", {i for i in range(64)})]), - ### 20 # edge collapse MeshTest("CylinderEdgeCollapse", "testCylinderEdgeCollapse", "expectedCylinderEdgeCollapse", [OperatorSpecEditMode("edge_collapse", {}, "EDGE", {1, 9, 4})]), @@ -143,7 +137,6 @@ def main(): MeshTest("CubeEdgeSplit", "testCubeEdgeSplit", "expectedCubeEdgeSplit", [OperatorSpecEditMode("edge_split", {}, "EDGE", {2, 5, 8, 11, 14, 17, 20, 23})]), - ### 25 # face make planar MeshTest("MonkeyFaceMakePlanar", "testMonkeyFaceMakePlanar", "expectedMonkeyFaceMakePlanar", @@ -166,14 +159,12 @@ def main(): MeshTest("PlaneFillGrid", "testPlaneFillGrid", "expectedPlaneFillGrid", [OperatorSpecEditMode("fill_grid", {}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15})]), - MeshTest("PlaneFillGridSimpleBlending", "testPlaneFillGridSimpleBlending", "expectedPlaneFillGridSimpleBlending", [OperatorSpecEditMode("fill_grid", {"use_interp_simple": True}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15})]), - ### 31 # fill holes MeshTest("SphereFillHoles", "testSphereFillHoles", "expectedSphereFillHoles", [OperatorSpecEditMode("fill_holes", {"sides": 9}, "VERT", {i for i in range(481)})]), @@ -184,7 +175,6 @@ def main(): {5, 16, 17, 19, 20, 22, 23, 34, 47, 49, 50, 52, 59, 61, 62, 65, 83, 91, 95})]), - MeshTest("CubeInsetEvenOffsetFalse", "testCubeInsetEvenOffsetFalse", "expectedCubeInsetEvenOffsetFalse", [OperatorSpecEditMode("inset", {"thickness": 0.2, "use_even_offset": False}, "VERT", From a608313860ff24f0ce45f9bcd7d8f0e25872ec96 Mon Sep 17 00:00:00 2001 From: Habib Gahbiche Date: Thu, 11 Feb 2021 23:07:00 +0530 Subject: [PATCH 093/519] Mesh automated testing: improve progress printing Print number of total tests with each test to show how many tests have been executed and how many are left. Example: `Running test 27/36: PlaneFaceSplitByEdges...` Reviewed By: calra, mont29 Differential Revision: https://developer.blender.org/D10278 --- tests/python/modules/mesh_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/python/modules/mesh_test.py b/tests/python/modules/mesh_test.py index a58b803b22d..020b1bff08f 100644 --- a/tests/python/modules/mesh_test.py +++ b/tests/python/modules/mesh_test.py @@ -662,8 +662,7 @@ class RunTest: test_name = each_test.test_name if self.verbose: print() - print("Running test {}...".format(test_number)) - print("Test name {}\n".format(test_name)) + print("Running test {}/{}: {}...".format(test_number+1, len(self.tests), test_name)) success = self.run_test(test_name) if not success: From ed817d62bd087686112fe4428ad47bd237dbef46 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 11 Feb 2021 13:53:20 -0300 Subject: [PATCH 094/519] Cleanup: Python GPU: Use consistent prefixes for local API It was not following the own documentation at the top code that mentions that for local API the prefix is "bpygpu_". --- source/blender/python/gpu/gpu_py_api.c | 8 ++++---- source/blender/python/gpu/gpu_py_matrix.c | 6 +++--- source/blender/python/gpu/gpu_py_matrix.h | 2 +- source/blender/python/gpu/gpu_py_select.c | 6 +++--- source/blender/python/gpu/gpu_py_select.h | 2 +- source/blender/python/gpu/gpu_py_shader.c | 6 +++--- source/blender/python/gpu/gpu_py_shader.h | 2 +- source/blender/python/gpu/gpu_py_types.c | 6 +++--- source/blender/python/gpu/gpu_py_types.h | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 33130291162..954118ffa5f 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -122,16 +122,16 @@ PyObject *BPyInit_gpu(void) mod = PyModule_Create(&GPU_module_def); - PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types())); + PyModule_AddObject(mod, "types", (submodule = bpygpu_types_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix())); + PyModule_AddObject(mod, "matrix", (submodule = bpygpu_matrix_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select())); + PyModule_AddObject(mod, "select", (submodule = bpygpu_select_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader())); + PyModule_AddObject(mod, "shader", (submodule = bpygpu_shader_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); return mod; diff --git a/source/blender/python/gpu/gpu_py_matrix.c b/source/blender/python/gpu/gpu_py_matrix.c index a479f270770..05e0a416b94 100644 --- a/source/blender/python/gpu/gpu_py_matrix.c +++ b/source/blender/python/gpu/gpu_py_matrix.c @@ -537,18 +537,18 @@ static struct PyMethodDef py_matrix_methods[] = { }; PyDoc_STRVAR(py_matrix_doc, "This module provides access to the matrix stack."); -static PyModuleDef BPyGPU_matrix_module_def = { +static PyModuleDef py_matrix_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.matrix", .m_doc = py_matrix_doc, .m_methods = py_matrix_methods, }; -PyObject *BPyInit_gpu_matrix(void) +PyObject *bpygpu_matrix_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_matrix_module_def); + submodule = PyModule_Create(&py_matrix_module_def); if (PyType_Ready(&BPyGPU_matrix_stack_context_Type) < 0) { return NULL; diff --git a/source/blender/python/gpu/gpu_py_matrix.h b/source/blender/python/gpu/gpu_py_matrix.h index 38a7f398b30..6af687f60ed 100644 --- a/source/blender/python/gpu/gpu_py_matrix.h +++ b/source/blender/python/gpu/gpu_py_matrix.h @@ -20,4 +20,4 @@ #pragma once -PyObject *BPyInit_gpu_matrix(void); +PyObject *bpygpu_matrix_init(void); diff --git a/source/blender/python/gpu/gpu_py_select.c b/source/blender/python/gpu/gpu_py_select.c index 4fa9d5ebc7a..e92ef9f7504 100644 --- a/source/blender/python/gpu/gpu_py_select.c +++ b/source/blender/python/gpu/gpu_py_select.c @@ -69,18 +69,18 @@ static struct PyMethodDef py_select_methods[] = { }; PyDoc_STRVAR(py_select_doc, "This module provides access to selection."); -static PyModuleDef BPyGPU_select_module_def = { +static PyModuleDef py_select_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.select", .m_doc = py_select_doc, .m_methods = py_select_methods, }; -PyObject *BPyInit_gpu_select(void) +PyObject *bpygpu_select_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_select_module_def); + submodule = PyModule_Create(&py_select_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_select.h b/source/blender/python/gpu/gpu_py_select.h index 857cd7bb7f8..12152c82909 100644 --- a/source/blender/python/gpu/gpu_py_select.h +++ b/source/blender/python/gpu/gpu_py_select.h @@ -20,4 +20,4 @@ #pragma once -PyObject *BPyInit_gpu_select(void); +PyObject *bpygpu_select_init(void); diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index b2603c75c3f..e5ffbd5e9e3 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -736,7 +736,7 @@ PyDoc_STRVAR(py_shader_module_doc, "3D_SMOOTH_COLOR\n" " :Attributes: vec3 pos, vec4 color\n" " :Uniforms: none\n"); -static PyModuleDef BPyGPU_shader_module_def = { +static PyModuleDef py_shader_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.shader", .m_doc = py_shader_module_doc, @@ -760,11 +760,11 @@ PyObject *BPyGPUShader_CreatePyObject(GPUShader *shader, bool is_builtin) return (PyObject *)self; } -PyObject *BPyInit_gpu_shader(void) +PyObject *bpygpu_shader_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_shader_module_def); + submodule = PyModule_Create(&py_shader_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h index ee26c26acd4..745b9351649 100644 --- a/source/blender/python/gpu/gpu_py_shader.h +++ b/source/blender/python/gpu/gpu_py_shader.h @@ -30,4 +30,4 @@ typedef struct BPyGPUShader { } BPyGPUShader; PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin); -PyObject *BPyInit_gpu_shader(void); +PyObject *bpygpu_shader_init(void); diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c index 165af47b4b8..d70c5ba4966 100644 --- a/source/blender/python/gpu/gpu_py_types.c +++ b/source/blender/python/gpu/gpu_py_types.c @@ -32,16 +32,16 @@ /** \name GPU Types Module * \{ */ -static struct PyModuleDef BPyGPU_types_module_def = { +static struct PyModuleDef py_types_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.types", }; -PyObject *BPyInit_gpu_types(void) +PyObject *bpygpu_types_init(void) { PyObject *submodule; - submodule = PyModule_Create(&BPyGPU_types_module_def); + submodule = PyModule_Create(&py_types_module_def); if (PyType_Ready(&BPyGPUVertFormat_Type) < 0) { return NULL; diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py_types.h index 56f73b8a504..cf8d6d694e6 100644 --- a/source/blender/python/gpu/gpu_py_types.h +++ b/source/blender/python/gpu/gpu_py_types.h @@ -27,4 +27,4 @@ #include "gpu_py_vertex_buffer.h" #include "gpu_py_vertex_format.h" -PyObject *BPyInit_gpu_types(void); +PyObject *bpygpu_types_init(void); From 847da6176e3906d2b8b562777948ffa4dbb9e8fa Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 11 Feb 2021 20:28:10 +0100 Subject: [PATCH 095/519] Fix finding system Haru library on Debian. Paths and names of system packages-installed libhpdf on Debian (and probably its derived distributions?) are slightly different than what was given to CMake finding script. --- build_files/cmake/Modules/FindHaru.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_files/cmake/Modules/FindHaru.cmake b/build_files/cmake/Modules/FindHaru.cmake index 5774f83b8c5..7db57a6adfb 100644 --- a/build_files/cmake/Modules/FindHaru.cmake +++ b/build_files/cmake/Modules/FindHaru.cmake @@ -35,11 +35,13 @@ find_path(HARU_INCLUDE_DIR ${_haru_SEARCH_DIRS} PATH_SUFFIXES include/haru + include ) find_library(HARU_LIBRARY NAMES hpdfs + hpdf HINTS ${_haru_SEARCH_DIRS} PATH_SUFFIXES From b6d7aa9e137488a758be23e841983827c5230e14 Mon Sep 17 00:00:00 2001 From: Habib Gahbiche Date: Fri, 12 Feb 2021 01:22:28 +0530 Subject: [PATCH 096/519] Mesh automated testing: compare selection MeshTest now compares selection between evaluated mesh and expected mesh. This way, we can test more operators such as `faces_select_linked_flat` Note: selection comparison intentionally does not happen in BKE_mesh_cmp() on C side but rather on Python side, because selection is independent of mesh generation. Reviewed By: calra, mont29 Differential Revision: https://developer.blender.org/D10279 --- tests/python/modules/mesh_test.py | 54 ++++++++++++++++++++----------- tests/python/operators.py | 18 +++++++++++ 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/tests/python/modules/mesh_test.py b/tests/python/modules/mesh_test.py index 020b1bff08f..1749e798a32 100644 --- a/tests/python/modules/mesh_test.py +++ b/tests/python/modules/mesh_test.py @@ -247,9 +247,11 @@ class MeshTest: # Replace expected object with object we ran operations on, i.e. evaluated_test_object. evaluated_test_object.location = self.expected_object.location expected_object_name = self.expected_object.name + evaluated_selection = {v.index for v in evaluated_test_object.data.vertices if v.select} bpy.data.objects.remove(self.expected_object, do_unlink=True) evaluated_test_object.name = expected_object_name + self._do_selection(evaluated_test_object.data, "VERT", evaluated_selection) # Save file. bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath) @@ -428,30 +430,40 @@ class MeshTest: if self.apply_modifier: self._apply_modifier(test_object, particle_sys_spec.modifier_name) + def _do_selection(self, mesh: bpy.types.Mesh, select_mode: str, selection: set): + """ + Do selection on a mesh + :param mesh: bpy.types.Mesh - input mesh + :param: select_mode: str - selection mode. Must be 'VERT', 'EDGE' or 'FACE' + :param: selection: set - indices of selection. + + Example: select_mode='VERT' and selection={1,2,3} selects veritces 1, 2 and 3 of input mesh + """ + # deselect all + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + bpy.context.tool_settings.mesh_select_mode = (select_mode == 'VERT', + select_mode == 'EDGE', + select_mode == 'FACE') + + items = (mesh.vertices if select_mode == 'VERT' + else mesh.edges if select_mode == 'EDGE' + else mesh.polygons if select_mode == 'FACE' + else None) + if items is None: + raise ValueError("Invalid selection mode") + for index in selection: + items[index].select = True + def _apply_operator_edit_mode(self, test_object, operator: OperatorSpecEditMode): """ Apply operator on test object. :param test_object: bpy.types.Object - Blender object to apply operator on. :param operator: OperatorSpecEditMode - OperatorSpecEditMode object with parameters. """ - mesh = test_object.data - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # Do selection. - bpy.context.tool_settings.mesh_select_mode = (operator.select_mode == 'VERT', - operator.select_mode == 'EDGE', - operator.select_mode == 'FACE') - for index in operator.selection: - if operator.select_mode == 'VERT': - mesh.vertices[index].select = True - elif operator.select_mode == 'EDGE': - mesh.edges[index].select = True - elif operator.select_mode == 'FACE': - mesh.polygons[index].select = True - else: - raise ValueError("Invalid selection mode") + self._do_selection(test_object.data, operator.select_mode, operator.selection) # Apply operator in edit mode. bpy.ops.object.mode_set(mode='EDIT') @@ -579,6 +591,12 @@ class MeshTest: compare_result = evaluated_test_mesh.unit_test_compare(mesh=expected_mesh) compare_success = (compare_result == 'Same') + selected_evaluatated_verts = [v.index for v in evaluated_test_mesh.vertices if v.select] + selected_expected_verts = [v.index for v in expected_mesh.vertices if v.select] + if selected_evaluatated_verts != selected_expected_verts: + compare_result = "Selection doesn't match" + compare_success = False + # Also check if invalid geometry (which is never expected) had to be corrected... validation_success = not evaluated_test_mesh.validate(verbose=True) diff --git a/tests/python/operators.py b/tests/python/operators.py index db7e70c09c4..461880ec214 100644 --- a/tests/python/operators.py +++ b/tests/python/operators.py @@ -137,6 +137,15 @@ def main(): MeshTest("CubeEdgeSplit", "testCubeEdgeSplit", "expectedCubeEdgeSplit", [OperatorSpecEditMode("edge_split", {}, "EDGE", {2, 5, 8, 11, 14, 17, 20, 23})]), + ### 25 + # edge ring select - Cannot be tested. Need user input. + # MeshTest("CubeEdgeRingSelect", "testCubeEdgeRingSelect", "expectedCubeEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "EDGE", {5, 20, 25, 26})]), + # MeshTest("EmptyMeshEdgeRingSelect", "testGridEdgeRingSelect", "expectedGridEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "VERT", {65, 66, 67})]), + # MeshTest("EmptyMeshEdgeRingSelect", "testEmptyMeshdgeRingSelect", "expectedEmptyMeshEdgeRingSelect", + # [OperatorSpecEditMode("edgering_select", {}, "VERT", {})]), + # face make planar MeshTest("MonkeyFaceMakePlanar", "testMonkeyFaceMakePlanar", "expectedMonkeyFaceMakePlanar", @@ -147,6 +156,15 @@ def main(): "expectedPlaneFaceSplitByEdges", [OperatorSpecEditMode("face_split_by_edges", {}, "VERT", {i for i in range(6)})]), + # faces select linked flat + MeshTest("CubeFacesSelectLinkedFlat", "testCubeFaceSelectLinkedFlat", "expectedCubeFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "FACE", {7})]), + MeshTest("PlaneFacesSelectLinkedFlat", "testPlaneFaceSelectLinkedFlat", "expectedPlaneFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {1})]), + MeshTest("EmptyMeshFacesSelectLinkedFlat", "testEmptyMeshFaceSelectLinkedFlat", + "expectedEmptyMeshFaceSelectLinkedFlat", + [OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {})]), + # fill MeshTest("IcosphereFill", "testIcosphereFill", "expectedIcosphereFill", [OperatorSpecEditMode("fill", {}, "EDGE", {20, 21, 22, 23, 24, 45, 46, 47, 48, 49})]), From 35ddcb4041e0c98f9a77827e0b8b031c83cec253 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 07:47:02 +1100 Subject: [PATCH 097/519] Cleanup: clang-format, spelling --- intern/ghost/intern/GHOST_SystemX11.cpp | 2 +- .../blender/editors/sculpt_paint/paint_mask.c | 2 -- source/blender/editors/space_node/node_draw.c | 4 ++-- source/blender/imbuf/IMB_imbuf.h | 2 +- .../geometry/nodes/node_geo_join_geometry.cc | 18 +++++++++--------- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 9152aa22495..53e52d40dec 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -1061,7 +1061,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe) * Note that: * - This effectively 'lock' main number keys to always output number events * (except when using alt-gr). - * - This enforces users to use an ascii-compatible keymap with Blender - + * - This enforces users to use an ASCII-compatible keymap with Blender - * but at least it gives predictable and consistent results. * * Also, note that nothing in XLib sources [1] makes it obvious why those two functions give diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index bacb3b549e3..26e2bcc42cf 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -1073,8 +1073,6 @@ static void sculpt_gesture_trim_calculate_depth(SculptGestureContext *sgcontext) mid_point_depth = ss->gesture_initial_hit ? 0.0f : (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; - - } const float depth_radius = ss->cursor_radius; diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 9ef914af75b..c7be5f848f7 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1153,8 +1153,8 @@ void node_draw_sockets(const View2D *v2d, GPU_program_point_size(false); GPU_blend(GPU_BLEND_NONE); - /* Draw multi-nput sockets after the others because they are drawn with "UI_roundbox" - * rather than with GL_POINT. */ + /* Draw multi-input sockets after the others because they are drawn with `UI_draw_roundbox` + * rather than with `GL_POINT`. */ LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { if (nodeSocketIsHidden(socket)) { continue; diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 8866a8a8600..d131e4dacdc 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -27,7 +27,7 @@ * This module offers import/export of several graphical file formats. * \ingroup imbuf * - * \page IMB Imbuf module external interface + * \page IMB ImBuf module external interface * \section imb_about About the IMB module * * External interface of the IMage Buffer module. This module offers diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index a56939a43c7..ca2e1be6e6f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -25,15 +25,15 @@ static bNodeSocketTemplate geo_node_join_geometry_in[] = { {SOCK_GEOMETRY, - N_("Geometry"), - 0.0f, - 0.0f, - 0.0f, - 1.0f, - -1.0f, - 1.0f, - PROP_NONE, - SOCK_MULTI_INPUT}, + N_("Geometry"), + 0.0f, + 0.0f, + 0.0f, + 1.0f, + -1.0f, + 1.0f, + PROP_NONE, + SOCK_MULTI_INPUT}, {-1, ""}, }; From 7952ed872acceafbfec9e161b48f16059cf31804 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 07:50:01 +1100 Subject: [PATCH 098/519] CMake: update python to 3.9.1 Default to Python version 3.9. Reviewed By: LazyDodo, sybren, sebbas Ref D10380 --- CMakeLists.txt | 4 ++-- .../cmake/Modules/FindPythonLibsUnix.cmake | 6 +++--- build_files/cmake/platform/platform_apple.cmake | 16 ++++++++-------- build_files/cmake/platform/platform_win32.cmake | 2 +- source/creator/CMakeLists.txt | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78f49942a13..51308850d3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -830,8 +830,8 @@ if(WITH_PYTHON) # Do this before main 'platform_*' checks, # because UNIX will search for the old Python paths which may not exist. # giving errors about missing paths before this case is met. - if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.7") - message(FATAL_ERROR "At least Python 3.7 is required to build") + if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.9") + message(FATAL_ERROR "At least Python 3.9 is required to build") endif() file(GLOB RESULT "${CMAKE_SOURCE_DIR}/release/scripts/addons") diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake index 5b3f2e52256..78f8e03807f 100644 --- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake +++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake @@ -34,7 +34,7 @@ IF(NOT PYTHON_ROOT_DIR AND NOT $ENV{PYTHON_ROOT_DIR} STREQUAL "") SET(PYTHON_ROOT_DIR $ENV{PYTHON_ROOT_DIR}) ENDIF() -SET(PYTHON_VERSION 3.7 CACHE STRING "Python Version (major and minor only)") +SET(PYTHON_VERSION 3.9 CACHE STRING "Python Version (major and minor only)") MARK_AS_ADVANCED(PYTHON_VERSION) @@ -73,8 +73,8 @@ SET(_python_SEARCH_DIRS # only search for the dirs if we haven't already IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_LIB_PATH_DEF)) SET(_PYTHON_ABI_FLAGS_TEST - "m;mu;u; " # release - "dm;dmu;du;d" # debug + "u; " # release + "du;d" # debug ) FOREACH(_CURRENT_ABI_FLAGS ${_PYTHON_ABI_FLAGS_TEST}) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 8a7792bd886..e51bdede34b 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -131,22 +131,22 @@ if(WITH_CODEC_SNDFILE) endif() if(WITH_PYTHON) - # we use precompiled libraries for py 3.7 and up by default - set(PYTHON_VERSION 3.7) + # we use precompiled libraries for py 3.9 and up by default + set(PYTHON_VERSION 3.9) if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) # normally cached but not since we include them with blender - set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}m") - set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}m") - set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}m.a) + set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}") + set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}") + set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}.a) set(PYTHON_LIBPATH "${LIBDIR}/python/lib/python${PYTHON_VERSION}") # set(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled else() # module must be compiled against Python framework set(_py_framework "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}") - set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}m") - set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}m") - set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m") + set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}") + set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}") + set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}") # set(PYTHON_LIBRARY python${PYTHON_VERSION}) # set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 69a78ba7ca6..37a3eabc338 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -421,7 +421,7 @@ if(WITH_JACK) endif() if(WITH_PYTHON) - set(PYTHON_VERSION 3.7) # CACHE STRING) + set(PYTHON_VERSION 3.9) # CACHE STRING) string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) set(PYTHON_LIBRARY ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.lib) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index fd1d721d869..e674e665082 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -574,7 +574,7 @@ if(UNIX AND NOT APPLE) DIRECTORY ${PYTHON_LIBPATH}/python${PYTHON_VERSION} DESTINATION ${TARGETDIR_VER}/python/${_target_LIB} PATTERN "__pycache__" EXCLUDE # * any cache * - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib PATTERN "lib2to3" EXCLUDE # ./lib2to3 PATTERN "site-packages/*" EXCLUDE # ./site-packages/* PATTERN "tkinter" EXCLUDE # ./tkinter @@ -944,7 +944,7 @@ elseif(APPLE) PATTERN "__pycache__" EXCLUDE PATTERN "__MACOSX" EXCLUDE PATTERN ".DS_Store" EXCLUDE - PATTERN "config-${PYTHON_VERSION}m/*.a" EXCLUDE # static lib + PATTERN "config-${PYTHON_VERSION}/*.a" EXCLUDE # static lib PATTERN "lib2to3" EXCLUDE # ./lib2to3 PATTERN "tkinter" EXCLUDE # ./tkinter PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co From d21f44546951a29cea5524fcd2147e08de996c7d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 08:08:15 +1100 Subject: [PATCH 099/519] PyAPI: remove Python 3.7x compatibility code This removes Python version checks needed to build with 3.8+ and 3.7x. Ref D10381 --- .../freestyle/intern/python/BPy_BBox.cpp | 6 +- .../intern/python/BPy_BinaryPredicate0D.cpp | 70 ++++++++--------- .../intern/python/BPy_BinaryPredicate1D.cpp | 70 ++++++++--------- .../intern/python/BPy_FrsMaterial.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_FrsNoise.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_Id.cpp | 14 ++-- .../intern/python/BPy_IntegrationType.cpp | 70 ++++++++--------- .../intern/python/BPy_Interface0D.cpp | 70 ++++++++--------- .../intern/python/BPy_Interface1D.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_Iterator.cpp | 70 ++++++++--------- .../intern/python/BPy_MediumType.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_Nature.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_Operators.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_SShape.cpp | 70 ++++++++--------- .../intern/python/BPy_StrokeAttribute.cpp | 70 ++++++++--------- .../intern/python/BPy_StrokeShader.cpp | 70 ++++++++--------- .../intern/python/BPy_UnaryFunction0D.cpp | 70 ++++++++--------- .../intern/python/BPy_UnaryFunction1D.cpp | 70 ++++++++--------- .../intern/python/BPy_UnaryPredicate0D.cpp | 70 ++++++++--------- .../intern/python/BPy_UnaryPredicate1D.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_ViewMap.cpp | 70 ++++++++--------- .../freestyle/intern/python/BPy_ViewShape.cpp | 70 ++++++++--------- .../BinaryPredicate1D/BPy_FalseBP1D.cpp | 70 ++++++++--------- .../BinaryPredicate1D/BPy_Length2DBP1D.cpp | 70 ++++++++--------- .../BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp | 70 ++++++++--------- .../python/BinaryPredicate1D/BPy_TrueBP1D.cpp | 70 ++++++++--------- .../BPy_ViewMapGradientNormBP1D.cpp | 70 ++++++++--------- .../python/Interface0D/BPy_CurvePoint.cpp | 70 ++++++++--------- .../intern/python/Interface0D/BPy_SVertex.cpp | 70 ++++++++--------- .../python/Interface0D/BPy_ViewVertex.cpp | 70 ++++++++--------- .../CurvePoint/BPy_StrokeVertex.cpp | 70 ++++++++--------- .../Interface0D/ViewVertex/BPy_NonTVertex.cpp | 70 ++++++++--------- .../Interface0D/ViewVertex/BPy_TVertex.cpp | 70 ++++++++--------- .../intern/python/Interface1D/BPy_FEdge.cpp | 70 ++++++++--------- .../python/Interface1D/BPy_FrsCurve.cpp | 70 ++++++++--------- .../intern/python/Interface1D/BPy_Stroke.cpp | 70 ++++++++--------- .../python/Interface1D/BPy_ViewEdge.cpp | 70 ++++++++--------- .../python/Interface1D/Curve/BPy_Chain.cpp | 70 ++++++++--------- .../Interface1D/FEdge/BPy_FEdgeSharp.cpp | 70 ++++++++--------- .../Interface1D/FEdge/BPy_FEdgeSmooth.cpp | 70 ++++++++--------- .../python/Iterator/BPy_AdjacencyIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_ChainPredicateIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_ChainSilhouetteIterator.cpp | 70 ++++++++--------- .../python/Iterator/BPy_ChainingIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_CurvePointIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_Interface0DIterator.cpp | 70 ++++++++--------- .../python/Iterator/BPy_SVertexIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_StrokeVertexIterator.cpp | 70 ++++++++--------- .../python/Iterator/BPy_ViewEdgeIterator.cpp | 70 ++++++++--------- .../Iterator/BPy_orientedViewEdgeIterator.cpp | 70 ++++++++--------- .../BPy_BackboneStretcherShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_BezierCurveShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_BlenderTextureShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_CalligraphicShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_ColorNoiseShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_ConstantColorShader.cpp | 70 ++++++++--------- .../BPy_ConstantThicknessShader.cpp | 70 ++++++++--------- ...y_ConstrainedIncreasingThicknessShader.cpp | 6 +- .../StrokeShader/BPy_GuidingLinesShader.cpp | 70 ++++++++--------- .../BPy_IncreasingColorShader.cpp | 70 ++++++++--------- .../BPy_IncreasingThicknessShader.cpp | 70 ++++++++--------- .../BPy_PolygonalizationShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_SamplingShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_SmoothingShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_SpatialNoiseShader.cpp | 70 ++++++++--------- .../BPy_StrokeTextureStepShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_ThicknessNoiseShader.cpp | 70 ++++++++--------- .../StrokeShader/BPy_TipRemoverShader.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DDouble.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DEdgeNature.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DFloat.cpp | 70 ++++++++--------- .../UnaryFunction0D/BPy_UnaryFunction0DId.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DMaterial.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DUnsigned.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DVec2f.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DVec3f.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DVectorViewShape.cpp | 70 ++++++++--------- .../BPy_UnaryFunction0DViewShape.cpp | 70 ++++++++--------- .../UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp | 70 ++++++++--------- .../BPy_MaterialF0D.cpp | 70 ++++++++--------- .../BPy_CurveNatureF0D.cpp | 70 ++++++++--------- .../UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp | 70 ++++++++--------- .../BPy_VertexOrientation2DF0D.cpp | 70 ++++++++--------- .../BPy_VertexOrientation3DF0D.cpp | 70 ++++++++--------- .../BPy_GetOccludeeF0D.cpp | 70 ++++++++--------- .../BPy_GetShapeF0D.cpp | 70 ++++++++--------- .../BPy_Curvature2DAngleF0D.cpp | 70 ++++++++--------- .../UnaryFunction0D_double/BPy_DensityF0D.cpp | 70 ++++++++--------- .../BPy_GetProjectedXF0D.cpp | 70 ++++++++--------- .../BPy_GetProjectedYF0D.cpp | 70 ++++++++--------- .../BPy_GetProjectedZF0D.cpp | 70 ++++++++--------- .../UnaryFunction0D_double/BPy_GetXF0D.cpp | 70 ++++++++--------- .../UnaryFunction0D_double/BPy_GetYF0D.cpp | 70 ++++++++--------- .../UnaryFunction0D_double/BPy_GetZF0D.cpp | 70 ++++++++--------- .../BPy_LocalAverageDepthF0D.cpp | 70 ++++++++--------- .../BPy_ZDiscontinuityF0D.cpp | 70 ++++++++--------- .../BPy_GetCurvilinearAbscissaF0D.cpp | 70 ++++++++--------- .../BPy_GetParameterF0D.cpp | 70 ++++++++--------- .../BPy_GetViewMapGradientNormF0D.cpp | 70 ++++++++--------- .../BPy_ReadCompleteViewMapPixelF0D.cpp | 70 ++++++++--------- .../BPy_ReadMapPixelF0D.cpp | 70 ++++++++--------- .../BPy_ReadSteerableViewMapPixelF0D.cpp | 70 ++++++++--------- .../BPy_QuantitativeInvisibilityF0D.cpp | 70 ++++++++--------- .../BPy_GetOccludersF0D.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DDouble.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DEdgeNature.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DFloat.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DUnsigned.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DVec2f.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DVec3f.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DVectorViewShape.cpp | 70 ++++++++--------- .../BPy_UnaryFunction1DVoid.cpp | 70 ++++++++--------- .../BPy_CurveNatureF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp | 70 ++++++++--------- .../BPy_Orientation2DF1D.cpp | 70 ++++++++--------- .../BPy_Orientation3DF1D.cpp | 70 ++++++++--------- .../BPy_Curvature2DAngleF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_double/BPy_DensityF1D.cpp | 70 ++++++++--------- .../BPy_GetCompleteViewMapDensityF1D.cpp | 70 ++++++++--------- .../BPy_GetDirectionalViewMapDensityF1D.cpp | 70 ++++++++--------- .../BPy_GetProjectedXF1D.cpp | 70 ++++++++--------- .../BPy_GetProjectedYF1D.cpp | 70 ++++++++--------- .../BPy_GetProjectedZF1D.cpp | 70 ++++++++--------- .../BPy_GetSteerableViewMapDensityF1D.cpp | 70 ++++++++--------- .../BPy_GetViewMapGradientNormF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_double/BPy_GetXF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_double/BPy_GetYF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_double/BPy_GetZF1D.cpp | 70 ++++++++--------- .../BPy_LocalAverageDepthF1D.cpp | 70 ++++++++--------- .../BPy_ZDiscontinuityF1D.cpp | 70 ++++++++--------- .../BPy_QuantitativeInvisibilityF1D.cpp | 70 ++++++++--------- .../BPy_GetOccludeeF1D.cpp | 70 ++++++++--------- .../BPy_GetOccludersF1D.cpp | 70 ++++++++--------- .../BPy_GetShapeF1D.cpp | 70 ++++++++--------- .../BPy_ChainingTimeStampF1D.cpp | 70 ++++++++--------- .../BPy_IncrementChainingTimeStampF1D.cpp | 70 ++++++++--------- .../UnaryFunction1D_void/BPy_TimeStampF1D.cpp | 70 ++++++++--------- .../python/UnaryPredicate0D/BPy_FalseUP0D.cpp | 70 ++++++++--------- .../python/UnaryPredicate0D/BPy_TrueUP0D.cpp | 70 ++++++++--------- .../UnaryPredicate1D/BPy_ContourUP1D.cpp | 70 ++++++++--------- .../BPy_DensityLowerThanUP1D.cpp | 70 ++++++++--------- .../BPy_EqualToChainingTimeStampUP1D.cpp | 70 ++++++++--------- .../BPy_EqualToTimeStampUP1D.cpp | 70 ++++++++--------- .../BPy_ExternalContourUP1D.cpp | 70 ++++++++--------- .../python/UnaryPredicate1D/BPy_FalseUP1D.cpp | 70 ++++++++--------- .../BPy_QuantitativeInvisibilityUP1D.cpp | 70 ++++++++--------- .../python/UnaryPredicate1D/BPy_ShapeUP1D.cpp | 70 ++++++++--------- .../python/UnaryPredicate1D/BPy_TrueUP1D.cpp | 70 ++++++++--------- .../BPy_WithinImageBoundaryUP1D.cpp | 70 ++++++++--------- source/blender/python/bmesh/bmesh_py_ops.c | 6 +- source/blender/python/generic/idprop_py_api.c | 24 ++---- source/blender/python/generic/imbuf_py_api.c | 14 ++-- .../python/intern/bpy_app_translations.c | 6 +- source/blender/python/intern/bpy_capi_utils.h | 4 +- .../blender/python/intern/bpy_library_load.c | 10 +-- source/blender/python/intern/bpy_rna.c | 76 ++++++------------- .../python/mathutils/mathutils_Vector.c | 16 ++-- 157 files changed, 4871 insertions(+), 5531 deletions(-) diff --git a/source/blender/freestyle/intern/python/BPy_BBox.cpp b/source/blender/freestyle/intern/python/BPy_BBox.cpp index 39dd55f0cc1..78431aa6728 100644 --- a/source/blender/freestyle/intern/python/BPy_BBox.cpp +++ b/source/blender/freestyle/intern/python/BPy_BBox.cpp @@ -83,11 +83,7 @@ PyTypeObject BBox_Type = { sizeof(BPy_BBox), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BBox_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp index d12804761f0..652b576852d 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate0D.cpp @@ -155,43 +155,39 @@ PyTypeObject BinaryPredicate0D_Type = { sizeof(BPy_BinaryPredicate0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BinaryPredicate0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BinaryPredicate0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_BinaryPredicate0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BinaryPredicate0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)BinaryPredicate0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)BinaryPredicate0D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BinaryPredicate0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_BinaryPredicate0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BinaryPredicate0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp index 969041702b5..37762f1b8b3 100644 --- a/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_BinaryPredicate1D.cpp @@ -189,43 +189,39 @@ PyTypeObject BinaryPredicate1D_Type = { sizeof(BPy_BinaryPredicate1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BinaryPredicate1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BinaryPredicate1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_BinaryPredicate1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BinaryPredicate1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)BinaryPredicate1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)BinaryPredicate1D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BinaryPredicate1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_BinaryPredicate1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BinaryPredicate1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp index e3e6ba5ab83..48b2ad767d2 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsMaterial.cpp @@ -540,43 +540,39 @@ PyTypeObject FrsMaterial_Type = { sizeof(BPy_FrsMaterial), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)FrsMaterial_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)FrsMaterial_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - (hashfunc)FrsMaterial_hash, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsMaterial_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FrsMaterial_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsMaterial_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)FrsMaterial_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + (hashfunc)FrsMaterial_hash, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsMaterial_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FrsMaterial_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsMaterial_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp index 73e2abc8688..40127064875 100644 --- a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp +++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp @@ -332,43 +332,39 @@ PyTypeObject FrsNoise_Type = { sizeof(BPy_FrsNoise), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)FrsNoise_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)FrsNoise_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsNoise_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_FrsNoise_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsNoise_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)FrsNoise_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsNoise_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_FrsNoise_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsNoise_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Id.cpp b/source/blender/freestyle/intern/python/BPy_Id.cpp index 5f9824db773..752bea16fb1 100644 --- a/source/blender/freestyle/intern/python/BPy_Id.cpp +++ b/source/blender/freestyle/intern/python/BPy_Id.cpp @@ -169,15 +169,11 @@ static PyGetSetDef BPy_Id_getseters[] = { /*-----------------------BPy_Id type definition ------------------------------*/ PyTypeObject Id_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */ - sizeof(BPy_Id), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)Id_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + PyVarObject_HEAD_INIT(nullptr, 0) "Id", /* tp_name */ + sizeof(BPy_Id), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)Id_dealloc, /* tp_dealloc */ + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp index 15f3f936b14..2af019e8fe2 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp @@ -155,43 +155,39 @@ PyTypeObject IntegrationType_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - IntegrationType_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + IntegrationType_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_IntegrationType instance definitions -------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp index a1456a9491f..9a86e61e623 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp @@ -315,43 +315,39 @@ PyTypeObject Interface0D_Type = { sizeof(BPy_Interface0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Interface0D_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Interface0D_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface0D_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Interface0D_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface0D_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Interface0D_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface0D_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Interface0D_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface0D_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp index 2fe56eb952d..61884ee63e5 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp @@ -343,43 +343,39 @@ PyTypeObject Interface1D_Type = { sizeof(BPy_Interface1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Interface1D_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Interface1D_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface1D_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Interface1D_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface1D_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Interface1D_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface1D_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Interface1D_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface1D_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_Iterator.cpp b/source/blender/freestyle/intern/python/BPy_Iterator.cpp index 5346c4a8dc0..bc6d8032ea2 100644 --- a/source/blender/freestyle/intern/python/BPy_Iterator.cpp +++ b/source/blender/freestyle/intern/python/BPy_Iterator.cpp @@ -230,43 +230,39 @@ PyTypeObject Iterator_Type = { sizeof(BPy_Iterator), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Iterator_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)Iterator_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Iterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Iterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Iterator_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Iterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)Iterator_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Iterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Iterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Iterator_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Iterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_MediumType.cpp b/source/blender/freestyle/intern/python/BPy_MediumType.cpp index 35f9dc17070..d9d5e683c4f 100644 --- a/source/blender/freestyle/intern/python/BPy_MediumType.cpp +++ b/source/blender/freestyle/intern/python/BPy_MediumType.cpp @@ -47,43 +47,39 @@ PyTypeObject MediumType_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - MediumType_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + MediumType_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_IntegrationType instance definitions -------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Nature.cpp b/source/blender/freestyle/intern/python/BPy_Nature.cpp index 304364b60eb..45335f27619 100644 --- a/source/blender/freestyle/intern/python/BPy_Nature.cpp +++ b/source/blender/freestyle/intern/python/BPy_Nature.cpp @@ -109,43 +109,39 @@ PyTypeObject Nature_Type = { sizeof(PyLongObject), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - &nature_as_number, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - Nature_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &PyLong_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + &nature_as_number, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + Nature_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &PyLong_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /*-----------------------BPy_Nature instance definitions ----------------------------------*/ diff --git a/source/blender/freestyle/intern/python/BPy_Operators.cpp b/source/blender/freestyle/intern/python/BPy_Operators.cpp index 5dbf18c24a7..004fa118cf6 100644 --- a/source/blender/freestyle/intern/python/BPy_Operators.cpp +++ b/source/blender/freestyle/intern/python/BPy_Operators.cpp @@ -772,43 +772,39 @@ PyTypeObject Operators_Type = { sizeof(BPy_Operators), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Operators_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - Operators_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Operators_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + Operators_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Operators_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp index bb1b07a8c4c..f43a464d99e 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp @@ -283,43 +283,39 @@ PyTypeObject SShape_Type = { sizeof(BPy_SShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SShape_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)SShape_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SShape_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_SShape_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SShape_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SShape_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)SShape_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SShape_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_SShape_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SShape_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SShape_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp index c95abae3645..256fa5be290 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp @@ -679,43 +679,39 @@ PyTypeObject StrokeAttribute_Type = { sizeof(BPy_StrokeAttribute), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)StrokeAttribute_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)StrokeAttribute_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeAttribute_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_StrokeAttribute_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeAttribute_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeAttribute_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)StrokeAttribute_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeAttribute_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_StrokeAttribute_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeAttribute_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeAttribute_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp index 01f8ec18022..9ce91b8a486 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeShader.cpp @@ -284,43 +284,39 @@ PyTypeObject StrokeShader_Type = { sizeof(BPy_StrokeShader), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)StrokeShader___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)StrokeShader___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_StrokeShader_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeShader_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)StrokeShader___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_StrokeShader_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeShader_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp index de426183b6a..1bc569860aa 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction0D.cpp @@ -126,43 +126,39 @@ PyTypeObject UnaryFunction0D_Type = { sizeof(BPy_UnaryFunction0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp index 591f69b23df..c11640aa136 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryFunction1D.cpp @@ -120,43 +120,39 @@ PyTypeObject UnaryFunction1D_Type = { sizeof(BPy_UnaryFunction1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - nullptr, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + nullptr, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp index 3c3b0fe82e3..cc9f666fbdd 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate0D.cpp @@ -169,43 +169,39 @@ PyTypeObject UnaryPredicate0D_Type = { sizeof(BPy_UnaryPredicate0D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryPredicate0D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryPredicate0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryPredicate0D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryPredicate0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryPredicate0D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryPredicate0D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryPredicate0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryPredicate0D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryPredicate0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp index 26087d1a6ef..41c0acc088c 100644 --- a/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp @@ -227,43 +227,39 @@ PyTypeObject UnaryPredicate1D_Type = { sizeof(BPy_UnaryPredicate1D), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryPredicate1D___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryPredicate1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryPredicate1D_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryPredicate1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryPredicate1D___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryPredicate1D___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryPredicate1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryPredicate1D_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryPredicate1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp index 24925edecf9..269959a19c3 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewMap.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewMap.cpp @@ -186,43 +186,39 @@ PyTypeObject ViewMap_Type = { sizeof(BPy_ViewMap), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ViewMap_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)ViewMap_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewMap_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewMap_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewMap_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewMap_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)ViewMap_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewMap_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewMap_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewMap_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewMap_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp index d6964d4d6ec..dd9d169dac2 100644 --- a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp @@ -354,43 +354,39 @@ PyTypeObject ViewShape_Type = { sizeof(BPy_ViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ViewShape_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)ViewShape_repr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewShape_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewShape_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewShape_getseters, /* tp_getset */ - nullptr, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewShape_init, /* tp_init */ - nullptr, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)ViewShape_repr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewShape_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewShape_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewShape_getseters, /* tp_getset */ + nullptr, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewShape_init, /* tp_init */ + nullptr, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp index 4299cfae214..ed09025a45e 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_FalseBP1D.cpp @@ -61,43 +61,39 @@ PyTypeObject FalseBP1D_Type = { sizeof(BPy_FalseBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp index fb057022290..9d4f0693af9 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_Length2DBP1D.cpp @@ -63,43 +63,39 @@ PyTypeObject Length2DBP1D_Type = { sizeof(BPy_Length2DBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Length2DBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Length2DBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Length2DBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Length2DBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp index 96e35bd305b..372d250c628 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_SameShapeIdBP1D.cpp @@ -62,43 +62,39 @@ PyTypeObject SameShapeIdBP1D_Type = { sizeof(BPy_SameShapeIdBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SameShapeIdBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SameShapeIdBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SameShapeIdBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SameShapeIdBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp index eb53cfc5b0e..04bd36738d1 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_TrueBP1D.cpp @@ -62,43 +62,39 @@ PyTypeObject TrueBP1D_Type = { sizeof(BPy_TrueBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp index 9522a8da4f7..337d0fa3020 100644 --- a/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp +++ b/source/blender/freestyle/intern/python/BinaryPredicate1D/BPy_ViewMapGradientNormBP1D.cpp @@ -92,43 +92,39 @@ PyTypeObject ViewMapGradientNormBP1D_Type = { sizeof(BPy_ViewMapGradientNormBP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewMapGradientNormBP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &BinaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewMapGradientNormBP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &BinaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewMapGradientNormBP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp index 57639b6161b..2367c3f9cb5 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_CurvePoint.cpp @@ -244,43 +244,39 @@ PyTypeObject CurvePoint_Type = { sizeof(BPy_CurvePoint), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurvePoint_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_CurvePoint_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurvePoint_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurvePoint_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_CurvePoint_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurvePoint_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp index 63a9ead910e..4f1b57915b2 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp @@ -457,43 +457,39 @@ PyTypeObject SVertex_Type = { sizeof(BPy_SVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_SVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SVertex_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_SVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SVertex_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp index 98fb460c3e4..600ee37aa55 100644 --- a/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/BPy_ViewVertex.cpp @@ -166,43 +166,39 @@ PyTypeObject ViewVertex_Type = { sizeof(BPy_ViewVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewVertex_getseters, /* tp_getset */ - &Interface0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewVertex_getseters, /* tp_getset */ + &Interface0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp index da8cd9d2395..79e537d48c0 100644 --- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp @@ -363,43 +363,39 @@ PyTypeObject StrokeVertex_Type = { sizeof(BPy_StrokeVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeVertex_getseters, /* tp_getset */ - &CurvePoint_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeVertex_getseters, /* tp_getset */ + &CurvePoint_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp index 90522ba7f9f..7b782b513b6 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_NonTVertex.cpp @@ -111,43 +111,39 @@ PyTypeObject NonTVertex_Type = { sizeof(BPy_NonTVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - NonTVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_NonTVertex_getseters, /* tp_getset */ - &ViewVertex_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)NonTVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + NonTVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_NonTVertex_getseters, /* tp_getset */ + &ViewVertex_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)NonTVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp index 5f90f0fa7a9..eecede4f1f3 100644 --- a/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp +++ b/source/blender/freestyle/intern/python/Interface0D/ViewVertex/BPy_TVertex.cpp @@ -221,43 +221,39 @@ PyTypeObject TVertex_Type = { sizeof(BPy_TVertex), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TVertex_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_TVertex_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_TVertex_getseters, /* tp_getset */ - &ViewVertex_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TVertex_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TVertex_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_TVertex_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_TVertex_getseters, /* tp_getset */ + &ViewVertex_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TVertex_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp index 2d019e2a979..e8f80f515df 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FEdge.cpp @@ -360,43 +360,39 @@ PyTypeObject FEdge_Type = { sizeof(BPy_FEdge), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - &BPy_FEdge_as_sequence, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdge_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdge_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdge_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + &BPy_FEdge_as_sequence, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdge_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdge_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdge_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp index 6a7d4aef08f..bf7feb7be27 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_FrsCurve.cpp @@ -192,43 +192,39 @@ PyTypeObject FrsCurve_Type = { sizeof(BPy_FrsCurve), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FrsCurve_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_FrsCurve_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FrsCurve_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FrsCurve_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FrsCurve_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_FrsCurve_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FrsCurve_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FrsCurve_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp index a5792d4bc5a..8df40087f9b 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp @@ -503,43 +503,39 @@ PyTypeObject Stroke_Type = { sizeof(BPy_Stroke), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - &BPy_Stroke_as_sequence, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Stroke_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)Stroke_iter, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Stroke_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Stroke_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Stroke_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + &BPy_Stroke_as_sequence, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Stroke_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)Stroke_iter, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Stroke_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Stroke_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Stroke_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp index bfd093f694e..eee5dc095a6 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_ViewEdge.cpp @@ -388,43 +388,39 @@ PyTypeObject ViewEdge_Type = { sizeof(BPy_ViewEdge), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewEdge_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewEdge_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewEdge_getseters, /* tp_getset */ - &Interface1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewEdge_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewEdge_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewEdge_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewEdge_getseters, /* tp_getset */ + &Interface1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewEdge_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp index bbcbe98df3a..5de2f435469 100644 --- a/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/Curve/BPy_Chain.cpp @@ -152,43 +152,39 @@ PyTypeObject Chain_Type = { sizeof(BPy_Chain), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Chain_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_Chain_methods, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &FrsCurve_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Chain_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Chain_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_Chain_methods, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &FrsCurve_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Chain_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp index f0aec671953..538e5d3bf85 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp @@ -410,43 +410,39 @@ PyTypeObject FEdgeSharp_Type = { sizeof(BPy_FEdgeSharp), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdgeSharp_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdgeSharp_getseters, /* tp_getset */ - &FEdge_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdgeSharp_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdgeSharp_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdgeSharp_getseters, /* tp_getset */ + &FEdge_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdgeSharp_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp index e6461dd6e8a..8f244fb203d 100644 --- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp @@ -255,43 +255,39 @@ PyTypeObject FEdgeSmooth_Type = { sizeof(BPy_FEdgeSmooth), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FEdgeSmooth_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_FEdgeSmooth_getseters, /* tp_getset */ - &FEdge_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FEdgeSmooth_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FEdgeSmooth_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_FEdgeSmooth_getseters, /* tp_getset */ + &FEdge_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FEdgeSmooth_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp index d548396b229..6945e3f2b51 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp @@ -188,43 +188,39 @@ PyTypeObject AdjacencyIterator_Type = { sizeof(BPy_AdjacencyIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - AdjacencyIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)AdjacencyIterator_iter, /* tp_iter */ - (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_AdjacencyIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)AdjacencyIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + AdjacencyIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)AdjacencyIterator_iter, /* tp_iter */ + (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_AdjacencyIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)AdjacencyIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp index fe2fa32b184..94d8952ef42 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainPredicateIterator.cpp @@ -169,43 +169,39 @@ PyTypeObject ChainPredicateIterator_Type = { sizeof(BPy_ChainPredicateIterator), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)ChainPredicateIterator_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainPredicateIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &ChainingIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainPredicateIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainPredicateIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &ChainingIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainPredicateIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp index ac73b231dd0..36c251bb916 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainSilhouetteIterator.cpp @@ -123,43 +123,39 @@ PyTypeObject ChainSilhouetteIterator_Type = { sizeof(BPy_ChainSilhouetteIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainSilhouetteIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &ChainingIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainSilhouetteIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainSilhouetteIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &ChainingIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainSilhouetteIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp index c464d30f92e..10b3ccdc496 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ChainingIterator.cpp @@ -257,43 +257,39 @@ PyTypeObject ChainingIterator_Type = { sizeof(BPy_ChainingIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainingIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ChainingIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ChainingIterator_getseters, /* tp_getset */ - &ViewEdgeIterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainingIterator___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainingIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ChainingIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ChainingIterator_getseters, /* tp_getset */ + &ViewEdgeIterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainingIterator___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp index bd7ed9a48da..4c93b8337cf 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp @@ -137,43 +137,39 @@ PyTypeObject CurvePointIterator_Type = { sizeof(BPy_CurvePointIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurvePointIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_CurvePointIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurvePointIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurvePointIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_CurvePointIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurvePointIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp index 6afa9d25df7..2ac3857375a 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp @@ -212,43 +212,39 @@ PyTypeObject Interface0DIterator_Type = { sizeof(BPy_Interface0DIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Interface0DIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)Interface0DIterator_iter, /* tp_iter */ - (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_Interface0DIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Interface0DIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Interface0DIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)Interface0DIterator_iter, /* tp_iter */ + (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_Interface0DIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Interface0DIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp index 48452f341a5..ffb90281442 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_SVertexIterator.cpp @@ -164,43 +164,39 @@ PyTypeObject SVertexIterator_Type = { sizeof(BPy_SVertexIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SVertexIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_SVertexIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SVertexIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SVertexIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_SVertexIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SVertexIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp index fdcb4d34c70..f94ab4d3b8f 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp @@ -295,43 +295,39 @@ PyTypeObject StrokeVertexIterator_Type = { sizeof(BPy_StrokeVertexIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeVertexIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */ - (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */ - BPy_StrokeVertexIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_StrokeVertexIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeVertexIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeVertexIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */ + (iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */ + BPy_StrokeVertexIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_StrokeVertexIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeVertexIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp index 3cc462a8294..c878178f9ca 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_ViewEdgeIterator.cpp @@ -242,43 +242,39 @@ PyTypeObject ViewEdgeIterator_Type = { sizeof(BPy_ViewEdgeIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ViewEdgeIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - BPy_ViewEdgeIterator_methods, /* tp_methods */ - nullptr, /* tp_members */ - BPy_ViewEdgeIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ViewEdgeIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ViewEdgeIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + BPy_ViewEdgeIterator_methods, /* tp_methods */ + nullptr, /* tp_members */ + BPy_ViewEdgeIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ViewEdgeIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp index 924045c9702..5da124ce40a 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp @@ -146,43 +146,39 @@ PyTypeObject orientedViewEdgeIterator_Type = { sizeof(BPy_orientedViewEdgeIterator), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - orientedViewEdgeIterator_doc, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */ - (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_orientedViewEdgeIterator_getseters, /* tp_getset */ - &Iterator_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)orientedViewEdgeIterator_init, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + orientedViewEdgeIterator_doc, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc)orientedViewEdgeIterator_iter, /* tp_iter */ + (iternextfunc)orientedViewEdgeIterator_iternext, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_orientedViewEdgeIterator_getseters, /* tp_getset */ + &Iterator_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)orientedViewEdgeIterator_init, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp index 6b3a20dbd9b..2171b7bb2b9 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BackboneStretcherShader.cpp @@ -73,43 +73,39 @@ PyTypeObject BackboneStretcherShader_Type = { sizeof(BPy_BackboneStretcherShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BackboneStretcherShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BackboneStretcherShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BackboneStretcherShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BackboneStretcherShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp index fd9b3951c6b..69f1814e38e 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BezierCurveShader.cpp @@ -73,43 +73,39 @@ PyTypeObject BezierCurveShader_Type = { sizeof(BPy_BezierCurveShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BezierCurveShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BezierCurveShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BezierCurveShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BezierCurveShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp index 756a6e46c0d..06785ca5617 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_BlenderTextureShader.cpp @@ -93,43 +93,39 @@ PyTypeObject BlenderTextureShader_Type = { sizeof(BPy_BlenderTextureShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - BlenderTextureShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)BlenderTextureShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + BlenderTextureShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)BlenderTextureShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp index a2540e53425..a5aa5e188ff 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp @@ -91,43 +91,39 @@ PyTypeObject CalligraphicShader_Type = { sizeof(BPy_CalligraphicShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CalligraphicShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CalligraphicShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CalligraphicShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CalligraphicShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp index 7792fad3a68..2642f109acf 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ColorNoiseShader.cpp @@ -72,43 +72,39 @@ PyTypeObject ColorNoiseShader_Type = { sizeof(BPy_ColorNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ColorNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ColorNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ColorNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ColorNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp index 364f2ad72c2..a1e20542acf 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantColorShader.cpp @@ -78,43 +78,39 @@ PyTypeObject ConstantColorShader_Type = { sizeof(BPy_ConstantColorShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ConstantColorShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ConstantColorShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ConstantColorShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ConstantColorShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp index 6ffcfec4f69..6e338a5f6be 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstantThicknessShader.cpp @@ -72,43 +72,39 @@ PyTypeObject ConstantThicknessShader_Type = { sizeof(BPy_ConstantThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ConstantThicknessShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ConstantThicknessShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ConstantThicknessShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ConstantThicknessShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp index 11153b9dfc5..db4b6df6cb4 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ConstrainedIncreasingThicknessShader.cpp @@ -78,11 +78,7 @@ PyTypeObject ConstrainedIncreasingThicknessShader_Type = { sizeof(BPy_ConstrainedIncreasingThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif + 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp index d6619934c16..7365c369fb3 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_GuidingLinesShader.cpp @@ -80,43 +80,39 @@ PyTypeObject GuidingLinesShader_Type = { sizeof(BPy_GuidingLinesShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GuidingLinesShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GuidingLinesShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GuidingLinesShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GuidingLinesShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp index 9f9c6e540dc..d6f33c3a295 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingColorShader.cpp @@ -100,43 +100,39 @@ PyTypeObject IncreasingColorShader_Type = { sizeof(BPy_IncreasingColorShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncreasingColorShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncreasingColorShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncreasingColorShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncreasingColorShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp index f91e5deacf7..296d3fb0713 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_IncreasingThicknessShader.cpp @@ -78,43 +78,39 @@ PyTypeObject IncreasingThicknessShader_Type = { sizeof(BPy_IncreasingThicknessShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncreasingThicknessShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncreasingThicknessShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncreasingThicknessShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncreasingThicknessShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp index d087f6065b5..a576bc35006 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp @@ -79,43 +79,39 @@ PyTypeObject PolygonalizationShader_Type = { sizeof(BPy_PolygonalizationShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - PolygonalizationShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PolygonalizationShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + PolygonalizationShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)PolygonalizationShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp index ed456230682..e4aeb612cc4 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SamplingShader.cpp @@ -70,43 +70,39 @@ PyTypeObject SamplingShader_Type = { sizeof(BPy_SamplingShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SamplingShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SamplingShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SamplingShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SamplingShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp index de9e67a93b2..55aee8b8a56 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SmoothingShader.cpp @@ -102,43 +102,39 @@ PyTypeObject SmoothingShader_Type = { sizeof(BPy_SmoothingShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SmoothingShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SmoothingShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SmoothingShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SmoothingShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp index b975c1bb703..85e49b51f47 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_SpatialNoiseShader.cpp @@ -96,43 +96,39 @@ PyTypeObject SpatialNoiseShader_Type = { sizeof(BPy_SpatialNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - SpatialNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)SpatialNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + SpatialNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)SpatialNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp index 2c8451da43d..d914b180f6f 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_StrokeTextureStepShader.cpp @@ -72,43 +72,39 @@ PyTypeObject StrokeTextureStepShader_Type = { sizeof(BPy_StrokeTextureStepShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - StrokeTextureStepShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)StrokeTextureStepShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + StrokeTextureStepShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)StrokeTextureStepShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp index cbbaaf2f82b..db1e634f91e 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_ThicknessNoiseShader.cpp @@ -74,43 +74,39 @@ PyTypeObject ThicknessNoiseShader_Type = { sizeof(BPy_ThicknessNoiseShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ThicknessNoiseShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ThicknessNoiseShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ThicknessNoiseShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ThicknessNoiseShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp index b52e10d21c7..ee1ac7697db 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_TipRemoverShader.cpp @@ -71,43 +71,39 @@ PyTypeObject TipRemoverShader_Type = { sizeof(BPy_TipRemoverShader), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TipRemoverShader___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &StrokeShader_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TipRemoverShader___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TipRemoverShader___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &StrokeShader_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TipRemoverShader___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp index eec01c1ebb6..d2f138dc176 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DDouble.cpp @@ -189,43 +189,39 @@ PyTypeObject UnaryFunction0DDouble_Type = { sizeof(BPy_UnaryFunction0DDouble), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DDouble___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DDouble___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DDouble___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DDouble___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DDouble___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DDouble___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DDouble___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp index 6126ff571e6..6e55b7d9bcc 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DEdgeNature.cpp @@ -128,43 +128,39 @@ PyTypeObject UnaryFunction0DEdgeNature_Type = { sizeof(BPy_UnaryFunction0DEdgeNature), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DEdgeNature___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DEdgeNature___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DEdgeNature___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DEdgeNature___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DEdgeNature___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DEdgeNature___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp index 6b843817197..23aece94c39 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DFloat.cpp @@ -165,43 +165,39 @@ PyTypeObject UnaryFunction0DFloat_Type = { sizeof(BPy_UnaryFunction0DFloat), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DFloat___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DFloat___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DFloat___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DFloat___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DFloat___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DFloat___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DFloat___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp index 74f4ac9d392..6f904898458 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DId.cpp @@ -124,43 +124,39 @@ PyTypeObject UnaryFunction0DId_Type = { sizeof(BPy_UnaryFunction0DId), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DId___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DId___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DId___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DId___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DId___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DId___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DId___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp index 382dfdbd72d..92dc5901b5c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DMaterial.cpp @@ -127,43 +127,39 @@ PyTypeObject UnaryFunction0DMaterial_Type = { sizeof(BPy_UnaryFunction0DMaterial), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DMaterial___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DMaterial___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DMaterial___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DMaterial___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DMaterial___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DMaterial___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DMaterial___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp index 87241708d9c..829c9d0b7c1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DUnsigned.cpp @@ -128,43 +128,39 @@ PyTypeObject UnaryFunction0DUnsigned_Type = { sizeof(BPy_UnaryFunction0DUnsigned), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DUnsigned___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DUnsigned___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DUnsigned___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DUnsigned___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DUnsigned___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DUnsigned___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp index b1451a89854..a7248eebae2 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec2f.cpp @@ -133,43 +133,39 @@ PyTypeObject UnaryFunction0DVec2f_Type = { sizeof(BPy_UnaryFunction0DVec2f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVec2f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVec2f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVec2f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVec2f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVec2f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVec2f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVec2f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp index 65b5f56f61c..1810648b0b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVec3f.cpp @@ -126,43 +126,39 @@ PyTypeObject UnaryFunction0DVec3f_Type = { sizeof(BPy_UnaryFunction0DVec3f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVec3f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVec3f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVec3f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVec3f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVec3f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVec3f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVec3f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp index 0c0c4930245..4c015cec410 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DVectorViewShape.cpp @@ -137,43 +137,39 @@ PyTypeObject UnaryFunction0DVectorViewShape_Type = { sizeof(BPy_UnaryFunction0DVectorViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DVectorViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DVectorViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DVectorViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DVectorViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DVectorViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DVectorViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp index d5122b27b35..c2f0df9798c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/BPy_UnaryFunction0DViewShape.cpp @@ -135,43 +135,39 @@ PyTypeObject UnaryFunction0DViewShape_Type = { sizeof(BPy_UnaryFunction0DViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction0DViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction0DViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction0DViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction0DViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction0DViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction0DViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction0DViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp index 384d633fb2d..4aed82a14d3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Id/BPy_ShapeIdF0D.cpp @@ -76,43 +76,39 @@ PyTypeObject ShapeIdF0D_Type = { sizeof(BPy_ShapeIdF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ShapeIdF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DId_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ShapeIdF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ShapeIdF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DId_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ShapeIdF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp index 2c76f6f303a..6b6e06d6efd 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Material/BPy_MaterialF0D.cpp @@ -79,43 +79,39 @@ PyTypeObject MaterialF0D_Type = { sizeof(BPy_MaterialF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - MaterialF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DMaterial_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)MaterialF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + MaterialF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DMaterial_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)MaterialF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp index 6de53794228..c6fb66270f7 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Nature_EdgeNature/BPy_CurveNatureF0D.cpp @@ -70,43 +70,39 @@ PyTypeObject CurveNatureF0D_Type = { sizeof(BPy_CurveNatureF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurveNatureF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DEdgeNature_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurveNatureF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurveNatureF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DEdgeNature_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurveNatureF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp index 5baf1ba448e..66c0243727d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_Normal2DF0D.cpp @@ -72,43 +72,39 @@ PyTypeObject Normal2DF0D_Type = { sizeof(BPy_Normal2DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Normal2DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Normal2DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Normal2DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Normal2DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp index 864e8573043..4ade0e2e995 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec2f/BPy_VertexOrientation2DF0D.cpp @@ -74,43 +74,39 @@ PyTypeObject VertexOrientation2DF0D_Type = { sizeof(BPy_VertexOrientation2DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - VertexOrientation2DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)VertexOrientation2DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + VertexOrientation2DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)VertexOrientation2DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp index b2cc62f6904..f634eaa0327 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_Vec3f/BPy_VertexOrientation3DF0D.cpp @@ -74,43 +74,39 @@ PyTypeObject VertexOrientation3DF0D_Type = { sizeof(BPy_VertexOrientation3DF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - VertexOrientation3DF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVec3f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)VertexOrientation3DF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + VertexOrientation3DF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVec3f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)VertexOrientation3DF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp index 2a9b521907d..c624e3eb136 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetOccludeeF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetOccludeeF0D_Type = { sizeof(BPy_GetOccludeeF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludeeF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludeeF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludeeF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludeeF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp index e5e50dfcd4c..8234e7f4351 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_ViewShape/BPy_GetShapeF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetShapeF0D_Type = { sizeof(BPy_GetShapeF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetShapeF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetShapeF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetShapeF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetShapeF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp index 71dda2e2c32..217fe1cb55a 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_Curvature2DAngleF0D.cpp @@ -74,43 +74,39 @@ PyTypeObject Curvature2DAngleF0D_Type = { sizeof(BPy_Curvature2DAngleF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Curvature2DAngleF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Curvature2DAngleF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Curvature2DAngleF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Curvature2DAngleF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp index 0bf7f0e7fa4..b0777adb311 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_DensityF0D.cpp @@ -79,43 +79,39 @@ PyTypeObject DensityF0D_Type = { sizeof(BPy_DensityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp index 0c4abc60981..6c230a1207d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedXF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetProjectedXF0D_Type = { sizeof(BPy_GetProjectedXF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedXF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedXF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedXF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedXF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp index a87e64ee2ce..43913316567 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedYF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetProjectedYF0D_Type = { sizeof(BPy_GetProjectedYF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedYF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedYF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedYF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedYF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp index 52e0021d3b0..a7d1d05c3ca 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetProjectedZF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetProjectedZF0D_Type = { sizeof(BPy_GetProjectedZF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedZF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedZF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedZF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedZF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp index 98422fb45f3..94abd089db1 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetXF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetXF0D_Type = { sizeof(BPy_GetXF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetXF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetXF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetXF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetXF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp index f60115a4240..fc4edb9eb1a 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetYF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetYF0D_Type = { sizeof(BPy_GetYF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetYF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetYF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetYF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetYF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp index 822c3256fd9..3729f7bcb66 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_GetZF0D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetZF0D_Type = { sizeof(BPy_GetZF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetZF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetZF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetZF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetZF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp index 06d759f0737..64f86653922 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_LocalAverageDepthF0D.cpp @@ -77,43 +77,39 @@ PyTypeObject LocalAverageDepthF0D_Type = { sizeof(BPy_LocalAverageDepthF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - LocalAverageDepthF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)LocalAverageDepthF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + LocalAverageDepthF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)LocalAverageDepthF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp index 656749dfdff..2b2dba80f04 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_double/BPy_ZDiscontinuityF0D.cpp @@ -74,43 +74,39 @@ PyTypeObject ZDiscontinuityF0D_Type = { sizeof(BPy_ZDiscontinuityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ZDiscontinuityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ZDiscontinuityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ZDiscontinuityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ZDiscontinuityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp index e547ebacf7e..092f78c584c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetCurvilinearAbscissaF0D.cpp @@ -72,43 +72,39 @@ PyTypeObject GetCurvilinearAbscissaF0D_Type = { sizeof(BPy_GetCurvilinearAbscissaF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetCurvilinearAbscissaF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetCurvilinearAbscissaF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetCurvilinearAbscissaF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp index 8afeaed8518..28be409b8fb 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetParameterF0D.cpp @@ -68,43 +68,39 @@ PyTypeObject GetParameterF0D_Type = { sizeof(BPy_GetParameterF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetParameterF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetParameterF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetParameterF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetParameterF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp index d9ab0edb53c..3f6667af843 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_GetViewMapGradientNormF0D.cpp @@ -77,43 +77,39 @@ PyTypeObject GetViewMapGradientNormF0D_Type = { sizeof(BPy_GetViewMapGradientNormF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetViewMapGradientNormF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetViewMapGradientNormF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetViewMapGradientNormF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp index 125d0b8212d..98cd37f5fea 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadCompleteViewMapPixelF0D.cpp @@ -75,43 +75,39 @@ PyTypeObject ReadCompleteViewMapPixelF0D_Type = { sizeof(BPy_ReadCompleteViewMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadCompleteViewMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadCompleteViewMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp index ed0782edb22..07bbcfed102 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadMapPixelF0D.cpp @@ -76,43 +76,39 @@ PyTypeObject ReadMapPixelF0D_Type = { sizeof(BPy_ReadMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp index f1dadedf183..4d2da133b5f 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_float/BPy_ReadSteerableViewMapPixelF0D.cpp @@ -79,43 +79,39 @@ PyTypeObject ReadSteerableViewMapPixelF0D_Type = { sizeof(BPy_ReadSteerableViewMapPixelF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DFloat_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ReadSteerableViewMapPixelF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DFloat_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ReadSteerableViewMapPixelF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp index aca638ab972..30e5ea4a1f8 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_unsigned_int/BPy_QuantitativeInvisibilityF0D.cpp @@ -77,43 +77,39 @@ PyTypeObject QuantitativeInvisibilityF0D_Type = { sizeof(BPy_QuantitativeInvisibilityF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DUnsigned_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DUnsigned_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp index 8fe266c4f19..a8461e006b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction0D/UnaryFunction0D_vector_ViewShape/BPy_GetOccludersF0D.cpp @@ -70,43 +70,39 @@ PyTypeObject GetOccludersF0D_Type = { sizeof(BPy_GetOccludersF0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludersF0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction0DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludersF0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludersF0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction0DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludersF0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp index ad20dc79d71..0ce6e099ed3 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DDouble.cpp @@ -270,43 +270,39 @@ PyTypeObject UnaryFunction1DDouble_Type = { sizeof(BPy_UnaryFunction1DDouble), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DDouble___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DDouble___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DDouble_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DDouble___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DDouble___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DDouble___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DDouble___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DDouble_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DDouble___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp index 44937b3ebcc..83a502de548 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DEdgeNature.cpp @@ -177,43 +177,39 @@ PyTypeObject UnaryFunction1DEdgeNature_Type = { sizeof(BPy_UnaryFunction1DEdgeNature), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DEdgeNature___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DEdgeNature___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DEdgeNature___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DEdgeNature___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DEdgeNature___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DEdgeNature_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DEdgeNature___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp index 2fc4cd4f2cb..7ba80c58256 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DFloat.cpp @@ -166,43 +166,39 @@ PyTypeObject UnaryFunction1DFloat_Type = { sizeof(BPy_UnaryFunction1DFloat), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DFloat___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DFloat___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DFloat_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DFloat___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DFloat___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DFloat___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DFloat___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DFloat_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DFloat___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp index d5211d66d16..ed8790fcd89 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DUnsigned.cpp @@ -177,43 +177,39 @@ PyTypeObject UnaryFunction1DUnsigned_Type = { sizeof(BPy_UnaryFunction1DUnsigned), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DUnsigned___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DUnsigned___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DUnsigned___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DUnsigned___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DUnsigned___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DUnsigned_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DUnsigned___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp index 684c9e189fe..0f288faea4e 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec2f.cpp @@ -181,43 +181,39 @@ PyTypeObject UnaryFunction1DVec2f_Type = { sizeof(BPy_UnaryFunction1DVec2f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVec2f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVec2f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVec2f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVec2f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVec2f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVec2f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVec2f_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVec2f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp index c45c61fd9ac..fbdefd891be 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVec3f.cpp @@ -174,43 +174,39 @@ PyTypeObject UnaryFunction1DVec3f_Type = { sizeof(BPy_UnaryFunction1DVec3f), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVec3f___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVec3f___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVec3f___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVec3f___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVec3f___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVec3f___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVec3f_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVec3f___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp index da8855a3a19..09b9e303fa0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVectorViewShape.cpp @@ -202,43 +202,39 @@ PyTypeObject UnaryFunction1DVectorViewShape_Type = { sizeof(BPy_UnaryFunction1DVectorViewShape), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVectorViewShape___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVectorViewShape___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVectorViewShape___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVectorViewShape___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVectorViewShape___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVectorViewShape_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVectorViewShape___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp index 5cfd12c42ff..9ab3de8bf79 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/BPy_UnaryFunction1DVoid.cpp @@ -189,43 +189,39 @@ PyTypeObject UnaryFunction1DVoid_Type = { sizeof(BPy_UnaryFunction1DVoid), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)UnaryFunction1DVoid___dealloc__, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - UnaryFunction1DVoid___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - BPy_UnaryFunction1DVoid_getseters, /* tp_getset */ - &UnaryFunction1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)UnaryFunction1DVoid___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + (reprfunc)UnaryFunction1DVoid___repr__, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + (ternaryfunc)UnaryFunction1DVoid___call__, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + UnaryFunction1DVoid___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + BPy_UnaryFunction1DVoid_getseters, /* tp_getset */ + &UnaryFunction1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)UnaryFunction1DVoid___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp index e203016aee5..141758bfe48 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Nature_EdgeNature/BPy_CurveNatureF1D.cpp @@ -82,43 +82,39 @@ PyTypeObject CurveNatureF1D_Type = { sizeof(BPy_CurveNatureF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - CurveNatureF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DEdgeNature_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)CurveNatureF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + CurveNatureF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DEdgeNature_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)CurveNatureF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp index 620a74ddad1..7fa596d4bbe 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Normal2DF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject Normal2DF1D_Type = { sizeof(BPy_Normal2DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Normal2DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Normal2DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Normal2DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Normal2DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp index 1d21f627305..69ab07a2829 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec2f/BPy_Orientation2DF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject Orientation2DF1D_Type = { sizeof(BPy_Orientation2DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Orientation2DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec2f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Orientation2DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Orientation2DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec2f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Orientation2DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp index 60d6eeeef92..9866968e068 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_Vec3f/BPy_Orientation3DF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject Orientation3DF1D_Type = { sizeof(BPy_Orientation3DF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Orientation3DF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVec3f_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Orientation3DF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Orientation3DF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVec3f_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Orientation3DF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp index ce0b9c0f231..3bd9bf8abce 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_Curvature2DAngleF1D.cpp @@ -77,43 +77,39 @@ PyTypeObject Curvature2DAngleF1D_Type = { sizeof(BPy_Curvature2DAngleF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Curvature2DAngleF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)Curvature2DAngleF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Curvature2DAngleF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Curvature2DAngleF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp index 0190201ce37..12237f6a5e5 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_DensityF1D.cpp @@ -90,43 +90,39 @@ PyTypeObject DensityF1D_Type = { sizeof(BPy_DensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp index d9c9b7af7a2..49f7c019222 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetCompleteViewMapDensityF1D.cpp @@ -94,43 +94,39 @@ PyTypeObject GetCompleteViewMapDensityF1D_Type = { sizeof(BPy_GetCompleteViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetCompleteViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetCompleteViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetCompleteViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp index 2c5854a72e6..240e632b433 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetDirectionalViewMapDensityF1D.cpp @@ -101,43 +101,39 @@ PyTypeObject GetDirectionalViewMapDensityF1D_Type = { sizeof(BPy_GetDirectionalViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetDirectionalViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetDirectionalViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp index 6f00bc0f844..ce111f81c9d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedXF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject GetProjectedXF1D_Type = { sizeof(BPy_GetProjectedXF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedXF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedXF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedXF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedXF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp index b9b43c13b88..31dc72f8d0d 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedYF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject GetProjectedYF1D_Type = { sizeof(BPy_GetProjectedYF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedYF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedYF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedYF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedYF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp index f0b9fd192b0..e16a0c01942 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetProjectedZF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject GetProjectedZF1D_Type = { sizeof(BPy_GetProjectedZF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetProjectedZF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetProjectedZF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetProjectedZF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetProjectedZF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp index ef59d19aba4..78d74bf3399 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetSteerableViewMapDensityF1D.cpp @@ -91,43 +91,39 @@ PyTypeObject GetSteerableViewMapDensityF1D_Type = { sizeof(BPy_GetSteerableViewMapDensityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetSteerableViewMapDensityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetSteerableViewMapDensityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetSteerableViewMapDensityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp index 70b1a2cae2c..a158969c00c 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetViewMapGradientNormF1D.cpp @@ -91,43 +91,39 @@ PyTypeObject GetViewMapGradientNormF1D_Type = { sizeof(BPy_GetViewMapGradientNormF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetViewMapGradientNormF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetViewMapGradientNormF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetViewMapGradientNormF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp index 51c04ba82b3..9dfb5aa8793 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetXF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject GetXF1D_Type = { sizeof(BPy_GetXF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetXF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetXF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetXF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetXF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp index f18d3cb647c..239079e8472 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetYF1D.cpp @@ -75,43 +75,39 @@ PyTypeObject GetYF1D_Type = { sizeof(BPy_GetYF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetYF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetYF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetYF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetYF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp index 4d5d3f18604..8f973adc3f0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_GetZF1D.cpp @@ -76,43 +76,39 @@ PyTypeObject GetZF1D_Type = { sizeof(BPy_GetZF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetZF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetZF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetZF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetZF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp index a2f233e6f6d..53eaf9b9596 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_LocalAverageDepthF1D.cpp @@ -86,43 +86,39 @@ PyTypeObject LocalAverageDepthF1D_Type = { sizeof(BPy_LocalAverageDepthF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - LocalAverageDepthF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)LocalAverageDepthF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + LocalAverageDepthF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)LocalAverageDepthF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp index 6d9bff89d81..8d1d43bc4de 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_double/BPy_ZDiscontinuityF1D.cpp @@ -80,43 +80,39 @@ PyTypeObject ZDiscontinuityF1D_Type = { sizeof(BPy_ZDiscontinuityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ZDiscontinuityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DDouble_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ZDiscontinuityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ZDiscontinuityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DDouble_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ZDiscontinuityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp index 280f44e2e0c..da5140c4459 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_unsigned_int/BPy_QuantitativeInvisibilityF1D.cpp @@ -82,43 +82,39 @@ PyTypeObject QuantitativeInvisibilityF1D_Type = { sizeof(BPy_QuantitativeInvisibilityF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DUnsigned_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DUnsigned_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp index 4d7697d4078..57dc15d4a55 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludeeF1D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetOccludeeF1D_Type = { sizeof(BPy_GetOccludeeF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludeeF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludeeF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludeeF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludeeF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp index aae7a2597b1..ec8556eee96 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetOccludersF1D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetOccludersF1D_Type = { sizeof(BPy_GetOccludersF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetOccludersF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetOccludersF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetOccludersF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetOccludersF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp index 703e2e50955..95e7afe66fe 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_vector_ViewShape/BPy_GetShapeF1D.cpp @@ -69,43 +69,39 @@ PyTypeObject GetShapeF1D_Type = { sizeof(BPy_GetShapeF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - GetShapeF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVectorViewShape_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)GetShapeF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + GetShapeF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVectorViewShape_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)GetShapeF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp index a3b5bb8fe05..906b23d03d2 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_ChainingTimeStampF1D.cpp @@ -69,43 +69,39 @@ PyTypeObject ChainingTimeStampF1D_Type = { sizeof(BPy_ChainingTimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ChainingTimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ChainingTimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ChainingTimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ChainingTimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp index 23d254dd843..487af7dca70 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_IncrementChainingTimeStampF1D.cpp @@ -69,43 +69,39 @@ PyTypeObject IncrementChainingTimeStampF1D_Type = { sizeof(BPy_IncrementChainingTimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - IncrementChainingTimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + IncrementChainingTimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)IncrementChainingTimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp index cf94195cb01..ba21c98b0b0 100644 --- a/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryFunction1D/UnaryFunction1D_void/BPy_TimeStampF1D.cpp @@ -67,43 +67,39 @@ PyTypeObject TimeStampF1D_Type = { sizeof(BPy_TimeStampF1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TimeStampF1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryFunction1DVoid_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TimeStampF1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TimeStampF1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryFunction1DVoid_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TimeStampF1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp index f11a4d8c939..300a9d66f07 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_FalseUP0D.cpp @@ -60,43 +60,39 @@ PyTypeObject FalseUP0D_Type = { sizeof(BPy_FalseUP0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseUP0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseUP0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseUP0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseUP0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp index 018f44e4f07..6ff6ad03c1e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate0D/BPy_TrueUP0D.cpp @@ -60,43 +60,39 @@ PyTypeObject TrueUP0D_Type = { sizeof(BPy_TrueUP0D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueUP0D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate0D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueUP0D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueUP0D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate0D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueUP0D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp index 7c6b7b809f1..b42573c1fbe 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ContourUP1D.cpp @@ -61,43 +61,39 @@ PyTypeObject ContourUP1D_Type = { sizeof(BPy_ContourUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ContourUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ContourUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ContourUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ContourUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp index 0025b28137a..bcea039087c 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_DensityLowerThanUP1D.cpp @@ -77,43 +77,39 @@ PyTypeObject DensityLowerThanUP1D_Type = { sizeof(BPy_DensityLowerThanUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - DensityLowerThanUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)DensityLowerThanUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + DensityLowerThanUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)DensityLowerThanUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp index 34354349dfc..7ac09d4a644 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToChainingTimeStampUP1D.cpp @@ -72,43 +72,39 @@ PyTypeObject EqualToChainingTimeStampUP1D_Type = { sizeof(BPy_EqualToChainingTimeStampUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - EqualToChainingTimeStampUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + EqualToChainingTimeStampUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)EqualToChainingTimeStampUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp index c9e8c80c3ce..af98a277bad 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_EqualToTimeStampUP1D.cpp @@ -71,43 +71,39 @@ PyTypeObject EqualToTimeStampUP1D_Type = { sizeof(BPy_EqualToTimeStampUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - EqualToTimeStampUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)EqualToTimeStampUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + EqualToTimeStampUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)EqualToTimeStampUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp index 3cc9a21c050..4c21d1ea54e 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ExternalContourUP1D.cpp @@ -65,43 +65,39 @@ PyTypeObject ExternalContourUP1D_Type = { sizeof(BPy_ExternalContourUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ExternalContourUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ExternalContourUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ExternalContourUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ExternalContourUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp index 58efd78619e..87c1ea918d0 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_FalseUP1D.cpp @@ -60,43 +60,39 @@ PyTypeObject FalseUP1D_Type = { sizeof(BPy_FalseUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - FalseUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)FalseUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + FalseUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)FalseUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp index cca81e6bc6e..7fa00295887 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.cpp @@ -76,43 +76,39 @@ PyTypeObject QuantitativeInvisibilityUP1D_Type = { sizeof(BPy_QuantitativeInvisibilityUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - QuantitativeInvisibilityUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + QuantitativeInvisibilityUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)QuantitativeInvisibilityUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp index a2eac6b41fe..2f097c5a6fe 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_ShapeUP1D.cpp @@ -72,43 +72,39 @@ PyTypeObject ShapeUP1D_Type = { sizeof(BPy_ShapeUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ShapeUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)ShapeUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + ShapeUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)ShapeUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp index 79b0fce790a..d589f621a4d 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_TrueUP1D.cpp @@ -60,43 +60,39 @@ PyTypeObject TrueUP1D_Type = { sizeof(BPy_TrueUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - TrueUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)TrueUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + TrueUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)TrueUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp index 965945a1f79..32882ac3c20 100644 --- a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp @@ -73,43 +73,39 @@ PyTypeObject WithinImageBoundaryUP1D_Type = { sizeof(BPy_WithinImageBoundaryUP1D), /* tp_basicsize */ 0, /* tp_itemsize */ nullptr, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - nullptr, /* tp_print */ -#endif - nullptr, /* tp_getattr */ - nullptr, /* tp_setattr */ - nullptr, /* tp_reserved */ - nullptr, /* tp_repr */ - nullptr, /* tp_as_number */ - nullptr, /* tp_as_sequence */ - nullptr, /* tp_as_mapping */ - nullptr, /* tp_hash */ - nullptr, /* tp_call */ - nullptr, /* tp_str */ - nullptr, /* tp_getattro */ - nullptr, /* tp_setattro */ - nullptr, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - WithinImageBoundaryUP1D___doc__, /* tp_doc */ - nullptr, /* tp_traverse */ - nullptr, /* tp_clear */ - nullptr, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - nullptr, /* tp_iter */ - nullptr, /* tp_iternext */ - nullptr, /* tp_methods */ - nullptr, /* tp_members */ - nullptr, /* tp_getset */ - &UnaryPredicate1D_Type, /* tp_base */ - nullptr, /* tp_dict */ - nullptr, /* tp_descr_get */ - nullptr, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */ - nullptr, /* tp_alloc */ - nullptr, /* tp_new */ + 0, /* tp_vectorcall_offset */ + nullptr, /* tp_getattr */ + nullptr, /* tp_setattr */ + nullptr, /* tp_reserved */ + nullptr, /* tp_repr */ + nullptr, /* tp_as_number */ + nullptr, /* tp_as_sequence */ + nullptr, /* tp_as_mapping */ + nullptr, /* tp_hash */ + nullptr, /* tp_call */ + nullptr, /* tp_str */ + nullptr, /* tp_getattro */ + nullptr, /* tp_setattro */ + nullptr, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + WithinImageBoundaryUP1D___doc__, /* tp_doc */ + nullptr, /* tp_traverse */ + nullptr, /* tp_clear */ + nullptr, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + nullptr, /* tp_iter */ + nullptr, /* tp_iternext */ + nullptr, /* tp_methods */ + nullptr, /* tp_members */ + nullptr, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + nullptr, /* tp_dict */ + nullptr, /* tp_descr_get */ + nullptr, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */ + nullptr, /* tp_alloc */ + nullptr, /* tp_new */ }; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/python/bmesh/bmesh_py_ops.c b/source/blender/python/bmesh/bmesh_py_ops.c index 03a890d315c..c5d72a00ce3 100644 --- a/source/blender/python/bmesh/bmesh_py_ops.c +++ b/source/blender/python/bmesh/bmesh_py_ops.c @@ -167,11 +167,7 @@ static PyTypeObject bmesh_op_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index fd996c8a1a2..daa604a3fbf 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -1192,12 +1192,8 @@ PyTypeObject BPy_IDGroup_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ @@ -1605,12 +1601,8 @@ PyTypeObject BPy_IDArray_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ @@ -1726,12 +1718,8 @@ PyTypeObject BPy_IDGroup_Iter_Type = { /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + NULL, /* destructor tp_dealloc; */ + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* cmpfunc tp_compare; */ diff --git a/source/blender/python/generic/imbuf_py_api.c b/source/blender/python/generic/imbuf_py_api.c index 24029f0ca12..d05690759ce 100644 --- a/source/blender/python/generic/imbuf_py_api.c +++ b/source/blender/python/generic/imbuf_py_api.c @@ -347,15 +347,11 @@ PyTypeObject Py_ImBuf_Type = { /* Methods to implement standard operations */ (destructor)py_imbuf_dealloc, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)py_imbuf_repr, /* reprfunc tp_repr; */ /* Method suites for standard classes */ diff --git a/source/blender/python/intern/bpy_app_translations.c b/source/blender/python/intern/bpy_app_translations.c index ee64d0a409c..56fc3efc090 100644 --- a/source/blender/python/intern/bpy_app_translations.c +++ b/source/blender/python/intern/bpy_app_translations.c @@ -795,11 +795,7 @@ static PyTypeObject BlenderAppTranslationsType = { /* methods */ /* No destructor, this is a singleton! */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, diff --git a/source/blender/python/intern/bpy_capi_utils.h b/source/blender/python/intern/bpy_capi_utils.h index 55f8a291410..0854713982d 100644 --- a/source/blender/python/intern/bpy_capi_utils.h +++ b/source/blender/python/intern/bpy_capi_utils.h @@ -20,8 +20,8 @@ #pragma once -#if PY_VERSION_HEX < 0x03070000 -# error "Python 3.7 or greater is required, you'll need to update your Python." +#if PY_VERSION_HEX < 0x03090000 +# error "Python 3.9 or greater is required, you'll need to update your Python." #endif #ifdef __cplusplus diff --git a/source/blender/python/intern/bpy_library_load.c b/source/blender/python/intern/bpy_library_load.c index 39d1fba2dc9..7ee563feff8 100644 --- a/source/blender/python/intern/bpy_library_load.c +++ b/source/blender/python/intern/bpy_library_load.c @@ -94,13 +94,9 @@ static PyTypeObject bpy_lib_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)bpy_lib_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */ NULL, /* tp_repr */ diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 39ba8448795..0b1af733f84 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -6404,11 +6404,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, @@ -6460,7 +6456,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { #if defined(_MSC_VER) NULL, /* defer assignment */ #else - &PyType_Type, /* struct _typeobject *tp_base; */ + &PyType_Type, /* struct _typeobject *tp_base; */ #endif NULL, /* PyObject *tp_dict; */ NULL, /* descrgetfunc tp_descr_get; */ @@ -6489,13 +6485,9 @@ PyTypeObject pyrna_struct_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_struct_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_struct_repr, /* tp_repr */ @@ -6529,7 +6521,7 @@ PyTypeObject pyrna_struct_Type = { /* delete references to contained objects */ (inquiry)pyrna_struct_clear, /* inquiry tp_clear; */ #else - NULL, /* traverseproc tp_traverse; */ + NULL, /* traverseproc tp_traverse; */ /* delete references to contained objects */ NULL, /* inquiry tp_clear; */ @@ -6582,13 +6574,9 @@ PyTypeObject pyrna_prop_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_prop_repr, /* tp_repr */ @@ -6670,13 +6658,9 @@ PyTypeObject pyrna_prop_array_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_array_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ (reprfunc)pyrna_prop_array_repr, /* tp_repr */ @@ -6757,13 +6741,9 @@ PyTypeObject pyrna_prop_collection_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, @@ -6847,13 +6827,9 @@ static PyTypeObject pyrna_prop_collection_idprop_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, @@ -6937,11 +6913,7 @@ PyTypeObject pyrna_func_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif + 0, /* tp_vectorcall_offset */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, @@ -7037,13 +7009,9 @@ static PyTypeObject pyrna_prop_collection_iter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)pyrna_prop_collection_iter_dealloc, /* tp_dealloc */ -# if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -# else - (printfunc)NULL, /* printfunc tp_print */ -# endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in Python 3.0! */ NULL, diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c index 61487df1ab5..1766c7dea66 100644 --- a/source/blender/python/mathutils/mathutils_Vector.c +++ b/source/blender/python/mathutils/mathutils_Vector.c @@ -3042,15 +3042,11 @@ PyTypeObject vector_Type = { /* Methods to implement standard operations */ (destructor)BaseMathObject_dealloc, /* destructor tp_dealloc; */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - (printfunc)NULL, /* printfunc tp_print */ -#endif - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)Vector_repr, /* reprfunc tp_repr; */ + 0, /* tp_vectorcall_offset */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)Vector_repr, /* reprfunc tp_repr; */ /* Method suites for standard classes */ @@ -3065,7 +3061,7 @@ PyTypeObject vector_Type = { #ifndef MATH_STANDALONE (reprfunc)Vector_str, /* reprfunc tp_str; */ #else - NULL, /* reprfunc tp_str; */ + NULL, /* reprfunc tp_str; */ #endif NULL, /* getattrofunc tp_getattro; */ NULL, /* setattrofunc tp_setattro; */ From aa43e2ec29a9f73918b12001c6e4f4b4c63fd9c9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 08:08:16 +1100 Subject: [PATCH 100/519] PyAPI: use PyModule_AddType utility function --- source/blender/python/bmesh/bmesh_py_types.c | 48 ++++++++----------- source/blender/python/generic/idprop_py_api.c | 12 ++--- source/blender/python/gpu/gpu_py_types.c | 18 +++---- source/blender/python/mathutils/mathutils.c | 10 ++-- .../python/mathutils/mathutils_bvhtree.c | 2 +- .../python/mathutils/mathutils_kdtree.c | 2 +- 6 files changed, 37 insertions(+), 55 deletions(-) diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index e9499818f64..5fca6f4cec6 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -3754,37 +3754,31 @@ PyObject *BPyInit_bmesh_types(void) submodule = PyModule_Create(&BPy_BM_types_module_def); -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_BMesh_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMElemSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVertSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdgeSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFaceSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoopSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMIter_Type); + PyModule_AddType(submodule, &BPy_BMesh_Type); + PyModule_AddType(submodule, &BPy_BMVert_Type); + PyModule_AddType(submodule, &BPy_BMEdge_Type); + PyModule_AddType(submodule, &BPy_BMFace_Type); + PyModule_AddType(submodule, &BPy_BMLoop_Type); + PyModule_AddType(submodule, &BPy_BMElemSeq_Type); + PyModule_AddType(submodule, &BPy_BMVertSeq_Type); + PyModule_AddType(submodule, &BPy_BMEdgeSeq_Type); + PyModule_AddType(submodule, &BPy_BMFaceSeq_Type); + PyModule_AddType(submodule, &BPy_BMLoopSeq_Type); + PyModule_AddType(submodule, &BPy_BMIter_Type); /* bmesh_py_types_select.c */ - MODULE_TYPE_ADD(submodule, BPy_BMEditSelSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEditSelIter_Type); + PyModule_AddType(submodule, &BPy_BMEditSelSeq_Type); + PyModule_AddType(submodule, &BPy_BMEditSelIter_Type); /* bmesh_py_types_customdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerCollection_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerItem_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessVert_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessEdge_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessFace_Type); + PyModule_AddType(submodule, &BPy_BMLayerAccessLoop_Type); + PyModule_AddType(submodule, &BPy_BMLayerCollection_Type); + PyModule_AddType(submodule, &BPy_BMLayerItem_Type); /* bmesh_py_types_meshdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLoopUV_Type); - MODULE_TYPE_ADD(submodule, BPy_BMDeformVert_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPy_BMLoopUV_Type); + PyModule_AddType(submodule, &BPy_BMDeformVert_Type); return submodule; } diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index daa604a3fbf..6be7348a2f8 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -1799,16 +1799,10 @@ static PyObject *BPyInit_idprop_types(void) IDProp_Init_Types(); -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type); - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type); - MODULE_TYPE_ADD(submodule, BPy_IDArray_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPy_IDGroup_Type); + PyModule_AddType(submodule, &BPy_IDGroup_Iter_Type); + PyModule_AddType(submodule, &BPy_IDArray_Type); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c index d70c5ba4966..f0208d3993e 100644 --- a/source/blender/python/gpu/gpu_py_types.c +++ b/source/blender/python/gpu/gpu_py_types.c @@ -62,18 +62,12 @@ PyObject *bpygpu_types_init(void) return NULL; } -#define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ - Py_INCREF((PyObject *)&t) - - MODULE_TYPE_ADD(submodule, BPyGPUVertFormat_Type); - MODULE_TYPE_ADD(submodule, BPyGPUVertBuf_Type); - MODULE_TYPE_ADD(submodule, BPyGPUIndexBuf_Type); - MODULE_TYPE_ADD(submodule, BPyGPUBatch_Type); - MODULE_TYPE_ADD(submodule, BPyGPUOffScreen_Type); - MODULE_TYPE_ADD(submodule, BPyGPUShader_Type); - -#undef MODULE_TYPE_ADD + PyModule_AddType(submodule, &BPyGPUVertFormat_Type); + PyModule_AddType(submodule, &BPyGPUVertBuf_Type); + PyModule_AddType(submodule, &BPyGPUIndexBuf_Type); + PyModule_AddType(submodule, &BPyGPUBatch_Type); + PyModule_AddType(submodule, &BPyGPUOffScreen_Type); + PyModule_AddType(submodule, &BPyGPUShader_Type); return submodule; } diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c index 1616bbeeea9..3791a6c2d29 100644 --- a/source/blender/python/mathutils/mathutils.c +++ b/source/blender/python/mathutils/mathutils.c @@ -784,11 +784,11 @@ PyMODINIT_FUNC PyInit_mathutils(void) mod = PyModule_Create(&M_Mathutils_module_def); /* each type has its own new() function */ - PyModule_AddObject(mod, vector_Type.tp_name, (PyObject *)&vector_Type); - PyModule_AddObject(mod, matrix_Type.tp_name, (PyObject *)&matrix_Type); - PyModule_AddObject(mod, euler_Type.tp_name, (PyObject *)&euler_Type); - PyModule_AddObject(mod, quaternion_Type.tp_name, (PyObject *)&quaternion_Type); - PyModule_AddObject(mod, color_Type.tp_name, (PyObject *)&color_Type); + PyModule_AddType(mod, &vector_Type); + PyModule_AddType(mod, &matrix_Type); + PyModule_AddType(mod, &euler_Type); + PyModule_AddType(mod, &quaternion_Type); + PyModule_AddType(mod, &color_Type); /* submodule */ PyModule_AddObject(mod, "geometry", (submodule = PyInit_mathutils_geometry())); diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c index 1d477421e30..0f3e54dc41f 100644 --- a/source/blender/python/mathutils/mathutils_bvhtree.c +++ b/source/blender/python/mathutils/mathutils_bvhtree.c @@ -1331,7 +1331,7 @@ PyMODINIT_FUNC PyInit_mathutils_bvhtree(void) return NULL; } - PyModule_AddObject(m, "BVHTree", (PyObject *)&PyBVHTree_Type); + PyModule_AddType(m, &PyBVHTree_Type); return m; } diff --git a/source/blender/python/mathutils/mathutils_kdtree.c b/source/blender/python/mathutils/mathutils_kdtree.c index 1de3c23838f..fe8f9ec0334 100644 --- a/source/blender/python/mathutils/mathutils_kdtree.c +++ b/source/blender/python/mathutils/mathutils_kdtree.c @@ -459,7 +459,7 @@ PyMODINIT_FUNC PyInit_mathutils_kdtree(void) if (PyType_Ready(&PyKDTree_Type)) { return NULL; } - PyModule_AddObject(m, "KDTree", (PyObject *)&PyKDTree_Type); + PyModule_AddType(m, &PyKDTree_Type); return m; } From cafd6b519c5f5c4b67d0dfe3d453cd4223b38716 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 08:08:17 +1100 Subject: [PATCH 101/519] PyAPI: Use PyPreConfig & PyConfig for Python initialization Use Python 3.8's API for setting the initial configuration. This replaces a mix of our logic and direct calls to the Python API and has no user visible changes. Using the Python API makes the logic easier to follow and provides utilities such as `PyConfig_SetBytesArgv` that wasn't available in previous releases. Note that this uses Python's utf8/wchar_t conversions, which used to cause problems (see T31506). Since `Py_UTF8Mode` was set, the systems locale isn't used for decoding, allowing us to use Python's utility functions that call `Py_DecodeLocale` internally. Ref D10382 --- source/blender/python/generic/py_capi_utils.c | 34 --- source/blender/python/generic/py_capi_utils.h | 2 - source/blender/python/intern/bpy_interface.c | 211 +++++++++++------- 3 files changed, 131 insertions(+), 116 deletions(-) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index ec6b8c54ac0..1eb4a51c392 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -879,40 +879,6 @@ void PyC_MainModule_Restore(PyObject *main_mod) Py_XDECREF(main_mod); } -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name #Py_SetPythonHome Wrapper - * \{ */ - -/** - * - Must be called before #Py_Initialize. - * - Expects output of `BKE_appdir_folder_id(BLENDER_PYTHON, NULL)`. - * - Note that the `PYTHONPATH` environment variable isn't reliable, see T31506. - * Use #Py_SetPythonHome instead. - */ -void PyC_SetHomePath(const char *py_path_bundle) -{ -# ifdef __APPLE__ - /* OSX allow file/directory names to contain : character (represented as / in the Finder) - * but current Python lib (release 3.1.1) doesn't handle these correctly */ - if (strchr(py_path_bundle, ':')) { - fprintf(stderr, - "Warning! Blender application is located in a path containing ':' or '/' chars\n" - "This may make python import function fail\n"); - } -# endif - - /* Set the environment path. */ - wchar_t py_path_bundle_wchar[1024]; - - /* Can't use `mbstowcs` on linux gives bug: T23018. */ - BLI_strncpy_wchar_from_utf8( - py_path_bundle_wchar, py_path_bundle, ARRAY_SIZE(py_path_bundle_wchar)); - - Py_SetPythonHome(py_path_bundle_wchar); -} - bool PyC_IsInterpreterActive(void) { /* instead of PyThreadState_Get, which calls Py_FatalError */ diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index 358123657c7..aacc5dd7bea 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -88,8 +88,6 @@ bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]); void PyC_MainModule_Backup(PyObject **r_main_mod); void PyC_MainModule_Restore(PyObject *main_mod); -void PyC_SetHomePath(const char *py_path_bundle); - bool PyC_IsInterpreterActive(void); void *PyC_RNA_AsPointer(PyObject *value, const char *type_name); diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index c4789407e4e..311612e1499 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -304,100 +304,150 @@ static struct _inittab bpy_internal_modules[] = { {NULL, NULL}, }; +/** + * Convenience function for #BPY_python_start. + * + * These should happen so rarely that having comprehensive errors isn't needed. + * For example if `sys.argv` fails to allocate memory. + * + * Show an error just to avoid silent failure in the unlikely event something goes wrong, + * in this case a developer will need to track down the root cause. + */ +static void pystatus_exit_on_error(PyStatus status) +{ + if (UNLIKELY(PyStatus_Exception(status))) { + fputs("Internal error initializing Python!\n", stderr); + /* This calls `exit`. */ + Py_ExitStatusException(status); + } +} + /* call BPY_context_set first */ void BPY_python_start(bContext *C, int argc, const char **argv) { #ifndef WITH_PYTHON_MODULE - PyThreadState *py_tstate = NULL; - /* Needed for Python's initialization for portable Python installations. - * We could use #Py_SetPath, but this overrides Python's internal logic - * for calculating it's own module search paths. - * - * `sys.executable` is overwritten after initialization to the Python binary. */ + /* #PyPreConfig (early-configuration). */ { - const char *program_path = BKE_appdir_program_path(); - wchar_t program_path_wchar[FILE_MAX]; - BLI_strncpy_wchar_from_utf8(program_path_wchar, program_path, ARRAY_SIZE(program_path_wchar)); - Py_SetProgramName(program_path_wchar); + PyPreConfig preconfig; + PyStatus status; + + if (py_use_system_env) { + PyPreConfig_InitPythonConfig(&preconfig); + } + else { + /* Only use the systems environment variables and site when explicitly requested. + * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807. + * An alternative to setting `preconfig.use_environment = 0` */ + PyPreConfig_InitIsolatedConfig(&preconfig); + } + + /* Force `utf-8` on all platforms, since this is what's used for Blender's internal strings, + * providing consistent encoding behavior across all Blender installations. + * + * This also uses the `surrogateescape` error handler ensures any unexpected bytes are escaped + * instead of raising an error. + * + * Without this `sys.getfilesystemencoding()` and `sys.stdout` for example may be set to ASCII + * or some other encoding - where printing some `utf-8` values will raise an error. + * + * This can cause scripts to fail entirely on some systems. + * + * This assignment is the equivalent of enabling the `PYTHONUTF8` environment variable. + * See `PEP-540` for details on exactly what this changes. */ + preconfig.utf8_mode = true; + + /* Note that there is no reason to call #Py_PreInitializeFromBytesArgs here + * as this is only used so that command line arguments can be handled by Python itself, + * not for setting `sys.argv` (handled below). */ + status = Py_PreInitialize(&preconfig); + pystatus_exit_on_error(status); } - /* must run before python initializes */ + /* Must run before python initializes, but after #PyPreConfig. */ PyImport_ExtendInittab(bpy_internal_modules); - /* Allow to use our own included Python. `py_path_bundle` may be NULL. */ + /* #PyConfig (initialize Python). */ { - const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); - if (py_path_bundle != NULL) { - PyC_SetHomePath(py_path_bundle); + PyConfig config; + PyStatus status; + bool has_python_executable = false; + + PyConfig_InitPythonConfig(&config); + + /* Suppress error messages when calculating the module search path. + * While harmless, it's noisy. */ + config.pathconfig_warnings = 0; + + /* When using the system's Python, allow the site-directory as well. */ + config.user_site_directory = py_use_system_env; + + /* While `sys.argv` is set, we don't want Python to interpret it. */ + config.parse_argv = 0; + status = PyConfig_SetBytesArgv(&config, argc, (char *const *)argv); + pystatus_exit_on_error(status); + + /* Needed for Python's initialization for portable Python installations. + * We could use #Py_SetPath, but this overrides Python's internal logic + * for calculating it's own module search paths. + * + * `sys.executable` is overwritten after initialization to the Python binary. */ + { + const char *program_path = BKE_appdir_program_path(); + status = PyConfig_SetBytesString(&config, &config.program_name, program_path); + pystatus_exit_on_error(status); } - else { - /* Common enough to use the system Python on Linux/Unix, warn on other systems. */ -# if defined(__APPLE__) || defined(_WIN32) - fprintf(stderr, - "Bundled Python not found and is expected on this platform " - "(the 'install' target may have not been built)\n"); + + /* Setting the program name is important so the 'multiprocessing' module + * can launch new Python instances. */ + { + char program_path[FILE_MAX]; + if (BKE_appdir_program_python_search( + program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) { + status = PyConfig_SetBytesString(&config, &config.executable, program_path); + pystatus_exit_on_error(status); + has_python_executable = true; + } + else { + /* Set to `sys.executable = None` below (we can't do before Python is initialized). */ + fprintf(stderr, + "Unable to find the python binary, " + "the multiprocessing module may not be functional!\n"); + } + } + + /* Allow to use our own included Python. `py_path_bundle` may be NULL. */ + { + const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); +# ifdef __APPLE__ + /* OSX allow file/directory names to contain : character (represented as / in the Finder) + * but current Python lib (release 3.1.1) doesn't handle these correctly */ + if (strchr(py_path_bundle, ':')) { + fprintf(stderr, + "Warning! Blender application is located in a path containing ':' or '/' chars\n" + "This may make python import function fail\n"); + } # endif + if (py_path_bundle != NULL) { + status = PyConfig_SetBytesString(&config, &config.home, py_path_bundle); + pystatus_exit_on_error(status); + } + else { + /* Common enough to use the system Python on Linux/Unix, warn on other systems. */ +# if defined(__APPLE__) || defined(_WIN32) + fprintf(stderr, + "Bundled Python not found and is expected on this platform " + "(the 'install' target may have not been built)\n"); +# endif + } } - } - /* Force `utf-8` on all platforms, since this is what's used for Blender's internal strings, - * providing consistent encoding behavior across all Blender installations. - * - * This also uses the `surrogateescape` error handler ensures any unexpected bytes are escaped - * instead of raising an error. - * - * Without this `sys.getfilesystemencoding()` and `sys.stdout` for example may be set to ASCII - * or some other encoding - where printing some `utf-8` values will raise an error. - * - * This can cause scripts to fail entirely on some systems. - * - * This assignment is the equivalent of enabling the `PYTHONUTF8` environment variable. - * See `PEP-540` for details on exactly what this changes. */ - Py_UTF8Mode = 1; + /* Initialize Python (also acquires lock). */ + status = Py_InitializeFromConfig(&config); + pystatus_exit_on_error(status); - /* Suppress error messages when calculating the module search path. - * While harmless, it's noisy. */ - Py_FrozenFlag = 1; - - /* Only use the systems environment variables and site when explicitly requested. - * Since an incorrect 'PYTHONPATH' causes difficult to debug errors, see: T72807. */ - Py_IgnoreEnvironmentFlag = !py_use_system_env; - Py_NoUserSiteDirectory = !py_use_system_env; - - /* Initialize Python (also acquires lock). */ - Py_Initialize(); - - /* We could convert to #wchar_t then pass to #PySys_SetArgv (or use #PyConfig in Python 3.8+). - * However this risks introducing subtle changes in encoding that are hard to track down. - * - * So rely on #PyC_UnicodeFromByte since it's a tried & true way of getting paths - * that include non `utf-8` compatible characters, see: T20021. */ - { - PyObject *py_argv = PyList_New(argc); - for (int i = 0; i < argc; i++) { - PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i])); - } - PySys_SetObject("argv", py_argv); - Py_DECREF(py_argv); - } - - /* Setting the program name is important so the 'multiprocessing' module - * can launch new Python instances. */ - { - const char *sys_variable = "executable"; - char program_path[FILE_MAX]; - if (BKE_appdir_program_python_search( - program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) { - PyObject *py_program_path = PyC_UnicodeFromByte(program_path); - PySys_SetObject(sys_variable, py_program_path); - Py_DECREF(py_program_path); - } - else { - fprintf(stderr, - "Unable to find the python binary, " - "the multiprocessing module may not be functional!\n"); - PySys_SetObject(sys_variable, Py_None); + if (!has_python_executable) { + PySys_SetObject("executable", Py_None); } } @@ -447,8 +497,9 @@ void BPY_python_start(bContext *C, int argc, const char **argv) /* py module runs atexit when bpy is freed */ BPY_atexit_register(); /* this can init any time */ - py_tstate = PyGILState_GetThisThreadState(); - PyEval_ReleaseThread(py_tstate); + /* Free the lock acquired (implicitly) when Python is initialized. */ + PyEval_ReleaseThread(PyGILState_GetThisThreadState()); + #endif #ifdef WITH_PYTHON_MODULE From 3fea77ceedcda59af05110cc085a1e8c6d97c004 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 08:15:09 +1100 Subject: [PATCH 102/519] CMake: update MSVC PDB path reference Replace literal number with a variable. --- source/creator/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index e674e665082..c7b940d0012 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -803,13 +803,13 @@ elseif(WIN32) if(WINDOWS_PYTHON_DEBUG) install( - FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb + FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.pdb DESTINATION "." CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) install( - FILES ${LIBDIR}/python/37/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb + FILES ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.pdb DESTINATION "." CONFIGURATIONS Debug ) From 6a12c5070304f02efb6d1bdd5b0b4010fd89deec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 14:55:35 +1100 Subject: [PATCH 103/519] Docs: add notes to 'make deps' & the sqlite build configuration - Move non-blender build targets into their own section. - Expand 'make help' text, noting a local 'make deps' overrides. - Note where the spell checkers word-list is maintained. - Note on why sqlite is built without 'tcl'. --- GNUmakefile | 22 +++++++++++++------ .../build_environment/cmake/sqlite.cmake | 17 ++++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 98463891407..41902809e30 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -26,26 +26,31 @@ define HELP_TEXT -Convenience Targets +Blender Convenience Targets Provided for building Blender, (multiple at once can be used). * debug: Build a debug binary. * full: Enable all supported dependencies & options. * lite: Disable non essential features for a smaller binary and faster build. - * release Complete build with all options enabled including CUDA and Optix, matching the releases on blender.org + * release: Complete build with all options enabled including CUDA and Optix, matching the releases on blender.org * headless: Build without an interface (renderfarm or server automation). * cycles: Build Cycles standalone only, without Blender. * bpy: Build as a python module which can be loaded from python directly. - * deps: Build library dependencies (intended only for platform maintainers). - * developer: Enable faster builds, error checking and tests, recommended for developers. - * config: Run cmake configuration tool to set build options. * ninja: Use ninja build tool for faster builds. * ccache: Use ccache for faster rebuilds. Note: passing the argument 'BUILD_DIR=path' when calling make will override the default build dir. Note: passing the argument 'BUILD_CMAKE_ARGS=args' lets you add cmake arguments. +Other Convenience Targets + Provided for other building operations. + + * config: Run cmake configuration tool to set build options. + * deps: Build library dependencies (intended only for platform maintainers). + + The existance of locally build dependancies overrides the pre-built dependencies from subversion. + These must be manually removed from '../lib/' to go back to using the pre-compiled libraries. Project Files Generate project files for development environments. @@ -85,12 +90,15 @@ Static Source Code Checking * check_descriptions: Check for duplicate/invalid descriptions. Spell Checkers + This runs the spell checker from the developer tools repositor. * check_spelling_c: Check for spelling errors (C/C++ only), * check_spelling_osl: Check for spelling errors (OSL only). * check_spelling_py: Check for spelling errors (Python only). - Note that spell checkers can take a 'CHECK_SPELLING_CACHE' filepath argument, + Note: an additional word-list is maintained at: 'source/tools/check_source/check_spelling_c_config.py' + + Note: that spell checkers can take a 'CHECK_SPELLING_CACHE' filepath argument, so re-running does not need to re-check unchanged files. Example: @@ -123,7 +131,7 @@ Utilities * update: updates git and all submodules - * format + * format: Format source code using clang (uses PATHS if passed in). For example:: make format PATHS="source/blender/blenlib source/blender/blenkernel" diff --git a/build_files/build_environment/cmake/sqlite.cmake b/build_files/build_environment/cmake/sqlite.cmake index 002be924a50..a77d3830b45 100644 --- a/build_files/build_environment/cmake/sqlite.cmake +++ b/build_files/build_environment/cmake/sqlite.cmake @@ -42,8 +42,21 @@ if(UNIX) -DSQLITE_MAX_VARIABLE_NUMBER=250000 \ -fPIC") set(SQLITE_CONFIGURE_ENV ${SQLITE_CONFIGURE_ENV} && export LDFLAGS=${SQLITE_LDFLAGS} && export CFLAGS=${SQLITE_CFLAGS}) - set(SQLITE_CONFIGURATION_ARGS ${SQLITE_CONFIGURATION_ARGS} --enable-threadsafe --enable-load-extension --enable-json1 --enable-fts4 --enable-fts5 --disable-tcl - --enable-shared=no) + set(SQLITE_CONFIGURATION_ARGS + ${SQLITE_CONFIGURATION_ARGS} + --enable-threadsafe + --enable-load-extension + --enable-json1 + --enable-fts4 + --enable-fts5 + # While building `tcl` is harmless, it causes problems when the install step + # tries to copy the files into the system path. + # Since this isn't required by Python or Blender this can be disabled. + # Note that Debian (for example), splits this off into a separate package, + # so it's safe to turn off. + --disable-tcl + --enable-shared=no + ) endif() ExternalProject_Add(external_sqlite From fae3057084215571978362d5b72d89e874c58b51 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 15:18:44 +1100 Subject: [PATCH 104/519] Cleanup: remove unused panel SEQUENCER_PT_sound These have since been moved to SEQUENCER_PT_source. --- .../scripts/startup/bl_ui/space_sequencer.py | 46 ------------------- 1 file changed, 46 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 79f88b1b67d..0aff07abf38 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -1409,52 +1409,6 @@ class SEQUENCER_PT_source(SequencerButtonsPanel, Panel): split.label(text="None") -class SEQUENCER_PT_sound(SequencerButtonsPanel, Panel): - bl_label = "Sound" - bl_parent_id = "" - bl_category = "Strip" - - @classmethod - def poll(cls, context): - if not cls.has_sequencer(context): - return False - - strip = act_strip(context) - if not strip: - return False - - return (strip.type == 'SOUND') - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - - strip = act_strip(context) - sound = strip.sound - - layout.active = not strip.mute - - layout.template_ID(strip, "sound", open="sound.open") - if sound is not None: - layout.prop(sound, "filepath", text="") - - layout.use_property_split = True - layout.use_property_decorate = False - - layout.alignment = 'RIGHT' - sub = layout.column(align=True) - split = sub.split(factor=0.5, align=True) - split.alignment = 'RIGHT' - if sound.packed_file: - split.label(text="Unpack") - split.operator("sound.unpack", icon='PACKAGE', text="") - else: - split.label(text="Pack") - split.operator("sound.pack", icon='UGLYPACKAGE', text="") - - layout.prop(sound, "use_memory_cache") - - class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel): bl_label = "Scene" bl_category = "Strip" From 9d3d2fa03152cddf49864e4b96f0f77dd98b4507 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 15:21:37 +1100 Subject: [PATCH 105/519] Cleanup: don't subclass 'Panel' for mix-in classes This reports warnings with `--debug-python` since all panel sub-classes are expected to be registered. --- intern/cycles/blender/addon/ui.py | 2 +- .../startup/bl_ui/properties_constraint.py | 150 +++++++++--------- .../startup/bl_ui/properties_view_layer.py | 4 +- 3 files changed, 78 insertions(+), 78 deletions(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index aa009c15b10..8067dd9793c 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -886,7 +886,7 @@ class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel): col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion") -class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, ViewLayerCryptomattePanel): +class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, ViewLayerCryptomattePanel, Panel): bl_label = "Cryptomatte" bl_context = "view_layer" bl_parent_id = "CYCLES_RENDER_PT_passes" diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py index 37a2b6a38e4..e8c62368239 100644 --- a/release/scripts/startup/bl_ui/properties_constraint.py +++ b/release/scripts/startup/bl_ui/properties_constraint.py @@ -20,7 +20,7 @@ from bpy.types import Panel -class ObjectConstraintPanel(Panel): +class ObjectConstraintPanel: bl_context = "constraint" @classmethod @@ -28,7 +28,7 @@ class ObjectConstraintPanel(Panel): return (context.object) -class BoneConstraintPanel(Panel): +class BoneConstraintPanel: bl_context = "bone_constraint" @classmethod @@ -36,7 +36,7 @@ class BoneConstraintPanel(Panel): return (context.pose_bone) -class OBJECT_PT_constraints(ObjectConstraintPanel): +class OBJECT_PT_constraints(ObjectConstraintPanel, Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "Object Constraints" @@ -50,7 +50,7 @@ class OBJECT_PT_constraints(ObjectConstraintPanel): layout.template_constraints(use_bone_constraints=False) -class BONE_PT_constraints(BoneConstraintPanel): +class BONE_PT_constraints(BoneConstraintPanel, Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "Bone Constraints" @@ -66,7 +66,7 @@ class BONE_PT_constraints(BoneConstraintPanel): # Parent class for constraint panels, with templates and drawing methods # shared between the bone and object constraint panels -class ConstraintButtonsPanel(Panel): +class ConstraintButtonsPanel: bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "" @@ -970,7 +970,7 @@ class ConstraintButtonsPanel(Panel): # Parent class for constraint subpanels -class ConstraintButtonsSubPanel(Panel): +class ConstraintButtonsSubPanel: bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_label = "" @@ -1148,149 +1148,149 @@ class ConstraintButtonsSubPanel(Panel): # Child Of Constraint -class OBJECT_PT_bChildOfConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bChildOfConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_childof(context) -class BONE_PT_bChildOfConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bChildOfConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_childof(context) # Track To Constraint -class OBJECT_PT_bTrackToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTrackToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trackto(context) -class BONE_PT_bTrackToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTrackToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trackto(context) # Follow Path Constraint -class OBJECT_PT_bFollowPathConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bFollowPathConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_path(context) -class BONE_PT_bFollowPathConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bFollowPathConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_path(context) # Rotation Limit Constraint -class OBJECT_PT_bRotLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bRotLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rot_limit(context) -class BONE_PT_bRotLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bRotLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rot_limit(context) # Location Limit Constraint -class OBJECT_PT_bLocLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLocLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_loc_limit(context) -class BONE_PT_bLocLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLocLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_loc_limit(context) # Size Limit Constraint -class OBJECT_PT_bSizeLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSizeLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_limit(context) -class BONE_PT_bSizeLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSizeLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_limit(context) # Rotate Like Constraint -class OBJECT_PT_bRotateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bRotateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rotate_like(context) -class BONE_PT_bRotateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bRotateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_rotate_like(context) # Locate Like Constraint -class OBJECT_PT_bLocateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLocateLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_locate_like(context) -class BONE_PT_bLocateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLocateLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_locate_like(context) # Size Like Constraint -class OBJECT_PT_bSizeLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSizeLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_like(context) -class BONE_PT_bSizeLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSizeLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_size_like(context) # Same Volume Constraint -class OBJECT_PT_bSameVolumeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bSameVolumeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_same_volume(context) -class BONE_PT_bSameVolumeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSameVolumeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_same_volume(context) # Trans Like Constraint -class OBJECT_PT_bTransLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransLikeConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trans_like(context) -class BONE_PT_bTransLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransLikeConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_trans_like(context) # Action Constraint -class OBJECT_PT_bActionConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bActionConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_action(context) -class BONE_PT_bActionConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bActionConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_action(context) -class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bActionConstraint" bl_label = "Target" @@ -1298,7 +1298,7 @@ class OBJECT_PT_bActionConstraint_target(ObjectConstraintPanel, ConstraintButton self.draw_action_target(context) -class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bActionConstraint" bl_label = "Target" @@ -1306,7 +1306,7 @@ class BONE_PT_bActionConstraint_target(BoneConstraintPanel, ConstraintButtonsSub self.draw_action_target(context) -class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bActionConstraint" bl_label = "Action" @@ -1314,7 +1314,7 @@ class OBJECT_PT_bActionConstraint_action(ObjectConstraintPanel, ConstraintButton self.draw_action_action(context) -class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bActionConstraint" bl_label = "Action" @@ -1324,77 +1324,77 @@ class BONE_PT_bActionConstraint_action(BoneConstraintPanel, ConstraintButtonsSub # Lock Track Constraint -class OBJECT_PT_bLockTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bLockTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_lock_track(context) -class BONE_PT_bLockTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bLockTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_lock_track(context) # Disance Limit Constraint -class OBJECT_PT_bDistLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bDistLimitConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_dist_limit(context) -class BONE_PT_bDistLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bDistLimitConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_dist_limit(context) # Stretch To Constraint -class OBJECT_PT_bStretchToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bStretchToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_stretch_to(context) -class BONE_PT_bStretchToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bStretchToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_stretch_to(context) # Min Max Constraint -class OBJECT_PT_bMinMaxConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bMinMaxConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_min_max(context) -class BONE_PT_bMinMaxConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bMinMaxConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_min_max(context) # Clamp To Constraint -class OBJECT_PT_bClampToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bClampToConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_clamp_to(context) -class BONE_PT_bClampToConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bClampToConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_clamp_to(context) # Transform Constraint -class OBJECT_PT_bTransformConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransformConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform(context) -class BONE_PT_bTransformConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransformConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform(context) -class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bTransformConstraint" bl_label = "Map From" @@ -1402,7 +1402,7 @@ class OBJECT_PT_bTransformConstraint_source(ObjectConstraintPanel, ConstraintBut self.draw_transform_from(context) -class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bTransformConstraint" bl_label = "Map From" @@ -1410,7 +1410,7 @@ class BONE_PT_bTransformConstraint_from(BoneConstraintPanel, ConstraintButtonsSu self.draw_transform_from(context) -class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bTransformConstraint" bl_label = "Map To" @@ -1418,7 +1418,7 @@ class OBJECT_PT_bTransformConstraint_destination(ObjectConstraintPanel, Constrai self.draw_transform_to(context) -class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bTransformConstraint" bl_label = "Map To" @@ -1428,36 +1428,36 @@ class BONE_PT_bTransformConstraint_to(BoneConstraintPanel, ConstraintButtonsSubP # Shrinkwrap Constraint -class OBJECT_PT_bShrinkwrapConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bShrinkwrapConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_shrinkwrap(context) -class BONE_PT_bShrinkwrapConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bShrinkwrapConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_shrinkwrap(context) # Damp Track Constraint -class OBJECT_PT_bDampTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bDampTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_damp_track(context) -class BONE_PT_bDampTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bDampTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_damp_track(context) # Spline IK Constraint -class BONE_PT_bSplineIKConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bSplineIKConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_spline_ik(context) -class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bSplineIKConstraint" bl_label = "Fitting" @@ -1465,7 +1465,7 @@ class BONE_PT_bSplineIKConstraint_fitting(BoneConstraintPanel, ConstraintButtons self.draw_spline_ik_fitting(context) -class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bSplineIKConstraint" bl_label = "Chain Scaling" @@ -1475,89 +1475,89 @@ class BONE_PT_bSplineIKConstraint_chain_scaling(BoneConstraintPanel, ConstraintB # Pivot Constraint -class OBJECT_PT_bPivotConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bPivotConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_pivot(context) -class BONE_PT_bPivotConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bPivotConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_pivot(context) # Follow Track Constraint -class OBJECT_PT_bFollowTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bFollowTrackConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_track(context) -class BONE_PT_bFollowTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bFollowTrackConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_follow_track(context) # Camera Solver Constraint -class OBJECT_PT_bCameraSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bCameraSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_camera_solver(context) -class BONE_PT_bCameraSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bCameraSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_camera_solver(context) # Object Solver Constraint -class OBJECT_PT_bObjectSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bObjectSolverConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_object_solver(context) -class BONE_PT_bObjectSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bObjectSolverConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_object_solver(context) # Transform Cache Constraint -class OBJECT_PT_bTransformCacheConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bTransformCacheConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform_cache(context) -class BONE_PT_bTransformCacheConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bTransformCacheConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_transform_cache(context) # Python Constraint -class OBJECT_PT_bPythonConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bPythonConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_python_constraint(context) -class BONE_PT_bPythonConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bPythonConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_python_constraint(context) # Armature Constraint -class OBJECT_PT_bArmatureConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bArmatureConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_armature(context) -class BONE_PT_bArmatureConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bArmatureConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_armature(context) -class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButtonsSubPanel): +class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "OBJECT_PT_bArmatureConstraint" bl_label = "Bones" @@ -1565,7 +1565,7 @@ class OBJECT_PT_bArmatureConstraint_bones(ObjectConstraintPanel, ConstraintButto self.draw_armature_bones(context) -class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSubPanel): +class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSubPanel, Panel): bl_parent_id = "BONE_PT_bArmatureConstraint" bl_label = "Bones" @@ -1575,12 +1575,12 @@ class BONE_PT_bArmatureConstraint_bones(BoneConstraintPanel, ConstraintButtonsSu # Inverse Kinematic Constraint -class OBJECT_PT_bKinematicConstraint(ObjectConstraintPanel, ConstraintButtonsPanel): +class OBJECT_PT_bKinematicConstraint(ObjectConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_kinematic(context) -class BONE_PT_bKinematicConstraint(BoneConstraintPanel, ConstraintButtonsPanel): +class BONE_PT_bKinematicConstraint(BoneConstraintPanel, ConstraintButtonsPanel, Panel): def draw(self, context): self.draw_kinematic(context) diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py index b5e6942f19d..b3367063cc0 100644 --- a/release/scripts/startup/bl_ui/properties_view_layer.py +++ b/release/scripts/startup/bl_ui/properties_view_layer.py @@ -170,7 +170,7 @@ class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): layout.label(text="Conflicts with another render pass with the same name", icon='ERROR') -class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): +class ViewLayerCryptomattePanel(ViewLayerButtonsPanel): bl_label = "Cryptomatte" def draw(self, context): @@ -193,7 +193,7 @@ class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): col.prop(view_layer, "use_pass_cryptomatte_accurate", text="Accurate Mode") -class VIEWLAYER_PT_layer_passes_cryptomatte(ViewLayerCryptomattePanel): +class VIEWLAYER_PT_layer_passes_cryptomatte(ViewLayerCryptomattePanel, Panel): bl_parent_id = "VIEWLAYER_PT_layer_passes" COMPAT_ENGINES = {'BLENDER_EEVEE'} From 5a1503953096927860b68f6315e354d2e39fb8bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 15:26:32 +1100 Subject: [PATCH 106/519] Cleanup: use the assignment operator with list-comprehension --- build_files/cmake/project_info.py | 14 ++++++-------- .../startup/bl_operators/uvcalc_lightmap.py | 3 +-- release/scripts/startup/bl_operators/wm.py | 3 +-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/build_files/cmake/project_info.py b/build_files/cmake/project_info.py index 5980d48f85d..dd81602630e 100755 --- a/build_files/cmake/project_info.py +++ b/build_files/cmake/project_info.py @@ -220,14 +220,12 @@ def cmake_advanced_info(): def cmake_cache_var(var): - cache_file = open(join(CMAKE_DIR, "CMakeCache.txt"), encoding='utf-8') - lines = [ - l_strip for l in cache_file - for l_strip in (l.strip(),) - if l_strip - if not l_strip.startswith(("//", "#")) - ] - cache_file.close() + with open(os.path.join(CMAKE_DIR, "CMakeCache.txt"), encoding='utf-8') as cache_file: + lines = [ + l_strip for l in cache_file + if (l_strip := l.strip()) + if not l_strip.startswith(("//", "#")) + ] for l in lines: if l.split(":")[0] == var: diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py index d13e98b96e9..34c36443431 100644 --- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py +++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py @@ -568,8 +568,7 @@ def unwrap(operator, context, **kwargs): meshes = list({ me for obj in context.selected_objects if obj.type == 'MESH' - for me in (obj.data,) - if me.polygons and me.library is None + if (me := obj.data).polygons and me.library is None }) if not meshes: diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 2ee20e08589..c5457713d36 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2191,8 +2191,7 @@ class WM_OT_batch_rename(Operator): id for ob in context.selected_objects if ob.type == data_type - for id in (ob.data,) - if id is not None and id.library is None + if (id := ob.data) is not None and id.library is None )) if only_selected else [id for id in getattr(bpy.data, attr) if id.library is None], From 631cc5d56ee9445ece0a9982ed58b1de1dcbbe5b Mon Sep 17 00:00:00 2001 From: Juanfran Matheu Date: Fri, 12 Feb 2021 16:45:29 +1100 Subject: [PATCH 107/519] WM: Add 'Confirm On Release' option for WM_OT_radial_control Adds a new property called "Confirm On Release" that does what it says, confirm the action without having to do left-click or to press any other extra-key which concludes in a more dynamic and efficient way of changing brush size or strength for example, especially for tablet users. Reviewed By: campbellbarton Ref D10233 --- source/blender/windowmanager/intern/wm_operators.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index e82f6cc9d76..297575e8dff 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2087,6 +2087,7 @@ typedef struct { bool use_secondary_tex; void *cursor; NumInput num_input; + int init_event; } RadialControl; static void radial_control_update_header(wmOperator *op, bContext *C) @@ -2705,6 +2706,8 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve radial_control_set_initial_mouse(rc, event); radial_control_set_tex(rc); + rc->init_event = WM_userdef_event_type_from_keymap_type(event->type); + /* temporarily disable other paint cursors */ wm = CTX_wm_manager(C); rc->orig_paintcursors = wm->paintcursors; @@ -2962,6 +2965,11 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even return OPERATOR_RUNNING_MODAL; } + if (!handled && (event->val == KM_RELEASE) && (rc->init_event == event->type) && + RNA_boolean_get(op->ptr, "release_confirm")) { + ret = OPERATOR_FINISHED; + } + ED_region_tag_redraw(CTX_wm_region(C)); radial_control_update_header(op, C); @@ -3070,6 +3078,10 @@ static void WM_OT_radial_control(wmOperatorType *ot) prop = RNA_def_boolean( ot->srna, "secondary_tex", false, "Secondary Texture", "Tweak brush secondary/mask texture"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); + + prop = RNA_def_boolean( + ot->srna, "release_confirm", false, "Confirm On Release", "Finish operation on key release"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); } /** \} */ From c10ad8e9eabea8a10d35efea3860cc345977e4f9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 12 Feb 2021 17:09:34 +1100 Subject: [PATCH 108/519] UI: expose the 3D views active object, even when hidden The previous behavior meant that changing an objects visibility effectively changed the current mode - which missed necessary updates for the tool-system (for example). There was already a check for edit-mode, now expected to all modes. This makes the test-case described in T83013 work as expected. --- .../editors/space_view3d/space_view3d.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 26441bde6b6..98e1d927daf 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -1591,7 +1591,8 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes if (view_layer->basact) { Object *ob = view_layer->basact->object; /* if hidden but in edit mode, we still display, can happen with animation */ - if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || (ob->mode & OB_MODE_EDIT)) { + if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || + (ob->mode != OB_MODE_OBJECT)) { CTX_data_pointer_set(result, &scene->id, &RNA_ObjectBase, view_layer->basact); } } @@ -1599,12 +1600,25 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "active_object")) { + /* In most cases the active object is the `view_layer->basact->object`. + * For the 3D view however it can be NULL when hidden. + * + * This is ignored in the case the object is in any mode (besides object-mode), + * since the object's mode impacts the current tool, cursor, gizmos etc. + * If we didn't have this exception, changing visibility would need to perform + * many of the the same updates as changing the objects mode. + * + * Further, there are multiple ways to hide objects - by collection, by object type, etc. + * it's simplest if all these methods behave consistently - respecting the object-mode + * without showing the object. + * + * See T85532 for alternatives that were considered. */ ViewLayer *view_layer = CTX_data_view_layer(C); if (view_layer->basact) { Object *ob = view_layer->basact->object; /* if hidden but in edit mode, we still display, can happen with animation */ if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 || - (ob->mode & OB_MODE_EDIT) != 0) { + (ob->mode != OB_MODE_OBJECT)) { CTX_data_id_pointer_set(result, &ob->id); } } From 33145dd187e30916f4ebae81ca0540b9c325b480 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 9 Feb 2021 15:24:29 +0100 Subject: [PATCH 109/519] Fix T79999: Double color management applied during viewport animation render In 2.81 there was a change to increase the performance of viewport animation rendering. This change would perform the color management on the GPU if the only 8bit was needed. This saved CPU cycles and data transfer. The issue is that in the image editor or when saving the image the CM will be reapplied. Although the speed is desired, exporting the actual colors has more priority. In the ticket there is an analysis that shows that shows that this fix is the correct short term step to take. It would be better that the render result is aware of the color space of its buffers so the applying color management could be skipped when saving to disk or drawing in the image editor. The issue with this change is the performance penalty it has. Reviewed By: Brecht van Lommel Maniphest Tasks: T79999 Differential Revision: https://developer.blender.org/D10371 --- source/blender/editors/render/render_opengl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 71e4dca3ab1..6744461b2f2 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -367,9 +367,6 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R char err_out[256] = "unknown"; ImBuf *ibuf_view; const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL; - eImBufFlags imbuf_flags = oglrender->color_depth <= R_IMF_CHAN_DEPTH_8 ? IB_rect : - IB_rectfloat; - if (view_context) { ibuf_view = ED_view3d_draw_offscreen_imbuf(depsgraph, scene, @@ -378,7 +375,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R region, sizex, sizey, - imbuf_flags, + IB_rectfloat, alpha_mode, viewname, true, @@ -398,7 +395,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R scene->camera, oglrender->sizex, oglrender->sizey, - imbuf_flags, + IB_rectfloat, V3D_OFSDRAW_SHOW_ANNOTATION, alpha_mode, viewname, From 837b5743ced83c5dfe724a8285eee504f623dbfb Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 9 Feb 2021 15:24:29 +0100 Subject: [PATCH 110/519] Fix T79999: Double color management applied during viewport animation render In 2.81 there was a change to increase the performance of viewport animation rendering. This change would perform the color management on the GPU if the only 8bit was needed. This saved CPU cycles and data transfer. The issue is that in the image editor or when saving the image the CM will be reapplied. Although the speed is desired, exporting the actual colors has more priority. In the ticket there is an analysis that shows that shows that this fix is the correct short term step to take. It would be better that the render result is aware of the color space of its buffers so the applying color management could be skipped when saving to disk or drawing in the image editor. The issue with this change is the performance penalty it has. Reviewed By: Brecht van Lommel Maniphest Tasks: T79999 Differential Revision: https://developer.blender.org/D10371 --- source/blender/editors/render/render_opengl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 4cb6994bc4b..546156e3406 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -367,9 +367,6 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R char err_out[256] = "unknown"; ImBuf *ibuf_view; const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL; - eImBufFlags imbuf_flags = oglrender->color_depth <= R_IMF_CHAN_DEPTH_8 ? IB_rect : - IB_rectfloat; - if (view_context) { ibuf_view = ED_view3d_draw_offscreen_imbuf(depsgraph, scene, @@ -378,7 +375,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R region, sizex, sizey, - imbuf_flags, + IB_rectfloat, alpha_mode, viewname, true, @@ -398,7 +395,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R scene->camera, oglrender->sizex, oglrender->sizey, - imbuf_flags, + IB_rectfloat, V3D_OFSDRAW_SHOW_ANNOTATION, alpha_mode, viewname, From 9a7dc41dd9b9803c30eb24bc74927a312b40ba4d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 12 Feb 2021 11:31:15 +0100 Subject: [PATCH 111/519] Fix T85545: changing position attribute does not tag normals dirty This makes it so that normals are tagged dirty whenever the position attribute is requested for writing. This seems like a good default. If the calling code is aware of normals, it could untag normals when they are not changed by the operation. Differential Revision: https://developer.blender.org/D10397 --- .../blenkernel/intern/attribute_access.cc | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 378fdfd27f2..17f8b5ba2b3 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -621,10 +621,12 @@ struct CustomDataAccessInfo { class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); + using UpdateOnWrite = void (*)(GeometryComponent &component); const CustomDataType stored_type_; const CustomDataAccessInfo custom_data_access_; const AsReadAttribute as_read_attribute_; const AsWriteAttribute as_write_attribute_; + const UpdateOnWrite update_on_write_; public: BuiltinCustomDataLayerProvider(std::string attribute_name, @@ -636,13 +638,15 @@ class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { const DeletableEnum deletable, const CustomDataAccessInfo custom_data_access, const AsReadAttribute as_read_attribute, - const AsWriteAttribute as_write_attribute) + const AsWriteAttribute as_write_attribute, + const UpdateOnWrite update_on_write) : BuiltinAttributeProvider( std::move(attribute_name), domain, attribute_type, creatable, writable, deletable), stored_type_(stored_type), custom_data_access_(custom_data_access), as_read_attribute_(as_read_attribute), - as_write_attribute_(as_write_attribute) + as_write_attribute_(as_write_attribute), + update_on_write_(update_on_write) { } @@ -679,6 +683,9 @@ class BuiltinCustomDataLayerProvider final : public BuiltinAttributeProvider { custom_data_access_.update_custom_data_pointers(component); data = new_data; } + if (update_on_write_ != nullptr) { + update_on_write_(component); + } return as_write_attribute_(data, domain_size); } @@ -1187,6 +1194,14 @@ static WriteAttributePtr make_vertex_position_write_attribute(void *data, const ATTR_DOMAIN_POINT, MutableSpan((MVert *)data, domain_size)); } +static void tag_normals_dirty_when_writing_position(GeometryComponent &component) +{ + Mesh *mesh = get_mesh_from_component_for_write(component); + if (mesh != nullptr) { + mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL; + } +} + template static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size) { @@ -1248,7 +1263,8 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() BuiltinAttributeProvider::NonDeletable, point_access, make_vertex_position_read_attribute, - make_vertex_position_write_attribute); + make_vertex_position_write_attribute, + tag_normals_dirty_when_writing_position); static MeshUVsAttributeProvider uvs; static VertexGroupsAttributeProvider vertex_groups; static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access); @@ -1302,7 +1318,8 @@ static ComponentAttributeProviders create_attribute_providers_for_point_cloud() BuiltinAttributeProvider::NonDeletable, point_access, make_array_read_attribute, - make_array_write_attribute); + make_array_write_attribute, + nullptr); static BuiltinCustomDataLayerProvider radius( "radius", ATTR_DOMAIN_POINT, @@ -1313,7 +1330,8 @@ static ComponentAttributeProviders create_attribute_providers_for_point_cloud() BuiltinAttributeProvider::Deletable, point_access, make_array_read_attribute, - make_array_write_attribute); + make_array_write_attribute, + nullptr); static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); return ComponentAttributeProviders({&position, &radius}, {&point_custom_data}); } From 26481eabe1e66da2a322190f15ad600d9d69bbee Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 12 Feb 2021 11:29:50 +0100 Subject: [PATCH 112/519] Cycles: Use Blender Settings For AOV This patch will share the AOV settings between Cycles and Eevee. It enable using the AOV name conflict detection of Blender. This means that unlike how Cycles used to work it isn't possible to add an AOV with a similar name. Conflicts with internal render pass names will be indicated with an Warning icon. Reviewed By: Brecht van Lommel Differential Revision: https://developer.blender.org/D9774 --- intern/cycles/blender/addon/engine.py | 21 +-------- intern/cycles/blender/addon/operators.py | 32 -------------- intern/cycles/blender/addon/properties.py | 38 ---------------- intern/cycles/blender/addon/ui.py | 43 +------------------ intern/cycles/blender/addon/version_update.py | 14 +++++- intern/cycles/blender/blender_sync.cpp | 13 ++++-- .../startup/bl_ui/properties_view_layer.py | 9 ++-- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_290.c | 26 +++++------ source/blender/makesrna/intern/rna_internal.h | 2 +- source/blender/makesrna/intern/rna_layer.c | 2 +- source/blender/makesrna/intern/rna_render.c | 2 +- source/blender/makesrna/intern/rna_scene.c | 21 ++++++++- 13 files changed, 70 insertions(+), 155 deletions(-) diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 179eea6461c..7595261f523 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -301,7 +301,7 @@ def list_render_passes(scene, srl): yield ("Denoising Clean", "RGB", 'COLOR') # Custom AOV passes. - for aov in crl.aovs: + for aov in srl.aovs: if aov.type == 'VALUE': yield (aov.name, "X", 'VALUE') else: @@ -309,22 +309,5 @@ def list_render_passes(scene, srl): def register_passes(engine, scene, view_layer): - # Detect duplicate render pass names, first one wins. - listed = set() for name, channelids, channeltype in list_render_passes(scene, view_layer): - if name not in listed: - engine.register_pass(scene, view_layer, name, len(channelids), channelids, channeltype) - listed.add(name) - - -def detect_conflicting_passes(scene, view_layer): - # Detect conflicting render pass names for UI. - counter = {} - for name, _, _ in list_render_passes(scene, view_layer): - counter[name] = counter.get(name, 0) + 1 - - for aov in view_layer.cycles.aovs: - if counter[aov.name] > 1: - aov.conflict = "Conflicts with another render pass with the same name" - else: - aov.conflict = "" + engine.register_pass(scene, view_layer, name, len(channelids), channelids, channeltype) diff --git a/intern/cycles/blender/addon/operators.py b/intern/cycles/blender/addon/operators.py index 2045f6ab780..087e5b666a5 100644 --- a/intern/cycles/blender/addon/operators.py +++ b/intern/cycles/blender/addon/operators.py @@ -44,36 +44,6 @@ class CYCLES_OT_use_shading_nodes(Operator): return {'FINISHED'} -class CYCLES_OT_add_aov(bpy.types.Operator): - """Add an AOV pass""" - bl_idname = "cycles.add_aov" - bl_label = "Add AOV" - - def execute(self, context): - view_layer = context.view_layer - cycles_view_layer = view_layer.cycles - - cycles_view_layer.aovs.add() - - view_layer.update_render_passes() - return {'FINISHED'} - - -class CYCLES_OT_remove_aov(bpy.types.Operator): - """Remove an AOV pass""" - bl_idname = "cycles.remove_aov" - bl_label = "Remove AOV" - - def execute(self, context): - view_layer = context.view_layer - cycles_view_layer = view_layer.cycles - - cycles_view_layer.aovs.remove(cycles_view_layer.active_aov) - - view_layer.update_render_passes() - return {'FINISHED'} - - class CYCLES_OT_denoise_animation(Operator): "Denoise rendered animation sequence using current scene and view " \ "layer settings. Requires denoising data passes and output to " \ @@ -197,8 +167,6 @@ class CYCLES_OT_merge_images(Operator): classes = ( CYCLES_OT_use_shading_nodes, - CYCLES_OT_add_aov, - CYCLES_OT_remove_aov, CYCLES_OT_denoise_animation, CYCLES_OT_merge_images ) diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 2f204b2c658..dd218d93d32 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -178,11 +178,6 @@ enum_view3d_shading_render_pass = ( ('MIST', "Mist", "Show the Mist render pass", 32), ) -enum_aov_types = ( - ('VALUE', "Value", "Write a Value pass", 0), - ('COLOR', "Color", "Write a Color pass", 1), -) - def enum_openimagedenoise_denoiser(self, context): import _cycles @@ -229,7 +224,6 @@ def update_render_passes(self, context): scene = context.scene view_layer = context.view_layer view_layer.update_render_passes() - engine.detect_conflicting_passes(scene, view_layer) class CyclesRenderSettings(bpy.types.PropertyGroup): @@ -1311,27 +1305,6 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup): del bpy.types.Scene.cycles_curves -class CyclesAOVPass(bpy.types.PropertyGroup): - name: StringProperty( - name="Name", - description="Name of the pass, to use in the AOV Output shader node", - update=update_render_passes, - default="AOV" - ) - type: EnumProperty( - name="Type", - description="Pass data type", - update=update_render_passes, - items=enum_aov_types, - default='COLOR' - ) - conflict: StringProperty( - name="Conflict", - description="If there is a conflict with another render passes, message explaining why", - default="" - ) - - class CyclesRenderLayerSettings(bpy.types.PropertyGroup): pass_debug_bvh_traversed_nodes: BoolProperty( @@ -1470,15 +1443,6 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup): default='RGB_ALBEDO_NORMAL', ) - aovs: CollectionProperty( - type=CyclesAOVPass, - description="Custom render passes that can be output by shader nodes", - ) - active_aov: IntProperty( - default=0, - min=0 - ) - @classmethod def register(cls): bpy.types.ViewLayer.cycles = PointerProperty( @@ -1665,7 +1629,6 @@ def register(): bpy.utils.register_class(CyclesCurveRenderSettings) bpy.utils.register_class(CyclesDeviceSettings) bpy.utils.register_class(CyclesPreferences) - bpy.utils.register_class(CyclesAOVPass) bpy.utils.register_class(CyclesRenderLayerSettings) bpy.utils.register_class(CyclesView3DShadingSettings) @@ -1687,6 +1650,5 @@ def unregister(): bpy.utils.unregister_class(CyclesCurveRenderSettings) bpy.utils.unregister_class(CyclesDeviceSettings) bpy.utils.unregister_class(CyclesPreferences) - bpy.utils.unregister_class(CyclesAOVPass) bpy.utils.unregister_class(CyclesRenderLayerSettings) bpy.utils.unregister_class(CyclesView3DShadingSettings) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index aa009c15b10..53676832243 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -23,7 +23,7 @@ from bl_ui.utils import PresetPanel from bpy.types import Panel from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel -from bl_ui.properties_view_layer import ViewLayerCryptomattePanel +from bl_ui.properties_view_layer import ViewLayerCryptomattePanel, ViewLayerAOVPanel class CYCLES_PT_sampling_presets(PresetPanel, Panel): @@ -915,49 +915,11 @@ class CYCLES_RENDER_PT_passes_debug(CyclesButtonsPanel, Panel): layout.prop(cycles_view_layer, "pass_debug_ray_bounces") -class CYCLES_RENDER_UL_aov(bpy.types.UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): - row = layout.row() - split = row.split(factor=0.65) - icon = 'ERROR' if item.conflict else 'NONE' - split.row().prop(item, "name", text="", icon=icon, emboss=False) - split.row().prop(item, "type", text="", emboss=False) - - -class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, Panel): +class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, ViewLayerAOVPanel): bl_label = "Shader AOV" bl_context = "view_layer" bl_parent_id = "CYCLES_RENDER_PT_passes" - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - cycles_view_layer = context.view_layer.cycles - - row = layout.row() - col = row.column() - col.template_list( - "CYCLES_RENDER_UL_aov", - "aovs", - cycles_view_layer, - "aovs", - cycles_view_layer, - "active_aov", - rows=2, - ) - - col = row.column() - sub = col.column(align=True) - sub.operator("cycles.add_aov", icon='ADD', text="") - sub.operator("cycles.remove_aov", icon='REMOVE', text="") - - if cycles_view_layer.active_aov < len(cycles_view_layer.aovs): - active_aov = cycles_view_layer.aovs[cycles_view_layer.active_aov] - if active_aov.conflict: - layout.label(text=active_aov.conflict, icon='ERROR') - class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel): bl_label = "Denoising" @@ -2300,7 +2262,6 @@ classes = ( CYCLES_RENDER_PT_passes_light, CYCLES_RENDER_PT_passes_crypto, CYCLES_RENDER_PT_passes_debug, - CYCLES_RENDER_UL_aov, CYCLES_RENDER_PT_passes_aov, CYCLES_RENDER_PT_filter, CYCLES_RENDER_PT_override, diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py index 5dae88d60c7..2c5df9a9af3 100644 --- a/intern/cycles/blender/addon/version_update.py +++ b/intern/cycles/blender/addon/version_update.py @@ -108,7 +108,7 @@ def do_versions(self): library_versions.setdefault(library.version, []).append(library) # Do versioning per library, since they might have different versions. - max_need_versioning = (2, 92, 4) + max_need_versioning = (2, 92, 14) for version, libraries in library_versions.items(): if version > max_need_versioning: continue @@ -204,6 +204,18 @@ def do_versions(self): view_layer.pass_cryptomatte_depth = cview_layer.get("pass_crypto_depth", 6) view_layer.use_pass_cryptomatte_accurate = cview_layer.get("pass_crypto_accurate", True) + if version <= (2, 92, 14): + if scene.render.engine == 'CYCLES': + for view_layer in scene.view_layers: + cview_layer = view_layer.cycles + for caov in cview_layer.get("aovs", []): + aov_name = caov.get("name", "AOV") + if aov_name in view_layer.aovs: + continue + baov = view_layer.aovs.add() + baov.name = caov.get("name", "AOV") + baov.type = "COLOR" if caov.get("type", 1) == 1 else "VALUE" + # Lamps for light in bpy.data.lights: if light.library not in libraries: diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index e27daa2488d..f5890c7e6cb 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -706,9 +706,15 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, } } - RNA_BEGIN (&crl, b_aov, "aovs") { - bool is_color = (get_enum(b_aov, "type") == 1); - string name = get_string(b_aov, "name"); + BL::ViewLayer::aovs_iterator b_aov_iter; + for (b_view_layer.aovs.begin(b_aov_iter); b_aov_iter != b_view_layer.aovs.end(); ++b_aov_iter) { + BL::AOV b_aov(*b_aov_iter); + if (!b_aov.is_valid()) { + continue; + } + + string name = b_aov.name(); + bool is_color = b_aov.type() == BL::AOV::type_COLOR; if (is_color) { b_engine.add_pass(name.c_str(), 4, "RGBA", b_view_layer.name().c_str()); @@ -719,7 +725,6 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, Pass::add(PASS_AOV_VALUE, passes, name.c_str()); } } - RNA_END; scene->film->set_denoising_data_pass(denoising.use || denoising.store_passes); scene->film->set_denoising_clean_pass(scene->film->get_denoising_flags() & diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py index b5e6942f19d..6780e066791 100644 --- a/release/scripts/startup/bl_ui/properties_view_layer.py +++ b/release/scripts/startup/bl_ui/properties_view_layer.py @@ -143,10 +143,8 @@ class VIEWLAYER_PT_eevee_layer_passes_effects(ViewLayerButtonsPanel, Panel): col.active = scene_eevee.use_bloom -class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): +class ViewLayerAOVPanel(ViewLayerButtonsPanel, Panel): bl_label = "Shader AOV" - bl_parent_id = "VIEWLAYER_PT_layer_passes" - COMPAT_ENGINES = {'BLENDER_EEVEE'} def draw(self, context): layout = self.layout @@ -170,6 +168,11 @@ class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel): layout.label(text="Conflicts with another render pass with the same name", icon='ERROR') +class VIEWLAYER_PT_layer_passes_aov(ViewLayerAOVPanel): + bl_parent_id = "VIEWLAYER_PT_layer_passes" + COMPAT_ENGINES = {'BLENDER_EEVEE'} + + class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): bl_label = "Cryptomatte" diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 4ee96d1ab8d..83bec62c41e 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 14 +#define BLENDER_FILE_SUBVERSION 15 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 60256359ea0..840726e4add 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1590,18 +1590,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) FOREACH_NODETREE_END; } - /** - * Versioning code until next subversion bump goes here. - * - * \note Be sure to check when bumping the version: - * - "versioning_userdef.c", #blo_do_versions_userdef - * - "versioning_userdef.c", #do_versions_theme - * - * \note Keep this message at the bottom of the function. - */ - { - /* Keep this block, even when empty. */ - + if (!MAIN_VERSION_ATLEAST(bmain, 292, 15)) { /* UV/Image Max resolution images in image editor. */ LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { @@ -1614,4 +1603,17 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } } + + /** + * Versioning code until next subversion bump goes here. + * + * \note Be sure to check when bumping the version: + * - "versioning_userdef.c", #blo_do_versions_userdef + * - "versioning_userdef.c", #do_versions_theme + * + * \note Keep this message at the bottom of the function. + */ + { + /* Keep this block, even when empty. */ + } } diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 76c3e17e128..bfcb0039ca8 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -264,7 +264,7 @@ void rna_def_mtex_common(struct BlenderRNA *brna, const char *update, const char *update_index); void rna_def_texpaint_slots(struct BlenderRNA *brna, struct StructRNA *srna); -void rna_def_view_layer_common(struct StructRNA *srna, const bool scene); +void rna_def_view_layer_common(struct BlenderRNA *brna, struct StructRNA *srna, const bool scene); void rna_def_actionbone_group_common(struct StructRNA *srna, int update_flag, diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index afe69c37eef..7fce9b1f908 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -534,7 +534,7 @@ void RNA_def_view_layer(BlenderRNA *brna) RNA_def_struct_path_func(srna, "rna_ViewLayer_path"); RNA_def_struct_idprops_func(srna, "rna_ViewLayer_idprops"); - rna_def_view_layer_common(srna, true); + rna_def_view_layer_common(brna, srna, true); func = RNA_def_function(srna, "update_render_passes", "rna_ViewLayer_update_render_passes"); RNA_def_function_ui_description(func, diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3126f3e11f4..5b1da32dff3 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -1050,7 +1050,7 @@ static void rna_def_render_layer(BlenderRNA *brna) RNA_define_verify_sdna(0); - rna_def_view_layer_common(srna, false); + rna_def_view_layer_common(brna, srna, false); prop = RNA_def_property(srna, "passes", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "RenderPass"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index af31f16f4e0..93d25c383bb 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -4062,6 +4062,24 @@ static void rna_def_view_layer_eevee(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update"); } +static void rna_def_view_layer_aovs(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + /* PropertyRNA *prop; */ + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "AOVs"); + srna = RNA_def_struct(brna, "AOVs", NULL); + RNA_def_struct_sdna(srna, "ViewLayer"); + RNA_def_struct_ui_text(srna, "List of AOVs", "Collection of AOVs"); + + func = RNA_def_function(srna, "add", "BKE_view_layer_add_aov"); + parm = RNA_def_pointer(func, "aov", "AOV", "", "Newly created AOV"); + RNA_def_function_return(func, parm); +} + static void rna_def_view_layer_aov(BlenderRNA *brna) { StructRNA *srna; @@ -4089,7 +4107,7 @@ static void rna_def_view_layer_aov(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update"); } -void rna_def_view_layer_common(StructRNA *srna, const bool scene) +void rna_def_view_layer_common(BlenderRNA *brna, StructRNA *srna, const bool scene) { PropertyRNA *prop; @@ -4144,6 +4162,7 @@ void rna_def_view_layer_common(StructRNA *srna, const bool scene) RNA_def_property_collection_sdna(prop, NULL, "aovs", NULL); RNA_def_property_struct_type(prop, "AOV"); RNA_def_property_ui_text(prop, "Shader AOV", ""); + rna_def_view_layer_aovs(brna, prop); prop = RNA_def_property(srna, "active_aov", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "AOV"); From 9fa6e06287dc49f1fcf2bbfa150c0ff368668fed Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 12 Feb 2021 12:33:04 +0100 Subject: [PATCH 113/519] Geometry Nodes: remove incorrect assert It is perfectly valid that an attribute does not exist and cannot be created. For example, this can happen when a mesh does not contain any vertices. --- .../nodes/geometry/nodes/node_geo_point_separate.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc index 066b2952111..5f9d208a440 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc @@ -84,19 +84,15 @@ static void move_split_attributes(const GeometryComponent &in_component, const CustomDataType data_type = bke::cpp_type_to_custom_data_type(attribute->cpp_type()); const AttributeDomain domain = attribute->domain(); - /* Don't try to create the attribute on the new component if it already exists. Built-in - * attributes will already exist on new components by definition. It should always be possible - * to recreate the attribute on the same component type. Also, if one of the new components - * has the attribute the other one should have it too, but check independently to be safe. */ + /* Don't try to create the attribute on the new component if it already exists (i.e. has been + * initialized by someone else). */ if (!out_component_a.attribute_exists(name)) { if (!out_component_a.attribute_try_create(name, domain, data_type)) { - BLI_assert(false); continue; } } if (!out_component_b.attribute_exists(name)) { if (!out_component_b.attribute_try_create(name, domain, data_type)) { - BLI_assert(false); continue; } } From 780cabb7a8ff8da0313217e7f6c039423fbf4bf7 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Fri, 12 Feb 2021 13:39:19 +0100 Subject: [PATCH 114/519] Fix T85558: crash changing the resolution mode of the "volume to mesh" node The nodes update function geo_node_volume_to_mesh_update would not run if it is not the very first node in the tree. If the update function is not run, there are sockets not cleared from the SOCK_UNAVAIL flag (but this needs to be done -- these get available depending on the chosen mode). Havent tracked down why this was actually updating when it was the first node in the tree, but now make sure we always get an update by specifing an appropriate RNA update callback for the property. Maniphest Tasks: T85558 Differential Revision: https://developer.blender.org/D10403 --- source/blender/makesrna/intern/rna_nodetree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 610edb0e37c..3a9d373e30e 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -9029,6 +9029,7 @@ static void def_geo_volume_to_mesh(StructRNA *srna) prop = RNA_def_property(srna, "resolution_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, resolution_mode_items); RNA_def_property_ui_text(prop, "Resolution Mode", "How the voxel size is specified"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } static void def_geo_attribute_combine_xyz(StructRNA *srna) From 7db00556fa9a14f8617c2ec1e35ae834689f0da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 12 Feb 2021 14:54:08 +0100 Subject: [PATCH 115/519] CMake/Deps: fix build of nasm when asciidoc and xmlto are unavailable Create zero-byte manual page files `nasm.1` and `ndisasm.1` such that nasm's `make install` step succeeds. Installing nasm requires that its manual pages are built. This requires local packages `asciidoc` and `xmlto` to be installed. Not only does `asciidoc` pull in 110 MB of packages (itself + dependencies), there is also no need for these manual pages. Nasm is just used for building other dependencies, and not even part of our precompiled libraries in SVN. Reviewed By: sebbas Differential Revision: https://developer.blender.org/D10396 --- build_files/build_environment/cmake/nasm.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build_files/build_environment/cmake/nasm.cmake b/build_files/build_environment/cmake/nasm.cmake index 51d7ebd8830..6eadfc5e4f0 100644 --- a/build_files/build_environment/cmake/nasm.cmake +++ b/build_files/build_environment/cmake/nasm.cmake @@ -27,3 +27,12 @@ ExternalProject_Add(external_nasm INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make install INSTALL_DIR ${LIBDIR}/nasm ) + +if(UNIX) + # `touch nasm.1 ndisasm.1` helps to create the manual pages files, even when + # local `asciidoc` and `xmlto` packages are not installed. + ExternalProject_Add_Step(external_nasm after_configure + COMMAND ${CMAKE_COMMAND} -E touch ${BUILD_DIR}/nasm/src/external_nasm/nasm.1 ${BUILD_DIR}/nasm/src/external_nasm/ndisasm.1 + DEPENDEES configure + ) +endif() From 9febda912b04559277d465b9610334c04a73d2ce Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 11 Feb 2021 18:48:21 +0100 Subject: [PATCH 116/519] Baking: support vertex color baking of normal material, UV discontinuities Baking vertex colors per-corner leads to unwanted discontinuities when there is sampling noise, for example in ambient occlusion or with a bevel shader node for normals. For this reason the code used to always average results per-vertex. However when using split normals, multiple materials or UV islands, we do want to preserve discontinuities. So now bake per corner, but make sure the sampling seed is shared for vertices. Fix T85550: vertex color baking crash with split normals, Ref D10399 Fix T84663: vertex color baking blending at UV seams --- intern/cycles/kernel/kernel_bake.h | 3 +- .../blender/editors/object/object_bake_api.c | 90 ++++++++++++------- source/blender/render/RE_bake.h | 1 + source/blender/render/intern/bake.c | 3 + source/blender/render/intern/engine.c | 2 +- 5 files changed, 66 insertions(+), 33 deletions(-) diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index e876e5d8ca6..359099d78c6 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -233,6 +233,7 @@ ccl_device void kernel_bake_evaluate( ccl_global float *differential = buffer + kernel_data.film.pass_bake_differential; ccl_global float *output = buffer + kernel_data.film.pass_combined; + int seed = __float_as_uint(primitive[0]); int prim = __float_as_uint(primitive[1]); if (prim == -1) return; @@ -240,7 +241,7 @@ ccl_device void kernel_bake_evaluate( prim += kernel_data.bake.tri_offset; /* Random number generator. */ - uint rng_hash = hash_uint2(x, y) ^ kernel_data.integrator.seed; + uint rng_hash = hash_uint(seed) ^ kernel_data.integrator.seed; int num_samples = kernel_data.integrator.aa_samples; float filter_x, filter_y; diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index db9e51a490d..7179cc26fc1 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -44,6 +44,7 @@ #include "BKE_main.h" #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_mesh_mapping.h" #include "BKE_modifier.h" #include "BKE_node.h" #include "BKE_object.h" @@ -946,7 +947,7 @@ static bool bake_targets_init_vertex_colors(BakeTargets *targets, Object *ob, Re targets->num_materials = ob->totcol; BakeImage *bk_image = &targets->images[0]; - bk_image->width = me->totvert; + bk_image->width = me->totloop; bk_image->height = 1; bk_image->offset = 0; bk_image->image = NULL; @@ -968,6 +969,7 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, pixel->primitive_id = -1; pixel->object_id = 0; + pixel->seed = 0; pixel->du_dx = 0.0f; pixel->du_dy = 0.0f; pixel->dv_dx = 0.0f; @@ -986,8 +988,8 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, const MLoopTri *lt = &looptri[i]; for (int j = 0; j < 3; j++) { - const unsigned int v = me->mloop[lt->tri[j]].v; - BakePixel *pixel = &pixel_array[v]; + const unsigned int l = lt->tri[j]; + BakePixel *pixel = &pixel_array[l]; if (pixel->primitive_id != -1) { continue; @@ -995,6 +997,11 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, pixel->primitive_id = i; + /* Seed is the vertex, so that sampling noise is coherent for the same + * vertex, but different corners can still have different normals, + * materials and UVs. */ + pixel->seed = me->mloop[l].v; + /* Barycentric coordinates, nudged a bit to avoid precision issues that * may happen when exactly at the vertex coordinate. */ if (j == 0) { @@ -1015,24 +1022,24 @@ static void bake_targets_populate_pixels_vertex_colors(BakeTargets *targets, MEM_freeN(looptri); } -static void bake_result_to_rgba(float rgba[4], const float *result, const int num_channels) +static void bake_result_add_to_rgba(float rgba[4], const float *result, const int num_channels) { if (num_channels == 4) { - copy_v4_v4(rgba, result); + add_v4_v4(rgba, result); } else if (num_channels == 3) { - copy_v3_v3(rgba, result); - rgba[3] = 1.0f; + add_v3_v3(rgba, result); + rgba[3] += 1.0f; } else { - rgba[0] = result[0]; - rgba[1] = result[0]; - rgba[2] = result[0]; - rgba[3] = 1.0f; + rgba[0] += result[0]; + rgba[1] += result[0]; + rgba[2] += result[0]; + rgba[3] += 1.0f; } } -static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob) +static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob, Mesh *me_split) { Mesh *me = ob->data; MPropCol *mcol = CustomData_get_layer(&me->vdata, CD_PROP_COLOR); @@ -1040,26 +1047,45 @@ static bool bake_targets_output_vertex_colors(BakeTargets *targets, Object *ob) const int num_channels = targets->num_channels; const float *result = targets->result; + /* We bake using a mesh with additional vertices for split normals, but the + * number of loops must match to be able to transfer the vertex colors. */ + BLI_assert(me->totloop == me_split->totloop); + UNUSED_VARS_NDEBUG(me_split); + if (mcol) { - /* Float vertex colors in scene linear color space. */ const int totvert = me->totvert; - for (int i = 0; i < totvert; i++, mcol++) { - bake_result_to_rgba(mcol->color, &result[i * num_channels], num_channels); + const int totloop = me->totloop; + + /* Accumulate float vertex colors in scene linear color space. */ + int *num_loops_for_vertex = MEM_callocN(sizeof(int) * me->totvert, "num_loops_for_vertex"); + memset(mcol, 0, sizeof(MPropCol) * me->totvert); + + MLoop *mloop = me->mloop; + for (int i = 0; i < totloop; i++, mloop++) { + const int v = mloop->v; + bake_result_add_to_rgba(mcol[v].color, &result[i * num_channels], num_channels); + num_loops_for_vertex[v]++; } + + /* Normalize for number of loops. */ + for (int i = 0; i < totvert; i++) { + if (num_loops_for_vertex[i] > 0) { + mul_v4_fl(mcol[i].color, 1.0f / num_loops_for_vertex[i]); + } + } + + MEM_SAFE_FREE(num_loops_for_vertex); } else { - /* Byte loop colors in sRGB colors space. - * - * Note that colors have been baked per vertex and not per corner, which - * could be useful to preserve material discontinuities. However this also - * leads to unintended discontinuities due to sampling noise. */ + /* Byte loop colors in sRGB colors space. */ MLoop *mloop = me->mloop; const int totloop = me->totloop; const bool is_noncolor = targets->is_noncolor; for (int i = 0; i < totloop; i++, mloop++, mloopcol++) { float rgba[4]; - bake_result_to_rgba(rgba, &result[mloop->v * num_channels], num_channels); + zero_v4(rgba); + bake_result_add_to_rgba(rgba, &result[i * num_channels], num_channels); if (is_noncolor) { unit_float_to_uchar_clamp_v4(&mloopcol->r, rgba); @@ -1142,7 +1168,7 @@ static bool bake_targets_output(const BakeAPIRender *bkr, } } else if (bkr->target == R_BAKE_TARGET_VERTEX_COLORS) { - return bake_targets_output_vertex_colors(targets, ob); + return bake_targets_output_vertex_colors(targets, ob, me); } return false; @@ -1212,10 +1238,6 @@ static int bake(const BakeAPIRender *bkr, } } - if (!bake_targets_init(bkr, &targets, ob_low, reports)) { - goto cleanup; - } - if (bkr->is_selected_to_active) { CollectionPointerLink *link; tot_highpoly = 0; @@ -1245,9 +1267,6 @@ static int bake(const BakeAPIRender *bkr, } } - pixel_array_low = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels low poly"); - pixel_array_high = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels high poly"); - /* for multires bake, use linear UV subdivision to match low res UVs */ if (bkr->pass_type == SCE_PASS_NORMAL && bkr->normal_space == R_BAKE_SPACE_TANGENT && !bkr->is_selected_to_active) { @@ -1265,11 +1284,17 @@ static int bake(const BakeAPIRender *bkr, /* get the mesh as it arrives in the renderer */ me_low = bake_mesh_new_from_object(ob_low_eval); - /* populate the pixel array with the face data */ + /* Initialize bake targets. */ + if (!bake_targets_init(bkr, &targets, ob_low_eval, reports)) { + goto cleanup; + } + + /* Populate the pixel array with the face data. Except if we use a cage, then + * it is populated later with the cage mesh (smoothed version of the mesh). */ + pixel_array_low = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, "bake pixels low poly"); if ((bkr->is_selected_to_active && (ob_cage == NULL) && bkr->is_cage) == false) { bake_targets_populate_pixels(bkr, &targets, me_low, pixel_array_low); } - /* else populate the pixel array with the 'cage' mesh (the smooth version of the mesh) */ if (bkr->is_selected_to_active) { CollectionPointerLink *link; @@ -1358,6 +1383,9 @@ static int bake(const BakeAPIRender *bkr, ob_low_eval->base_flag &= ~(BASE_VISIBLE_DEPSGRAPH | BASE_ENABLED_RENDER); /* populate the pixel arrays with the corresponding face data for each high poly object */ + pixel_array_high = MEM_mallocN(sizeof(BakePixel) * targets.num_pixels, + "bake pixels high poly"); + if (!RE_bake_pixels_populate_from_objects(me_low, pixel_array_low, pixel_array_high, diff --git a/source/blender/render/RE_bake.h b/source/blender/render/RE_bake.h index 3463362adb1..bb30b524b61 100644 --- a/source/blender/render/RE_bake.h +++ b/source/blender/render/RE_bake.h @@ -59,6 +59,7 @@ typedef struct BakeTargets { typedef struct BakePixel { int primitive_id, object_id; + int seed; float uv[2]; float du_dx, du_dy; float dv_dx, dv_dy; diff --git a/source/blender/render/intern/bake.c b/source/blender/render/intern/bake.c index caf81870fac..7af6d3e234f 100644 --- a/source/blender/render/intern/bake.c +++ b/source/blender/render/intern/bake.c @@ -135,6 +135,7 @@ static void store_bake_pixel(void *handle, int x, int y, float u, float v) pixel->dv_dx = bd->dv_dx; pixel->dv_dy = bd->dv_dy; pixel->object_id = 0; + pixel->seed = i; } void RE_bake_mask_fill(const BakePixel pixel_array[], const size_t num_pixels, char *mask) @@ -383,6 +384,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, pixel_high->primitive_id = primitive_id_high; pixel_high->object_id = hit_mesh; + pixel_high->seed = pixel_id; /* ray direction in high poly object space */ float dir_high[3]; @@ -434,6 +436,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, else { pixel_array[pixel_id].primitive_id = -1; pixel_array[pixel_id].object_id = -1; + pixel_array[pixel_id].seed = 0; } MEM_freeN(hits); diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 151d994dddf..b199b1b0743 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -194,7 +194,7 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y, primitive[1] = int_as_float(-1); } else { - primitive[0] = int_as_float(bake_pixel->object_id); + primitive[0] = int_as_float(bake_pixel->seed); primitive[1] = int_as_float(bake_pixel->primitive_id); primitive[2] = bake_pixel->uv[0]; primitive[3] = bake_pixel->uv[1]; From 72989f9d0b67373a6eb47c08a51fa26a239b03fe Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Fri, 12 Feb 2021 15:23:47 +0100 Subject: [PATCH 117/519] Fix T85581: GPencil draw on surface does not work The problem was the stroke was reproject flat to view if the axis was View. Now, if the operation is using depth, the stroke is not reprojected. Related to T85082 --- source/blender/editors/gpencil/gpencil_fill.c | 2 +- source/blender/editors/gpencil/gpencil_paint.c | 4 ++-- source/blender/editors/gpencil/gpencil_primitive.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 8bd0b2f86de..9b181866ccb 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1285,7 +1285,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { ED_gpencil_project_stroke_to_view(tgpf->C, tgpf->gpl, gps); } diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index ed56f004ca4..889aea84c97 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1085,7 +1085,7 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } } @@ -1234,7 +1234,7 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) /* change position relative to parent object */ gpencil_apply_parent(depsgraph, obact, gpl, gps); /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index 53e0043df37..622680e5fb9 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -1078,7 +1078,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { ED_gpencil_project_stroke_to_view(C, tgpi->gpl, gps); } From ccea44e76bbd06309e0012ed3213a9028e8cb32c Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Fri, 12 Feb 2021 16:54:22 +0100 Subject: [PATCH 118/519] GPencil: Fix compiler warnings after previous commit These warnings were not detected by Windows compiler as the Linux compiler does. --- source/blender/editors/gpencil/gpencil_fill.c | 2 +- source/blender/editors/gpencil/gpencil_paint.c | 2 +- source/blender/editors/gpencil/gpencil_primitive.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 9b181866ccb..e5d27165344 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1285,7 +1285,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { ED_gpencil_project_stroke_to_view(tgpf->C, tgpf->gpl, gps); } diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 889aea84c97..cf05cf4738a 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1085,7 +1085,7 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } } diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index 622680e5fb9..35efcd1c769 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -1078,7 +1078,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { ED_gpencil_project_stroke_to_view(C, tgpi->gpl, gps); } From 98db4cc6391df8c8b21516bbdbc0af8f493a15b3 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 12 Feb 2021 17:41:28 +0100 Subject: [PATCH 119/519] Fix T84899: instance ids are not unique in common cases Ids stored in the `id` attribute cannot be assumed to be unique. While they might be unique in some cases, this is not something that can be guaranteed in general. For some use cases (e.g. generating "stable randomness" on points) uniqueness is not important. To support features like motion blur, unique ids are important though. This patch implements a simple algorithm that turns non-unique ids into unique ones. It might fail to do so under very unlikely circumstances, in which it returns non-unique ids instead of possibly going into an endless loop. Here are some requirements I set for the algorithm: * Ids that are unique already, must not be changed. * The same input should generate the same output. * Handle cases when all ids are different and when all ids are the same equally well (in expected linear time). * Small changes in the input id array should ideally only have a small impact on the output id array. The reported bug happened because cycles found multiple objects with the same id and thought that it was a single object that moved on every check. Differential Revision: https://developer.blender.org/D10402 --- source/blender/blenkernel/BKE_geometry_set.h | 2 +- source/blender/blenkernel/BKE_geometry_set.hh | 9 +++ .../blender/blenkernel/intern/geometry_set.cc | 69 ++++++++++++++++++- .../blender/blenkernel/intern/object_dupli.c | 10 +-- 4 files changed, 82 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set.h b/source/blender/blenkernel/BKE_geometry_set.h index 27ac6d98688..ac42674654f 100644 --- a/source/blender/blenkernel/BKE_geometry_set.h +++ b/source/blender/blenkernel/BKE_geometry_set.h @@ -47,7 +47,7 @@ typedef struct InstancedData { int BKE_geometry_set_instances(const struct GeometrySet *geometry_set, float (**r_transforms)[4][4], - int **r_ids, + const int **r_almost_unique_ids, struct InstancedData **r_instanced_data); #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 31739465afd..6f6269be208 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -429,6 +429,13 @@ class InstancesComponent : public GeometryComponent { blender::Vector ids_; blender::Vector instanced_data_; + /* These almost unique ids are generated based on `ids_`, which might not contain unique ids at + * all. They are *almost* unique, because under certain very unlikely circumstances, they are not + * unique. Code using these ids should not crash when they are not unique but can generally + * expect them to be unique. */ + mutable std::mutex almost_unique_ids_mutex_; + mutable blender::Array almost_unique_ids_; + public: InstancesComponent(); ~InstancesComponent() = default; @@ -445,6 +452,8 @@ class InstancesComponent : public GeometryComponent { blender::MutableSpan transforms(); int instances_amount() const; + blender::Span almost_unique_ids() const; + bool is_empty() const final; static constexpr inline GeometryComponentType static_type = GeometryComponentType::Instances; diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index a47a3dbc872..6db15c9393d 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -22,6 +22,8 @@ #include "DNA_object_types.h" +#include "BLI_rand.hh" + #include "MEM_guardedalloc.h" using blender::float3; @@ -542,6 +544,68 @@ bool InstancesComponent::is_empty() const return transforms_.size() == 0; } +static blender::Array generate_unique_instance_ids(Span original_ids) +{ + using namespace blender; + Array unique_ids(original_ids.size()); + + Set used_unique_ids; + used_unique_ids.reserve(original_ids.size()); + Vector instances_with_id_collision; + for (const int instance_index : original_ids.index_range()) { + const int original_id = original_ids[instance_index]; + if (used_unique_ids.add(original_id)) { + /* The original id has not been used by another instance yet. */ + unique_ids[instance_index] = original_id; + } + else { + /* The original id of this instance collided with a previous instance, it needs to be looked + * at again in a second pass. Don't generate a new random id here, because this might collide + * with other existing ids. */ + instances_with_id_collision.append(instance_index); + } + } + + Map generator_by_original_id; + for (const int instance_index : instances_with_id_collision) { + const int original_id = original_ids[instance_index]; + RandomNumberGenerator &rng = generator_by_original_id.lookup_or_add_cb(original_id, [&]() { + RandomNumberGenerator rng; + rng.seed_random(original_id); + return rng; + }); + + const int max_iteration = 100; + for (int iteration = 0;; iteration++) { + /* Try generating random numbers until an unused one has been found. */ + const int random_id = rng.get_int32(); + if (used_unique_ids.add(random_id)) { + /* This random id is not used by another instance. */ + unique_ids[instance_index] = random_id; + break; + } + if (iteration == max_iteration) { + /* It seems to be very unlikely that we ever run into this case (assuming there are less + * than 2^30 instances). However, if that happens, it's better to use an id that is not + * unique than to be stuck in an infinite loop. */ + unique_ids[instance_index] = original_id; + break; + } + } + } + + return unique_ids; +} + +blender::Span InstancesComponent::almost_unique_ids() const +{ + std::lock_guard lock(almost_unique_ids_mutex_); + if (almost_unique_ids_.size() != ids_.size()) { + almost_unique_ids_ = generate_unique_instance_ids(ids_); + } + return almost_unique_ids_; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -560,7 +624,7 @@ bool BKE_geometry_set_has_instances(const GeometrySet *geometry_set) int BKE_geometry_set_instances(const GeometrySet *geometry_set, float (**r_transforms)[4][4], - int **r_ids, + const int **r_almost_unique_ids, InstancedData **r_instanced_data) { const InstancesComponent *component = geometry_set->get_component_for_read(); @@ -568,9 +632,8 @@ int BKE_geometry_set_instances(const GeometrySet *geometry_set, return 0; } *r_transforms = (float(*)[4][4])component->transforms().data(); - *r_ids = (int *)component->ids().data(); - *r_instanced_data = (InstancedData *)component->instanced_data().data(); *r_instanced_data = (InstancedData *)component->instanced_data().data(); + *r_almost_unique_ids = (const int *)component->almost_unique_ids().data(); return component->instances_amount(); } diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c index 6c8a57f8599..632e7519f05 100644 --- a/source/blender/blenkernel/intern/object_dupli.c +++ b/source/blender/blenkernel/intern/object_dupli.c @@ -814,15 +814,17 @@ static const DupliGenerator gen_dupli_verts_pointcloud = { static void make_duplis_instances_component(const DupliContext *ctx) { float(*instance_offset_matrices)[4][4]; - int *ids; InstancedData *instanced_data; - const int amount = BKE_geometry_set_instances( - ctx->object->runtime.geometry_set_eval, &instance_offset_matrices, &ids, &instanced_data); + const int *almost_unique_ids; + const int amount = BKE_geometry_set_instances(ctx->object->runtime.geometry_set_eval, + &instance_offset_matrices, + &almost_unique_ids, + &instanced_data); for (int i = 0; i < amount; i++) { InstancedData *data = &instanced_data[i]; - const int id = ids[i] != -1 ? ids[i] : i; + const int id = almost_unique_ids[i]; if (data->type == INSTANCE_DATA_TYPE_OBJECT) { Object *object = data->data.object; From a4baedea91196176cb07d15a4d8acfab52cf9f83 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 11:58:15 -0600 Subject: [PATCH 120/519] Geometry Nodes: Make instances real on-demand This commit makes the geometry output of the collection info usable. The output is the geometry of a collection instance, but this commit adds a utility to convert the instances to real geometry, used in the background whenever it is needed, like copy on write. The recursive nature of the "realize instances" code is essential, because collection instances in the `InstancesComponent`, might have no geometry sets of their own containing even more collection instances, which might then contain object instances, etc. Another consideration is that currently, every single instance contains a reference to its data. This is inefficient since most of the time there are many locations and only a few sets of unique data. So this commit adds a `GeometryInstanceGroup` to support this future optimization. The API for instances returns a vector of `GeometryInstanceGroup`. This may be less efficient when there are many instances, but it makes more complicated operations like point distribution that need to iterate over input geometry multiple times much simpler. Any code that needs to change data, like most of the attribute nodes, can simply call `geometry_set_realize_instances(geometry_set)`, which will move any geometry in the `InstancesComponent` to new "real" geometry components. Many nodes can support read-only access to instances in order to avoid making them real, this will be addressed where needed in the near future. Instances from the existing "dupli" system are not supported yet. Differential Revision: https://developer.blender.org/D10327 --- source/blender/blenkernel/BKE_geometry_set.hh | 22 ++ .../blender/blenkernel/intern/geometry_set.cc | 150 +++++++++++ .../nodes/geometry/node_geometry_util.cc | 249 ++++++++++++++++++ .../nodes/geometry/node_geometry_util.hh | 17 ++ .../node_geo_align_rotation_to_vector.cc | 2 + .../nodes/node_geo_attribute_color_ramp.cc | 2 + .../nodes/node_geo_attribute_compare.cc | 2 + .../geometry/nodes/node_geo_attribute_fill.cc | 2 + .../geometry/nodes/node_geo_attribute_math.cc | 2 + .../geometry/nodes/node_geo_attribute_mix.cc | 2 + .../nodes/node_geo_attribute_proximity.cc | 6 + .../nodes/node_geo_attribute_randomize.cc | 2 + .../node_geo_attribute_sample_texture.cc | 2 + .../nodes/node_geo_attribute_vector_math.cc | 2 + .../nodes/geometry/nodes/node_geo_boolean.cc | 6 + .../geometry/nodes/node_geo_edge_split.cc | 2 + .../geometry/nodes/node_geo_object_info.cc | 34 +-- .../nodes/node_geo_point_distribute.cc | 3 + .../geometry/nodes/node_geo_point_instance.cc | 4 + .../geometry/nodes/node_geo_point_rotate.cc | 2 + .../geometry/nodes/node_geo_point_scale.cc | 2 + .../geometry/nodes/node_geo_point_separate.cc | 4 + .../nodes/node_geo_point_translate.cc | 2 + .../nodes/node_geo_points_to_volume.cc | 3 + .../nodes/node_geo_subdivision_surface.cc | 2 + .../geometry/nodes/node_geo_triangulate.cc | 2 + 26 files changed, 501 insertions(+), 27 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 02b3c88183a..5b429a61b3f 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -467,3 +467,25 @@ class VolumeComponent : public GeometryComponent { static constexpr inline GeometryComponentType static_type = GeometryComponentType::Volume; }; + +/** + * Used to keep track of a group of instances using the same geometry data. + */ +struct GeometryInstanceGroup { + /** + * The geometry set instanced on each of the transforms. The components are not necessarily + * owned here. For example, they may be owned by the instanced object. This cannot be a + * reference because not all instanced data will necessarily have a #geometry_set_eval. + */ + GeometrySet geometry_set; + + /** + * As an optimization to avoid copying, the same geometry set can be associated with multiple + * instances. Each instance is stored as a transform matrix here. Again, these must be owned + * because they may be transformed from the original data. TODO: Validate that last statement. + */ + blender::Vector transforms; +}; + +blender::Vector BKE_geometry_set_gather_instances( + const GeometrySet &geometry_set); diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index 7eb41a6c623..0bc248299ca 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -14,13 +14,19 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "BLI_map.hh" + +#include "BKE_attribute.h" +#include "BKE_attribute_access.hh" #include "BKE_geometry_set.hh" #include "BKE_lib_id.h" #include "BKE_mesh.h" #include "BKE_mesh_wrapper.h" +#include "BKE_modifier.h" #include "BKE_pointcloud.h" #include "BKE_volume.h" +#include "DNA_collection_types.h" #include "DNA_object_types.h" #include "BLI_rand.hh" @@ -29,6 +35,7 @@ using blender::float3; using blender::float4x4; +using blender::Map; using blender::MutableSpan; using blender::Span; using blender::StringRef; @@ -579,6 +586,149 @@ bool InstancesComponent::is_empty() const return transforms_.size() == 0; } +/** + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +static GeometrySet object_get_geometry_set_for_read(const Object &object) +{ + /* Objects evaluated with a nodes modifier will have a geometry set already. */ + if (object.runtime.geometry_set_eval != nullptr) { + return *object.runtime.geometry_set_eval; + } + + /* Otherwise, construct a new geometry set with the component based on the object type. */ + GeometrySet new_geometry_set; + + if (object.type == OB_MESH) { + Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object( + &const_cast(object), false); + + if (mesh != nullptr) { + BKE_mesh_wrapper_ensure_mdata(mesh); + + MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); + mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly); + mesh_component.copy_vertex_group_names_from_object(object); + } + } + + /* TODO: Cover the case of pointclouds without modifiers-- they may not be covered by the + * #geometry_set_eval case above. */ + + /* TODO: Add volume support. */ + + /* Return by value since there is not always an existing geometry set owned elsewhere to use. */ + return new_geometry_set; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Geometry Set Gather Recursive Instances + * \{ */ + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets); + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets); + +static void geometry_set_collect_recursive_collection_instance( + const Collection &collection, const float4x4 &transform, Vector &r_sets) +{ + float4x4 offset_matrix; + unit_m4(offset_matrix.values); + sub_v3_v3(offset_matrix.values[3], collection.instance_offset); + const float4x4 instance_transform = transform * offset_matrix; + geometry_set_collect_recursive_collection(collection, instance_transform, r_sets); +} + +static void geometry_set_collect_recursive_object(const Object &object, + const float4x4 &transform, + Vector &r_sets) +{ + GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object); + geometry_set_collect_recursive(instance_geometry_set, transform, r_sets); + + if (object.type == OB_EMPTY) { + const Collection *collection_instance = object.instance_collection; + if (collection_instance != nullptr) { + geometry_set_collect_recursive_collection_instance(*collection_instance, transform, r_sets); + } + } +} + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets) +{ + LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) { + BLI_assert(collection_object->ob != nullptr); + const Object &object = *collection_object->ob; + const float4x4 object_transform = transform * object.obmat; + geometry_set_collect_recursive_object(object, object_transform, r_sets); + } + LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) { + BLI_assert(collection_child->collection != nullptr); + const Collection &collection = *collection_child->collection; + geometry_set_collect_recursive_collection(collection, transform, r_sets); + } +} + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets) +{ + r_sets.append({geometry_set, {transform}}); + + if (geometry_set.has_instances()) { + const InstancesComponent &instances_component = + *geometry_set.get_component_for_read(); + + Span transforms = instances_component.transforms(); + Span instances = instances_component.instanced_data(); + for (const int i : instances.index_range()) { + const InstancedData &data = instances[i]; + const float4x4 instance_transform = transform * transforms[i]; + + if (data.type == INSTANCE_DATA_TYPE_OBJECT) { + BLI_assert(data.data.object != nullptr); + const Object &object = *data.data.object; + geometry_set_collect_recursive_object(object, instance_transform, r_sets); + } + else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) { + BLI_assert(data.data.collection != nullptr); + const Collection &collection = *data.data.collection; + geometry_set_collect_recursive_collection_instance(collection, instance_transform, r_sets); + } + } + } +} + +/** + * Return flattened vector of the geometry component's recursive instances. I.e. all collection + * instances and object instances will be expanded into the instances of their geometry components. + * Even the instances in those geometry components' will be included. + * + * \note For convenience (to avoid duplication in the caller), the returned vector also contains + * the argument geometry set. + * + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +Vector BKE_geometry_set_gather_instances(const GeometrySet &geometry_set) +{ + Vector result_vector; + + float4x4 unit_transform; + unit_m4(unit_transform.values); + + geometry_set_collect_recursive(geometry_set, unit_transform, result_vector); + + return result_vector; +} + static blender::Array generate_unique_instance_ids(Span original_ids) { using namespace blender; diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index daaccf4450b..95c25795356 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -17,8 +17,257 @@ #include "node_geometry_util.hh" #include "node_util.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "BKE_mesh.h" +#include "BKE_mesh_runtime.h" +#include "BKE_pointcloud.h" + namespace blender::nodes { +void gather_attribute_info(Map &attributes, + const GeometryComponentType component_type, + Span set_groups, + const Set &ignored_attributes) +{ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (!set.has(component_type)) { + continue; + } + const GeometryComponent &component = *set.get_component_for_read(component_type); + + for (const std::string name : component.attribute_names()) { + if (ignored_attributes.contains(name)) { + continue; + } + const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); + if (!read_attribute) { + continue; + } + const AttributeDomain domain = read_attribute->domain(); + const CustomDataType data_type = read_attribute->custom_data_type(); + + auto add_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; + info->data_type = data_type; + }; + auto modify_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; /* TODO: Use highest priority domain. */ + info->data_type = attribute_data_type_highest_complexity({info->data_type, data_type}); + }; + + attributes.add_or_modify(name, add_info, modify_info); + } + } +} + +static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups) +{ + int totverts = 0; + int totloops = 0; + int totedges = 0; + int totpolys = 0; + int64_t cd_dirty_vert = 0; + int64_t cd_dirty_poly = 0; + int64_t cd_dirty_edge = 0; + int64_t cd_dirty_loop = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + totverts += mesh.totvert * set_group.transforms.size(); + totloops += mesh.totloop * set_group.transforms.size(); + totedges += mesh.totedge * set_group.transforms.size(); + totpolys += mesh.totpoly * set_group.transforms.size(); + cd_dirty_vert |= mesh.runtime.cd_dirty_vert; + cd_dirty_poly |= mesh.runtime.cd_dirty_poly; + cd_dirty_edge |= mesh.runtime.cd_dirty_edge; + cd_dirty_loop |= mesh.runtime.cd_dirty_loop; + } + } + + Mesh *new_mesh = BKE_mesh_new_nomain(totverts, totedges, 0, totloops, totpolys); + /* Copy settings from the first input geometry set with a mesh. */ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + BKE_mesh_copy_settings(new_mesh, &mesh); + break; + } + } + new_mesh->runtime.cd_dirty_vert = cd_dirty_vert; + new_mesh->runtime.cd_dirty_poly = cd_dirty_poly; + new_mesh->runtime.cd_dirty_edge = cd_dirty_edge; + new_mesh->runtime.cd_dirty_loop = cd_dirty_loop; + + int vert_offset = 0; + int loop_offset = 0; + int edge_offset = 0; + int poly_offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + for (const float4x4 &transform : set_group.transforms) { + for (const int i : IndexRange(mesh.totvert)) { + const MVert &old_vert = mesh.mvert[i]; + MVert &new_vert = new_mesh->mvert[vert_offset + i]; + + new_vert = old_vert; + + const float3 new_position = transform * float3(old_vert.co); + copy_v3_v3(new_vert.co, new_position); + } + for (const int i : IndexRange(mesh.totedge)) { + const MEdge &old_edge = mesh.medge[i]; + MEdge &new_edge = new_mesh->medge[edge_offset + i]; + new_edge = old_edge; + new_edge.v1 += vert_offset; + new_edge.v2 += vert_offset; + } + for (const int i : IndexRange(mesh.totloop)) { + const MLoop &old_loop = mesh.mloop[i]; + MLoop &new_loop = new_mesh->mloop[loop_offset + i]; + new_loop = old_loop; + new_loop.v += vert_offset; + new_loop.e += edge_offset; + } + for (const int i : IndexRange(mesh.totpoly)) { + const MPoly &old_poly = mesh.mpoly[i]; + MPoly &new_poly = new_mesh->mpoly[poly_offset + i]; + new_poly = old_poly; + new_poly.loopstart += loop_offset; + } + + vert_offset += mesh.totvert; + loop_offset += mesh.totloop; + edge_offset += mesh.totedge; + poly_offset += mesh.totpoly; + } + } + } + + return new_mesh; +} + +static void join_attributes(Span set_groups, + const GeometryComponentType component_type, + const Map &attribute_info, + GeometryComponent &result) +{ + for (Map::Item entry : attribute_info.items()) { + StringRef name = entry.key; + const AttributeDomain domain_output = entry.value.domain; + const CustomDataType data_type_output = entry.value.data_type; + const CPPType *cpp_type = bke::custom_data_type_to_cpp_type(data_type_output); + BLI_assert(cpp_type != nullptr); + + result.attribute_try_create(entry.key, domain_output, data_type_output); + WriteAttributePtr write_attribute = result.attribute_try_get_for_write(name); + if (!write_attribute || &write_attribute->cpp_type() != cpp_type || + write_attribute->domain() != domain_output) { + continue; + } + fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); + + int offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has(component_type)) { + const GeometryComponent &component = *set.get_component_for_read(component_type); + const int domain_size = component.attribute_domain_size(domain_output); + if (domain_size == 0) { + continue; /* Domain size is 0, so no need to increment the offset. */ + } + ReadAttributePtr source_attribute = component.attribute_try_get_for_read( + name, domain_output, data_type_output); + + if (source_attribute) { + fn::GSpan src_span = source_attribute->get_span(); + const void *src_buffer = src_span.data(); + for (const int UNUSED(i) : set_group.transforms.index_range()) { + void *dst_buffer = dst_span[offset]; + cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); + offset += domain_size; + } + } + else { + offset += domain_size * set_group.transforms.size(); + } + } + } + + write_attribute->apply_span(); + } +} + +static void join_instance_groups_mesh(Span set_groups, GeometrySet &result) +{ + Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups); + + MeshComponent &dst_component = result.get_component_for_write(); + dst_component.replace(new_mesh); + + /* The position attribute is handled above already. */ + Map attributes; + gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {"position"}); + join_attributes(set_groups, + GeometryComponentType::Mesh, + attributes, + static_cast(dst_component)); +} + +static void join_instance_groups_pointcloud(Span set_groups, + GeometrySet &result) +{ + int totpoint = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has()) { + const PointCloudComponent &component = *set.get_component_for_read(); + totpoint += component.attribute_domain_size(ATTR_DOMAIN_POINT); + } + } + + PointCloudComponent &dst_component = result.get_component_for_write(); + PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); + dst_component.replace(pointcloud); + Map attributes; + gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {}); + join_attributes(set_groups, + GeometryComponentType::PointCloud, + attributes, + static_cast(dst_component)); +} + +static void join_instance_groups_volume(Span set_groups, + GeometrySet &result) +{ + /* Not yet supported. Joining volume grids with the same name requires resampling of at least + * one of the grids. The cell size of the resulting volume has to be determined somehow. */ + VolumeComponent &dst_component = result.get_component_for_write(); + UNUSED_VARS(set_groups, dst_component); +} + +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) +{ + if (!geometry_set.has_instances()) { + return geometry_set; + } + + GeometrySet new_geometry_set; + + Vector set_groups = BKE_geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, new_geometry_set); + join_instance_groups_pointcloud(set_groups, new_geometry_set); + join_instance_groups_volume(set_groups, new_geometry_set); + + return new_geometry_set; +} + /** * Update the availability of a group of input sockets with the same name, * used for switching between attribute inputs or single values. diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index b7b2afeefcb..7ca44d82a38 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -49,4 +49,21 @@ CustomDataType attribute_data_type_highest_complexity(Span); Array get_geometry_element_ids_as_uints(const GeometryComponent &component, const AttributeDomain domain); +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); + +struct AttributeInfo { + CustomDataType data_type; + AttributeDomain domain; +}; + +/** + * Add information about all the attributes on every component of the type. The resulting info + * will contain the highest complexity data type and the highest priority domain among every + * attribute with the given name on all of the input components. + */ +void gather_attribute_info(Map &attributes, + const GeometryComponentType component_type, + Span set_groups, + const Set &ignored_attributes); + } // namespace blender::nodes diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index e592bd0bda8..02a6ac49c29 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -163,6 +163,8 @@ static void geo_node_align_rotation_to_vector_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { align_rotations_on_component(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc index 179e418214c..fc5fb4c5488 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc @@ -81,6 +81,8 @@ static void geo_node_attribute_color_ramp_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index 5e434a7f96d..ee97102de7b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -318,6 +318,8 @@ static void geo_node_attribute_compare_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_compare_calc(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index 92b47769d1f..a5ac1926963 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -119,6 +119,8 @@ static void geo_node_attribute_fill_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { fill_attribute(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index 076f7a9ee28..1780ec69df2 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -267,6 +267,8 @@ static void geo_node_attribute_math_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_math_calc(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index 976970d06b1..2dbfcd2819c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -174,6 +174,8 @@ static void geo_node_attribute_mix_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_mix_calc(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index 45f20ca553a..e46fdaa127a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -202,6 +202,12 @@ static void geo_node_attribute_proximity_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_target = params.extract_input("Target"); + geometry_set = geometry_set_realize_instances(geometry_set); + + /* This isn't required. This node should be rewritten to handle instances + * for the target geometry set. However, the generic BVH API complicates this. */ + geometry_set_target = geometry_set_realize_instances(geometry_set_target); + if (geometry_set.has()) { attribute_calc_proximity( geometry_set.get_component_for_write(), geometry_set_target, params); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index f5765af83b3..f4399b45b2e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -202,6 +202,8 @@ static void geo_node_random_attribute_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); const int seed = params.get_input("Seed"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { randomize_attribute(geometry_set.get_component_for_write(), params, seed); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc index b6a960e5617..fc3cd099d41 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc @@ -88,6 +88,8 @@ static void geo_node_attribute_sample_texture_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc index 62a291e8506..adcdab58e30 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc @@ -419,6 +419,8 @@ static void geo_node_attribute_vector_math_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { attribute_vector_math_calc(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc index 403b74b2fef..38215b54640 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc @@ -124,6 +124,12 @@ static void geo_node_boolean_exec(GeoNodeExecParams params) return; } + /* TODO: Boolean does support an input of multiple meshes. Currently they must all be + * converted to BMesh before running the operation though. D9957 will make it possible + * to use the mesh structure directly. */ + geometry_set_in_a = geometry_set_realize_instances(geometry_set_in_a); + geometry_set_in_b = geometry_set_realize_instances(geometry_set_in_b); + const Mesh *mesh_in_a = geometry_set_in_a.get_mesh_for_read(); const Mesh *mesh_in_b = geometry_set_in_b.get_mesh_for_read(); diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc index 48ff8f2f683..1c794d1f43e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc @@ -51,6 +51,8 @@ static void geo_node_edge_split_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (!geometry_set.has_mesh()) { params.set_output("Geometry", std::move(geometry_set)); return; diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc index 4e26977b85a..7249a34134f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc @@ -77,35 +77,15 @@ static void geo_node_object_info_exec(GeoNodeExecParams params) quat_to_eul(rotation, quaternion); if (object != self_object) { - if (object->type == OB_MESH) { - Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object, false); - if (mesh != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh); + InstancesComponent &instances = geometry_set.get_component_for_write(); - /* Make a copy because the life time of the other mesh might be shorter. */ - Mesh *copied_mesh = BKE_mesh_copy_for_eval(mesh, false); - - if (transform_space_relative) { - /* Transform into the local space of the object that is being modified. */ - BKE_mesh_transform(copied_mesh, transform, true); - } - - MeshComponent &mesh_component = geometry_set.get_component_for_write(); - mesh_component.replace(copied_mesh); - mesh_component.copy_vertex_group_names_from_object(*object); - } + if (transform_space_relative) { + instances.add_instance(object, transform); } - if (object->type == OB_VOLUME) { - InstancesComponent &instances = geometry_set.get_component_for_write(); - - if (transform_space_relative) { - instances.add_instance(object, transform); - } - else { - float unit_transform[4][4]; - unit_m4(unit_transform); - instances.add_instance(object, unit_transform); - } + else { + float unit_transform[4][4]; + unit_m4(unit_transform); + instances.add_instance(object, unit_transform); } } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index 93abed7926e..581c356742b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -419,6 +419,9 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_out; + /* TODO: This node only needs read-only access to input instances. */ + geometry_set = geometry_set_realize_instances(geometry_set); + GeometryNodePointDistributeMethod distribute_method = static_cast(params.node().custom1); diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index 1e7cf21f921..5cb98901d8d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -194,6 +194,10 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Geometry"); GeometrySet geometry_set_out; + /* TODO: This node should be able to instance on the input instances component + * rather than making the entire input geometry set real. */ + geometry_set = geometry_set_realize_instances(geometry_set); + InstancesComponent &instances = geometry_set_out.get_component_for_write(); if (geometry_set.has()) { add_instances_from_geometry_component( diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc index 3ca898bfd83..013dbf5045f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc @@ -165,6 +165,8 @@ static void geo_node_point_rotate_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { point_rotate_on_component(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc index 78e23b783db..b73c8251e72 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc @@ -64,6 +64,8 @@ static void geo_node_point_scale_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc index 5f9d208a440..8bb8c5e980a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc @@ -178,6 +178,10 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params) GeometrySet out_set_a(geometry_set); GeometrySet out_set_b; + /* TODO: This is not necessary-- the input goemetry set can be read only, + * but it must be rewritten to handle instance groups. */ + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { separate_point_cloud(*geometry_set.get_component_for_read(), params, diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc index f7f369f5d66..0b9d561bccb 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc @@ -63,6 +63,8 @@ static void geo_node_point_translate_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { execute_on_component(params, geometry_set.get_component_for_write()); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc index 428f129fb36..b79ca0a6197 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc @@ -215,6 +215,9 @@ static void geo_node_points_to_volume_exec(GeoNodeExecParams params) GeometrySet geometry_set_in = params.extract_input("Geometry"); GeometrySet geometry_set_out; + /* TODO: Read-only access to instances should be supported here, for now they are made real. */ + geometry_set_in = geometry_set_realize_instances(geometry_set_in); + #ifdef WITH_OPENVDB initialize_volume_component_from_points(geometry_set_in, geometry_set_out, params); #endif diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc index 99f7339a1cc..4cdb669f964 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc @@ -55,6 +55,8 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (!geometry_set.has_mesh()) { params.set_output("Geometry", geometry_set); return; diff --git a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc index 32fa32a9f13..0c754ad3b37 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc @@ -65,6 +65,8 @@ static void geo_node_triangulate_exec(GeoNodeExecParams params) GeometryNodeTriangulateNGons ngon_method = static_cast( params.node().custom2); + geometry_set = geometry_set_realize_instances(geometry_set); + /* #triangulate_mesh might modify the input mesh currently. */ Mesh *mesh_in = geometry_set.get_mesh_for_write(); if (mesh_in != nullptr) { From 5393054a5d68e4340fd9e4fc41fb1d8f130cc6cc Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 12:03:38 -0600 Subject: [PATCH 121/519] Geometry Nodes: Add dependency relation for collection objects Currently moving or changing an object references in a node modifier's node group does not trigger re-evaluation. Because there is no collection relation in the dependency graph, we must add the relation to all objects in the collection individually. --- source/blender/modifiers/intern/MOD_nodes.cc | 39 ++++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 23bfe76a5c3..0fec7cfe937 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -150,6 +150,31 @@ static void find_used_ids_from_settings(const NodesModifierSettings &settings, S &ids); } +static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object) +{ + DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); + if (&(ID &)object != &ctx->object->id) { + if (object.type != OB_EMPTY) { + DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_GEOMETRY, "Nodes Modifier"); + } + } +} + +static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx, + Collection &collection) +{ + LISTBASE_FOREACH (CollectionObject *, collection_object, &collection.gobject) { + BLI_assert(collection_object->ob != nullptr); + Object &object = *collection_object->ob; + add_object_relation(ctx, object); + } + LISTBASE_FOREACH (CollectionChild *, collection_child, &collection.children) { + BLI_assert(collection_child->collection != nullptr); + Collection &collection = *collection_child->collection; + add_collection_object_relations_recursive(ctx, collection); + } +} + static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { NodesModifierData *nmd = reinterpret_cast(md); @@ -163,18 +188,16 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte for (ID *id : used_ids) { if (GS(id->name) == ID_OB) { Object *object = reinterpret_cast(id); - DEG_add_object_relation(ctx->node, object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); - if (id != &ctx->object->id) { - if (object->type != OB_EMPTY) { - DEG_add_object_relation( - ctx->node, (Object *)id, DEG_OB_COMP_GEOMETRY, "Nodes Modifier"); - } - } + add_object_relation(ctx, *object); + } + if (GS(id->name) == ID_GR) { + Collection *collection = reinterpret_cast(id); + add_collection_object_relations_recursive(ctx, *collection); } } } - /* TODO: Add dependency for collection changes. */ + /* TODO: Add dependency for adding and removing objects in collections. */ } static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) From 6b40ee608c5a1dbe67870fab4b83cce4cc4b54f5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 31 Jan 2021 21:01:25 +0100 Subject: [PATCH 122/519] OpenColorIO: remove default display workaround A fix for this is in 2.0 (and recent 1.1.x versions), no need for this anymore. Differential Revision: https://developer.blender.org/D10275 --- intern/opencolorio/ocio_impl.cc | 127 -------------------------------- 1 file changed, 127 deletions(-) diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index 0e25c89f5d7..cf3571b4662 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -50,27 +50,6 @@ using namespace OCIO_NAMESPACE; # define __func__ __FUNCTION__ #endif -/* NOTE: This is because OCIO 1.1.0 has a bug which makes default - * display to be the one which is first alphabetically. - * - * Fix has been submitted as a patch - * https://github.com/imageworks/OpenColorIO/pull/638 - * - * For until then we use first usable display instead. */ -#define DEFAULT_DISPLAY_WORKAROUND -#ifdef DEFAULT_DISPLAY_WORKAROUND -# include -# include -# include -# include -# include -# include -using std::map; -using std::set; -using std::string; -using std::vector; -#endif - static void OCIO_reportError(const char *err) { std::cerr << "OpenColorIO Error: " << err << std::endl; @@ -213,30 +192,6 @@ int OCIOImpl::configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const c const char *OCIOImpl::configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config) { -#ifdef DEFAULT_DISPLAY_WORKAROUND - if (getenv("OCIO_ACTIVE_DISPLAYS") == NULL) { - const char *active_displays = (*(ConstConfigRcPtr *)config)->getActiveDisplays(); - if (active_displays[0] != '\0') { - const char *separator_pos = strchr(active_displays, ','); - if (separator_pos == NULL) { - return active_displays; - } - static std::string active_display; - /* NOTE: Configuration is shared and is never changed during - * runtime, so we only guarantee two threads don't initialize at the - * same. */ - static std::mutex mutex; - mutex.lock(); - if (active_display.empty()) { - active_display = active_displays; - active_display[separator_pos - active_displays] = '\0'; - } - mutex.unlock(); - return active_display.c_str(); - } - } -#endif - try { return (*(ConstConfigRcPtr *)config)->getDefaultDisplay(); } @@ -271,90 +226,8 @@ const char *OCIOImpl::configGetDisplay(OCIO_ConstConfigRcPtr *config, int index) return NULL; } -#ifdef DEFAULT_DISPLAY_WORKAROUND -namespace { - -void splitStringEnvStyle(vector *tokens, const string &str) -{ - tokens->clear(); - const int len = str.length(); - int token_start = 0, token_length = 0; - for (int i = 0; i < len; ++i) { - const char ch = str[i]; - if (ch != ',' && ch != ':') { - /* Append non-separator char to a token. */ - ++token_length; - } - else { - /* Append current token to the list (if any). */ - if (token_length > 0) { - string token = str.substr(token_start, token_length); - tokens->push_back(token); - } - /* Re-set token pointers. */ - token_start = i + 1; - token_length = 0; - } - } - /* Append token which might be at the end of the string. */ - if (token_length != 0) { - string token = str.substr(token_start, token_length); - tokens->push_back(token); - } -} - -string stringToLower(const string &str) -{ - string lower = str; - std::transform(lower.begin(), lower.end(), lower.begin(), tolower); - return lower; -} - -} // namespace -#endif - const char *OCIOImpl::configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display) { -#ifdef DEFAULT_DISPLAY_WORKAROUND - /* NOTE: We assume that first active view always exists for a default - * display. */ - if (getenv("OCIO_ACTIVE_VIEWS") == NULL) { - ConstConfigRcPtr config_ptr = *((ConstConfigRcPtr *)config); - const char *active_views_encoded = config_ptr->getActiveViews(); - if (active_views_encoded[0] != '\0') { - const string display_lower = stringToLower(display); - static map default_display_views; - static std::mutex mutex; - mutex.lock(); - /* Check if the view is already known. */ - map::const_iterator it = default_display_views.find(display_lower); - if (it != default_display_views.end()) { - mutex.unlock(); - return it->second.c_str(); - } - /* Active views. */ - vector active_views; - splitStringEnvStyle(&active_views, active_views_encoded); - /* Get all views supported by tge display. */ - set display_views; - const int num_display_views = config_ptr->getNumViews(display); - for (int view_index = 0; view_index < num_display_views; ++view_index) { - const char *view = config_ptr->getView(display, view_index); - display_views.insert(stringToLower(view)); - } - /* Get first view which is supported by tge display. */ - for (const string &view : active_views) { - const string view_lower = stringToLower(view); - if (display_views.find(view_lower) != display_views.end()) { - default_display_views[display_lower] = view; - mutex.unlock(); - return default_display_views[display_lower].c_str(); - } - } - mutex.unlock(); - } - } -#endif try { return (*(ConstConfigRcPtr *)config)->getDefaultView(display); } From 1b4961b318f14064bc3c915da7206a74146af95d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 31 Jan 2021 19:35:00 +0100 Subject: [PATCH 123/519] OpenColorIO: upgrade to version 2.0.0 Ref T84819 Build System ============ This is an API breaking new version, and the updated code only builds with OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated. * Tinyxml was replaced with Expat, adding a new dependency. * Yaml-cpp is now built as a dependency on Unix, as was already done on Windows. * Removed currently unused LCMS code. * Pystring remains built as part of OCIO itself, since it has no good build system. * Linux and macOS check for the OpenColorIO verison, and disable it if too old. Ref D10270 Processors and Transforms ========================= CPU processors now need to be created to do CPU processing. These are cached internally, but the cache lookup is not fast enough to execute per pixel or texture sample, so for performance these are now also exposed in the C API. The C API for transforms will no longer be needed afer all changes, so remove it to simplify the API and fallback implementation. Ref D10271 Display Transforms ================== Needs a bit more manual work constructing the transform. LegacyViewingPipeline could also have been used, but isn't really any simpler and since it's legacy we better not rely on it. We moved more logic into the opencolorio module, to simplify the API. There is no need to wrap a dozen functions just to be able to do this in C rather than C++. It's also tightly coupled to the GPU shader logic, and so should be in the same module. Ref D10271 GPU Display Shader ================== To avoid baking exposure and gamma into the GLSL shader and requiring slow recompiles when tweaking, we manually apply them in the shader. This leads to some logic duplicaton between the CPU and GPU display processor, but it seems unavoidable. Caching was also changed. Previously this was done both on the imbuf and opencolorio module levels. Now it's all done in the opencolorio module by simply matching color space names. We no longer use cacheIDs from OpenColorIO since computing them is expensive, and they are unlikely to match now that more is baked into the shader code. Shaders can now use multiple 2D textures, 3D textures and uniforms, rather than a single 3D texture. So allocating and binding those adds some code. Color space conversions for blending with overlays is now hardcoded in the shader. This was using harcoded numbers anyway, if this every becomes a general OpenColorIO transform it can be changed, but for now there is no point to add code complexity. Ref D10273 CIE XYZ ======= We need standard CIE XYZ values for rendering effects like blackbody emission. The relation to the scene linear role is based on OpenColorIO configuration. In OpenColorIO 2.0 configs roles can no longer have the same name as color spaces, which means our XYZ role and colorspace in the configuration give an error. Instead use the new standard aces_interchange role, which relates scene linear to a known scene referred color space. Compatibility with the old XYZ role is preserved, if the configuration file has no conflicting names. Also includes a non-functional change to the configuraton file to use an XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier since the matrix is the same one we have in the code now and that is also found easily in the ACES specs. Ref D10274 --- CMakeLists.txt | 3 +- build_files/build_environment/CMakeLists.txt | 14 +- .../cmake/{lcms.cmake => expat.cmake} | 22 +- .../build_environment/cmake/nasm.cmake | 4 +- .../build_environment/cmake/opencolorio.cmake | 77 +- .../build_environment/cmake/tinyxml.cmake | 31 - .../build_environment/cmake/versions.cmake | 14 +- .../build_environment/cmake/yamlcpp.cmake | 9 +- build_files/build_environment/install_deps.sh | 12 +- .../cmake/Modules/FindOpenColorIO.cmake | 19 +- .../cmake/platform/platform_apple.cmake | 7 +- .../cmake/platform/platform_unix.cmake | 2 +- .../cmake/platform/platform_win32.cmake | 8 +- intern/cycles/render/CMakeLists.txt | 5 +- intern/cycles/render/colorspace.cpp | 19 +- intern/cycles/render/shader.cpp | 120 ++- intern/cycles/render/shader.h | 2 + intern/opencolorio/fallback_impl.cc | 366 ++------ .../gpu_shader_display_transform.glsl | 42 +- intern/opencolorio/ocio_capi.cc | 205 ++--- intern/opencolorio/ocio_capi.h | 90 +- intern/opencolorio/ocio_impl.cc | 363 ++++---- intern/opencolorio/ocio_impl.h | 245 ++---- intern/opencolorio/ocio_impl_glsl.cc | 833 ++++++++++-------- release/datafiles/colormanagement/config.ocio | 9 +- .../colormanagement/luts/aces_to_xyz.spimtx | 3 - .../luts/rec709_to_aces.spimtx | 3 - .../colormanagement/luts/xyz_to_aces.spimtx | 3 + .../imbuf/intern/IMB_colormanagement_intern.h | 9 +- source/blender/imbuf/intern/colormanagement.c | 561 +++++------- 30 files changed, 1358 insertions(+), 1742 deletions(-) rename build_files/build_environment/cmake/{lcms.cmake => expat.cmake} (66%) delete mode 100644 build_files/build_environment/cmake/tinyxml.cmake delete mode 100644 release/datafiles/colormanagement/luts/aces_to_xyz.spimtx delete mode 100644 release/datafiles/colormanagement/luts/rec709_to_aces.spimtx create mode 100644 release/datafiles/colormanagement/luts/xyz_to_aces.spimtx diff --git a/CMakeLists.txt b/CMakeLists.txt index 51308850d3a..b6fb6dbd9dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -728,8 +728,9 @@ set_and_warn_dependency(WITH_TBB WITH_MOD_FLUID OFF) # NanoVDB requires OpenVDB to convert the data structure set_and_warn_dependency(WITH_OPENVDB WITH_NANOVDB OFF) -# OpenVDB uses 'half' type from OpenEXR & fails to link without OpenEXR enabled. +# OpenVDB and OpenColorIO uses 'half' type from OpenEXR set_and_warn_dependency(WITH_IMAGE_OPENEXR WITH_OPENVDB OFF) +set_and_warn_dependency(WITH_IMAGE_OPENEXR WITH_OPENCOLORIO OFF) # Haru needs `TIFFFaxBlackCodes` & `TIFFFaxWhiteCodes` symbols from TIFF. set_and_warn_dependency(WITH_IMAGE_TIFF WITH_HARU OFF) diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 672f5820a16..8d6fd3ab4c3 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -70,7 +70,6 @@ include(cmake/cuew.cmake) include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) include(cmake/opencollada.cmake) -include(cmake/opencolorio.cmake) include(cmake/llvm.cmake) include(cmake/clang.cmake) if(APPLE) @@ -105,18 +104,15 @@ if(NOT APPLE) include(cmake/xr_openxr.cmake) endif() +# OpenColorIO and dependencies. +include(cmake/expat.cmake) +include(cmake/yamlcpp.cmake) +include(cmake/opencolorio.cmake) + if(WITH_WEBP) include(cmake/webp.cmake) endif() -if(WIN32) - # OCIO deps - include(cmake/tinyxml.cmake) - include(cmake/yamlcpp.cmake) - # LCMS is an OCIO dep, but only if you build the apps, leaving it here for convenience - # include(cmake/lcms.cmake) -endif() - if(NOT WIN32 OR ENABLE_MINGW64) include(cmake/gmp.cmake) include(cmake/openjpeg.cmake) diff --git a/build_files/build_environment/cmake/lcms.cmake b/build_files/build_environment/cmake/expat.cmake similarity index 66% rename from build_files/build_environment/cmake/lcms.cmake rename to build_files/build_environment/cmake/expat.cmake index c7019bc645e..001f3941de1 100644 --- a/build_files/build_environment/cmake/lcms.cmake +++ b/build_files/build_environment/cmake/expat.cmake @@ -16,16 +16,20 @@ # # ***** END GPL LICENSE BLOCK ***** -set(LCMS_EXTRA_ARGS +set(EXPAT_EXTRA_ARGS + -DEXPAT_BUILD_DOCS=OFF + -DEXPAT_BUILD_EXAMPLES=OFF + -DEXPAT_BUILD_TESTS=OFF + -DEXPAT_BUILD_TOOLS=OFF + -DEXPAT_SHARED_LIBS=OFF ) -ExternalProject_Add(external_lcms - URL ${LCMS_URI} +ExternalProject_Add(external_expat + URL ${EXPAT_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${LCMS_HASH} - PREFIX ${BUILD_DIR}/lcms - # Patch taken from ocio. - PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_lcms.txt ${BUILD_DIR}/lcms/src/external_lcms/CMakeLists.txt - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/lcms ${DEFAULT_CMAKE_FLAGS} ${LCMS_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/lcms + URL_HASH MD5=${EXPAT_HASH} + PREFIX ${BUILD_DIR}/expat + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/expat ${DEFAULT_CMAKE_FLAGS} ${EXPAT_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/expat + SOURCE_SUBDIR expat ) diff --git a/build_files/build_environment/cmake/nasm.cmake b/build_files/build_environment/cmake/nasm.cmake index 6eadfc5e4f0..37a57273bfe 100644 --- a/build_files/build_environment/cmake/nasm.cmake +++ b/build_files/build_environment/cmake/nasm.cmake @@ -22,8 +22,8 @@ ExternalProject_Add(external_nasm URL_HASH SHA256=${NASM_HASH} PREFIX ${BUILD_DIR}/nasm PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/nasm/src/external_nasm < ${PATCH_DIR}/nasm.diff - CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/nasm - BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make -j${MAKE_THREADS} + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && ./autogen.sh && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/nasm + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make -j${MAKE_THREADS} && make manpages INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/nasm/src/external_nasm/ && make install INSTALL_DIR ${LIBDIR}/nasm ) diff --git a/build_files/build_environment/cmake/opencolorio.cmake b/build_files/build_environment/cmake/opencolorio.cmake index 4ad401800d0..7622a2afdaa 100644 --- a/build_files/build_environment/cmake/opencolorio.cmake +++ b/build_files/build_environment/cmake/opencolorio.cmake @@ -18,16 +18,22 @@ set(OPENCOLORIO_EXTRA_ARGS -DOCIO_BUILD_APPS=OFF - -DOCIO_BUILD_PYGLUE=OFF + -DOCIO_BUILD_PYTHON=OFF -DOCIO_BUILD_NUKE=OFF - -DOCIO_USE_BOOST_PTR=OFF - -DOCIO_BUILD_STATIC=ON - -DOCIO_BUILD_SHARED=OFF - -DOCIO_BUILD_TRUELIGHT=OFF + -DOCIO_BUILD_JAVA=OFF + -DBUILD_SHARED_LIBS=OFF -DOCIO_BUILD_DOCS=OFF - -DOCIO_BUILD_PYGLUE=OFF - -DOCIO_BUILD_JNIGLUE=OFF - -DOCIO_STATIC_JNIGLUE=OFF + -DOCIO_BUILD_TESTS=OFF + -DOCIO_BUILD_GPU_TESTS=OFF + -DOCIO_USE_SSE=ON + + # Manually build ext packages except for pystring, which does not have + # a CMake or autotools build system that we can easily use. + -DOCIO_INSTALL_EXT_PACKAGES=MISSING + -DHalf_ROOT=${LIBDIR}/openexr + -DHalf_STATIC_LIBRARY=ON + -Dexpat_ROOT=${LIBDIR}/expat + -Dyaml-cpp_ROOT=${LIBDIR}/yamlcpp ) if(APPLE AND NOT("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) @@ -41,24 +47,7 @@ if(WIN32) set(OCIO_PATCH opencolorio_win.diff) set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} - -DOCIO_BUILD_TESTS=OFF - -DOCIO_USE_SSE=ON -DOCIO_INLINES_HIDDEN=OFF - -DOCIO_PYGLUE_LINK=OFF - -DOCIO_PYGLUE_RESPECT_ABI=OFF - -DOCIO_PYGLUE_SONAME=OFF - -DOCIO_PYGLUE_LIB_PREFIX=OFF - -DUSE_EXTERNAL_TINYXML=ON - -DTINYXML_INCLUDE_DIR=${LIBDIR}/tinyxml/include - -DTINYXML_LIBRARY=${LIBDIR}/tinyxml/lib/tinyxml${libext} - -DUSE_EXTERNAL_YAML=ON - -DYAML_CPP_FOUND=ON - -DYAML_CPP_VERSION=${YAMLCPP_VERSION} - -DUSE_EXTERNAL_LCMS=ON - -DINC_1=${LIBDIR}/tinyxml/include - -DINC_2=${LIBDIR}/yamlcpp/include - # Lie because ocio cmake is demanding boost even though it is not needed. - -DYAML_CPP_VERSION=0.5.0 ) else() set(OCIO_PATCH opencolorio.diff) @@ -72,48 +61,42 @@ ExternalProject_Add(external_opencolorio DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${OPENCOLORIO_HASH} PREFIX ${BUILD_DIR}/opencolorio - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencolorio/src/external_opencolorio < ${PATCH_DIR}/${OCIO_PATCH} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio ${DEFAULT_CMAKE_FLAGS} ${OPENCOLORIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencolorio ) -if(NOT WIN32) - add_custom_command( - OUTPUT ${LIBDIR}/opencolorio/lib/libtinyxml.a - COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libtinyxml.a ${LIBDIR}/opencolorio/lib/libtinyxml.a - COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libyaml-cpp.a ${LIBDIR}/opencolorio/lib/libyaml-cpp.a - ) - add_custom_target(external_opencolorio_extra ALL DEPENDS external_opencolorio ${LIBDIR}/opencolorio/lib/libtinyxml.a) -endif() - add_dependencies( external_opencolorio - external_boost + external_yamlcpp + external_expat + external_openexr ) if(WIN32) - add_dependencies( - external_opencolorio - external_tinyxml - external_yamlcpp - - ) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_opencolorio after_install COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/include ${HARVEST_TARGET}/opencolorio/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib/static ${HARVEST_TARGET}/opencolorio/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib ${HARVEST_TARGET}/opencolorio/lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/yamlcpp/lib/libyaml-cppmd.lib ${HARVEST_TARGET}/opencolorio/lib/libyaml-cpp.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tinyxml/lib/tinyxml.lib ${HARVEST_TARGET}/opencolorio/lib/tinyxml.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/expat/lib/libexpatMD.lib ${HARVEST_TARGET}/opencolorio/lib/libexpatMD.lib + COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/pystring.lib ${HARVEST_TARGET}/opencolorio/lib/pystring.lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opencolorio after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/static/Opencolorio.lib ${HARVEST_TARGET}/opencolorio/lib/OpencolorIO_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/Opencolorio.lib ${HARVEST_TARGET}/opencolorio/lib/OpencolorIO_d.lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/yamlcpp/lib/libyaml-cppmdd.lib ${HARVEST_TARGET}/opencolorio/lib/libyaml-cpp_d.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tinyxml/lib/tinyxml.lib ${HARVEST_TARGET}/opencolorio/lib/tinyxml_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/expat/lib/libexpatdMD.lib ${HARVEST_TARGET}/opencolorio/lib/libexpatdMD.lib + COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/pystring.lib ${HARVEST_TARGET}/opencolorio/lib/pystring_d.lib DEPENDEES install ) endif() - +else() + ExternalProject_Add_Step(external_opencolorio after_install + COMMAND cp ${LIBDIR}/yamlcpp/lib/libyaml-cpp.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${LIBDIR}/expat/lib/libexpat.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${BUILD_DIR}/opencolorio/src/external_opencolorio-build/ext/dist/lib/libpystring.a ${LIBDIR}/opencolorio/lib/ + DEPENDEES install + ) endif() diff --git a/build_files/build_environment/cmake/tinyxml.cmake b/build_files/build_environment/cmake/tinyxml.cmake deleted file mode 100644 index 763fd959d24..00000000000 --- a/build_files/build_environment/cmake/tinyxml.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# ***** END GPL LICENSE BLOCK ***** - -set(TINYXML_EXTRA_ARGS -) - -ExternalProject_Add(external_tinyxml - URL ${TINYXML_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${TINYXML_HASH} - PREFIX ${BUILD_DIR}/tinyxml - # patch taken from ocio - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/tinyxml/src/external_tinyxml < ${PATCH_DIR}/tinyxml.diff - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tinyxml ${DEFAULT_CMAKE_FLAGS} ${TINYXML_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/tinyxml -) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 76417b59bb3..3a44977e4d3 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -109,9 +109,9 @@ set(OPENCOLLADA_VERSION v1.6.68) set(OPENCOLLADA_URI https://github.com/KhronosGroup/OpenCOLLADA/archive/${OPENCOLLADA_VERSION}.tar.gz) set(OPENCOLLADA_HASH ee7dae874019fea7be11613d07567493) -set(OPENCOLORIO_VERSION 1.1.1) +set(OPENCOLORIO_VERSION 2.0.0) set(OPENCOLORIO_URI https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v${OPENCOLORIO_VERSION}.tar.gz) -set(OPENCOLORIO_HASH 23d8b9ac81599305539a5a8674b94a3d) +set(OPENCOLORIO_HASH 1a2e3478b6cd9a1549f24e1b2205e3f0) set(LLVM_VERSION 9.0.1) set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) @@ -257,9 +257,9 @@ set(YAMLCPP_VERSION 0.6.3) set(YAMLCPP_URI https://codeload.github.com/jbeder/yaml-cpp/tar.gz/yaml-cpp-${YAMLCPP_VERSION}) set(YAMLCPP_HASH b45bf1089a382e81f6b661062c10d0c2) -set(LCMS_VERSION 2.9) -set(LCMS_URI https://nchc.dl.sourceforge.net/project/lcms/lcms/${LCMS_VERSION}/lcms2-${LCMS_VERSION}.tar.gz) -set(LCMS_HASH 8de1b7724f578d2995c8fdfa35c3ad0e) +set(EXPAT_VERSION 2_2_10) +set(EXPAT_URI https://github.com/libexpat/libexpat/archive/R_${EXPAT_VERSION}.tar.gz) +set(EXPAT_HASH 7ca5f09959fcb9a57618368deb627b9f) set(PUGIXML_VERSION 1.10) set(PUGIXML_URI https://github.com/zeux/pugixml/archive/v${PUGIXML_VERSION}.tar.gz) @@ -314,8 +314,8 @@ set(MESA_URI ftp://ftp.freedesktop.org/pub/mesa/mesa-${MESA_VERSION}.tar.xz) set(MESA_HASH d60828056d77bfdbae0970f9b15fb1be) set(NASM_VERSION 2.15.02) -set(NASM_URI https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/nasm-${NASM_VERSION}.tar.xz) -set(NASM_HASH f4fd1329b1713e1ccd34b2fc121c4bcd278c9f91cc4cb205ae8fcd2e4728dd14) +set(NASM_URI https://github.com/netwide-assembler/nasm/archive/nasm-${NASM_VERSION}.tar.gz) +set(NASM_HASH aded8b796c996a486a56e0515c83e414116decc3b184d88043480b32eb0a8589) set(XR_OPENXR_SDK_VERSION 1.0.8) set(XR_OPENXR_SDK_URI https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_SDK_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/yamlcpp.cmake b/build_files/build_environment/cmake/yamlcpp.cmake index 3d3639593ad..d56a3e4a63a 100644 --- a/build_files/build_environment/cmake/yamlcpp.cmake +++ b/build_files/build_environment/cmake/yamlcpp.cmake @@ -17,13 +17,18 @@ # ***** END GPL LICENSE BLOCK ***** set(YAMLCPP_EXTRA_ARGS - -DBUILD_GMOCK=OFF -DYAML_CPP_BUILD_TESTS=OFF -DYAML_CPP_BUILD_TOOLS=OFF -DYAML_CPP_BUILD_CONTRIB=OFF - -DYAML_MSVC_SHARED_RT=ON ) +if(WIN32) + set(YAMLCPP_EXTRA_ARGS + ${YAMLCPP_EXTRA_ARGS} + -DBUILD_GMOCK=OFF + -DYAML_MSVC_SHARED_RT=ON) +endif() + ExternalProject_Add(external_yamlcpp URL ${YAMLCPP_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index da2a6535142..318da4f6183 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -454,10 +454,10 @@ TBB_FORCE_BUILD=false TBB_FORCE_REBUILD=false TBB_SKIP=false -OCIO_VERSION="1.1.1" -OCIO_VERSION_SHORT="1.1" -OCIO_VERSION_MIN="1.0" -OCIO_VERSION_MAX="1.2" +OCIO_VERSION="2.0.0" +OCIO_VERSION_SHORT="2.0" +OCIO_VERSION_MIN="2.0" +OCIO_VERSION_MAX="3.0" OCIO_FORCE_BUILD=false OCIO_FORCE_REBUILD=false OCIO_SKIP=false @@ -1787,8 +1787,8 @@ compile_OCIO() { cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst" cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" cmake_d="$cmake_d -D OCIO_BUILD_APPS=OFF" - cmake_d="$cmake_d -D OCIO_BUILD_PYGLUE=OFF" - cmake_d="$cmake_d -D STOP_ON_WARNING=OFF" + cmake_d="$cmake_d -D OCIO_BUILD_PYTHON=OFF" + cmake_d="$cmake_d -D OCIO_BUILD_GPU_TESTS=OFF" if file /bin/cp | grep -q '32-bit'; then cflags="-fPIC -m32 -march=i686" diff --git a/build_files/cmake/Modules/FindOpenColorIO.cmake b/build_files/cmake/Modules/FindOpenColorIO.cmake index 5c0ad89a0b7..21118533ebe 100644 --- a/build_files/cmake/Modules/FindOpenColorIO.cmake +++ b/build_files/cmake/Modules/FindOpenColorIO.cmake @@ -26,7 +26,8 @@ ENDIF() SET(_opencolorio_FIND_COMPONENTS OpenColorIO yaml-cpp - tinyxml + expat + pystring ) SET(_opencolorio_SEARCH_DIRS @@ -60,12 +61,23 @@ FOREACH(COMPONENT ${_opencolorio_FIND_COMPONENTS}) ENDIF() ENDFOREACH() +IF(EXISTS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h") + # Search twice, because this symbol changed between OCIO 1.x and 2.x + FILE(STRINGS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h" _opencolorio_version + REGEX "^#define OCIO_VERSION_STR[ \t].*$") + IF(NOT _opencolorio_version) + file(STRINGS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h" _opencolorio_version + REGEX "^#define OCIO_VERSION[ \t].*$") + ENDIF() + STRING(REGEX MATCHALL "[0-9]+[.0-9]+" OPENCOLORIO_VERSION ${_opencolorio_version}) +ENDIF() # handle the QUIETLY and REQUIRED arguments and set OPENCOLORIO_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenColorIO DEFAULT_MSG - _opencolorio_LIBRARIES OPENCOLORIO_INCLUDE_DIR) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenColorIO + REQUIRED_VARS _opencolorio_LIBRARIES OPENCOLORIO_INCLUDE_DIR + VERSION_VAR OPENCOLORIO_VERSION) IF(OPENCOLORIO_FOUND) SET(OPENCOLORIO_LIBRARIES ${_opencolorio_LIBRARIES}) @@ -78,6 +90,7 @@ MARK_AS_ADVANCED( OPENCOLORIO_OPENCOLORIO_LIBRARY OPENCOLORIO_TINYXML_LIBRARY OPENCOLORIO_YAML-CPP_LIBRARY + OPENCOLORIO_VERSION ) UNSET(COMPONENT) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index e51bdede34b..b95b21da946 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -297,7 +297,12 @@ if(WITH_OPENIMAGEIO) endif() if(WITH_OPENCOLORIO) - find_package(OpenColorIO) + find_package(OpenColorIO 2.0.0) + + if(NOT OPENCOLORIO_FOUND) + set(WITH_OPENCOLORIO OFF) + message(STATUS "OpenColorIO not found") + endif() endif() if(WITH_OPENVDB) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index fed70c5b8b2..f212741f0b6 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -385,7 +385,7 @@ if(WITH_OPENIMAGEIO) endif() if(WITH_OPENCOLORIO) - find_package_wrapper(OpenColorIO) + find_package_wrapper(OpenColorIO 2.0.0) set(OPENCOLORIO_LIBRARIES ${OPENCOLORIO_LIBRARIES}) set(OPENCOLORIO_LIBPATH) # TODO, remove and reference the absolute path everywhere diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 37a3eabc338..06cee51344a 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -500,7 +500,7 @@ if(WITH_OPENIMAGEIO) set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG}) set(OPENIMAGEIO_DEFINITIONS "-DUSE_TBB=0") - set(OPENCOLORIO_DEFINITIONS "-DOCIO_STATIC_BUILD") + set(OPENCOLORIO_DEFINITIONS "-DDOpenColorIO_SKIP_IMPORTS") set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe") add_definitions(-DOIIO_STATIC_DEFINE) add_definitions(-DOIIO_NO_SSE=1) @@ -538,11 +538,13 @@ if(WITH_OPENCOLORIO) set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib) set(OPENCOLORIO_LIBRARIES optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib - optimized ${OPENCOLORIO_LIBPATH}/tinyxml.lib optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib + optimized ${OPENCOLORIO_LIBPATH}/libexpatMD.lib + optimized ${OPENCOLORIO_LIBPATH}/pystring.lib debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib - debug ${OPENCOLORIO_LIBPATH}/tinyxml_d.lib debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib + debug ${OPENCOLORIO_LIBPATH}/libexpatdMD.lib + debug ${OPENCOLORIO_LIBPATH}/pystring_d.lib ) set(OPENCOLORIO_DEFINITIONS) endif() diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt index 389f913b145..c67919b375a 100644 --- a/intern/cycles/render/CMakeLists.txt +++ b/intern/cycles/render/CMakeLists.txt @@ -133,8 +133,11 @@ if(WITH_OPENCOLORIO) SYSTEM ${OPENCOLORIO_INCLUDE_DIRS} ) + list(APPEND LIB + ${OPENCOLORIO_LIBRARIES} + ) if(WIN32) - add_definitions(-DOpenColorIO_STATIC) + add_definitions(-DOpenColorIO_SKIP_IMPORTS) endif() endif() diff --git a/intern/cycles/render/colorspace.cpp b/intern/cycles/render/colorspace.cpp index 4c9e86ea278..4540793f78d 100644 --- a/intern/cycles/render/colorspace.cpp +++ b/intern/cycles/render/colorspace.cpp @@ -192,6 +192,7 @@ void ColorSpaceManager::is_builtin_colorspace(ustring colorspace, return; } + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); is_scene_linear = true; is_srgb = true; for (int i = 0; i < 256; i++) { @@ -201,10 +202,10 @@ void ColorSpaceManager::is_builtin_colorspace(ustring colorspace, float cG[3] = {0, v, 0}; float cB[3] = {0, 0, v}; float cW[3] = {v, v, v}; - processor->applyRGB(cR); - processor->applyRGB(cG); - processor->applyRGB(cB); - processor->applyRGB(cW); + device_processor->applyRGB(cR); + device_processor->applyRGB(cG); + device_processor->applyRGB(cB); + device_processor->applyRGB(cW); /* Make sure that there is no channel crosstalk. */ if (fabsf(cR[1]) > 1e-5f || fabsf(cR[2]) > 1e-5f || fabsf(cG[0]) > 1e-5f || @@ -267,6 +268,7 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, T *pixels, /* TODO: implement faster version for when we know the conversion * is a simple matrix transform between linear spaces. In that case * un-premultiply is not needed. */ + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); /* Process large images in chunks to keep temporary memory requirement down. */ const size_t chunk_size = std::min((size_t)(16 * 1024 * 1024), num_pixels); @@ -289,7 +291,7 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, T *pixels, } OCIO::PackedImageDesc desc((float *)float_pixels.data(), width, 1, 4); - processor->apply(desc); + device_processor->apply(desc); for (size_t i = 0; i < width; i++) { float4 value = float_pixels[i]; @@ -345,13 +347,14 @@ void ColorSpaceManager::to_scene_linear(ColorSpaceProcessor *processor_, const OCIO::Processor *processor = (const OCIO::Processor *)processor_; if (processor) { + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); if (channels == 3) { - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); } else if (channels == 4) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { /* Fast path for RGBA. */ - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); } else { /* Un-associate and associate alpha since color management should not @@ -363,7 +366,7 @@ void ColorSpaceManager::to_scene_linear(ColorSpaceProcessor *processor_, pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - processor->applyRGB(pixel); + device_processor->applyRGB(pixel); pixel[0] *= alpha; pixel[1] *= alpha; diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 332599be708..650587cb694 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -35,6 +35,7 @@ #include "util/util_foreach.h" #include "util/util_murmurhash.h" #include "util/util_task.h" +#include "util/util_transform.h" #ifdef WITH_OCIO # include @@ -399,39 +400,7 @@ ShaderManager::ShaderManager() update_flags = UPDATE_ALL; beckmann_table_offset = TABLE_OFFSET_INVALID; - xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f); - xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f); - xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f); - rgb_to_y = make_float3(0.2126729f, 0.7151522f, 0.0721750f); - -#ifdef WITH_OCIO - OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - if (config) { - if (config->hasRole("XYZ") && config->hasRole("scene_linear")) { - OCIO::ConstProcessorRcPtr to_rgb_processor = config->getProcessor("XYZ", "scene_linear"); - OCIO::ConstProcessorRcPtr to_xyz_processor = config->getProcessor("scene_linear", "XYZ"); - if (to_rgb_processor && to_xyz_processor) { - float r[] = {1.0f, 0.0f, 0.0f}; - float g[] = {0.0f, 1.0f, 0.0f}; - float b[] = {0.0f, 0.0f, 1.0f}; - to_xyz_processor->applyRGB(r); - to_xyz_processor->applyRGB(g); - to_xyz_processor->applyRGB(b); - rgb_to_y = make_float3(r[1], g[1], b[1]); - - float x[] = {1.0f, 0.0f, 0.0f}; - float y[] = {0.0f, 1.0f, 0.0f}; - float z[] = {0.0f, 0.0f, 1.0f}; - to_rgb_processor->applyRGB(x); - to_rgb_processor->applyRGB(y); - to_rgb_processor->applyRGB(z); - xyz_to_r = make_float3(x[0], y[0], z[0]); - xyz_to_g = make_float3(x[1], y[1], z[1]); - xyz_to_b = make_float3(x[2], y[2], z[2]); - } - } - } -#endif + init_xyz_transforms(); } ShaderManager::~ShaderManager() @@ -829,4 +798,89 @@ bool ShaderManager::need_update() const return update_flags != UPDATE_NONE; } +#ifdef WITH_OCIO +static bool to_scene_linear_transform(OCIO::ConstConfigRcPtr &config, + const char *colorspace, + Transform &to_scene_linear) +{ + OCIO::ConstProcessorRcPtr processor; + try { + processor = config->getProcessor(OCIO::ROLE_SCENE_LINEAR, colorspace); + } + catch (OCIO::Exception &exception) { + return false; + } + + if (!processor) { + return false; + } + + OCIO::ConstCPUProcessorRcPtr device_processor = processor->getDefaultCPUProcessor(); + if (!device_processor) { + return false; + } + + to_scene_linear = transform_identity(); + device_processor->applyRGB(&to_scene_linear.x.x); + device_processor->applyRGB(&to_scene_linear.y.x); + device_processor->applyRGB(&to_scene_linear.z.x); + to_scene_linear = transform_transposed_inverse(to_scene_linear); + return true; +} +#endif + +void ShaderManager::init_xyz_transforms() +{ + /* Default to ITU-BT.709 in case no appropriate transform found. */ + xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f); + xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f); + xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f); + rgb_to_y = make_float3(0.2126729f, 0.7151522f, 0.0721750f); + +#ifdef WITH_OCIO + /* Get from OpenColorO config if it has the required roles. */ + OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); + if (!(config && config->hasRole(OCIO::ROLE_SCENE_LINEAR))) { + return; + } + + Transform xyz_to_rgb; + + if (config->hasRole("aces_interchange")) { + /* Standard OpenColorIO role, defined as ACES2065-1. */ + const Transform xyz_to_aces = make_transform(1.0498110175f, + 0.0f, + -0.0000974845f, + 0.0f, + -0.4959030231f, + 1.3733130458f, + 0.0982400361f, + 0.0f, + 0.0f, + 0.0f, + 0.9912520182f, + 0.0f); + Transform aces_to_rgb; + if (!to_scene_linear_transform(config, "aces_interchange", aces_to_rgb)) { + return; + } + + xyz_to_rgb = aces_to_rgb * xyz_to_aces; + } + else if (config->hasRole("XYZ")) { + /* Custom role used before the standard existed. */ + if (!to_scene_linear_transform(config, "XYZ", xyz_to_rgb)) { + return; + } + } + + xyz_to_r = float4_to_float3(xyz_to_rgb.x); + xyz_to_g = float4_to_float3(xyz_to_rgb.y); + xyz_to_b = float4_to_float3(xyz_to_rgb.z); + + const Transform rgb_to_xyz = transform_inverse(xyz_to_rgb); + rgb_to_y = float4_to_float3(rgb_to_xyz.y); +#endif +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index 4375ef9e978..f47d64f346c 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -221,6 +221,8 @@ class ShaderManager { bool need_update() const; + void init_xyz_transforms(); + protected: ShaderManager(); diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc index a6b93ac4959..9bbc9843e9d 100644 --- a/intern/opencolorio/fallback_impl.cc +++ b/intern/opencolorio/fallback_impl.cc @@ -34,7 +34,7 @@ using std::max; enum TransformType { TRANSFORM_LINEAR_TO_SRGB, TRANSFORM_SRGB_TO_LINEAR, - TRANSFORM_MATRIX, + TRANSFORM_SCALE, TRANSFORM_EXPONENT, TRANSFORM_UNKNOWN, }; @@ -53,147 +53,72 @@ typedef struct OCIO_PackedImageDescription { } OCIO_PackedImageDescription; struct FallbackTransform { - FallbackTransform() : type(TRANSFORM_UNKNOWN), linear_transform(NULL), display_transform(NULL) + FallbackTransform() : type(TRANSFORM_UNKNOWN), scale(1.0f), exponent(1.0f) { } virtual ~FallbackTransform() { - delete linear_transform; - delete display_transform; } void applyRGB(float *pixel) { if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGB(pixel); + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; + linearrgb_to_srgb_v3_v3(pixel, pixel); - applyDisplayRGB(pixel); + + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } else if (type == TRANSFORM_SRGB_TO_LINEAR) { srgb_to_linearrgb_v3_v3(pixel, pixel); } else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; + else if (type == TRANSFORM_SCALE) { + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; } } void applyRGBA(float *pixel) { - if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGBA(pixel); - linearrgb_to_srgb_v4(pixel, pixel); - applyDisplayRGBA(pixel); - } - else if (type == TRANSFORM_SRGB_TO_LINEAR) { - srgb_to_linearrgb_v4(pixel, pixel); - } - else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); - pixel[3] = powf(max(0.0f, pixel[3]), exponent[3]); - } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - float a = pixel[3]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2] + a * matrix[3]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6] + a * matrix[7]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10] + a * matrix[11]; - pixel[3] = r * matrix[12] + g * matrix[13] + b * matrix[14] + a * matrix[15]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; - pixel[3] += offset[3]; - } - } - - void applyLinearRGB(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGB(pixel); - } - } - - void applyLinearRGBA(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGBA(pixel); - } - } - - void applyDisplayRGB(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGB(pixel); - } - } - - void applyDisplayRGBA(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGBA(pixel); - } + applyRGB(pixel); } TransformType type; - FallbackTransform *linear_transform; - FallbackTransform *display_transform; + /* Scale transform. */ + float scale; /* Exponent transform. */ - float exponent[4]; - /* Matrix transform. */ - float matrix[16]; - float offset[4]; + float exponent; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackTransform"); }; -struct FallbackGroupTransform : FallbackTransform { - ~FallbackGroupTransform() - { - for (auto transform : list) { - delete transform; - } - } - std::vector list; -}; - struct FallbackProcessor { - FallbackProcessor() : transform(NULL) + FallbackProcessor(const FallbackTransform &transform) : transform(transform) { } - ~FallbackProcessor() - { - delete transform; - } - void applyRGB(float *pixel) { - transform->applyRGB(pixel); + transform.applyRGB(pixel); } void applyRGBA(float *pixel) { - transform->applyRGBA(pixel); + transform.applyRGBA(pixel); } - FallbackTransform *transform; + FallbackTransform transform; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackProcessor"); }; @@ -403,30 +328,35 @@ OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessorWithNames(OCIO_ConstCo { OCIO_ConstColorSpaceRcPtr *cs_src = configGetColorSpace(config, srcName); OCIO_ConstColorSpaceRcPtr *cs_dst = configGetColorSpace(config, dstName); - FallbackTransform *transform = new FallbackTransform(); + FallbackTransform transform; if (cs_src == COLORSPACE_LINEAR && cs_dst == COLORSPACE_SRGB) { - transform->type = TRANSFORM_LINEAR_TO_SRGB; + transform.type = TRANSFORM_LINEAR_TO_SRGB; } else if (cs_src == COLORSPACE_SRGB && cs_dst == COLORSPACE_LINEAR) { - transform->type = TRANSFORM_SRGB_TO_LINEAR; + transform.type = TRANSFORM_SRGB_TO_LINEAR; } else { - transform->type = TRANSFORM_UNKNOWN; + transform.type = TRANSFORM_UNKNOWN; } - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = transform; - return (OCIO_ConstProcessorRcPtr *)processor; + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); } -OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessor(OCIO_ConstConfigRcPtr * /*config*/, - OCIO_ConstTransformRcPtr *transform) +OCIO_ConstCPUProcessorRcPtr *FallbackImpl::processorGetCPUProcessor( + OCIO_ConstProcessorRcPtr *processor) { - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = (FallbackTransform *)transform; - return (OCIO_ConstProcessorRcPtr *)processor; + /* Just make a copy of the processor so that we are compatible with OCIO + * which does need it as a separate object. */ + FallbackProcessor *fallback_processor = (FallbackProcessor *)processor; + return (OCIO_ConstCPUProcessorRcPtr *)new FallbackProcessor(*fallback_processor); } -void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) +{ + delete (FallbackProcessor *)(processor); +} + +void FallbackImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -441,15 +371,15 @@ void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_Pack float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img) +void FallbackImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -464,27 +394,28 @@ void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA_predivide(processor, pixel); + cpuProcessorApplyRGBA_predivide(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGB(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGB(pixel); } -void FallbackImpl::processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGBA(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGBA(pixel); } -void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); } else { float alpha, inv_alpha; @@ -496,7 +427,7 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); pixel[0] *= alpha; pixel[1] *= alpha; @@ -504,9 +435,9 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces } } -void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) +void FallbackImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) { - delete (FallbackProcessor *)(processor); + delete (FallbackProcessor *)(cpu_processor); } const char *FallbackImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -530,54 +461,20 @@ const char *FallbackImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr * /*cs*/ return ""; } -OCIO_DisplayTransformRcPtr *FallbackImpl::createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *FallbackImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr * /*config*/, + const char * /*input*/, + const char * /*view*/, + const char * /*display*/, + const char * /*look*/, + const float scale, + const float exponent) { - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_LINEAR_TO_SRGB; - return (OCIO_DisplayTransformRcPtr *)transform; -} + FallbackTransform transform; + transform.type = TRANSFORM_LINEAR_TO_SRGB; + transform.scale = scale; + transform.exponent = exponent; -void FallbackImpl::displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplay(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetView(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->display_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->linear_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*looks*/) -{ -} - -void FallbackImpl::displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr * /*dt*/, - bool /*enabled*/) -{ -} - -void FallbackImpl::displayTransformRelease(OCIO_DisplayTransformRcPtr * /*dt*/) -{ + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); } OCIO_PackedImageDesc *FallbackImpl::createOCIO_PackedImageDesc(float *data, @@ -605,127 +502,6 @@ void FallbackImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) MEM_freeN(id); } -OCIO_GroupTransformRcPtr *FallbackImpl::createGroupTransform(void) -{ - FallbackTransform *transform = new FallbackGroupTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_GroupTransformRcPtr *)transform; -} - -void FallbackImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr * /*gt*/, - const bool /*forward */) -{ -} - -void FallbackImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, - OCIO_ConstTransformRcPtr *transform) -{ - FallbackGroupTransform *group = (FallbackGroupTransform *)gt; - group->list.push_back((FallbackTransform *)transform); -} - -void FallbackImpl::groupTransformRelease(OCIO_GroupTransformRcPtr * /*gt*/) -{ -} - -OCIO_ColorSpaceTransformRcPtr *FallbackImpl::createColorSpaceTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_ColorSpaceTransformRcPtr *)transform; -} - -void FallbackImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr * /*ct*/, - const char * /*name*/) -{ -} - -void FallbackImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr * /*ct*/) -{ -} - -OCIO_ExponentTransformRcPtr *FallbackImpl::createExponentTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_EXPONENT; - return (OCIO_ExponentTransformRcPtr *)transform; -} - -void FallbackImpl::exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, - const float *exponent) -{ - FallbackTransform *transform = (FallbackTransform *)et; - copy_v4_v4(transform->exponent, exponent); -} - -void FallbackImpl::exponentTransformRelease(OCIO_ExponentTransformRcPtr * /*et*/) -{ -} - -OCIO_MatrixTransformRcPtr *FallbackImpl::createMatrixTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_MATRIX; - return (OCIO_MatrixTransformRcPtr *)transform; -} - -void FallbackImpl::matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - FallbackTransform *transform = (FallbackTransform *)mt; - copy_m4_m4((float(*)[4])transform->matrix, (float(*)[4])m44); - copy_v4_v4(transform->offset, offset4); -} - -void FallbackImpl::matrixTransformRelease(OCIO_MatrixTransformRcPtr * /*mt*/) -{ -} - -void FallbackImpl::matrixTransformScale(float *m44, float *offset4, const float *scale4) -{ - if (scale4 == NULL) { - return; - } - if (m44 != NULL) { - memset(m44, 0, 16 * sizeof(float)); - m44[0] = scale4[0]; - m44[5] = scale4[1]; - m44[10] = scale4[2]; - m44[15] = scale4[3]; - } - if (offset4 != NULL) { - offset4[0] = 0.0f; - offset4[1] = 0.0f; - offset4[2] = 0.0f; - offset4[3] = 0.0f; - } -} - -bool FallbackImpl::supportGLSLDraw(void) -{ - return false; -} - -bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState ** /*state_r*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_scene_to_ui*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_ui_to_display*/, - OCIO_CurveMappingSettings * /*curve_mapping_settings*/, - float /*dither*/, - bool /*predivide*/, - bool /*overlay*/) -{ - return false; -} - -void FallbackImpl::finishGLSLDraw(OCIO_GLSLDrawState * /*state*/) -{ -} - -void FallbackImpl::freeGLState(struct OCIO_GLSLDrawState * /*state_r*/) -{ -} - const char *FallbackImpl::getVersionString(void) { return "fallback"; diff --git a/intern/opencolorio/gpu_shader_display_transform.glsl b/intern/opencolorio/gpu_shader_display_transform.glsl index 61da755f02f..ca0d2566ed1 100644 --- a/intern/opencolorio/gpu_shader_display_transform.glsl +++ b/intern/opencolorio/gpu_shader_display_transform.glsl @@ -1,17 +1,18 @@ /* Blender OpenColorIO implementation */ -uniform sampler1D curve_mapping_texture; uniform sampler2D image_texture; uniform sampler2D overlay_texture; -uniform sampler3D lut3d_texture; -uniform sampler3D lut3d_display_texture; uniform float dither; +uniform float scale; +uniform float exponent; uniform bool predivide; -uniform bool curve_mapping; uniform bool overlay; -layout(std140) uniform OCIO_GLSLCurveMappingParameters +#ifdef USE_CURVE_MAPPING +uniform sampler1D curve_mapping_texture; + +layout(std140) uniform OCIO_GPUCurveMappingParameters { /* Curve mapping parameters * @@ -114,6 +115,7 @@ vec4 curvemapping_evaluate_premulRGBF(vec4 col) result.a = col.a; return result; } +#endif /* USE_CURVE_MAPPING */ /* Using a triangle distribution which gives a more final uniform noise. * See Banding in Games:A Noisy Rant(revision 5) Mikkel Gjøl, Playdead (slide 27) */ @@ -145,9 +147,9 @@ vec4 apply_dither(vec4 col, vec2 uv) vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv) { - if (curve_mapping) { - col = curvemapping_evaluate_premulRGBF(col); - } +#ifdef USE_CURVE_MAPPING + col = curvemapping_evaluate_premulRGBF(col); +#endif if (predivide) { if (col.a > 0.0 && col.a < 1.0) { @@ -160,15 +162,31 @@ vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv) * for straight alpha at this moment */ - col = OCIO_to_display_linear_with_look(col, lut3d_texture); + /* Convert to scene linear (usually a no-op). */ + col = OCIO_to_scene_linear(col); + /* Apply exposure in scene linear. */ + col.rgb *= scale; + + /* Convert to display space. */ + col = OCIO_to_display(col); + + /* Blend with overlay in UI colorspace. + * + * UI colorspace here refers to the display linear color space, + * i.e: The linear color space w.r.t. display chromaticity and radiometry. + * We separate the colormanagement process into two steps to be able to + * merge UI using alpha blending in the correct color space. */ if (overlay) { + col.rgb = pow(col.rgb, vec3(exponent * 2.2)); col = clamp(col, 0.0, 1.0); col *= 1.0 - col_overlay.a; col += col_overlay; /* Assumed unassociated alpha. */ + col.rgb = pow(col.rgb, vec3(1.0 / 2.2)); + } + else { + col.rgb = pow(col.rgb, vec3(exponent)); } - - col = OCIO_to_display_encoded(col, lut3d_display_texture); if (dither > 0.0) { col = apply_dither(col, noise_uv); @@ -189,4 +207,4 @@ void main() vec2 noise_uv = round_to_pixel(image_texture, texCoord_interp.st); fragColor = OCIO_ProcessColor(col, col_overlay, noise_uv); -} \ No newline at end of file +} diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc index 84c36de364c..a7416f82b91 100644 --- a/intern/opencolorio/ocio_capi.cc +++ b/intern/opencolorio/ocio_capi.cc @@ -194,40 +194,45 @@ OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr return impl->configGetProcessorWithNames(config, srcName, dstName); } -OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) +void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *processor) { - return impl->configGetProcessor(config, transform); + impl->processorRelease(processor); } -void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor) { - impl->processorApply(processor, img); + return impl->processorGetCPUProcessor(processor); } -void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img) { - impl->processorApply_predivide(processor, img); + impl->cpuProcessorApply(cpu_processor, img); } -void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { - impl->processorApplyRGB(processor, pixel); + impl->cpuProcessorApply_predivide(cpu_processor, img); } -void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - impl->processorApplyRGBA(processor, pixel); + impl->cpuProcessorApplyRGB(cpu_processor, pixel); } -void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - impl->processorApplyRGBA_predivide(processor, pixel); + impl->cpuProcessorApplyRGBA(cpu_processor, pixel); } -void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p) +void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *processor, float *pixel) { - impl->processorRelease(p); + impl->cpuProcessorApplyRGBA_predivide(processor, pixel); +} + +void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) +{ + impl->cpuProcessorRelease(cpu_processor); } const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -245,49 +250,15 @@ const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) return impl->colorSpaceGetFamily(cs); } -OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) { - return impl->createDisplayTransform(); -} - -void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetInputColorSpaceName(dt, name); -} - -void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetDisplay(dt, name); -} - -void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - impl->displayTransformSetView(dt, name); -} - -void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t) -{ - impl->displayTransformSetDisplayCC(dt, t); -} - -void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t) -{ - impl->displayTransformSetLinearCC(dt, t); -} - -void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks) -{ - impl->displayTransformSetLooksOverride(dt, looks); -} - -void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled) -{ - impl->displayTransformSetLooksOverrideEnabled(dt, enabled); -} - -void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) -{ - impl->displayTransformRelease(dt); + return impl->createDisplayProcessor(config, input, view, display, look, scale, exponent); } OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, @@ -307,108 +278,44 @@ void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) impl->OCIO_PackedImageDescRelease(id); } -OCIO_GroupTransformRcPtr *OCIO_createGroupTransform(void) +bool OCIO_supportGPUShader() { - return impl->createGroupTransform(); + return impl->supportGPUShader(); } -void OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) +bool OCIO_gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay) { - impl->groupTransformSetDirection(gt, forward); + return impl->gpuDisplayShaderBind(config, + input, + view, + display, + look, + curve_mapping_settings, + scale, + exponent, + dither, + use_predivide, + use_overlay); } -void OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr) +void OCIO_gpuDisplayShaderUnbind(void) { - impl->groupTransformPushBack(gt, tr); + impl->gpuDisplayShaderUnbind(); } -void OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr *gt) +void OCIO_gpuCacheFree(void) { - impl->groupTransformRelease(gt); -} - -OCIO_ColorSpaceTransformRcPtr *OCIO_createColorSpaceTransform(void) -{ - return impl->createColorSpaceTransform(); -} - -void OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) -{ - impl->colorSpaceTransformSetSrc(ct, name); -} - -void OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) -{ - impl->colorSpaceTransformRelease(ct); -} - -OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void) -{ - return impl->createExponentTransform(); -} - -void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent) -{ - impl->exponentTransformSetValue(et, exponent); -} - -void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) -{ - impl->exponentTransformRelease(et); -} - -OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void) -{ - return impl->createMatrixTransform(); -} - -void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - impl->matrixTransformSetValue(mt, m44, offset4); -} - -void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) -{ - impl->matrixTransformRelease(mt); -} - -void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4f) -{ - impl->matrixTransformScale(m44, offset4, scale4f); -} - -int OCIO_supportGLSLDraw(void) -{ - return (int)impl->supportGLSLDraw(); -} - -int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay) -{ - return (int)impl->setupGLSLDraw(state_r, - ocio_processor_scene_to_ui, - ocio_processor_ui_to_display, - curve_mapping_settings, - dither, - predivide, - overlay); -} - -void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state) -{ - impl->finishGLSLDraw(state); -} - -void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state) -{ - impl->freeGLState(state); + impl->gpuCacheFree(); } const char *OCIO_getVersionString(void) diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h index 57799222788..8b319d4ed68 100644 --- a/intern/opencolorio/ocio_capi.h +++ b/intern/opencolorio/ocio_capi.h @@ -24,7 +24,7 @@ extern "C" { #endif -struct OCIO_GLSLDrawState; +typedef struct OCIO_GPUShader OCIO_GPUShader; #define OCIO_DECLARE_HANDLE(name) \ typedef struct name##__ { \ @@ -42,14 +42,9 @@ struct OCIO_GLSLDrawState; OCIO_DECLARE_HANDLE(OCIO_ConstConfigRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstColorSpaceRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstProcessorRcPtr); +OCIO_DECLARE_HANDLE(OCIO_ConstCPUProcessorRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstContextRcPtr); OCIO_DECLARE_HANDLE(OCIO_PackedImageDesc); -OCIO_DECLARE_HANDLE(OCIO_DisplayTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ConstTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ColorSpaceTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_ExponentTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_MatrixTransformRcPtr); -OCIO_DECLARE_HANDLE(OCIO_GroupTransformRcPtr); OCIO_DECLARE_HANDLE(OCIO_ConstLookRcPtr); /* Standard XYZ to linear sRGB transform, for fallback. */ @@ -163,32 +158,28 @@ void OCIO_lookRelease(OCIO_ConstLookRcPtr *look); OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); -OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); +void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *cpu_processor); -void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); -void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); -void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); -void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); -void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - -void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p); +OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); +void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); +void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); +void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *processor); const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); -OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void); -void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); -void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et); -void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et); -void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); -void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); -void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); +OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, long width, @@ -200,37 +191,20 @@ OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); -OCIO_GroupTransformRcPtr *OCIO_createGroupTransform(void); -void OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); -void OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr); -void OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - -OCIO_ColorSpaceTransformRcPtr *OCIO_createColorSpaceTransform(void); -void OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); -void OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - -OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void); -void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); -void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - -OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void); -void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); -void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - -void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4); - -int OCIO_supportGLSLDraw(void); -int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); -void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state); -void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state); +bool OCIO_supportGPUShader(void); +bool OCIO_gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay); +void OCIO_gpuDisplayShaderUnbind(void); +void OCIO_gpuCacheFree(void); const char *OCIO_getVersionString(void); int OCIO_getVersionHex(void); diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index cf3571b4662..69a8d8b17af 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -17,6 +17,7 @@ * All rights reserved. */ +#include #include #include #include @@ -35,7 +36,9 @@ using namespace OCIO_NAMESPACE; #include "MEM_guardedalloc.h" +#include "BLI_math.h" #include "BLI_math_color.h" +#include "BLI_math_matrix.h" #include "ocio_impl.h" @@ -267,7 +270,7 @@ const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *conf const char *view) { try { - return (*(ConstConfigRcPtr *)config)->getDisplayColorSpaceName(display, view); + return (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display, view); } catch (Exception &exception) { OCIO_reportException(exception); @@ -279,13 +282,46 @@ const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *conf void OCIOImpl::configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb) { try { - (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb); + double rgb_double[3]; + (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb_double); + rgb[0] = rgb_double[0]; + rgb[1] = rgb_double[1]; + rgb[2] = rgb_double[2]; } catch (Exception &exception) { OCIO_reportException(exception); } } +static bool to_scene_linear_matrix(ConstConfigRcPtr &config, + const char *colorspace, + float to_scene_linear[3][3]) +{ + ConstProcessorRcPtr processor; + try { + processor = config->getProcessor(colorspace, ROLE_SCENE_LINEAR); + } + catch (Exception &exception) { + OCIO_reportException(exception); + return false; + } + + if (!processor) { + return false; + } + + ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor(); + if (!cpu_processor) { + return false; + } + + unit_m3(to_scene_linear); + cpu_processor->applyRGB(to_scene_linear[0]); + cpu_processor->applyRGB(to_scene_linear[1]); + cpu_processor->applyRGB(to_scene_linear[2]); + return true; +} + void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rgb[3][3]) { ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_); @@ -293,24 +329,25 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg /* Default to ITU-BT.709 in case no appropriate transform found. */ memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB)); - /* Auto estimate from XYZ and scene_linear roles, assumed to be a linear transform. */ - if (config->hasRole("XYZ") && config->hasRole("scene_linear")) { - ConstProcessorRcPtr to_rgb_processor = config->getProcessor("XYZ", "scene_linear"); - if (to_rgb_processor) { - xyz_to_rgb[0][0] = 1.0f; - xyz_to_rgb[0][1] = 0.0f; - xyz_to_rgb[0][2] = 0.0f; - xyz_to_rgb[1][0] = 0.0f; - xyz_to_rgb[1][1] = 1.0f; - xyz_to_rgb[1][2] = 0.0f; - xyz_to_rgb[2][0] = 0.0f; - xyz_to_rgb[2][1] = 0.0f; - xyz_to_rgb[2][2] = 1.0f; - to_rgb_processor->applyRGB(xyz_to_rgb[0]); - to_rgb_processor->applyRGB(xyz_to_rgb[1]); - to_rgb_processor->applyRGB(xyz_to_rgb[2]); + /* Get from OpenColorO config if it has the required roles. */ + if (!config->hasRole(ROLE_SCENE_LINEAR)) { + return; + } + + if (config->hasRole("aces_interchange")) { + /* Standard OpenColorIO role, defined as ACES2065-1. */ + const float xyz_to_aces[3][3] = {{1.0498110175f, -0.4959030231f, 0.0f}, + {0.0f, 1.3733130458f, 0.0f}, + {-0.0000974845f, 0.0982400361f, 0.9912520182f}}; + float aces_to_rgb[3][3]; + if (to_scene_linear_matrix(config, "aces_interchange", aces_to_rgb)) { + mul_m3_m3m3(xyz_to_rgb, aces_to_rgb, xyz_to_aces); } } + else if (config->hasRole("XYZ")) { + /* Custom role used before the standard existed. */ + to_scene_linear_matrix(config, "XYZ", xyz_to_rgb); + } } int OCIOImpl::configGetNumLooks(OCIO_ConstConfigRcPtr *config) @@ -431,6 +468,8 @@ void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_, return; } + ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor(); + is_scene_linear = true; is_srgb = true; for (int i = 0; i < 256; i++) { @@ -440,10 +479,10 @@ void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_, float cG[3] = {0, v, 0}; float cB[3] = {0, 0, v}; float cW[3] = {v, v, v}; - processor->applyRGB(cR); - processor->applyRGB(cG); - processor->applyRGB(cB); - processor->applyRGB(cW); + cpu_processor->applyRGB(cR); + cpu_processor->applyRGB(cG); + cpu_processor->applyRGB(cB); + cpu_processor->applyRGB(cW); /* Make sure that there is no channel crosstalk. */ if (fabsf(cR[1]) > 1e-5f || fabsf(cR[2]) > 1e-5f || fabsf(cG[0]) > 1e-5f || @@ -485,62 +524,57 @@ OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessorWithNames(OCIO_ConstConfig const char *srcName, const char *dstName) { - ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); + ConstProcessorRcPtr *processor = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); try { - *p = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName); + *processor = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName); - if (*p) - return (OCIO_ConstProcessorRcPtr *)p; + if (*processor) + return (OCIO_ConstProcessorRcPtr *)processor; } catch (Exception &exception) { OCIO_reportException(exception); } - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr); return 0; } -OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) +void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) { - ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); - - try { - *p = (*(ConstConfigRcPtr *)config)->getProcessor(*(ConstTransformRcPtr *)transform); - - if (*p) - return (OCIO_ConstProcessorRcPtr *)p; - } - catch (Exception &exception) { - OCIO_reportException(exception); - } - - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); - - return NULL; + OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr); } -void OCIOImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +OCIO_ConstCPUProcessorRcPtr *OCIOImpl::processorGetCPUProcessor( + OCIO_ConstProcessorRcPtr *processor) +{ + ConstCPUProcessorRcPtr *cpu_processor = OBJECT_GUARDED_NEW(ConstCPUProcessorRcPtr); + *cpu_processor = (*(ConstProcessorRcPtr *)processor)->getDefaultCPUProcessor(); + return (OCIO_ConstCPUProcessorRcPtr *)cpu_processor; +} + +void OCIOImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { try { - (*(ConstProcessorRcPtr *)processor)->apply(*(PackedImageDesc *)img); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*(PackedImageDesc *)img); } catch (Exception &exception) { OCIO_reportException(exception); } } -void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img_) +void OCIOImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img_) { try { PackedImageDesc *img = (PackedImageDesc *)img_; int channels = img->getNumChannels(); if (channels == 4) { - float *pixels = img->getData(); + assert(img->isFloat()); + float *pixels = (float *)img->getData(); int width = img->getWidth(); int height = img->getHeight(); @@ -549,12 +583,12 @@ void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, for (int x = 0; x < width; x++) { float *pixel = pixels + 4 * (y * width + x); - processorApplyRGBA_predivide(processor, pixel); + cpuProcessorApplyRGBA_predivide(cpu_processor, pixel); } } } else { - (*(ConstProcessorRcPtr *)processor)->apply(*img); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*img); } } catch (Exception &exception) { @@ -562,20 +596,21 @@ void OCIOImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, } } -void OCIOImpl::processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - (*(ConstProcessorRcPtr *)processor)->applyRGB(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGB(pixel); } -void OCIOImpl::processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); } -void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void OCIOImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); } else { float alpha, inv_alpha; @@ -587,7 +622,7 @@ void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - (*(ConstProcessorRcPtr *)processor)->applyRGBA(pixel); + (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel); pixel[0] *= alpha; pixel[1] *= alpha; @@ -595,9 +630,9 @@ void OCIOImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, } } -void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *p) +void OCIOImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) { - OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + OBJECT_GUARDED_DELETE(cpu_processor, ConstCPUProcessorRcPtr); } const char *OCIOImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -615,57 +650,85 @@ const char *OCIOImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) return (*(ConstColorSpaceRcPtr *)cs)->getFamily(); } -OCIO_DisplayTransformRcPtr *OCIOImpl::createDisplayTransform(void) +OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr *config_, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) + { - DisplayTransformRcPtr *dt = OBJECT_GUARDED_NEW(DisplayTransformRcPtr); + ConstConfigRcPtr config = *(ConstConfigRcPtr *)config_; + GroupTransformRcPtr group = GroupTransform::Create(); - *dt = DisplayTransform::Create(); + /* Exposure. */ + if (scale != 1.0f) { + /* Always apply exposure in scene linear. */ + ColorSpaceTransformRcPtr ct = ColorSpaceTransform::Create(); + ct->setSrc(input); + ct->setDst(ROLE_SCENE_LINEAR); + group->appendTransform(ct); - return (OCIO_DisplayTransformRcPtr *)dt; -} + /* Make further transforms aware of the color space change. */ + input = ROLE_SCENE_LINEAR; -void OCIOImpl::displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, - const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setInputColorSpaceName(name); -} + /* Apply scale. */ + MatrixTransformRcPtr mt = MatrixTransform::Create(); + const double matrix[16] = { + scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, 1.0}; + mt->setMatrix(matrix); + group->appendTransform(mt); + } -void OCIOImpl::displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setDisplay(name); -} + /* Add look transform. */ + const bool use_look = (strlen(look) != 0); + if (use_look) { + const char *look_output = LookTransform::GetLooksResultColorSpace( + config, config->getCurrentContext(), look); -void OCIOImpl::displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) -{ - (*(DisplayTransformRcPtr *)dt)->setView(name); -} + LookTransformRcPtr lt = LookTransform::Create(); + lt->setSrc(input); + lt->setDst(look_output); + lt->setLooks(look); + group->appendTransform(lt); -void OCIOImpl::displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *t) -{ - (*(DisplayTransformRcPtr *)dt)->setDisplayCC(*(ConstTransformRcPtr *)t); -} + /* Make further transforms aware of the color space change. */ + input = look_output; + } -void OCIOImpl::displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *t) -{ - (*(DisplayTransformRcPtr *)dt)->setLinearCC(*(ConstTransformRcPtr *)t); -} + /* Add view and display transform. */ + DisplayViewTransformRcPtr dvt = DisplayViewTransform::Create(); + dvt->setSrc(input); + dvt->setLooksBypass(use_look); + dvt->setView(view); + dvt->setDisplay(display); + group->appendTransform(dvt); -void OCIOImpl::displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks) -{ - (*(DisplayTransformRcPtr *)dt)->setLooksOverride(looks); -} + /* Gamma. */ + if (exponent != 1.0f) { + ExponentTransformRcPtr et = ExponentTransform::Create(); + const double value[4] = {exponent, exponent, exponent, 1.0}; + et->setValue(value); + group->appendTransform(et); + } -void OCIOImpl::displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, - bool enabled) -{ - (*(DisplayTransformRcPtr *)dt)->setLooksOverrideEnabled(enabled); -} + /* Create processor from transform. This is the moment were OCIO validates + * the entire transform, no need to check for the validity of inputs above. */ + ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr); -void OCIOImpl::displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) -{ - OBJECT_GUARDED_DELETE((DisplayTransformRcPtr *)dt, DisplayTransformRcPtr); + try { + *p = config->getProcessor(group); + + if (*p) + return (OCIO_ConstProcessorRcPtr *)p; + } + catch (Exception &exception) { + OCIO_reportException(exception); + } + + OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr); + return NULL; } OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(float *data, @@ -678,8 +741,14 @@ OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(float *data, { try { void *mem = MEM_mallocN(sizeof(PackedImageDesc), __func__); - PackedImageDesc *id = new (mem) PackedImageDesc( - data, width, height, numChannels, chanStrideBytes, xStrideBytes, yStrideBytes); + PackedImageDesc *id = new (mem) PackedImageDesc(data, + width, + height, + numChannels, + BIT_DEPTH_F32, + chanStrideBytes, + xStrideBytes, + yStrideBytes); return (OCIO_PackedImageDesc *)id; } @@ -695,96 +764,6 @@ void OCIOImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) OBJECT_GUARDED_DELETE((PackedImageDesc *)id, PackedImageDesc); } -OCIO_GroupTransformRcPtr *OCIOImpl::createGroupTransform(void) -{ - GroupTransformRcPtr *gt = OBJECT_GUARDED_NEW(GroupTransformRcPtr); - - *gt = GroupTransform::Create(); - - return (OCIO_GroupTransformRcPtr *)gt; -} - -void OCIOImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) -{ - TransformDirection dir = forward ? TRANSFORM_DIR_FORWARD : TRANSFORM_DIR_INVERSE; - (*(GroupTransformRcPtr *)gt)->setDirection(dir); -} - -void OCIOImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr) -{ - (*(GroupTransformRcPtr *)gt)->push_back(*(ConstTransformRcPtr *)tr); -} - -void OCIOImpl::groupTransformRelease(OCIO_GroupTransformRcPtr *gt) -{ - OBJECT_GUARDED_DELETE((GroupTransformRcPtr *)gt, GroupTransformRcPtr); -} - -OCIO_ColorSpaceTransformRcPtr *OCIOImpl::createColorSpaceTransform(void) -{ - ColorSpaceTransformRcPtr *ct = OBJECT_GUARDED_NEW(ColorSpaceTransformRcPtr); - - *ct = ColorSpaceTransform::Create(); - (*ct)->setDirection(TRANSFORM_DIR_FORWARD); - - return (OCIO_ColorSpaceTransformRcPtr *)ct; -} - -void OCIOImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) -{ - (*(ColorSpaceTransformRcPtr *)ct)->setSrc(name); -} - -void OCIOImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) -{ - OBJECT_GUARDED_DELETE((ColorSpaceTransformRcPtr *)ct, ColorSpaceTransformRcPtr); -} - -OCIO_ExponentTransformRcPtr *OCIOImpl::createExponentTransform(void) -{ - ExponentTransformRcPtr *et = OBJECT_GUARDED_NEW(ExponentTransformRcPtr); - - *et = ExponentTransform::Create(); - - return (OCIO_ExponentTransformRcPtr *)et; -} - -void OCIOImpl::exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent) -{ - (*(ExponentTransformRcPtr *)et)->setValue(exponent); -} - -void OCIOImpl::exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) -{ - OBJECT_GUARDED_DELETE((ExponentTransformRcPtr *)et, ExponentTransformRcPtr); -} - -OCIO_MatrixTransformRcPtr *OCIOImpl::createMatrixTransform(void) -{ - MatrixTransformRcPtr *mt = OBJECT_GUARDED_NEW(MatrixTransformRcPtr); - - *mt = MatrixTransform::Create(); - - return (OCIO_MatrixTransformRcPtr *)mt; -} - -void OCIOImpl::matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - (*(MatrixTransformRcPtr *)mt)->setValue(m44, offset4); -} - -void OCIOImpl::matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) -{ - OBJECT_GUARDED_DELETE((MatrixTransformRcPtr *)mt, MatrixTransformRcPtr); -} - -void OCIOImpl::matrixTransformScale(float *m44, float *offset4, const float *scale4f) -{ - MatrixTransform::Scale(m44, offset4, scale4f); -} - const char *OCIOImpl::getVersionString(void) { return GetVersion(); diff --git a/intern/opencolorio/ocio_impl.h b/intern/opencolorio/ocio_impl.h index 3ffc0a4a475..0c759a35e15 100644 --- a/intern/opencolorio/ocio_impl.h +++ b/intern/opencolorio/ocio_impl.h @@ -76,36 +76,30 @@ class IOCIOImpl { virtual OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName) = 0; - virtual OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform) = 0; + virtual void processorRelease(OCIO_ConstProcessorRcPtr *processor) = 0; - virtual void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) = 0; - virtual void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img) = 0; - virtual void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - virtual void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - virtual void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0; - - virtual void processorRelease(OCIO_ConstProcessorRcPtr *p) = 0; + virtual OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *p) = 0; + virtual void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) = 0; + virtual void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) = 0; + virtual void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0; + virtual void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0; + virtual void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) = 0; + virtual void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) = 0; virtual const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) = 0; virtual const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs) = 0; virtual const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) = 0; - virtual OCIO_DisplayTransformRcPtr *createDisplayTransform(void) = 0; - virtual void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, - const char *name) = 0; - virtual void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0; - virtual void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0; - virtual void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) = 0; - virtual void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) = 0; - virtual void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, - const char *looks) = 0; - virtual void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, - bool enabled) = 0; - virtual void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) = 0; + virtual OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent) = 0; virtual OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -117,39 +111,31 @@ class IOCIOImpl { virtual void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p) = 0; - virtual OCIO_GroupTransformRcPtr *createGroupTransform(void) = 0; - virtual void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward) = 0; - virtual void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, - OCIO_ConstTransformRcPtr *transform) = 0; - virtual void groupTransformRelease(OCIO_GroupTransformRcPtr *gt) = 0; - - virtual OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void) = 0; - virtual void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name) = 0; - virtual void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct) = 0; - - virtual OCIO_ExponentTransformRcPtr *createExponentTransform(void) = 0; - virtual void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, - const float *exponent) = 0; - virtual void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) = 0; - - virtual OCIO_MatrixTransformRcPtr *createMatrixTransform(void) = 0; - virtual void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) = 0; - virtual void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) = 0; - - virtual void matrixTransformScale(float *m44, float *offset4, const float *scale4) = 0; - - virtual bool supportGLSLDraw(void) = 0; - virtual bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay) = 0; - virtual void finishGLSLDraw(struct OCIO_GLSLDrawState *state) = 0; - virtual void freeGLState(struct OCIO_GLSLDrawState *state_r) = 0; + /* Optional GPU support. */ + virtual bool supportGPUShader() + { + return false; + } + virtual bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr * /*config*/, + const char * /*input*/, + const char * /*view*/, + const char * /*display*/, + const char * /*look*/, + OCIO_CurveMappingSettings * /*curve_mapping_settings*/, + const float /*scale*/, + const float /*exponent*/, + const float /*dither*/, + const bool /*use_predivide*/, + const bool /*use_overlay*/) + { + return false; + } + virtual void gpuDisplayShaderUnbind(void) + { + } + virtual void gpuCacheFree(void) + { + } virtual const char *getVersionString(void) = 0; virtual int getVersionHex(void) = 0; @@ -206,30 +192,28 @@ class FallbackImpl : public IOCIOImpl { OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); - OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); + void processorRelease(OCIO_ConstProcessorRcPtr *processor); - void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - - void processorRelease(OCIO_ConstProcessorRcPtr *p); + OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); + void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); + void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor); const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); - OCIO_DisplayTransformRcPtr *createDisplayTransform(void); - void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); - void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); - void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); + OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -241,38 +225,6 @@ class FallbackImpl : public IOCIOImpl { void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); - OCIO_GroupTransformRcPtr *createGroupTransform(void); - void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); - void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *transform); - void groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - - OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void); - void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); - void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - - OCIO_ExponentTransformRcPtr *createExponentTransform(void); - void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); - void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - - OCIO_MatrixTransformRcPtr *createMatrixTransform(void); - void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); - void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - - void matrixTransformScale(float *m44, float *offset4, const float *scale4); - - bool supportGLSLDraw(void); - bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); - void finishGLSLDraw(struct OCIO_GLSLDrawState *state); - void freeGLState(struct OCIO_GLSLDrawState *state_r); - const char *getVersionString(void); int getVersionHex(void); }; @@ -327,30 +279,28 @@ class OCIOImpl : public IOCIOImpl { OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName); - OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, - OCIO_ConstTransformRcPtr *transform); + void processorRelease(OCIO_ConstProcessorRcPtr *processor); - void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img); - void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel); - void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel); - - void processorRelease(OCIO_ConstProcessorRcPtr *p); + OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); + void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img); + void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); + void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor); const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs); const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs); - OCIO_DisplayTransformRcPtr *createDisplayTransform(void); - void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name); - void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et); - void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks); - void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled); - void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt); + OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + const float scale, + const float exponent); OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, @@ -362,37 +312,20 @@ class OCIOImpl : public IOCIOImpl { void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p); - OCIO_GroupTransformRcPtr *createGroupTransform(void); - void groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward); - void groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *transform); - void groupTransformRelease(OCIO_GroupTransformRcPtr *gt); - - OCIO_ColorSpaceTransformRcPtr *createColorSpaceTransform(void); - void colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name); - void colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct); - - OCIO_ExponentTransformRcPtr *createExponentTransform(void); - void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent); - void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et); - - OCIO_MatrixTransformRcPtr *createMatrixTransform(void); - void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4); - void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt); - - void matrixTransformScale(float *m44, float *offset4, const float *scale4); - - bool supportGLSLDraw(void); - bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool predivide, - bool overlay); - void finishGLSLDraw(struct OCIO_GLSLDrawState *state); - void freeGLState(struct OCIO_GLSLDrawState *state_r); + bool supportGPUShader(); + bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay); + void gpuDisplayShaderUnbind(void); + void gpuCacheFree(void); const char *getVersionString(void); int getVersionHex(void); diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index 0213646345c..841f1386af1 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -31,8 +31,10 @@ */ #include +#include #include #include +#include #ifdef _MSC_VER # pragma warning(push) @@ -53,24 +55,24 @@ using namespace OCIO_NAMESPACE; #include "ocio_impl.h" -static const int LUT3D_EDGE_SIZE = 64; -static const int LUT3D_TEXTURE_SIZE = sizeof(float) * 3 * LUT3D_EDGE_SIZE * LUT3D_EDGE_SIZE * - LUT3D_EDGE_SIZE; -static const int SHADER_CACHE_SIZE = 4; - -#define UBO_BIND_LOC 0 - extern "C" char datatoc_gpu_shader_display_transform_glsl[]; extern "C" char datatoc_gpu_shader_display_transform_vertex_glsl[]; /* **** OpenGL drawing routines using GLSL for color space transform ***** */ +enum OCIO_GPUTextureSlots { + TEXTURE_SLOT_IMAGE = 0, + TEXTURE_SLOT_OVERLAY = 1, + TEXTURE_SLOT_CURVE_MAPPING = 2, + TEXTURE_SLOT_LUTS_OFFSET = 3, +}; + /* Curve mapping parameters * * See documentation for OCIO_CurveMappingSettings to get fields descriptions. * (this ones pretty much copies stuff from C structure.) */ -struct OCIO_GLSLCurveMappingParameters { +struct OCIO_GPUCurveMappingParameters { float curve_mapping_mintable[4]; float curve_mapping_range[4]; float curve_mapping_ext_in_x[4]; @@ -89,79 +91,108 @@ struct OCIO_GLSLCurveMappingParameters { /** WARNING: Needs to be 16byte aligned. Used as UBO data. */ }; -struct OCIO_GLSLShader { - /** Cache IDs */ - std::string cacheId; +struct OCIO_GPUShader { + /* GPU shader. */ + struct GPUShader *shader = nullptr; - struct GPUShader *shader; /** Uniform locations. */ - int dither_loc; - int overlay_loc; - int predivide_loc; - int curve_mapping_loc; - int ubo_bind; - /** Error checking. */ - bool valid; + int scale_loc = 0; + int exponent_loc = 0; + int dither_loc = 0; + int overlay_loc = 0; + int predivide_loc = 0; + int ubo_bind = 0; + + /* Destructor. */ + ~OCIO_GPUShader() + { + if (shader) { + GPU_shader_free(shader); + } + } }; -struct OCIO_GLSLLut3d { - /** Cache IDs */ - std::string cacheId; - /** OpenGL Texture handles. NULL if not allocated. */ - GPUTexture *texture; - GPUTexture *texture_display; - GPUTexture *texture_dummy; - /** Error checking. */ - bool valid; +struct OCIO_GPULutTexture { + GPUTexture *texture = nullptr; + std::string sampler_name; }; -struct OCIO_GLSLCurveMappping { - /** Cache IDs */ - size_t cacheId; +struct OCIO_GPUUniform { + GpuShaderDesc::UniformData data; + std::string name; +}; + +struct OCIO_GPUTextures { + /** LUT Textures */ + std::vector luts; + + /* Dummy in case of no overlay. */ + GPUTexture *dummy = nullptr; + + /* Uniforms */ + std::vector uniforms; + + /* Destructor. */ + ~OCIO_GPUTextures() + { + for (OCIO_GPULutTexture &lut : luts) { + GPU_texture_free(lut.texture); + } + if (dummy) { + GPU_texture_free(dummy); + } + } +}; + +struct OCIO_GPUCurveMappping { /** GPU Uniform Buffer handle. 0 if not allocated. */ - GPUUniformBuf *buffer; + GPUUniformBuf *buffer = nullptr; /** OpenGL Texture handles. 0 if not allocated. */ - GPUTexture *texture; + GPUTexture *texture = nullptr; + /* To detect when to update the uniforms and textures. */ + size_t cache_id = 0; + + /* Destructor. */ + ~OCIO_GPUCurveMappping() + { + if (texture) { + GPU_texture_free(texture); + } + if (buffer) { + GPU_uniformbuf_free(buffer); + } + } +}; + +struct OCIO_GPUDisplayShader { + OCIO_GPUShader shader; + OCIO_GPUTextures textures; + OCIO_GPUCurveMappping curvemap; + + /* Cache variables. */ + std::string input; + std::string view; + std::string display; + std::string look; + bool use_curve_mapping = false; + /** Error checking. */ - bool valid; + bool valid = false; }; -struct OCIO_GLSLCacheHandle { - size_t cache_id; - void *data; -}; - -struct OCIO_GLSLDrawState { - /* Shader Cache */ - OCIO_GLSLCacheHandle shader_cache[SHADER_CACHE_SIZE]; - OCIO_GLSLCacheHandle lut3d_cache[SHADER_CACHE_SIZE]; - OCIO_GLSLCacheHandle curvemap_cache[SHADER_CACHE_SIZE]; -}; - -static OCIO_GLSLDrawState *allocateOpenGLState(void) -{ - return (OCIO_GLSLDrawState *)MEM_callocN(sizeof(OCIO_GLSLDrawState), "OCIO OpenGL State struct"); -} +static const int SHADER_CACHE_MAX_SIZE = 4; +std::list SHADER_CACHE; /* -------------------------------------------------------------------- */ /** \name Shader * \{ */ -static void updateGLSLShader(OCIO_GLSLShader *shader, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) +static bool createGPUShader(OCIO_GPUShader &shader, + OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shaderdesc_to_scene_linear, + const GpuShaderDescRcPtr &shaderdesc_to_display, + const bool use_curve_mapping) { - if (shader->cacheId == cache_id) { - return; - } - - /* Delete any previous shader. */ - if (shader->shader) { - GPU_shader_free(shader->shader); - } - std::ostringstream os; { /* Fragment shader */ @@ -170,146 +201,222 @@ static void updateGLSLShader(OCIO_GLSLShader *shader, os << "#define texture2D texture\n"; os << "#define texture3D texture\n"; - shader_desc->setFunctionName("OCIO_to_display_linear_with_look"); - os << (*processor_scene_to_ui)->getGpuShaderText(*shader_desc) << "\n"; + if (use_curve_mapping) { + os << "#define USE_CURVE_MAPPING\n"; + } - shader_desc->setFunctionName("OCIO_to_display_encoded"); - os << (*processpr_ui_to_display)->getGpuShaderText(*shader_desc) << "\n"; + os << shaderdesc_to_scene_linear->getShaderText() << "\n"; + os << shaderdesc_to_display->getShaderText() << "\n"; os << datatoc_gpu_shader_display_transform_glsl; } - shader->shader = GPU_shader_create(datatoc_gpu_shader_display_transform_vertex_glsl, - os.str().c_str(), - NULL, - NULL, - NULL, - "OCIOShader"); + shader.shader = GPU_shader_create(datatoc_gpu_shader_display_transform_vertex_glsl, + os.str().c_str(), + nullptr, + nullptr, + nullptr, + "OCIOShader"); - if (shader->shader) { - shader->dither_loc = GPU_shader_get_uniform(shader->shader, "dither"); - shader->overlay_loc = GPU_shader_get_uniform(shader->shader, "overlay"); - shader->predivide_loc = GPU_shader_get_uniform(shader->shader, "predivide"); - shader->curve_mapping_loc = GPU_shader_get_uniform(shader->shader, "curve_mapping"); - shader->ubo_bind = GPU_shader_get_uniform_block_binding(shader->shader, - "OCIO_GLSLCurveMappingParameters"); - - GPU_shader_bind(shader->shader); - - /* Set texture bind point uniform once. This is saved by the shader. */ - GPUShader *sh = shader->shader; - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), 0); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "overlay_texture"), 1); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_texture"), 2); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_display_texture"), 3); - GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), 4); + if (shader.shader == nullptr) { + return false; } - shader->cacheId = cache_id; - shader->valid = (shader->shader != NULL); -} + shader.scale_loc = GPU_shader_get_uniform(shader.shader, "scale"); + shader.exponent_loc = GPU_shader_get_uniform(shader.shader, "exponent"); + shader.dither_loc = GPU_shader_get_uniform(shader.shader, "dither"); + shader.overlay_loc = GPU_shader_get_uniform(shader.shader, "overlay"); + shader.predivide_loc = GPU_shader_get_uniform(shader.shader, "predivide"); + shader.ubo_bind = GPU_shader_get_uniform_block_binding(shader.shader, + "OCIO_GPUCurveMappingParameters"); -static void ensureGLSLShader(OCIO_GLSLShader **shader_ptr, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) -{ - if (*shader_ptr != NULL) { - return; + GPU_shader_bind(shader.shader); + + /* Set texture bind point uniform once. This is saved by the shader. */ + GPUShader *sh = shader.shader; + GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), TEXTURE_SLOT_IMAGE); + GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "overlay_texture"), TEXTURE_SLOT_OVERLAY); + + if (use_curve_mapping) { + GPU_shader_uniform_int( + sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), TEXTURE_SLOT_CURVE_MAPPING); } - OCIO_GLSLShader *shader = OBJECT_GUARDED_NEW(OCIO_GLSLShader); - - updateGLSLShader(shader, processor_scene_to_ui, processpr_ui_to_display, shader_desc, cache_id); - - *shader_ptr = shader; -} - -static void freeGLSLShader(OCIO_GLSLShader *shader) -{ - if (shader->shader) { - GPU_shader_free(shader->shader); + /* Set LUT textures. */ + for (int i = 0; i < textures.luts.size(); i++) { + GPU_shader_uniform_int(sh, + GPU_shader_get_uniform(sh, textures.luts[i].sampler_name.c_str()), + TEXTURE_SLOT_LUTS_OFFSET + i); } - OBJECT_GUARDED_DELETE(shader, OCIO_GLSLShader); + /* Set uniforms. */ + for (OCIO_GPUUniform &uniform : textures.uniforms) { + const GpuShaderDesc::UniformData &data = uniform.data; + const char *name = name; + + if (data.m_getDouble) { + GPU_shader_uniform_1f(sh, name, (float)data.m_getDouble()); + } + else if (data.m_getBool) { + GPU_shader_uniform_1f(sh, name, (float)(data.m_getBool() ? 1.0f : 0.0f)); + } + else if (data.m_getFloat3) { + GPU_shader_uniform_3f(sh, + name, + (float)data.m_getFloat3()[0], + (float)data.m_getFloat3()[1], + (float)data.m_getFloat3()[2]); + } + else if (data.m_vectorFloat.m_getSize && data.m_vectorFloat.m_getVector) { + GPU_shader_uniform_vector(sh, + GPU_shader_get_uniform(sh, name), + (int)data.m_vectorFloat.m_getSize(), + 1, + (float *)data.m_vectorFloat.m_getVector()); + } + else if (data.m_vectorInt.m_getSize && data.m_vectorInt.m_getVector) { + GPU_shader_uniform_vector_int(sh, + GPU_shader_get_uniform(sh, name), + (int)data.m_vectorInt.m_getSize(), + 1, + (int *)data.m_vectorInt.m_getVector()); + } + } + + return true; } /** \} */ /* -------------------------------------------------------------------- */ -/** \name Lut3D +/** \name Textures * \{ */ -static void updateGLSLLut3d(OCIO_GLSLLut3d *lut3d, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shader_desc, - const std::string &cache_id) +static bool addGPUUniform(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - if (lut3d->cacheId == cache_id) - return; - - float *lut_data = (float *)MEM_mallocN(LUT3D_TEXTURE_SIZE, __func__); - - ConstProcessorRcPtr *ocio_processors[2] = {processor_scene_to_ui, processpr_ui_to_display}; - - for (int i = 0; i < 2; i++) { - ConstProcessorRcPtr *processor = ocio_processors[i]; - GPUTexture *texture = (&lut3d->texture)[i]; - - (*processor)->getGpuLut3D(lut_data, *shader_desc); - - int offset[3] = {0, 0, 0}; - int extent[3] = {LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE}; - GPU_texture_update_sub(texture, GPU_DATA_FLOAT, lut_data, UNPACK3(offset), UNPACK3(extent)); + OCIO_GPUUniform uniform; + uniform.name = shader_desc->getUniform(index, uniform.data); + if (uniform.data.m_type == UNIFORM_UNKNOWN) { + return false; } - MEM_freeN(lut_data); - - lut3d->cacheId = cache_id; + textures.uniforms.push_back(uniform); + return true; } -static void ensureGLSLLut3d(OCIO_GLSLLut3d **lut3d_ptr, - ConstProcessorRcPtr *processor_scene_to_ui, - ConstProcessorRcPtr *processpr_ui_to_display, - GpuShaderDesc *shaderDesc, - const std::string &cache_id) +static bool addGPULut2D(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - if (*lut3d_ptr != NULL) { - return; + const char *texture_name = nullptr; + const char *sampler_name = nullptr; + unsigned int width = 0; + unsigned int height = 0; + GpuShaderCreator::TextureType channel = GpuShaderCreator::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + shader_desc->getTexture( + index, texture_name, sampler_name, width, height, channel, interpolation); + + const float *values; + shader_desc->getTextureValues(index, values); + if (texture_name == nullptr || sampler_name == nullptr || width == 0 || height == 0 || + values == nullptr) { + return false; } - OCIO_GLSLLut3d *lut3d = OBJECT_GUARDED_NEW(OCIO_GLSLLut3d); + eGPUTextureFormat format = (channel == GpuShaderCreator::TEXTURE_RGB_CHANNEL) ? GPU_RGB16F : + GPU_R16F; - int extent[3] = {LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE}; + OCIO_GPULutTexture lut; + lut.texture = GPU_texture_create_2d(texture_name, width, height, 0, format, values); + if (lut.texture == nullptr) { + return false; + } - lut3d->texture = GPU_texture_create_3d( - "OCIOLut", UNPACK3(extent), 1, GPU_RGB16F, GPU_DATA_FLOAT, NULL); - GPU_texture_filter_mode(lut3d->texture, true); - GPU_texture_wrap_mode(lut3d->texture, false, true); + GPU_texture_filter_mode(lut.texture, interpolation != INTERP_NEAREST); + GPU_texture_wrap_mode(lut.texture, false, true); - lut3d->texture_display = GPU_texture_create_3d( - "OCIOLutDisplay", UNPACK3(extent), 1, GPU_RGB16F, GPU_DATA_FLOAT, NULL); - GPU_texture_filter_mode(lut3d->texture_display, true); - GPU_texture_wrap_mode(lut3d->texture_display, false, true); + lut.sampler_name = sampler_name; - lut3d->texture_dummy = GPU_texture_create_error(2, false); - - updateGLSLLut3d(lut3d, processor_scene_to_ui, processpr_ui_to_display, shaderDesc, cache_id); - - lut3d->valid = (lut3d->texture && lut3d->texture_display); - - *lut3d_ptr = lut3d; + textures.luts.push_back(lut); + return true; } -static void freeGLSLLut3d(OCIO_GLSLLut3d *lut3d) +static bool addGPULut3D(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shader_desc, + int index) { - GPU_texture_free(lut3d->texture); - GPU_texture_free(lut3d->texture_display); - GPU_texture_free(lut3d->texture_dummy); + const char *texture_name = nullptr; + const char *sampler_name = nullptr; + unsigned int edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + shader_desc->get3DTexture(index, texture_name, sampler_name, edgelen, interpolation); - OBJECT_GUARDED_DELETE(lut3d, OCIO_GLSLLut3d); + const float *values; + shader_desc->get3DTextureValues(index, values); + if (texture_name == nullptr || sampler_name == nullptr || edgelen == 0 || values == nullptr) { + return false; + } + + OCIO_GPULutTexture lut; + lut.texture = GPU_texture_create_3d( + texture_name, edgelen, edgelen, edgelen, 0, GPU_RGB16F, GPU_DATA_FLOAT, values); + if (lut.texture == nullptr) { + return false; + } + + GPU_texture_filter_mode(lut.texture, interpolation != INTERP_NEAREST); + GPU_texture_wrap_mode(lut.texture, false, true); + + lut.sampler_name = sampler_name; + + textures.luts.push_back(lut); + return true; +} + +static bool createGPUTextures(OCIO_GPUTextures &textures, + const GpuShaderDescRcPtr &shaderdesc_to_scene_linear, + const GpuShaderDescRcPtr &shaderdesc_to_display) +{ + textures.dummy = GPU_texture_create_error(2, false); + + textures.luts.clear(); + textures.uniforms.clear(); + + for (int index = 0; index < shaderdesc_to_scene_linear->getNumUniforms(); index++) { + if (!addGPUUniform(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_scene_linear->getNumTextures(); index++) { + if (!addGPULut2D(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_scene_linear->getNum3DTextures(); index++) { + if (!addGPULut3D(textures, shaderdesc_to_scene_linear, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNumUniforms(); index++) { + if (!addGPUUniform(textures, shaderdesc_to_display, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNumTextures(); index++) { + if (!addGPULut2D(textures, shaderdesc_to_display, index)) { + return false; + } + } + for (int index = 0; index < shaderdesc_to_display->getNum3DTextures(); index++) { + if (!addGPULut3D(textures, shaderdesc_to_display, index)) { + return false; + } + } + + return true; } /** \} */ @@ -317,72 +424,47 @@ static void freeGLSLLut3d(OCIO_GLSLLut3d *lut3d) /* -------------------------------------------------------------------- */ /** \name Curve Mapping * \{ */ -static void allocateCurveMappingTexture(OCIO_GLSLCurveMappping *curvemap, - OCIO_CurveMappingSettings *curve_mapping_settings) + +static bool createGPUCurveMapping(OCIO_GPUCurveMappping &curvemap, + OCIO_CurveMappingSettings *curve_mapping_settings) { - int lut_size = curve_mapping_settings ? curve_mapping_settings->lut_size : 1; - /* Do not initialize. Only if used. */ - curvemap->texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, NULL); - GPU_texture_filter_mode(curvemap->texture, false); - GPU_texture_wrap_mode(curvemap->texture, false, true); + if (curve_mapping_settings) { + int lut_size = curve_mapping_settings->lut_size; + + curvemap.texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, nullptr); + GPU_texture_filter_mode(curvemap.texture, false); + GPU_texture_wrap_mode(curvemap.texture, false, true); + + curvemap.buffer = GPU_uniformbuf_create(sizeof(OCIO_GPUCurveMappingParameters)); + + if (curvemap.texture == nullptr || curvemap.buffer == nullptr) { + return false; + } + } + + return true; } -/* curve_mapping_settings can be null. In this case we alloc a dummy curvemap. */ -static void ensureGLSLCurveMapping(OCIO_GLSLCurveMappping **curvemap_ptr, - OCIO_CurveMappingSettings *curve_mapping_settings) +static void updateGPUCurveMapping(OCIO_GPUCurveMappping &curvemap, + OCIO_CurveMappingSettings *curve_mapping_settings) { - if (*curvemap_ptr != NULL) { + /* Test if we need to update. The caller ensures the curve_mapping_settings + * changes when its contents changes. */ + if (curve_mapping_settings == nullptr || curvemap.cache_id == curve_mapping_settings->cache_id) { return; } - OCIO_GLSLCurveMappping *curvemap = OBJECT_GUARDED_NEW(OCIO_GLSLCurveMappping); - - /* Texture. */ - allocateCurveMappingTexture(curvemap, curve_mapping_settings); - - /* Uniform buffer object. */ - curvemap->buffer = GPU_uniformbuf_create(sizeof(OCIO_GLSLCurveMappingParameters)); - - curvemap->valid = (curvemap->texture != 0); - curvemap->cacheId = 0; - - *curvemap_ptr = curvemap; -} - -static void freeGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap) -{ - GPU_texture_free(curvemap->texture); - GPU_uniformbuf_free(curvemap->buffer); - - OBJECT_GUARDED_DELETE(curvemap, OCIO_GLSLCurveMappping); -} - -static void updateGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap, - OCIO_CurveMappingSettings *curve_mapping_settings, - size_t cacheId) -{ - /* No need to continue if curvemapping is not used. Just use whatever is in this cache. */ - if (curve_mapping_settings == NULL) - return; - - if (curvemap->cacheId == cacheId) - return; - - if (curvemap->cacheId == 0) { - /* This cache was previously used as dummy. Recreate the texture. */ - GPU_texture_free(curvemap->texture); - allocateCurveMappingTexture(curvemap, curve_mapping_settings); - } + curvemap.cache_id = curve_mapping_settings->cache_id; /* Update texture. */ int offset[3] = {0, 0, 0}; int extent[3] = {curve_mapping_settings->lut_size, 0, 0}; const float *pixels = curve_mapping_settings->lut; GPU_texture_update_sub( - curvemap->texture, GPU_DATA_FLOAT, pixels, UNPACK3(offset), UNPACK3(extent)); + curvemap.texture, GPU_DATA_FLOAT, pixels, UNPACK3(offset), UNPACK3(extent)); /* Update uniforms. */ - OCIO_GLSLCurveMappingParameters data; + OCIO_GPUCurveMappingParameters data; for (int i = 0; i < 4; i++) { data.curve_mapping_range[i] = curve_mapping_settings->range[i]; data.curve_mapping_mintable[i] = curve_mapping_settings->mintable[i]; @@ -402,198 +484,193 @@ static void updateGLSLCurveMapping(OCIO_GLSLCurveMappping *curvemap, data.curve_mapping_lut_size = curve_mapping_settings->lut_size; data.curve_mapping_use_extend_extrapolate = curve_mapping_settings->use_extend_extrapolate; - GPU_uniformbuf_update(curvemap->buffer, &data); - - curvemap->cacheId = cacheId; + GPU_uniformbuf_update(curvemap.buffer, &data); } /** \} */ /* -------------------------------------------------------------------- */ -/** \name LRU cache +/** \name OCIO GPU Shader Implementation * \{ */ -static size_t hash_string(const char *str) -{ - size_t i = 0, c; - while ((c = *str++)) { - i = i * 37 + c; - } - return i; -} - -static OCIO_GLSLCacheHandle *cacheSearch(OCIO_GLSLCacheHandle cache[SHADER_CACHE_SIZE], - size_t cache_id) -{ - OCIO_GLSLCacheHandle *cached_item = &cache[0]; - for (int i = 0; i < SHADER_CACHE_SIZE; i++, cached_item++) { - if (cached_item->data == NULL) { - continue; - } - else if (cached_item->cache_id == cache_id) { - /* LRU cache, so move to front. */ - OCIO_GLSLCacheHandle found_item = *cached_item; - for (int j = i; j > 0; j--) { - cache[j] = cache[j - 1]; - } - cache[0] = found_item; - return &cache[0]; - } - } - /* LRU cache, shift other items back so we can insert at the front. */ - OCIO_GLSLCacheHandle last_item = cache[SHADER_CACHE_SIZE - 1]; - for (int j = SHADER_CACHE_SIZE - 1; j > 0; j--) { - cache[j] = cache[j - 1]; - } - /* Copy last to front and let the caller initialize it. */ - cache[0] = last_item; - return &cache[0]; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name OCIO GLSL Implementation - * \{ */ - -/* Detect if we can support GLSL drawing */ -bool OCIOImpl::supportGLSLDraw() +bool OCIOImpl::supportGPUShader() { /* Minimum supported version 3.3 does meet all requirements. */ return true; } +static OCIO_GPUDisplayShader &getGPUDisplayShader( + OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings) +{ + /* Find existing shader in cache. */ + const bool use_curve_mapping = (curve_mapping_settings != nullptr); + for (std::list::iterator it = SHADER_CACHE.begin(); + it != SHADER_CACHE.end(); + it++) { + if (it->input == input && it->view == view && it->display == display && it->look == look && + it->use_curve_mapping == use_curve_mapping) { + /* Move to front of the cache to mark as most recently used. */ + if (it != SHADER_CACHE.begin()) { + SHADER_CACHE.splice(SHADER_CACHE.begin(), SHADER_CACHE, it); + } + + return *it; + } + } + + /* Remove least recently used element from cache. */ + if (SHADER_CACHE.size() >= SHADER_CACHE_MAX_SIZE) { + SHADER_CACHE.pop_back(); + } + + /* Create GPU shader. */ + SHADER_CACHE.emplace_front(); + OCIO_GPUDisplayShader &display_shader = SHADER_CACHE.front(); + + display_shader.input = input; + display_shader.view = view; + display_shader.display = display; + display_shader.look = look; + display_shader.use_curve_mapping = use_curve_mapping; + display_shader.valid = false; + + /* Create Processors. + * + * Scale and exponent are handled outside of OCIO shader so we can handle them + * as uniforms at the binding stage. OCIO would otherwise bake them into the + * shader code, requiring slow recompiles when interactively adjusting them. + * + * Note that OCIO does have the concept of dynamic properties, however there + * is no dynamic gamma and exposure is part of more expensive operations only. + * + * Since exposure must happen in scene linear, we use two processors. The input + * is usually scene linear already and so that conversion is often a no-op. + */ + OCIO_ConstProcessorRcPtr *processor_to_scene_linear = OCIO_configGetProcessorWithNames( + config, input, ROLE_SCENE_LINEAR); + OCIO_ConstProcessorRcPtr *processor_to_display = OCIO_createDisplayProcessor( + config, ROLE_SCENE_LINEAR, view, display, look, 1.0f, 1.0f); + + /* Create shader descriptions. */ + if (processor_to_scene_linear && processor_to_display) { + GpuShaderDescRcPtr shaderdesc_to_scene_linear = GpuShaderDesc::CreateShaderDesc(); + shaderdesc_to_scene_linear->setLanguage(GPU_LANGUAGE_GLSL_1_3); + shaderdesc_to_scene_linear->setFunctionName("OCIO_to_scene_linear"); + (*(ConstProcessorRcPtr *)processor_to_scene_linear) + ->getDefaultGPUProcessor() + ->extractGpuShaderInfo(shaderdesc_to_scene_linear); + shaderdesc_to_scene_linear->finalize(); + + GpuShaderDescRcPtr shaderdesc_to_display = GpuShaderDesc::CreateShaderDesc(); + shaderdesc_to_display->setLanguage(GPU_LANGUAGE_GLSL_1_3); + shaderdesc_to_display->setFunctionName("OCIO_to_display"); + (*(ConstProcessorRcPtr *)processor_to_display) + ->getDefaultGPUProcessor() + ->extractGpuShaderInfo(shaderdesc_to_display); + shaderdesc_to_display->finalize(); + + /* Create GPU shader and textures. */ + if (createGPUTextures( + display_shader.textures, shaderdesc_to_scene_linear, shaderdesc_to_display) && + createGPUCurveMapping(display_shader.curvemap, curve_mapping_settings) && + createGPUShader(display_shader.shader, + display_shader.textures, + shaderdesc_to_scene_linear, + shaderdesc_to_display, + use_curve_mapping)) { + display_shader.valid = true; + } + } + + /* Free processors. */ + if (processor_to_scene_linear) { + OCIO_processorRelease(processor_to_scene_linear); + } + if (processor_to_display) { + OCIO_processorRelease(processor_to_display); + } + + return display_shader; +} + /** - * Setup OpenGL contexts for a transform defined by processor using GLSL + * Setup GPU contexts for a transform defined by processor using GLSL. * All LUT allocating baking and shader compilation happens here. * * Once this function is called, callee could start drawing images * using regular 2D texture. * - * When all drawing is finished, finishGLSLDraw shall be called to - * restore OpenGL context to its pre-GLSL draw state. + * When all drawing is finished, gpuDisplayShaderUnbind must be called to + * restore GPU context to its previous state. */ -bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, - OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui, - OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display, - OCIO_CurveMappingSettings *curve_mapping_settings, - float dither, - bool use_predivide, - bool use_overlay) +bool OCIOImpl::gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config, + const char *input, + const char *view, + const char *display, + const char *look, + OCIO_CurveMappingSettings *curve_mapping_settings, + const float scale, + const float exponent, + const float dither, + const bool use_predivide, + const bool use_overlay) { - ConstProcessorRcPtr processor_scene_to_ui = *(ConstProcessorRcPtr *)ocio_processor_scene_to_ui; - ConstProcessorRcPtr processpr_ui_to_display = *( - ConstProcessorRcPtr *)ocio_processor_ui_to_display; - bool use_curve_mapping = curve_mapping_settings != NULL; - - if (!processor_scene_to_ui || !processor_scene_to_ui) { + /* Get GPU shader from cache or create new one. */ + OCIO_GPUDisplayShader &display_shader = getGPUDisplayShader( + config, input, view, display, look, curve_mapping_settings); + if (!display_shader.valid) { return false; } - /* Create state if needed. */ - OCIO_GLSLDrawState *state; - if (!*state_r) - *state_r = allocateOpenGLState(); - state = *state_r; + /* Verify the shader is valid. */ + OCIO_GPUTextures &textures = display_shader.textures; + OCIO_GPUShader &shader = display_shader.shader; + OCIO_GPUCurveMappping &curvemap = display_shader.curvemap; - /* Compute cache IDs. */ - GpuShaderDesc shaderDesc; - shaderDesc.setLanguage(GPU_LANGUAGE_GLSL_1_3); - shaderDesc.setFunctionName("OCIODisplay"); - shaderDesc.setLut3DEdgeLen(LUT3D_EDGE_SIZE); - - const char *shader_cache_str = processor_scene_to_ui->getGpuShaderTextCacheID(shaderDesc); - const char *lut3d_cache_str = processor_scene_to_ui->getGpuLut3DCacheID(shaderDesc); - /* Used for comparison. */ - std::string shaderCacheID = shader_cache_str; - std::string lut3dCacheID = lut3d_cache_str; - - size_t shader_cache_id = hash_string(shader_cache_str); - size_t lut3d_cache_id = hash_string(lut3d_cache_str); - size_t curvemap_cache_id = curve_mapping_settings ? curve_mapping_settings->cache_id : 0; - - OCIO_GLSLCacheHandle *shader_handle = cacheSearch(state->shader_cache, shader_cache_id); - OCIO_GLSLCacheHandle *lut3d_handle = cacheSearch(state->lut3d_cache, lut3d_cache_id); - /* We cannot keep more than one cache for curvemap because their cache id is a pointer. - * The pointer cannot be the same for one update but can be the same after a second update. */ - OCIO_GLSLCacheHandle *curvemap_handle = &state->curvemap_cache[0]; - - OCIO_GLSLShader **shader_ptr = (OCIO_GLSLShader **)&shader_handle->data; - OCIO_GLSLLut3d **lut3d_ptr = (OCIO_GLSLLut3d **)&lut3d_handle->data; - OCIO_GLSLCurveMappping **curvemap_ptr = (OCIO_GLSLCurveMappping **)&curvemap_handle->data; - - ensureGLSLShader( - shader_ptr, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - ensureGLSLLut3d( - lut3d_ptr, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - ensureGLSLCurveMapping(curvemap_ptr, curve_mapping_settings); - - OCIO_GLSLShader *shader = (OCIO_GLSLShader *)shader_handle->data; - OCIO_GLSLLut3d *shader_lut = (OCIO_GLSLLut3d *)lut3d_handle->data; - OCIO_GLSLCurveMappping *shader_curvemap = (OCIO_GLSLCurveMappping *)curvemap_handle->data; - - updateGLSLShader( - shader, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, shaderCacheID); - updateGLSLLut3d( - shader_lut, &processor_scene_to_ui, &processpr_ui_to_display, &shaderDesc, lut3dCacheID); - updateGLSLCurveMapping(shader_curvemap, curve_mapping_settings, curvemap_cache_id); - - /* Update handles cache keys. */ - shader_handle->cache_id = shader_cache_id; - lut3d_handle->cache_id = lut3d_cache_id; - curvemap_handle->cache_id = curvemap_cache_id; - - if (shader->valid && shader_lut->valid && shader_curvemap->valid) { - /* Bind textures to sampler units. Texture 0 is set by caller. - * Uniforms have already been set for texture bind points.*/ - - if (!use_overlay) { - /* Avoid missing binds. */ - GPU_texture_bind(shader_lut->texture_dummy, 1); - } - GPU_texture_bind(shader_lut->texture, 2); - GPU_texture_bind(shader_lut->texture_display, 3); - GPU_texture_bind(shader_curvemap->texture, 4); - - /* Bind UBO. */ - GPU_uniformbuf_bind(shader_curvemap->buffer, shader->ubo_bind); - - /* TODO(fclem): remove remains of IMM. */ - immBindShader(shader->shader); - - /* Bind Shader and set uniforms. */ - // GPU_shader_bind(shader->shader); - GPU_shader_uniform_float(shader->shader, shader->dither_loc, dither); - GPU_shader_uniform_int(shader->shader, shader->overlay_loc, use_overlay); - GPU_shader_uniform_int(shader->shader, shader->predivide_loc, use_predivide); - GPU_shader_uniform_int(shader->shader, shader->curve_mapping_loc, use_curve_mapping); - - return true; + /* Update and bind curve mapping data. */ + if (curve_mapping_settings) { + updateGPUCurveMapping(curvemap, curve_mapping_settings); + GPU_uniformbuf_bind(curvemap.buffer, shader.ubo_bind); + GPU_texture_bind(curvemap.texture, TEXTURE_SLOT_CURVE_MAPPING); } - return false; + /* Bind textures to sampler units. Texture 0 is set by caller. + * Uniforms have already been set for texture bind points.*/ + if (!use_overlay) { + /* Avoid missing binds. */ + GPU_texture_bind(textures.dummy, TEXTURE_SLOT_OVERLAY); + } + for (int i = 0; i < textures.luts.size(); i++) { + GPU_texture_bind(textures.luts[i].texture, TEXTURE_SLOT_LUTS_OFFSET + i); + } + + /* TODO(fclem): remove remains of IMM. */ + immBindShader(shader.shader); + + /* Bind Shader and set uniforms. */ + // GPU_shader_bind(shader.shader); + GPU_shader_uniform_float(shader.shader, shader.scale_loc, scale); + GPU_shader_uniform_float(shader.shader, shader.exponent_loc, exponent); + GPU_shader_uniform_float(shader.shader, shader.dither_loc, dither); + GPU_shader_uniform_int(shader.shader, shader.overlay_loc, use_overlay); + GPU_shader_uniform_int(shader.shader, shader.predivide_loc, use_predivide); + + return true; } -void OCIOImpl::finishGLSLDraw(OCIO_GLSLDrawState * /*state*/) +void OCIOImpl::gpuDisplayShaderUnbind() { immUnbindProgram(); } -void OCIOImpl::freeGLState(OCIO_GLSLDrawState *state) +void OCIOImpl::gpuCacheFree() { - for (int i = 0; i < SHADER_CACHE_SIZE; i++) { - if (state->shader_cache[i].data) { - freeGLSLShader((OCIO_GLSLShader *)state->shader_cache[i].data); - } - if (state->lut3d_cache[i].data) { - freeGLSLLut3d((OCIO_GLSLLut3d *)state->lut3d_cache[i].data); - } - if (state->curvemap_cache[i].data) { - freeGLSLCurveMapping((OCIO_GLSLCurveMappping *)state->curvemap_cache[i].data); - } - } - - MEM_freeN(state); + SHADER_CACHE.clear(); } /** \} */ diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio index 5ad937e3efb..8da4b13df00 100644 --- a/release/datafiles/colormanagement/config.ocio +++ b/release/datafiles/colormanagement/config.ocio @@ -39,8 +39,8 @@ roles: # Non-color data data: Non-Color - # CIE XYZ color space - XYZ: XYZ + # For interop between configs, and to determine XYZ for rendering + aces_interchange: Linear ACES # Specifed by OCIO, not used in Blender color_timing: Filmic Log @@ -97,7 +97,10 @@ colorspaces: isdata: false allocation: lg2 allocationvars: [-8.5, 5] - to_reference: ! {src: rec709_to_aces.spimtx, interpolation: linear, direction: inverse} + from_reference: ! + children: + - ! {src: srgb_to_xyz.spimtx, interpolation: linear} + - ! {src: xyz_to_aces.spimtx, interpolation: linear} - ! name: nuke_rec709 diff --git a/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx b/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx deleted file mode 100644 index fbf52e63555..00000000000 --- a/release/datafiles/colormanagement/luts/aces_to_xyz.spimtx +++ /dev/null @@ -1,3 +0,0 @@ -0.9525523959 0.0000000000 0.0000936786 0 -0.3439664498 0.7281660966 -0.072132546 0 -0.0000000000 0.0000000000 1.0088251844 0 diff --git a/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx b/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx deleted file mode 100644 index 0f4f6bd68b4..00000000000 --- a/release/datafiles/colormanagement/luts/rec709_to_aces.spimtx +++ /dev/null @@ -1,3 +0,0 @@ -0.4395770431 0.3839148879 0.1765103489 0.0 -0.0895979404 0.8147120476 0.0956883803 0.0 -0.0174174830 0.1087378338 0.8738504052 0.0 diff --git a/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx b/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx new file mode 100644 index 00000000000..18bc78f5e63 --- /dev/null +++ b/release/datafiles/colormanagement/luts/xyz_to_aces.spimtx @@ -0,0 +1,3 @@ + 1.0498110175 0.0000000000 -0.0000974845 0 +-0.4959030231 1.3733130458 0.0982400361 0 + 0.0000000000 0.0000000000 0.9912520182 0 diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index 6b505a7171a..cc3f4879eea 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h @@ -32,6 +32,7 @@ extern "C" { struct ImBuf; struct OCIO_ConstProcessorRcPtr; +struct OCIO_ConstCPUProcessorRcPtr; extern float imbuf_luma_coefficients[3]; extern float imbuf_xyz_to_rgb[3][3]; @@ -46,8 +47,8 @@ typedef struct ColorSpace { char name[MAX_COLORSPACE_NAME]; char description[MAX_COLORSPACE_DESCRIPTION]; - struct OCIO_ConstProcessorRcPtr *to_scene_linear; - struct OCIO_ConstProcessorRcPtr *from_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear; bool is_invertible; bool is_data; @@ -66,8 +67,8 @@ typedef struct ColorManagedDisplay { char name[MAX_COLORSPACE_NAME]; ListBase views; /* LinkData.data -> ColorManagedView */ - struct OCIO_ConstProcessorRcPtr *to_scene_linear; - struct OCIO_ConstProcessorRcPtr *from_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *to_scene_linear; + struct OCIO_ConstCPUProcessorRcPtr *from_scene_linear; } ColorManagedDisplay; typedef struct ColorManagedView { diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 046e233fd05..8f8c12aa3b4 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -101,40 +101,26 @@ static float imbuf_linear_srgb_to_xyz[3][3] = {{0.0f}}; static pthread_mutex_t processor_lock = BLI_MUTEX_INITIALIZER; typedef struct ColormanageProcessor { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *cpu_processor; CurveMapping *curve_mapping; bool is_data_result; } ColormanageProcessor; -static struct global_glsl_state { - /* Actual processor used for GLSL baked LUTs. */ - /* UI colorspace here refers to the display linear color space, - * i.e: The linear color space w.r.t. display chromaticity and radiometry. - * We separate the colormanagement process into two steps to be able to - * merge UI using alpha blending in the correct color space. */ - OCIO_ConstProcessorRcPtr *processor_scene_to_ui; - OCIO_ConstProcessorRcPtr *processor_ui_to_display; - - /* Settings of processor for comparison. */ - char look[MAX_COLORSPACE_NAME]; - char view[MAX_COLORSPACE_NAME]; - char display[MAX_COLORSPACE_NAME]; - char input[MAX_COLORSPACE_NAME]; - float exposure, gamma; +static struct global_gpu_state { + /* GPU shader currently bound. */ + bool gpu_shader_bound; + /* Curve mapping. */ CurveMapping *curve_mapping, *orig_curve_mapping; bool use_curve_mapping; int curve_mapping_timestamp; OCIO_CurveMappingSettings curve_mapping_settings; - - /* Container for GLSL state needed for OCIO module. */ - struct OCIO_GLSLDrawState *ocio_glsl_state; -} global_glsl_state = {NULL}; +} global_gpu_state = {NULL}; static struct global_color_picking_state { /* Cached processor for color picking conversion. */ - OCIO_ConstProcessorRcPtr *processor_to; - OCIO_ConstProcessorRcPtr *processor_from; + OCIO_ConstCPUProcessorRcPtr *cpu_processor_to; + OCIO_ConstCPUProcessorRcPtr *cpu_processor_from; bool failed; } global_color_picking_state = {NULL}; @@ -609,11 +595,10 @@ static void colormanage_free_config(void) /* free precomputer processors */ if (colorspace->to_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear); } - if (colorspace->from_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear); } /* free color space itself */ @@ -631,11 +616,10 @@ static void colormanage_free_config(void) /* free precomputer processors */ if (display->to_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->to_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear); } - if (display->from_scene_linear) { - OCIO_processorRelease((OCIO_ConstProcessorRcPtr *)display->from_scene_linear); + OCIO_cpuProcessorRelease((OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear); } /* free list of views */ @@ -727,35 +711,25 @@ void colormanagement_init(void) void colormanagement_exit(void) { - if (global_glsl_state.processor_scene_to_ui) { - OCIO_processorRelease(global_glsl_state.processor_scene_to_ui); + OCIO_gpuCacheFree(); + + if (global_gpu_state.curve_mapping) { + BKE_curvemapping_free(global_gpu_state.curve_mapping); } - if (global_glsl_state.processor_ui_to_display) { - OCIO_processorRelease(global_glsl_state.processor_ui_to_display); + if (global_gpu_state.curve_mapping_settings.lut) { + MEM_freeN(global_gpu_state.curve_mapping_settings.lut); } - if (global_glsl_state.curve_mapping) { - BKE_curvemapping_free(global_glsl_state.curve_mapping); + if (global_color_picking_state.cpu_processor_to) { + OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_to); } - if (global_glsl_state.curve_mapping_settings.lut) { - MEM_freeN(global_glsl_state.curve_mapping_settings.lut); + if (global_color_picking_state.cpu_processor_from) { + OCIO_cpuProcessorRelease(global_color_picking_state.cpu_processor_from); } - if (global_glsl_state.ocio_glsl_state) { - OCIO_freeOGLState(global_glsl_state.ocio_glsl_state); - } - - if (global_color_picking_state.processor_to) { - OCIO_processorRelease(global_color_picking_state.processor_to); - } - - if (global_color_picking_state.processor_from) { - OCIO_processorRelease(global_color_picking_state.processor_from); - } - - memset(&global_glsl_state, 0, sizeof(global_glsl_state)); + memset(&global_gpu_state, 0, sizeof(global_gpu_state)); memset(&global_color_picking_state, 0, sizeof(global_color_picking_state)); colormanage_free_config(); @@ -777,6 +751,12 @@ static bool colormanage_compatible_look(ColorManagedLook *look, const char *view return (look->view[0] == 0 || (view_name && STREQ(look->view, view_name))); } +static bool colormanage_use_look(const char *look, const char *view_name) +{ + ColorManagedLook *look_descr = colormanage_look_get_named(look); + return (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_name)); +} + void colormanage_cache_free(ImBuf *ibuf) { if (ibuf->display_buffer_flags) { @@ -852,95 +832,31 @@ static ColorSpace *display_transform_get_colorspace( return NULL; } -static OCIO_ConstProcessorRcPtr *create_display_buffer_processor(const char *look, - const char *view_transform, - const char *display, - float exposure, - float gamma, - const char *from_colorspace, - const bool linear_output) +static OCIO_ConstCPUProcessorRcPtr *create_display_buffer_processor(const char *look, + const char *view_transform, + const char *display, + float exposure, + float gamma, + const char *from_colorspace) { OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); - OCIO_DisplayTransformRcPtr *dt; - OCIO_ConstProcessorRcPtr *processor; - ColorManagedLook *look_descr = colormanage_look_get_named(look); + const bool use_look = colormanage_use_look(look, view_transform); + const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure); + const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma); - dt = OCIO_createDisplayTransform(); + OCIO_ConstProcessorRcPtr *processor = OCIO_createDisplayProcessor( + config, from_colorspace, view_transform, display, (use_look) ? look : "", scale, exponent); - OCIO_displayTransformSetInputColorSpaceName(dt, from_colorspace); - OCIO_displayTransformSetView(dt, view_transform); - OCIO_displayTransformSetDisplay(dt, display); - - if (look_descr->is_noop == false && colormanage_compatible_look(look_descr, view_transform)) { - OCIO_displayTransformSetLooksOverrideEnabled(dt, true); - OCIO_displayTransformSetLooksOverride(dt, look); - } - - /* fstop exposure control */ - if (exposure != 0.0f) { - OCIO_MatrixTransformRcPtr *mt; - float gain = powf(2.0f, exposure); - const float scale4f[] = {gain, gain, gain, 1.0f}; - float m44[16], offset4[4]; - - OCIO_matrixTransformScale(m44, offset4, scale4f); - mt = OCIO_createMatrixTransform(); - OCIO_matrixTransformSetValue(mt, m44, offset4); - OCIO_displayTransformSetLinearCC(dt, (OCIO_ConstTransformRcPtr *)mt); - - OCIO_matrixTransformRelease(mt); - } - - /* post-display gamma transform */ - if (gamma != 1.0f) { - OCIO_ExponentTransformRcPtr *et; - float exponent = 1.0f / MAX2(FLT_EPSILON, gamma); - const float exponent4f[] = {exponent, exponent, exponent, exponent}; - - et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, exponent4f); - OCIO_displayTransformSetDisplayCC(dt, (OCIO_ConstTransformRcPtr *)et); - - OCIO_exponentTransformRelease(et); - } - - OCIO_GroupTransformRcPtr *gt = OCIO_createGroupTransform(); - OCIO_groupTransformSetDirection(gt, true); - OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)dt); - - if (linear_output) { - /* TODO use correct function display. */ - OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, (float[4]){2.2f, 2.2f, 2.2f, 1.0f}); - OCIO_groupTransformPushBack(gt, (OCIO_ConstTransformRcPtr *)et); - OCIO_exponentTransformRelease(et); - } - - processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)gt); - - OCIO_groupTransformRelease(gt); - OCIO_displayTransformRelease(dt); OCIO_configRelease(config); - return processor; -} + if (processor == NULL) { + return NULL; + } -static OCIO_ConstProcessorRcPtr *create_display_encoded_buffer_processor( - const char *UNUSED(display)) -{ - OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *cpu_processor = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); - /* TODO use correct function display. */ - OCIO_ExponentTransformRcPtr *et = OCIO_createExponentTransform(); - OCIO_exponentTransformSetValue(et, (float[4]){1.0f / 2.2f, 1.0f / 2.2f, 1.0f / 2.2f, 1.0f}); - - processor = OCIO_configGetProcessor(config, (OCIO_ConstTransformRcPtr *)et); - - OCIO_exponentTransformRelease(et); - OCIO_configRelease(config); - - return processor; + return cpu_processor; } static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const char *from_colorspace, @@ -956,43 +872,54 @@ static OCIO_ConstProcessorRcPtr *create_colorspace_transform_processor(const cha return processor; } -static OCIO_ConstProcessorRcPtr *colorspace_to_scene_linear_processor(ColorSpace *colorspace) +static OCIO_ConstCPUProcessorRcPtr *colorspace_to_scene_linear_cpu_processor( + ColorSpace *colorspace) { if (colorspace->to_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); if (colorspace->to_scene_linear == NULL) { - OCIO_ConstProcessorRcPtr *to_scene_linear; - to_scene_linear = create_colorspace_transform_processor(colorspace->name, - global_role_scene_linear); - colorspace->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)to_scene_linear; + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( + colorspace->name, global_role_scene_linear); + + if (processor != NULL) { + colorspace->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)colorspace->to_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)colorspace->to_scene_linear; } -static OCIO_ConstProcessorRcPtr *colorspace_from_scene_linear_processor(ColorSpace *colorspace) +static OCIO_ConstCPUProcessorRcPtr *colorspace_from_scene_linear_cpu_processor( + ColorSpace *colorspace) { if (colorspace->from_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); if (colorspace->from_scene_linear == NULL) { - OCIO_ConstProcessorRcPtr *from_scene_linear; - from_scene_linear = create_colorspace_transform_processor(global_role_scene_linear, - colorspace->name); - colorspace->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)from_scene_linear; + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( + global_role_scene_linear, colorspace->name); + + if (processor != NULL) { + colorspace->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)colorspace->from_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)colorspace->from_scene_linear; } -static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManagedDisplay *display) +static OCIO_ConstCPUProcessorRcPtr *display_from_scene_linear_processor( + ColorManagedDisplay *display) { if (display->from_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); @@ -1011,16 +938,20 @@ static OCIO_ConstProcessorRcPtr *display_from_scene_linear_processor(ColorManage OCIO_configRelease(config); } - display->from_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor; + if (processor != NULL) { + display->from_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)display->from_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)display->from_scene_linear; } -static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display) +static OCIO_ConstCPUProcessorRcPtr *display_to_scene_linear_processor(ColorManagedDisplay *display) { if (display->to_scene_linear == NULL) { BLI_mutex_lock(&processor_lock); @@ -1039,13 +970,17 @@ static OCIO_ConstProcessorRcPtr *display_to_scene_linear_processor(ColorManagedD OCIO_configRelease(config); } - display->to_scene_linear = (struct OCIO_ConstProcessorRcPtr *)processor; + if (processor != NULL) { + display->to_scene_linear = (struct OCIO_ConstCPUProcessorRcPtr *) + OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } } BLI_mutex_unlock(&processor_lock); } - return (OCIO_ConstProcessorRcPtr *)display->to_scene_linear; + return (OCIO_ConstCPUProcessorRcPtr *)display->to_scene_linear; } void IMB_colormanagement_init_default_view_settings( @@ -2168,7 +2103,7 @@ void IMB_colormanagement_transform_v4(float pixel[4], */ void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2176,17 +2111,17 @@ void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], ColorSpac return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } /* same as above, but converts colors in opposite direction */ void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2194,10 +2129,10 @@ void IMB_colormanagement_scene_linear_to_colorspace_v3(float pixel[3], ColorSpac return; } - processor = colorspace_from_scene_linear_processor(colorspace); + processor = colorspace_from_scene_linear_cpu_processor(colorspace); - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } @@ -2205,7 +2140,7 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4], bool predivide, ColorSpace *colorspace) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2213,14 +2148,14 @@ void IMB_colormanagement_colorspace_to_scene_linear_v4(float pixel[4], return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { + if (processor != NULL) { if (predivide) { - OCIO_processorApplyRGBA_predivide(processor, pixel); + OCIO_cpuProcessorApplyRGBA_predivide(processor, pixel); } else { - OCIO_processorApplyRGBA(processor, pixel); + OCIO_cpuProcessorApplyRGBA(processor, pixel); } } } @@ -2232,7 +2167,7 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, struct ColorSpace *colorspace, bool predivide) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor; if (!colorspace) { /* should never happen */ @@ -2240,9 +2175,9 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, return; } - processor = colorspace_to_scene_linear_processor(colorspace); + processor = colorspace_to_scene_linear_cpu_processor(colorspace); - if (processor) { + if (processor != NULL) { OCIO_PackedImageDesc *img; img = OCIO_createOCIO_PackedImageDesc(buffer, @@ -2254,10 +2189,10 @@ void IMB_colormanagement_colorspace_to_scene_linear(float *buffer, (size_t)channels * sizeof(float) * width); if (predivide) { - OCIO_processorApply_predivide(processor, img); + OCIO_cpuProcessorApply_predivide(processor, img); } else { - OCIO_processorApply(processor, img); + OCIO_cpuProcessorApply(processor, img); } OCIO_PackedImageDescRelease(img); @@ -2278,10 +2213,10 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer, * without precision or performance loss at minimal memory usage. */ BLI_assert(ibuf->rect && ibuf->rect_float == NULL); - OCIO_ConstProcessorRcPtr *processor = NULL; + OCIO_ConstCPUProcessorRcPtr *processor = NULL; if (compress_as_srgb && ibuf->rect_colorspace && !IMB_colormanagement_space_is_srgb(ibuf->rect_colorspace)) { - processor = colorspace_to_scene_linear_processor(ibuf->rect_colorspace); + processor = colorspace_to_scene_linear_cpu_processor(ibuf->rect_colorspace); } /* TODO(brecht): make this multi-threaded, or at least process in batches. */ @@ -2294,12 +2229,12 @@ void IMB_colormanagement_imbuf_to_byte_texture(unsigned char *out_buffer, const unsigned char *in = in_buffer + in_offset * 4; unsigned char *out = out_buffer + out_offset * 4; - if (processor) { + if (processor != NULL) { /* Convert to scene linear, to sRGB and premultiply. */ for (int x = 0; x < width; x++, in += 4, out += 4) { float pixel[4]; rgba_uchar_to_float(pixel, in); - OCIO_processorApplyRGB(processor, pixel); + OCIO_cpuProcessorApplyRGB(processor, pixel); linearrgb_to_srgb_v3_v3(pixel, pixel); if (use_premultiply) { mul_v3_fl(pixel, pixel[3]); @@ -2390,15 +2325,19 @@ void IMB_colormanagement_imbuf_to_float_texture(float *out_buffer, */ void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3]) { - if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) { + if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) { /* Create processor if none exists. */ BLI_mutex_lock(&processor_lock); - if (!global_color_picking_state.processor_to && !global_color_picking_state.failed) { - global_color_picking_state.processor_to = create_colorspace_transform_processor( + if (!global_color_picking_state.cpu_processor_to && !global_color_picking_state.failed) { + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( global_role_scene_linear, global_role_color_picking); - if (!global_color_picking_state.processor_to) { + if (processor != NULL) { + global_color_picking_state.cpu_processor_to = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } + else { global_color_picking_state.failed = true; } } @@ -2406,22 +2345,26 @@ void IMB_colormanagement_scene_linear_to_color_picking_v3(float pixel[3]) BLI_mutex_unlock(&processor_lock); } - if (global_color_picking_state.processor_to) { - OCIO_processorApplyRGB(global_color_picking_state.processor_to, pixel); + if (global_color_picking_state.cpu_processor_to) { + OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_to, pixel); } } void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3]) { - if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) { + if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) { /* Create processor if none exists. */ BLI_mutex_lock(&processor_lock); - if (!global_color_picking_state.processor_from && !global_color_picking_state.failed) { - global_color_picking_state.processor_from = create_colorspace_transform_processor( + if (!global_color_picking_state.cpu_processor_from && !global_color_picking_state.failed) { + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor( global_role_color_picking, global_role_scene_linear); - if (!global_color_picking_state.processor_from) { + if (processor != NULL) { + global_color_picking_state.cpu_processor_from = OCIO_processorGetCPUProcessor(processor); + OCIO_processorRelease(processor); + } + else { global_color_picking_state.failed = true; } } @@ -2429,8 +2372,8 @@ void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3]) BLI_mutex_unlock(&processor_lock); } - if (global_color_picking_state.processor_from) { - OCIO_processorApplyRGB(global_color_picking_state.processor_from, pixel); + if (global_color_picking_state.cpu_processor_from) { + OCIO_cpuProcessorApplyRGB(global_color_picking_state.cpu_processor_from, pixel); } } @@ -2456,24 +2399,20 @@ void IMB_colormanagement_srgb_to_scene_linear_v3(float pixel[3]) */ void IMB_colormanagement_scene_linear_to_display_v3(float pixel[3], ColorManagedDisplay *display) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor = display_from_scene_linear_processor(display); - processor = display_from_scene_linear_processor(display); - - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } /* same as above, but converts color in opposite direction */ void IMB_colormanagement_display_to_scene_linear_v3(float pixel[3], ColorManagedDisplay *display) { - OCIO_ConstProcessorRcPtr *processor; + OCIO_ConstCPUProcessorRcPtr *processor = display_to_scene_linear_processor(display); - processor = display_to_scene_linear_processor(display); - - if (processor) { - OCIO_processorApplyRGB(processor, pixel); + if (processor != NULL) { + OCIO_cpuProcessorApplyRGB(processor, pixel); } } @@ -3833,13 +3772,13 @@ ColormanageProcessor *IMB_colormanagement_display_processor_new( cm_processor->is_data_result = display_space->is_data; } - cm_processor->processor = create_display_buffer_processor(applied_view_settings->look, - applied_view_settings->view_transform, - display_settings->display_device, - applied_view_settings->exposure, - applied_view_settings->gamma, - global_role_scene_linear, - false); + cm_processor->cpu_processor = create_display_buffer_processor( + applied_view_settings->look, + applied_view_settings->view_transform, + display_settings->display_device, + applied_view_settings->exposure, + applied_view_settings->gamma, + global_role_scene_linear); if (applied_view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) { cm_processor->curve_mapping = BKE_curvemapping_copy(applied_view_settings->curve_mapping); @@ -3860,7 +3799,12 @@ ColormanageProcessor *IMB_colormanagement_colorspace_processor_new(const char *f color_space = colormanage_colorspace_get_named(to_colorspace); cm_processor->is_data_result = color_space->is_data; - cm_processor->processor = create_colorspace_transform_processor(from_colorspace, to_colorspace); + OCIO_ConstProcessorRcPtr *processor = create_colorspace_transform_processor(from_colorspace, + to_colorspace); + if (processor != NULL) { + cm_processor->cpu_processor = OCIO_processorGetCPUProcessor(processor); + } + OCIO_processorRelease(processor); return cm_processor; } @@ -3871,8 +3815,8 @@ void IMB_colormanagement_processor_apply_v4(ColormanageProcessor *cm_processor, BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGBA(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGBA(cm_processor->cpu_processor, pixel); } } @@ -3883,8 +3827,8 @@ void IMB_colormanagement_processor_apply_v4_predivide(ColormanageProcessor *cm_p BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGBA_predivide(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGBA_predivide(cm_processor->cpu_processor, pixel); } } @@ -3894,8 +3838,8 @@ void IMB_colormanagement_processor_apply_v3(ColormanageProcessor *cm_processor, BKE_curvemapping_evaluate_premulRGBF(cm_processor->curve_mapping, pixel, pixel); } - if (cm_processor->processor) { - OCIO_processorApplyRGB(cm_processor->processor, pixel); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorApplyRGB(cm_processor->cpu_processor, pixel); } } @@ -3940,7 +3884,7 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor, } } - if (cm_processor->processor && channels >= 3) { + if (cm_processor->cpu_processor && channels >= 3) { OCIO_PackedImageDesc *img; /* apply OCIO processor */ @@ -3953,10 +3897,10 @@ void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor, (size_t)channels * sizeof(float) * width); if (predivide) { - OCIO_processorApply_predivide(cm_processor->processor, img); + OCIO_cpuProcessorApply_predivide(cm_processor->cpu_processor, img); } else { - OCIO_processorApply(cm_processor->processor, img); + OCIO_cpuProcessorApply(cm_processor->cpu_processor, img); } OCIO_PackedImageDescRelease(img); @@ -3986,8 +3930,8 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor) if (cm_processor->curve_mapping) { BKE_curvemapping_free(cm_processor->curve_mapping); } - if (cm_processor->processor) { - OCIO_processorRelease(cm_processor->processor); + if (cm_processor->cpu_processor) { + OCIO_cpuProcessorRelease(cm_processor->cpu_processor); } MEM_freeN(cm_processor); @@ -3995,19 +3939,6 @@ void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor) /* **** OpenGL drawing routines using GLSL for color space transform ***** */ -static bool check_glsl_display_processor_changed( - const ColorManagedViewSettings *view_settings, - const ColorManagedDisplaySettings *display_settings, - const char *from_colorspace) -{ - return !(global_glsl_state.exposure == view_settings->exposure && - global_glsl_state.gamma == view_settings->gamma && - STREQ(global_glsl_state.look, view_settings->look) && - STREQ(global_glsl_state.view, view_settings->view_transform) && - STREQ(global_glsl_state.display, display_settings->display_device) && - STREQ(global_glsl_state.input, from_colorspace)); -} - static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping, OCIO_CurveMappingSettings *curve_mapping_settings) { @@ -4041,94 +3972,60 @@ static void curve_mapping_to_ocio_settings(CurveMapping *curve_mapping, curve_mapping_settings->cache_id = (size_t)curve_mapping + curve_mapping->changed_timestamp; } -static void update_glsl_display_processor(const ColorManagedViewSettings *view_settings, - const ColorManagedDisplaySettings *display_settings, - const char *from_colorspace) +static OCIO_CurveMappingSettings *update_glsl_curve_mapping( + const ColorManagedViewSettings *view_settings) { - bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0; - bool need_update = false; - - need_update = global_glsl_state.processor_scene_to_ui == NULL || - check_glsl_display_processor_changed( - view_settings, display_settings, from_colorspace) || - use_curve_mapping != global_glsl_state.use_curve_mapping; - - if (use_curve_mapping && need_update == false) { - need_update |= view_settings->curve_mapping->changed_timestamp != - global_glsl_state.curve_mapping_timestamp || - view_settings->curve_mapping != global_glsl_state.orig_curve_mapping; + /* Using curve mapping? */ + const bool use_curve_mapping = (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) != 0; + if (!use_curve_mapping) { + return NULL; } - /* Update state if there's no processor yet or - * processor settings has been changed. - */ - if (need_update) { - OCIO_CurveMappingSettings *curve_mapping_settings = &global_glsl_state.curve_mapping_settings; - CurveMapping *new_curve_mapping = NULL; - - /* Store settings of processor for further comparison. */ - BLI_strncpy(global_glsl_state.look, view_settings->look, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.view, view_settings->view_transform, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.display, display_settings->display_device, MAX_COLORSPACE_NAME); - BLI_strncpy(global_glsl_state.input, from_colorspace, MAX_COLORSPACE_NAME); - global_glsl_state.exposure = view_settings->exposure; - global_glsl_state.gamma = view_settings->gamma; - - /* We're using curve mapping's address as a cache ID, - * so we need to make sure re-allocation gives new address here. - * We do this by allocating new curve mapping before freeing old one. */ - if (use_curve_mapping) { - new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping); - } - - if (global_glsl_state.curve_mapping) { - BKE_curvemapping_free(global_glsl_state.curve_mapping); - MEM_freeN(curve_mapping_settings->lut); - global_glsl_state.curve_mapping = NULL; - curve_mapping_settings->lut = NULL; - } - - /* Fill in OCIO's curve mapping settings. */ - if (use_curve_mapping) { - curve_mapping_to_ocio_settings(new_curve_mapping, &global_glsl_state.curve_mapping_settings); - - global_glsl_state.curve_mapping = new_curve_mapping; - global_glsl_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp; - global_glsl_state.orig_curve_mapping = view_settings->curve_mapping; - global_glsl_state.use_curve_mapping = true; - } - else { - global_glsl_state.orig_curve_mapping = NULL; - global_glsl_state.use_curve_mapping = false; - } - - /* Free old processor, if any. */ - if (global_glsl_state.processor_scene_to_ui) { - OCIO_processorRelease(global_glsl_state.processor_scene_to_ui); - } - - if (global_glsl_state.processor_ui_to_display) { - OCIO_processorRelease(global_glsl_state.processor_ui_to_display); - } - - /* We're using display OCIO processor, no RGB curves yet. */ - global_glsl_state.processor_scene_to_ui = create_display_buffer_processor( - global_glsl_state.look, - global_glsl_state.view, - global_glsl_state.display, - global_glsl_state.exposure, - global_glsl_state.gamma, - global_glsl_state.input, - true); - - global_glsl_state.processor_ui_to_display = create_display_encoded_buffer_processor( - global_glsl_state.display); + /* Already up to date? */ + OCIO_CurveMappingSettings *curve_mapping_settings = &global_gpu_state.curve_mapping_settings; + if (view_settings->curve_mapping->changed_timestamp == + global_gpu_state.curve_mapping_timestamp && + view_settings->curve_mapping == global_gpu_state.orig_curve_mapping) { + return curve_mapping_settings; } + + /* Need to update. */ + CurveMapping *new_curve_mapping = NULL; + + /* We're using curve mapping's address as a cache ID, + * so we need to make sure re-allocation gives new address here. + * We do this by allocating new curve mapping before freeing old one. */ + if (use_curve_mapping) { + new_curve_mapping = BKE_curvemapping_copy(view_settings->curve_mapping); + } + + if (global_gpu_state.curve_mapping) { + BKE_curvemapping_free(global_gpu_state.curve_mapping); + MEM_freeN(curve_mapping_settings->lut); + global_gpu_state.curve_mapping = NULL; + curve_mapping_settings->lut = NULL; + } + + /* Fill in OCIO's curve mapping settings. */ + if (use_curve_mapping) { + curve_mapping_to_ocio_settings(new_curve_mapping, &global_gpu_state.curve_mapping_settings); + + global_gpu_state.curve_mapping = new_curve_mapping; + global_gpu_state.curve_mapping_timestamp = view_settings->curve_mapping->changed_timestamp; + global_gpu_state.orig_curve_mapping = view_settings->curve_mapping; + global_gpu_state.use_curve_mapping = true; + } + else { + global_gpu_state.orig_curve_mapping = NULL; + global_gpu_state.use_curve_mapping = false; + } + + return curve_mapping_settings; } bool IMB_colormanagement_support_glsl_draw(const ColorManagedViewSettings *UNUSED(view_settings)) { - return OCIO_supportGLSLDraw(); + return OCIO_supportGPUShader(); } /** @@ -4165,27 +4062,40 @@ bool IMB_colormanagement_setup_glsl_draw_from_space( applied_view_settings = &default_view_settings; } - /* Make sure OCIO processor is up-to-date. */ - update_glsl_display_processor(applied_view_settings, - display_settings, - from_colorspace ? from_colorspace->name : - global_role_scene_linear); + /* Ensure curve mapping is up to data. */ + OCIO_CurveMappingSettings *curve_mapping_settings = update_glsl_curve_mapping( + applied_view_settings); - if (global_glsl_state.processor_scene_to_ui == NULL) { - /* Happens when requesting non-existing color space or LUT in the - * configuration file does not exist. - */ - return false; - } + /* GPU shader parameters. */ + const char *input = from_colorspace ? from_colorspace->name : global_role_scene_linear; + const char *view = applied_view_settings->view_transform; + const char *display = display_settings->display_device; + const bool use_look = colormanage_use_look(applied_view_settings->look, + applied_view_settings->view_transform); + const char *look = (use_look) ? applied_view_settings->look : ""; + const float exposure = applied_view_settings->exposure; + const float gamma = applied_view_settings->gamma; + const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure); + const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma); - return OCIO_setupGLSLDraw( - &global_glsl_state.ocio_glsl_state, - global_glsl_state.processor_scene_to_ui, - global_glsl_state.processor_ui_to_display, - global_glsl_state.use_curve_mapping ? &global_glsl_state.curve_mapping_settings : NULL, - dither, - predivide, - do_overlay_merge); + OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig(); + + /* Bind shader. Internally GPU shaders are created and cached on demand. */ + global_gpu_state.gpu_shader_bound = OCIO_gpuDisplayShaderBind(config, + input, + view, + display, + look, + curve_mapping_settings, + scale, + exponent, + dither, + predivide, + do_overlay_merge); + + OCIO_configRelease(config); + + return global_gpu_state.gpu_shader_bound; } /* Configures GLSL shader for conversion from scene linear to display space */ @@ -4225,8 +4135,9 @@ bool IMB_colormanagement_setup_glsl_draw_ctx(const bContext *C, float dither, bo /* Finish GLSL-based display space conversion */ void IMB_colormanagement_finish_glsl_draw(void) { - if (global_glsl_state.ocio_glsl_state != NULL) { - OCIO_finishGLSLDraw(global_glsl_state.ocio_glsl_state); + if (global_gpu_state.gpu_shader_bound) { + OCIO_gpuDisplayShaderUnbind(); + global_gpu_state.gpu_shader_bound = false; } } From 432b758ae3d0fa623f7a728c11abdf8301213739 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 12 Feb 2021 12:54:43 -0500 Subject: [PATCH 124/519] Py Doc: Update Sphinx and theme versions --- doc/python_api/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/python_api/requirements.txt b/doc/python_api/requirements.txt index 1e538f83b31..0c6a6883145 100644 --- a/doc/python_api/requirements.txt +++ b/doc/python_api/requirements.txt @@ -1,2 +1,2 @@ -Sphinx==3.1.1 -sphinx_rtd_theme==0.5.0 +Sphinx==3.4.3 +sphinx_rtd_theme==0.5.1 From 95cba371903febe2f39a3c86eca264e0a688cd52 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 12 Feb 2021 13:00:22 -0500 Subject: [PATCH 125/519] Py Doc: Delete old deployment scripts Now, the API docs are deployed via the new devops pipeline developed by James. --- doc/python_api/sphinx_doc_gen.sh | 156 -------------------- doc/python_api/sphinx_doc_update.py | 216 ---------------------------- 2 files changed, 372 deletions(-) delete mode 100755 doc/python_api/sphinx_doc_gen.sh delete mode 100755 doc/python_api/sphinx_doc_update.py diff --git a/doc/python_api/sphinx_doc_gen.sh b/doc/python_api/sphinx_doc_gen.sh deleted file mode 100755 index 26c3701f3e0..00000000000 --- a/doc/python_api/sphinx_doc_gen.sh +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/sh -# run from the blender source dir -# bash doc/python_api/sphinx_doc_gen.sh -# ssh upload means you need an account on the server - -# ---------------------------------------------------------------------------- -# Upload vars - -# disable for testing -DO_UPLOAD=true -DO_EXE_BLENDER=true -DO_OUT_HTML=true -DO_OUT_HTML_ZIP=true -DO_OUT_PDF=false - -if [ -z $BLENDER_BIN ] ; then - BLENDER_BIN="./blender.bin" -fi - -if [ "$1" == "" ] ; then - echo "Expected a single argument for the username on blender.org, skipping upload step!" - DO_UPLOAD=false -else - SSH_USER=$1 - SSH_HOST=$SSH_USER"@blender.org" - SSH_UPLOAD="/data/www/vhosts/www.blender.org/api" # blender_python_api_VERSION, added after -fi - - -# ---------------------------------------------------------------------------- -# Blender Version & Info - -# 'Blender 2.53 (sub 1) Build' --> '2_53_1' as a shell script. -# "_".join(str(v) for v in bpy.app.version) -# custom blender vars -blender_srcdir=$(dirname -- $0)/../.. -blender_version_header="$blender_srcdir/source/blender/blenkernel/BKE_blender_version.h" -blender_version=$(grep "BLENDER_VERSION\s" "$blender_version_header" | awk '{print $3}') -blender_version_cycle=$(grep "BLENDER_VERSION_CYCLE\s" "$blender_version_header" | awk '{print $3}') -unset blender_version_header - -BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100) - -SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION - -SPHINXBASE=doc/python_api - -SPHINX_WORKDIR="$(mktemp --directory --suffix=.sphinx)" - - -# ---------------------------------------------------------------------------- -# Generate reStructuredText (blender/python only) - -if $DO_EXE_BLENDER ; then - # Don't delete existing docs, now partial updates are used for quick builds. - # - # Disable ASAN error halt since it results in nonzero exit code on any minor issue. - ASAN_OPTIONS=halt_on_error=0:${ASAN_OPTIONS} \ - $BLENDER_BIN \ - --background \ - -noaudio \ - --factory-startup \ - --python-exit-code 1 \ - --python $SPHINXBASE/sphinx_doc_gen.py \ - -- \ - --output=$SPHINX_WORKDIR - - - if (($? != 0)) ; then - echo "Generating documentation failed, aborting" - exit 1 - fi -fi - -# ---------------------------------------------------------------------------- -# Generate HTML (sphinx) - -if $DO_OUT_HTML ; then - sphinx-build -b html -j auto $SPHINX_WORKDIR/sphinx-in $SPHINX_WORKDIR/sphinx-out - - # XXX, saves space on upload and zip, should move HTML outside - # and zip up there, for now this is OK - rm -rf sphinx-out/.doctrees - - # in case we have a zip already - rm -f blender_python_reference_$BLENDER_VERSION.zip - - # ------------------------------------------------------------------------ - # ZIP the HTML dir for upload - - if $DO_OUT_HTML_ZIP ; then - # lame, temp rename dir - mv sphinx-out blender_python_reference_$BLENDER_VERSION - zip -r -9 blender_python_reference_$BLENDER_VERSION.zip blender_python_reference_$BLENDER_VERSION - mv blender_python_reference_$BLENDER_VERSION sphinx-out - fi - - cd - -fi - - -# ---------------------------------------------------------------------------- -# Generate PDF (sphinx/laytex) - -if $DO_OUT_PDF ; then - sphinx-build -n -b latex -j auto $SPHINX_WORKDIR/sphinx-in $SPHINX_WORKDIR/sphinx-out - make -C $SPHINX_WORKDIR/sphinx-out - mv $SPHINX_WORKDIR/sphinx-out/contents.pdf \ - $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf -fi - -# ---------------------------------------------------------------------------- -# Upload to blender servers, comment this section for testing - -if $DO_UPLOAD ; then - - ssh $SSH_USER@blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*' - rsync --progress -ave "ssh -p 22" $SPHINX_WORKDIR/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/ - - ## symlink the dir to a static URL - #ssh $SSH_USER@blender.org 'rm '$SSH_UPLOAD'/250PythonDoc && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/250PythonDoc' - if [ "$blender_version_cycle" = "release" ] ; then - ssh $SSH_USER@blender.org 'rm '$SSH_UPLOAD'/blender_python_api_current && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/blender_python_api_current' - fi - - # better redirect - ssh $SSH_USER@blender.org 'echo "Redirecting...Redirecting..." > '$SSH_UPLOAD'/250PythonDoc/index.html' - - # redirect for release only so wiki can point here - if [ "$blender_version_cycle" = "release" ] ; then - ssh $SSH_USER@blender.org 'echo "Redirecting...Redirecting..." > '$SSH_UPLOAD'/blender_python_api/index.html' - fi - - if $DO_OUT_PDF ; then - # rename so local PDF has matching name. - rsync --progress -ave "ssh -p 22" \ - $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf \ - $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.pdf - fi - - if $DO_OUT_HTML_ZIP ; then - rsync --progress -ave "ssh -p 22" \ - $SPHINX_WORKDIR/blender_python_reference_$BLENDER_VERSION.zip \ - $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.zip - fi - -fi - - -# ---------------------------------------------------------------------------- -# Print some useful text - -echo "" -echo "Finished! view the docs from: " -if $DO_OUT_HTML ; then echo " html:" $SPHINX_WORKDIR/sphinx-out/index.html ; fi -if $DO_OUT_PDF ; then echo " pdf:" $SPHINX_WORKDIR/sphinx-out/blender_python_reference_$BLENDER_VERSION.pdf ; fi diff --git a/doc/python_api/sphinx_doc_update.py b/doc/python_api/sphinx_doc_update.py deleted file mode 100755 index 71b49d4949d..00000000000 --- a/doc/python_api/sphinx_doc_update.py +++ /dev/null @@ -1,216 +0,0 @@ -#!/usr/bin/env python3 - -# ##### BEGIN GPL LICENSE BLOCK ##### -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# ##### END GPL LICENSE BLOCK ##### - -# - -""" -This is a helper script to generate Blender Python API documentation (using Sphinx), and update server data using rsync. - -You'll need to specify your user login and password, obviously. - -Example usage: - - ./sphinx_doc_update.py --jobs 16 --mirror ../../../docs/remote_api_backup/ --source ../.. --blender ../../../build_cmake/bin/blender --user foobar --password barfoo - -""" - -import os -import shutil -import subprocess -import sys -import tempfile -import zipfile - - -DEFAULT_RSYNC_SERVER = "docs.blender.org" -DEFAULT_RSYNC_ROOT = "/api/" -DEFAULT_SYMLINK_ROOT = "/data/www/vhosts/docs.blender.org/api" - - -def argparse_create(): - import argparse - global __doc__ - - # When --help or no args are given, print this help - usage_text = __doc__ - - parser = argparse.ArgumentParser(description=usage_text, - formatter_class=argparse.RawDescriptionHelpFormatter) - - parser.add_argument( - "--mirror", dest="mirror_dir", - metavar='PATH', required=True, - help="Path to local rsync mirror of api doc server") - parser.add_argument( - "--source", dest="source_dir", - metavar='PATH', required=True, - help="Path to Blender git repository") - parser.add_argument( - "--blender", dest="blender", - metavar='PATH', required=True, - help="Path to Blender executable") - parser.add_argument( - "--rsync-server", dest="rsync_server", default=DEFAULT_RSYNC_SERVER, - metavar='RSYNCSERVER', type=str, required=False, - help=("rsync server address")) - parser.add_argument( - "--rsync-root", dest="rsync_root", default=DEFAULT_RSYNC_ROOT, - metavar='RSYNCROOT', type=str, required=False, - help=("Root path of API doc on rsync server")) - parser.add_argument( - "--user", dest="user", - metavar='USER', type=str, required=True, - help=("User to login on rsync server")) - parser.add_argument( - "--password", dest="password", - metavar='PASSWORD', type=str, required=True, - help=("Password to login on rsync server")) - parser.add_argument( - "--jobs", dest="jobs_nr", - metavar='NR', type=int, required=False, default=1, - help="Number of sphinx building jobs to launch in parallel") - - return parser - - -def main(): - # ---------- - # Parse Args - - args = argparse_create().parse_args() - - rsync_base = "rsync://%s@%s:%s" % (args.user, args.rsync_server, args.rsync_root) - - blenver = api_blenver = api_blenver_zip = "" - api_name = "" - branch = "" - is_release = is_beta = False - - # I) Update local mirror using rsync. - rsync_mirror_cmd = ("rsync", "--delete-after", "-avzz", rsync_base, args.mirror_dir) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - with tempfile.TemporaryDirectory() as tmp_dir: - # II) Generate doc source in temp dir. - doc_gen_cmd = ( - args.blender, "--background", "-noaudio", "--factory-startup", "--python-exit-code", "1", - "--python", "%s/doc/python_api/sphinx_doc_gen.py" % args.source_dir, "--", - "--output", tmp_dir - ) - subprocess.run(doc_gen_cmd) - - # III) Get Blender version info. - getver_file = os.path.join(tmp_dir, "blendver.txt") - getver_script = (r"""import sys, bpy -with open(sys.argv[-1], 'w') as f: - is_release = bpy.app.version_cycle in {'rc', 'release'} - is_beta = bpy.app.version_cycle in {'beta'} - branch = bpy.app.build_branch.split()[0].decode() - f.write('%d\n' % is_release) - f.write('%d\n' % is_beta) - f.write('%s\n' % branch) - f.write('%d.%d\n' % (bpy.app.version[0], bpy.app.version[1])) - f.write('%d.%d\n' % (bpy.app.version[0], bpy.app.version[1]) - if (is_release or is_beta) else '%s\n' % branch) - f.write('%d_%d' % (bpy.app.version[0], bpy.app.version[1])) -""") - get_ver_cmd = (args.blender, "--background", "-noaudio", "--factory-startup", "--python-exit-code", "1", - "--python-expr", getver_script, "--", getver_file) - subprocess.run(get_ver_cmd) - with open(getver_file) as f: - is_release, is_beta, branch, blenver, api_blenver, api_blenver_zip = f.read().split("\n") - is_release = bool(int(is_release)) - is_beta = bool(int(is_beta)) - os.remove(getver_file) - - # IV) Build doc. - curr_dir = os.getcwd() - os.chdir(tmp_dir) - sphinx_cmd = ("sphinx-build", "-j", str(args.jobs_nr), "-b", "html", "sphinx-in", "sphinx-out") - subprocess.run(sphinx_cmd) - shutil.rmtree(os.path.join("sphinx-out", ".doctrees")) - os.chdir(curr_dir) - - # V) Cleanup existing matching dir in server mirror (if any), and copy new doc. - api_name = api_blenver - api_dir = os.path.join(args.mirror_dir, api_name) - if os.path.exists(api_dir): - if os.path.islink(api_dir): - os.remove(api_dir) - else: - shutil.rmtree(api_dir) - os.rename(os.path.join(tmp_dir, "sphinx-out"), api_dir) - - # VI) Create zip archive. - zip_name = "blender_python_reference_%s" % api_blenver_zip # We can't use 'release' postfix here... - zip_path = os.path.join(args.mirror_dir, zip_name) - with zipfile.ZipFile(zip_path, 'w') as zf: - for dirname, _, filenames in os.walk(api_dir): - for filename in filenames: - filepath = os.path.join(dirname, filename) - zip_filepath = os.path.join(zip_name, os.path.relpath(filepath, api_dir)) - zf.write(filepath, arcname=zip_filepath) - os.rename(zip_path, os.path.join(api_dir, "%s.zip" % zip_name)) - - # VII) Create symlinks and html redirects. - if is_release: - symlink = os.path.join(args.mirror_dir, "current") - if os.path.exists(symlink): - if os.path.islink(symlink): - os.remove(symlink) - else: - shutil.rmtree(symlink) - os.symlink("./%s" % api_name, symlink) - with open(os.path.join(args.mirror_dir, "250PythonDoc/index.html"), 'w') as f: - f.write("Redirecting...Redirecting..." % api_name) - elif is_beta: - # We do not have any particular symlink for that stage. - pass - elif branch == "master": - # Also create a symlink from version number to actual master api doc. - symlink = os.path.join(args.mirror_dir, blenver) - if os.path.exists(symlink): - if os.path.islink(symlink): - os.remove(symlink) - else: - shutil.rmtree(symlink) - os.symlink("./%s" % api_name, symlink) - with open(os.path.join(args.mirror_dir, "blender_python_api/index.html"), 'w') as f: - f.write("Redirecting...Redirecting..." % api_name) - - # VIII) Upload (first do a dry-run so user can ensure everything is OK). - print("Doc generated in local mirror %s, please check it before uploading " - "(hit [Enter] to continue, [Ctrl-C] to exit):" % api_dir) - sys.stdin.read(1) - - rsync_mirror_cmd = ("rsync", "--dry-run", "--delete-after", "-avzz", args.mirror_dir, rsync_base) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - print("Rsync upload simulated, please check every thing is OK (hit [Enter] to continue, [Ctrl-C] to exit):") - sys.stdin.read(1) - - rsync_mirror_cmd = ("rsync", "--delete-after", "-avzz", args.mirror_dir, rsync_base) - subprocess.run(rsync_mirror_cmd, env=dict(os.environ, RSYNC_PASSWORD=args.password)) - - -if __name__ == "__main__": - main() From 97072e01354f9c6e5775079a8c7e51993059aa2a Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 12 Feb 2021 13:08:01 -0500 Subject: [PATCH 126/519] Py Doc: Fix rst syntax errors --- doc/python_api/rst/info_api_reference.rst | 2 +- doc/python_api/rst/info_quickstart.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/python_api/rst/info_api_reference.rst b/doc/python_api/rst/info_api_reference.rst index fb53fb1a992..19d09aee66c 100644 --- a/doc/python_api/rst/info_api_reference.rst +++ b/doc/python_api/rst/info_api_reference.rst @@ -186,7 +186,7 @@ For example, if you want to access the texture of a brush via Python to adjust i #. From the Sidebar expand the Brush Settings panel's *Texture* subpanel and add a new texture. *Notice the texture data-block menu itself doesn't have very useful links (you can check the tooltips).* #. The contrast setting isn't exposed in the Sidebar, so view the texture in the - :ref:`Properties Editor `. #. Open the context menu of the contrast field and select *Online Python Reference*. This takes you to ``bpy.types.Texture.contrast``. Now you can see that ``contrast`` is a property of texture. #. To find out how to access the texture from the brush check on the references at the bottom of the page. diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst index 2b5bb451e62..1053a982faa 100644 --- a/doc/python_api/rst/info_quickstart.rst +++ b/doc/python_api/rst/info_quickstart.rst @@ -35,7 +35,7 @@ but not to fully cover each topic. A quick list of helpful things to know before starting: -- Enable :ref:`Developer Extra ` and :ref:`Python Tooltips `. - The :ref:`Python Console ` is great for testing one-liners; it has autocompletion so you can inspect the API quickly. From ba03f7f0b1d0c40acf997749949a0b0efe19e6d0 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 12 Feb 2021 10:39:33 -0800 Subject: [PATCH 127/519] Fix T85562: Remove Win32 RIM_INPUTSINK Removal of Win32 code that allows background windows to receive raw input. Differential Revision: https://developer.blender.org/D10408 Reviewed by Brecht Van Lommel --- intern/ghost/intern/GHOST_SystemWin32.cpp | 6 ------ intern/ghost/intern/GHOST_WindowWin32.cpp | 10 ---------- 2 files changed, 16 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index b71b6b9e170..fb53357bb24 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1511,12 +1511,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Keyboard events, processed //////////////////////////////////////////////////////////////////////// case WM_INPUT: { - // check WM_INPUT from input sink when ghost window is not in the foreground - if (wParam == RIM_INPUTSINK) { - if (GetFocus() != hwnd) // WM_INPUT message not for this window - return 0; - } // else wParam == RIM_INPUT - RAWINPUT raw; RAWINPUT *raw_ptr = &raw; UINT rawSize = sizeof(RAWINPUT); diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 18aa19c0863..377eb61874d 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -220,16 +220,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, } } - if (parentwindow && !dialog) { - RAWINPUTDEVICE device = {0}; - device.usUsagePage = 0x01; /* usUsagePage & usUsage for keyboard*/ - device.usUsage = 0x06; /* http://msdn.microsoft.com/en-us/windows/hardware/gg487473.aspx */ - device.dwFlags |= - RIDEV_INPUTSINK; // makes WM_INPUT is visible for ghost when has parent window - device.hwndTarget = m_hWnd; - RegisterRawInputDevices(&device, 1, sizeof(device)); - } - // Initialize Windows Ink if (m_user32) { m_fpGetPointerInfoHistory = (GHOST_WIN32_GetPointerInfoHistory)::GetProcAddress( From d7c2c889a688067dab280fc137ad4c3c7ce4cb2b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 12:46:17 -0600 Subject: [PATCH 128/519] Geometry Nodes: Allow attribute nodes to use different domains Currently every attribute node assumes that the attribute exists on the "points" domain, so it generally isn't possible to work with attributes on other domains like edges, polygons, and corners. This commit adds a heuristic to each attribute node to determine the correct domain for the result attribute. In general, it works like this: - If the output attribute already exists, use that domain. - Otherwise, use the highest priority domain of the input attributes. - If none of the inputs are attributes, use the default domain (points). For the implementation I abstracted the check a bit, but in each node has a slightly different situation, so we end up with slightly different `get_result_domain` functions in each node. I think this makes sense, it keeps the code flexible and more easily understandable. Note that we might eventually want to expose a domain drop-down to some of the nodes. But that will be a separate discussion; this commit focuses on making a more useful choice automatically. Differential Revision: https://developer.blender.org/D10389 --- source/blender/nodes/NOD_geometry_exec.hh | 4 ++ .../nodes/geometry/node_geometry_util.cc | 46 +++++++++++++++++++ .../nodes/geometry/node_geometry_util.hh | 1 + .../nodes/node_geo_attribute_color_ramp.cc | 27 +++++++++-- .../nodes/node_geo_attribute_combine_xyz.cc | 17 ++++++- .../nodes/node_geo_attribute_compare.cc | 25 +++++++--- .../geometry/nodes/node_geo_attribute_fill.cc | 22 +++++++-- .../geometry/nodes/node_geo_attribute_math.cc | 29 ++++++++++-- .../geometry/nodes/node_geo_attribute_mix.cc | 24 ++++++---- .../nodes/node_geo_attribute_proximity.cc | 5 +- .../nodes/node_geo_attribute_randomize.cc | 21 +++++++-- .../node_geo_attribute_sample_texture.cc | 30 ++++++++++-- .../nodes/node_geo_attribute_separate_xyz.cc | 41 ++++++++++++++--- .../nodes/node_geo_attribute_vector_math.cc | 27 ++++++++++- .../geometry/nodes/node_geo_join_geometry.cc | 5 +- .../nodes/intern/node_geometry_exec.cc | 36 +++++++++++++++ 16 files changed, 312 insertions(+), 48 deletions(-) diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 91d46e3951f..222aa559e8a 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -222,6 +222,10 @@ class GeoNodeExecParams { const GeometryComponent &component, const CustomDataType default_type) const; + AttributeDomain get_highest_priority_input_domain(Span names, + const GeometryComponent &component, + const AttributeDomain default_domain) const; + private: /* Utilities for detecting common errors at when using this class. */ void check_extract_input(StringRef identifier, const CPPType *requested_type = nullptr) const; diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index 95c25795356..3e30658e056 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -338,6 +338,52 @@ CustomDataType attribute_data_type_highest_complexity(Span data_ return most_complex_type; } +/** + * \note Generally the order should mirror the order of the domains + * established in each component's ComponentAttributeProviders. + */ +static int attribute_domain_priority(const AttributeDomain domain) +{ + switch (domain) { +#if 0 + case ATTR_DOMAIN_CURVE: + return 0; +#endif + case ATTR_DOMAIN_POLYGON: + return 1; + case ATTR_DOMAIN_EDGE: + return 2; + case ATTR_DOMAIN_POINT: + return 3; + case ATTR_DOMAIN_CORNER: + return 4; + default: + /* Domain not supported in nodes yet. */ + BLI_assert(false); + return 0; + } +} + +/** + * Domains with a higher "information density" have a higher priority, in order + * to choose a domain that will not lose data through domain conversion. + */ +AttributeDomain attribute_domain_highest_priority(Span domains) +{ + int highest_priority = INT_MIN; + AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER; + + for (const AttributeDomain domain : domains) { + const int priority = attribute_domain_priority(domain); + if (priority > highest_priority) { + highest_priority = priority; + highest_priority_domain = domain; + } + } + + return highest_priority_domain; +} + } // namespace blender::nodes bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree) diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index 7ca44d82a38..13a58be86f6 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -45,6 +45,7 @@ void update_attribute_input_socket_availabilities(bNode &node, const bool name_is_available = true); CustomDataType attribute_data_type_highest_complexity(Span); +AttributeDomain attribute_domain_highest_priority(Span domains); Array get_geometry_element_ids_as_uints(const GeometryComponent &component, const AttributeDomain domain); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc index fc5fb4c5488..0309fb83bd7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc @@ -42,27 +42,44 @@ static void geo_node_attribute_color_ramp_layout(uiLayout *layout, namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + StringRef input_name, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the input attribute's domain if it exists. */ + ReadAttributePtr input_attribute = component.attribute_try_get_for_read(input_name); + if (input_attribute) { + return input_attribute->domain(); + } + + return ATTR_DOMAIN_POINT; +} + static void execute_on_component(const GeoNodeExecParams ¶ms, GeometryComponent &component) { const bNode &bnode = params.node(); NodeAttributeColorRamp *node_storage = (NodeAttributeColorRamp *)bnode.storage; + const std::string result_name = params.get_input("Result"); + const std::string input_name = params.get_input("Attribute"); /* Always output a color attribute for now. We might want to allow users to customize. * Using the type of an existing attribute could work, but does not have a real benefit * currently. */ const CustomDataType result_type = CD_PROP_COLOR; + const AttributeDomain result_domain = get_result_domain(component, input_name, result_name); - const std::string result_name = params.get_input("Result"); - /* Once we support more domains at the user level, we have to decide how the result domain is - * chosen. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { return; } - const std::string input_name = params.get_input("Attribute"); FloatReadAttribute attribute_in = component.attribute_get_for_read( input_name, result_domain, 0.0f); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc index a231b4f9e92..5214d938fb1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc @@ -69,14 +69,27 @@ static void geo_node_attribute_combine_xyz_update(bNodeTree *UNUSED(ntree), bNod *node, "Z", (GeometryNodeAttributeInputMode)node_storage->input_type_z); } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"X", "Y", "Z"}, component, ATTR_DOMAIN_POINT); +} + static void combine_attributes(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const std::string result_name = params.get_input("Result"); - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; if (result_name.empty()) { return; } + const AttributeDomain result_domain = get_result_domain(component, params, result_name); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, CD_PROP_FLOAT3); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index ee97102de7b..a6cd0dd7779 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -240,20 +240,31 @@ static CustomDataType get_data_type(GeometryComponent &component, return CD_PROP_FLOAT; } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT); +} + static void attribute_compare_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); NodeAttributeCompare *node_storage = (NodeAttributeCompare *)node.storage; const FloatCompareOperation operation = static_cast( node_storage->operation); - - /* The result type of this node is always float. */ - const CustomDataType result_type = CD_PROP_BOOL; - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; - - /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ const std::string result_name = params.get_input("Result"); + + const CustomDataType result_type = CD_PROP_BOOL; + const AttributeDomain result_domain = get_result_domain(component, params, result_name); + OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index a5ac1926963..d2a7e40877f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -67,16 +67,32 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the input domain chosen in the interface. */ + const bNode &node = params.node(); + return static_cast(node.custom2); +} + static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms) { - const bNode &node = params.node(); - const CustomDataType data_type = static_cast(node.custom1); - const AttributeDomain domain = static_cast(node.custom2); const std::string attribute_name = params.get_input("Attribute"); if (attribute_name.empty()) { return; } + const bNode &node = params.node(); + const CustomDataType data_type = static_cast(node.custom1); + const AttributeDomain domain = get_result_domain(component, params, attribute_name); + OutputAttributePtr attribute = component.attribute_try_get_for_output( attribute_name, domain, data_type); if (!attribute) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index 1780ec69df2..17718949de3 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -202,19 +202,40 @@ static void do_math_operation(Span span_input, UNUSED_VARS_NDEBUG(success); } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + const NodeMathOperation operation, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + const AttributeDomain default_domain = ATTR_DOMAIN_POINT; + if (operation_use_input_b(operation)) { + if (operation_use_input_c(operation)) { + return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A"}, component, default_domain); +} + static void attribute_math_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeMath *node_storage = (const NodeAttributeMath *)node.storage; const NodeMathOperation operation = static_cast(node_storage->operation); + const std::string result_name = params.get_input("Result"); /* The result type of this node is always float. */ const CustomDataType result_type = CD_PROP_FLOAT; - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + const AttributeDomain result_domain = get_result_domain( + component, params, operation, result_name); - /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ - const std::string result_name = params.get_input("Result"); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index 2dbfcd2819c..e515f253a46 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -125,10 +125,25 @@ static void do_mix_operation(const CustomDataType result_type, } } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + return params.get_highest_priority_input_domain({"A", "B"}, component, ATTR_DOMAIN_POINT); +} + static void attribute_mix_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeMix *node_storage = (const NodeAttributeMix *)node.storage; + const std::string result_name = params.get_input("Result"); /* Use the highest complexity data type among the inputs and outputs, that way the node will * never "remove information". Use CD_PROP_BOOL as the lowest complexity data type, but in any @@ -139,14 +154,7 @@ static void attribute_mix_calc(GeometryComponent &component, const GeoNodeExecPa params.get_input_attribute_data_type("Result", component, CD_PROP_BOOL), }); - /* Once we support more domains at the user level, we have to decide how the result domain is - * chosen. */ - AttributeDomain result_domain = ATTR_DOMAIN_POINT; - const std::string result_name = params.get_input("Result"); - const ReadAttributePtr result_attribute_read = component.attribute_try_get_for_read(result_name); - if (result_attribute_read) { - result_domain = result_attribute_read->domain(); - } + const AttributeDomain result_domain = get_result_domain(component, params, result_name); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index e46fdaa127a..51f208ed07d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -148,9 +148,12 @@ static void attribute_calc_proximity(GeometryComponent &component, GeometrySet &geometry_set_target, GeoNodeExecParams ¶ms) { + /* This node works on the "point" domain, since that is where positions are stored. */ + const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + const std::string result_attribute_name = params.get_input("Result"); OutputAttributePtr distance_attribute = component.attribute_try_get_for_output( - result_attribute_name, ATTR_DOMAIN_POINT, CD_PROP_FLOAT); + result_attribute_name, result_domain, CD_PROP_FLOAT); ReadAttributePtr position_attribute = component.attribute_try_get_for_read("position"); BLI_assert(position_attribute->custom_data_type() == CD_PROP_FLOAT3); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index f4399b45b2e..7e95714a44b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -153,17 +153,32 @@ Array get_geometry_element_ids_as_uints(const GeometryComponent &compo return hashes; } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(attribute_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the input domain chosen in the interface. */ + const bNode &node = params.node(); + return static_cast(node.custom2); +} + static void randomize_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms, const int seed) { - const bNode &node = params.node(); - const CustomDataType data_type = static_cast(node.custom1); - const AttributeDomain domain = static_cast(node.custom2); const std::string attribute_name = params.get_input("Attribute"); if (attribute_name.empty()) { return; } + const bNode &node = params.node(); + const CustomDataType data_type = static_cast(node.custom1); + const AttributeDomain domain = get_result_domain(component, params, attribute_name); OutputAttributePtr attribute = component.attribute_try_get_for_output( attribute_name, domain, data_type); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc index fc3cd099d41..dd8f0adb740 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc @@ -48,29 +48,51 @@ static void geo_node_attribute_sample_texture_layout(uiLayout *layout, namespace blender::nodes { +static AttributeDomain get_result_domain(const GeometryComponent &component, + StringRef result_attribute_name, + StringRef map_attribute_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_attribute_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the name of the map attribute. */ + ReadAttributePtr map_attribute = component.attribute_try_get_for_read(map_attribute_name); + if (map_attribute) { + return map_attribute->domain(); + } + + /* The node won't execute in this case, but we still have to return a value. */ + return ATTR_DOMAIN_POINT; +} + static void execute_on_component(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); Tex *texture = reinterpret_cast(node.id); - const std::string result_attribute_name = params.get_input("Result"); - if (texture == nullptr) { return; } + const std::string result_attribute_name = params.get_input("Result"); const std::string mapping_name = params.get_input("Mapping"); if (!component.attribute_exists(mapping_name)) { return; } + const AttributeDomain result_domain = get_result_domain( + component, result_attribute_name, mapping_name); + OutputAttributePtr attribute_out = component.attribute_try_get_for_output( - result_attribute_name, ATTR_DOMAIN_POINT, CD_PROP_COLOR); + result_attribute_name, result_domain, CD_PROP_COLOR); if (!attribute_out) { return; } Float3ReadAttribute mapping_attribute = component.attribute_get_for_read( - mapping_name, ATTR_DOMAIN_POINT, {0, 0, 0}); + mapping_name, result_domain, {0, 0, 0}); MutableSpan colors = attribute_out->get_span(); for (const int i : IndexRange(mapping_attribute.size())) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc index 07941f7db79..2e02ad9836d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -69,22 +69,49 @@ static void extract_input(const int index, const Span &input, MutableSpa } } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef result_name_x, + StringRef result_name_y, + StringRef result_name_z) +{ + /* Use the highest priority domain from any existing attribute outputs. */ + Vector output_domains; + ReadAttributePtr attribute_x = component.attribute_try_get_for_read(result_name_x); + ReadAttributePtr attribute_y = component.attribute_try_get_for_read(result_name_y); + ReadAttributePtr attribute_z = component.attribute_try_get_for_read(result_name_z); + if (attribute_x) { + output_domains.append(attribute_x->domain()); + } + if (attribute_y) { + output_domains.append(attribute_y->domain()); + } + if (attribute_z) { + output_domains.append(attribute_z->domain()); + } + if (output_domains.size() > 0) { + return attribute_domain_highest_priority(output_domains); + } + + /* Otherwise use the domain of the input attribute, or the default. */ + return params.get_highest_priority_input_domain({"Vector"}, component, ATTR_DOMAIN_POINT); +} + static void separate_attribute(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const std::string result_name_x = params.get_input("Result X"); const std::string result_name_y = params.get_input("Result Y"); const std::string result_name_z = params.get_input("Result Z"); - /* The node is only for float3 to float conversions. */ - const CustomDataType input_type = CD_PROP_FLOAT3; - const CustomDataType result_type = CD_PROP_FLOAT; - /* The result domain is always point for now. */ - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; - - /* No output to write to. */ if (result_name_x.empty() && result_name_y.empty() && result_name_z.empty()) { return; } + /* The node is only for float3 to float conversions. */ + const CustomDataType input_type = CD_PROP_FLOAT3; + const CustomDataType result_type = CD_PROP_FLOAT; + const AttributeDomain result_domain = get_result_domain( + component, params, result_name_x, result_name_y, result_name_z); + ReadAttributePtr attribute_input = params.get_input_attribute( "Vector", component, result_domain, input_type, nullptr); if (!attribute_input) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc index adcdab58e30..45b28d154f4 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc @@ -327,12 +327,35 @@ static void do_math_operation_fl3_to_fl(const Float3ReadAttribute &input_a, UNUSED_VARS_NDEBUG(success); } +static AttributeDomain get_result_domain(const GeometryComponent &component, + const GeoNodeExecParams ¶ms, + const NodeVectorMathOperation operation, + StringRef result_name) +{ + /* Use the domain of the result attribute if it already exists. */ + ReadAttributePtr result_attribute = component.attribute_try_get_for_read(result_name); + if (result_attribute) { + return result_attribute->domain(); + } + + /* Otherwise use the highest priority domain from existing input attributes, or the default. */ + const AttributeDomain default_domain = ATTR_DOMAIN_POINT; + if (operation_use_input_b(operation)) { + if (operation_use_input_c(operation)) { + return params.get_highest_priority_input_domain({"A", "B", "C"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A", "B"}, component, default_domain); + } + return params.get_highest_priority_input_domain({"A"}, component, default_domain); +} + static void attribute_vector_math_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms) { const bNode &node = params.node(); const NodeAttributeVectorMath *node_storage = (const NodeAttributeVectorMath *)node.storage; const NodeVectorMathOperation operation = (NodeVectorMathOperation)node_storage->operation; + const std::string result_name = params.get_input("Result"); /* The number and type of the input attribute depend on the operation. */ const CustomDataType read_type_a = CD_PROP_FLOAT3; @@ -343,7 +366,8 @@ static void attribute_vector_math_calc(GeometryComponent &component, /* The result domain is always point for now. */ const CustomDataType result_type = operation_get_result_type(operation); - const AttributeDomain result_domain = ATTR_DOMAIN_POINT; + const AttributeDomain result_domain = get_result_domain( + component, params, operation, result_name); ReadAttributePtr attribute_a = params.get_input_attribute( "A", component, result_domain, read_type_a, nullptr); @@ -366,7 +390,6 @@ static void attribute_vector_math_calc(GeometryComponent &component, } /* Get result attribute first, in case it has to overwrite one of the existing attributes. */ - const std::string result_name = params.get_input("Result"); OutputAttributePtr attribute_result = component.attribute_try_get_for_output( result_name, result_domain, result_type); if (!attribute_result) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index ca2e1be6e6f..4fec14ec9c9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -147,16 +147,17 @@ static void determine_final_data_type_and_domain(Span AttributeDomain *r_domain) { Vector data_types; + Vector domains; for (const GeometryComponent *component : components) { ReadAttributePtr attribute = component->attribute_try_get_for_read(attribute_name); if (attribute) { data_types.append(attribute->custom_data_type()); - /* TODO: Use highest priority domain. */ - *r_domain = attribute->domain(); + domains.append(attribute->domain()); } } *r_type = attribute_data_type_highest_complexity(data_types); + *r_domain = attribute_domain_highest_priority(domains); } static void fill_new_attribute(Span src_components, diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index eef2c6c9125..6ddeb73e31f 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -17,6 +17,8 @@ #include "NOD_geometry_exec.hh" #include "NOD_type_callbacks.hh" +#include "node_geometry_util.hh" + namespace blender::nodes { const bNodeSocket *GeoNodeExecParams::find_available_socket(const StringRef name) const @@ -104,6 +106,40 @@ CustomDataType GeoNodeExecParams::get_input_attribute_data_type( return default_type; } +/** + * If any of the corresponding input sockets are attributes instead of single values, + * use the highest priority attribute domain from among them. + * Otherwise return the default domain. + */ +AttributeDomain GeoNodeExecParams::get_highest_priority_input_domain( + Span names, + const GeometryComponent &component, + const AttributeDomain default_domain) const +{ + Vector input_domains; + for (const std::string &name : names) { + const bNodeSocket *found_socket = this->find_available_socket(name); + BLI_assert(found_socket != nullptr); /* A socket should be available socket for the name. */ + if (found_socket == nullptr) { + continue; + } + + if (found_socket->type == SOCK_STRING) { + const std::string name = this->get_input(found_socket->identifier); + ReadAttributePtr attribute = component.attribute_try_get_for_read(name); + if (attribute) { + input_domains.append(attribute->domain()); + } + } + } + + if (input_domains.size() > 0) { + return attribute_domain_highest_priority(input_domains); + } + + return default_domain; +} + void GeoNodeExecParams::check_extract_input(StringRef identifier, const CPPType *requested_type) const { From d4fd06d6ce89113310bb769f4777c9a4d77cb155 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 13:25:45 -0600 Subject: [PATCH 129/519] Geometry Nodes: Add operation setting to attribute randomize node This commit adds a drop-down to the attribute randomize node to support a few operations on the values of existing attributes: "Replace/Create" (the existing behavior), "Add", "Subtract", and "Multiply". At this point, the operations are limited by what is simple to implement. More could be added in the future, but there isn't a strong use case for more complex operations anyway, and a second math node can be used. Differential Revision: https://developer.blender.org/D10269 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenlib/BLI_hash.h | 10 + .../blenloader/intern/versioning_290.c | 19 ++ source/blender/makesdna/DNA_node_types.h | 18 ++ source/blender/makesrna/intern/rna_nodetree.c | 96 +++++++- .../nodes/node_geo_attribute_randomize.cc | 206 ++++++++++++------ 6 files changed, 272 insertions(+), 79 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index c6fe02202a6..7db6980c91a 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 7 +#define BLENDER_FILE_SUBVERSION 8 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenlib/BLI_hash.h b/source/blender/blenlib/BLI_hash.h index d687e805323..cfd39ea3cf8 100644 --- a/source/blender/blenlib/BLI_hash.h +++ b/source/blender/blenlib/BLI_hash.h @@ -90,6 +90,16 @@ BLI_INLINE unsigned int BLI_hash_string(const char *str) return i; } +BLI_INLINE float BLI_hash_int_2d_to_float(uint32_t kx, uint32_t ky) +{ + return (float)BLI_hash_int_2d(kx, ky) / (float)0xFFFFFFFFu; +} + +BLI_INLINE float BLI_hash_int_3d_to_float(uint32_t kx, uint32_t ky, uint32_t kz) +{ + return (float)BLI_hash_int_3d(kx, ky, kz) / (float)0xFFFFFFFFu; +} + BLI_INLINE unsigned int BLI_hash_int(unsigned int k) { return BLI_hash_int_2d(k, 0); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 78d60715aa5..74b3827ffd0 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1704,6 +1704,25 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } FOREACH_NODETREE_END; } + + if (!MAIN_VERSION_ATLEAST(bmain, 293, 8)) { + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type != NTREE_GEOMETRY) { + continue; + } + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + if (node->type == GEO_NODE_POINT_INSTANCE && node->storage == NULL) { + NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN( + sizeof(NodeAttributeRandomize), __func__); + data->data_type = node->custom1; + data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + node->storage = data; + } + } + } + FOREACH_NODETREE_END; + } + /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 43c5fa81651..fd9fcfa3232 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1109,6 +1109,16 @@ typedef struct NodeAttributeMix { uint8_t input_type_b; } NodeAttributeMix; +typedef struct NodeAttributeRandomize { + /* CustomDataType. */ + uint8_t data_type; + /* AttributeDomain. */ + uint8_t domain; + /* GeometryNodeAttributeRandomizeMode. */ + uint8_t operation; + char _pad[1]; +} NodeAttributeRandomize; + typedef struct NodeAttributeVectorMath { /* NodeVectorMathOperation */ uint8_t operation; @@ -1637,6 +1647,7 @@ typedef enum GeometryNodeAttributeInputMode { GEO_NODE_ATTRIBUTE_INPUT_VECTOR = 2, GEO_NODE_ATTRIBUTE_INPUT_COLOR = 3, GEO_NODE_ATTRIBUTE_INPUT_BOOLEAN = 4, + GEO_NODE_ATTRIBUTE_INPUT_INTEGER = 5, } GeometryNodeAttributeInputMode; typedef enum GeometryNodePointDistributeMethod { @@ -1649,6 +1660,13 @@ typedef enum GeometryNodeRotatePointsType { GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE = 1, } GeometryNodeRotatePointsType; +typedef enum GeometryNodeAttributeRandomizeMode { + GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE = 0, + GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD = 1, + GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT = 2, + GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY = 3, +} GeometryNodeAttributeRandomizeMode; + typedef enum GeometryNodeRotatePointsSpace { GEO_NODE_POINT_ROTATE_SPACE_OBJECT = 0, GEO_NODE_POINT_ROTATE_SPACE_POINT = 1, diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 3a9d373e30e..75d7c7a4588 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -355,6 +355,30 @@ const EnumPropertyItem rna_enum_node_filter_items[] = { {0, NULL, 0, NULL, NULL}, }; +static const EnumPropertyItem rna_node_geometry_attribute_randomize_operation_items[] = { + {GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE, + "REPLACE_CREATE", + ICON_NONE, + "Replace/Create", + "Replace the value and data type of an existing attribute, or create a new one"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD, + "ADD", + ICON_NONE, + "Add", + "Add the random values to the existing attribute values"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT, + "SUBTRACT", + ICON_NONE, + "Subtract", + "Subtract random values from the existing attribute values"}, + {GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY, + "MULTIPLY", + ICON_NONE, + "Multiply", + "Multiply the existing attribute values with the random values"}, + {0, NULL, 0, NULL, NULL}, +}; + #ifndef RNA_RUNTIME static const EnumPropertyItem node_sampler_type_items[] = { {0, "NEAREST", 0, "Nearest", ""}, @@ -1921,7 +1945,7 @@ static const EnumPropertyItem *itemf_function_check( static bool attribute_random_type_supported(const EnumPropertyItem *item) { - return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL); + return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL, CD_PROP_INT32); } static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf( bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) @@ -1930,15 +1954,47 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf( return itemf_function_check(rna_enum_attribute_type_items, attribute_random_type_supported); } -static bool attribute_random_domain_supported(const EnumPropertyItem *item) -{ - return item->value == ATTR_DOMAIN_POINT; -} -static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_domain_itemf( - bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) +static const EnumPropertyItem *rna_GeometryNodeAttributeRandomize_operation_itemf( + bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { + bNode *node = ptr->data; + const NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage; + const CustomDataType data_type = (CustomDataType)node_storage->data_type; + + EnumPropertyItem *item_array = NULL; + int items_len = 0; + for (const EnumPropertyItem *item = rna_node_geometry_attribute_randomize_operation_items; + item->identifier != NULL; + item++) { + if (data_type == CD_PROP_BOOL) { + if (item->value == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + else { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + RNA_enum_item_end(&item_array, &items_len); + *r_free = true; - return itemf_function_check(rna_enum_attribute_domain_items, attribute_random_domain_supported); + return item_array; +} + +static void rna_GeometryNodeAttributeRandomize_data_type_update(Main *bmain, + Scene *scene, + PointerRNA *ptr) +{ + bNode *node = ptr->data; + NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage; + + /* The boolean data type has no extra operations besides, + * replace, so make sure the enum value is set properly. */ + if (node_storage->data_type == CD_PROP_BOOL) { + node_storage->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + } + + rna_Node_socket_update(bmain, scene, ptr); } static bool attribute_fill_type_supported(const EnumPropertyItem *item) @@ -8528,9 +8584,27 @@ static void def_geo_attribute_create_common(StructRNA *srna, static void def_geo_attribute_randomize(StructRNA *srna) { - def_geo_attribute_create_common(srna, - "rna_GeometryNodeAttributeRandom_type_itemf", - "rna_GeometryNodeAttributeRandom_domain_itemf"); + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeAttributeRandomize", "storage"); + + prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "data_type"); + RNA_def_property_enum_items(prop, rna_enum_attribute_type_items); + RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeRandom_type_itemf"); + RNA_def_property_enum_default(prop, CD_PROP_FLOAT); + RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute"); + RNA_def_property_update( + prop, NC_NODE | NA_EDITED, "rna_GeometryNodeAttributeRandomize_data_type_update"); + + prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "operation"); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_randomize_operation_items); + RNA_def_property_enum_funcs( + prop, NULL, NULL, "rna_GeometryNodeAttributeRandomize_operation_itemf"); + RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); + RNA_def_property_ui_text(prop, "Operation", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } static void def_geo_attribute_fill(StructRNA *srna) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index 7e95714a44b..dc924ede3a1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -32,6 +32,8 @@ static bNodeSocketTemplate geo_node_attribute_randomize_in[] = { {SOCK_VECTOR, N_("Max"), 1.0f, 1.0f, 1.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_FLOAT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_FLOAT, N_("Max"), 1.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_INT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -100000, 100000}, + {SOCK_INT, N_("Max"), 100.0f, 0.0f, 0.0f, 0.0f, -100000, 100000}, {SOCK_INT, N_("Seed"), 0, 0, 0, 0, -10000, 10000}, {-1, ""}, }; @@ -46,11 +48,17 @@ static void geo_node_attribute_random_layout(uiLayout *layout, PointerRNA *ptr) { uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); + uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); } static void geo_node_attribute_randomize_init(bNodeTree *UNUSED(tree), bNode *node) { - node->custom1 = CD_PROP_FLOAT; + NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN( + sizeof(NodeAttributeRandomize), __func__); + data->data_type = CD_PROP_FLOAT; + data->domain = ATTR_DOMAIN_POINT; + data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE; + node->storage = data; } static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode *node) @@ -59,71 +67,97 @@ static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode bNodeSocket *sock_max_vector = sock_min_vector->next; bNodeSocket *sock_min_float = sock_max_vector->next; bNodeSocket *sock_max_float = sock_min_float->next; + bNodeSocket *sock_min_int = sock_max_float->next; + bNodeSocket *sock_max_int = sock_min_int->next; - const CustomDataType data_type = static_cast(node->custom1); + const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)node->storage; + const CustomDataType data_type = static_cast(storage.data_type); nodeSetSocketAvailability(sock_min_vector, data_type == CD_PROP_FLOAT3); nodeSetSocketAvailability(sock_max_vector, data_type == CD_PROP_FLOAT3); nodeSetSocketAvailability(sock_min_float, data_type == CD_PROP_FLOAT); nodeSetSocketAvailability(sock_max_float, data_type == CD_PROP_FLOAT); + nodeSetSocketAvailability(sock_min_int, data_type == CD_PROP_INT32); + nodeSetSocketAvailability(sock_max_int, data_type == CD_PROP_INT32); } namespace blender::nodes { -/** Rehash to combine the seed with the "id" hash and a mutator for each dimension. */ -static float noise_from_index_and_mutator(const int seed, const int hash, const int mutator) +template T get_random_value(const uint32_t id, const uint32_t seed); + +template<> inline bool get_random_value(const uint32_t id, const uint32_t seed) { - const int combined_hash = BLI_hash_int_3d(seed, hash, mutator); - return BLI_hash_int_01(combined_hash); + return BLI_hash_int_2d_to_float(id, seed) > 0.5f; } -/** Rehash to combine the seed with the "id" hash. */ -static float noise_from_index(const int seed, const int hash) +template<> inline int get_random_value(const uint32_t id, const uint32_t seed) { - const int combined_hash = BLI_hash_int_2d(seed, hash); - return BLI_hash_int_01(combined_hash); + return BLI_hash_int_2d(id, seed); } -static void randomize_attribute_bool(BooleanWriteAttribute attribute, - Span hashes, - const int seed) +template<> inline float get_random_value(const uint32_t id, const uint32_t seed) { - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const bool value = noise_from_index(seed, (int)hashes[i]) > 0.5f; - attribute_span[i] = value; + return BLI_hash_int_2d_to_float(id, seed); +} + +template<> inline float3 get_random_value(const uint32_t id, const uint32_t seed) +{ + const float x = BLI_hash_int_3d_to_float(seed, id, 435109); + const float y = BLI_hash_int_3d_to_float(seed, id, 380867); + const float z = BLI_hash_int_3d_to_float(seed, id, 1059217); + + return float3(x, y, z); +} + +template +static void randomize_attribute(MutableSpan span, + const T min, + const T max, + Span ids, + const uint32_t seed, + const GeometryNodeAttributeRandomizeMode operation) +{ + /* The operations could be templated too, but it doesn't make the code much shorter. */ + switch (operation) { + case GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE: + for (const int i : span.index_range()) { + const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + span[i] = random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD: + for (const int i : span.index_range()) { + const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + span[i] = span[i] + random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT: + for (const int i : span.index_range()) { + const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + span[i] = span[i] - random_value; + } + break; + case GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY: + for (const int i : span.index_range()) { + const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + span[i] = span[i] * random_value; + } + break; + default: + BLI_assert(false); + break; } - attribute.apply_span(); } -static void randomize_attribute_float(FloatWriteAttribute attribute, - const float min, - const float max, - Span hashes, - const int seed) +static void randomize_attribute_bool(MutableSpan span, + Span ids, + const uint32_t seed, + const GeometryNodeAttributeRandomizeMode operation) { - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const float value = noise_from_index(seed, (int)hashes[i]) * (max - min) + min; - attribute_span[i] = value; + BLI_assert(operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); + for (const int i : span.index_range()) { + const bool random_value = get_random_value(ids[i], seed); + span[i] = random_value; } - attribute.apply_span(); -} - -static void randomize_attribute_float3(Float3WriteAttribute attribute, - const float3 min, - const float3 max, - Span hashes, - const int seed) -{ - MutableSpan attribute_span = attribute.get_span(); - for (const int i : IndexRange(attribute.size())) { - const float x = noise_from_index_and_mutator(seed, (int)hashes[i], 47); - const float y = noise_from_index_and_mutator(seed, (int)hashes[i], 8); - const float z = noise_from_index_and_mutator(seed, (int)hashes[i], 64); - const float3 value = float3(x, y, z) * (max - min) + min; - attribute_span[i] = value; - } - attribute.apply_span(); } Array get_geometry_element_ids_as_uints(const GeometryComponent &component, @@ -168,16 +202,21 @@ static AttributeDomain get_result_domain(const GeometryComponent &component, return static_cast(node.custom2); } -static void randomize_attribute(GeometryComponent &component, - const GeoNodeExecParams ¶ms, - const int seed) +static void randomize_attribute_on_component(GeometryComponent &component, + const GeoNodeExecParams ¶ms, + StringRef attribute_name, + const CustomDataType data_type, + const GeometryNodeAttributeRandomizeMode operation, + const int seed) { - const std::string attribute_name = params.get_input("Attribute"); - if (attribute_name.empty()) { - return; + /* If the node is not in "replace / create" mode and the attribute + * doesn't already exist, don't do the operation. */ + if (operation != GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) { + if (!component.attribute_exists(attribute_name)) { + return; + } } - const bNode &node = params.node(); - const CustomDataType data_type = static_cast(node.custom1); + const AttributeDomain domain = get_result_domain(component, params, attribute_name); OutputAttributePtr attribute = component.attribute_try_get_for_output( @@ -186,44 +225,75 @@ static void randomize_attribute(GeometryComponent &component, return; } + fn::GMutableSpan span = (operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) ? + attribute->get_span_for_write_only() : + attribute->get_span(); + Array hashes = get_geometry_element_ids_as_uints(component, domain); switch (data_type) { - case CD_PROP_FLOAT: { - const float min_value = params.get_input("Min_001"); - const float max_value = params.get_input("Max_001"); - randomize_attribute_float(*attribute, min_value, max_value, hashes, seed); + case CD_PROP_FLOAT3: { + const float3 min = params.get_input("Min"); + const float3 max = params.get_input("Max"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; } - case CD_PROP_FLOAT3: { - const float3 min_value = params.get_input("Min"); - const float3 max_value = params.get_input("Max"); - randomize_attribute_float3(*attribute, min_value, max_value, hashes, seed); + case CD_PROP_FLOAT: { + const float min = params.get_input("Min_001"); + const float max = params.get_input("Max_001"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; } case CD_PROP_BOOL: { - randomize_attribute_bool(*attribute, hashes, seed); + randomize_attribute_bool(span.typed(), hashes, seed, operation); break; } - default: + case CD_PROP_INT32: { + const int min = params.get_input("Min_002"); + const int max = params.get_input("Max_002"); + randomize_attribute(span.typed(), min, max, hashes, seed, operation); break; + } + default: { + BLI_assert(false); + break; + } } - attribute.save(); -} + attribute.apply_span_and_save(); +} // namespace blender::nodes static void geo_node_random_attribute_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + const std::string attribute_name = params.get_input("Attribute"); + if (attribute_name.empty()) { + params.set_output("Geometry", geometry_set); + return; + } const int seed = params.get_input("Seed"); + const NodeAttributeRandomize &storage = *(const NodeAttributeRandomize *)params.node().storage; + const CustomDataType data_type = static_cast(storage.data_type); + const GeometryNodeAttributeRandomizeMode operation = + static_cast(storage.operation); geometry_set = geometry_set_realize_instances(geometry_set); if (geometry_set.has()) { - randomize_attribute(geometry_set.get_component_for_write(), params, seed); + randomize_attribute_on_component(geometry_set.get_component_for_write(), + params, + attribute_name, + data_type, + operation, + seed); } if (geometry_set.has()) { - randomize_attribute(geometry_set.get_component_for_write(), params, seed); + randomize_attribute_on_component(geometry_set.get_component_for_write(), + params, + attribute_name, + data_type, + operation, + seed); } params.set_output("Geometry", geometry_set); @@ -243,5 +313,7 @@ void register_node_type_geo_attribute_randomize() node_type_update(&ntype, geo_node_attribute_randomize_update); ntype.geometry_node_execute = blender::nodes::geo_node_random_attribute_exec; ntype.draw_buttons = geo_node_attribute_random_layout; + node_type_storage( + &ntype, "NodeAttributeRandomize", node_free_standard_storage, node_copy_standard_storage); nodeRegisterType(&ntype); } From dd2ff266acf999dbb3a37b70162f5ca7c029426a Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 13:40:08 -0600 Subject: [PATCH 130/519] Cleanup: Decrease scope of RNA enum definitions Since these enums are only used in a single function, they can be defined where they are used. Similar to rB2f60e5d1b56dfb8c9104. --- source/blender/makesrna/intern/rna_nodetree.c | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 75d7c7a4588..e72f50e813d 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -398,74 +398,6 @@ static const EnumPropertyItem prop_shader_output_target_items[] = { {0, NULL, 0, NULL, NULL}, }; -static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = { - {GEO_NODE_BOOLEAN_INTERSECT, - "INTERSECT", - 0, - "Intersect", - "Keep the part of the mesh that is common between all operands"}, - {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"}, - {GEO_NODE_BOOLEAN_DIFFERENCE, - "DIFFERENCE", - 0, - "Difference", - "Combine meshes in a subtractive way"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = { - {GEO_NODE_TRIANGULATE_QUAD_BEAUTY, - "BEAUTY", - 0, - "Beauty", - "Split the quads in nice triangles, slower method"}, - {GEO_NODE_TRIANGULATE_QUAD_FIXED, - "FIXED", - 0, - "Fixed", - "Split the quads on the first and third vertices"}, - {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE, - "FIXED_ALTERNATE", - 0, - "Fixed Alternate", - "Split the quads on the 2nd and 4th vertices"}, - {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE, - "SHORTEST_DIAGONAL", - 0, - "Shortest Diagonal", - "Split the quads based on the distance between the vertices"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = { - {GEO_NODE_TRIANGULATE_NGON_BEAUTY, - "BEAUTY", - 0, - "Beauty", - "Arrange the new triangles evenly (slow)"}, - {GEO_NODE_TRIANGULATE_NGON_EARCLIP, - "CLIP", - 0, - "Clip", - "Split the polygons with an ear clipping algorithm"}, - {0, NULL, 0, NULL, NULL}, -}; - -static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = { - {GEO_NODE_POINT_DISTRIBUTE_RANDOM, - "RANDOM", - 0, - "Random", - "Distribute points randomly on the surface"}, - {GEO_NODE_POINT_DISTRIBUTE_POISSON, - "POISSON", - 0, - "Poisson Disk", - "Distribute the points randomly on the surface while taking a minimum distance between " - "points into account"}, - {0, NULL, 0, NULL, NULL}, -}; - #endif #define ITEM_ATTRIBUTE \ @@ -8524,6 +8456,21 @@ static void def_geo_boolean(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = { + {GEO_NODE_BOOLEAN_INTERSECT, + "INTERSECT", + 0, + "Intersect", + "Keep the part of the mesh that is common between all operands"}, + {GEO_NODE_BOOLEAN_UNION, "UNION", 0, "Union", "Combine meshes in an additive way"}, + {GEO_NODE_BOOLEAN_DIFFERENCE, + "DIFFERENCE", + 0, + "Difference", + "Combine meshes in a subtractive way"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_boolean_method_items); @@ -8536,6 +8483,44 @@ static void def_geo_triangulate(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_triangulate_quad_method_items[] = { + {GEO_NODE_TRIANGULATE_QUAD_BEAUTY, + "BEAUTY", + 0, + "Beauty", + "Split the quads in nice triangles, slower method"}, + {GEO_NODE_TRIANGULATE_QUAD_FIXED, + "FIXED", + 0, + "Fixed", + "Split the quads on the first and third vertices"}, + {GEO_NODE_TRIANGULATE_QUAD_ALTERNATE, + "FIXED_ALTERNATE", + 0, + "Fixed Alternate", + "Split the quads on the 2nd and 4th vertices"}, + {GEO_NODE_TRIANGULATE_QUAD_SHORTEDGE, + "SHORTEST_DIAGONAL", + 0, + "Shortest Diagonal", + "Split the quads based on the distance between the vertices"}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem rna_node_geometry_triangulate_ngon_method_items[] = { + {GEO_NODE_TRIANGULATE_NGON_BEAUTY, + "BEAUTY", + 0, + "Beauty", + "Arrange the new triangles evenly (slow)"}, + {GEO_NODE_TRIANGULATE_NGON_EARCLIP, + "CLIP", + 0, + "Clip", + "Split the polygons with an ear clipping algorithm"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "quad_method", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_triangulate_quad_method_items); @@ -8767,6 +8752,21 @@ static void def_geo_point_distribute(StructRNA *srna) { PropertyRNA *prop; + static const EnumPropertyItem rna_node_geometry_point_distribute_method_items[] = { + {GEO_NODE_POINT_DISTRIBUTE_RANDOM, + "RANDOM", + 0, + "Random", + "Distribute points randomly on the surface"}, + {GEO_NODE_POINT_DISTRIBUTE_POISSON, + "POISSON", + 0, + "Poisson Disk", + "Distribute the points randomly on the surface while taking a minimum distance between " + "points into account"}, + {0, NULL, 0, NULL, NULL}, + }; + prop = RNA_def_property(srna, "distribute_method", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, rna_node_geometry_point_distribute_method_items); From 000a340afa67a12a38c103e19f7d52ed42c4492e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 12 Feb 2021 22:35:18 +0100 Subject: [PATCH 131/519] EEVEE: Depth of field: New implementation This is a complete refactor over the old system. The goal was to increase quality first and then have something more flexible and optimised. |{F9603145} | {F9603142}|{F9603147}| This fixes issues we had with the old system which were: - Too much overdraw (low performance). - Not enough precision in render targets (hugly color banding/drifting). - Poor resolution near in-focus regions. - Wrong support of orthographic views. - Missing alpha support in viewport. - Missing bokeh shape inversion on foreground field. - Issues on some GPUs. (see T72489) (But I'm sure this one will have other issues as well heh...) - Fix T81092 I chose Unreal's Diaphragm DOF as a reference / goal implementation. It is well described in the presentation "A Life of a Bokeh" by Guillaume Abadie. You can check about it here https://epicgames.ent.box.com/s/s86j70iamxvsuu6j35pilypficznec04 Along side the main implementation we provide a way to increase the quality by jittering the camera position for each sample (the ones specified under the Sampling tab). The jittering is dividing the actual post processing dof radius so that it fills the undersampling. The user can still add more overblur to have a noiseless image, but reducing bokeh shape sharpness. Effect of overblur (left without, right with): | {F9603122} | {F9603123}| The actual implementation differs a bit: - Foreground gather implementation uses the same "ring binning" accumulator as background but uses a custom occlusion method. This gives the problem of inflating the foreground elements when they are over background or in-focus regions. This is was a hard decision but this was preferable to the other method that was giving poor opacity masks for foreground and had other more noticeable issues. Do note it is possible to improve this part in the future if a better alternative is found. - Use occlusion texture for foreground. Presentation says it wasn't really needed for them. - The TAA stabilisation pass is replace by a simple neighborhood clamping at the reduce copy stage for simplicity. - We don't do a brute-force in-focus separate gather pass. Instead we just do the brute force pass during resolve. Using the separate pass could be a future optimization if needed but might give less precise results. - We don't use compute shaders at all so shader branching might not be optimal. But performance is still way better than our previous implementation. - We mainly rely on density change to fix all undersampling issues even for foreground (which is something the reference implementation is not doing strangely). Remaining issues (not considered blocking for me): - Slight defocus stability: Due to slight defocus bruteforce gather using the bare scene color, highlights are dilated and make convergence quite slow or imposible when using jittered DOF (or gives ) - ~~Slight defocus inflating: There seems to be a 1px inflation discontinuity of the slight focus convolution compared to the half resolution. This is not really noticeable if using jittered camera.~~ Fixed - Foreground occlusion approximation is a bit glitchy and gives incorrect result if the a defocus foreground element overlaps a farther foreground element. Note that this is easily mitigated using the jittered camera position. |{F9603114}|{F9603115}|{F9603116}| - Foreground is inflating, not revealing background. However this avoids some other bugs too as discussed previously. Also mitigated with jittered camera position. |{F9603130}|{F9603129}| - Sensor vertical fit is still broken (does not match cycles). - Scattred bokeh shapes can be a bit strange at polygon vertices. This is due to the distance field stored in the Bokeh LUT which is not rounded at the edges. This is barely noticeable if the shape does not rotate. - ~~Sampling pattern of the jittered camera position is suboptimal. Could try something like hammersley or poisson disc distribution.~~Used hexaweb sampling pattern which is not random but has better stability and overall coverage. - Very large bokeh (> 300 px) can exhibit undersampling artifact in gather pass and quite a bit of bleeding. But at this size it is preferable to use jittered camera position. Codewise the changes are pretty much self contained and each pass are well documented. However the whole pipeline is quite complex to understand from bird's-eye view. Notes: - There is the possibility of using arbitrary bokeh texture with this implementation. However implementation is a bit involved. - Gathering max sample count is hardcoded to avoid to deal with shader variations. The actual max sample count is already quite high but samples are not evenly distributed due to the ring binning method. - While this implementation does not need 32bit/channel textures to render correctly it does use many other textures so actual VRAM usage is higher than previous method for viewport but less for render. Textures are reused to avoid many allocations. - Bokeh LUT computation is fast and done for each redraw because it can be animated. Also the texture can be shared with other viewport with different camera settings. --- .../startup/bl_ui/properties_render.py | 11 +- .../blenloader/intern/versioning_290.c | 8 + source/blender/draw/CMakeLists.txt | 14 +- .../draw/engines/eevee/eevee_depth_of_field.c | 1044 +++++++++++++++-- .../draw/engines/eevee/eevee_effects.c | 8 +- .../blender/draw/engines/eevee/eevee_engine.c | 13 +- .../draw/engines/eevee/eevee_private.h | 132 ++- .../blender/draw/engines/eevee/eevee_render.c | 2 +- .../draw/engines/eevee/eevee_shaders.c | 240 +++- .../engines/eevee/eevee_temporal_sampling.c | 63 +- .../eevee/shaders/common_utiltex_lib.glsl | 6 + .../eevee/shaders/effect_dof_bokeh_frag.glsl | 101 ++ .../shaders/effect_dof_dilate_tiles_frag.glsl | 117 ++ .../shaders/effect_dof_downsample_frag.glsl | 37 + .../eevee/shaders/effect_dof_filter_frag.glsl | 93 ++ .../effect_dof_flatten_tiles_frag.glsl | 57 + .../eevee/shaders/effect_dof_frag.glsl | 254 ---- .../eevee/shaders/effect_dof_gather_frag.glsl | 293 +++++ .../engines/eevee/shaders/effect_dof_lib.glsl | 631 ++++++++++ .../eevee/shaders/effect_dof_reduce_frag.glsl | 179 +++ .../shaders/effect_dof_resolve_frag.glsl | 212 ++++ .../shaders/effect_dof_scatter_frag.glsl | 85 ++ .../shaders/effect_dof_scatter_vert.glsl | 138 +++ .../eevee/shaders/effect_dof_setup_frag.glsl | 65 + .../eevee/shaders/effect_dof_vert.glsl | 109 -- .../shaders/workbench_effect_dof_frag.glsl | 9 +- .../draw/intern/shaders/common_math_lib.glsl | 52 +- source/blender/draw/tests/shaders_test.cc | 29 +- source/blender/makesdna/DNA_scene_defaults.h | 3 + source/blender/makesdna/DNA_scene_types.h | 6 +- source/blender/makesrna/intern/rna_scene.c | 49 +- 31 files changed, 3476 insertions(+), 584 deletions(-) create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl delete mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl delete mode 100644 source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index b326a23b390..3abaa490d02 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -198,8 +198,15 @@ class RENDER_PT_eevee_depth_of_field(RenderButtonsPanel, Panel): col = layout.column() col.prop(props, "bokeh_max_size") - # Not supported yet - # col.prop(props, "bokeh_threshold") + col.prop(props, "bokeh_threshold") + col.prop(props, "bokeh_neighbor_max") + col.prop(props, "bokeh_denoise_fac") + col.prop(props, "use_bokeh_high_quality_slight_defocus") + col.prop(props, "use_bokeh_jittered") + + col = layout.column() + col.active = props.use_bokeh_jittered + col.prop(props, "bokeh_overblur") class RENDER_PT_eevee_bloom(RenderButtonsPanel, Panel): diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 74b3827ffd0..4980d748d0f 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1733,6 +1733,14 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) * \note Keep this message at the bottom of the function. */ { + if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "bokeh_overblur")) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + scene->eevee.bokeh_neighbor_max = 10.0f; + scene->eevee.bokeh_denoise_fac = 0.75f; + scene->eevee.bokeh_overblur = 5.0f; + } + } + /* Keep this block, even when empty. */ } } diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 9b716eeeed3..e52e30a6c44 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -217,8 +217,18 @@ data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_vert.glsl SRC) data_to_c_simple(engines/eevee/shaders/lookdev_world_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/closure_lit_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC) -data_to_c_simple(engines/eevee/shaders/effect_dof_vert.glsl SRC) -data_to_c_simple(engines/eevee/shaders/effect_dof_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_bokeh_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_downsample_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_filter_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_gather_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_reduce_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_resolve_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_frag.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_scatter_vert.glsl SRC) +data_to_c_simple(engines/eevee/shaders/effect_dof_setup_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_downsample_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_downsample_cube_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_gtao_frag.glsl SRC) diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index 92ba526c67c..8c0a44b2c9b 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -20,6 +20,13 @@ * \ingroup draw_engine * * Depth of field post process effect. + * + * There are 2 methods to achieve this effect. + * - The first uses projection matrix offsetting and sample accumulation to give reference quality + * depth of field. But this needs many samples to hide the undersampling. + * - The second one is a post-processing based one. It follows the implementation described in + * the presentation "Life of a Bokeh - Siggraph 2018" from Guillaume Abadie. There are some + * difference with our actual implementation that prioritize quality. */ #include "DRW_render.h" @@ -40,10 +47,158 @@ #include "GPU_texture.h" #include "eevee_private.h" +#define CAMERA_JITTER_RING_DENSITY 6 + +static float coc_radius_from_camera_depth(bool is_ortho, EEVEE_EffectsInfo *fx, float camera_depth) +{ + float multiplier = fx->dof_coc_params[0]; + float bias = fx->dof_coc_params[1]; + if (multiplier == 0.0f || bias == 0.0f) { + return 0.0f; + } + else if (is_ortho) { + return (camera_depth + multiplier / bias) * multiplier; + } + else { + return multiplier / camera_depth - bias; + } +} + +static float polygon_sides_length(float sides_count) +{ + return 2.0 * sin(M_PI / sides_count); +} + +/* Returns intersection ratio between the radius edge at theta and the polygon edge. + * Start first corners at theta == 0. */ +static float circle_to_polygon_radius(float sides_count, float theta) +{ + /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */ + float side_angle = (2.0f * M_PI) / sides_count; + return cosf(side_angle * 0.5f) / + cosf(theta - side_angle * floorf((sides_count * theta + M_PI) / (2.0f * M_PI))); +} + +/* Remap input angle to have homogenous spacing of points along a polygon edge. + * Expect theta to be in [0..2pi] range. */ +static float circle_to_polygon_angle(float sides_count, float theta) +{ + float side_angle = (2.0f * M_PI) / sides_count; + float halfside_angle = side_angle * 0.5f; + float side = floorf(theta / side_angle); + /* Length of segment from center to the middle of polygon side. */ + float adjacent = circle_to_polygon_radius(sides_count, 0.0f); + + /* This is the relative position of the sample on the polygon half side. */ + float local_theta = theta - side * side_angle; + float ratio = (local_theta - halfside_angle) / halfside_angle; + + float halfside_len = polygon_sides_length(sides_count) * 0.5f; + float opposite = ratio * halfside_len; + + /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */ + float final_local_theta = atanf(opposite / adjacent); + + return side * side_angle + final_local_theta; +} + +static int dof_jitter_total_sample_count(int ring_density, int ring_count) +{ + return ((ring_count * ring_count + ring_count) / 2) * ring_density + 1; +} + +bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *fx, + float r_jitter[2], + float *r_focus_distance) +{ + if (fx->dof_jitter_radius == 0.0f) { + return false; + } + + int ring_density = CAMERA_JITTER_RING_DENSITY; + int ring_count = fx->dof_jitter_ring_count; + int sample_count = dof_jitter_total_sample_count(ring_density, ring_count); + + int s = fx->taa_current_sample - 1; + + int ring = 0; + int ring_sample_count = 1; + int ring_sample = 1; + + s = s * (ring_density - 1); + s = s % sample_count; + + int samples_passed = 1; + while (s >= samples_passed) { + ring++; + ring_sample_count = ring * ring_density; + ring_sample = s - samples_passed; + ring_sample = (ring_sample + 1) % ring_sample_count; + samples_passed += ring_sample_count; + } + + r_jitter[0] = (float)ring / ring_count; + r_jitter[1] = (float)ring_sample / ring_sample_count; + + { + /* Bokeh shape parametrisation */ + float r = r_jitter[0]; + float T = r_jitter[1] * 2.0f * M_PI; + + if (fx->dof_jitter_blades >= 3.0f) { + T = circle_to_polygon_angle(fx->dof_jitter_blades, T); + r *= circle_to_polygon_radius(fx->dof_jitter_blades, T); + } + + T += fx->dof_bokeh_rotation; + + r_jitter[0] = r * cosf(T); + r_jitter[1] = r * sinf(T); + + mul_v2_v2(r_jitter, fx->dof_bokeh_aniso); + } + + mul_v2_fl(r_jitter, fx->dof_jitter_radius); + + *r_focus_distance = fx->dof_jitter_focus; + return true; +} + +int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *fx, + int sample_count, + int *r_ring_count) +{ + if (fx->dof_jitter_radius == 0.0f) { + if (r_ring_count != NULL) { + *r_ring_count = 0; + } + return 1; + } + + if (sample_count == TAA_MAX_SAMPLE) { + /* Special case for viewport continuous rendering. We clamp to a max sample to avoid the + * jittered dof never converging. */ + sample_count = 1024; + } + /* Inversion of dof_jitter_total_sample_count. */ + float x = 2.0f * (sample_count - 1.0f) / CAMERA_JITTER_RING_DENSITY; + /* Solving polynomial. We only search positive solution. */ + float discriminant = 1.0f + 4.0f * x; + int ring_count = ceilf(0.5f * (sqrt(discriminant) - 1.0f)); + + sample_count = dof_jitter_total_sample_count(CAMERA_JITTER_RING_DENSITY, ring_count); + + if (r_ring_count != NULL) { + *r_ring_count = ring_count; + } + return sample_count; +} + int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, Object *camera) { + EEVEE_TextureList *txl = vedata->txl; EEVEE_StorageList *stl = vedata->stl; EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_EffectsInfo *effects = stl->effects; @@ -57,59 +212,30 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), RegionView3D *rv3d = draw_ctx->rv3d; const float *viewport_size = DRW_viewport_size_get(); + effects->dof_hq_slight_focus = (scene_eval->eevee.flag & SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS) != 0; + /* Retrieve Near and Far distance */ - effects->dof_near_far[0] = -cam->clip_start; - effects->dof_near_far[1] = -cam->clip_end; - - int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2}; - - buffer_size[0] = max_ii(1, buffer_size[0]); - buffer_size[1] = max_ii(1, buffer_size[1]); - - eGPUTextureFormat down_format = DRW_state_draw_background() ? GPU_R11F_G11F_B10F : GPU_RGBA16F; - - effects->dof_down_near = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type); - effects->dof_down_far = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], down_format, &draw_engine_eevee_type); - effects->dof_coc = DRW_texture_pool_query_2d( - buffer_size[0], buffer_size[1], GPU_RG16F, &draw_engine_eevee_type); - - GPU_framebuffer_ensure_config(&fbl->dof_down_fb, - {GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(effects->dof_down_near), - GPU_ATTACHMENT_TEXTURE(effects->dof_down_far), - GPU_ATTACHMENT_TEXTURE(effects->dof_coc)}); - - /* Go full 32bits for rendering and reduce the color artifacts. */ - eGPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F; - - effects->dof_blur = DRW_texture_pool_query_2d( - buffer_size[0] * 2, buffer_size[1], fb_format, &draw_engine_eevee_type); - - GPU_framebuffer_ensure_config(&fbl->dof_scatter_fb, - { - GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(effects->dof_blur), - }); - - if (!DRW_state_draw_background()) { - effects->dof_blur_alpha = DRW_texture_pool_query_2d( - buffer_size[0] * 2, buffer_size[1], GPU_R32F, &draw_engine_eevee_type); - GPU_framebuffer_texture_attach(fbl->dof_scatter_fb, effects->dof_blur_alpha, 1, 0); - } + effects->dof_coc_near_dist = -cam->clip_start; + effects->dof_coc_far_dist = -cam->clip_end; /* Parameters */ - /* TODO UI Options */ + bool is_ortho = cam->type == CAM_ORTHO; float fstop = cam->dof.aperture_fstop; float blades = cam->dof.aperture_blades; float rotation = cam->dof.aperture_rotation; - float ratio = 1.0f / cam->dof.aperture_ratio; + float ratio = 1.0f / max_ff(cam->dof.aperture_ratio, 0.00001f); float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y); float focus_dist = BKE_camera_object_dof_distance(camera); float focal_len = cam->lens; - const float scale_camera = 0.001f; + if (is_ortho) { + /* (fclem) A bit of black magic here. I don't know if this is correct. */ + fstop *= 1.3f; + focal_len = 1.0f; + sensor = cam->ortho_scale; + } + + const float scale_camera = (is_ortho) ? 1.0 : 0.001f; /* we want radius here for the aperture number */ float aperture = 0.5f * scale_camera * focal_len / fstop; float focal_len_scaled = scale_camera * focal_len; @@ -119,93 +245,724 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), sensor_scaled *= rv3d->viewcamtexcofac[0]; } - effects->dof_params[1] = aperture * fabsf(focal_len_scaled / (focus_dist - focal_len_scaled)); - effects->dof_params[1] *= viewport_size[0] / sensor_scaled; - effects->dof_params[0] = -focus_dist * effects->dof_params[1]; + if (ratio > 1.0) { + /* If ratio is scaling the bokeh outwards, we scale the aperture so that the gather + * kernel size will encompass the maximum axis. */ + aperture *= ratio; + } - effects->dof_bokeh[0] = rotation; - effects->dof_bokeh[1] = ratio; - effects->dof_bokeh[2] = scene_eval->eevee.bokeh_max_size; + effects->dof_coc_params[1] = -aperture * + fabsf(focal_len_scaled / (focus_dist - focal_len_scaled)); + /* FIXME(fclem) This is broken for vertically fit sensor. */ + effects->dof_coc_params[1] *= viewport_size[0] / sensor_scaled; - /* Precompute values to save instructions in fragment shader. */ - effects->dof_bokeh_sides[0] = blades; - effects->dof_bokeh_sides[1] = blades > 0.0f ? 2.0f * M_PI / blades : 0.0f; - effects->dof_bokeh_sides[2] = blades / (2.0f * M_PI); - effects->dof_bokeh_sides[3] = blades > 0.0f ? cosf(M_PI / blades) : 0.0f; + if ((scene_eval->eevee.flag & SCE_EEVEE_DOF_JITTER) != 0) { + effects->dof_jitter_radius = effects->dof_coc_params[1]; + effects->dof_jitter_focus = focus_dist; + effects->dof_jitter_blades = blades; + + int sample_count = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl); + sample_count = EEVEE_depth_of_field_sample_count_get( + effects, sample_count, &effects->dof_jitter_ring_count); + + if (effects->dof_jitter_ring_count == 0) { + effects->dof_jitter_radius = 0.0f; + } + else { + /* Compute a minimal overblur radius to fill the gaps between the samples. + * This is just the simplified form of dividing the area of the bokeh + * by the number of samples. */ + float minimal_overblur = 1.0f / sqrtf(sample_count); + float user_overblur = scene_eval->eevee.bokeh_overblur / 100.0f; + + effects->dof_coc_params[1] *= minimal_overblur + user_overblur; + /* Avoid dilating the shape. Overblur only soften. */ + effects->dof_jitter_radius -= effects->dof_coc_params[1]; + } + } + else { + effects->dof_jitter_radius = 0.0f; + } + + if (is_ortho) { + /* (fclem) A bit of black magic here. Needed to match cycles. */ + effects->dof_coc_params[1] *= 0.225; + } + + effects->dof_coc_params[0] = -focus_dist * effects->dof_coc_params[1]; + + effects->dof_bokeh_blades = blades; + effects->dof_bokeh_rotation = rotation; + effects->dof_bokeh_aniso[0] = min_ff(ratio, 1.0f); + effects->dof_bokeh_aniso[1] = min_ff(1.0f / ratio, 1.0f); + effects->dof_bokeh_max_size = scene_eval->eevee.bokeh_max_size; + + copy_v2_v2(effects->dof_bokeh_aniso_inv, effects->dof_bokeh_aniso); + invert_v2(effects->dof_bokeh_aniso_inv); + + effects->dof_scatter_color_threshold = scene_eval->eevee.bokeh_threshold; + effects->dof_scatter_neighbor_max_color = scene_eval->eevee.bokeh_neighbor_max; + effects->dof_denoise_factor = clamp_f(scene_eval->eevee.bokeh_denoise_fac, 0.0f, 1.0f); + + float max_abs_fg_coc, max_abs_bg_coc; + if (is_ortho) { + max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_start)); + max_abs_bg_coc = fabsf(coc_radius_from_camera_depth(true, effects, -cam->clip_end)); + } + else { + max_abs_fg_coc = fabsf(coc_radius_from_camera_depth(false, effects, -cam->clip_start)); + /* Background is at infinity so maximum CoC is the limit of the function at -inf. */ + max_abs_bg_coc = fabsf(effects->dof_coc_params[1]); + } + + float max_coc = max_ff(max_abs_bg_coc, max_abs_fg_coc); + /* Clamp with user defined max. */ + effects->dof_fx_max_coc = min_ff(scene_eval->eevee.bokeh_max_size, max_coc); + + if (effects->dof_fx_max_coc < 0.5f) { + return 0; + } return EFFECT_DOF | EFFECT_POST_BUFFER; } + effects->dof_jitter_radius = 0.0f; + /* Cleanup to release memory */ - GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_down_fb); - GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_setup_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_flatten_tiles_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_dilate_tiles_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_reduce_copy_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_fg_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_gather_bg_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_bg_fb); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc); return 0; } -void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) +#define WITH_FILTERING (GPU_SAMPLER_MIPMAP | GPU_SAMPLER_FILTER) +#define NO_FILTERING GPU_SAMPLER_MIPMAP +#define COLOR_FORMAT fx->dof_color_format +#define FG_TILE_FORMAT GPU_RGBA16F +#define BG_TILE_FORMAT GPU_R11F_G11F_B10F + +/** + * Create bokeh texture. + **/ +static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + if ((fx->dof_bokeh_aniso[0] == 1.0f) && (fx->dof_bokeh_aniso[1] == 1.0f) && + (fx->dof_bokeh_blades == 0.0)) { + fx->dof_bokeh_gather_lut_tx = NULL; + fx->dof_bokeh_scatter_lut_tx = NULL; + fx->dof_bokeh_resolve_lut_tx = NULL; + return; + } + + void *owner = (void *)&EEVEE_depth_of_field_init; + int res[2] = {DOF_BOKEH_LUT_SIZE, DOF_BOKEH_LUT_SIZE}; + + DRW_PASS_CREATE(psl->dof_bokeh, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_bokeh_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_bokeh); + DRW_shgroup_uniform_float_copy(grp, "bokehSides", fx->dof_bokeh_blades); + DRW_shgroup_uniform_float_copy(grp, "bokehRotation", fx->dof_bokeh_rotation); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); + fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_bokeh_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_gather_lut_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_scatter_lut_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bokeh_resolve_lut_tx), + }); +} + +/** + * Ouputs halfResColorBuffer and halfResCocBuffer. + **/ +static void dof_setup_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) { - EEVEE_PassList *psl = vedata->psl; - EEVEE_StorageList *stl = vedata->stl; - EEVEE_EffectsInfo *effects = stl->effects; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - if ((effects->enabled_effects & EFFECT_DOF) != 0) { - /** Depth of Field algorithm - * - * Overview : - * - Down-sample the color buffer into 2 buffers weighted with - * CoC values. Also output CoC into a texture. - * - Shoot quads for every pixel and expand it depending on the CoC. - * Do one pass for near Dof and one pass for far Dof. - * - Finally composite the 2 blurred buffers with the original render. - */ - DRWShadingGroup *grp; - struct GPUBatch *quad = DRW_cache_fullscreen_quad_get(); - const bool use_alpha = !DRW_state_draw_background(); + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)}; - DRW_PASS_CREATE(psl->dof_down, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_setup, DRW_STATE_WRITE_COLOR); - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_downsample_get(use_alpha), - psl->dof_down); - DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); - DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); - DRW_shgroup_call(grp, quad, NULL); + GPUShader *sh = EEVEE_shaders_depth_of_field_setup_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_setup); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->source_buffer, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "depthBuffer", &dtxl->depth, NO_FILTERING); + DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params); + DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - DRW_PASS_CREATE(psl->dof_scatter, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + fx->dof_half_res_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); - /* This create an empty batch of N triangles to be positioned - * by the vertex shader 0.4ms against 6ms with instancing */ - const float *viewport_size = DRW_viewport_size_get(); - const int sprite_len = ((int)viewport_size[0] / 2) * - ((int)viewport_size[1] / 2); /* brackets matters */ - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_scatter_get(use_alpha), - psl->dof_scatter); - DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near); - DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_down_far); - DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc); - DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2); + GPU_framebuffer_ensure_config(&fbl->dof_setup_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_half_res_coc_tx), + }); +} - DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_len); +/** + * Ouputs min & max coc in each 8x8 half res pixel tiles (so 1/16th of fullres). + **/ +static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR), + divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)}; - DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_flatten_tiles, DRW_STATE_WRITE_COLOR); - grp = DRW_shgroup_create(EEVEE_shaders_depth_of_field_resolve_get(use_alpha), - psl->dof_resolve); - DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur); - DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); - DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); - DRW_shgroup_call(grp, quad, NULL); + GPUShader *sh = EEVEE_shaders_depth_of_field_flatten_tiles_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_flatten_tiles); + DRW_shgroup_uniform_texture_ref_ex( + grp, "halfResCocBuffer", &fx->dof_half_res_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - if (use_alpha) { - DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha); - DRW_shgroup_uniform_bool_copy(grp, "unpremult", DRW_state_is_image_render()); + fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); + fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_flatten_tiles_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_fg_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_tiles_bg_tx), + }); +} + +/** + * Dilates the min & max cocs to cover maximum coc values. + * Output format/dimensions should be the same as coc_flatten_pass as they are swapped for + * doing multiple dilation passes. + **/ +static void dof_dilate_tiles_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], DOF_TILE_DIVISOR), + divide_ceil_u(fullres[1], DOF_TILE_DIVISOR)}; + + DRW_PASS_CREATE(psl->dof_dilate_tiles_minmax, DRW_STATE_WRITE_COLOR); + DRW_PASS_CREATE(psl->dof_dilate_tiles_minabs, DRW_STATE_WRITE_COLOR); + + for (int pass = 0; pass < 2; pass++) { + DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs; + GPUShader *sh = EEVEE_shaders_depth_of_field_dilate_tiles_get(pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, drw_pass); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_tiles_bg_tx); + DRW_shgroup_uniform_bool(grp, "dilateSlightFocus", &fx->dof_dilate_slight_focus, 1); + DRW_shgroup_uniform_int(grp, "ringCount", &fx->dof_dilate_ring_count, 1); + DRW_shgroup_uniform_int(grp, "ringWidthMultiplier", &fx->dof_dilate_ring_width_multiplier, 1); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + } + + fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); + fx->dof_coc_dilated_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_dilate_tiles_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_fg_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_coc_dilated_tiles_bg_tx), + }); +} + +static void dof_dilate_tiles_pass_draw(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + for (int pass = 0; pass < 2; pass++) { + DRWPass *drw_pass = (pass == 0) ? psl->dof_dilate_tiles_minmax : psl->dof_dilate_tiles_minabs; + + /* Error introduced by gather center jittering. */ + const float error_multiplier = 1.0f + 1.0f / (DOF_GATHER_RING_COUNT + 0.5f); + int dilation_end_radius = ceilf((fx->dof_fx_max_coc * error_multiplier) / DOF_TILE_DIVISOR); + + /* This algorithm produce the exact dilation radius by dividing it in multiple passes. */ + int dilation_radius = 0; + while (dilation_radius < dilation_end_radius) { + /* Dilate slight focus only on first iteration. */ + fx->dof_dilate_slight_focus = (dilation_radius == 0) ? 1 : 0; + + int remainder = dilation_end_radius - dilation_radius; + /* Do not step over any unvisited tile. */ + int max_multiplier = dilation_radius + 1; + + int ring_count = min_ii(DOF_DILATE_RING_COUNT, ceilf(remainder / (float)max_multiplier)); + int multiplier = min_ii(max_multiplier, floor(remainder / (float)ring_count)); + + dilation_radius += ring_count * multiplier; + + fx->dof_dilate_ring_count = ring_count; + fx->dof_dilate_ring_width_multiplier = multiplier; + + GPU_framebuffer_bind(fbl->dof_dilate_tiles_fb); + DRW_draw_pass(drw_pass); + + SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx); } } + /* Swap again so that final textures are dof_coc_dilated_tiles_*_tx. */ + SWAP(GPUFrameBuffer *, fbl->dof_dilate_tiles_fb, fbl->dof_flatten_tiles_fb); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_bg_tx, fx->dof_coc_tiles_bg_tx); + SWAP(GPUTexture *, fx->dof_coc_dilated_tiles_fg_tx, fx->dof_coc_tiles_fg_tx); +} + +/** + * Create mipmaped color & coc textures for gather passes. + **/ +static void dof_reduce_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + const float *fullres = DRW_viewport_size_get(); + + /* Divide by 2 because dof_fx_max_coc is in fullres CoC radius and the reduce texture begins at + * half resolution. */ + float max_space_between_sample = fx->dof_fx_max_coc * 0.5f / DOF_GATHER_RING_COUNT; + + int mip_count = max_ii(1, log2_ceil_u(max_space_between_sample)); + + fx->dof_reduce_steps = mip_count - 1; + /* This ensure the mipmaps are aligned for the needed 4 mip levels. + * Starts at 2 because already at half resolution. */ + int multiple = 2 << (mip_count - 1); + int res[2] = {(multiple * divide_ceil_u(fullres[0], multiple)) / 2, + (multiple * divide_ceil_u(fullres[1], multiple)) / 2}; + + int quater_res[2] = {divide_ceil_u(fullres[0], 4), divide_ceil_u(fullres[1], 4)}; + + /* TODO(fclem): Make this dependent of the quality of the gather pass. */ + fx->dof_scatter_coc_threshold = 4.0f; + + { + DRW_PASS_CREATE(psl->dof_downsample, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_downsample_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_downsample); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + void *owner = (void *)&EEVEE_depth_of_field_init; + fx->dof_downsample_tx = DRW_texture_pool_query_2d(UNPACK2(quater_res), COLOR_FORMAT, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_downsample_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_downsample_tx), + }); + } + + { + DRW_PASS_CREATE(psl->dof_reduce_copy, DRW_STATE_WRITE_COLOR); + + const bool is_copy_pass = true; + GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce_copy); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "downsampledBuffer", &fx->dof_downsample_tx, NO_FILTERING); + DRW_shgroup_uniform_float_copy(grp, "scatterColorThreshold", fx->dof_scatter_color_threshold); + DRW_shgroup_uniform_float_copy( + grp, "scatterColorNeighborMax", fx->dof_scatter_neighbor_max_color); + DRW_shgroup_uniform_float_copy(grp, "scatterCocThreshold", fx->dof_scatter_coc_threshold); + DRW_shgroup_uniform_float_copy(grp, "colorNeighborClamping", fx->dof_denoise_factor); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + void *owner = (void *)&EEVEE_depth_of_field_init; + fx->dof_scatter_src_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R11F_G11F_B10F, owner); + } + + { + DRW_PASS_CREATE(psl->dof_reduce, DRW_STATE_WRITE_COLOR); + + const bool is_copy_pass = false; + GPUShader *sh = EEVEE_shaders_depth_of_field_reduce_get(is_copy_pass); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_reduce); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_reduce_input_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "cocBuffer", &fx->dof_reduce_input_coc_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + } + + if (txl->dof_reduced_color) { + /* TODO(fclem) In the future, we need to check if mip_count did not change. + * For now it's ok as we always define all mip level.*/ + if (res[0] != GPU_texture_width(txl->dof_reduced_color) || + res[1] != GPU_texture_width(txl->dof_reduced_color)) { + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_color); + DRW_TEXTURE_FREE_SAFE(txl->dof_reduced_coc); + } + } + + if (txl->dof_reduced_color == NULL) { + /* Color needs to be signed format here. See note in shader for explanation. */ + /* Do not use texture pool because of needs mipmaps. */ + txl->dof_reduced_color = GPU_texture_create_2d( + "dof_reduced_color", UNPACK2(res), mip_count, GPU_RGBA16F, NULL); + txl->dof_reduced_coc = GPU_texture_create_2d( + "dof_reduced_coc", UNPACK2(res), mip_count, GPU_R16F, NULL); + + /* TODO(fclem) Remove once we have immutable storage or when mips are generated on creation. */ + GPU_texture_generate_mipmap(txl->dof_reduced_color); + GPU_texture_generate_mipmap(txl->dof_reduced_coc); + } + + GPU_framebuffer_ensure_config(&fbl->dof_reduce_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color), + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc), + }); + + GPU_framebuffer_ensure_config(&fbl->dof_reduce_copy_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_color), + GPU_ATTACHMENT_TEXTURE(txl->dof_reduced_coc), + GPU_ATTACHMENT_TEXTURE(fx->dof_scatter_src_tx), + }); +} + +/** + * Do the gather convolution. For each pixels we gather multiple pixels in its neighborhood + * depending on the min & max CoC tiles. + **/ +static void dof_gather_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + void *owner = (void *)&EEVEE_depth_of_field_init; + const float *fullres = DRW_viewport_size_get(); + int res[2] = {divide_ceil_u(fullres[0], 2), divide_ceil_u(fullres[1], 2)}; + int input_size[2]; + GPU_texture_get_mipmap_size(txl->dof_reduced_color, 0, input_size); + float uv_correction_fac[2] = {res[0] / (float)input_size[0], res[1] / (float)input_size[1]}; + float output_texel_size[2] = {1.0f / res[0], 1.0f / res[1]}; + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + { + DRW_PASS_CREATE(psl->dof_gather_fg_holefill, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg_holefill); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + /* Reuse textures from the setup pass. */ + /* NOTE: We could use the texture pool do that for us but it does not track usage and it might + * backfire (it does in practice). */ + fx->dof_fg_holefill_color_tx = fx->dof_half_res_color_tx; + fx->dof_fg_holefill_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + + GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_holefill_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_gather_fg, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_fg); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + if (use_bokeh_tx) { + /* Negate to flip bokeh shape. Mimics optical phenomenon. */ + negate_v2(fx->dof_bokeh_aniso); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx); + /* Restore. */ + negate_v2(fx->dof_bokeh_aniso); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_fg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_fg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + /* Reuse textures from the setup pass. */ + /* NOTE: We could use the texture pool do that for us but it does not track usage and it might + * backfire (it does in practice). */ + fx->dof_fg_occlusion_tx = fx->dof_half_res_coc_tx; + + /* NOTE: First target is holefill texture so we can use the median filter on it. + * See the filter function. */ + GPU_framebuffer_ensure_config(&fbl->dof_gather_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_occlusion_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_gather_bg, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_gather_bg); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBufferBilinear", &txl->dof_reduced_color, WITH_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &txl->dof_reduced_color, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesFgBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture_ref(grp, "cocTilesBgBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec2_copy(grp, "gatherInputUvCorrection", uv_correction_fac); + DRW_shgroup_uniform_vec2_copy(grp, "gatherOutputTexelSize", output_texel_size); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_gather_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + fx->dof_bg_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); + fx->dof_bg_weight_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + /* Reuse, since only used for scatter. Foreground is processed before background. */ + fx->dof_bg_occlusion_tx = fx->dof_fg_occlusion_tx; + + /* NOTE: First target is holefill texture so we can use the median filter on it. + * See the filter function. */ + GPU_framebuffer_ensure_config(&fbl->dof_gather_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_holefill_weight_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_occlusion_tx), + }); + } +} + +/** + * Filter an input buffer using a median filter to reduce noise. + * NOTE: We use the holefill texture as our input to reduce memory usage. + * Thus, the holefill pass cannot be filtered. + **/ +static void dof_filter_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + DRW_PASS_CREATE(psl->dof_filter, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_filter_get(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_filter); + DRW_shgroup_uniform_texture_ref_ex( + grp, "colorBuffer", &fx->dof_fg_holefill_color_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex( + grp, "weightBuffer", &fx->dof_fg_holefill_weight_tx, NO_FILTERING); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + GPU_framebuffer_ensure_config(&fbl->dof_filter_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_weight_tx), + }); + + GPU_framebuffer_ensure_config(&fbl->dof_filter_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx), + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_weight_tx), + }); +} + +/** + * Do the Scatter convolution. A sprite is emited for every 4 pixels but is only expanded if the + * pixels are bright enough to be scattered. + **/ +static void dof_scatter_pass_init(EEVEE_FramebufferList *fbl, + EEVEE_PassList *psl, + EEVEE_TextureList *txl, + EEVEE_EffectsInfo *fx) +{ + int input_size[2], target_size[2]; + GPU_texture_get_mipmap_size(fx->dof_half_res_color_tx, 0, input_size); + GPU_texture_get_mipmap_size(fx->dof_bg_color_tx, 0, target_size); + /* Draw a sprite for every four halfres pixels. */ + int sprite_count = (input_size[0] / 2) * (input_size[1] / 2); + float target_texel_size[2] = {1.0f / target_size[0], 1.0f / target_size[1]}; + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + { + DRW_PASS_CREATE(psl->dof_scatter_fg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + + const bool is_foreground = true; + GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_fg); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_fg_occlusion_tx); + DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size); + DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + if (use_bokeh_tx) { + /* Negate to flip bokeh shape. Mimics optical phenomenon. */ + negate_v2(fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx); + /* Restore. */ + negate_v2(fx->dof_bokeh_aniso_inv); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count); + + GPU_framebuffer_ensure_config(&fbl->dof_scatter_fg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_fg_color_tx), + }); + } + { + DRW_PASS_CREATE(psl->dof_scatter_bg, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + + const bool is_foreground = false; + GPUShader *sh = EEVEE_shaders_depth_of_field_scatter_get(is_foreground, use_bokeh_tx); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_scatter_bg); + DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &fx->dof_scatter_src_tx, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "cocBuffer", &txl->dof_reduced_coc, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "occlusionBuffer", &fx->dof_bg_occlusion_tx); + DRW_shgroup_uniform_vec2_copy(grp, "targetTexelSize", target_texel_size); + DRW_shgroup_uniform_int_copy(grp, "spritePerRow", input_size[0] / 2); + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropy", fx->dof_bokeh_aniso); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_scatter_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_count); + + GPU_framebuffer_ensure_config(&fbl->dof_scatter_bg_fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(fx->dof_bg_color_tx), + }); + } +} + +/** + * Recombine the result of the foreground and background processing. Also perform a slight out of + * focus blur to improve geometric continuity. + **/ +static void dof_recombine_pass_init(EEVEE_FramebufferList *UNUSED(fbl), + EEVEE_PassList *psl, + EEVEE_EffectsInfo *fx) +{ + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + const bool use_bokeh_tx = (fx->dof_bokeh_gather_lut_tx != NULL); + + DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR); + + GPUShader *sh = EEVEE_shaders_depth_of_field_resolve_get(use_bokeh_tx, fx->dof_hq_slight_focus); + DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->dof_resolve); + DRW_shgroup_uniform_texture_ref_ex(grp, "fullResColorBuffer", &fx->source_buffer, NO_FILTERING); + DRW_shgroup_uniform_texture_ref_ex(grp, "fullResDepthBuffer", &dtxl->depth, NO_FILTERING); + DRW_shgroup_uniform_texture_ref(grp, "bgColorBuffer", &fx->dof_bg_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "bgWeightBuffer", &fx->dof_bg_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "bgTileBuffer", &fx->dof_coc_dilated_tiles_bg_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgColorBuffer", &fx->dof_fg_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgWeightBuffer", &fx->dof_fg_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "holefillColorBuffer", &fx->dof_fg_holefill_color_tx); + DRW_shgroup_uniform_texture_ref(grp, "holefillWeightBuffer", &fx->dof_fg_holefill_weight_tx); + DRW_shgroup_uniform_texture_ref(grp, "fgTileBuffer", &fx->dof_coc_dilated_tiles_fg_tx); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_vec4_copy(grp, "cocParams", fx->dof_coc_params); + DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size); + if (use_bokeh_tx) { + DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); + DRW_shgroup_uniform_texture_ref(grp, "bokehLut", &fx->dof_bokeh_resolve_lut_tx); + } + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); +} + +void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) +{ + EEVEE_TextureList *txl = vedata->txl; + EEVEE_FramebufferList *fbl = vedata->fbl; + EEVEE_PassList *psl = vedata->psl; + EEVEE_StorageList *stl = vedata->stl; + EEVEE_EffectsInfo *fx = stl->effects; + + if ((fx->enabled_effects & EFFECT_DOF) != 0) { + /* GPU_RGBA16F is sufficient now that all scattered bokeh are premultiplied. + * GPU_R11F_G11F_B10F is not enough when lots of scattered sprites are big and offers + * relatively small benefits. */ + fx->dof_color_format = GPU_RGBA16F; + + dof_bokeh_pass_init(fbl, psl, fx); + dof_setup_pass_init(fbl, psl, fx); + dof_flatten_tiles_pass_init(fbl, psl, fx); + dof_dilate_tiles_pass_init(fbl, psl, fx); + dof_reduce_pass_init(fbl, psl, txl, fx); + dof_gather_pass_init(fbl, psl, txl, fx); + dof_filter_pass_init(fbl, psl, fx); + dof_scatter_pass_init(fbl, psl, txl, fx); + dof_recombine_pass_init(fbl, psl, fx); + } +} + +static void dof_recursive_reduce(void *vedata, int UNUSED(level)) +{ + EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; + EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl; + EEVEE_EffectsInfo *fx = ((EEVEE_Data *)vedata)->stl->effects; + + fx->dof_reduce_input_color_tx = txl->dof_reduced_color; + fx->dof_reduce_input_coc_tx = txl->dof_reduced_coc; + + DRW_draw_pass(psl->dof_reduce); } void EEVEE_depth_of_field_draw(EEVEE_Data *vedata) @@ -214,24 +971,77 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata) EEVEE_TextureList *txl = vedata->txl; EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_StorageList *stl = vedata->stl; - EEVEE_EffectsInfo *effects = stl->effects; + EEVEE_EffectsInfo *effects = stl->effects; /* TODO(fclem): Because of silly SWAP_BUFFERS. */ + EEVEE_EffectsInfo *fx = effects; /* Depth Of Field */ if ((effects->enabled_effects & EFFECT_DOF) != 0) { - const float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + DRW_stats_group_start("Depth of Field"); - /* Downsample */ - GPU_framebuffer_bind(fbl->dof_down_fb); - DRW_draw_pass(psl->dof_down); + if (fx->dof_bokeh_gather_lut_tx != NULL) { + GPU_framebuffer_bind(fbl->dof_bokeh_fb); + DRW_draw_pass(psl->dof_bokeh); + } - /* Scatter */ - GPU_framebuffer_bind(fbl->dof_scatter_fb); - GPU_framebuffer_clear_color(fbl->dof_scatter_fb, clear_col); - DRW_draw_pass(psl->dof_scatter); + GPU_framebuffer_bind(fbl->dof_setup_fb); + DRW_draw_pass(psl->dof_setup); - /* Resolve */ - GPU_framebuffer_bind(effects->target_buffer); + GPU_framebuffer_bind(fbl->dof_flatten_tiles_fb); + DRW_draw_pass(psl->dof_flatten_tiles); + + dof_dilate_tiles_pass_draw(fbl, psl, fx); + + fx->dof_reduce_input_color_tx = fx->dof_half_res_color_tx; + fx->dof_reduce_input_coc_tx = fx->dof_half_res_coc_tx; + + /* First step is just a copy. */ + GPU_framebuffer_bind(fbl->dof_downsample_fb); + DRW_draw_pass(psl->dof_downsample); + + /* First step is just a copy. */ + GPU_framebuffer_bind(fbl->dof_reduce_copy_fb); + DRW_draw_pass(psl->dof_reduce_copy); + + GPU_framebuffer_recursive_downsample( + fbl->dof_reduce_fb, fx->dof_reduce_steps, &dof_recursive_reduce, vedata); + + { + /* Foreground convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_fg_fb); + DRW_draw_pass(psl->dof_gather_fg); + + GPU_framebuffer_bind(fbl->dof_filter_fg_fb); + DRW_draw_pass(psl->dof_filter); + + GPU_framebuffer_bind(fbl->dof_scatter_fg_fb); + DRW_draw_pass(psl->dof_scatter_fg); + } + + { + /* Background convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_bg_fb); + DRW_draw_pass(psl->dof_gather_bg); + + GPU_framebuffer_bind(fbl->dof_filter_bg_fb); + DRW_draw_pass(psl->dof_filter); + + GPU_framebuffer_bind(fbl->dof_scatter_bg_fb); + DRW_draw_pass(psl->dof_scatter_bg); + } + + { + /* Holefill convolution. */ + GPU_framebuffer_bind(fbl->dof_gather_fg_holefill_fb); + DRW_draw_pass(psl->dof_gather_fg_holefill); + + /* NOTE: do not filter the holefill pass as we use it as out filter input buffer. */ + } + + GPU_framebuffer_bind(fx->target_buffer); DRW_draw_pass(psl->dof_resolve); + SWAP_BUFFERS(); + + DRW_stats_group_end(); } } diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 698b959f1a9..77586f4b43a 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -102,11 +102,9 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, effects->enabled_effects |= EEVEE_occlusion_init(sldata, vedata); effects->enabled_effects |= EEVEE_screen_raytrace_init(sldata, vedata); - if ((effects->enabled_effects & EFFECT_TAA) && effects->taa_current_sample > 1) { - /* Update matrices here because EEVEE_screen_raytrace_init can have reset the - * taa_current_sample. (See T66811) */ - EEVEE_temporal_sampling_update_matrices(vedata); - } + /* Update matrices here because EEVEE_screen_raytrace_init can have reset the + * taa_current_sample. (See T66811) */ + EEVEE_temporal_sampling_update_matrices(vedata); EEVEE_volumes_init(sldata, vedata); EEVEE_subsurface_init(sldata, vedata); diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 802b47b61a4..d1238d7b82e 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -456,13 +456,17 @@ static void eevee_render_to_image(void *vedata, } EEVEE_PrivateData *g_data = ved->stl->g_data; - EEVEE_render_modules_init(vedata, engine, depsgraph); - int initial_frame = CFRA; float initial_subframe = SUBFRA; float shuttertime = (do_motion_blur) ? scene->eevee.motion_blur_shutter : 0.0f; int time_steps_tot = (do_motion_blur) ? max_ii(1, scene->eevee.motion_blur_steps) : 1; - g_data->render_tot_samples = divide_ceil_u(scene->eevee.taa_render_samples, time_steps_tot); + g_data->render_timesteps = time_steps_tot; + + EEVEE_render_modules_init(vedata, engine, depsgraph); + + g_data->render_sample_count_per_timestep = EEVEE_temporal_sampling_sample_count_get(scene, + ved->stl); + /* Compute start time. The motion blur will cover `[time ...time + shuttertime]`. */ float time = initial_frame + initial_subframe; switch (scene->eevee.motion_blur_position) { @@ -553,7 +557,8 @@ static void eevee_render_to_image(void *vedata, /* Actual drawing. */ { - EEVEE_renderpasses_output_init(sldata, vedata, g_data->render_tot_samples * time_steps_tot); + EEVEE_renderpasses_output_init( + sldata, vedata, g_data->render_sample_count_per_timestep * time_steps_tot); EEVEE_temporal_sampling_create_view(vedata); EEVEE_render_draw(vedata, engine, render_layer, rect); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index e48f5f9dd32..9761264f03e 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -55,6 +55,9 @@ extern struct DrawEngineType draw_engine_eevee_type; #define MAX_BLOOM_STEP 16 #define MAX_AOVS 64 +/* Special value chosen to not be altered by depth of field sample count. */ +#define TAA_MAX_SAMPLE 10000926 + // #define DEBUG_SHADOW_DISTRIBUTION /* Only define one of these. */ @@ -206,6 +209,28 @@ typedef enum EEVEE_SSRShaderOptions { SSR_MAX_SHADER = (1 << 4), } EEVEE_SSRShaderOptions; +/* DOF Gather pass shader variations */ +typedef enum EEVEE_DofGatherPass { + DOF_GATHER_FOREGROUND = 0, + DOF_GATHER_BACKGROUND = 1, + DOF_GATHER_HOLEFILL = 2, + + DOF_GATHER_MAX_PASS, +} EEVEE_DofGatherPass; + +#define DOF_TILE_DIVISOR 16 +#define DOF_BOKEH_LUT_SIZE 32 +#define DOF_GATHER_RING_COUNT 5 +#define DOF_DILATE_RING_COUNT 3 +#define DOF_FAST_GATHER_COC_ERROR 0.05 + +#define DOF_SHADER_DEFINES \ + "#define DOF_TILE_DIVISOR " STRINGIFY(DOF_TILE_DIVISOR) "\n" \ + "#define DOF_BOKEH_LUT_SIZE " STRINGIFY(DOF_BOKEH_LUT_SIZE) "\n" \ + "#define DOF_GATHER_RING_COUNT " STRINGIFY(DOF_GATHER_RING_COUNT) "\n" \ + "#define DOF_DILATE_RING_COUNT " STRINGIFY(DOF_DILATE_RING_COUNT) "\n" \ + "#define DOF_FAST_GATHER_COC_ERROR " STRINGIFY(DOF_FAST_GATHER_COC_ERROR) "\n" + /* ************ PROBE UBO ************* */ /* They are the same struct as their Cache siblings. @@ -258,8 +283,20 @@ typedef struct EEVEE_PassList { struct DRWPass *bloom_upsample; struct DRWPass *bloom_resolve; struct DRWPass *bloom_accum_ps; - struct DRWPass *dof_down; - struct DRWPass *dof_scatter; + struct DRWPass *dof_setup; + struct DRWPass *dof_flatten_tiles; + struct DRWPass *dof_dilate_tiles_minmax; + struct DRWPass *dof_dilate_tiles_minabs; + struct DRWPass *dof_reduce_copy; + struct DRWPass *dof_downsample; + struct DRWPass *dof_reduce; + struct DRWPass *dof_bokeh; + struct DRWPass *dof_gather_fg; + struct DRWPass *dof_gather_fg_holefill; + struct DRWPass *dof_gather_bg; + struct DRWPass *dof_scatter_fg; + struct DRWPass *dof_scatter_bg; + struct DRWPass *dof_filter; struct DRWPass *dof_resolve; struct DRWPass *volumetric_world_ps; struct DRWPass *volumetric_objects_ps; @@ -339,8 +376,20 @@ typedef struct EEVEE_FramebufferList { struct GPUFrameBuffer *sss_clear_fb; struct GPUFrameBuffer *sss_translucency_fb; struct GPUFrameBuffer *sss_accum_fb; - struct GPUFrameBuffer *dof_down_fb; - struct GPUFrameBuffer *dof_scatter_fb; + struct GPUFrameBuffer *dof_setup_fb; + struct GPUFrameBuffer *dof_flatten_tiles_fb; + struct GPUFrameBuffer *dof_dilate_tiles_fb; + struct GPUFrameBuffer *dof_downsample_fb; + struct GPUFrameBuffer *dof_reduce_fb; + struct GPUFrameBuffer *dof_reduce_copy_fb; + struct GPUFrameBuffer *dof_bokeh_fb; + struct GPUFrameBuffer *dof_gather_fg_fb; + struct GPUFrameBuffer *dof_filter_fg_fb; + struct GPUFrameBuffer *dof_gather_fg_holefill_fb; + struct GPUFrameBuffer *dof_gather_bg_fb; + struct GPUFrameBuffer *dof_filter_bg_fb; + struct GPUFrameBuffer *dof_scatter_fg_fb; + struct GPUFrameBuffer *dof_scatter_bg_fb; struct GPUFrameBuffer *volumetric_fb; struct GPUFrameBuffer *volumetric_scat_fb; struct GPUFrameBuffer *volumetric_integ_fb; @@ -390,6 +439,9 @@ typedef struct EEVEE_TextureList { struct GPUTexture *cryptomatte; struct GPUTexture *refract_color; struct GPUTexture *taa_history; + /* Could not be pool texture because of mipmapping. */ + struct GPUTexture *dof_reduced_color; + struct GPUTexture *dof_reduced_coc; struct GPUTexture *volume_prop_scattering; struct GPUTexture *volume_prop_extinction; @@ -727,16 +779,45 @@ typedef struct EEVEE_EffectsInfo { struct GPUTexture *velocity_tiles_x_tx; struct GPUTexture *velocity_tiles_tx; /* Depth Of Field */ - float dof_near_far[2]; - float dof_params[2]; - float dof_bokeh[4]; - float dof_bokeh_sides[4]; - int dof_target_size[2]; - struct GPUTexture *dof_down_near; /* Textures from pool */ - struct GPUTexture *dof_down_far; - struct GPUTexture *dof_coc; - struct GPUTexture *dof_blur; - struct GPUTexture *dof_blur_alpha; + float dof_jitter_radius; + float dof_jitter_blades; + float dof_jitter_focus; + int dof_jitter_ring_count; + float dof_coc_params[2], dof_coc_near_dist, dof_coc_far_dist; + float dof_bokeh_blades, dof_bokeh_rotation, dof_bokeh_aniso[2], dof_bokeh_max_size; + float dof_bokeh_aniso_inv[2]; + float dof_scatter_color_threshold; + float dof_scatter_coc_threshold; + float dof_scatter_neighbor_max_color; + float dof_fx_max_coc; + float dof_denoise_factor; + int dof_dilate_slight_focus; + int dof_dilate_ring_count; + int dof_dilate_ring_width_multiplier; + int dof_reduce_steps; + bool dof_hq_slight_focus; + eGPUTextureFormat dof_color_format; + struct GPUTexture *dof_bg_color_tx; /* All textures from pool... */ + struct GPUTexture *dof_bg_occlusion_tx; + struct GPUTexture *dof_bg_weight_tx; + struct GPUTexture *dof_bokeh_gather_lut_tx; + struct GPUTexture *dof_bokeh_scatter_lut_tx; + struct GPUTexture *dof_bokeh_resolve_lut_tx; + struct GPUTexture *dof_coc_dilated_tiles_bg_tx; + struct GPUTexture *dof_coc_dilated_tiles_fg_tx; + struct GPUTexture *dof_coc_tiles_bg_tx; + struct GPUTexture *dof_coc_tiles_fg_tx; + struct GPUTexture *dof_downsample_tx; + struct GPUTexture *dof_fg_color_tx; + struct GPUTexture *dof_fg_occlusion_tx; + struct GPUTexture *dof_fg_weight_tx; + struct GPUTexture *dof_fg_holefill_color_tx; + struct GPUTexture *dof_fg_holefill_weight_tx; + struct GPUTexture *dof_half_res_coc_tx; + struct GPUTexture *dof_half_res_color_tx; + struct GPUTexture *dof_scatter_src_tx; + struct GPUTexture *dof_reduce_input_coc_tx; /* Just references to actual textures. */ + struct GPUTexture *dof_reduce_input_color_tx; /* Alpha Checker */ float color_checker_dark[4]; float color_checker_light[4]; @@ -1002,7 +1083,8 @@ typedef struct EEVEE_PrivateData { /** For rendering planar reflections. */ struct DRWView *planar_views[MAX_PLANAR]; - int render_tot_samples; + int render_timesteps; + int render_sample_count_per_timestep; } EEVEE_PrivateData; /* Transient data */ /* eevee_data.c */ @@ -1110,9 +1192,16 @@ struct GPUShader *EEVEE_shaders_bloom_blit_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_downsample_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_upsample_get(bool high_quality); struct GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality); -struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha); -struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha); -struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha); +struct GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_setup_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool pass); +struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool is_copy_pass); +struct GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool bokeh_tx); +struct GPUShader *EEVEE_shaders_depth_of_field_filter_get(void); +struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool is_foreground, bool bokeh_tx); +struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_bokeh_tx, bool use_hq_gather); struct GPUShader *EEVEE_shaders_effect_downsample_sh_get(void); struct GPUShader *EEVEE_shaders_effect_downsample_cube_sh_get(void); struct GPUShader *EEVEE_shaders_effect_minz_downlevel_sh_get(void); @@ -1232,6 +1321,12 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera); void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_depth_of_field_draw(EEVEE_Data *vedata); +bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *effects, + float r_jitter[2], + float *r_focus_distance); +int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects, + int sample_count, + int *r_ring_count); /* eevee_bloom.c */ int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -1345,6 +1440,7 @@ int EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov); /* eevee_temporal_sampling.c */ void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata); void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata); +int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl); int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_temporal_sampling_offset_calc(const double ht_point[2], const float filter_size, diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 72b12f6daeb..66e3d8ebd22 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -563,7 +563,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl /* Sort transparents before the loop. */ DRW_pass_sort_shgroup_z(psl->transparent_pass); - uint tot_sample = stl->g_data->render_tot_samples; + uint tot_sample = stl->g_data->render_sample_count_per_timestep; uint render_samples = 0; /* SSR needs one iteration to start properly. */ diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 82b2395cc6e..ec058afd58e 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -77,9 +77,16 @@ static struct { struct GPUShader *bloom_resolve_sh[2]; /* Depth Of Field */ - struct GPUShader *dof_downsample_sh[2]; - struct GPUShader *dof_scatter_sh[2]; - struct GPUShader *dof_resolve_sh[2]; + struct GPUShader *dof_bokeh_sh; + struct GPUShader *dof_setup_sh; + struct GPUShader *dof_flatten_tiles_sh; + struct GPUShader *dof_dilate_tiles_sh[2]; + struct GPUShader *dof_downsample_sh; + struct GPUShader *dof_reduce_sh[2]; + struct GPUShader *dof_gather_sh[DOF_GATHER_MAX_PASS][2]; + struct GPUShader *dof_filter_sh; + struct GPUShader *dof_scatter_sh[2][2]; + struct GPUShader *dof_resolve_sh[2][2]; /* General purpose Shaders. */ struct GPUShader *lookdev_background; @@ -192,8 +199,18 @@ extern char datatoc_cubemap_lib_glsl[]; extern char datatoc_default_frag_glsl[]; extern char datatoc_lookdev_world_frag_glsl[]; extern char datatoc_effect_bloom_frag_glsl[]; -extern char datatoc_effect_dof_frag_glsl[]; -extern char datatoc_effect_dof_vert_glsl[]; +extern char datatoc_effect_dof_bokeh_frag_glsl[]; +extern char datatoc_effect_dof_dilate_tiles_frag_glsl[]; +extern char datatoc_effect_dof_downsample_frag_glsl[]; +extern char datatoc_effect_dof_filter_frag_glsl[]; +extern char datatoc_effect_dof_flatten_tiles_frag_glsl[]; +extern char datatoc_effect_dof_gather_frag_glsl[]; +extern char datatoc_effect_dof_lib_glsl[]; +extern char datatoc_effect_dof_reduce_frag_glsl[]; +extern char datatoc_effect_dof_resolve_frag_glsl[]; +extern char datatoc_effect_dof_scatter_frag_glsl[]; +extern char datatoc_effect_dof_scatter_vert_glsl[]; +extern char datatoc_effect_dof_setup_frag_glsl[]; extern char datatoc_effect_downsample_cube_frag_glsl[]; extern char datatoc_effect_downsample_frag_glsl[]; extern char datatoc_effect_gtao_frag_glsl[]; @@ -281,6 +298,7 @@ static void eevee_shader_library_ensure(void) DRW_SHADER_LIB_ADD(e_data.lib, volumetric_lib); DRW_SHADER_LIB_ADD(e_data.lib, closure_lib); DRW_SHADER_LIB_ADD(e_data.lib, ssr_lib); + DRW_SHADER_LIB_ADD(e_data.lib, effect_dof_lib); /* Add one for each Closure */ e_data.closure_lit_lib = BLI_string_joinN(datatoc_closure_lit_lib_glsl, @@ -1010,48 +1028,172 @@ GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality) /** \name Depth of field * \{ */ -GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_bokeh_get(void) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_downsample_sh[index] == NULL) { - e_data.dof_downsample_sh[index] = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_effect_dof_frag_glsl, - e_data.lib, - use_alpha ? "#define USE_ALPHA_DOF\n" - "#define STEP_DOWNSAMPLE\n" : - "#define STEP_DOWNSAMPLE\n"); + if (e_data.dof_bokeh_sh == NULL) { + e_data.dof_bokeh_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_bokeh_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); } - return e_data.dof_downsample_sh[index]; + return e_data.dof_bokeh_sh; } -GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_setup_get(void) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_scatter_sh[index] == NULL) { - e_data.dof_scatter_sh[index] = DRW_shader_create_with_shaderlib(datatoc_effect_dof_vert_glsl, - NULL, - datatoc_effect_dof_frag_glsl, - e_data.lib, - use_alpha ? - "#define USE_ALPHA_DOF\n" - "#define STEP_SCATTER\n" : - "#define STEP_SCATTER\n"); + if (e_data.dof_setup_sh == NULL) { + e_data.dof_setup_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_setup_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); } - return e_data.dof_scatter_sh[index]; + return e_data.dof_setup_sh; } -GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha) +GPUShader *EEVEE_shaders_depth_of_field_flatten_tiles_get(void) { - int index = use_alpha ? 1 : 0; - if (e_data.dof_resolve_sh[index] == NULL) { - e_data.dof_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_effect_dof_frag_glsl, - e_data.lib, - use_alpha ? "#define USE_ALPHA_DOF\n" - "#define STEP_RESOLVE\n" : - "#define STEP_RESOLVE\n"); + if (e_data.dof_flatten_tiles_sh == NULL) { + e_data.dof_flatten_tiles_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_flatten_tiles_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); } - return e_data.dof_resolve_sh[index]; + return e_data.dof_flatten_tiles_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_dilate_tiles_get(bool b_pass) +{ + int pass = b_pass; + if (e_data.dof_dilate_tiles_sh[pass] == NULL) { + e_data.dof_dilate_tiles_sh[pass] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_dilate_tiles_frag_glsl, + e_data.lib, + (pass == 0) ? DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_MAX\n" : + DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_ABS\n"); + } + return e_data.dof_dilate_tiles_sh[pass]; +} + +GPUShader *EEVEE_shaders_depth_of_field_downsample_get(void) +{ + if (e_data.dof_downsample_sh == NULL) { + e_data.dof_downsample_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_downsample_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_downsample_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_reduce_get(bool b_is_copy_pass) +{ + int is_copy_pass = b_is_copy_pass; + if (e_data.dof_reduce_sh[is_copy_pass] == NULL) { + e_data.dof_reduce_sh[is_copy_pass] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_reduce_frag_glsl, + e_data.lib, + (is_copy_pass) ? DOF_SHADER_DEFINES "#define COPY_PASS\n" : + DOF_SHADER_DEFINES "#define REDUCE_PASS\n"); + } + return e_data.dof_reduce_sh[is_copy_pass]; +} + +GPUShader *EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool b_use_bokeh_tx) +{ + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_gather_sh[pass][use_bokeh_tx] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + + switch (pass) { + case DOF_GATHER_FOREGROUND: + BLI_dynstr_append(ds, "#define DOF_FOREGROUND_PASS\n"); + break; + case DOF_GATHER_BACKGROUND: + BLI_dynstr_append(ds, "#define DOF_BACKGROUND_PASS\n"); + break; + case DOF_GATHER_HOLEFILL: + BLI_dynstr_append(ds, + "#define DOF_BACKGROUND_PASS\n" + "#define DOF_HOLEFILL_PASS\n"); + break; + default: + break; + } + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_gather_sh[pass][use_bokeh_tx] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_gather_frag_glsl, e_data.lib, define); + + MEM_freeN(define); + } + return e_data.dof_gather_sh[pass][use_bokeh_tx]; +} + +GPUShader *EEVEE_shaders_depth_of_field_filter_get(void) +{ + if (e_data.dof_filter_sh == NULL) { + e_data.dof_filter_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_filter_frag_glsl, e_data.lib, DOF_SHADER_DEFINES); + } + return e_data.dof_filter_sh; +} + +GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool b_is_foreground, bool b_use_bokeh_tx) +{ + int is_foreground = b_is_foreground; + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + BLI_dynstr_append( + ds, (is_foreground) ? "#define DOF_FOREGROUND_PASS\n" : "#define DOF_BACKGROUND_PASS\n"); + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] = DRW_shader_create_with_shaderlib( + datatoc_effect_dof_scatter_vert_glsl, + NULL, + datatoc_effect_dof_scatter_frag_glsl, + e_data.lib, + define); + + MEM_freeN(define); + } + return e_data.dof_scatter_sh[is_foreground][use_bokeh_tx]; +} + +GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_use_hq_gather) +{ + int use_hq_gather = b_use_hq_gather; + int use_bokeh_tx = b_use_bokeh_tx; + if (e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] == NULL) { + DynStr *ds = BLI_dynstr_new(); + + BLI_dynstr_append(ds, DOF_SHADER_DEFINES); + BLI_dynstr_append(ds, "#define DOF_RESOLVE_PASS\n"); + + if (use_bokeh_tx) { + BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n"); + } + + BLI_dynstr_appendf(ds, "#define DOF_SLIGHT_FOCUS_DENSITY %d\n", use_hq_gather ? 4 : 2); + + char *define = BLI_dynstr_get_cstring(ds); + BLI_dynstr_free(ds); + + e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] = + DRW_shader_create_fullscreen_with_shaderlib( + datatoc_effect_dof_resolve_frag_glsl, e_data.lib, define); + + MEM_freeN(define); + } + return e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather]; } /* \} */ @@ -1458,6 +1600,27 @@ void EEVEE_shaders_free(void) DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh); DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh); DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_bokeh_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_setup_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_flatten_tiles_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[0]); + DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[1]); + DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[0]); + DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[1]); + for (int i = 0; i < DOF_GATHER_MAX_PASS; i++) { + DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][1]); + } + DRW_SHADER_FREE_SAFE(e_data.dof_filter_sh); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][1]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][0]); + DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][1]); DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[0]); DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[1]); for (int i = 0; i < 2; i++) { @@ -1465,9 +1628,6 @@ void EEVEE_shaders_free(void) DRW_SHADER_FREE_SAFE(e_data.bloom_downsample_sh[i]); DRW_SHADER_FREE_SAFE(e_data.bloom_upsample_sh[i]); DRW_SHADER_FREE_SAFE(e_data.bloom_resolve_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[i]); - DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[i]); } for (int i = 0; i < SSR_MAX_SHADER; i++) { DRW_SHADER_FREE_SAFE(e_data.ssr_sh[i]); diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 456efeca0f0..8fa7d899b6b 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -142,16 +142,52 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou Scene *scene = draw_ctx->scene; RenderData *rd = &scene->r; - float persmat[4][4], viewmat[4][4], winmat[4][4]; + float persmat[4][4], viewmat[4][4], winmat[4][4], wininv[4][4]; DRW_view_persmat_get(NULL, persmat, false); DRW_view_viewmat_get(NULL, viewmat, false); DRW_view_winmat_get(NULL, winmat, false); + DRW_view_winmat_get(NULL, wininv, true); float ofs[2]; EEVEE_temporal_sampling_offset_calc(ht_point, rd->gauss, ofs); window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + /* Jitter is in pixel space. Focus distance in world space units. */ + float dof_jitter[2], focus_distance; + if (EEVEE_depth_of_field_jitter_get(effects, dof_jitter, &focus_distance)) { + /* Convert to NDC space [-1..1]. */ + dof_jitter[0] /= viewport_size[0] * 0.5f; + dof_jitter[1] /= viewport_size[1] * 0.5f; + + /* Skew the projection matrix in the ray direction and offset it to ray origin. + * Make it focus at focus_distance. */ + if (winmat[2][3] != -1.0f) { + /* Orthographic */ + add_v2_v2(winmat[2], dof_jitter); + + window_translate_m4( + winmat, persmat, dof_jitter[0] * focus_distance, dof_jitter[1] * focus_distance); + } + else { + /* Get focus distance in NDC. */ + float focus_pt[3] = {0.0f, 0.0f, -focus_distance}; + mul_project_m4_v3(winmat, focus_pt); + /* Get pixel footprint in viewspace. */ + float jitter_scaled[3] = {dof_jitter[0], dof_jitter[1], focus_pt[2]}; + float center[3] = {0.0f, 0.0f, focus_pt[2]}; + mul_project_m4_v3(wininv, jitter_scaled); + mul_project_m4_v3(wininv, center); + + /* FIXME(fclem) The offset is noticeably large and the culling might make object pop out + * of the bluring radius. To fix this, use custom enlarged culling matrix. */ + sub_v2_v2v2(jitter_scaled, jitter_scaled, center); + add_v2_v2(viewmat[3], jitter_scaled); + + window_translate_m4(winmat, persmat, dof_jitter[0], dof_jitter[1]); + } + } + BLI_assert(effects->taa_view != NULL); /* When rendering just update the view. This avoids recomputing the culling. */ @@ -194,6 +230,21 @@ void EEVEE_temporal_sampling_create_view(EEVEE_Data *vedata) DRW_view_clip_planes_set(effects->taa_view, NULL, 0); } +int EEVEE_temporal_sampling_sample_count_get(const Scene *scene, const EEVEE_StorageList *stl) +{ + const bool is_render = DRW_state_is_image_render(); + int sample_count = is_render ? scene->eevee.taa_render_samples : scene->eevee.taa_samples; + int timesteps = is_render ? stl->g_data->render_timesteps : 1; + + sample_count = max_ii(0, sample_count); + sample_count = (sample_count == 0) ? TAA_MAX_SAMPLE : sample_count; + sample_count = divide_ceil_u(sample_count, timesteps); + + int dof_sample_count = EEVEE_depth_of_field_sample_count_get(stl->effects, sample_count, NULL); + sample_count = dof_sample_count * divide_ceil_u(sample_count, dof_sample_count); + return sample_count; +} + int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) { EEVEE_StorageList *stl = vedata->stl; @@ -238,10 +289,12 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data view_is_valid = view_is_valid && (ED_screen_animation_no_scrub(wm) == NULL); } - const bool first_sample_only = EEVEE_renderpasses_only_first_sample_pass_active(vedata); - view_is_valid = view_is_valid && !first_sample_only; - effects->taa_total_sample = first_sample_only ? 1 : scene_eval->eevee.taa_samples; - MAX2(effects->taa_total_sample, 0); + effects->taa_total_sample = EEVEE_temporal_sampling_sample_count_get(scene_eval, stl); + + if (EEVEE_renderpasses_only_first_sample_pass_active(vedata)) { + view_is_valid = false; + effects->taa_total_sample = 1; + } /* Motion blur steps could reset the sampling when camera is animated (see T79970). */ if (!DRW_state_is_scene_render()) { diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl index 95a585f0d9c..427657b19b7 100644 --- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl @@ -12,6 +12,12 @@ uniform sampler2DArray utilTex; #define LUT_SIZE 64 +/** + * Reminder: The 4 noise values are based of 3 uncorrelated blue noises: + * x : Uniformly distributed value [0..1] (noise 1). + * y : Uniformly distributed value [0..1] (noise 2). + * z,w : Uniformly distributed point on the unit circle [-1..1] (noise 3). + **/ #define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0) /* Return texture coordinates to sample Surface LUT */ diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl new file mode 100644 index 00000000000..40e4c5a313e --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_bokeh_frag.glsl @@ -0,0 +1,101 @@ + +/** + * Bokeh Look Up Table: This outputs a radius multiplier to shape the sampling in gather pass or + * the scatter sprite appearance. This is only used if bokeh shape is either anamorphic or is not + * a perfect circle. + * We correct samples spacing for polygonal bokeh shapes. However, we do not for anamorphic bokeh + * as it is way more complex and expensive to do. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform float bokehSides; +uniform float bokehRotation; +uniform vec2 bokehAnisotropyInv; + +in vec4 uvcoordsvar; + +layout(location = 0) out vec2 outGatherLut; +layout(location = 1) out float outScatterLut; +layout(location = 2) out float outResolveLut; + +float polygon_sides_length(float sides_count) +{ + return 2.0 * sin(M_PI / sides_count); +} + +/* Returns intersection ratio between the radius edge at theta and the polygon edge. + * Start first corners at theta == 0. */ +float circle_to_polygon_radius(float sides_count, float theta) +{ + /* From Graphics Gems from CryENGINE 3 (Siggraph 2013) by Tiago Sousa (slide 36). */ + float side_angle = M_2PI / sides_count; + float halfside_angle = side_angle * 0.5; + return cos(side_angle * 0.5) / + cos(theta - side_angle * floor((sides_count * theta + M_PI) / M_2PI)); +} + +/* Remap input angle to have homogenous spacing of points along a polygon edge. + * Expect theta to be in [0..2pi] range. */ +float circle_to_polygon_angle(float sides_count, float theta) +{ + float side_angle = M_2PI / sides_count; + float halfside_angle = side_angle * 0.5; + float side = floor(theta / side_angle); + /* Length of segment from center to the middle of polygon side. */ + float adjacent = circle_to_polygon_radius(sides_count, 0.0); + + /* This is the relative position of the sample on the polygon half side. */ + float local_theta = theta - side * side_angle; + float ratio = (local_theta - halfside_angle) / halfside_angle; + + float halfside_len = polygon_sides_length(sides_count) * 0.5; + float oposite = ratio * halfside_len; + + /* NOTE: atan(y_over_x) has output range [-M_PI_2..M_PI_2]. */ + float final_local_theta = atan(oposite / adjacent); + + return side * side_angle + final_local_theta; +} + +void main() +{ + /* Center uv in range [-1..1]. */ + vec2 uv = uvcoordsvar.xy * 2.0 - 1.0; + + float radius = length(uv); + + vec2 texel = floor(gl_FragCoord.xy) - float(DOF_MAX_SLIGHT_FOCUS_RADIUS); + + if (bokehSides > 0.0) { + /* NOTE: atan(y,x) has output range [-M_PI..M_PI], so add 2pi to avoid negative angles. */ + float theta = atan(uv.y, uv.x) + M_2PI; + float r = length(uv); + + radius /= circle_to_polygon_radius(bokehSides, theta - bokehRotation); + + float theta_new = circle_to_polygon_angle(bokehSides, theta); + float r_new = circle_to_polygon_radius(bokehSides, theta_new); + + theta_new -= bokehRotation; + + uv = r_new * vec2(-cos(theta_new), sin(theta_new)); + + { + /* Slight focus distance */ + texel *= bokehAnisotropyInv; + float theta = atan(texel.y, -texel.x) + M_2PI; + texel /= circle_to_polygon_radius(bokehSides, theta + bokehRotation); + } + } + else { + uv *= safe_rcp(length(uv)); + } + + /* For gather store the normalized UV. */ + outGatherLut = uv; + /* For scatter store distance. */ + outScatterLut = radius; + /* For slight focus gather store pixel perfect distance. */ + outResolveLut = length(texel); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl new file mode 100644 index 00000000000..d52a9e6757f --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl @@ -0,0 +1,117 @@ + +/** + * Tile dilate pass: Takes the 8x8 Tiles buffer and converts dilates the tiles with large CoC to + * their neighboorhod. This pass is repeated multiple time until the maximum CoC can be covered. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* 1/16th of fullres. */ +uniform sampler2D cocTilesFgBuffer; +uniform sampler2D cocTilesBgBuffer; + +uniform int ringCount; +uniform int ringWidthMultiplier; +uniform bool dilateSlightFocus; + +/* 1/16th of fullres. Same format as input. */ +layout(location = 0) out vec4 outFgCoc; +layout(location = 1) out vec3 outBgCoc; + +const float tile_to_fullres_factor = float(DOF_TILE_DIVISOR); + +/* Error introduced by the random offset of the gathering kernel's center. */ +const float bluring_radius_error = 1.0 + 1.0 / (gather_ring_count + 0.5); + +void main() +{ + ivec2 center_tile_pos = ivec2(gl_FragCoord.xy); + + CocTile ring_buckets[DOF_DILATE_RING_COUNT]; + + for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) { + ring_buckets[ring] = dof_coc_tile_init(); + + int ring_distance = ring + 1; + for (int sample_id = 0; sample_id < 4 * ring_distance; sample_id++) { + ivec2 offset = dof_square_ring_sample_offset(ring_distance, sample_id); + + offset *= ringWidthMultiplier; + + for (int i = 0; i < 2; i++) { + ivec2 adj_tile_pos = center_tile_pos + ((i == 0) ? offset : -offset); + + CocTile adj_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, adj_tile_pos); + +#ifdef DILATE_MODE_MIN_MAX + /* Actually gather the "absolute" biggest coc but keeping the sign. */ + ring_buckets[ring].fg_min_coc = min(ring_buckets[ring].fg_min_coc, adj_tile.fg_min_coc); + ring_buckets[ring].bg_max_coc = max(ring_buckets[ring].bg_max_coc, adj_tile.bg_max_coc); + + if (dilateSlightFocus) { + ring_buckets[ring].fg_slight_focus_max_coc = dof_coc_max_slight_focus( + ring_buckets[ring].fg_slight_focus_max_coc, adj_tile.fg_slight_focus_max_coc); + } + +#else /* DILATE_MODE_MIN_ABS */ + ring_buckets[ring].fg_max_coc = max(ring_buckets[ring].fg_max_coc, adj_tile.fg_max_coc); + ring_buckets[ring].bg_min_coc = min(ring_buckets[ring].bg_min_coc, adj_tile.bg_min_coc); + + /* Should be tight as possible to reduce gather overhead (see slide 61). */ + float closest_neighbor_distance = length(max(abs(vec2(offset)) - 1.0, 0.0)) * + tile_to_fullres_factor; + + ring_buckets[ring].fg_max_intersectable_coc = max( + ring_buckets[ring].fg_max_intersectable_coc, + adj_tile.fg_max_intersectable_coc + closest_neighbor_distance); + ring_buckets[ring].bg_min_intersectable_coc = min( + ring_buckets[ring].bg_min_intersectable_coc, + adj_tile.bg_min_intersectable_coc + closest_neighbor_distance); +#endif + } + } + } + + /* Load center tile. */ + CocTile out_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, center_tile_pos); + + /* Dilate once. */ + if (dilateSlightFocus) { + out_tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus( + out_tile.fg_slight_focus_max_coc, ring_buckets[0].fg_slight_focus_max_coc); + } + + for (int ring = 0; ring < ringCount && ring < DOF_DILATE_RING_COUNT; ring++) { + float ring_distance = float(ring + 1); + + ring_distance = (ring_distance * ringWidthMultiplier - 1) * tile_to_fullres_factor; + + /* NOTE(fclem): Unsure if both sides of the inequalities have the same unit. */ +#ifdef DILATE_MODE_MIN_MAX + if (-ring_buckets[ring].fg_min_coc * bluring_radius_error > ring_distance) { + out_tile.fg_min_coc = min(out_tile.fg_min_coc, ring_buckets[ring].fg_min_coc); + } + + if (ring_buckets[ring].bg_max_coc * bluring_radius_error > ring_distance) { + out_tile.bg_max_coc = max(out_tile.bg_max_coc, ring_buckets[ring].bg_max_coc); + } + +#else /* DILATE_MODE_MIN_ABS */ + /* Find minimum absolute CoC radii that will be intersected for the previously + * computed maximum CoC values. */ + if (-out_tile.fg_min_coc * bluring_radius_error > ring_distance) { + out_tile.fg_max_coc = max(out_tile.fg_max_coc, ring_buckets[ring].fg_max_coc); + out_tile.fg_max_intersectable_coc = max(out_tile.fg_max_intersectable_coc, + ring_buckets[ring].fg_max_intersectable_coc); + } + + if (out_tile.bg_max_coc * bluring_radius_error > ring_distance) { + out_tile.bg_min_coc = min(out_tile.bg_min_coc, ring_buckets[ring].bg_min_coc); + out_tile.bg_min_intersectable_coc = min(out_tile.bg_min_intersectable_coc, + ring_buckets[ring].bg_min_intersectable_coc); + } +#endif + } + + dof_coc_tile_store(out_tile, outFgCoc, outBgCoc); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl new file mode 100644 index 00000000000..c477e0f6eb8 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_downsample_frag.glsl @@ -0,0 +1,37 @@ + +/** + * Downsample pass: CoC aware downsample to quarter resolution. + * + * Pretty much identical to the setup pass but get CoC from buffer. Also does not + * weight luma for the bilateral weights. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Half resolution. */ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Quarter resolution. */ +layout(location = 0) out vec4 outColor; + +void main() +{ + vec2 halfres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 halfres pixels. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * halfres_texel_size; + + vec4 colors[4]; + vec4 cocs; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * halfres_texel_size; + colors[i] = textureLod(colorBuffer, sample_uv, 0.0); + cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r; + } + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl new file mode 100644 index 00000000000..8fd8215da0f --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_filter_frag.glsl @@ -0,0 +1,93 @@ + +/** + * Gather Filter pass: Filter the gather pass result to reduce noise. + * + * This is a simple 3x3 median filter to avoid dilating highlights with a 3x3 max filter even if + * cheaper. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D colorBuffer; +uniform sampler2D weightBuffer; + +in vec4 uvcoordsvar; + +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outWeight; + +/* From: + * Implementing Median Filters in XC4000E FPGAs + * JOHN L. SMITH, Univision Technologies Inc., Billerica, MA + * http://users.utcluj.ro/~baruch/resources/Image/xl23_16.pdf + * Figure 1 */ + +/* Outputs low median and high value of a triple. */ +void lmh(vec4 s1, vec4 s2, vec4 s3, out vec4 l, out vec4 m, out vec4 h) +{ + /* From diagram, with nodes numbered from top to bottom. */ + vec4 h1 = max(s2, s3); + vec4 l1 = min(s2, s3); + + vec4 h2 = max(s1, l1); + vec4 l2 = min(s1, l1); + + vec4 h3 = max(h2, h1); + vec4 l3 = min(h2, h1); + + l = l2; + m = l3; + h = h3; +} + +vec4 median_filter(sampler2D tex, vec2 uv) +{ + vec2 texel_size = 1.0 / vec2(textureSize(tex, 0).xy); + vec4 samples[9]; + int s = 0; + + const vec2 ofs[9] = vec2[9](vec2(-1, -1), + vec2(0, -1), + vec2(1, -1), + vec2(-1, 0), + vec2(0, 0), + vec2(1, 0), + vec2(-1, 1), + vec2(0, 1), + vec2(1, 1)); + + for (int s = 0; s < 9; s++) { + samples[s] = textureLod(tex, uv + ofs[s] * texel_size, 0.0); + } + + if (no_gather_filtering) { + return samples[4]; + } + + for (int s = 0; s < 9; s += 3) { + lmh(samples[s], samples[s + 1], samples[s + 2], samples[s], samples[s + 1], samples[s + 2]); + } + /* Some aliases to better understand what's happening. */ + vec4 L123 = samples[0 + 0], L456 = samples[3 + 0], L789 = samples[6 + 0]; + vec4 M123 = samples[0 + 1], M456 = samples[3 + 1], M789 = samples[6 + 1]; + vec4 H123 = samples[0 + 2], H456 = samples[3 + 2], H789 = samples[6 + 2]; + vec4 dummy, l, m, h; + /* Left nodes. */ + h = max(max(L123, L456), L789); + /* Right nodes. */ + l = min(min(H123, H456), H789); + /* Center nodes. */ + lmh(M123, M456, M789, dummy, m, dummy); + /* Last bottom nodes. */ + lmh(l, m, h, dummy, m, dummy); + + return m; +} + +void main() +{ + /* OPTI(fclem) Could early return on some tiles. */ + + outColor = median_filter(colorBuffer, uvcoordsvar.xy); + outWeight = median_filter(weightBuffer, uvcoordsvar.xy).r; +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl new file mode 100644 index 00000000000..bd81171c759 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_flatten_tiles_frag.glsl @@ -0,0 +1,57 @@ + +/** + * Tile flatten pass: Takes the halfres CoC buffer and converts it to 8x8 tiles. + * + * Output min and max values for each tile and for both foreground & background. + * Also outputs min intersectable CoC for the background, which is the minimum CoC + * that comes from the background pixels. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Half resolution. */ +uniform sampler2D halfResCocBuffer; + +/* 1/8th of halfResCocBuffer resolution. So 1/16th of fullres. */ +layout(location = 0) out vec4 outFgCoc; +layout(location = 1) out vec3 outBgCoc; + +const int halfres_tile_divisor = DOF_TILE_DIVISOR / 2; + +void main() +{ + ivec2 halfres_bounds = textureSize(halfResCocBuffer, 0).xy - 1; + ivec2 tile_co = ivec2(gl_FragCoord.xy); + + CocTile tile = dof_coc_tile_init(); + + for (int x = 0; x < halfres_tile_divisor; x++) { + /* OPTI: Could be done in separate passes. */ + for (int y = 0; y < halfres_tile_divisor; y++) { + ivec2 sample_texel = tile_co * halfres_tile_divisor + ivec2(x, y); + vec2 sample_data = texelFetch(halfResCocBuffer, min(sample_texel, halfres_bounds), 0).rg; + float sample_coc = sample_data.x; + float sample_slight_focus_coc = sample_data.y; + + float fg_coc = min(sample_coc, 0.0); + tile.fg_min_coc = min(tile.fg_min_coc, fg_coc); + tile.fg_max_coc = max(tile.fg_max_coc, fg_coc); + + float bg_coc = max(sample_coc, 0.0); + tile.bg_min_coc = min(tile.bg_min_coc, bg_coc); + tile.bg_max_coc = max(tile.bg_max_coc, bg_coc); + + if (sample_coc > 0.0) { + tile.bg_min_intersectable_coc = min(tile.bg_min_intersectable_coc, bg_coc); + } + if (sample_coc < 0.0) { + tile.fg_max_intersectable_coc = max(tile.fg_max_intersectable_coc, fg_coc); + } + + tile.fg_slight_focus_max_coc = dof_coc_max_slight_focus(tile.fg_slight_focus_max_coc, + sample_slight_focus_coc); + } + } + + dof_coc_tile_store(tile, outFgCoc, outBgCoc); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl deleted file mode 100644 index 9c1ca17f87c..00000000000 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl +++ /dev/null @@ -1,254 +0,0 @@ - - -#pragma BLENDER_REQUIRE(common_view_lib.glsl) -#pragma BLENDER_REQUIRE(common_math_lib.glsl) - -uniform sampler2D colorBuffer; -uniform sampler2D depthBuffer; - -uniform vec2 dofParams; -uniform bool unpremult; - -#define dof_mul dofParams.x /* distance * aperturesize * invsensorsize */ -#define dof_bias dofParams.y /* aperturesize * invsensorsize */ - -uniform vec4 bokehParams[2]; - -#define bokeh_rotation bokehParams[0].x -#define bokeh_ratio bokehParams[0].y -#define bokeh_maxsize bokehParams[0].z -#define bokeh_sides \ - bokehParams[1] /* Polygon Bokeh shape number of sides (with precomputed vars) */ - -uniform vec2 nearFar; /* Near & far view depths values */ - -/* -------------- Utils ------------- */ - -/* divide by sensor size to get the normalized size */ -#define calculate_coc(zdepth) (dof_mul / zdepth - dof_bias) - -#define linear_depth(z) \ - ((ProjectionMatrix[3][3] == 0.0) ? \ - (nearFar.x * nearFar.y) / (z * (nearFar.x - nearFar.y) + nearFar.y) : \ - z * (nearFar.y - nearFar.x) + nearFar.x) /* Only true for camera view! */ - -#define weighted_sum(a, b, c, d, e) \ - (a * e.x + b * e.y + c * e.z + d * e.w) / max(1e-6, dot(e, vec4(1.0))); - -vec4 safe_color(vec4 c) -{ - /* Clamp to avoid black square artifacts if a pixel goes NaN. */ - return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */ -} - -#define THRESHOLD 1.0 - -#ifdef STEP_DOWNSAMPLE - -layout(location = 0) out vec4 nearColor; -layout(location = 1) out vec4 farColor; -layout(location = 2) out vec2 cocData; - -/* Downsample the color buffer to half resolution. - * Weight color samples by - * Compute maximum CoC for near and far blur. */ -void main(void) -{ - ivec4 uvs = ivec4(gl_FragCoord.xyxy) * 2 + ivec4(0, 0, 1, 1); - - /* custom downsampling */ - vec4 color1 = safe_color(texelFetch(colorBuffer, uvs.xy, 0)); - vec4 color2 = safe_color(texelFetch(colorBuffer, uvs.zw, 0)); - vec4 color3 = safe_color(texelFetch(colorBuffer, uvs.zy, 0)); - vec4 color4 = safe_color(texelFetch(colorBuffer, uvs.xw, 0)); - - /* Leverage SIMD by combining 4 depth samples into a vec4 */ - vec4 depth; - depth.r = texelFetch(depthBuffer, uvs.xy, 0).r; - depth.g = texelFetch(depthBuffer, uvs.zw, 0).r; - depth.b = texelFetch(depthBuffer, uvs.zy, 0).r; - depth.a = texelFetch(depthBuffer, uvs.xw, 0).r; - - vec4 zdepth = linear_depth(depth); - - /* Compute signed CoC for each depth samples */ - vec4 coc_near = calculate_coc(zdepth); - vec4 coc_far = -coc_near; - - cocData.x = max(max_v4(coc_near), 0.0); - cocData.y = max(max_v4(coc_far), 0.0); - - /* now we need to write the near-far fields premultiplied by the coc - * also use bilateral weighting by each coc values to avoid bleeding. */ - vec4 near_weights = step(THRESHOLD, coc_near) * clamp(1.0 - abs(cocData.x - coc_near), 0.0, 1.0); - vec4 far_weights = step(THRESHOLD, coc_far) * clamp(1.0 - abs(cocData.y - coc_far), 0.0, 1.0); - -# ifdef USE_ALPHA_DOF - /* Premult */ - color1.rgb *= color1.a; - color2.rgb *= color2.a; - color3.rgb *= color3.a; - color4.rgb *= color4.a; -# endif - - /* now write output to weighted buffers. */ - nearColor = weighted_sum(color1, color2, color3, color4, near_weights); - farColor = weighted_sum(color1, color2, color3, color4, far_weights); -} - -#elif defined(STEP_SCATTER) - -flat in vec4 color; -flat in float weight; -flat in float smoothFac; -flat in ivec2 edge; -/* coordinate used for calculating radius */ -in vec2 particlecoord; - -layout(location = 0) out vec4 fragColor; -# ifdef USE_ALPHA_DOF -layout(location = 1) out float fragAlpha; -# endif - -/* accumulate color in the near/far blur buffers */ -void main(void) -{ - /* Discard to avoid bleeding onto the next layer */ - if (int(gl_FragCoord.x) * edge.x + edge.y > 0) { - discard; - } - - /* Circle Dof */ - float dist = length(particlecoord); - - /* Outside of bokeh shape */ - if (dist > 1.0) { - discard; - } - - /* Regular Polygon Dof */ - if (bokeh_sides.x > 0.0) { - /* Circle parametrization */ - float theta = atan(particlecoord.y, particlecoord.x) + bokeh_rotation; - - /* Optimized version of : - * float denom = theta - (M_2PI / bokeh_sides) * floor((bokeh_sides * theta + M_PI) / M_2PI); - * float r = cos(M_PI / bokeh_sides) / cos(denom); */ - float denom = theta - bokeh_sides.y * floor(bokeh_sides.z * theta + 0.5); - float r = bokeh_sides.w / cos(denom); - - /* Divide circle radial coord by the shape radius for angle theta. - * Giving us the new linear radius to the shape edge. */ - dist /= r; - - /* Outside of bokeh shape */ - if (dist > 1.0) { - discard; - } - } - - fragColor = color; - - /* Smooth the edges a bit. This effectively reduce the bokeh shape - * but does fade out the undersampling artifacts. */ - float shape = smoothstep(1.0, min(0.999, smoothFac), dist); - - fragColor *= shape; - -# ifdef USE_ALPHA_DOF - fragAlpha = fragColor.a; - fragColor.a = weight * shape; -# endif -} - -#elif defined(STEP_RESOLVE) - -# define MERGE_THRESHOLD 4.0 - -uniform sampler2D scatterBuffer; -uniform sampler2D scatterAlphaBuffer; - -in vec4 uvcoordsvar; -out vec4 fragColor; - -vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize) -{ - /* TODO FIXME: Clamp the sample position - * depending on the layer to avoid bleeding. - * This is not really noticeable so leaving it as is for now. */ - -# if 1 /* 9-tap bilinear upsampler (tent filter) */ - vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0); - - vec4 s; - s = textureLod(tex, uv - d.xy, 0.0); - s += textureLod(tex, uv - d.wy, 0.0) * 2; - s += textureLod(tex, uv - d.zy, 0.0); - - s += textureLod(tex, uv + d.zw, 0.0) * 2; - s += textureLod(tex, uv, 0.0) * 4; - s += textureLod(tex, uv + d.xw, 0.0) * 2; - - s += textureLod(tex, uv + d.zy, 0.0); - s += textureLod(tex, uv + d.wy, 0.0) * 2; - s += textureLod(tex, uv + d.xy, 0.0); - - return s * (1.0 / 16.0); -# else - /* 4-tap bilinear upsampler */ - vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * 0.5; - - vec4 s; - s = textureLod(tex, uv + d.xy, 0.0); - s += textureLod(tex, uv + d.zy, 0.0); - s += textureLod(tex, uv + d.xw, 0.0); - s += textureLod(tex, uv + d.zw, 0.0); - - return s * (1.0 / 4.0); -# endif -} - -/* Combine the Far and Near color buffers */ -void main(void) -{ - vec2 uv = uvcoordsvar.xy; - /* Recompute Near / Far CoC per pixel */ - float depth = textureLod(depthBuffer, uv, 0.0).r; - float zdepth = linear_depth(depth); - float coc_signed = calculate_coc(zdepth); - float coc_far = max(-coc_signed, 0.0); - float coc_near = max(coc_signed, 0.0); - - vec4 focus_col = textureLod(colorBuffer, uv, 0.0); - - vec2 texelSize = vec2(0.5, 1.0) / vec2(textureSize(scatterBuffer, 0)); - vec2 near_uv = uv * vec2(0.5, 1.0); - vec2 far_uv = near_uv + vec2(0.5, 0.0); - vec4 near_col = upsample_filter(scatterBuffer, near_uv, texelSize); - vec4 far_col = upsample_filter(scatterBuffer, far_uv, texelSize); - - float far_w = far_col.a; - float near_w = near_col.a; - float focus_w = 1.0 - smoothstep(1.0, MERGE_THRESHOLD, abs(coc_signed)); - float inv_weight_sum = 1.0 / (near_w + focus_w + far_w); - - focus_col *= focus_w; /* Premul */ - -# ifdef USE_ALPHA_DOF - near_col.a = upsample_filter(scatterAlphaBuffer, near_uv, texelSize).r; - far_col.a = upsample_filter(scatterAlphaBuffer, far_uv, texelSize).r; -# endif - - fragColor = (far_col + near_col + focus_col) * inv_weight_sum; - -# ifdef USE_ALPHA_DOF - /* Sigh... viewport expect premult output but - * the final render output needs to be with - * associated alpha. */ - if (unpremult) { - fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0; - } -# endif -} - -#endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl new file mode 100644 index 00000000000..79c95b6d433 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_gather_frag.glsl @@ -0,0 +1,293 @@ + +/** + * Gather pass: Convolve foreground and background parts in separate passes. + * + * Using the min&max CoC tile buffer, we select the best apropriate method to blur the scene color. + * A fast gather path is taken if there is not many CoC variation inside the tile. + * + * We sample using an octaweb sampling pattern. We randomize the kernel center and each ring + * rotation to ensure maximum coverage. + **/ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Mipmapped input buffers, halfres but with padding to ensure mipmap alignement. */ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Same input buffer but with a bilinear sampler object. */ +uniform sampler2D colorBufferBilinear; + +/* CoC Min&Max tile buffer at 1/16th of fullres. */ +uniform sampler2D cocTilesFgBuffer; +uniform sampler2D cocTilesBgBuffer; + +uniform sampler2D bokehLut; + +/* Used to correct the padding in the color and CoC buffers. */ +uniform vec2 gatherInputUvCorrection; + +uniform vec2 gatherOutputTexelSize; + +uniform vec2 bokehAnisotropy; + +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outWeight; +#ifndef DOF_HOLEFILL_PASS +layout(location = 2) out vec2 outOcclusion; +#else + +/* Dirty global variable that isn't used. So it should get optimized out. */ +vec2 outOcclusion; +#endif + +#ifdef DOF_FOREGROUND_PASS +const bool is_foreground = true; +#else /* DOF_BACKGROUND_PASS */ +const bool is_foreground = false; +#endif + +const float unit_ring_radius = 1.0 / float(gather_ring_count); +const float unit_sample_radius = 1.0 / float(gather_ring_count + 0.5); +const float large_kernel_radius = 0.5 + float(gather_ring_count); +const float smaller_kernel_radius = 0.5 + float(gather_ring_count - gather_density_change_ring); +/* NOTE(fclem) the bias is reducing issues with density change visible transition. */ +const float radius_downscale_factor = smaller_kernel_radius / large_kernel_radius; +const int change_density_at_ring = (gather_ring_count - gather_density_change_ring + 1); +const float coc_radius_error = 2.0; + +/* Radii needs to be halfres CoC sizes. */ +bool dof_do_density_change(float base_radius, float min_intersectable_radius) +{ + /* Reduce artifact for very large blur. */ + min_intersectable_radius *= 0.1; + + bool need_new_density = (base_radius * unit_ring_radius > min_intersectable_radius); + bool larger_than_min_density = (base_radius * radius_downscale_factor > + float(gather_ring_count)); + + return need_new_density && larger_than_min_density; +} + +void dof_gather_init(float base_radius, + vec4 noise, + out vec2 center_co, + out float lod, + out float intersection_multiplier) +{ + /* Jitter center half a ring to reduce undersampling. */ + vec2 jitter_ofs = 0.499 * noise.zw * sqrt(noise.x); +#ifdef DOF_BOKEH_TEXTURE + jitter_ofs *= bokehAnisotropy; +#endif + center_co = gl_FragCoord.xy + jitter_ofs * base_radius * unit_sample_radius; + + /* TODO(fclem) Seems like the default lod selection is too big. Bias to avoid blocky moving + * out of focus shapes. */ + const float lod_bias = -2.0; + lod = max(floor(log2(base_radius * unit_sample_radius) + 0.5) + lod_bias, 0.0); + + if (no_gather_mipmaps) { + lod = 0.0; + } + /* (Slide 64). */ + intersection_multiplier = pow(0.5, lod); +} + +void dof_gather_accumulator(float base_radius, + float min_intersectable_radius, + const bool do_fast_gather, + const bool do_density_change) +{ + vec4 noise = no_gather_random ? vec4(0.0, 0.0, 0.0, 1.0) : texelfetch_noise_tex(gl_FragCoord.xy); + + if (!do_fast_gather) { + /* Jitter the radius to reduce noticeable density changes. */ + base_radius += noise.x * unit_ring_radius * base_radius; + } + else { + /* Jittering the radius more than we need means we are going to feather the bokeh shape half + * a ring. So we need to compensate for fast gather that does not check CoC intersection. */ + base_radius += (0.5 - noise.x) * 1.5 * unit_ring_radius * base_radius; + } + /* TODO(fclem) another seed? For now Cranly-Partterson rotation with golden ratio. */ + noise.x = fract(noise.x + 0.61803398875); + + float lod, isect_mul; + vec2 center_co; + dof_gather_init(base_radius, noise, center_co, lod, isect_mul); + + bool first_ring = true; + + DofGatherData accum_data = GATHER_DATA_INIT; + + int density_change = 0; + for (int ring = gather_ring_count; ring > 0; ring--) { + int sample_pair_count = gather_ring_density * ring; + + float step_rot = M_PI / float(sample_pair_count); + mat2 step_rot_mat = rot2_from_angle(step_rot); + + float angle_offset = noise.y * step_rot; + vec2 offset = vec2(cos(angle_offset), sin(angle_offset)); + + float ring_radius = float(ring) * unit_sample_radius * base_radius; + + /* Slide 38. */ + float bordering_radius = ring_radius + + (0.5 + coc_radius_error) * base_radius * unit_sample_radius; + DofGatherData ring_data = GATHER_DATA_INIT; + for (int sample_pair = 0; sample_pair < sample_pair_count; sample_pair++) { + offset = step_rot_mat * offset; + + DofGatherData pair_data[2]; + for (int i = 0; i < 2; i++) { + vec2 offset_co = ((i == 0) ? offset : -offset); +#ifdef DOF_BOKEH_TEXTURE + /* Scaling to 0.25 for speed. Improves texture cache hit. */ + offset_co = texture(bokehLut, offset_co * 0.25 + 0.5).rg; + offset_co *= bokehAnisotropy; +#endif + vec2 sample_co = center_co + offset_co * ring_radius; + vec2 sample_uv = sample_co * gatherOutputTexelSize * gatherInputUvCorrection; + if (do_fast_gather) { + pair_data[i].color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod); + } + else { + pair_data[i].color = dof_load_gather_color(colorBuffer, sample_uv, lod); + } + pair_data[i].coc = dof_load_gather_coc(cocBuffer, sample_uv, lod); + pair_data[i].dist = ring_radius; + } + + dof_gather_accumulate_sample_pair(pair_data, + bordering_radius, + isect_mul, + first_ring, + do_fast_gather, + is_foreground, + ring_data, + accum_data); + } + +#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */ + /* TODO(fclem) this seems to not be completely correct as the issue remains. */ + float ring_area = (sqr(float(ring) + 0.5 + coc_radius_error) - + sqr(float(ring) - 0.5 + coc_radius_error)) * + sqr(base_radius * unit_sample_radius); + dof_gather_ammend_weight(ring_data, ring_area); +#endif + + dof_gather_accumulate_sample_ring( + ring_data, sample_pair_count * 2, first_ring, do_fast_gather, is_foreground, accum_data); + + first_ring = false; + + if (do_density_change && (ring == change_density_at_ring) && + (density_change < gather_max_density_change)) { + if (dof_do_density_change(base_radius, min_intersectable_radius)) { + base_radius *= radius_downscale_factor; + ring += gather_density_change_ring; + /* We need to account for the density change in the weights (slide 62). + * For that multiply old kernel data by its area divided by the new kernel area. */ + const float outer_rings_weight = 1.0 / (radius_downscale_factor * radius_downscale_factor); +#ifndef DOF_FOREGROUND_PASS /* Samples are already weighted per ring in foreground pass. */ + dof_gather_ammend_weight(accum_data, outer_rings_weight); +#endif + /* Re-init kernel position & sampling parameters. */ + dof_gather_init(base_radius, noise, center_co, lod, isect_mul); + density_change++; + } + } + } + + { + /* Center sample. */ + vec2 sample_uv = center_co * gatherOutputTexelSize * gatherInputUvCorrection; + DofGatherData center_data; + if (do_fast_gather) { + center_data.color = dof_load_gather_color(colorBufferBilinear, sample_uv, lod); + } + else { + center_data.color = dof_load_gather_color(colorBuffer, sample_uv, lod); + } + center_data.coc = dof_load_gather_coc(cocBuffer, sample_uv, lod); + center_data.dist = 0.0; + + /* Slide 38. */ + float bordering_radius = (0.5 + coc_radius_error) * base_radius * unit_sample_radius; + + dof_gather_accumulate_center_sample( + center_data, bordering_radius, do_fast_gather, is_foreground, accum_data); + } + + int total_sample_count = dof_gather_total_sample_count_with_density_change( + gather_ring_count, gather_ring_density, density_change); + dof_gather_accumulate_resolve(total_sample_count, accum_data, outColor, outWeight, outOcclusion); + +#if defined(DOF_DEBUG_GATHER_PERF) + if (density_change > 0) { + float fac = saturate(float(density_change) / float(10.0)); + outColor.rgb = avg(outColor.rgb) * neon_gradient(fac); + } + if (do_fast_gather) { + outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0); + } +#elif defined(DOF_DEBUG_SCATTER_PERF) + outColor.rgb = avg(outColor.rgb) * vec3(0.0, 1.0, 0.0); +#endif + + /* Output premultiplied color so we can use bilinear sampler in resolve pass. */ + outColor *= outWeight; +} + +void main() +{ + ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR / 2)); + CocTile coc_tile = dof_coc_tile_load(cocTilesFgBuffer, cocTilesBgBuffer, tile_co); + CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile); + +#if defined(DOF_FOREGROUND_PASS) + float base_radius = -coc_tile.fg_min_coc; + float min_radius = -coc_tile.fg_max_coc; + float min_intersectable_radius = -coc_tile.fg_max_intersectable_coc; + bool can_early_out = !prediction.do_foreground; + +#elif defined(DOF_HOLEFILL_PASS) + float base_radius = -coc_tile.fg_min_coc; + float min_radius = -coc_tile.fg_max_coc; + float min_intersectable_radius = DOF_TILE_LARGE_COC; + bool can_early_out = !prediction.do_holefill; + +#else /* DOF_BACKGROUND_PASS */ + float base_radius = coc_tile.bg_max_coc; + float min_radius = coc_tile.bg_min_coc; + float min_intersectable_radius = coc_tile.bg_min_intersectable_coc; + bool can_early_out = !prediction.do_background; +#endif + + bool do_fast_gather = dof_do_fast_gather(base_radius, min_radius, is_foreground); + + /* Gather at half resolution. Divide CoC by 2. */ + base_radius *= 0.5; + min_intersectable_radius *= 0.5; + + bool do_density_change = dof_do_density_change(base_radius, min_intersectable_radius); + + if (can_early_out) { + /* Early out. */ + outColor = vec4(0.0); + outWeight = 0.0; + outOcclusion = vec2(0.0, 0.0); + } + else if (do_fast_gather) { + dof_gather_accumulator(base_radius, min_intersectable_radius, true, false); + } + else if (do_density_change) { + dof_gather_accumulator(base_radius, min_intersectable_radius, false, true); + } + else { + dof_gather_accumulator(base_radius, min_intersectable_radius, false, false); + } +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl new file mode 100644 index 00000000000..88d83cd913a --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_lib.glsl @@ -0,0 +1,631 @@ + +#pragma BLENDER_REQUIRE(common_view_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_lib.glsl) + +uniform vec4 cocParams; + +#define cocMul cocParams[0] /* distance * aperturesize * invsensorsize */ +#define cocBias cocParams[1] /* aperturesize * invsensorsize */ +#define cocNear cocParams[2] /* Near view depths value. */ +#define cocFar cocParams[3] /* Far view depths value. */ + +/* -------------- Debug Defines ------------- */ + +// #define DOF_DEBUG_GATHER_PERF +// #define DOF_DEBUG_SCATTER_PERF + +const bool no_smooth_intersection = false; +const bool no_gather_occlusion = false; +const bool no_gather_mipmaps = false; +const bool no_gather_random = false; +const bool no_gather_filtering = false; +const bool no_scatter_occlusion = false; +const bool no_scatter_pass = false; +const bool no_foreground_pass = false; +const bool no_background_pass = false; +const bool no_slight_focus_pass = false; +const bool no_focus_pass = false; +const bool no_holefill_pass = false; + +/* -------------- Quality Defines ------------- */ + +#ifdef DOF_HOLEFILL_PASS +/* No need for very high density for holefill. */ +const int gather_ring_count = 3; +const int gather_ring_density = 3; +const int gather_max_density_change = 0; +const int gather_density_change_ring = 1; +#else +const int gather_ring_count = DOF_GATHER_RING_COUNT; +const int gather_ring_density = 3; +const int gather_max_density_change = 50; /* Dictates the maximum good quality blur. */ +const int gather_density_change_ring = 1; +#endif + +/* -------------- Utils ------------- */ + +const vec2 quad_offsets[4] = vec2[4]( + vec2(-0.5, 0.5), vec2(0.5, 0.5), vec2(0.5, -0.5), vec2(-0.5, -0.5)); + +/* Divide by sensor size to get the normalized size. */ +#define calculate_coc_persp(zdepth) (cocMul / zdepth - cocBias) +#define calculate_coc_ortho(zdepth) ((zdepth + cocMul / cocBias) * cocMul) +#define calculate_coc(z) \ + (ProjectionMatrix[3][3] == 0.0) ? calculate_coc_persp(z) : calculate_coc_ortho(z) + +/* Ortho conversion is only true for camera view! */ +#define linear_depth_persp(d) ((cocNear * cocFar) / (d * (cocNear - cocFar) + cocFar)) +#define linear_depth_ortho(d) (d * (cocNear - cocFar) + cocNear) + +#define linear_depth(d) \ + ((ProjectionMatrix[3][3] == 0.0) ? linear_depth_persp(d) : linear_depth_ortho(d)) + +#define dof_coc_from_zdepth(d) calculate_coc(linear_depth(d)) + +vec4 safe_color(vec4 c) +{ + /* Clamp to avoid black square artifacts if a pixel goes NaN. */ + return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */ +} + +float dof_hdr_color_weight(vec4 color) +{ + /* From UE4. Very fast "luma" weighting. */ + float luma = (color.g * 2.0) + (color.r + color.b); + /* TODO(fclem) Pass correct exposure. */ + const float exposure = 1.0; + return 1.0 / (luma * exposure + 4.0); +} + +float dof_coc_select(vec4 cocs) +{ + /* Select biggest coc. */ + float selected_coc = cocs.x; + if (abs(cocs.y) > abs(selected_coc)) { + selected_coc = cocs.y; + } + if (abs(cocs.z) > abs(selected_coc)) { + selected_coc = cocs.z; + } + if (abs(cocs.w) > abs(selected_coc)) { + selected_coc = cocs.w; + } + return selected_coc; +} + +/* NOTE: Do not forget to normalize weights afterwards. */ +vec4 dof_downsample_bilateral_coc_weights(vec4 cocs) +{ + float chosen_coc = dof_coc_select(cocs); + + const float scale = 4.0; /* TODO(fclem) revisit. */ + /* NOTE: The difference between the cocs should be inside a abs() function, + * but we follow UE4 implementation to improve how dithered transparency looks (see slide 19). */ + return saturate(1.0 - (chosen_coc - cocs) * scale); +} + +/* NOTE: Do not forget to normalize weights afterwards. */ +vec4 dof_downsample_bilateral_color_weights(vec4 colors[4]) +{ + vec4 weights; + for (int i = 0; i < 4; i++) { + weights[i] = dof_hdr_color_weight(colors[i]); + } + return weights; +} + +/* Makes sure the load functions distribute the energy correctly + * to both scatter and gather passes. */ +vec4 dof_load_gather_color(sampler2D gather_input_color_buffer, vec2 uv, float lod) +{ + vec4 color = textureLod(gather_input_color_buffer, uv, lod); + return color; +} + +vec4 dof_load_scatter_color(sampler2D scatter_input_color_buffer, vec2 uv, float lod) +{ + vec4 color = textureLod(scatter_input_color_buffer, uv, lod); + return color; +} + +float dof_load_gather_coc(sampler2D gather_input_coc_buffer, vec2 uv, float lod) +{ + float coc = textureLod(gather_input_coc_buffer, uv, lod).r; + /* We gather at halfres. CoC must be divided by 2 to be compared against radii. */ + return coc * 0.5; +} + +/* Distribute weights between near/slightfocus/far fields (slide 117). */ +const float layer_threshold = 4.0; +/* Make sure it overlaps. */ +const float layer_offset_fg = 0.5 + 1.0; +/* Extra offset for convolution layers to avoid light leaking from background. */ +const float layer_offset = 0.5 + 0.5; + +#define DOF_MAX_SLIGHT_FOCUS_RADIUS 5 + +float dof_layer_weight(float coc, const bool is_foreground) +{ +/* NOTE: These are fullres pixel CoC value. */ +#ifdef DOF_RESOLVE_PASS + return saturate(-abs(coc) + layer_threshold + layer_offset) * + float(is_foreground ? (coc <= 0.5) : (coc > -0.5)); +#else + coc *= 2.0; /* Account for half pixel gather. */ + float threshold = layer_threshold - ((is_foreground) ? layer_offset_fg : layer_offset); + return saturate(((is_foreground) ? -coc : coc) - threshold); +#endif +} +vec4 dof_layer_weight(vec4 coc) +{ + /* NOTE: Used for scatter pass which already flipped the sign correctly. */ + coc *= 2.0; /* Account for half pixel gather. */ + return saturate(coc - layer_threshold + layer_offset); +} + +/* NOTE: This is halfres CoC radius. */ +float dof_sample_weight(float coc) +{ + /* Full intensity if CoC radius is below the pixel footprint. */ + const float min_coc = 1.0; + coc = max(min_coc, abs(coc)); + return (M_PI * min_coc * min_coc) / (M_PI * coc * coc); +} +vec4 dof_sample_weight(vec4 coc) +{ + /* Full intensity if CoC radius is below the pixel footprint. */ + const float min_coc = 1.0; + coc = max(vec4(min_coc), abs(coc)); + return (M_PI * min_coc * min_coc) / (M_PI * coc * coc); +} + +/* Intersection with the center of the kernel. */ +float dof_intersection_weight(float coc, float distance_from_center, float intersection_multiplier) +{ + if (no_smooth_intersection) { + return step(0.0, (abs(coc) - distance_from_center)); + } + else { + /* (Slide 64). */ + return saturate((abs(coc) - distance_from_center) * intersection_multiplier + 0.5); + } +} + +/* Returns weight of the sample for the outer bucket (containing previous rings). */ +float dof_gather_accum_weight(float coc, float bordering_radius, bool first_ring) +{ + /* First ring has nothing to be mixed against. */ + if (first_ring) { + return 0.0; + } + return saturate(coc - bordering_radius); +} + +bool dof_do_fast_gather(float max_absolute_coc, float min_absolute_coc, const bool is_foreground) +{ + float min_weight = dof_layer_weight((is_foreground) ? -min_absolute_coc : min_absolute_coc, + is_foreground); + if (min_weight < 1.0) { + return false; + } + /* FIXME(fclem): This is a workaround to fast gather triggering too early. + * Since we use custom opacity mask, the opacity is not given to be 100% even for + * after normal threshold. */ + if (is_foreground && min_absolute_coc < layer_threshold) { + return false; + } + return (max_absolute_coc - min_absolute_coc) < (DOF_FAST_GATHER_COC_ERROR * max_absolute_coc); +} + +/* ------------------- COC TILES UTILS ------------------- */ + +struct CocTile { + float fg_min_coc; + float fg_max_coc; + float fg_max_intersectable_coc; + float fg_slight_focus_max_coc; + float bg_min_coc; + float bg_max_coc; + float bg_min_intersectable_coc; +}; + +struct CocTilePrediction { + bool do_foreground; + bool do_slight_focus; + bool do_focus; + bool do_background; + bool do_holefill; +}; + +/* WATCH: Might have to change depending on the texture format. */ +#define DOF_TILE_DEFOCUS 0.25 +#define DOF_TILE_FOCUS 0.0 +#define DOF_TILE_MIXED 0.75 +#define DOF_TILE_LARGE_COC 1024.0 + +/* Init a CoC tile for reduction algorithms. */ +CocTile dof_coc_tile_init(void) +{ + CocTile tile; + tile.fg_min_coc = 0.0; + tile.fg_max_coc = -DOF_TILE_LARGE_COC; + tile.fg_max_intersectable_coc = DOF_TILE_LARGE_COC; + tile.fg_slight_focus_max_coc = -1.0; + tile.bg_min_coc = DOF_TILE_LARGE_COC; + tile.bg_max_coc = 0.0; + tile.bg_min_intersectable_coc = DOF_TILE_LARGE_COC; + return tile; +} + +CocTile dof_coc_tile_load(sampler2D fg_buffer, sampler2D bg_buffer, ivec2 tile_co) +{ + ivec2 tex_size = textureSize(fg_buffer, 0).xy; + tile_co = clamp(tile_co, ivec2(0), tex_size - 1); + + vec4 fg = texelFetch(fg_buffer, tile_co, 0); + vec3 bg = texelFetch(bg_buffer, tile_co, 0).xyz; + + CocTile tile; + tile.fg_min_coc = -fg.x; + tile.fg_max_coc = -fg.y; + tile.fg_max_intersectable_coc = -fg.z; + tile.fg_slight_focus_max_coc = fg.w; + tile.bg_min_coc = bg.x; + tile.bg_max_coc = bg.y; + tile.bg_min_intersectable_coc = bg.z; + return tile; +} + +void dof_coc_tile_store(CocTile tile, out vec4 out_fg, out vec3 out_bg) +{ + out_fg.x = -tile.fg_min_coc; + out_fg.y = -tile.fg_max_coc; + out_fg.z = -tile.fg_max_intersectable_coc; + out_fg.w = tile.fg_slight_focus_max_coc; + out_bg.x = tile.bg_min_coc; + out_bg.y = tile.bg_max_coc; + out_bg.z = tile.bg_min_intersectable_coc; +} + +CocTilePrediction dof_coc_tile_prediction_get(CocTile tile) +{ + /* Based on tile value, predict what pass we need to load. */ + CocTilePrediction predict; + + predict.do_foreground = (-tile.fg_min_coc > layer_threshold - layer_offset_fg); + bool fg_fully_opaque = predict.do_foreground && + dof_do_fast_gather(-tile.fg_min_coc, -tile.fg_max_coc, true); + + predict.do_slight_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc >= 0.5); + predict.do_focus = !fg_fully_opaque && (tile.fg_slight_focus_max_coc == DOF_TILE_FOCUS); + + predict.do_background = !predict.do_focus && !fg_fully_opaque && + (tile.bg_max_coc > layer_threshold - layer_offset); + bool bg_fully_opaque = predict.do_background && + dof_do_fast_gather(-tile.bg_max_coc, tile.bg_min_coc, false); + predict.do_holefill = !predict.do_focus && !fg_fully_opaque && -tile.fg_max_coc > 0.0; + +#if 0 /* Debug */ + predict.do_foreground = predict.do_background = predict.do_holefill = true; +#endif + return predict; +} + +/* Special function to return the correct max value of 2 slight focus coc. */ +float dof_coc_max_slight_focus(float coc1, float coc2) +{ + /* Do not consider values below 0.5 for expansion as they are "encoded". + * See setup pass shader for more infos. */ + if ((coc1 == DOF_TILE_DEFOCUS && coc2 == DOF_TILE_FOCUS) || + (coc1 == DOF_TILE_FOCUS && coc2 == DOF_TILE_DEFOCUS)) { + /* Tile where completely out of focus and in focus are both present. + * Consider as very slightly out of focus. */ + return DOF_TILE_MIXED; + } + return max(coc1, coc2); +} + +/* ------------------- GATHER UTILS ------------------- */ + +struct DofGatherData { + vec4 color; + float weight; + float dist; /* TODO remove */ + /* For scatter occlusion. */ + float coc; + float coc_sqr; + /* For ring bucket merging. */ + float transparency; + + float layer_opacity; +}; + +#define GATHER_DATA_INIT DofGatherData(vec4(0.0), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) + +void dof_gather_ammend_weight(inout DofGatherData sample_data, float weight) +{ + sample_data.color *= weight; + sample_data.coc *= weight; + sample_data.coc_sqr *= weight; + sample_data.weight *= weight; +} + +void dof_gather_accumulate_sample(DofGatherData sample_data, + float weight, + inout DofGatherData accum_data) +{ + accum_data.color += sample_data.color * weight; + accum_data.coc += sample_data.coc * weight; + accum_data.coc_sqr += sample_data.coc * (sample_data.coc * weight); + accum_data.weight += weight; +} + +void dof_gather_accumulate_sample_pair(DofGatherData pair_data[2], + float bordering_radius, + float intersection_multiplier, + bool first_ring, + const bool do_fast_gather, + const bool is_foreground, + inout DofGatherData ring_data, + inout DofGatherData accum_data) +{ + if (do_fast_gather) { + for (int i = 0; i < 2; i++) { + dof_gather_accumulate_sample(pair_data[i], 1.0, accum_data); + accum_data.layer_opacity += 1.0; + } + return; + } + +#if 0 + const float mirroring_threshold = -layer_threshold - layer_offset; + /* TODO(fclem) Promote to parameter? dither with Noise? */ + const float mirroring_min_distance = 15.0; + if (pair_data[0].coc < mirroring_threshold && + (pair_data[1].coc - mirroring_min_distance) > pair_data[0].coc) { + pair_data[1].coc = pair_data[0].coc; + } + else if (pair_data[1].coc < mirroring_threshold && + (pair_data[0].coc - mirroring_min_distance) > pair_data[1].coc) { + pair_data[0].coc = pair_data[1].coc; + } +#endif + + for (int i = 0; i < 2; i++) { + float sample_weight = dof_sample_weight(pair_data[i].coc); + float layer_weight = dof_layer_weight(pair_data[i].coc, is_foreground); + float inter_weight = dof_intersection_weight( + pair_data[i].coc, pair_data[i].dist, intersection_multiplier); + float weight = inter_weight * layer_weight * sample_weight; + + /** + * If a CoC is larger than bordering radius we accumulate it to the general accumulator. + * If not, we accumulate to the ring bucket. This is to have more consistent sample occlusion. + **/ + float accum_weight = dof_gather_accum_weight(pair_data[i].coc, bordering_radius, first_ring); + dof_gather_accumulate_sample(pair_data[i], weight * accum_weight, accum_data); + dof_gather_accumulate_sample(pair_data[i], weight * (1.0 - accum_weight), ring_data); + + accum_data.layer_opacity += layer_weight; + + if (is_foreground) { + ring_data.transparency += 1.0 - inter_weight * layer_weight; + } + else { + float coc = is_foreground ? -pair_data[i].coc : pair_data[i].coc; + ring_data.transparency += saturate(coc - bordering_radius); + } + } +} + +void dof_gather_accumulate_sample_ring(DofGatherData ring_data, + int sample_count, + bool first_ring, + const bool do_fast_gather, + /* accum_data occludes the ring_data if true. */ + const bool reversed_occlusion, + inout DofGatherData accum_data) +{ + if (do_fast_gather) { + /* Do nothing as ring_data contains nothing. All samples are already in accum_data. */ + return; + } + + if (first_ring) { + /* Layer opacity is directly accumulated into accum_data data. */ + accum_data.color = ring_data.color; + accum_data.coc = ring_data.coc; + accum_data.coc_sqr = ring_data.coc_sqr; + accum_data.weight = ring_data.weight; + + accum_data.transparency = ring_data.transparency / float(sample_count); + return; + } + + if (ring_data.weight == 0.0) { + return; + } + + float ring_avg_coc = ring_data.coc / ring_data.weight; + float accum_avg_coc = accum_data.coc / accum_data.weight; + + /* Smooth test to set opacity to see if the ring average coc occludes the accumulation. + * Test is reversed to be multiplied against opacity. */ + float ring_occlu = saturate(accum_avg_coc - ring_avg_coc); + /* The bias here is arbitrary. Seems to avoid weird looking foreground in most cases. + * We might need to make it a parameter or find a relative bias. */ + float accum_occlu = saturate((ring_avg_coc - accum_avg_coc) * 0.1 - 1.0); + +#ifdef DOF_RESOLVE_PASS + ring_occlu = accum_occlu = 0.0; +#endif + + if (no_gather_occlusion) { + ring_occlu = 0.0; + accum_occlu = 0.0; + } + + /* (Slide 40) */ + float ring_opacity = saturate(1.0 - ring_data.transparency / float(sample_count)); + float accum_opacity = 1.0 - accum_data.transparency; + + if (reversed_occlusion) { + /* Accum_data occludes the ring. */ + float alpha = (accum_data.weight == 0.0) ? 0.0 : accum_opacity * accum_occlu; + float one_minus_alpha = 1.0 - alpha; + + accum_data.color += ring_data.color * one_minus_alpha; + accum_data.coc += ring_data.coc * one_minus_alpha; + accum_data.coc_sqr += ring_data.coc_sqr * one_minus_alpha; + accum_data.weight += ring_data.weight * one_minus_alpha; + + accum_data.transparency *= 1.0 - ring_opacity; + } + else { + /* Ring occludes the accum_data (Same as reference). */ + float alpha = (accum_data.weight == 0.0) ? 1.0 : (ring_opacity * ring_occlu); + float one_minus_alpha = 1.0 - alpha; + + accum_data.color = accum_data.color * one_minus_alpha + ring_data.color; + accum_data.coc = accum_data.coc * one_minus_alpha + ring_data.coc; + accum_data.coc_sqr = accum_data.coc_sqr * one_minus_alpha + ring_data.coc_sqr; + accum_data.weight = accum_data.weight * one_minus_alpha + ring_data.weight; + } +} + +/* FIXME(fclem) Seems to be wrong since it needs ringcount+1 as input for slightfocus gather. */ +int dof_gather_total_sample_count(const int ring_count, const int ring_density) +{ + return (ring_count * ring_count - ring_count) * ring_density + 1; +} + +void dof_gather_accumulate_center_sample(DofGatherData center_data, + float bordering_radius, +#ifdef DOF_RESOLVE_PASS + int i_radius, +#endif + const bool do_fast_gather, + const bool is_foreground, + inout DofGatherData accum_data) +{ + float layer_weight = dof_layer_weight(center_data.coc, is_foreground); + float sample_weight = dof_sample_weight(center_data.coc); + float weight = layer_weight * sample_weight; + float accum_weight = dof_gather_accum_weight(center_data.coc, bordering_radius, false); + + if (do_fast_gather) { + /* Hope for the compiler to optimize the above. */ + layer_weight = 1.0; + sample_weight = 1.0; + accum_weight = 1.0; + weight = 1.0; + } + + center_data.transparency = 1.0 - weight; + + dof_gather_accumulate_sample(center_data, weight * accum_weight, accum_data); + + if (!do_fast_gather) { +#ifdef DOF_RESOLVE_PASS + /* NOTE(fclem): Hack to smooth transition to full in-focus opacity. */ + int total_sample_count = dof_gather_total_sample_count(i_radius + 1, DOF_SLIGHT_FOCUS_DENSITY); + float fac = saturate(1.0 - abs(center_data.coc) / float(layer_threshold)); + accum_data.layer_opacity += float(total_sample_count) * fac * fac; +#endif + accum_data.layer_opacity += layer_weight; + + /* Logic of dof_gather_accumulate_sample(). */ + weight *= (1.0 - accum_weight); + center_data.coc_sqr = center_data.coc * (center_data.coc * weight); + center_data.color *= weight; + center_data.coc *= weight; + center_data.weight = weight; + +#ifdef DOF_FOREGROUND_PASS /* Reduce issue with closer foreground over distant foreground. */ + float ring_area = sqr(bordering_radius); + dof_gather_ammend_weight(center_data, ring_area); +#endif + + /* Accumulate center as its own ring. */ + dof_gather_accumulate_sample_ring( + center_data, 1, false, do_fast_gather, is_foreground, accum_data); + } +} + +int dof_gather_total_sample_count_with_density_change(const int ring_count, + const int ring_density, + int density_change) +{ + int sample_count_per_density_change = dof_gather_total_sample_count(ring_count, ring_density) - + dof_gather_total_sample_count( + ring_count - gather_density_change_ring, ring_density); + + return dof_gather_total_sample_count(ring_count, ring_density) + + sample_count_per_density_change * density_change; +} + +void dof_gather_accumulate_resolve(int total_sample_count, + DofGatherData accum_data, + out vec4 out_col, + out float out_weight, + out vec2 out_occlusion) +{ + float weight_inv = safe_rcp(accum_data.weight); + out_col = accum_data.color * weight_inv; + out_occlusion = vec2(abs(accum_data.coc), accum_data.coc_sqr) * weight_inv; + +#ifdef DOF_FOREGROUND_PASS + out_weight = 1.0 - accum_data.transparency; +#else + if (accum_data.weight > 0.0) { + out_weight = accum_data.layer_opacity / float(total_sample_count); + } + else { + out_weight = 0.0; + } +#endif + /* Gathering may not accumulate to 1.0 alpha because of float precision. */ + if (out_weight > 0.99) { + out_weight = 1.0; + } + else if (out_weight < 0.01) { + out_weight = 0.0; + } + /* Same thing for alpha channel. */ + if (out_col.a > 0.99) { + out_col.a = 1.0; + } + else if (out_col.a < 0.01) { + out_col.a = 0.0; + } +} + +ivec2 dof_square_ring_sample_offset(int ring_distance, int sample_id) +{ + /** + * Generate samples in a square pattern with the ring radius. X is the center tile. + * + * Dist1 Dist2 + * 6 5 4 3 2 + * 3 2 1 7 1 + * . X 0 . X 0 + * . . . . . + * . . . . . + * + * Samples are expected to be mirrored to complete the pattern. + **/ + ivec2 offset; + if (sample_id < ring_distance) { + offset.x = ring_distance; + offset.y = sample_id; + } + else if (sample_id < ring_distance * 3) { + offset.x = ring_distance - sample_id + ring_distance; + offset.y = ring_distance; + } + else { + offset.x = -ring_distance; + offset.y = ring_distance - sample_id + 3 * ring_distance; + } + return offset; +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl new file mode 100644 index 00000000000..51a139ad343 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_reduce_frag.glsl @@ -0,0 +1,179 @@ + +/** + * Reduce pass: Downsample the color buffer to generate mipmaps. + * Also decide if a pixel is to be convolved by scattering or gathering during the first pass. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/** Inputs: + * COPY_PASS: Is output of setup pass (halfres) and downsample pass (quarter res). + * REDUCE_PASS: Is previous Gather input miplvl (halfres >> miplvl). + **/ +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; +uniform sampler2D downsampledBuffer; + +uniform vec2 bokehAnisotropy; +uniform float scatterColorThreshold; +uniform float scatterCocThreshold; +uniform float scatterColorNeighborMax; +uniform float colorNeighborClamping; + +/** Outputs: + * COPY_PASS: Gather input mip0. + * REDUCE_PASS: Is next Gather input miplvl (halfres >> miplvl). + **/ +layout(location = 0) out vec4 outColor; +layout(location = 1) out float outCoc; + +#ifdef COPY_PASS + +layout(location = 2) out vec3 outScatterColor; + +/* NOTE: Do not compare alpha as it is not scattered by the scatter pass. */ +float dof_scatter_neighborhood_rejection(vec3 color) +{ + color = min(vec3(scatterColorNeighborMax), color); + + float validity = 0.0; + + /* Centered in the middle of 4 quarter res texel. */ + vec2 texel_size = 1.0 / vec2(textureSize(downsampledBuffer, 0).xy); + vec2 uv = (gl_FragCoord.xy * 0.5) * texel_size; + + vec3 max_diff = vec3(0.0); + for (int i = 0; i < 4; i++) { + vec2 sample_uv = uv + quad_offsets[i] * texel_size; + vec3 ref = textureLod(downsampledBuffer, sample_uv, 0.0).rgb; + + ref = min(vec3(scatterColorNeighborMax), ref); + float diff = max_v3(max(vec3(0.0), abs(ref - color))); + + const float rejection_threshold = 0.7; + diff = saturate(diff / rejection_threshold - 1.0); + validity = max(validity, diff); + } + + return validity; +} + +/* This avoids sprite popping in and out at the screen border and + * drawing sprites larger than the screen. */ +float dof_scatter_screen_border_rejection(float coc, vec2 uv, vec2 screen_size) +{ + vec2 screen_pos = uv * screen_size; + float min_screen_border_distance = min_v2(min(screen_pos, screen_size - screen_pos)); + /* Fullres to halfres CoC. */ + coc *= 0.5; + /* Allow 10px transition. */ + const float rejection_hardeness = 1.0 / 10.0; + return saturate((min_screen_border_distance - abs(coc)) * rejection_hardeness + 1.0); +} + +float dof_scatter_luminosity_rejection(vec3 color) +{ + const float rejection_hardness = 1.0; + return saturate(max_v3(color - scatterColorThreshold) * rejection_hardness); +} + +float dof_scatter_coc_radius_rejection(float coc) +{ + const float rejection_hardness = 0.3; + return saturate((abs(coc) - scatterCocThreshold) * rejection_hardness); +} + +float fast_luma(vec3 color) +{ + return (2.0 * color.g) + color.r + color.b; +} + +/* Lightweight version of neighborhood clamping found in TAA. */ +vec3 dof_neighborhood_clamping(vec3 color) +{ + vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0)); + vec2 uv = gl_FragCoord.xy * texel_size; + vec4 ofs = vec4(-1, 1, -1, 1) * texel_size.xxyy; + + /* Luma clamping. 3x3 square neighborhood. */ + float c00 = fast_luma(textureLod(colorBuffer, uv + ofs.xz, 0.0).rgb); + float c01 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(1.0, 0.0), 0.0).rgb); + float c02 = fast_luma(textureLod(colorBuffer, uv + ofs.xw, 0.0).rgb); + + float c10 = fast_luma(textureLod(colorBuffer, uv + ofs.xz * vec2(0.0, 1.0), 0.0).rgb); + float c11 = fast_luma(color); + float c12 = fast_luma(textureLod(colorBuffer, uv + ofs.xw * vec2(0.0, 1.0), 0.0).rgb); + + float c20 = fast_luma(textureLod(colorBuffer, uv + ofs.yz, 0.0).rgb); + float c21 = fast_luma(textureLod(colorBuffer, uv + ofs.yz * vec2(1.0, 0.0), 0.0).rgb); + float c22 = fast_luma(textureLod(colorBuffer, uv + ofs.yw, 0.0).rgb); + + float avg_luma = avg8(c00, c01, c02, c10, c12, c20, c21, c22); + float max_luma = max8(c00, c01, c02, c10, c12, c20, c21, c22); + + float upper_bound = mix(max_luma, avg_luma, colorNeighborClamping); + upper_bound = mix(c11, upper_bound, colorNeighborClamping); + + float clamped_luma = min(upper_bound, c11); + + return color * clamped_luma * safe_rcp(c11); +} + +/* Simple copy pass where we select what pixels to scatter. Also the resolution might change. + * NOTE: The texture can end up being too big because of the mipmap padding. We correct for + * that during the convolution phase. */ +void main() +{ + vec2 halfres = vec2(textureSize(colorBuffer, 0).xy); + vec2 uv = gl_FragCoord.xy / halfres; + + outColor = textureLod(colorBuffer, uv, 0.0); + outCoc = textureLod(cocBuffer, uv, 0.0).r; + + outColor.rgb = dof_neighborhood_clamping(outColor.rgb); + + /* Only scatter if luminous enough. */ + float do_scatter = dof_scatter_luminosity_rejection(outColor.rgb); + /* Only scatter if CoC is big enough. */ + do_scatter *= dof_scatter_coc_radius_rejection(outCoc); + /* Only scatter if CoC is not too big to avoid performance issues. */ + do_scatter *= dof_scatter_screen_border_rejection(outCoc, uv, halfres); + /* Only scatter if neighborhood is different enough. */ + do_scatter *= dof_scatter_neighborhood_rejection(outColor.rgb); + /* For debuging. */ + do_scatter *= float(!no_scatter_pass); + + outScatterColor = mix(vec3(0.0), outColor.rgb, do_scatter); + outColor.rgb = mix(outColor.rgb, vec3(0.0), do_scatter); + + /* Apply energy conservation to anamorphic scattered bokeh. */ + outScatterColor /= min_v2(bokehAnisotropy); +} + +#else /* REDUCE_PASS */ + +/* Downsample pass done for each mip starting from mip1. */ +void main() +{ + vec2 input_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 pixels of the previous mip. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * input_texel_size; + + vec4 colors[4]; + vec4 cocs; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size; + colors[i] = dof_load_gather_color(colorBuffer, sample_uv, 0.0); + cocs[i] = textureLod(cocBuffer, sample_uv, 0.0).r; + } + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + weights *= dof_downsample_bilateral_color_weights(colors); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); + outCoc = dot(cocs, weights); +} + +#endif diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl new file mode 100644 index 00000000000..469745206e2 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl @@ -0,0 +1,212 @@ + +/** + * Recombine Pass: Load separate convolution layer and composite with self slight defocus + * convolution and in-focus fields. + * + * The halfres gather methods are fast but lack precision for small CoC areas. To fix this we + * do a bruteforce gather to have a smooth transition between in-focus and defocus regions. + */ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D fullResColorBuffer; +uniform sampler2D fullResDepthBuffer; + +uniform sampler2D bgColorBuffer; +uniform sampler2D bgWeightBuffer; +uniform sampler2D bgTileBuffer; + +uniform sampler2D fgColorBuffer; +uniform sampler2D fgWeightBuffer; +uniform sampler2D fgTileBuffer; + +uniform sampler2D holefillColorBuffer; +uniform sampler2D holefillWeightBuffer; + +uniform sampler2D bokehLut; + +uniform float bokehMaxSize; + +in vec4 uvcoordsvar; + +out vec4 fragColor; + +void dof_slight_focus_gather(float radius, out vec4 out_color, out float out_weight) +{ + /* offset coord to avoid correlation with sampling pattern. */ + vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy + 7.0); + + DofGatherData fg_accum = GATHER_DATA_INIT; + DofGatherData bg_accum = GATHER_DATA_INIT; + + int i_radius = clamp(int(radius), 0, int(layer_threshold)); + const int resolve_ring_density = DOF_SLIGHT_FOCUS_DENSITY; + ivec2 texel = ivec2(gl_FragCoord.xy); + + bool first_ring = true; + + for (int ring = i_radius; ring > 0; ring--) { + DofGatherData fg_ring = GATHER_DATA_INIT; + DofGatherData bg_ring = GATHER_DATA_INIT; + + int ring_distance = ring; + int ring_sample_count = resolve_ring_density * ring_distance; + for (int sample_id = 0; sample_id < ring_sample_count; sample_id++) { + int s = sample_id * (4 / resolve_ring_density) + + int(noise.y * float((4 - resolve_ring_density) * ring_distance)); + + ivec2 offset = dof_square_ring_sample_offset(ring_distance, s); + float ring_dist = length(vec2(offset)); + + DofGatherData pair_data[2]; + for (int i = 0; i < 2; i++) { + ivec2 sample_offset = ((i == 0) ? offset : -offset); + ivec2 sample_texel = texel + sample_offset; + /* OPTI: could precompute the factor. */ + vec2 sample_uv = (vec2(sample_texel) + 0.5) / vec2(textureSize(fullResDepthBuffer, 0)); + float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r; + pair_data[i].color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0)); + pair_data[i].coc = dof_coc_from_zdepth(depth); + pair_data[i].dist = ring_dist; +#ifdef DOF_BOKEH_TEXTURE + /* Contains subpixel distance to bokeh shape. */ + pair_data[i].dist = texelFetch(bokehLut, sample_offset + DOF_MAX_SLIGHT_FOCUS_RADIUS, 0).r; +#endif + pair_data[i].coc = clamp(pair_data[i].coc, -bokehMaxSize, bokehMaxSize); + } + + float bordering_radius = ring_dist + 0.5; + const float isect_mul = 1.0; + dof_gather_accumulate_sample_pair( + pair_data, bordering_radius, isect_mul, first_ring, false, false, bg_ring, bg_accum); + +#ifdef DOF_BOKEH_TEXTURE + /* Swap distances in order to flip bokeh shape for foreground. */ + float tmp = pair_data[0].dist; + pair_data[0].dist = pair_data[1].dist; + pair_data[1].dist = tmp; +#endif + dof_gather_accumulate_sample_pair( + pair_data, bordering_radius, isect_mul, first_ring, false, true, fg_ring, fg_accum); + } + + dof_gather_accumulate_sample_ring( + bg_ring, ring_sample_count * 2, first_ring, false, false, bg_accum); + dof_gather_accumulate_sample_ring( + fg_ring, ring_sample_count * 2, first_ring, false, true, fg_accum); + + first_ring = false; + } + + /* Center sample. */ + vec2 sample_uv = uvcoordsvar.xy; + float depth = textureLod(fullResDepthBuffer, sample_uv, 0.0).r; + DofGatherData center_data; + center_data.color = safe_color(textureLod(fullResColorBuffer, sample_uv, 0.0)); + center_data.coc = dof_coc_from_zdepth(depth); + center_data.coc = clamp(center_data.coc, -bokehMaxSize, bokehMaxSize); + center_data.dist = 0.0; + + /* Slide 38. */ + float bordering_radius = 0.5; + + dof_gather_accumulate_center_sample( + center_data, bordering_radius, i_radius, false, true, fg_accum); + dof_gather_accumulate_center_sample( + center_data, bordering_radius, i_radius, false, false, bg_accum); + + vec4 bg_col, fg_col; + float bg_weight, fg_weight; + vec2 unused_occlusion; + + int total_sample_count = dof_gather_total_sample_count(i_radius + 1, resolve_ring_density); + dof_gather_accumulate_resolve(total_sample_count, bg_accum, bg_col, bg_weight, unused_occlusion); + dof_gather_accumulate_resolve(total_sample_count, fg_accum, fg_col, fg_weight, unused_occlusion); + + /* Fix weighting issues on perfectly focus > slight focus transitionning areas. */ + if (abs(center_data.coc) < 0.5) { + bg_col = center_data.color; + bg_weight = 1.0; + } + + /* Alpha Over */ + float alpha = 1.0 - fg_weight; + out_weight = bg_weight * alpha + fg_weight; + out_color = bg_col * bg_weight * alpha + fg_col * fg_weight; +} + +void dof_resolve_load_layer(sampler2D color_tex, + sampler2D weight_tex, + out vec4 out_color, + out float out_weight) +{ + vec2 pixel_co = gl_FragCoord.xy / 2.0; + vec2 uv = pixel_co / textureSize(color_tex, 0).xy; + out_color = textureLod(color_tex, uv, 0.0); + out_weight = textureLod(weight_tex, uv, 0.0).r; +} + +void main(void) +{ + ivec2 tile_co = ivec2(gl_FragCoord.xy / float(DOF_TILE_DIVISOR)); + CocTile coc_tile = dof_coc_tile_load(fgTileBuffer, bgTileBuffer, tile_co); + CocTilePrediction prediction = dof_coc_tile_prediction_get(coc_tile); + + fragColor = vec4(0.0); + float weight = 0.0; + + vec4 layer_color; + float layer_weight; + + if (!no_holefill_pass && prediction.do_holefill) { + dof_resolve_load_layer(holefillColorBuffer, holefillWeightBuffer, layer_color, layer_weight); + fragColor = layer_color * safe_rcp(layer_weight); + weight = float(layer_weight > 0.0); + } + + if (!no_background_pass && prediction.do_background) { + dof_resolve_load_layer(bgColorBuffer, bgWeightBuffer, layer_color, layer_weight); + /* Always prefer background to holefill pass. */ + layer_color *= safe_rcp(layer_weight); + layer_weight = float(layer_weight > 0.0); + /* Composite background. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + /* Fill holes with the composited background. */ + fragColor *= safe_rcp(weight); + weight = float(weight > 0.0); + } + + if (!no_slight_focus_pass && prediction.do_slight_focus) { + dof_slight_focus_gather(coc_tile.fg_slight_focus_max_coc, layer_color, layer_weight); + /* Composite slight defocus. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + } + + if (!no_focus_pass && prediction.do_focus) { + layer_color = safe_color(textureLod(fullResColorBuffer, uvcoordsvar.xy, 0.0)); + layer_weight = 1.0; + /* Composite in focus. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + weight = weight * (1.0 - layer_weight) + layer_weight; + } + + if (!no_foreground_pass && prediction.do_foreground) { + dof_resolve_load_layer(fgColorBuffer, fgWeightBuffer, layer_color, layer_weight); + /* Composite foreground. */ + fragColor = fragColor * (1.0 - layer_weight) + layer_color; + } + + /* Fix float precision issue in alpha compositing. */ + if (fragColor.a > 0.99) { + fragColor.a = 1.0; + } + +#if 0 /* Debug */ + if (coc_tile.fg_slight_focus_max_coc >= 0.5) { + fragColor.rgb *= vec3(1.0, 0.1, 0.1); + } +#endif +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl new file mode 100644 index 00000000000..704bbf6d999 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl @@ -0,0 +1,85 @@ + +/** + * Scatter pass: Use sprites to scatter the color of very bright pixel to have higher quality blur. + * + * We only scatter one triangle per sprite and one sprite per 4 pixels to reduce vertex shader + * invocations and overdraw. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform sampler2D occlusionBuffer; +uniform sampler2D bokehLut; + +uniform vec2 bokehAnisotropyInv; + +flat in vec4 color1; +flat in vec4 color2; +flat in vec4 color3; +flat in vec4 color4; +flat in vec4 weights; +flat in vec4 cocs; +flat in vec2 spritepos; +flat in float spritesize; /* MaxCoC */ + +layout(location = 0) out vec4 fragColor; + +float bokeh_shape(vec2 center) +{ + vec2 co = gl_FragCoord.xy - center; + +#ifdef DOF_BOKEH_TEXTURE + co *= bokehAnisotropyInv; + float texture_size = float(textureSize(bokehLut, 0).x); + /* Bias scale to avoid sampling at the texture's border. */ + float scale_fac = spritesize * (float(DOF_BOKEH_LUT_SIZE) / float(DOF_BOKEH_LUT_SIZE - 1)); + float dist = scale_fac * textureLod(bokehLut, (co / scale_fac) * 0.5 + 0.5, 0.0).r; +#else + float dist = length(co); +#endif + + return dist; +} + +#define linearstep(p0, p1, v) (clamp(((v) - (p0)) / abs((p1) - (p0)), 0.0, 1.0)) + +void main(void) +{ + vec4 shapes; + for (int i = 0; i < 4; i++) { + shapes[i] = bokeh_shape(spritepos + quad_offsets[i]); + } + /* Becomes signed distance field in pixel units. */ + shapes -= cocs; + /* Smooth the edges a bit to fade out the undersampling artifacts. */ + shapes = 1.0 - linearstep(-0.8, 0.8, shapes); + /* Outside of bokeh shape. Try to avoid overloading ROPs. */ + if (max_v4(shapes) == 0.0) { + discard; + } + + if (!no_scatter_occlusion) { + /* Works because target is the same size as occlusionBuffer. */ + vec2 uv = gl_FragCoord.xy / vec2(textureSize(occlusionBuffer, 0).xy); + vec2 occlusion_data = texture(occlusionBuffer, uv).rg; + /* Fix tilling artifacts. (Slide 90) */ + const float correction_fac = 1.0 - DOF_FAST_GATHER_COC_ERROR; + /* Occlude the sprite with geometry from the same field + * using a VSM like chebychev test (slide 85). */ + float mean = occlusion_data.x; + float variance = occlusion_data.x; + shapes *= variance * safe_rcp(variance + sqr(max(cocs * correction_fac - mean, 0.0))); + } + + fragColor = color1 * shapes.x; + fragColor += color2 * shapes.y; + fragColor += color3 * shapes.z; + fragColor += color4 * shapes.w; + + /* Do not accumulate alpha. This has already been accumulated by the gather pass. */ + fragColor.a = 0.0; + +#ifdef DOF_DEBUG_SCATTER_PERF + fragColor.rgb = avg(fragColor.rgb) * vec3(1.0, 0.0, 0.0); +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl new file mode 100644 index 00000000000..276ab119fab --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl @@ -0,0 +1,138 @@ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +uniform vec2 targetTexelSize; +uniform int spritePerRow; +uniform vec2 bokehAnisotropy; + +uniform sampler2D colorBuffer; +uniform sampler2D cocBuffer; + +/* Scatter pass, calculate a triangle covering the CoC. + * We render to a half resolution target with double width so we can + * separate near and far fields. We also generate only one triangle per group of 4 pixels + * to limit overdraw. */ + +flat out vec4 color1; +flat out vec4 color2; +flat out vec4 color3; +flat out vec4 color4; +flat out vec4 weights; +flat out vec4 cocs; +flat out vec2 spritepos; +flat out float spritesize; + +/* Load 4 Circle of confusion values. texel_co is centered around the 4 taps. */ +vec4 fetch_cocs(vec2 texel_co) +{ + /* TODO(fclem) The textureGather(sampler, co, comp) variant isn't here on some implementations.*/ +#if 0 // GPU_ARB_texture_gather + vec2 uvs = texel_co / vec2(textureSize(cocBuffer, 0)); + /* Reminder: Samples order is CW starting from top left. */ + cocs = textureGather(cocBuffer, uvs, isForegroundPass ? 0 : 1); +#else + ivec2 texel = ivec2(texel_co - 0.5); + vec4 cocs; + cocs.x = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 1)).r; + cocs.y = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 1)).r; + cocs.z = texelFetchOffset(cocBuffer, texel, 0, ivec2(1, 0)).r; + cocs.w = texelFetchOffset(cocBuffer, texel, 0, ivec2(0, 0)).r; +#endif + +#ifdef DOF_FOREGROUND_PASS + cocs *= -1.0; +#endif + + cocs = max(vec4(0.0), cocs); + /* We are scattering at half resolution, so divide CoC by 2. */ + return cocs * 0.5; +} + +void vertex_discard() +{ + /* Don't produce any fragments */ + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); +} + +void main() +{ + ivec2 tex_size = textureSize(cocBuffer, 0); + + int t_id = gl_VertexID / 3; /* Triangle Id */ + + /* Some math to get the target pixel. */ + ivec2 texelco = ivec2(t_id % spritePerRow, t_id / spritePerRow) * 2; + + /* Center sprite around the 4 texture taps. */ + spritepos = vec2(texelco) + 1.0; + + cocs = fetch_cocs(spritepos); + + /* Early out from local CoC radius. */ + if (all(lessThan(cocs, vec4(0.5)))) { + vertex_discard(); + return; + } + + vec2 input_texel_size = 1.0 / vec2(tex_size); + vec2 quad_center = spritepos * input_texel_size; + vec4 colors[4]; + bool no_color = true; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * input_texel_size; + + colors[i] = dof_load_scatter_color(colorBuffer, sample_uv, 0.0); + no_color = no_color && all(equal(colors[i].rgb, vec3(0.0))); + } + + /* Early out from no color to scatter. */ + if (no_color) { + vertex_discard(); + return; + } + + weights = dof_layer_weight(cocs) * dof_sample_weight(cocs); + /* Filter NaNs. */ + weights = mix(weights, vec4(0.0), equal(cocs, vec4(0.0))); + + color1 = colors[0] * weights[0]; + color2 = colors[1] * weights[1]; + color3 = colors[2] * weights[2]; + color4 = colors[3] * weights[3]; + + /* Extend to cover at least the unit circle */ + const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0; + /* Crappy diagram + * ex 1 + * | \ + * | \ + * 1 | \ + * | \ + * | \ + * 0 | x \ + * | Circle \ + * | Origin \ + * -1 0 --------------- 2 + * -1 0 1 ex + */ + + /* Generate Triangle : less memory fetches from a VBO */ + int v_id = gl_VertexID % 3; /* Vertex Id */ + gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */ + gl_Position.y = float(v_id % 2) * extend - 1.0; + gl_Position.z = 0.0; + gl_Position.w = 1.0; + + spritesize = max_v4(cocs); + + /* Add 2.5 to max_coc because the max_coc may not be centered on the sprite origin + * and because we smooth the bokeh shape a bit in the pixel shader. */ + gl_Position.xy *= spritesize * bokehAnisotropy + 2.5; + /* Position the sprite. */ + gl_Position.xy += spritepos; + /* NDC range [-1..1]. */ + gl_Position.xy = gl_Position.xy * targetTexelSize * 2.0 - 1.0; + + /* Add 2.5 for the same reason but without the ratio. */ + spritesize += 2.5; +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl new file mode 100644 index 00000000000..d1ecc0fc244 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl @@ -0,0 +1,65 @@ + +/** + * Setup pass: CoC and luma aware downsample to half resolution of the input scene color buffer. + * + * An addition to the downsample CoC, we output the maximum slight out of focus CoC to be + * sure we don't miss a pixel. + **/ + +#pragma BLENDER_REQUIRE(effect_dof_lib.glsl) + +/* Full resolution. */ +uniform sampler2D colorBuffer; +uniform sampler2D depthBuffer; + +uniform float bokehMaxSize; + +/* Half resolution. */ +layout(location = 0) out vec4 outColor; +layout(location = 1) out vec2 outCoc; /* x: Downsample CoC, y: Max slight focus abs CoC */ + +void main() +{ + vec2 fullres_texel_size = 1.0 / vec2(textureSize(colorBuffer, 0).xy); + /* Center uv around the 4 fullres pixels. */ + vec2 quad_center = (floor(gl_FragCoord.xy) * 2.0 + 1.0) * fullres_texel_size; + + vec4 colors[4]; + vec4 depths; + for (int i = 0; i < 4; i++) { + vec2 sample_uv = quad_center + quad_offsets[i] * fullres_texel_size; + colors[i] = safe_color(textureLod(colorBuffer, sample_uv, 0.0)); + depths[i] = textureLod(depthBuffer, sample_uv, 0.0).r; + } + + vec4 cocs = dof_coc_from_zdepth(depths); + + cocs = clamp(cocs, -bokehMaxSize, bokehMaxSize); + + vec4 weights = dof_downsample_bilateral_coc_weights(cocs); + weights *= dof_downsample_bilateral_color_weights(colors); + /* Normalize so that the sum is 1. */ + weights *= safe_rcp(sum(weights)); + + outColor = weighted_sum_array(colors, weights); + outCoc.x = dot(cocs, weights); + + /* Max slight focus abs CoC. */ + + /* Clamp to 0.5 if full in defocus to differentiate full focus tiles with coc == 0.0. + * This enables an optimization in the resolve pass. */ + const vec4 threshold = vec4(layer_threshold + layer_offset); + cocs = abs(cocs); + bvec4 defocus = greaterThan(cocs, threshold); + bvec4 focus = lessThanEqual(cocs, vec4(0.5)); + if (any(defocus) && any(focus)) { + /* For the same reason as in the flatten pass. This is a case we cannot optimize for. */ + cocs = mix(cocs, vec4(DOF_TILE_MIXED), focus); + cocs = mix(cocs, vec4(DOF_TILE_MIXED), defocus); + } + else { + cocs = mix(cocs, vec4(DOF_TILE_FOCUS), focus); + cocs = mix(cocs, vec4(DOF_TILE_DEFOCUS), defocus); + } + outCoc.y = max_v4(cocs); +} diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl deleted file mode 100644 index 6e35d4a54ae..00000000000 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl +++ /dev/null @@ -1,109 +0,0 @@ - -#pragma BLENDER_REQUIRE(common_math_lib.glsl) - -uniform vec4 bokehParams[2]; - -#define bokeh_rotation bokehParams[0].x -#define bokeh_ratio bokehParams[0].y -#define bokeh_maxsize bokehParams[0].z - -uniform sampler2D nearBuffer; -uniform sampler2D farBuffer; -uniform sampler2D cocBuffer; - -flat out vec4 color; -flat out float weight; -flat out float smoothFac; -flat out ivec2 edge; -out vec2 particlecoord; - -/* Scatter pass, calculate a triangle covering the CoC. */ -void main() -{ - ivec2 tex_size = textureSize(cocBuffer, 0); - /* We render to a double width texture so compute - * the target texel size accordingly */ - vec2 texel_size = vec2(0.5, 1.0) / vec2(tex_size); - - int t_id = gl_VertexID / 3; /* Triangle Id */ - - ivec2 texelco = ivec2(0); - /* some math to get the target pixel */ - texelco.x = t_id % tex_size.x; - texelco.y = t_id / tex_size.x; - - vec2 cocs = texelFetch(cocBuffer, texelco, 0).rg; - - bool is_near = (cocs.x > cocs.y); - float coc = (is_near) ? cocs.x : cocs.y; - - /* Clamp to max size for performance */ - coc = min(coc, bokeh_maxsize); - - if (coc >= 1.0) { - if (is_near) { - color = texelFetch(nearBuffer, texelco, 0); - } - else { - color = texelFetch(farBuffer, texelco, 0); - } - /* find the area the pixel will cover and divide the color by it */ - /* HACK: 4.0 out of nowhere (I suppose it's 4 pixels footprint for coc 0?) - * Makes near in focus more closer to 1.0 alpha. */ - weight = 4.0 / (coc * coc * M_PI); - color *= weight; - - /* Compute edge to discard fragment that does not belong to the other layer. */ - edge.x = (is_near) ? 1 : -1; - edge.y = (is_near) ? -tex_size.x + 1 : tex_size.x; - } - else { - /* Don't produce any fragments */ - color = vec4(0.0); - gl_Position = vec4(0.0, 0.0, 0.0, 1.0); - return; - } - - /* Generate Triangle : less memory fetches from a VBO */ - int v_id = gl_VertexID % 3; /* Vertex Id */ - - /* Extend to cover at least the unit circle */ - const float extend = (cos(M_PI / 4.0) + 1.0) * 2.0; - /* Crappy diagram - * ex 1 - * | \ - * | \ - * 1 | \ - * | \ - * | \ - * 0 | x \ - * | Circle \ - * | Origin \ - * -1 0 --------------- 2 - * -1 0 1 ex - */ - gl_Position.x = float(v_id / 2) * extend - 1.0; /* int divisor round down */ - gl_Position.y = float(v_id % 2) * extend - 1.0; - gl_Position.z = 0.0; - gl_Position.w = 1.0; - - /* Generate Triangle */ - particlecoord = gl_Position.xy; - - gl_Position.xy *= coc * texel_size * vec2(bokeh_ratio, 1.0); - gl_Position.xy -= 1.0 - 0.5 * texel_size; /* NDC Bottom left */ - gl_Position.xy += (0.5 + vec2(texelco) * 2.0) * texel_size; - - /* Push far plane to left side. */ - if (!is_near) { - gl_Position.x += 2.0 / 2.0; - } - - /* don't do smoothing for small sprites */ - if (coc > 3.0) { - smoothFac = 1.0 - 1.5 / coc; - } - else { - smoothFac = 1.0; - } -} diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl index 102a8ddca7b..8f6940a6062 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_dof_frag.glsl @@ -24,9 +24,6 @@ uniform sampler2D noiseTex; #define dof_distance dofParams.y #define dof_invsensorsize dofParams.z -#define weighted_sum(a, b, c, d, e, e_sum) \ - ((a)*e.x + (b)*e.y + (c)*e.z + (d)*e.w) / max(1e-6, e_sum); - /* divide by sensor size to get the normalized size */ #define calculate_coc(zdepth) \ (dof_aperturesize * (dof_distance / zdepth - 1.0) * dof_invsensorsize) @@ -89,8 +86,7 @@ void main() /* now write output to weighted buffers. */ /* Take far plane pixels in priority. */ vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights; - float tot_weight = dot(w, vec4(1.0)); - halfResColor = weighted_sum(color1, color2, color3, color4, w, tot_weight); + halfResColor = weighted_sum(color1, color2, color3, color4, w); halfResColor = clamp(halfResColor, 0.0, 3.0); normalizedCoc = encode_coc(coc_near, coc_far); @@ -138,8 +134,7 @@ void main() /* now write output to weighted buffers. */ vec4 w = any(notEqual(far_weights, vec4(0.0))) ? far_weights : near_weights; - float tot_weight = dot(w, vec4(1.0)); - outColor = weighted_sum(color1, color2, color3, color4, w, tot_weight); + outColor = weighted_sum(color1, color2, color3, color4, w); outCocs = encode_coc(coc_near, coc_far); } diff --git a/source/blender/draw/intern/shaders/common_math_lib.glsl b/source/blender/draw/intern/shaders/common_math_lib.glsl index a82e0b5a5e9..9cb1723346d 100644 --- a/source/blender/draw/intern/shaders/common_math_lib.glsl +++ b/source/blender/draw/intern/shaders/common_math_lib.glsl @@ -3,12 +3,14 @@ /** \name Common Math Utilities * \{ */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_2PI 6.28318530717958647692 /* 2*pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_1_PI 0.318309886183790671538 /* 1/pi */ -#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */ -#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */ +#define M_PI 3.14159265358979323846 /* pi */ +#define M_2PI 6.28318530717958647692 /* 2*pi */ +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#define M_1_PI 0.318309886183790671538 /* 1/pi */ +#define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */ +#define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */ +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #define FLT_MAX 3.402823e+38 vec3 mul(mat3 m, vec3 v) @@ -33,6 +35,13 @@ vec3 project_point(mat4 m, vec3 v) return tmp.xyz / tmp.w; } +mat2 rot2_from_angle(float a) +{ + float c = cos(a); + float s = sin(a); + return mat2(c, -s, s, c); +} + #define min3(a, b, c) min(a, min(b, c)) #define min4(a, b, c, d) min(a, min3(b, c, d)) #define min5(a, b, c, d, e) min(a, min4(b, c, d, e)) @@ -72,6 +81,21 @@ float sum(vec4 v) { return dot(vec4(1.0), v); } float avg(vec2 v) { return dot(vec2(1.0 / 2.0), v); } float avg(vec3 v) { return dot(vec3(1.0 / 3.0), v); } float avg(vec4 v) { return dot(vec4(1.0 / 4.0), v); } + +float safe_rcp(float a) { return (a != 0.0) ? (1.0 / a) : 0.0; } +vec2 safe_rcp(vec2 a) { return mix(vec2(0.0), (1.0 / a), notEqual(a, vec2(0.0))); } +vec4 safe_rcp(vec4 a) { return mix(vec4(0.0), (1.0 / a), notEqual(a, vec4(0.0))); } + +float sqr(float a) { return a * a; } +vec2 sqr(vec2 a) { return a * a; } +vec3 sqr(vec3 a) { return a * a; } +vec4 sqr(vec4 a) { return a * a; } + +float len_squared(vec3 a) { return dot(a, a); } +float len_squared(vec2 a) { return dot(a, a); } + +#define weighted_sum(val0, val1, val2, val3, weights) ((val0 * weights[0] + val1 * weights[1] + val2 * weights[2] + val3 * weights[3]) * safe_rcp(sum(weights))); +#define weighted_sum_array(val, weights) ((val[0] * weights[0] + val[1] * weights[1] + val[2] * weights[2] + val[3] * weights[3]) * safe_rcp(sum(weights))); /* clang-format on */ #define saturate(a) clamp(a, 0.0, 1.0) @@ -88,11 +112,6 @@ float distance_squared(vec3 a, vec3 b) return dot(a, a); } -float len_squared(vec3 a) -{ - return dot(a, a); -} - /** \} */ /* ---------------------------------------------------------------------- */ @@ -128,3 +147,14 @@ vec2 fast_acos(vec2 v) } /** \} */ + +/* + * For debugging purpose mainly. + * From https://www.shadertoy.com/view/4dsSzr + * By Morgan McGuire @morgan3d, http://graphicscodex.com + * Reuse permitted under the BSD license. + */ +vec3 neon_gradient(float t) +{ + return clamp(vec3(t * 1.3 + 0.1, sqr(abs(0.43 - t) * 1.7), (1.0 - t) * 1.7), 0.0, 1.0); +} diff --git a/source/blender/draw/tests/shaders_test.cc b/source/blender/draw/tests/shaders_test.cc index 2c8b3d85a0a..8ab626ed7ba 100644 --- a/source/blender/draw/tests/shaders_test.cc +++ b/source/blender/draw/tests/shaders_test.cc @@ -299,12 +299,29 @@ TEST_F(DrawTest, eevee_glsl_shaders_static) EXPECT_NE(EEVEE_shaders_bloom_upsample_get(true), nullptr); EXPECT_NE(EEVEE_shaders_bloom_resolve_get(false), nullptr); EXPECT_NE(EEVEE_shaders_bloom_resolve_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false), nullptr); - EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_bokeh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_setup_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_flatten_tiles_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_dilate_tiles_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_downsample_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_reduce_get(false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_FOREGROUND, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_BACKGROUND, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_gather_get(DOF_GATHER_HOLEFILL, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_filter_get(), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(false, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false, false), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, true), nullptr); + EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true, false), nullptr); EXPECT_NE(EEVEE_shaders_effect_downsample_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_effect_downsample_cube_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_effect_minz_downlevel_sh_get(), nullptr); diff --git a/source/blender/makesdna/DNA_scene_defaults.h b/source/blender/makesdna/DNA_scene_defaults.h index ae02ac5ee35..3e1b2ef56a1 100644 --- a/source/blender/makesdna/DNA_scene_defaults.h +++ b/source/blender/makesdna/DNA_scene_defaults.h @@ -208,8 +208,11 @@ .gtao_factor = 1.0f, \ .gtao_quality = 0.25f, \ \ + .bokeh_overblur = 5.0f, \ .bokeh_max_size = 100.0f, \ .bokeh_threshold = 1.0f, \ + .bokeh_neighbor_max = 10.0f, \ + .bokeh_denoise_fac = 0.75f, \ \ .bloom_color = {1.0f, 1.0f, 1.0f}, \ .bloom_threshold = 0.8f, \ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 472b2e9fa7f..a7405b64bf9 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1642,8 +1642,11 @@ typedef struct SceneEEVEE { float gtao_factor; float gtao_quality; + float bokeh_overblur; float bokeh_max_size; float bokeh_threshold; + float bokeh_neighbor_max; + float bokeh_denoise_fac; float bloom_color[3]; float bloom_threshold; @@ -1658,7 +1661,6 @@ typedef struct SceneEEVEE { int motion_blur_position; float motion_blur_shutter; float motion_blur_depth_scale; - char _pad0[4]; int shadow_method DNA_DEPRECATED; int shadow_cube_size; @@ -2420,6 +2422,8 @@ enum { SCE_EEVEE_GI_AUTOBAKE = (1 << 19), SCE_EEVEE_SHADOW_SOFT = (1 << 20), SCE_EEVEE_OVERSCAN = (1 << 21), + SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS = (1 << 22), + SCE_EEVEE_DOF_JITTER = (1 << 23), }; /* SceneEEVEE->shadow_method */ diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 443ffc04ead..938f051cd55 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -7368,21 +7368,66 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); /* Depth of Field */ + prop = RNA_def_property(srna, "bokeh_max_size", PROP_FLOAT, PROP_PIXEL); RNA_def_property_ui_text( prop, "Max Size", "Max size of the bokeh shape for the depth of field (lower is faster)"); RNA_def_property_range(prop, 0.0f, 2000.0f); - RNA_def_property_ui_range(prop, 2.0f, 200.0f, 1, 3); + RNA_def_property_ui_range(prop, 0.0f, 200.0f, 100.0f, 1); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); prop = RNA_def_property(srna, "bokeh_threshold", PROP_FLOAT, PROP_FACTOR); RNA_def_property_ui_text( prop, "Sprite Threshold", "Brightness threshold for using sprite base depth of field"); RNA_def_property_range(prop, 0.0f, 100000.0f); - RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 2); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bokeh_neighbor_max", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text(prop, + "Neighbor Rejection", + "Maximum brightness to consider when rejecting bokeh sprites " + "based on neighboorhod (lower is faster)"); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 40.0f, 10, 2); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "bokeh_denoise_fac", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text( + prop, "Denoise Amount", "Amount of flicker removal applied to bokeh highlights"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 10, 2); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "use_bokeh_high_quality_slight_defocus", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_HQ_SLIGHT_FOCUS); + RNA_def_property_ui_text(prop, + "High Quality Slight Defocus", + "Sample all pixels in almost in-focus regions to eliminate noise"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "use_bokeh_jittered", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_JITTER); + RNA_def_property_ui_text(prop, + "Jitter Camera", + "Jitter camera position to create accurate bluring " + "using render samples"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "bokeh_overblur", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_ui_text(prop, + "Overblur", + "Apply blur to each jittered sample to reduce " + "undersampling artifacts"); + RNA_def_property_range(prop, 0, 100); + RNA_def_property_ui_range(prop, 0.0f, 20.0f, 1, 1); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + /* Bloom */ prop = RNA_def_property(srna, "use_bloom", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_BLOOM_ENABLED); From 85f667424192f21b6875d234bc8579628a982729 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 16:02:04 -0600 Subject: [PATCH 132/519] Tests: Add additional object to convert curve to mesh file --- tests/python/curve_to_mesh.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/python/curve_to_mesh.py b/tests/python/curve_to_mesh.py index 1e22ea8fd56..998ecdae116 100644 --- a/tests/python/curve_to_mesh.py +++ b/tests/python/curve_to_mesh.py @@ -41,6 +41,8 @@ def main(): [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('2D Square', 'test2DSquare', 'expected2DSquare', [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), + MeshTest('2D Extrude', 'test2DExtrude', 'expected2DExtrude', + [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('Bevel Back', 'testBevelBack', 'expectedBevelBack', [OperatorSpecObjectMode('convert', {'target': 'MESH'})]), MeshTest('Bevel Back Low Res', 'testBevelBackLowRes', 'expectedBevelBackLowRes', From cdb3cbd644013e466943f623f9080cfdb9ca6f12 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 Feb 2021 16:06:17 -0600 Subject: [PATCH 133/519] Cleanup: Simplify three functions in displist.c A few related improvements to the three functions: - Reduce variable scope - Use for loops instead of while loops - Use const, bool instead of int - Generally make logic easier to read --- source/blender/blenkernel/BKE_displist.h | 2 +- source/blender/blenkernel/intern/displist.c | 366 ++++++++------------ 2 files changed, 149 insertions(+), 219 deletions(-) diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index b2502031029..86145fdfb41 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -113,7 +113,7 @@ void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph, struct ListBase *dispbase); bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4); -void BKE_displist_fill(struct ListBase *dispbase, +void BKE_displist_fill(const struct ListBase *dispbase, struct ListBase *to, const float normal_proj[3], const bool flipnormal); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 58c050493c9..dc274e25823 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -292,164 +292,137 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i /* ICC with the optimization -02 causes crashes. */ # pragma intel optimization_level 1 #endif -static void curve_to_displist(Curve *cu, - ListBase *nubase, - ListBase *dispbase, - const bool for_render) +static void curve_to_displist(const Curve *cu, + const ListBase *nubase, + const bool for_render, + ListBase *r_dispbase) { - DispList *dl; - BezTriple *bezt, *prevbezt; - BPoint *bp; - float *data; - int a, len, resolu; const bool editmode = (!for_render && (cu->editnurb || cu->editfont)); LISTBASE_FOREACH (Nurb *, nu, nubase) { if (nu->hide != 0 && editmode) { continue; } - - if (for_render && cu->resolu_ren != 0) { - resolu = cu->resolu_ren; - } - else { - resolu = nu->resolu; - } - if (!BKE_nurb_check_valid_u(nu)) { - /* pass */ + continue; } - else if (nu->type == CU_BEZIER) { - /* count */ - len = 0; - a = nu->pntsu - 1; - if (nu->flagu & CU_NURB_CYCLIC) { - a++; - } - prevbezt = nu->bezt; - bezt = prevbezt + 1; - while (a--) { - if (a == 0 && (nu->flagu & CU_NURB_CYCLIC)) { - bezt = nu->bezt; - } + const int resolution = (for_render && cu->resolu_ren != 0) ? cu->resolu_ren : nu->resolu; + const bool is_cyclic = nu->flagu & CU_NURB_CYCLIC; + const BezTriple *bezt_first = &nu->bezt[0]; + const BezTriple *bezt_last = &nu->bezt[nu->pntsu - 1]; + if (nu->type == CU_BEZIER) { + int samples_len = 0; + for (int i = 1; i < nu->pntsu; i++) { + const BezTriple *prevbezt = &nu->bezt[i - 1]; + const BezTriple *bezt = &nu->bezt[i]; if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { - len++; + samples_len++; } else { - len += resolu; + samples_len += resolution; } - - if (a == 0 && (nu->flagu & CU_NURB_CYCLIC) == 0) { - len++; + } + if (is_cyclic) { + /* If the curve is cyclic, sample the last edge between the last and first points. */ + if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) { + samples_len++; } - - prevbezt = bezt; - bezt++; + else { + samples_len += resolution; + } + } + else { + /* Otherwise, we only need one additional sample to complete the last edge. */ + samples_len++; } - dl = MEM_callocN(sizeof(DispList), "makeDispListbez"); - /* len+1 because of 'forward_diff_bezier' function */ - dl->verts = MEM_mallocN((len + 1) * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + /* Check that there are more than two points so the curve doesn't loop back on itself. This + * needs to be separate from `is_cyclic` because cyclic sampling can work with two points + * and resolution > 1. */ + const bool use_cyclic_sample = is_cyclic && (samples_len != 2); + + DispList *dl = MEM_callocN(sizeof(DispList), __func__); + /* Add one to the length because of 'BKE_curve_forward_diff_bezier'. */ + dl->verts = MEM_mallocN(sizeof(float[3]) * (samples_len + 1), "dlverts"); + BLI_addtail(r_dispbase, dl); dl->parts = 1; - dl->nr = len; + dl->nr = samples_len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; - data = dl->verts; + dl->type = use_cyclic_sample ? DL_POLY : DL_SEGM; - /* check that (len != 2) so we don't immediately loop back on ourselves */ - if (nu->flagu & CU_NURB_CYCLIC && (dl->nr != 2)) { - dl->type = DL_POLY; - a = nu->pntsu; - } - else { - dl->type = DL_SEGM; - a = nu->pntsu - 1; - } - - prevbezt = nu->bezt; - bezt = prevbezt + 1; - - while (a--) { - if (a == 0 && dl->type == DL_POLY) { - bezt = nu->bezt; - } + float *data = dl->verts; + for (int i = 1; i < nu->pntsu; i++) { + const BezTriple *prevbezt = &nu->bezt[i - 1]; + const BezTriple *bezt = &nu->bezt[i]; if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { copy_v3_v3(data, prevbezt->vec[1]); data += 3; } else { - int j; - for (j = 0; j < 3; j++) { + for (int j = 0; j < 3; j++) { BKE_curve_forward_diff_bezier(prevbezt->vec[1][j], prevbezt->vec[2][j], bezt->vec[0][j], bezt->vec[1][j], data + j, - resolu, + resolution, sizeof(float[3])); } - - data += 3 * resolu; + data += 3 * resolution; } - - if (a == 0 && dl->type == DL_SEGM) { - copy_v3_v3(data, bezt->vec[1]); + } + if (is_cyclic) { + if (bezt_first->h1 == HD_VECT && bezt_last->h2 == HD_VECT) { + copy_v3_v3(data, bezt_last->vec[1]); } - - prevbezt = bezt; - bezt++; + else { + for (int j = 0; j < 3; j++) { + BKE_curve_forward_diff_bezier(bezt_last->vec[1][j], + bezt_last->vec[2][j], + bezt_first->vec[0][j], + bezt_first->vec[1][j], + data + j, + resolution, + sizeof(float[3])); + } + } + } + else { + copy_v3_v3(data, bezt_last->vec[1]); } } else if (nu->type == CU_NURBS) { - len = (resolu * SEGMENTSU(nu)); - - dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); + const int len = (resolution * SEGMENTSU(nu)); + DispList *dl = MEM_callocN(sizeof(DispList), __func__); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + BLI_addtail(r_dispbase, dl); dl->parts = 1; - dl->nr = len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; + dl->type = is_cyclic ? DL_POLY : DL_SEGM; - data = dl->verts; - if (nu->flagu & CU_NURB_CYCLIC) { - dl->type = DL_POLY; - } - else { - dl->type = DL_SEGM; - } - BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, sizeof(float[3])); + BKE_nurb_makeCurve(nu, dl->verts, NULL, NULL, NULL, resolution, sizeof(float[3])); } else if (nu->type == CU_POLY) { - len = nu->pntsu; - dl = MEM_callocN(sizeof(DispList), "makeDispListpoly"); + const int len = nu->pntsu; + DispList *dl = MEM_callocN(sizeof(DispList), __func__); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); - BLI_addtail(dispbase, dl); + BLI_addtail(r_dispbase, dl); dl->parts = 1; dl->nr = len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; + dl->type = (is_cyclic && (dl->nr != 2)) ? DL_POLY : DL_SEGM; - data = dl->verts; - if ((nu->flagu & CU_NURB_CYCLIC) && (dl->nr != 2)) { - dl->type = DL_POLY; - } - else { - dl->type = DL_SEGM; - } - - a = len; - bp = nu->bp; - while (a--) { - copy_v3_v3(data, bp->vec); - bp++; - data += 3; + for (int i = 0; i < len; i++) { + const BPoint *bp = &nu->bp[i]; + copy_v3_v3(&dl->verts[i], bp->vec); } } } @@ -461,22 +434,11 @@ static void curve_to_displist(Curve *cu, * This is also used to initialize #DispList.nors (one normal per display list). * \param flipnormal: Flip the normal (same as passing \a normal_proj negated) */ -void BKE_displist_fill(ListBase *dispbase, +void BKE_displist_fill(const ListBase *dispbase, ListBase *to, const float normal_proj[3], - const bool flipnormal) + const bool flip_normal) { - ScanFillContext sf_ctx; - ScanFillVert *sf_vert, *sf_vert_new, *sf_vert_last; - ScanFillFace *sf_tri; - MemArena *sf_arena; - DispList *dlnew = NULL; - float *f1; - int colnr = 0, charidx = 0, cont = 1, tot, a, *index, nextcol = 0; - int totvert; - const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS | - BLI_SCANFILL_CALC_HOLES; - if (dispbase == NULL) { return; } @@ -484,45 +446,48 @@ void BKE_displist_fill(ListBase *dispbase, return; } - sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__); + const int scanfill_flag = BLI_SCANFILL_CALC_REMOVE_DOUBLES | BLI_SCANFILL_CALC_POLYS | + BLI_SCANFILL_CALC_HOLES; - while (cont) { - int dl_flag_accum = 0; - int dl_rt_accum = 0; - cont = 0; - totvert = 0; - nextcol = 0; + MemArena *sf_arena = BLI_memarena_new(BLI_SCANFILL_ARENA_SIZE, __func__); + short colnr = 0; + int charidx = 0; + bool should_continue = true; + while (should_continue) { + should_continue = false; + bool nextcol = false; + + ScanFillContext sf_ctx; BLI_scanfill_begin_arena(&sf_ctx, sf_arena); - LISTBASE_FOREACH (DispList *, dl, dispbase) { + int totvert = 0; + short dl_flag_accum = 0; + short dl_rt_accum = 0; + LISTBASE_FOREACH (const DispList *, dl, dispbase) { if (dl->type == DL_POLY) { if (charidx < dl->charidx) { - cont = 1; + should_continue = true; } else if (charidx == dl->charidx) { /* character with needed index */ if (colnr == dl->col) { sf_ctx.poly_nr++; - /* make editverts and edges */ - f1 = dl->verts; - a = dl->nr; - sf_vert = sf_vert_new = NULL; - - while (a--) { + /* Make verts and edges. */ + ScanFillVert *sf_vert = NULL; + ScanFillVert *sf_vert_last = NULL; + ScanFillVert *sf_vert_new = NULL; + for (int i = 0; i < dl->nr; i++) { sf_vert_last = sf_vert; - - sf_vert = BLI_scanfill_vert_add(&sf_ctx, f1); + sf_vert = BLI_scanfill_vert_add(&sf_ctx, &dl->verts[3 * i]); totvert++; - if (sf_vert_last == NULL) { sf_vert_new = sf_vert; } else { BLI_scanfill_edge_add(&sf_ctx, sf_vert_last, sf_vert); } - f1 += 3; } if (sf_vert != NULL && sf_vert_new != NULL) { @@ -531,8 +496,8 @@ void BKE_displist_fill(ListBase *dispbase, } else if (colnr < dl->col) { /* got poly with next material at current char */ - cont = 1; - nextcol = 1; + should_continue = true; + nextcol = true; } } dl_flag_accum |= dl->flag; @@ -540,59 +505,33 @@ void BKE_displist_fill(ListBase *dispbase, } } - /* XXX (obedit && obedit->actcol) ? (obedit->actcol - 1) : 0)) { */ - if (totvert && (tot = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj))) { - if (tot) { - dlnew = MEM_callocN(sizeof(DispList), "filldisplist"); - dlnew->type = DL_INDEX3; - dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE)); - dlnew->rt = (dl_rt_accum & CU_SMOOTH); - dlnew->col = colnr; - dlnew->nr = totvert; - dlnew->parts = tot; + const int triangles_len = BLI_scanfill_calc_ex(&sf_ctx, scanfill_flag, normal_proj); + if (totvert != 0 && triangles_len != 0) { + DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisplist"); + dlnew->type = DL_INDEX3; + dlnew->flag = (dl_flag_accum & (DL_BACK_CURVE | DL_FRONT_CURVE)); + dlnew->rt = (dl_rt_accum & CU_SMOOTH); + dlnew->col = colnr; + dlnew->nr = totvert; + dlnew->parts = triangles_len; - dlnew->index = MEM_mallocN(sizeof(int[3]) * tot, "dlindex"); - dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts"); + dlnew->index = MEM_mallocN(sizeof(int[3]) * triangles_len, "dlindex"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts"); - if (normal_proj != NULL) { - /* Use a single normal for #DL_INDEX3. - * Counter intuitively, the normal must always be the flipped projection vector. */ - dlnew->nors = MEM_mallocN(sizeof(float[3]), "dlnors"); - if (flipnormal) { - copy_v3_v3(dlnew->nors, normal_proj); - } - else { - negate_v3_v3(dlnew->nors, normal_proj); - } - } + /* vert data */ + int i; + LISTBASE_FOREACH_INDEX (ScanFillVert *, sf_vert, &sf_ctx.fillvertbase, i) { + copy_v3_v3(&dlnew->verts[3 * i], sf_vert->co); + sf_vert->tmp.i = i; /* Index number. */ + } - /* vert data */ - f1 = dlnew->verts; - totvert = 0; - - for (sf_vert = sf_ctx.fillvertbase.first; sf_vert; sf_vert = sf_vert->next) { - copy_v3_v3(f1, sf_vert->co); - f1 += 3; - - /* index number */ - sf_vert->tmp.i = totvert; - totvert++; - } - - /* index data */ - - index = dlnew->index; - for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) { - index[0] = sf_tri->v1->tmp.i; - index[1] = sf_tri->v2->tmp.i; - index[2] = sf_tri->v3->tmp.i; - - if (flipnormal) { - SWAP(int, index[0], index[2]); - } - - index += 3; - } + /* index data */ + int *index = dlnew->index; + LISTBASE_FOREACH (ScanFillFace *, sf_tri, &sf_ctx.fillfacebase) { + index[0] = sf_tri->v1->tmp.i; + index[1] = flip_normal ? sf_tri->v3->tmp.i : sf_tri->v2->tmp.i; + index[2] = flip_normal ? sf_tri->v2->tmp.i : sf_tri->v3->tmp.i; + index += 3; } BLI_addhead(to, dlnew); @@ -611,27 +550,21 @@ void BKE_displist_fill(ListBase *dispbase, } BLI_memarena_free(sf_arena); - /* do not free polys, needed for wireframe display */ } -static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) +static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase) { - const float z_up[3] = {0.0f, 0.0f, -1.0f}; - ListBase front, back; - float *fp, *fp1; - int a, dpoly; + ListBase front = {NULL, NULL}; + ListBase back = {NULL, NULL}; - BLI_listbase_clear(&front); - BLI_listbase_clear(&back); - - LISTBASE_FOREACH (DispList *, dl, dispbase) { + LISTBASE_FOREACH (const DispList *, dl, dispbase) { if (dl->type == DL_SURF) { if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) { if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) { - DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp"); + DispList *dlnew = MEM_callocN(sizeof(DispList), __func__); BLI_addtail(&front, dlnew); - dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__); dlnew->nr = dl->parts; dlnew->parts = 1; dlnew->type = DL_POLY; @@ -639,20 +572,18 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dlnew->col = dl->col; dlnew->charidx = dl->charidx; - fp = dl->verts; - dpoly = 3 * dl->nr; - - a = dl->parts; - while (a--) { - copy_v3_v3(fp1, fp); - fp1 += 3; - fp += dpoly; + const float *old_verts = dl->verts; + float *new_verts = dlnew->verts; + for (int i = 0; i < dl->parts; i++) { + copy_v3_v3(new_verts, old_verts); + new_verts += 3; + old_verts += 3 * dl->nr; } } if ((cu->flag & CU_FRONT) && (dl->flag & DL_FRONT_CURVE)) { - DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp"); + DispList *dlnew = MEM_callocN(sizeof(DispList), __func__); BLI_addtail(&back, dlnew); - dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1"); + dlnew->verts = MEM_mallocN(sizeof(float[3]) * dl->parts, __func__); dlnew->nr = dl->parts; dlnew->parts = 1; dlnew->type = DL_POLY; @@ -660,20 +591,19 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dlnew->col = dl->col; dlnew->charidx = dl->charidx; - fp = dl->verts + 3 * (dl->nr - 1); - dpoly = 3 * dl->nr; - - a = dl->parts; - while (a--) { - copy_v3_v3(fp1, fp); - fp1 += 3; - fp += dpoly; + const float *old_verts = dl->verts + 3 * (dl->nr - 1); + float *new_verts = dlnew->verts; + for (int i = 0; i < dl->parts; i++) { + copy_v3_v3(new_verts, old_verts); + new_verts += 3; + old_verts += 3 * dl->nr; } } } } } + const float z_up[3] = {0.0f, 0.0f, -1.0f}; BKE_displist_fill(&front, dispbase, z_up, true); BKE_displist_fill(&back, dispbase, z_up, false); @@ -1579,7 +1509,7 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph, /* no bevel or extrude, and no width correction? */ if (!dlbev.first && cu->width == 1.0f) { - curve_to_displist(cu, &nubase, dispbase, for_render); + curve_to_displist(cu, &nubase, for_render, dispbase); } else { const float widfac = cu->width - 1.0f; From 1065b413edfa9c6022ff2ae8734fef7e5ac50804 Mon Sep 17 00:00:00 2001 From: Stephan Seitz Date: Fri, 12 Feb 2021 16:08:01 -0600 Subject: [PATCH 134/519] Cleanup: Fix clang compile warning Use a reference instead of copying the string. Differential Revision: https://developer.blender.org/D10411 --- source/blender/nodes/geometry/node_geometry_util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index 3e30658e056..c0f8fbade49 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -38,7 +38,7 @@ void gather_attribute_info(Map &attributes, } const GeometryComponent &component = *set.get_component_for_read(component_type); - for (const std::string name : component.attribute_names()) { + for (const std::string &name : component.attribute_names()) { if (ignored_attributes.contains(name)) { continue; } From 327e8fb9135f0d11adfe28756e3dcf38c751718e Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 12 Feb 2021 19:33:22 -0500 Subject: [PATCH 135/519] RNA Manual Reference: Update mappings --- .../scripts/modules/rna_manual_reference.py | 82 ++++++++++++++++++- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py index 3f5b31f8cfd..b2f1cfe23e9 100644 --- a/release/scripts/modules/rna_manual_reference.py +++ b/release/scripts/modules/rna_manual_reference.py @@ -77,7 +77,9 @@ url_manual_mapping = ( ("bpy.types.fluiddomainsettings.color_ramp_field_scale*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field-scale"), ("bpy.types.fluiddomainsettings.use_adaptive_timesteps*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-adaptive-timesteps"), ("bpy.types.fluiddomainsettings.use_dissolve_smoke_log*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-dissolve-smoke-log"), + ("bpy.types.greasepencil.use_adaptive_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-adaptive-curve-resolution"), ("bpy.types.linestylegeometrymodifier_polygonalization*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/polygonization.html#bpy-types-linestylegeometrymodifier-polygonalization"), + ("bpy.types.toolsettings.use_gpencil_automerge_strokes*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-automerge-strokes"), ("bpy.types.toolsettings.use_proportional_edit_objects*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit-objects"), ("bpy.ops.view3d.edit_mesh_extrude_move_shrink_fatten*", "modeling/meshes/editing/face/extrude_faces_normal.html#bpy-ops-view3d-edit-mesh-extrude-move-shrink-fatten"), ("bpy.types.cyclesrendersettings.distance_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-distance-cull-margin"), @@ -105,6 +107,7 @@ url_manual_mapping = ( ("bpy.types.materialgpencilstyle.use_overlap_strokes*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-use-overlap-strokes"), ("bpy.types.toolsettings.use_gpencil_weight_data_add*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-weight-data-add"), ("bpy.types.view3doverlay.texture_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-texture-paint-mode-opacity"), + ("bpy.types.bakesettings.use_pass_ambient_occlusion*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-ambient-occlusion"), ("bpy.types.brush.surface_smooth_shape_preservation*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-shape-preservation"), ("bpy.types.brush.use_cloth_pin_simulation_boundary*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-pin-simulation-boundary"), ("bpy.types.brushgpencilsettings.show_fill_boundary*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-show-fill-boundary"), @@ -130,6 +133,7 @@ url_manual_mapping = ( ("bpy.types.view3doverlay.vertex_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-vertex-paint-mode-opacity"), ("bpy.types.viewlayer.use_pass_cryptomatte_accurate*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-accurate"), ("bpy.types.viewlayer.use_pass_cryptomatte_material*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-material"), + ("bpy.ops.gpencil.vertex_color_brightness_contrast*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-brightness-contrast"), ("bpy.ops.view3d.edit_mesh_extrude_individual_move*", "modeling/meshes/editing/face/extrude_faces.html#bpy-ops-view3d-edit-mesh-extrude-individual-move"), ("bpy.ops.view3d.edit_mesh_extrude_manifold_normal*", "modeling/meshes/tools/extrude_manifold.html#bpy-ops-view3d-edit-mesh-extrude-manifold-normal"), ("bpy.types.cyclesrendersettings.use_distance_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-distance-cull"), @@ -191,6 +195,7 @@ url_manual_mapping = ( ("bpy.types.fluiddomainsettings.color_ramp_field*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field"), ("bpy.types.fluiddomainsettings.guide_vel_factor*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-guide-vel-factor"), ("bpy.types.fluideffectorsettings.use_plane_init*", "physics/fluid/type/effector.html#bpy-types-fluideffectorsettings-use-plane-init"), + ("bpy.types.greasepencil.curve_edit_corner_angle*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-corner-angle"), ("bpy.types.linestylegeometrymodifier_tipremover*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/tip_remover.html#bpy-types-linestylegeometrymodifier-tipremover"), ("bpy.types.movietrackingcamera.distortion_model*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-distortion-model"), ("bpy.types.rendersettings.resolution_percentage*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-percentage"), @@ -201,6 +206,7 @@ url_manual_mapping = ( ("bpy.types.viewlayer.use_pass_cryptomatte_asset*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-asset"), ("bpy.ops.outliner.collection_indirect_only_set*", "render/layers/introduction.html#bpy-ops-outliner-collection-indirect-only-set"), ("bpy.ops.sequencer.deinterlace_selected_movies*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-deinterlace-selected-movies"), + ("bpy.types.bakesettings.use_selected_to_active*", "render/cycles/baking.html#bpy-types-bakesettings-use-selected-to-active"), ("bpy.types.brush.surface_smooth_current_vertex*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-current-vertex"), ("bpy.types.brush.use_multiplane_scrape_dynamic*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-use-multiplane-scrape-dynamic"), ("bpy.types.brushgpencilsettings.fill_direction*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-direction"), @@ -234,6 +240,7 @@ url_manual_mapping = ( ("bpy.ops.object.vertex_group_copy_to_selected*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy-to-selected"), ("bpy.ops.outliner.collection_duplicate_linked*", "editors/outliner/editing.html#bpy-ops-outliner-collection-duplicate-linked"), ("bpy.ops.view3d.edit_mesh_extrude_move_normal*", "modeling/meshes/editing/face/extrude_faces.html#bpy-ops-view3d-edit-mesh-extrude-move-normal"), + ("bpy.types.bakesettings.use_pass_transmission*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-transmission"), ("bpy.types.clothsettings.internal_compression*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-internal-compression"), ("bpy.types.cyclesrendersettings.dicing_camera*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-dicing-camera"), ("bpy.types.cyclesrendersettings.texture_limit*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-texture-limit"), @@ -253,8 +260,11 @@ url_manual_mapping = ( ("bpy.types.fluidflowsettings.surface_distance*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-surface-distance"), ("bpy.types.fluidflowsettings.texture_map_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-texture-map-type"), ("bpy.types.gpencilsculptguide.reference_point*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-reference-point"), + ("bpy.types.greasepencil.edit_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-edit-curve-resolution"), ("bpy.types.linestylegeometrymodifier_2doffset*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/2d_offset.html#bpy-types-linestylegeometrymodifier-2doffset"), ("bpy.types.linestylegeometrymodifier_sampling*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sampling.html#bpy-types-linestylegeometrymodifier-sampling"), + ("bpy.types.nodesocketinterface*.default_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-default-value"), + ("bpy.types.rendersettings.use_persistent_data*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-persistent-data"), ("bpy.types.spaceoutliner.show_restrict_column*", "editors/outliner/interface.html#bpy-types-spaceoutliner-show-restrict-column"), ("bpy.types.toolsettings.transform_pivot_point*", "editors/3dview/controls/pivot_point/index.html#bpy-types-toolsettings-transform-pivot-point"), ("bpy.types.toolsettings.use_proportional_edit*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit"), @@ -273,7 +283,9 @@ url_manual_mapping = ( ("bpy.types.fluidflowsettings.velocity_factor*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-velocity-factor"), ("bpy.types.fluidflowsettings.velocity_normal*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-velocity-normal"), ("bpy.types.geometrynodealignrotationtovector*", "modeling/geometry_nodes/point/align_rotation_to_vector.html#bpy-types-geometrynodealignrotationtovector"), + ("bpy.types.greasepencil.curve_edit_threshold*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-threshold"), ("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-stroke-style"), + ("bpy.types.rendersettings.preview_pixel_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-preview-pixel-size"), ("bpy.types.rendersettings.use_crop_to_border*", "render/output/properties/dimensions.html#bpy-types-rendersettings-use-crop-to-border"), ("bpy.types.rendersettings.use_file_extension*", "render/output/properties/output.html#bpy-types-rendersettings-use-file-extension"), ("bpy.types.sculpt.constant_detail_resolution*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-constant-detail-resolution"), @@ -311,12 +323,15 @@ url_manual_mapping = ( ("bpy.types.movietrackingcamera.pixel_aspect*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-pixel-aspect"), ("bpy.types.movietrackingcamera.sensor_width*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-sensor-width"), ("bpy.types.posebone.use_ik_rotation_control*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-use-ik-rotation-control"), + ("bpy.types.rendersettings.use_bake_multires*", "render/cycles/baking.html#bpy-types-rendersettings-use-bake-multires"), ("bpy.types.scenegpencil.antialias_threshold*", "render/cycles/render_settings/grease_pencil.html#bpy-types-scenegpencil-antialias-threshold"), ("bpy.types.spaceuveditor.sticky_select_mode*", "editors/uv/selecting.html#bpy-types-spaceuveditor-sticky-select-mode"), ("bpy.types.spaceview3d.show_object_viewport*", "editors/3dview/display/visibility.html#bpy-types-spaceview3d-show-object-viewport"), ("bpy.types.view3doverlay.show_fade_inactive*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-fade-inactive"), ("bpy.types.viewlayer.pass_cryptomatte_depth*", "render/layers/passes.html#bpy-types-viewlayer-pass-cryptomatte-depth"), + ("bpy.ops.clip.stabilize_2d_rotation_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-rotation-select"), ("bpy.ops.constraint.disable_keep_transform*", "animation/constraints/interface/common.html#bpy-ops-constraint-disable-keep-transform"), + ("bpy.ops.gpencil.stroke_reset_vertex_color*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-stroke-reset-vertex-color"), ("bpy.ops.object.vertex_group_normalize_all*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize-all"), ("bpy.ops.outliner.collection_color_tag_set*", "editors/outliner/editing.html#bpy-ops-outliner-collection-color-tag-set"), ("bpy.ops.outliner.collection_enable_render*", "editors/outliner/editing.html#bpy-ops-outliner-collection-enable-render"), @@ -349,6 +364,7 @@ url_manual_mapping = ( ("bpy.types.rendersettings.dither_intensity*", "render/output/properties/post_processing.html#bpy-types-rendersettings-dither-intensity"), ("bpy.types.rendersettings.simplify_volumes*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-volumes"), ("bpy.types.rendersettings.use_render_cache*", "render/output/properties/output.html#bpy-types-rendersettings-use-render-cache"), + ("bpy.types.rendersettings.use_save_buffers*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-save-buffers"), ("bpy.types.rendersettings.use_single_layer*", "render/layers/view_layer.html#bpy-types-rendersettings-use-single-layer"), ("bpy.types.rendersettings_simplify_gpencil*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil"), ("bpy.types.sceneeevee.use_taa_reprojection*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-use-taa-reprojection"), @@ -368,6 +384,7 @@ url_manual_mapping = ( ("bpy.ops.object.modifier_copy_to_selected*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-copy-to-selected"), ("bpy.ops.preferences.app_template_install*", "advanced/app_templates.html#bpy-ops-preferences-app-template-install"), ("bpy.types.actionposemarkers.active_index*", "animation/armatures/properties/pose_library.html#bpy-types-actionposemarkers-active-index"), + ("bpy.types.bakesettings.use_pass_indirect*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-indirect"), ("bpy.types.brush.cloth_force_falloff_type*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-force-falloff-type"), ("bpy.types.brushgpencilsettings.fill_leak*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-leak"), ("bpy.types.brushgpencilsettings.show_fill*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-show-fill"), @@ -397,6 +414,9 @@ url_manual_mapping = ( ("bpy.types.movietrackingcamera.division_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-division-k"), ("bpy.types.movietrackingobject.keyframe_a*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-a"), ("bpy.types.movietrackingobject.keyframe_b*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-b"), + ("bpy.types.nodesocketinterface*.max_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-max-value"), + ("bpy.types.nodesocketinterface*.min_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-min-value"), + ("bpy.types.nodesocketinterface.hide_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-hide-value"), ("bpy.types.rendersettings.use_compositing*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-compositing"), ("bpy.types.rendersettings.use_placeholder*", "render/output/properties/output.html#bpy-types-rendersettings-use-placeholder"), ("bpy.types.shadernodesubsurfacescattering*", "render/shader_nodes/shader/sss.html#bpy-types-shadernodesubsurfacescattering"), @@ -418,6 +438,7 @@ url_manual_mapping = ( ("bpy.ops.preferences.reset_default_theme*", "editors/preferences/themes.html#bpy-ops-preferences-reset-default-theme"), ("bpy.ops.sequencer.strip_transform_clear*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-strip-transform-clear"), ("bpy.types.animdata.action_extrapolation*", "editors/nla/sidebar.html#bpy-types-animdata-action-extrapolation"), + ("bpy.types.bakesettings.max_ray_distance*", "render/cycles/baking.html#bpy-types-bakesettings-max-ray-distance"), ("bpy.types.brush.multiplane_scrape_angle*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-multiplane-scrape-angle"), ("bpy.types.clothsettings.internal_spring*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-internal-spring"), ("bpy.types.clothsettings.pressure_factor*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-pressure-factor"), @@ -460,6 +481,8 @@ url_manual_mapping = ( ("bpy.ops.view3d.blenderkit_set_category*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-set-category"), ("bpy.types.armature.rigify_colors_index*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-index"), ("bpy.types.armature.rigify_theme_to_add*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-theme-to-add"), + ("bpy.types.bakesettings.use_pass_direct*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-direct"), + ("bpy.types.bakesettings.use_pass_glossy*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-glossy"), ("bpy.types.brush.pose_smooth_iterations*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-pose-smooth-iterations"), ("bpy.types.brush.snake_hook_deform_type*", "sculpt_paint/sculpting/tools/snake_hook.html#bpy-types-brush-snake-hook-deform-type"), ("bpy.types.brush.use_grab_active_vertex*", "sculpt_paint/sculpting/tools/grab.html#bpy-types-brush-use-grab-active-vertex"), @@ -488,11 +511,13 @@ url_manual_mapping = ( ("bpy.types.spacetexteditor.replace_text*", "editors/text_editor.html#bpy-types-spacetexteditor-replace-text"), ("bpy.types.spacetexteditor.use_find_all*", "editors/text_editor.html#bpy-types-spacetexteditor-use-find-all"), ("bpy.types.toolsettings.use_snap_rotate*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-rotate"), + ("bpy.types.view3doverlay.display_handle*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-display-handle"), ("bpy.types.volumedisplay.wireframe_type*", "modeling/volumes/properties.html#bpy-types-volumedisplay-wireframe-type"), ("bpy.ops.curve.normals_make_consistent*", "modeling/curves/editing/control_points.html#bpy-ops-curve-normals-make-consistent"), ("bpy.ops.gpencil.frame_clean_duplicate*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-duplicate"), ("bpy.ops.gpencil.stroke_simplify_fixed*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-simplify-fixed"), ("bpy.ops.mesh.faces_select_linked_flat*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-faces-select-linked-flat"), + ("bpy.ops.mesh.primitive_ico_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-ico-sphere-add"), ("bpy.ops.object.gpencil_modifier_apply*", "grease_pencil/modifiers/introduction.html#bpy-ops-object-gpencil-modifier-apply"), ("bpy.ops.object.multires_external_save*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-external-save"), ("bpy.ops.object.vertex_group_normalize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize"), @@ -501,17 +526,21 @@ url_manual_mapping = ( ("bpy.ops.sequencer.change_effect_input*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-change-effect-input"), ("bpy.ops.sequencer.strip_transform_fit*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-strip-transform-fit"), ("bpy.types.armature.rigify_colors_lock*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-lock"), + ("bpy.types.bakesettings.cage_extrusion*", "render/cycles/baking.html#bpy-types-bakesettings-cage-extrusion"), + ("bpy.types.bakesettings.use_pass_color*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-color"), ("bpy.types.brush.boundary_falloff_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-falloff-type"), ("bpy.types.brush.texture_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-texture-overlay-alpha"), ("bpy.types.brushgpencilsettings.random*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-random"), ("bpy.types.clothsettings.target_volume*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-target-volume"), ("bpy.types.compositornodebilateralblur*", "compositing/types/filter/bilateral_blur.html#bpy-types-compositornodebilateralblur"), ("bpy.types.compositornodedistancematte*", "compositing/types/matte/distance_key.html#bpy-types-compositornodedistancematte"), + ("bpy.types.compositornodesetalpha.mode*", "compositing/types/converter/set_alpha.html#bpy-types-compositornodesetalpha-mode"), ("bpy.types.dopesheet.use_filter_invert*", "editors/graph_editor/channels.html#bpy-types-dopesheet-use-filter-invert"), ("bpy.types.fluiddomainsettings.gravity*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-gravity"), ("bpy.types.fluidflowsettings.flow_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-flow-type"), ("bpy.types.fluidflowsettings.subframes*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-subframes"), ("bpy.types.geometrynodepointdistribute*", "modeling/geometry_nodes/point/point_distribute.html#bpy-types-geometrynodepointdistribute"), + ("bpy.types.greasepencil.use_curve_edit*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-curve-edit"), ("bpy.types.imagepaint.screen_grab_size*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-screen-grab-size"), ("bpy.types.linestyle*modifier_material*", "render/freestyle/parameter_editor/line_style/modifiers/color/material.html#bpy-types-linestyle-modifier-material"), ("bpy.types.movietrackingcamera.brown_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-brown-k"), @@ -521,6 +550,7 @@ url_manual_mapping = ( ("bpy.types.regionview3d.show_sync_view*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-show-sync-view"), ("bpy.types.rendersettings.resolution_x*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-x"), ("bpy.types.rendersettings.resolution_y*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-y"), + ("bpy.types.rendersettings.threads_mode*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-threads-mode"), ("bpy.types.rigidbodyconstraint.enabled*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-enabled"), ("bpy.types.rigidbodyconstraint.object1*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object1"), ("bpy.types.rigidbodyconstraint.object2*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object2"), @@ -535,9 +565,11 @@ url_manual_mapping = ( ("bpy.types.toolsettings.use_snap_scale*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-scale"), ("bpy.types.toolsettings.uv_select_mode*", "editors/uv/selecting.html#bpy-types-toolsettings-uv-select-mode"), ("bpy.types.viewlayer.material_override*", "render/layers/introduction.html#bpy-types-viewlayer-material-override"), + ("bpy.ops.clip.set_viewport_background*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-viewport-background"), ("bpy.ops.gpencil.interpolate_sequence*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-interpolate-sequence"), ("bpy.ops.mesh.normals_make_consistent*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-normals-make-consistent"), ("bpy.ops.mesh.offset_edge_loops_slide*", "modeling/meshes/editing/edge/offset_edge_slide.html#bpy-ops-mesh-offset-edge-loops-slide"), + ("bpy.ops.mesh.primitive_uv_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-uv-sphere-add"), ("bpy.ops.object.duplicate_move_linked*", "scene_layout/object/editing/duplicate_linked.html#bpy-ops-object-duplicate-move-linked"), ("bpy.ops.object.parent_no_inverse_set*", "scene_layout/object/editing/parent.html#bpy-ops-object-parent-no-inverse-set"), ("bpy.ops.object.vertex_group_quantize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-quantize"), @@ -547,6 +579,7 @@ url_manual_mapping = ( ("bpy.ops.transform.delete_orientation*", "editors/3dview/controls/orientation.html#bpy-ops-transform-delete-orientation"), ("bpy.ops.view3d.localview_remove_from*", "editors/3dview/navigate/local_view.html#bpy-ops-view3d-localview-remove-from"), ("bpy.types.animdata.action_blend_type*", "editors/nla/sidebar.html#bpy-types-animdata-action-blend-type"), + ("bpy.types.bakesettings.use_pass_emit*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-emit"), ("bpy.types.brush.boundary_deform_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-deform-type"), ("bpy.types.brush.cursor_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-overlay-alpha"), ("bpy.types.brush.normal_radius_factor*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-normal-radius-factor"), @@ -583,6 +616,9 @@ url_manual_mapping = ( ("bpy.ops.gpencil.set_active_material*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-set-active-material"), ("bpy.ops.gpencil.stroke_change_color*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-change-color"), ("bpy.ops.gpencil.stroke_cyclical_set*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-cyclical-set"), + ("bpy.ops.gpencil.vertex_color_invert*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-invert"), + ("bpy.ops.gpencil.vertex_color_levels*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-levels"), + ("bpy.ops.mesh.primitive_cylinder_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cylinder-add"), ("bpy.ops.mesh.set_normals_from_faces*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-set-normals-from-faces"), ("bpy.ops.mesh.shape_propagate_to_all*", "modeling/meshes/editing/vertex/propagate_shapes.html#bpy-ops-mesh-shape-propagate-to-all"), ("bpy.ops.mesh.vert_connect_nonplanar*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-vert-connect-nonplanar"), @@ -596,6 +632,7 @@ url_manual_mapping = ( ("bpy.ops.view3d.blenderkit_asset_bar*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-asset-bar"), ("bpy.types.animdata.action_influence*", "editors/nla/sidebar.html#bpy-types-animdata-action-influence"), ("bpy.types.armature.layers_protected*", "animation/armatures/properties/skeleton.html#bpy-types-armature-layers-protected"), + ("bpy.types.bakesettings.normal_space*", "render/cycles/baking.html#bpy-types-bakesettings-normal-space"), ("bpy.types.brush.crease_pinch_factor*", "sculpt_paint/sculpting/tools/snake_hook.html#bpy-types-brush-crease-pinch-factor"), ("bpy.types.brush.elastic_deform_type*", "sculpt_paint/sculpting/tools/elastic_deform.html#bpy-types-brush-elastic-deform-type"), ("bpy.types.brush.use_cloth_collision*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-collision"), @@ -663,6 +700,7 @@ url_manual_mapping = ( ("bpy.ops.sequencer.export_subtitles*", "video_editing/preview/introduction.html#bpy-ops-sequencer-export-subtitles"), ("bpy.ops.transform.edge_bevelweight*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-bevelweight"), ("bpy.ops.wm.previews_batch_generate*", "files/blend/previews.html#bpy-ops-wm-previews-batch-generate"), + ("bpy.types.bakesettings.cage_object*", "render/cycles/baking.html#bpy-types-bakesettings-cage-object"), ("bpy.types.brush.auto_smooth_factor*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-auto-smooth-factor"), ("bpy.types.brush.smooth_deform_type*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-smooth-deform-type"), ("bpy.types.brush.use_connected_only*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-use-connected-only"), @@ -688,6 +726,7 @@ url_manual_mapping = ( ("bpy.types.linestyle*modifier_noise*", "render/freestyle/parameter_editor/line_style/modifiers/color/noise.html#bpy-types-linestyle-modifier-noise"), ("bpy.types.maintainvolumeconstraint*", "animation/constraints/transform/maintain_volume.html#bpy-types-maintainvolumeconstraint"), ("bpy.types.mesh.use_mirror_topology*", "modeling/meshes/tools/tool_settings.html#bpy-types-mesh-use-mirror-topology"), + ("bpy.types.nodesocketinterface.name*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-name"), ("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"), ("bpy.types.sequencetransform.offset*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-offset"), ("bpy.types.shadernodebrightcontrast*", "render/shader_nodes/color/bright_contrast.html#bpy-types-shadernodebrightcontrast"), @@ -703,10 +742,14 @@ url_manual_mapping = ( ("bpy.types.vertexweighteditmodifier*", "modeling/modifiers/modify/weight_edit.html#bpy-types-vertexweighteditmodifier"), ("bpy.types.volumedisplay.slice_axis*", "modeling/volumes/properties.html#bpy-types-volumedisplay-slice-axis"), ("bpy.ops.anim.channels_clean_empty*", "editors/nla/editing.html#bpy-ops-anim-channels-clean-empty"), - ("bpy.ops.clip.set_center_principal*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-ops-clip-set-center-principal"), + ("bpy.ops.clip.apply_solution_scale*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-apply-solution-scale"), + ("bpy.ops.clip.set_center_principal*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-center-principal"), + ("bpy.ops.clip.setup_tracking_scene*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-setup-tracking-scene"), ("bpy.ops.curve.match_texture_space*", "modeling/meshes/uv/uv_texture_spaces.html#bpy-ops-curve-match-texture-space"), ("bpy.ops.font.text_paste_from_file*", "modeling/texts/editing.html#bpy-ops-font-text-paste-from-file"), ("bpy.ops.gpencil.frame_clean_loose*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-loose"), + ("bpy.ops.mesh.primitive_circle_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-circle-add"), + ("bpy.ops.mesh.primitive_monkey_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-monkey-add"), ("bpy.ops.mesh.select_face_by_sides*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-face-by-sides"), ("bpy.ops.mesh.shortest_path_select*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-shortest-path-select"), ("bpy.ops.mesh.vert_connect_concave*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-vert-connect-concave"), @@ -772,12 +815,17 @@ url_manual_mapping = ( ("bpy.types.viewlayer.use_freestyle*", "render/freestyle/view_layer.html#bpy-types-viewlayer-use-freestyle"), ("bpy.types.volumedisplay.use_slice*", "modeling/volumes/properties.html#bpy-types-volumedisplay-use-slice"), ("bpy.ops.armature.armature_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-armature-layers"), + ("bpy.ops.clip.stabilize_2d_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-select"), ("bpy.ops.gpencil.frame_clean_fill*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-fill"), ("bpy.ops.gpencil.stroke_subdivide*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-subdivide"), + ("bpy.ops.gpencil.vertex_color_hsv*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-hsv"), + ("bpy.ops.gpencil.vertex_color_set*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-set"), ("bpy.ops.graph.interpolation_type*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-interpolation-type"), ("bpy.ops.mesh.dissolve_degenerate*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-dissolve-degenerate"), ("bpy.ops.mesh.face_split_by_edges*", "modeling/meshes/editing/face/weld_edges_faces.html#bpy-ops-mesh-face-split-by-edges"), ("bpy.ops.mesh.mark_freestyle_face*", "modeling/meshes/editing/face/face_data.html#bpy-ops-mesh-mark-freestyle-face"), + ("bpy.ops.mesh.primitive_plane_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-plane-add"), + ("bpy.ops.mesh.primitive_torus_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-torus-add"), ("bpy.ops.mesh.select_non_manifold*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-non-manifold"), ("bpy.ops.object.constraints_clear*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-clear"), ("bpy.ops.object.quadriflow_remesh*", "modeling/meshes/retopology.html#bpy-ops-object-quadriflow-remesh"), @@ -797,6 +845,7 @@ url_manual_mapping = ( ("bpy.ops.uv.average_islands_scale*", "modeling/meshes/uv/editing.html#bpy-ops-uv-average-islands-scale"), ("bpy.ops.view3d.blenderkit_search*", "addons/3d_view/blenderkit.html#bpy-ops-view3d-blenderkit-search"), ("bpy.types.armature.pose_position*", "animation/armatures/properties/skeleton.html#bpy-types-armature-pose-position"), + ("bpy.types.bakesettings.use_clear*", "render/cycles/baking.html#bpy-types-bakesettings-use-clear"), ("bpy.types.brightcontrastmodifier*", "video_editing/sequencer/sidebar/modifiers.html#bpy-types-brightcontrastmodifier"), ("bpy.types.brush.cursor_color_add*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-color-add"), ("bpy.types.brush.pose_deform_type*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-pose-deform-type"), @@ -833,6 +882,7 @@ url_manual_mapping = ( ("bpy.types.objectsolverconstraint*", "animation/constraints/motion_tracking/object_solver.html#bpy-types-objectsolverconstraint"), ("bpy.types.opacitygpencilmodifier*", "grease_pencil/modifiers/color/opacity.html#bpy-types-opacitygpencilmodifier"), ("bpy.types.particlesystemmodifier*", "physics/particles/index.html#bpy-types-particlesystemmodifier"), + ("bpy.types.rendersettings.threads*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-threads"), ("bpy.types.sceneeevee.motion_blur*", "render/eevee/render_settings/motion_blur.html#bpy-types-sceneeevee-motion-blur"), ("bpy.types.sceneeevee.taa_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-samples"), ("bpy.types.sculpt.radial_symmetry*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-types-sculpt-radial-symmetry"), @@ -848,7 +898,7 @@ url_manual_mapping = ( ("bpy.types.volumerender.step_size*", "modeling/volumes/properties.html#bpy-types-volumerender-step-size"), ("bpy.types.weightednormalmodifier*", "modeling/modifiers/modify/weighted_normal.html#bpy-types-weightednormalmodifier"), ("bpy.ops.armature.autoside_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-autoside-names"), - ("bpy.ops.clip.create_plane_track*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-ops-clip-create-plane-track"), + ("bpy.ops.clip.create_plane_track*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-create-plane-track"), ("bpy.ops.curve.spline_weight_set*", "modeling/curves/editing/other.html#bpy-ops-curve-spline-weight-set"), ("bpy.ops.gpencil.blank_frame_add*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-blank-frame-add"), ("bpy.ops.gpencil.frame_duplicate*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-frame-duplicate"), @@ -861,7 +911,11 @@ url_manual_mapping = ( ("bpy.ops.mesh.extrude_faces_move*", "modeling/meshes/editing/face/extrude_individual_faces.html#bpy-ops-mesh-extrude-faces-move"), ("bpy.ops.mesh.faces_shade_smooth*", "modeling/meshes/editing/face/shading.html#bpy-ops-mesh-faces-shade-smooth"), ("bpy.ops.mesh.paint_mask_extract*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-extract"), + ("bpy.ops.mesh.primitive_cone_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cone-add"), + ("bpy.ops.mesh.primitive_cube_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cube-add"), + ("bpy.ops.mesh.primitive_grid_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-grid-add"), ("bpy.ops.mesh.subdivide_edgering*", "modeling/meshes/editing/edge/subdivide_edge_ring.html#bpy-ops-mesh-subdivide-edgering"), + ("bpy.ops.node.tree_socket_remove*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-remove"), ("bpy.ops.object.constraints_copy*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-copy"), ("bpy.ops.object.gpencil_modifier*", "grease_pencil/modifiers/index.html#bpy-ops-object-gpencil-modifier"), ("bpy.ops.object.make_single_user*", "scene_layout/object/editing/relations/make_single_user.html#bpy-ops-object-make-single-user"), @@ -885,6 +939,10 @@ url_manual_mapping = ( ("bpy.ops.wm.operator_cheat_sheet*", "advanced/operators.html#bpy-ops-wm-operator-cheat-sheet"), ("bpy.ops.wm.previews_batch_clear*", "files/blend/previews.html#bpy-ops-wm-previews-batch-clear"), ("bpy.types.armature.use_mirror_x*", "animation/armatures/bones/tools/tool_settings.html#bpy-types-armature-use-mirror-x"), + ("bpy.types.bakesettings.normal_b*", "render/cycles/baking.html#bpy-types-bakesettings-normal-b"), + ("bpy.types.bakesettings.normal_g*", "render/cycles/baking.html#bpy-types-bakesettings-normal-g"), + ("bpy.types.bakesettings.normal_r*", "render/cycles/baking.html#bpy-types-bakesettings-normal-r"), + ("bpy.types.bakesettings.use_cage*", "render/cycles/baking.html#bpy-types-bakesettings-use-cage"), ("bpy.types.brush.boundary_offset*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-offset"), ("bpy.types.brush.cloth_sim_limit*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-sim-limit"), ("bpy.types.brush.use_custom_icon*", "sculpt_paint/brush/brush.html#bpy-types-brush-use-custom-icon"), @@ -917,6 +975,8 @@ url_manual_mapping = ( ("bpy.types.offsetgpencilmodifier*", "grease_pencil/modifiers/deform/offset.html#bpy-types-offsetgpencilmodifier"), ("bpy.types.particlefluidsettings*", "physics/particles/emitter/physics/fluid.html#bpy-types-particlefluidsettings"), ("bpy.types.posebone.custom_shape*", "animation/armatures/bones/properties/display.html#bpy-types-posebone-custom-shape"), + ("bpy.types.rendersettings.tile_x*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-x"), + ("bpy.types.rendersettings.tile_y*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-y"), ("bpy.types.rigifyselectioncolors*", "addons/rigging/rigify/metarigs.html#bpy-types-rigifyselectioncolors"), ("bpy.types.sceneeevee.volumetric*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric"), ("bpy.types.sculpt.detail_percent*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-percent"), @@ -1005,6 +1065,8 @@ url_manual_mapping = ( ("bpy.types.volume.sequence_mode*", "modeling/volumes/properties.html#bpy-types-volume-sequence-mode"), ("bpy.types.volumetomeshmodifier*", "modeling/modifiers/generate/volume_to_mesh.html#bpy-types-volumetomeshmodifier"), ("bpy.types.whitebalancemodifier*", "video_editing/sequencer/sidebar/modifiers.html#bpy-types-whitebalancemodifier"), + ("bpy.ops.clip.clear_track_path*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-clear-track-path"), + ("bpy.ops.clip.set_scene_frames*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-scene-frames"), ("bpy.ops.curve.handle_type_set*", "modeling/curves/editing/control_points.html#bpy-ops-curve-handle-type-set"), ("bpy.ops.curve.spline_type_set*", "modeling/curves/editing/curve.html#bpy-ops-curve-spline-type-set"), ("bpy.ops.gpencil.move_to_layer*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-move-to-layer"), @@ -1019,6 +1081,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.paint_mask_slice*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-slice"), ("bpy.ops.mesh.select_ungrouped*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-ungrouped"), ("bpy.ops.node.tree_path_parent*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-path-parent"), + ("bpy.ops.node.tree_socket_move*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-move"), ("bpy.ops.object.duplicate_move*", "scene_layout/object/editing/duplicate.html#bpy-ops-object-duplicate-move"), ("bpy.ops.object.hook_add_selob*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook-add-selob"), ("bpy.ops.object.select_by_type*", "scene_layout/object/selecting.html#bpy-ops-object-select-by-type"), @@ -1044,6 +1107,8 @@ url_manual_mapping = ( ("bpy.ops.transform.edge_crease*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-crease"), ("bpy.ops.transform.skin_resize*", "modeling/meshes/editing/mesh/transform/skin_resize.html#bpy-ops-transform-skin-resize"), ("bpy.ops.uv.seams_from_islands*", "modeling/meshes/uv/editing.html#bpy-ops-uv-seams-from-islands"), + ("bpy.types.bakesettings.margin*", "render/cycles/baking.html#bpy-types-bakesettings-margin"), + ("bpy.types.bakesettings.target*", "render/cycles/baking.html#bpy-types-bakesettings-target"), ("bpy.types.brush.cloth_damping*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-damping"), ("bpy.types.brush.icon_filepath*", "sculpt_paint/brush/brush.html#bpy-types-brush-icon-filepath"), ("bpy.types.brush.smooth_stroke*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brush-smooth-stroke"), @@ -1102,7 +1167,7 @@ url_manual_mapping = ( ("bpy.ops.armature.bone_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-bone-layers"), ("bpy.ops.clip.add_marker_move*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-add-marker-move"), ("bpy.ops.clip.bundles_to_mesh*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-bundles-to-mesh"), - ("bpy.ops.clip.detect_features*", "movie_clip/tracking/clip/toolbar/track.html#bpy-ops-clip-detect-features"), + ("bpy.ops.clip.detect_features*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-detect-features"), ("bpy.ops.console.autocomplete*", "editors/python_console.html#bpy-ops-console-autocomplete"), ("bpy.ops.curve.dissolve_verts*", "modeling/curves/editing/curve.html#bpy-ops-curve-dissolve-verts"), ("bpy.ops.curve.duplicate_move*", "modeling/curves/editing/curve.html#bpy-ops-curve-duplicate-move"), @@ -1117,6 +1182,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.vertices_smooth*", "modeling/meshes/editing/vertex/smooth_vertices.html#bpy-ops-mesh-vertices-smooth"), ("bpy.ops.nla.make_single_user*", "editors/nla/editing.html#bpy-ops-nla-make-single-user"), ("bpy.ops.node.read_viewlayers*", "interface/controls/nodes/editing.html#bpy-ops-node-read-viewlayers"), + ("bpy.ops.node.tree_socket_add*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-add"), ("bpy.ops.object.data_transfer*", "scene_layout/object/editing/relations/transfer_mesh_data.html#bpy-ops-object-data-transfer"), ("bpy.ops.object.select_camera*", "scene_layout/object/selecting.html#bpy-ops-object-select-camera"), ("bpy.ops.object.select_linked*", "scene_layout/object/selecting.html#bpy-ops-object-select-linked"), @@ -1194,6 +1260,8 @@ url_manual_mapping = ( ("bpy.types.volumerender.space*", "modeling/volumes/properties.html#bpy-types-volumerender-space"), ("bpy.ops.anim.keyframe_clear*", "animation/keyframes/editing.html#bpy-ops-anim-keyframe-clear"), ("bpy.ops.armature.flip_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-flip-names"), + ("bpy.ops.clip.refine_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-refine-markers"), + ("bpy.ops.clip.select_grouped*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-grouped"), ("bpy.ops.clip.track_to_empty*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-track-to-empty"), ("bpy.ops.curve.cyclic_toggle*", "modeling/curves/editing/curve.html#bpy-ops-curve-cyclic-toggle"), ("bpy.ops.curve.primitive*add*", "modeling/curves/primitives.html#bpy-ops-curve-primitive-add"), @@ -1294,6 +1362,9 @@ url_manual_mapping = ( ("bpy.types.worldmistsettings*", "render/cycles/world_settings.html#bpy-types-worldmistsettings"), ("bpy.ops.anim.channels_move*", "editors/nla/editing.html#bpy-ops-anim-channels-move"), ("bpy.ops.buttons.toggle_pin*", "editors/properties_editor.html#bpy-ops-buttons-toggle-pin"), + ("bpy.ops.clip.filter_tracks*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-filter-tracks"), + ("bpy.ops.clip.select_circle*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-circle"), + ("bpy.ops.clip.track_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-track-markers"), ("bpy.ops.curve.extrude_move*", "modeling/curves/editing/control_points.html#bpy-ops-curve-extrude-move"), ("bpy.ops.curve.make_segment*", "modeling/curves/editing/control_points.html#bpy-ops-curve-make-segment"), ("bpy.ops.graph.euler_filter*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-euler-filter"), @@ -1308,7 +1379,6 @@ url_manual_mapping = ( ("bpy.ops.mesh.merge_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-merge-normals"), ("bpy.ops.mesh.normals_tools*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-normals-tools"), ("bpy.ops.mesh.point_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-point-normals"), - ("bpy.ops.mesh.primitive*add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-add"), ("bpy.ops.mesh.rip_edge_move*", "modeling/meshes/editing/vertex/rip_vertices_extend.html#bpy-ops-mesh-rip-edge-move"), ("bpy.ops.mesh.select_linked*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-select-linked"), ("bpy.ops.mesh.select_random*", "modeling/meshes/selecting/random.html#bpy-ops-mesh-select-random"), @@ -1396,6 +1466,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.select_loose*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-loose"), ("bpy.ops.mesh.vert_connect*", "modeling/meshes/editing/vertex/connect_vertex_pairs.html#bpy-ops-mesh-vert-connect"), ("bpy.ops.nla.tracks_delete*", "editors/nla/editing.html#bpy-ops-nla-tracks-delete"), + ("bpy.ops.node.group_insert*", "interface/controls/nodes/groups.html#bpy-ops-node-group-insert"), ("bpy.ops.object.lightprobe*", "render/eevee/light_probes/index.html#bpy-ops-object-lightprobe"), ("bpy.ops.object.make_links*", "scene_layout/object/editing/make_links.html#bpy-ops-object-make-links"), ("bpy.ops.object.make_local*", "files/linked_libraries/link_append.html#bpy-ops-object-make-local"), @@ -1514,6 +1585,8 @@ url_manual_mapping = ( ("bpy.ops.*.select_circle*", "interface/selecting.html#bpy-ops-select-circle"), ("bpy.ops.anim.keying_set*", "animation/keyframes/keying_sets.html#bpy-ops-anim-keying-set"), ("bpy.ops.armature.delete*", "animation/armatures/bones/editing/delete.html#bpy-ops-armature-delete"), + ("bpy.ops.clip.select_all*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-all"), + ("bpy.ops.clip.select_box*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-box"), ("bpy.ops.clip.set_origin*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-set-origin"), ("bpy.ops.curve.subdivide*", "modeling/curves/editing/segments.html#bpy-ops-curve-subdivide"), ("bpy.ops.ed.undo_history*", "interface/undo_redo.html#bpy-ops-ed-undo-history"), @@ -1739,6 +1812,7 @@ url_manual_mapping = ( ("bpy.ops.mesh.bisect*", "modeling/meshes/editing/mesh/bisect.html#bpy-ops-mesh-bisect"), ("bpy.ops.mesh.delete*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-delete"), ("bpy.ops.nla.move_up*", "editors/nla/editing.html#bpy-ops-nla-move-up"), + ("bpy.ops.object.bake*", "render/cycles/baking.html#bpy-ops-object-bake"), ("bpy.ops.object.hook*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook"), ("bpy.ops.object.join*", "scene_layout/object/editing/join.html#bpy-ops-object-join"), ("bpy.ops.object.text*", "modeling/texts/index.html#bpy-ops-object-text"), From 17daf917ee45b8824f5f3f663e1a1db618f73074 Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Thu, 11 Feb 2021 21:32:30 -0700 Subject: [PATCH 136/519] Cleanup: Remove unused outliner enum values Removes values from various Outliner context menu enums that were unused. Many of these had been commented out for years. Also deletes some unused code related to the removed enums. No functional changes. --- .../editors/space_outliner/outliner_intern.h | 15 --------------- .../editors/space_outliner/outliner_tools.c | 18 ------------------ 2 files changed, 33 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 339cc3068d0..b65b1a57143 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -388,21 +388,6 @@ void id_remap_fn(struct bContext *C, struct TreeStoreElem *tselem, void *user_data); -void item_object_mode_enter_fn(struct bContext *C, - struct ReportList *reports, - struct Scene *scene, - TreeElement *te, - struct TreeStoreElem *tsep, - struct TreeStoreElem *tselem, - void *user_data); -void item_object_mode_exit_fn(struct bContext *C, - struct ReportList *reports, - struct Scene *scene, - TreeElement *te, - struct TreeStoreElem *tsep, - struct TreeStoreElem *tselem, - void *user_data); - void outliner_set_coordinates(struct ARegion *region, struct SpaceOutliner *space_outliner); void outliner_item_openclose(struct SpaceOutliner *space_outliner, diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index 8b522d41af8..8bc32f5f3a7 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -1439,13 +1439,7 @@ enum { OL_OP_DESELECT, OL_OP_SELECT_HIERARCHY, OL_OP_REMAP, - OL_OP_LOCALIZED, /* disabled, see below */ - OL_OP_TOGVIS, - OL_OP_TOGSEL, - OL_OP_TOGREN, OL_OP_RENAME, - OL_OP_OBJECT_MODE_ENTER, - OL_OP_OBJECT_MODE_EXIT, OL_OP_PROXY_TO_OVERRIDE_CONVERT, }; @@ -1459,8 +1453,6 @@ static const EnumPropertyItem prop_object_op_types[] = { "Remap Users", "Make all users of selected data-blocks to use instead a new chosen one"}, {OL_OP_RENAME, "RENAME", 0, "Rename", ""}, - {OL_OP_OBJECT_MODE_ENTER, "OBJECT_MODE_ENTER", 0, "Enter Mode", ""}, - {OL_OP_OBJECT_MODE_EXIT, "OBJECT_MODE_EXIT", 0, "Exit Mode", ""}, {OL_OP_PROXY_TO_OVERRIDE_CONVERT, "OBJECT_PROXY_TO_OVERRIDE", 0, @@ -1525,11 +1517,6 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ } - else if (event == OL_OP_LOCALIZED) { /* disabled, see above enum (ton) */ - outliner_do_object_operation( - C, op->reports, scene, space_outliner, &space_outliner->tree, id_local_fn); - str = "Localized Objects"; - } else if (event == OL_OP_RENAME) { outliner_do_object_operation( C, op->reports, scene, space_outliner, &space_outliner->tree, item_rename_fn); @@ -2444,9 +2431,6 @@ typedef enum eOutliner_AnimDataOps { OUTLINER_ANIMOP_REFRESH_DRV, OUTLINER_ANIMOP_CLEAR_DRV - - /* OUTLINER_ANIMOP_COPY_DRIVERS, */ - /* OUTLINER_ANIMOP_PASTE_DRIVERS */ } eOutliner_AnimDataOps; static const EnumPropertyItem prop_animdata_op_types[] = { @@ -2458,8 +2442,6 @@ static const EnumPropertyItem prop_animdata_op_types[] = { {OUTLINER_ANIMOP_SET_ACT, "SET_ACT", 0, "Set Action", ""}, {OUTLINER_ANIMOP_CLEAR_ACT, "CLEAR_ACT", 0, "Unlink Action", ""}, {OUTLINER_ANIMOP_REFRESH_DRV, "REFRESH_DRIVERS", 0, "Refresh Drivers", ""}, - /* {OUTLINER_ANIMOP_COPY_DRIVERS, "COPY_DRIVERS", 0, "Copy Drivers", ""}, */ - /* {OUTLINER_ANIMOP_PASTE_DRIVERS, "PASTE_DRIVERS", 0, "Paste Drivers", ""}, */ {OUTLINER_ANIMOP_CLEAR_DRV, "CLEAR_DRIVERS", 0, "Clear Drivers", ""}, {0, NULL, 0, NULL, NULL}, }; From 17a37ed938e306582d0d8637e3c0fd277f823616 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 16:27:04 +1100 Subject: [PATCH 137/519] Fix brace placement from recent fix for T85581 ccea44e76bbd06309e0012ed3213a9028e8cb32c missed this expression. --- source/blender/editors/gpencil/gpencil_paint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index cf05cf4738a..aae00c6b5bd 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1234,7 +1234,7 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) /* change position relative to parent object */ gpencil_apply_parent(depsgraph, obact, gpl, gps); /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && ((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } From 2da649cc50b552996bd790dadc27ad1af437800f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 16:50:14 +1100 Subject: [PATCH 138/519] Cleanup: use doxy sections --- .../blender/blenkernel/intern/tracking_util.c | 24 ++++++++++++--- .../blender/editors/space_clip/clip_editor.c | 30 +++++++++++++++---- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c index ad2713b9977..ea0d92cf78e 100644 --- a/source/blender/blenkernel/intern/tracking_util.c +++ b/source/blender/blenkernel/intern/tracking_util.c @@ -60,7 +60,9 @@ # define CACHE_PRINTF(...) #endif -/*********************** Tracks map *************************/ +/* -------------------------------------------------------------------- */ +/** \name Tracks Map + * \{ */ TracksMap *tracks_map_new(const char *object_name, bool is_camera, @@ -242,7 +244,11 @@ void tracks_map_free(TracksMap *map, void (*customdata_free)(void *customdata)) MEM_freeN(map); } -/*********************** Space transformation functions *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Space Transformation Functions + * \{ */ /* Three coordinate frames: Frame, Search, and Marker * Two units: Pixels, Unified @@ -399,7 +405,11 @@ void tracking_set_marker_coords_from_tracking(int frame_width, marker->pos[1] += marker_unified[1]; } -/*********************** General purpose utility functions *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name General Purpose Utility Functions + * \{ */ /* Place a disabled marker before or after specified ref_marker. * @@ -613,7 +623,11 @@ MovieTrackingMarker *tracking_get_keyframed_marker(MovieTrackingTrack *track, return marker_keyed; } -/*********************** Frame accessr *************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Frame Accessor + * \{ */ static ImBuf *accessor_get_preprocessed_ibuf(TrackingImageAccessor *accessor, int clip_index, @@ -936,3 +950,5 @@ void tracking_image_accessor_destroy(TrackingImageAccessor *accessor) MEM_freeN(accessor->tracks); MEM_freeN(accessor); } + +/** \} */ diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index af1d082d317..e1172458f67 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -67,7 +67,9 @@ #include "clip_intern.h" /* own include */ -/* ******** operactor poll functions ******** */ +/* -------------------------------------------------------------------- */ +/** \name Operator Poll Functions + * \{ */ bool ED_space_clip_poll(bContext *C) { @@ -128,7 +130,11 @@ bool ED_space_clip_maskedit_mask_poll(bContext *C) return false; } -/* ******** common editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common Editing Functions + * \{ */ void ED_space_clip_get_size(SpaceClip *sc, int *width, int *height) { @@ -538,7 +544,11 @@ bool ED_space_clip_check_show_maskedit(SpaceClip *sc) return false; } -/* ******** clip editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Clip Editing Functions + * \{ */ MovieClip *ED_space_clip_get_clip(SpaceClip *sc) { @@ -595,7 +605,11 @@ void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieCl } } -/* ******** masking editing functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Masking Editing Functions + * \{ */ Mask *ED_space_clip_get_mask(SpaceClip *sc) { @@ -613,7 +627,11 @@ void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask) } } -/* ******** pre-fetching functions ******** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pre-Fetching Functions + * \{ */ typedef struct PrefetchJob { MovieClip *clip; @@ -1121,3 +1139,5 @@ void ED_clip_view_lock_state_restore_no_jump(const bContext *C, const ClipViewLo space_clip->xlockof = state->offset_x + state->lock_offset_x - offset_x; space_clip->ylockof = state->offset_y + state->lock_offset_y - offset_y; } + +/** \} */ From 69e9e45744b11c91626869f1ade72a07c296d387 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 17:03:20 +1100 Subject: [PATCH 139/519] Cleanup: macro hygiene, use parenthesis around operators --- intern/cycles/kernel/kernel_types.h | 2 +- intern/utfconv/utfconv.h | 8 ++++---- source/blender/blenlib/intern/fileops.c | 2 +- source/blender/bmesh/tools/bmesh_bevel.c | 4 ++-- source/blender/bmesh/tools/bmesh_intersect_edges.c | 2 +- .../engines/overlay/shaders/edit_curve_handle_geom.glsl | 4 ++-- .../engines/overlay/shaders/edit_curve_point_vert.glsl | 2 +- source/blender/draw/intern/draw_cache_impl_curve.c | 6 +++--- source/blender/draw/intern/draw_cache_impl_gpencil.c | 2 +- source/blender/draw/intern/draw_hair_private.h | 2 +- source/creator/creator_intern.h | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 82cc11922e0..df56360b1df 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1700,7 +1700,7 @@ typedef struct WorkTile { } WorkTile; /* Pre-computed sample table sizes for PMJ02 sampler. */ -#define NUM_PMJ_SAMPLES 64 * 64 +#define NUM_PMJ_SAMPLES (64 * 64) #define NUM_PMJ_PATTERNS 48 CCL_NAMESPACE_END diff --git a/intern/utfconv/utfconv.h b/intern/utfconv/utfconv.h index 6470802bedf..36dff288966 100644 --- a/intern/utfconv/utfconv.h +++ b/intern/utfconv/utfconv.h @@ -46,11 +46,11 @@ size_t count_utf_16_from_8(const char *string8); /** * conv_utf_*** errors */ -#define UTF_ERROR_NULL_IN 1 << 0 /* Error occures when requered parameter is missing*/ -#define UTF_ERROR_ILLCHAR 1 << 1 /* Error if character is in illigal UTF rage*/ +#define UTF_ERROR_NULL_IN (1 << 0) /* Error occures when requered parameter is missing*/ +#define UTF_ERROR_ILLCHAR (1 << 1) /* Error if character is in illigal UTF rage*/ #define UTF_ERROR_SMALL \ - 1 << 2 /* Passed size is to small. It gives legal string with character missing at the end*/ -#define UTF_ERROR_ILLSEQ 1 << 3 /* Error if sequence is broken and doesn't finish*/ + (1 << 2) /* Passed size is to small. It gives legal string with character missing at the end */ +#define UTF_ERROR_ILLSEQ (1 << 3) /* Error if sequence is broken and doesn't finish*/ /** * Converts utf-16 string to allocated utf-8 string diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index bb218995c83..106bd5bc793 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -158,7 +158,7 @@ char *BLI_file_ungzip_to_mem(const char *from_file, int *r_size) return mem; } -#define CHUNK 256 * 1024 +#define CHUNK (256 * 1024) /* gzip byte array from memory and write it to file at certain position. * return size of gzip stream. diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 0de909b5556..a17724895f1 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -58,9 +58,9 @@ #define BEVEL_EPSILON_ANG DEG2RADF(2.0f) #define BEVEL_SMALL_ANG DEG2RADF(10.0f) /** Difference in dot products that corresponds to 10 degree difference between vectors. */ -#define BEVEL_SMALL_ANG_DOT 1 - cosf(BEVEL_SMALL_ANG) +#define BEVEL_SMALL_ANG_DOT (1.0f - cosf(BEVEL_SMALL_ANG)) /** Difference in dot products that corresponds to 2.0 degree difference between vectors. */ -#define BEVEL_EPSILON_ANG_DOT 1 - cosf(BEVEL_EPSILON_ANG) +#define BEVEL_EPSILON_ANG_DOT (1.0f - cosf(BEVEL_EPSILON_ANG)) #define BEVEL_MAX_ADJUST_PCT 10.0f #define BEVEL_MAX_AUTO_ADJUST_PCT 300.0f #define BEVEL_MATCH_SPEC_WEIGHT 0.2 diff --git a/source/blender/bmesh/tools/bmesh_intersect_edges.c b/source/blender/bmesh/tools/bmesh_intersect_edges.c index 5e266fdac0e..1e9adea2615 100644 --- a/source/blender/bmesh/tools/bmesh_intersect_edges.c +++ b/source/blender/bmesh/tools/bmesh_intersect_edges.c @@ -39,7 +39,7 @@ #define KDOP_TREE_TYPE 4 #define KDOP_AXIS_LEN 14 -#define BLI_STACK_PAIR_LEN 2 * KDOP_TREE_TYPE +#define BLI_STACK_PAIR_LEN (2 * KDOP_TREE_TYPE) /* -------------------------------------------------------------------- */ /** \name Weld Linked Wire Edges into Linked Faces diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl index ad791a9416d..036efa41555 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl @@ -1,7 +1,7 @@ /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */ -#define ACTIVE_NURB 1 << 2 -#define EVEN_U_BIT 1 << 4 +#define ACTIVE_NURB (1 << 2) +#define EVEN_U_BIT (1 << 4) #define COLOR_SHIFT 5 /* Keep the same value in `handle_display` in `DNA_view3d_types.h` */ diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl index 64cc1b7d840..5f2154f00b8 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl @@ -1,6 +1,6 @@ /* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */ -#define BEZIER_HANDLE 1 << 3 +#define BEZIER_HANDLE (1 << 3) /* Keep the same value in `handle_display` in `DNA_view3d_types.h` */ #define CURVE_HANDLE_SELECTED 0 diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c index 3ccada23d47..e9558fb320c 100644 --- a/source/blender/draw/intern/draw_cache_impl_curve.c +++ b/source/blender/draw/intern/draw_cache_impl_curve.c @@ -50,9 +50,9 @@ /* See: edit_curve_point_vert.glsl for duplicate includes. */ #define SELECT 1 -#define ACTIVE_NURB 1 << 2 -#define BEZIER_HANDLE 1 << 3 -#define EVEN_U_BIT 1 << 4 /* Alternate this bit for every U vert. */ +#define ACTIVE_NURB (1 << 2) +#define BEZIER_HANDLE (1 << 3) +#define EVEN_U_BIT (1 << 4) /* Alternate this bit for every U vert. */ #define COLOR_SHIFT 5 /* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */ diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c index 8feacf8b026..c07271a0d33 100644 --- a/source/blender/draw/intern/draw_cache_impl_gpencil.c +++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c @@ -44,7 +44,7 @@ #include "draw_cache.h" #include "draw_cache_impl.h" -#define BEZIER_HANDLE 1 << 3 +#define BEZIER_HANDLE (1 << 3) #define COLOR_SHIFT 5 /* ---------------------------------------------------------------------- */ diff --git a/source/blender/draw/intern/draw_hair_private.h b/source/blender/draw/intern/draw_hair_private.h index 33abae156cc..28bd5d4dfb5 100644 --- a/source/blender/draw/intern/draw_hair_private.h +++ b/source/blender/draw/intern/draw_hair_private.h @@ -24,7 +24,7 @@ #pragma once #define MAX_LAYER_NAME_CT 4 /* u0123456789, u, au, a0123456789 */ -#define MAX_LAYER_NAME_LEN GPU_MAX_SAFE_ATTR_NAME + 2 +#define MAX_LAYER_NAME_LEN (GPU_MAX_SAFE_ATTR_NAME + 2) #define MAX_THICKRES 2 /* see eHairType */ #define MAX_HAIR_SUBDIV 4 /* see hair_subdiv rna */ diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h index 0a13f45eef1..bcc8a15355a 100644 --- a/source/creator/creator_intern.h +++ b/source/creator/creator_intern.h @@ -73,7 +73,7 @@ enum { /* for the callbacks: */ #ifndef WITH_PYTHON_MODULE # define BLEND_VERSION_FMT "Blender %d.%02d.%d" -# define BLEND_VERSION_ARG BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_VERSION_PATCH +# define BLEND_VERSION_ARG (BLENDER_VERSION / 100), (BLENDER_VERSION % 100), BLENDER_VERSION_PATCH #endif #ifdef WITH_BUILDINFO_HEADER From 474947c465d5c78b548669795095663b4970b718 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 17:05:50 +1100 Subject: [PATCH 140/519] Cleanup: clang-format --- intern/opencolorio/ocio_capi.cc | 2 +- intern/opencolorio/ocio_capi.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc index a7416f82b91..49231dee501 100644 --- a/intern/opencolorio/ocio_capi.cc +++ b/intern/opencolorio/ocio_capi.cc @@ -210,7 +210,7 @@ void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_Pac } void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, - OCIO_PackedImageDesc *img) + OCIO_PackedImageDesc *img) { impl->cpuProcessorApply_predivide(cpu_processor, img); } diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h index 8b319d4ed68..404154064b4 100644 --- a/intern/opencolorio/ocio_capi.h +++ b/intern/opencolorio/ocio_capi.h @@ -163,10 +163,11 @@ void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *cpu_processor); OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, - OCIO_PackedImageDesc *img); + OCIO_PackedImageDesc *img); void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); -void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel); +void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel); void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *processor); const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs); From fea335fe8bd01675243953e41f59f156e44f1e94 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 17:44:51 +1100 Subject: [PATCH 141/519] Cleanup: spelling --- source/blender/blenkernel/BKE_cloth.h | 10 ++--- source/blender/blenkernel/intern/mesh_merge.c | 11 +++--- source/blender/blenloader/intern/readfile.c | 4 +- .../blenloader/intern/versioning_260.c | 2 +- .../blenloader/intern/versioning_270.c | 2 +- .../draw/engines/eevee/eevee_sampling.c | 2 +- .../draw/engines/workbench/workbench_render.c | 2 +- .../editors/animation/anim_channels_defines.c | 2 +- source/blender/editors/gpencil/gpencil_data.c | 2 +- .../blender/editors/gpencil/gpencil_intern.h | 2 +- .../blender/editors/gpencil/gpencil_paint.c | 4 +- .../editors/gpencil/gpencil_primitive.c | 2 +- .../blender/editors/gpencil/gpencil_select.c | 2 +- .../editors/include/ED_keyframes_edit.h | 2 +- source/blender/editors/include/UI_interface.h | 2 +- source/blender/editors/interface/view2d.c | 4 +- source/blender/editors/object/object_add.c | 2 +- source/blender/editors/sculpt_paint/sculpt.c | 4 +- .../blender/editors/space_clip/clip_buttons.c | 2 +- .../blender/editors/space_clip/tracking_ops.c | 2 +- source/blender/editors/space_file/filesel.c | 4 +- .../editors/space_outliner/space_outliner.c | 2 +- .../space_view3d/view3d_gizmo_camera.c | 2 +- .../editors/transform/transform_snap.c | 2 +- .../blender/io/collada/DocumentImporter.cpp | 2 +- source/blender/makesdna/DNA_ID.h | 4 +- source/blender/makesdna/DNA_action_types.h | 6 +-- source/blender/makesdna/DNA_armature_types.h | 37 ++++++++++--------- source/blender/makesdna/DNA_cloth_types.h | 6 +-- .../blender/makesdna/DNA_constraint_types.h | 4 +- source/blender/makesdna/DNA_curve_types.h | 4 +- source/blender/makesdna/DNA_material_types.h | 4 +- source/blender/makesdna/DNA_meta_types.h | 6 +-- source/blender/makesdna/DNA_modifier_types.h | 10 +++-- source/blender/makesdna/DNA_movieclip_types.h | 2 +- source/blender/makesdna/DNA_node_types.h | 4 +- .../blender/makesdna/DNA_object_force_types.h | 2 +- source/blender/makesdna/DNA_particle_types.h | 4 +- source/blender/makesdna/DNA_rigidbody_types.h | 14 +++---- source/blender/makesdna/DNA_scene_types.h | 24 ++++++------ source/blender/makesdna/DNA_screen_types.h | 6 +-- source/blender/makesdna/DNA_space_types.h | 2 +- source/blender/makesdna/DNA_tracking_types.h | 2 +- source/blender/makesdna/DNA_userdef_types.h | 2 +- source/blender/makesrna/intern/rna_tracking.c | 2 +- .../windowmanager/intern/wm_toolsystem.c | 2 +- 46 files changed, 115 insertions(+), 109 deletions(-) diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index e9267955d70..04fcdd6ed6f 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -131,13 +131,13 @@ typedef struct ClothVertex { * The definition of a spring. */ typedef struct ClothSpring { - int ij; /* Pij from the paper, one end of the spring. */ - int kl; /* Pkl from the paper, one end of the spring. */ + int ij; /* `Pij` from the paper, one end of the spring. */ + int kl; /* `Pkl` from the paper, one end of the spring. */ int mn; /* For hair springs: third vertex index; For bending springs: edge index; */ int *pa; /* Array of vert indices for poly a (for bending springs). */ int *pb; /* Array of vert indices for poly b (for bending springs). */ - int la; /* Length of *pa. */ - int lb; /* Length of *pb. */ + int la; /* Length of `*pa`. */ + int lb; /* Length of `*pb`. */ float restlen; /* The original length of the spring. */ float restang; /* The original angle of the bending springs. */ int type; /* Types defined in BKE_cloth.h ("springType"). */ @@ -208,7 +208,7 @@ typedef enum { /* SPRING FLAGS */ typedef enum { CLOTH_SPRING_FLAG_DEACTIVATE = (1 << 1), - CLOTH_SPRING_FLAG_NEEDED = (1 << 2), // springs has values to be applied + CLOTH_SPRING_FLAG_NEEDED = (1 << 2), /* Springs has values to be applied. */ } CLOTH_SPRINGS_FLAGS; ///////////////////////////////////////////////// diff --git a/source/blender/blenkernel/intern/mesh_merge.c b/source/blender/blenkernel/intern/mesh_merge.c index e118c1b6f6e..e3b5e5ea434 100644 --- a/source/blender/blenkernel/intern/mesh_merge.c +++ b/source/blender/blenkernel/intern/mesh_merge.c @@ -377,8 +377,8 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, BLI_gset_insert(poly_gset, mpgh); } - /* Can we optimise by reusing an old pmap ? How do we know an old pmap is stale ? */ - /* When called by MOD_array.c, the cddm has just been created, so it has no valid pmap. */ + /* Can we optimize by reusing an old `pmap`? How do we know an old `pmap` is stale? */ + /* When called by `MOD_array.c` the `cddm` has just been created, so it has no valid `pmap`. */ BKE_mesh_vert_poly_map_create( &poly_map, &poly_map_mem, mesh->mpoly, mesh->mloop, totvert, totpoly, totloop); } /* done preparing for fast poly compare */ @@ -411,9 +411,10 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, continue; } if (merge_mode == MESH_MERGE_VERTS_DUMP_IF_EQUAL) { - /* Additional condition for face dump: target vertices must make up an identical face */ - /* The test has 2 steps: (1) first step is fast ghash lookup, but not failproof */ - /* (2) second step is thorough but more costly poly compare */ + /* Additional condition for face dump: target vertices must make up an identical face. + * The test has 2 steps: + * 1) first step is fast `ghash` lookup, but not fail-proof. + * 2) second step is thorough but more costly poly compare. */ int i_poly, v_target; bool found = false; PolyKey pkey; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c90572a68a6..6528e1cdf79 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2740,7 +2740,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View v3d->localvd->camera = scene->camera; - /* Localview can become invalid during undo/redo steps, + /* Local-view can become invalid during undo/redo steps, * so we exit it when no could be found. */ for (base = view_layer->object_bases.first; base; base = base->next) { if (base->local_view_bits & v3d->local_view_uuid) { @@ -2752,7 +2752,7 @@ static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, View v3d->localvd = NULL; v3d->local_view_uuid = 0; - /* Regionbase storage is different depending if the space is active. */ + /* Region-base storage is different depending if the space is active. */ ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase; LISTBASE_FOREACH (ARegion *, region, regionbase) { diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c index 3b9ad64770d..7c5eefa60f7 100644 --- a/source/blender/blenloader/intern/versioning_260.c +++ b/source/blender/blenloader/intern/versioning_260.c @@ -75,7 +75,7 @@ # include "BKE_writeffmpeg.h" #endif -#include "IMB_imbuf.h" /* for proxy / timecode versioning stuff */ +#include "IMB_imbuf.h" /* for proxy / time-code versioning stuff. */ #include "NOD_common.h" #include "NOD_texture.h" diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index d8ab8d6f32a..d86ddc5b646 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1429,7 +1429,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain) } if (clip->tracking.stabilization.scale == 0.0f) { /* ensure init. - * Was previously used for autoscale only, + * Was previously used for auto-scale only, * now used always (as "target scale") */ clip->tracking.stabilization.scale = 1.0f; } diff --git a/source/blender/draw/engines/eevee/eevee_sampling.c b/source/blender/draw/engines/eevee/eevee_sampling.c index aa11f072fa5..da4bd20106c 100644 --- a/source/blender/draw/engines/eevee/eevee_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_sampling.c @@ -38,7 +38,7 @@ void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3]) BLI_halton_3d(ht_primes, ht_offset, sample_ofs, ht_point); - /* Decorelate AA and shadow samples. (see T68594) */ + /* De-correlate AA and shadow samples. (see T68594) */ ht_point[0] = fmod(ht_point[0] * 1151.0, 1.0); ht_point[1] = fmod(ht_point[1] * 1069.0, 1.0); ht_point[2] = fmod(ht_point[2] * 1151.0, 1.0); diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index 47592578c34..f2d178f6565 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -54,7 +54,7 @@ static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *deps /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */ struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re)); - /* Set the persective, view and window matrix. */ + /* Set the perspective, view and window matrix. */ float winmat[4][4], viewmat[4][4], viewinv[4][4]; RE_GetCameraWindow(engine->re, ob_camera_eval, winmat); diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index 24bb58535a5..2bfa417eb78 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -4161,7 +4161,7 @@ static void ANIM_init_channel_typeinfo_data(void) /* Get type info from given channel type */ const bAnimChannelType *ANIM_channel_get_typeinfo(bAnimListElem *ale) { - /* santiy checks */ + /* Sanity checks. */ if (ale == NULL) { return NULL; } diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 3be913f342d..d33545f5b22 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -2022,7 +2022,7 @@ static void gpencil_brush_delete_mode_brushes(Main *bmain, } } - /* Before delete, unpinn any material of the brush. */ + /* Before delete, un-pin any material of the brush. */ if ((brush->gpencil_settings) && (brush->gpencil_settings->material != NULL)) { brush->gpencil_settings->material = NULL; brush->gpencil_settings->flag &= ~GP_BRUSH_MATERIAL_PINNED; diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index 5fea46626d5..f3e6129b8ae 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -341,7 +341,7 @@ bool gpencil_brush_create_presets_poll(bContext *C); extern ListBase gpencil_strokes_copypastebuf; -/* Build a map for converting between old colornames and destination-color-refs */ +/* Build a map for converting between old color-names and destination-color-refs. */ struct GHash *gpencil_copybuf_validate_colormap(struct bContext *C); /* Stroke Editing ------------------------------------ */ diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 7e0fd2f2675..20bed64178a 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -149,9 +149,9 @@ typedef struct tGPsdata { Scene *scene; struct Depsgraph *depsgraph; - /** current object. */ + /** Current object. */ Object *ob; - /** Obeject eval. */ + /** Evaluated object. */ Object *ob_eval; /** window where painting originated. */ wmWindow *win; diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index db0b9dd035f..251aece687a 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -1276,7 +1276,7 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent * /* set cursor to indicate modal */ WM_cursor_modal_set(win, WM_CURSOR_CROSS); - /* update sindicator in header */ + /* Updates indicator in header. */ gpencil_primitive_status_indicators(C, tgpi); DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL); diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index a00d21bf88a..a85b84f462f 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -645,7 +645,7 @@ static bool gpencil_select_same_material(bContext *C) CTX_DATA_END; } - /* free memomy */ + /* Free memory. */ if (selected_colors != NULL) { BLI_gset_free(selected_colors, NULL); } diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h index 63f124798aa..cf90a21f799 100644 --- a/source/blender/editors/include/ED_keyframes_edit.h +++ b/source/blender/editors/include/ED_keyframes_edit.h @@ -300,7 +300,7 @@ short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt); */ void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt); -/* ------ 1.5-D Region Testing Uitls (Lasso/Circle Select) ------- */ +/* ------ 1.5-D Region Testing Utilities (Lasso/Circle Select) ------- */ /* XXX: These are temporary, * until we can unify GP/Mask Keyframe handling and standard FCurve Keyframe handling */ diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 066d262cc44..67cd4f020be 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -106,7 +106,7 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle; typedef enum eUIEmbossType { UI_EMBOSS = 0, /* use widget style for drawing */ UI_EMBOSS_NONE = 1, /* Nothing, only icon and/or text */ - UI_EMBOSS_PULLDOWN = 2, /* Pulldown menu style */ + UI_EMBOSS_PULLDOWN = 2, /* Pull-down menu style */ UI_EMBOSS_RADIAL = 3, /* Pie Menu */ /** * The same as #UI_EMBOSS_NONE, unless the button has diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 59aee0fde29..e4dad0f1a53 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -616,7 +616,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize) if ((width != curwidth) || (height != curheight)) { float temp, dh; - /* resize from centerpoint, unless otherwise specified */ + /* Resize from center-point, unless otherwise specified. */ if (width != curwidth) { if (v2d->keepofs & V2D_LOCKOFS_X) { cur->xmax += width - BLI_rctf_size_x(cur); @@ -1058,7 +1058,7 @@ void UI_view2d_zoom_cache_reset(void) /* While scaling we can accumulate fonts at many sizes (~20 or so). * Not an issue with embedded font, but can use over 500Mb with i18n ones! See T38244. */ - /* note: only some views draw text, we could check for this case to avoid clearning cache */ + /* Note: only some views draw text, we could check for this case to avoid cleaning cache. */ BLF_cache_clear(); } diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index b6b6dcfaa59..5c69e21e14e 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -2300,7 +2300,7 @@ static void make_object_duplilist_real(bContext *C, /* OK to keep most of the members uninitialized, * they won't be read, this is simply for a hash lookup. */ DupliObject dob_key; - /* We are looking one step upper in hierarchy, so we need to 'shift' the persitent_id, + /* We are looking one step upper in hierarchy, so we need to 'shift' the `persistent_id`, * ignoring the first item. * We only check on persistent_id here, since we have no idea what object it might be. */ memcpy(&dob_key.persistent_id[0], diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index d1028e5f542..1b19fa2b976 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -6485,7 +6485,7 @@ static void do_tiled( } } - /* First do the "untiled" position to initialize the stroke for this location. */ + /* First do the "un-tiled" position to initialize the stroke for this location. */ cache->tile_pass = 0; action(sd, ob, brush, ups); @@ -9706,7 +9706,7 @@ static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wm copy_m4_m4(cd->gizmo_mat, cursor_trans); mul_m4_m4_post(cd->gizmo_mat, cursor_rot); - /* Initize the position of the triangle vertices. */ + /* Initialize the position of the triangle vertices. */ const float y_axis[3] = {0.0f, cd->radius, 0.0f}; for (int i = 0; i < 3; i++) { zero_v3(cd->preview_tri[i]); diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c index 632f3c5147f..d555238e949 100644 --- a/source/blender/editors/space_clip/clip_buttons.c +++ b/source/blender/editors/space_clip/clip_buttons.c @@ -804,7 +804,7 @@ void uiTemplateMovieclipInformation(uiLayout *layout, ImBuf *ibuf = BKE_movieclip_get_ibuf_flag(clip, user, clip->flag, MOVIECLIP_CACHE_SKIP); int width, height; - /* Display frame dimensions, channels number and byffer type. */ + /* Display frame dimensions, channels number and buffer type. */ BKE_movieclip_get_size(clip, user, &width, &height); char str[1024]; diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index a903aeed380..bcac4d94bf0 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -110,7 +110,7 @@ static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event) ARegion *region = CTX_wm_region(C); if (!RNA_struct_property_is_set(op->ptr, "location")) { - /* If location is not set, use mouse positio nas default. */ + /* If location is not set, use mouse position as default. */ float co[2]; ED_clip_mouse_pos(sc, region, event->mval, co); RNA_float_set_array(op->ptr, "location", co); diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index 6e5791cad52..6917893ab5f 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -280,7 +280,7 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile) params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_VOLUME : 0; } if ((prop = RNA_struct_find_property(op->ptr, "filter_glob"))) { - /* Protection against pyscripts not setting proper size limit... */ + /* Protection against Python scripts not setting proper size limit. */ char *tmp = RNA_property_string_get_alloc( op->ptr, prop, params->filter_glob, sizeof(params->filter_glob), NULL); if (tmp != params->filter_glob) { @@ -418,7 +418,7 @@ static void fileselect_refresh_asset_params(FileAssetSelectParams *asset_params) FileSelectParams *base_params = &asset_params->base_params; bUserAssetLibrary *user_library = NULL; - /* Ensure valid repo, or fall-back to local one. */ + /* Ensure valid repository, or fall-back to local one. */ if (library->type == FILE_ASSET_LIBRARY_CUSTOM) { BLI_assert(library->custom_library_index >= 0); diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 87f81a2cc0e..5fde6e381e0 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -401,7 +401,7 @@ static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_i /* Some early out checks. */ if (!TREESTORE_ID_TYPE(old_id)) { - return; /* ID type is not used by outilner... */ + return; /* ID type is not used by outliner. */ } if (space_outliner->search_tse.id == old_id) { diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.c b/source/blender/editors/space_view3d/view3d_gizmo_camera.c index a9928fa2dc0..20d766357e8 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_camera.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.c @@ -242,7 +242,7 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup) WM_gizmo_target_property_def_rna_ptr(widget, gz_prop_type, &camera_ptr, prop, -1); } - /* This could be handled more elegently (split into two gizmo groups). */ + /* This could be handled more elegantly (split into two gizmo groups). */ if ((v3d->gizmo_show_camera & V3D_GIZMO_SHOW_CAMERA_LENS) == 0) { WM_gizmo_set_flag(cagzgroup->focal_len, WM_GIZMO_HIDDEN, true); WM_gizmo_set_flag(cagzgroup->ortho_scale, WM_GIZMO_HIDDEN, true); diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 6d04de34016..d0f91802fff 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -461,7 +461,7 @@ void applySnapping(TransInfo *t, float *vec) activeSnap(t)) { double current = PIL_check_seconds_timer(); - /* Time base quirky code to go around findnearest slowness */ + /* Time base quirky code to go around find-nearest slowness. */ /* TODO: add exception for object mode, no need to slow it down then. */ if (current - t->tsnap.last >= 0.01) { t->tsnap.calcSnap(t, vec); diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp index 259bf901091..214b5207a96 100644 --- a/source/blender/io/collada/DocumentImporter.cpp +++ b/source/blender/io/collada/DocumentImporter.cpp @@ -657,7 +657,7 @@ std::vector *DocumentImporter::write_node(COLLADAFW::Node *node, } } - /* XXX: if there're multiple instances, only one is stored */ + /* XXX: if there are multiple instances, only one is stored. */ if (!ob) { goto finally; diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 00d0d4e3626..9d01617905f 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -467,7 +467,7 @@ typedef struct PreviewImage { } \ ((void)0) -/** id->flag (persitent). */ +/** id->flag (persistent). */ enum { /** Don't delete the datablock even if unused. */ LIB_FAKEUSER = 1 << 9, @@ -534,7 +534,7 @@ enum { /* tag data-block as having an extra user. */ LIB_TAG_EXTRAUSER = 1 << 2, - /* tag data-block as having actually increased usercount for the extra virtual user. */ + /* tag data-block as having actually increased user-count for the extra virtual user. */ LIB_TAG_EXTRAUSER_SET = 1 << 7, /* RESET_AFTER_USE tag newly duplicated/copied IDs. diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 96245e3b067..27374c451e9 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -290,13 +290,13 @@ typedef struct bPoseChannel { /** Matrix result of loc/quat/size, and where we put deform in, see next line */ float chan_mat[4][4]; /** - * Constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat + * Constraints accumulate here. in the end, `pose_mat = bone->arm_mat * chan_mat` * this matrix is object space. */ float pose_mat[4][4]; /** For display, pose_mat with bone length applied. */ float disp_mat[4][4]; - /** For display, pose_mat with bone length applied and translated to tai.l*/ + /** For display, pose_mat with bone length applied and translated to tail. */ float disp_tail_mat[4][4]; /** * Inverse result of constraints. @@ -653,7 +653,7 @@ typedef enum eActionGroup_Flag { * that affects a group of related settings (as defined by the user). */ typedef struct bAction { - /** ID-serialisation for relinking. */ + /** ID-serialization for relinking. */ ID id; /** Function-curves (FCurve). */ diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index de2d56bb264..09304ce09f2 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -42,23 +42,23 @@ struct AnimData; */ typedef struct Bone { - /** Next/prev elements within this list. */ + /** Next/previous elements within this list. */ struct Bone *next, *prev; /** User-Defined Properties on this Bone. */ IDProperty *prop; - /** Parent (ik parent if appropriate flag is set. */ + /** Parent (IK parent if appropriate flag is set). */ struct Bone *parent; - /** Children . */ + /** Children. */ ListBase childbase; - /** Name of the bone - must be unique within the armature, MAXBONENAME. */ + /** Name of the bone - must be unique within the armature, MAXBONENAME. */ char name[64]; - /** roll is input for editmode, length calculated. */ + /** Roll is input for edit-mode, length calculated. */ float roll; float head[3]; - /** head/tail and roll in Bone Space . */ + /** Head/tail and roll in Bone Space. */ float tail[3]; - /** rotation derived from head/tail/roll. */ + /** Rotation derived from head/tail/roll. */ float bone_mat[3][3]; int flag; @@ -67,21 +67,24 @@ typedef struct Bone { char _pad[7]; float arm_head[3]; - /** head/tail in Armature Space (rest pos). */ + /** Head/tail in Armature Space (rest pose). */ float arm_tail[3]; - /** matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest po.s*/ + /** Matrix: `(bonemat(b)+head(b))*arm_mat(b-1)`, rest pose. */ float arm_mat[4][4]; - /** Roll in Armature Space (rest pos). */ + /** Roll in Armature Space (rest pose). */ float arm_roll; - /** dist, weight: for non-deformgroup deforms. */ + /** dist, weight: for non-deformgroup deforms. */ float dist, weight; - /** width: for block bones. keep in this order, transform!. */ + /** width: for block bones. keep in this order, transform!. */ float xwidth, length, zwidth; - /** Radius for head/tail sphere, defining deform as well, parent->rad_tip overrides rad_head. */ + /** + * Radius for head/tail sphere, defining deform as well, + * `parent->rad_tip` overrides `rad_head`. + */ float rad_head, rad_tail; - /** Curved bones settings - these define the "restpose" for a curved bone. */ + /** Curved bones settings - these define the "rest-pose" for a curved bone. */ float roll1, roll2; float curve_in_x, curve_in_y; float curve_out_x, curve_out_y; @@ -90,11 +93,11 @@ typedef struct Bone { float scale_in_x, scale_in_y; float scale_out_x, scale_out_y; - /** patch for upward compat, UNUSED!. */ + /** Patch for upward compatibility, UNUSED! */ float size[3]; /** Layers that bone appears on. */ int layer; - /** for B-bones. */ + /** For B-bones. */ short segments; /** Type of next/prev bone handles. */ @@ -126,7 +129,7 @@ typedef struct bArmature { /** Active bone. */ Bone *act_bone; - /** Active editbone (in editmode). */ + /** Active edit-bone (in edit-mode). */ struct EditBone *act_edbone; /** ID data is older than edit-mode data (TODO: move to edit-mode struct). */ diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 1eff7be3f15..386590ad26c 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -52,7 +52,7 @@ typedef struct ClothSimSettings { float Cvi; /** Gravity/external force vector. */ float gravity[3]; - /** This is the duration of our time step, computed.. */ + /** This is the duration of our time step, computed. */ float dt; /** The mass of the entire cloth. */ float mass; @@ -78,9 +78,9 @@ typedef struct ClothSimSettings { float time_scale; /** See SB. */ float maxgoal; - /** Scaling of effector forces (see softbody_calc_forces)..*/ + /** Scaling of effector forces (see #softbody_calc_forces). */ float eff_force_scale; - /** Scaling of effector wind (see softbody_calc_forces).. */ + /** Scaling of effector wind (see #softbody_calc_forces). */ float eff_wind_scale; float sim_time_old; float defgoal; diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index ddc1b3bd9d7..07fbf263d80 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -72,9 +72,9 @@ typedef struct bConstraint { /** Constraint name, MAX_NAME. */ char name[64]; - /** Amount of influence exherted by constraint (0.0-1.0). */ + /** Amount of influence exerted by constraint (0.0-1.0). */ float enforce; - /** Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail. */ + /** Point along `subtarget` bone where the actual target is. 0=head (default for all), 1=tail. */ float headtail; /* old animation system, deprecated for 2.5. */ diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index 3bf58203bef..b3f0708539a 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -600,10 +600,10 @@ enum { CU_CHINFO_BOLD = 1 << 0, CU_CHINFO_ITALIC = 1 << 1, CU_CHINFO_UNDERLINE = 1 << 2, - /** wordwrap occurred here */ + /** Word-wrap occurred here. */ CU_CHINFO_WRAP = 1 << 3, CU_CHINFO_SMALLCAPS = 1 << 4, - /** set at runtime, checks if case switching is needed */ + /** Set at runtime, checks if case switching is needed. */ CU_CHINFO_SMALLCAPS_CHECK = 1 << 5, /** Set at runtime, indicates char that doesn't fit in text boxes. */ CU_CHINFO_OVERFLOW = 1 << 6, diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 919bd18be80..884c2df6480 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -45,11 +45,11 @@ struct bNodeTree; typedef struct TexPaintSlot { /** Image to be painted on. */ struct Image *ima; - /** Customdata index for uv layer, MAX_NAM.E*/ + /** Custom-data index for uv layer, #MAX_NAME. */ char *uvname; /** Do we have a valid image and UV map. */ int valid; - /** Copy of node inteporlation setting. */ + /** Copy of node interpolation setting. */ int interp; } TexPaintSlot; diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h index a827003a9a0..a991f654b09 100644 --- a/source/blender/makesdna/DNA_meta_types.h +++ b/source/blender/makesdna/DNA_meta_types.h @@ -128,9 +128,9 @@ typedef struct MetaBall { /* ml->type */ #define MB_BALL 0 -#define MB_TUBEX 1 /* depercated */ -#define MB_TUBEY 2 /* depercated */ -#define MB_TUBEZ 3 /* depercated */ +#define MB_TUBEX 1 /* deprecated. */ +#define MB_TUBEY 2 /* deprecated. */ +#define MB_TUBEZ 3 /* deprecated. */ #define MB_TUBE 4 #define MB_PLANE 5 #define MB_ELIPSOID 6 diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 29421430e5d..6e1c00bfca8 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1230,12 +1230,14 @@ typedef struct SolidifyModifierData { char defgrp_name[64]; char shell_defgrp_name[64]; char rim_defgrp_name[64]; - /** New surface offset leve.l*/ + /** New surface offset level. */ float offset; - /** Midpoint of the offset . */ + /** Midpoint of the offset. */ float offset_fac; - /** factor for the minimum weight to use when vgroups are used, - * avoids 0.0 weights giving duplicate geometry */ + /** + * Factor for the minimum weight to use when vertex-groups are used, + * avoids 0.0 weights giving duplicate geometry. + */ float offset_fac_vg; /** Clamp offset based on surrounding geometry. */ float offset_clamp; diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h index 11cdb48edf0..b72b7c41b1c 100644 --- a/source/blender/makesdna/DNA_movieclip_types.h +++ b/source/blender/makesdna/DNA_movieclip_types.h @@ -156,7 +156,7 @@ typedef struct MovieClipScopes { struct MovieTrackingTrack *track; /** Marker scopes are created for. */ struct MovieTrackingMarker *marker; - /** Scale used for sliding from previewe area. */ + /** Scale used for sliding from preview area. */ float slide_scale[2]; } MovieClipScopes; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index fd9fcfa3232..a7b5be753d1 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1226,7 +1226,7 @@ typedef struct NodeAttributeSeparateXYZ { /* script node flag */ #define NODE_SCRIPT_AUTO_UPDATE 1 -/* ies node mode */ +/* IES node mode. */ #define NODE_IES_INTERNAL 0 #define NODE_IES_EXTERNAL 1 @@ -1550,7 +1550,7 @@ enum { /* image */ #define CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT 1 -/* viewer and cmposite output */ +/* viewer and composite output. */ #define CMP_NODE_OUTPUT_IGNORE_ALPHA 1 /* Plane track deform node */ diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h index 3bd11d02b7a..7812ff6a4f1 100644 --- a/source/blender/makesdna/DNA_object_force_types.h +++ b/source/blender/makesdna/DNA_object_force_types.h @@ -310,7 +310,7 @@ typedef struct SoftBody { struct Collection *collision_group; struct EffectorWeights *effector_weights; - /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */ + /* Reverse estimated object-matrix (run-time data, no need to store in the file). */ float lcom[3]; float lrot[3][3]; float lscale[3][3]; diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index 10fcca734b2..cc40e26b92b 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -118,10 +118,10 @@ typedef struct ParticleData { /** Boids data. */ BoidParticle *boid; - /** Amount of hair or keyed key.s*/ + /** Amount of hair or keyed keys. */ int totkey; - /** Dietime is not necessarily time+lifetime as. */ + /** Die-time is not necessarily time+lifetime as. */ float time, lifetime; /** Particles can die unnaturally (collision). */ float dietime; diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 48f183e1e28..9a3b9e7d365 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -45,7 +45,7 @@ typedef struct RigidBodyWorld_Shared { struct ListBase ptcaches; /* References to Physics Sim objects. Exist at runtime only ---------------------- */ - /** Physics sim world (i.e. btDiscreteDynamicsWorld). */ + /** Physics sim world (i.e. #btDiscreteDynamicsWorld). */ void *physics_world; } RigidBodyWorld_Shared; @@ -63,7 +63,7 @@ typedef struct RigidBodyWorld { /** Array to access group objects by index, only used at runtime. */ struct Object **objects; - /** Group containing objects to use for Rigid Body Constraint.s*/ + /** Group containing objects to use for Rigid Body Constraints. */ struct Collection *constraints; char _pad[4]; @@ -72,19 +72,19 @@ typedef struct RigidBodyWorld { /** This pointer is shared between all evaluated copies. */ struct RigidBodyWorld_Shared *shared; - /** Moved to shared->pointcache. */ + /** Moved to `shared->pointcache`. */ struct PointCache *pointcache DNA_DEPRECATED; - /** Moved to shared->ptcaches. */ + /** Moved to `shared->ptcaches`. */ struct ListBase ptcaches DNA_DEPRECATED; /** Number of objects in rigid body group. */ int numbodies; - /** Number of simulation substeps steps taken per frame. */ + /** Number of simulation sub-steps steps taken per frame. */ short substeps_per_frame; /** Number of constraint solver iterations made per simulation step. */ short num_solver_iterations; - /** (eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */ + /** (#eRigidBodyWorld_Flag) settings for this RigidBodyWorld. */ int flag; /** Used to speed up or slow down the simulation. */ float time_scale; @@ -96,7 +96,7 @@ typedef enum eRigidBodyWorld_Flag { RBW_FLAG_MUTED = (1 << 0), /* sim data needs to be rebuilt */ /* RBW_FLAG_NEEDS_REBUILD = (1 << 1), */ /* UNUSED */ - /* usse split impulse when stepping the simulation */ + /** Use split impulse when stepping the simulation. */ RBW_FLAG_USE_SPLIT_IMPULSE = (1 << 2), } eRigidBodyWorld_Flag; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index a7405b64bf9..33d31df4210 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1100,33 +1100,33 @@ typedef struct GP_Sculpt_Settings { struct GP_Sculpt_Guide guide; } GP_Sculpt_Settings; -/* GP_Sculpt_Settings.flag */ +/** #GP_Sculpt_Settings.flag */ typedef enum eGP_Sculpt_SettingsFlag { - /* enable falloff for multiframe editing */ + /** Enable falloff for multi-frame editing. */ GP_SCULPT_SETT_FLAG_FRAME_FALLOFF = (1 << 0), - /* apply primitive curve */ + /** Apply primitive curve. */ GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE = (1 << 1), - /* Scale thickness. */ + /** Scale thickness. */ GP_SCULPT_SETT_FLAG_SCALE_THICKNESS = (1 << 3), } eGP_Sculpt_SettingsFlag; -/* GP_Sculpt_Settings.gpencil_selectmode_sculpt */ +/** #GP_Sculpt_Settings.gpencil_selectmode_sculpt */ typedef enum eGP_Sculpt_SelectMaskFlag { - /* only affect selected points */ + /** Only affect selected points. */ GP_SCULPT_MASK_SELECTMODE_POINT = (1 << 0), - /* only affect selected strokes */ + /** Only affect selected strokes. */ GP_SCULPT_MASK_SELECTMODE_STROKE = (1 << 1), - /* only affect selected segmenst */ + /** only affect selected segments. */ GP_SCULPT_MASK_SELECTMODE_SEGMENT = (1 << 2), } eGP_Sculpt_SelectMaskFlag; -/* GP_Sculpt_Settings.gpencil_selectmode_vertex */ +/** #GP_Sculpt_Settings.gpencil_selectmode_vertex */ typedef enum eGP_vertex_SelectMaskFlag { - /* only affect selected points */ + /** Only affect selected points. */ GP_VERTEX_MASK_SELECTMODE_POINT = (1 << 0), - /* only affect selected strokes */ + /** Only affect selected strokes. */ GP_VERTEX_MASK_SELECTMODE_STROKE = (1 << 1), - /* only affect selected segmenst */ + /** Only affect selected segments. */ GP_VERTEX_MASK_SELECTMODE_SEGMENT = (1 << 2), } eGP_Vertex_SelectMaskFlag; diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 3a99a6f4ee8..8d3ac3a7814 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -285,7 +285,7 @@ typedef struct uiList { /* some list UI data need to be saved in file */ /** Defined as UI_MAX_NAME_STR. */ char list_id[64]; - /** How items are layedout in the list. */ + /** How items are laid out in the list. */ int layout_type; int flag; @@ -319,7 +319,7 @@ typedef struct TransformOrientation { typedef struct uiPreview { struct uiPreview *next, *prev; - /** Defined as UI_MAX_NAME_STR. */ + /** Defined as #UI_MAX_NAME_STR. */ char preview_id[64]; short height; char _pad1[6]; @@ -360,7 +360,7 @@ typedef struct ScrArea_Runtime { typedef struct ScrArea { struct ScrArea *next, *prev; - /** Ordered (bl, tl, tr, br). */ + /** Ordered (bottom-left, top-left, top-right, bottom-right). */ ScrVert *v1, *v2, *v3, *v4; /** If area==full, this is the parent. */ bScreen *full; diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 51f8b58da62..4d705f3aa34 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1545,7 +1545,7 @@ typedef struct SpaceNode { */ ListBase treepath; - /* The tree farthest down in the group heirarchy. */ + /* The tree farthest down in the group hierarchy. */ struct bNodeTree *edittree; struct bNodeTree *nodetree; diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h index f08aee317a3..0e673aaec66 100644 --- a/source/blender/makesdna/DNA_tracking_types.h +++ b/source/blender/makesdna/DNA_tracking_types.h @@ -328,7 +328,7 @@ typedef struct MovieTrackingStabilization { float target_pos[2]; /** Expected target rotation of frame after raw stabilization, will be compensated. */ float target_rot; - /** Zoom factor known to be present on original footage. Also used for autoscale. */ + /** Zoom factor known to be present on original footage. Also used for auto-scale. */ float scale; /** Influence on location, scale and rotation. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 0e31ec3494e..e6e2b6553c0 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -1207,7 +1207,7 @@ typedef enum eDupli_ID_Flags { USER_DUP_OBDATA = (~0) & ((1 << 24) - 1), - /* Those are not exposed as user preferences, only used internaly. */ + /* Those are not exposed as user preferences, only used internally. */ USER_DUP_OBJECT = (1 << 24), /* USER_DUP_COLLECTION = (1 << 25), */ /* UNUSED, keep because we may implement. */ diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index bcf75fb284f..c4a44556cf4 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -2001,7 +2001,7 @@ static void rna_def_trackingStabilization(BlenderRNA *brna) "Explicitly scale resulting frame to compensate zoom of original shot"); RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_tracking_flushUpdate"); - /* autoscale */ + /* Auto-scale. */ prop = RNA_def_property(srna, "use_autoscale", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_AUTOSCALE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c index 5327062d9bb..5eaf026191f 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.c +++ b/source/blender/windowmanager/intern/wm_toolsystem.c @@ -620,7 +620,7 @@ bToolRef *WM_toolsystem_ref_set_by_id_ex( bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *name, bool cycle) { wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false); - /* On startup, Python operatores are not yet loaded. */ + /* On startup, Python operators are not yet loaded. */ if (ot == NULL) { return NULL; } From a9092768c0034ca9736d5a386e3aa5dc3232c4cd Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Sat, 13 Feb 2021 08:38:38 +0100 Subject: [PATCH 142/519] GPencil: Try again to fix compiler warnings The windows compiler is not as sensible to this warnings as Linux. --- source/blender/editors/gpencil/gpencil_fill.c | 2 +- source/blender/editors/gpencil/gpencil_paint.c | 3 ++- source/blender/editors/gpencil/gpencil_primitive.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index e5d27165344..ecad7384049 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1285,7 +1285,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(tgpf->C, tgpf->gpl, gps); } diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index aae00c6b5bd..a7337b5646f 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1085,7 +1085,8 @@ static void gpencil_stroke_newfrombuffer(tGPsdata *p) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { + if ((!is_depth) && + (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(p->C, p->gpl, gps); } } diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index 35efcd1c769..a438d12710a 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -1078,7 +1078,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi) } /* If camera view or view projection, reproject flat to view to avoid perspective effect. */ - if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || is_camera)) { + if ((!is_depth) && (((align_flag & GP_PROJECT_VIEWSPACE) && is_lock_axis_view) || (is_camera))) { ED_gpencil_project_stroke_to_view(C, tgpi->gpl, gps); } From 32660201acaa1138c0fed6ef3fa38f69daa3dac3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 21:13:27 +1100 Subject: [PATCH 143/519] Fixes T84651: Weight paint gradient doesn't auto-normalize weights Auto-normalize when the option is enabled. Ref D10239 by @PratikPB2123 with minor edits. --- .../sculpt_paint/paint_vertex_weight_ops.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c index 8fd5759d695..8277b485578 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c @@ -573,6 +573,7 @@ typedef struct WPGradient_vertStore { enum { VGRAD_STORE_NOP = 0, VGRAD_STORE_DW_EXIST = (1 << 0), + VGRAD_STORE_IS_MODIFIED = (1 << 1) } flag; } WPGradient_vertStore; @@ -609,6 +610,8 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) /* Optionally restrict to assigned vertices only. */ if (grad_data->use_vgroup_restrict && ((vs->flag & VGRAD_STORE_DW_EXIST) == 0)) { + /* In this case the vertex will never have been touched. */ + BLI_assert((vs->flag & VGRAD_STORE_IS_MODIFIED) == 0); return; } @@ -637,6 +640,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) tool, vs->weight_orig, grad_data->weightpaint, alpha * grad_data->brush->alpha); CLAMP(testw, 0.0f, 1.0f); dw->weight = testw; + vs->flag |= VGRAD_STORE_IS_MODIFIED; } else { MDeformVert *dv = &me->dvert[index]; @@ -652,6 +656,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index) BKE_defvert_remove_group(dv, dw); } } + vs->flag &= ~VGRAD_STORE_IS_MODIFIED; } } @@ -856,6 +861,20 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) MEM_freeN(vert_cache); } + if (scene->toolsettings->auto_normalize) { + const int vgroup_num = BLI_listbase_count(&ob->defbase); + bool *vgroup_validmap = BKE_object_defgroup_validmap_get(ob, vgroup_num); + if (vgroup_validmap != NULL) { + MDeformVert *dvert = me->dvert; + for (int i = 0; i < me->totvert; i++) { + if ((data.vert_cache->elem[i].flag & VGRAD_STORE_IS_MODIFIED) != 0) { + BKE_defvert_normalize_lock_single(&dvert[i], vgroup_validmap, vgroup_num, data.def_nr); + } + } + MEM_freeN(vgroup_validmap); + } + } + return OPERATOR_FINISHED; } From dae445d94a7a5e1ad38719ea05e5bb0bc76ede84 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 13 Feb 2021 22:57:01 +1100 Subject: [PATCH 144/519] Fix T85573: Building with Python 3.10a5 fails Replace deprecated _PyUnicode_AsString{AndSize} usage. T83626 still needs to be resolved before 3.10 is usable. --- intern/cycles/blender/blender_python.cpp | 2 +- .../freestyle/intern/python/BPy_SShape.cpp | 2 +- source/blender/python/bmesh/bmesh_py_ops.c | 2 +- .../blender/python/bmesh/bmesh_py_ops_call.c | 4 +- .../python/bmesh/bmesh_py_types_customdata.c | 4 +- source/blender/python/generic/idprop_py_api.c | 16 ++--- source/blender/python/generic/imbuf_py_api.c | 2 +- source/blender/python/generic/py_capi_utils.c | 22 +++--- source/blender/python/gpu/gpu_py_api.c | 2 +- .../blender/python/gpu/gpu_py_vertex_format.c | 4 +- source/blender/python/intern/bpy.c | 4 +- .../python/intern/bpy_app_translations.c | 8 +-- source/blender/python/intern/bpy_capi_utils.c | 6 +- source/blender/python/intern/bpy_driver.c | 4 +- source/blender/python/intern/bpy_interface.c | 6 +- .../blender/python/intern/bpy_library_load.c | 2 +- source/blender/python/intern/bpy_msgbus.c | 2 +- source/blender/python/intern/bpy_operator.c | 2 +- .../blender/python/intern/bpy_operator_wrap.c | 2 +- source/blender/python/intern/bpy_props.c | 17 +++-- source/blender/python/intern/bpy_rna.c | 70 +++++++++---------- source/blender/python/intern/bpy_traceback.c | 2 +- .../python/mathutils/mathutils_Euler.c | 2 +- .../python/mathutils/mathutils_Matrix.c | 4 +- .../python/mathutils/mathutils_Quaternion.c | 2 +- 25 files changed, 96 insertions(+), 97 deletions(-) diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 5646bd5b2eb..0daad310543 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -147,7 +147,7 @@ void python_thread_state_restore(void **python_thread_state) static const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce) { - const char *result = _PyUnicode_AsString(py_str); + const char *result = PyUnicode_AsUTF8(py_str); if (result) { /* 99% of the time this is enough but we better support non unicode * chars since blender doesn't limit this. diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp index f43a464d99e..0ea02d8a3f6 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp @@ -201,7 +201,7 @@ static int SShape_name_set(BPy_SShape *self, PyObject *value, void *UNUSED(closu PyErr_SetString(PyExc_TypeError, "value must be a string"); return -1; } - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); self->ss->setName(name); return 0; } diff --git a/source/blender/python/bmesh/bmesh_py_ops.c b/source/blender/python/bmesh/bmesh_py_ops.c index c5d72a00ce3..b23891ca1fe 100644 --- a/source/blender/python/bmesh/bmesh_py_ops.c +++ b/source/blender/python/bmesh/bmesh_py_ops.c @@ -245,7 +245,7 @@ static PyTypeObject bmesh_op_Type = { static PyObject *bpy_bmesh_ops_module_getattro(PyObject *UNUSED(self), PyObject *pyname) { - const char *opname = _PyUnicode_AsString(pyname); + const char *opname = PyUnicode_AsUTF8(pyname); if (BMO_opcode_from_opname(opname) != -1) { return bpy_bmesh_op_CreatePyObject(opname); diff --git a/source/blender/python/bmesh/bmesh_py_ops_call.c b/source/blender/python/bmesh/bmesh_py_ops_call.c index d0676ec1947..28daf08507d 100644 --- a/source/blender/python/bmesh/bmesh_py_ops_call.c +++ b/source/blender/python/bmesh/bmesh_py_ops_call.c @@ -184,7 +184,7 @@ static int bpy_slot_from_py(BMesh *bm, if (slot->slot_subtype.intg == BMO_OP_SLOT_SUBTYPE_INT_ENUM) { int enum_val = -1; PyC_FlagSet *items = (PyC_FlagSet *)slot->data.enum_data.flags; - const char *enum_str = _PyUnicode_AsString(value); + const char *enum_str = PyUnicode_AsUTF8(value); if (enum_str == NULL) { PyErr_Format(PyExc_TypeError, @@ -787,7 +787,7 @@ PyObject *BPy_BMO_call(BPy_BMeshOpFunc *self, PyObject *args, PyObject *kw) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kw, &pos, &key, &value)) { - const char *slot_name = _PyUnicode_AsString(key); + const char *slot_name = PyUnicode_AsUTF8(key); BMOpSlot *slot; if (!BMO_slot_exists(bmop.slots_in, slot_name)) { diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c index 96c36f2d788..471a311c411 100644 --- a/source/blender/python/bmesh/bmesh_py_types_customdata.c +++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c @@ -804,7 +804,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py { /* don't need error check here */ if (PyUnicode_Check(key)) { - return bpy_bmlayercollection_subscript_str(self, _PyUnicode_AsString(key)); + return bpy_bmlayercollection_subscript_str(self, PyUnicode_AsUTF8(key)); } if (PyIndex_Check(key)) { const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -862,7 +862,7 @@ static PyObject *bpy_bmlayercollection_subscript(BPy_BMLayerCollection *self, Py static int bpy_bmlayercollection_contains(BPy_BMLayerCollection *self, PyObject *value) { - const char *keyname = _PyUnicode_AsString(value); + const char *keyname = PyUnicode_AsUTF8(value); CustomData *data; int index; diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index 6be7348a2f8..c329ea7965c 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -189,13 +189,13 @@ static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject st = (char *)PyC_UnicodeAsByte(value, &value_coerce); alloc_len = strlen(st) + 1; - st = _PyUnicode_AsString(value); + st = PyUnicode_AsUTF8(value); IDP_ResizeArray(prop, alloc_len); memcpy(IDP_Array(prop), st, alloc_len); Py_XDECREF(value_coerce); } # else - st = _PyUnicode_AsString(value); + st = PyUnicode_AsUTF8(value); IDP_ResizeArray(prop, strlen(st) + 1); strcpy(IDP_Array(prop), st); # endif @@ -253,7 +253,7 @@ static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUS return -1; } - name = _PyUnicode_AsStringAndSize(value, &name_size); + name = PyUnicode_AsUTF8AndSize(value, &name_size); if (name_size >= MAX_IDPROP_NAME) { PyErr_SetString(PyExc_TypeError, "string length cannot exceed 63 characters!"); @@ -300,7 +300,7 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item) return NULL; } - name = _PyUnicode_AsString(item); + name = PyUnicode_AsUTF8(item); if (name == NULL) { PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties"); @@ -358,7 +358,7 @@ static const char *idp_try_read_name(PyObject *name_obj) const char *name = NULL; if (name_obj) { Py_ssize_t name_size; - name = _PyUnicode_AsStringAndSize(name_obj, &name_size); + name = PyUnicode_AsUTF8AndSize(name_obj, &name_size); if (name == NULL) { PyErr_Format(PyExc_KeyError, @@ -420,7 +420,7 @@ static IDProperty *idp_from_PyUnicode(const char *name, PyObject *ob) prop = IDP_New(IDP_STRING, &val, name); Py_XDECREF(value_coerce); #else - val.str = _PyUnicode_AsString(ob); + val.str = PyUnicode_AsUTF8(ob); prop = IDP_New(IDP_STRING, val, name); #endif return prop; @@ -722,7 +722,7 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val) if (val == NULL) { /* del idprop[key] */ IDProperty *pkey; - const char *name = _PyUnicode_AsString(key); + const char *name = PyUnicode_AsUTF8(key); if (name == NULL) { PyErr_Format(PyExc_KeyError, "expected a string, not %.200s", Py_TYPE(key)->tp_name); @@ -1050,7 +1050,7 @@ static PyObject *BPy_IDGroup_items(BPy_IDProperty *self) static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value) { - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); if (!name) { PyErr_Format(PyExc_TypeError, "expected a string, not a %.200s", Py_TYPE(value)->tp_name); diff --git a/source/blender/python/generic/imbuf_py_api.c b/source/blender/python/generic/imbuf_py_api.c index d05690759ce..fe72f267a5d 100644 --- a/source/blender/python/generic/imbuf_py_api.c +++ b/source/blender/python/generic/imbuf_py_api.c @@ -267,7 +267,7 @@ static int py_imbuf_filepath_set(Py_ImBuf *self, PyObject *value, void *UNUSED(c ImBuf *ibuf = self->ibuf; const Py_ssize_t value_str_len_max = sizeof(ibuf->name); Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str_len >= value_str_len_max) { PyErr_Format(PyExc_TypeError, "filepath length over %zd", value_str_len_max - 1); return -1; diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 1eb4a51c392..c7ce264f2f9 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -257,7 +257,7 @@ int PyC_ParseBool(PyObject *o, void *p) int PyC_ParseStringEnum(PyObject *o, void *p) { struct PyC_StringEnum *e = p; - const char *value = _PyUnicode_AsString(o); + const char *value = PyUnicode_AsUTF8(o); if (value == NULL) { PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); return 0; @@ -343,7 +343,7 @@ void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var) (int)var->ob_refcnt, (void *)var, type ? type->tp_name : null_str, - var_str ? _PyUnicode_AsString(var_str) : ""); + var_str ? PyUnicode_AsUTF8(var_str) : ""); if (var_str != NULL) { Py_DECREF(var_str); } @@ -405,7 +405,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) /* when executing a script */ if (r_filename) { - *r_filename = _PyUnicode_AsString(frame->f_code->co_filename); + *r_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); } /* when executing a module */ @@ -418,7 +418,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) if (mod) { PyObject *mod_file = PyModule_GetFilenameObject(mod); if (mod_file) { - *r_filename = _PyUnicode_AsString(mod_name); + *r_filename = PyUnicode_AsUTF8(mod_name); Py_DECREF(mod_file); } else { @@ -428,7 +428,7 @@ void PyC_FileAndNum(const char **r_filename, int *r_lineno) /* unlikely, fallback */ if (*r_filename == NULL) { - *r_filename = _PyUnicode_AsString(mod_name); + *r_filename = PyUnicode_AsUTF8(mod_name); } } } @@ -569,9 +569,9 @@ void PyC_Err_PrintWithFunc(PyObject *py_func) /* use py style error */ fprintf(stderr, "File \"%s\", line %d, in %s\n", - _PyUnicode_AsString(f_code->co_filename), + PyUnicode_AsUTF8(f_code->co_filename), f_code->co_firstlineno, - _PyUnicode_AsString(((PyFunctionObject *)py_func)->func_name)); + PyUnicode_AsUTF8(((PyFunctionObject *)py_func)->func_name)); } /** \} */ @@ -740,7 +740,7 @@ const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObjec { const char *result; - result = _PyUnicode_AsStringAndSize(py_str, size); + result = PyUnicode_AsUTF8AndSize(py_str, size); if (result) { /* 99% of the time this is enough but we better support non unicode @@ -767,7 +767,7 @@ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce) { const char *result; - result = _PyUnicode_AsString(py_str); + result = PyUnicode_AsUTF8(py_str); if (result) { /* 99% of the time this is enough but we better support non unicode @@ -1146,7 +1146,7 @@ int PyC_FlagSet_ToBitfield(PyC_FlagSet *items, *r_value = 0; while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1324,7 +1324,7 @@ bool PyC_RunString_AsStringAndSize(const char *imports[], const char *val; Py_ssize_t val_len; - val = _PyUnicode_AsStringAndSize(retval, &val_len); + val = PyUnicode_AsUTF8AndSize(retval, &val_len); if (val == NULL && PyErr_Occurred()) { ok = false; } diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 954118ffa5f..eb2fd1f7304 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -64,7 +64,7 @@ bool bpygpu_is_init_or_error(void) int bpygpu_ParsePrimType(PyObject *o, void *p) { Py_ssize_t mode_id_len; - const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len); + const char *mode_id = PyUnicode_AsUTF8AndSize(o, &mode_id_len); if (mode_id == NULL) { PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); return 0; diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c index 7d1e4ee4868..52e1a720f97 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.c +++ b/source/blender/python/gpu/gpu_py_vertex_format.c @@ -105,7 +105,7 @@ static int py_parse_fetch_mode(const char *str, int length) static int py_ParseVertCompType(PyObject *o, void *p) { Py_ssize_t length; - const char *str = _PyUnicode_AsStringAndSize(o, &length); + const char *str = PyUnicode_AsUTF8AndSize(o, &length); if (str == NULL) { PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); @@ -125,7 +125,7 @@ static int py_ParseVertCompType(PyObject *o, void *p) static int py_ParseVertFetchMode(PyObject *o, void *p) { Py_ssize_t length; - const char *str = _PyUnicode_AsStringAndSize(o, &length); + const char *str = PyUnicode_AsUTF8AndSize(o, &length); if (str == NULL) { PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index 6462f8320d7..74fc8bcfec9 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -261,7 +261,7 @@ PyDoc_STRVAR(bpy_escape_identifier_doc, static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value) { Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str == NULL) { PyErr_SetString(PyExc_TypeError, "expected a string"); @@ -299,7 +299,7 @@ PyDoc_STRVAR(bpy_unescape_identifier_doc, static PyObject *bpy_unescape_identifier(PyObject *UNUSED(self), PyObject *value) { Py_ssize_t value_str_len; - const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); + const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len); if (value_str == NULL) { PyErr_SetString(PyExc_TypeError, "expected a string"); diff --git a/source/blender/python/intern/bpy_app_translations.c b/source/blender/python/intern/bpy_app_translations.c index 56fc3efc090..d00f205ddc0 100644 --- a/source/blender/python/intern/bpy_app_translations.c +++ b/source/blender/python/intern/bpy_app_translations.c @@ -211,7 +211,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) msgctxt = BLT_I18NCONTEXT_DEFAULT_BPYRNA; } else if (PyUnicode_Check(tmp)) { - msgctxt = _PyUnicode_AsString(tmp); + msgctxt = PyUnicode_AsUTF8(tmp); } else { invalid_key = true; @@ -219,7 +219,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) tmp = PyTuple_GET_ITEM(pykey, 1); if (PyUnicode_Check(tmp)) { - msgid = _PyUnicode_AsString(tmp); + msgid = PyUnicode_AsUTF8(tmp); } else { invalid_key = true; @@ -250,7 +250,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale) /* Do not overwrite existing keys! */ if (BPY_app_translations_py_pgettext(msgctxt, msgid) == msgid) { GHashKey *key = _ghashutil_keyalloc(msgctxt, msgid); - BLI_ghash_insert(_translations_cache, key, BLI_strdup(_PyUnicode_AsString(trans))); + BLI_ghash_insert(_translations_cache, key, BLI_strdup(PyUnicode_AsUTF8(trans))); } } } @@ -341,7 +341,7 @@ static PyObject *app_translations_py_messages_register(BlenderAppTranslations *s PyExc_ValueError, "bpy.app.translations.register: translations message cache already contains some data for " "addon '%s'", - (const char *)_PyUnicode_AsString(module_name)); + (const char *)PyUnicode_AsUTF8(module_name)); return NULL; } diff --git a/source/blender/python/intern/bpy_capi_utils.c b/source/blender/python/intern/bpy_capi_utils.c index 57dc4c0a679..b2670161d92 100644 --- a/source/blender/python/intern/bpy_capi_utils.c +++ b/source/blender/python/intern/bpy_capi_utils.c @@ -136,7 +136,7 @@ bool BPy_errors_to_report_ex(ReportList *reports, RPT_ERROR, TIP_("%s: %s\nlocation: %s:%d\n"), error_prefix, - _PyUnicode_AsString(pystring), + PyUnicode_AsUTF8(pystring), filename, lineno); @@ -144,12 +144,12 @@ bool BPy_errors_to_report_ex(ReportList *reports, fprintf(stderr, TIP_("%s: %s\nlocation: %s:%d\n"), error_prefix, - _PyUnicode_AsString(pystring), + PyUnicode_AsUTF8(pystring), filename, lineno); } else { - BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, _PyUnicode_AsString(pystring)); + BKE_reportf(reports, RPT_ERROR, "%s: %s", error_prefix, PyUnicode_AsUTF8(pystring)); } Py_DECREF(pystring); diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index c0536693f38..5102aa17250 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -163,7 +163,7 @@ int bpy_pydriver_create_dict(void) PyObject *arg_key, *arg_value; Py_ssize_t arg_pos = 0; while (PyDict_Next(mod_math_dict, &arg_pos, &arg_key, &arg_value)) { - const char *arg_str = _PyUnicode_AsString(arg_key); + const char *arg_str = PyUnicode_AsUTF8(arg_key); if (arg_str[0] && arg_str[1] != '_') { PyDict_SetItem(bpy_pydriver_Dict__whitelist, arg_key, Py_None); } @@ -363,7 +363,7 @@ static bool bpy_driver_secure_bytecode_validate(PyObject *expr_code, PyObject *d fprintf(stderr, "\tBPY_driver_eval() - restricted access disallows name '%s', " "enable auto-execution to support\n", - _PyUnicode_AsString(name)); + PyUnicode_AsUTF8(name)); return false; } } diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 311612e1499..9fea65935e1 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -585,8 +585,8 @@ void BPY_python_backtrace(FILE *fp) PyFrameObject *frame = tstate->frame; do { const int line = PyCode_Addr2Line(frame->f_code, frame->f_lasti); - const char *filename = _PyUnicode_AsString(frame->f_code->co_filename); - const char *funcname = _PyUnicode_AsString(frame->f_code->co_name); + const char *filename = PyUnicode_AsUTF8(frame->f_code->co_filename); + const char *funcname = PyUnicode_AsUTF8(frame->f_code->co_name); fprintf(fp, " File \"%s\", line %d in %s\n", filename, line, funcname); } while ((frame = frame->f_back)); } @@ -778,7 +778,7 @@ static void bpy_module_delay_init(PyObject *bpy_proxy) /* updating the module dict below will lose the reference to __file__ */ PyObject *filename_obj = PyModule_GetFilenameObject(bpy_proxy); - const char *filename_rel = _PyUnicode_AsString(filename_obj); /* can be relative */ + const char *filename_rel = PyUnicode_AsUTF8(filename_obj); /* can be relative */ char filename_abs[1024]; BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs)); diff --git a/source/blender/python/intern/bpy_library_load.c b/source/blender/python/intern/bpy_library_load.c index 7ee563feff8..020c8f7ea49 100644 --- a/source/blender/python/intern/bpy_library_load.c +++ b/source/blender/python/intern/bpy_library_load.c @@ -361,7 +361,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args)) for (i = 0; i < size; i++) { PyObject *item_src = PyList_GET_ITEM(ls, i); PyObject *item_dst; /* must be set below */ - const char *item_idname = _PyUnicode_AsString(item_src); + const char *item_idname = PyUnicode_AsUTF8(item_src); // printf(" %s\n", item_idname); diff --git a/source/blender/python/intern/bpy_msgbus.c b/source/blender/python/intern/bpy_msgbus.c index df45007b68f..7cc7f864c9c 100644 --- a/source/blender/python/intern/bpy_msgbus.c +++ b/source/blender/python/intern/bpy_msgbus.c @@ -118,7 +118,7 @@ static int py_msgbus_rna_key_from_py(PyObject *py_sub, PointerRNA data_type_ptr = { .type = data_type, }; - const char *data_prop_str = _PyUnicode_AsString(data_prop_py); + const char *data_prop_str = PyUnicode_AsUTF8(data_prop_py); PropertyRNA *data_prop = RNA_struct_find_property(&data_type_ptr, data_prop_str); if (data_prop == NULL) { diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 5ac76ab9ac1..967eece4bcb 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -58,7 +58,7 @@ static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id) { - const char *opname = _PyUnicode_AsString(value); + const char *opname = PyUnicode_AsUTF8(value); if (opname == NULL) { PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id); return NULL; diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 9fb25d41844..5137f41d43a 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -68,7 +68,7 @@ static void operator_properties_init(wmOperatorType *ot) if (bl_property) { if (PyUnicode_Check(bl_property)) { /* since the property is explicitly given, raise an error if its not found */ - prop_id = _PyUnicode_AsString(bl_property); + prop_id = PyUnicode_AsUTF8(bl_property); prop_raise_error = true; } else { diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 354086ef4c3..878bf4aec5d 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -1152,7 +1152,7 @@ static void bpy_prop_string_get_cb(struct PointerRNA *ptr, struct PropertyRNA *p } else { Py_ssize_t length; - const char *buffer = _PyUnicode_AsStringAndSize(ret, &length); + const char *buffer = PyUnicode_AsUTF8AndSize(ret, &length); memcpy(value, buffer, length + 1); Py_DECREF(ret); } @@ -1213,7 +1213,7 @@ static int bpy_prop_string_length_cb(struct PointerRNA *ptr, struct PropertyRNA } else { Py_ssize_t length_ssize_t = 0; - _PyUnicode_AsStringAndSize(ret, &length_ssize_t); + PyUnicode_AsUTF8AndSize(ret, &length_ssize_t); length = length_ssize_t; Py_DECREF(ret); } @@ -1488,7 +1488,7 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, else { if (def) { if (!py_long_as_int(def, &def_int_cmp)) { - def_string_cmp = _PyUnicode_AsString(def); + def_string_cmp = PyUnicode_AsUTF8(def); if (def_string_cmp == NULL) { PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'str' or 'int' " @@ -1517,14 +1517,13 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, if ((PyTuple_CheckExact(item)) && (item_size = PyTuple_GET_SIZE(item)) && (item_size >= 3 && item_size <= 5) && - (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && - (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && - (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), - &desc_str_size)) && + (tmp.identifier = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) && + (tmp.name = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) && + (tmp.description = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) && /* TODO, number isn't ensured to be unique from the script author */ (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value)) && (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) || - (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) && + (tmp_icon = PyUnicode_AsUTF8(PyTuple_GET_ITEM(item, 3)))) && py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value)))) { if (is_enum_flag) { if (item_size < 4) { @@ -3301,7 +3300,7 @@ StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix) if (!srna) { if (PyErr_Occurred()) { PyObject *msg = PyC_ExceptionBuffer(); - const char *msg_char = _PyUnicode_AsString(msg); + const char *msg_char = PyUnicode_AsUTF8(msg); PyErr_Format( PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char); Py_DECREF(msg); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 0b1af733f84..c0f3ba30d93 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -323,7 +323,7 @@ static bool rna_id_write_error(PointerRNA *ptr, PyObject *key) const char *idtype = BKE_idtype_idcode_to_name(idcode); const char *pyname; if (key && PyUnicode_Check(key)) { - pyname = _PyUnicode_AsString(key); + pyname = PyUnicode_AsUTF8(key); } else { pyname = ""; @@ -1252,7 +1252,7 @@ static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop) static int pyrna_string_to_enum( PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *r_value, const char *error_prefix) { - const char *param = _PyUnicode_AsString(item); + const char *param = PyUnicode_AsUTF8(item); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1299,7 +1299,7 @@ BLI_bitmap *pyrna_set_to_enum_bitmap(const EnumPropertyItem *items, BLI_bitmap *bitmap = BLI_BITMAP_NEW(bitmap_size, __func__); while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, "%.200s expected a string, not %.200s", @@ -1364,7 +1364,7 @@ int pyrna_set_to_enum_bitfield(const EnumPropertyItem *items, *r_value = 0; while (_PySet_NextEntry(value, &pos, &key, &hash)) { - const char *param = _PyUnicode_AsString(key); + const char *param = PyUnicode_AsUTF8(key); if (param == NULL) { PyErr_Format(PyExc_TypeError, @@ -1662,7 +1662,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, Py_ssize_t pos = 0; while (PyDict_Next(kw, &pos, &key, &value)) { - arg_name = _PyUnicode_AsString(key); + arg_name = PyUnicode_AsUTF8(key); if (RNA_struct_find_property(ptr, arg_name) == NULL) { break; } @@ -1871,10 +1871,10 @@ static int pyrna_py_to_prop( param = PyC_UnicodeAsByte(value, &value_coerce); } else { - param = _PyUnicode_AsString(value); + param = PyUnicode_AsUTF8(value); } #else /* USE_STRING_COERCE */ - param = _PyUnicode_AsString(value); + param = PyUnicode_AsUTF8(value); #endif /* USE_STRING_COERCE */ if (param == NULL) { @@ -2186,7 +2186,7 @@ static int pyrna_py_to_prop( if (pyrna_pydict_to_props( &itemptr, item, true, "Converting a Python list to an RNA collection") == -1) { PyObject *msg = PyC_ExceptionBuffer(); - const char *msg_char = _PyUnicode_AsString(msg); + const char *msg_char = PyUnicode_AsUTF8(msg); PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s error converting a member of a collection " @@ -2490,7 +2490,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel RNA_struct_identifier(self->ptr.type)); return -1; } - if ((keyname = _PyUnicode_AsString(PyTuple_GET_ITEM(key, 0))) == NULL) { + if ((keyname = PyUnicode_AsUTF8(PyTuple_GET_ITEM(key, 0))) == NULL) { PyErr_Format(PyExc_KeyError, "%s: id must be a string, not %.200s", err_prefix, @@ -2507,7 +2507,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel } else if (PyUnicode_Check(keylib)) { Main *bmain = self->ptr.data; - const char *keylib_str = _PyUnicode_AsString(keylib); + const char *keylib_str = PyUnicode_AsUTF8(keylib); lib = BLI_findstring(&bmain->libraries, keylib_str, offsetof(Library, filepath)); if (lib == NULL) { if (err_not_found) { @@ -2711,7 +2711,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject PYRNA_PROP_CHECK_OBJ(self); if (PyUnicode_Check(key)) { - return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key)); } if (PyIndex_Check(key)) { const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -2838,7 +2838,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, #if 0 if (PyUnicode_Check(key)) { - return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_collection_subscript_str(self, PyUnicode_AsUTF8(key)); } else #endif @@ -2910,7 +2910,7 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject #if 0 if (PyUnicode_Check(key)) { - return pyrna_prop_array_subscript_str(self, _PyUnicode_AsString(key)); + return pyrna_prop_array_subscript_str(self, PyUnicode_AsUTF8(key)); } else #endif @@ -3359,7 +3359,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key) } /* Key in dict style check. */ - const char *keyname = _PyUnicode_AsString(key); + const char *keyname = PyUnicode_AsUTF8(key); if (keyname == NULL) { PyErr_SetString(PyExc_TypeError, @@ -3377,7 +3377,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key) static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value) { IDProperty *group; - const char *name = _PyUnicode_AsString(value); + const char *name = PyUnicode_AsUTF8(value); PYRNA_STRUCT_CHECK_INT(self); @@ -3447,7 +3447,7 @@ static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key) { /* Mostly copied from BPy_IDGroup_Map_GetItem. */ IDProperty *group, *idprop; - const char *name = _PyUnicode_AsString(key); + const char *name = PyUnicode_AsUTF8(key); PYRNA_STRUCT_CHECK_OBJ(self); @@ -4231,7 +4231,7 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self) /* ---------------getattr-------------------------------------------- */ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PyObject *ret; PropertyRNA *prop; FunctionRNA *func; @@ -4378,7 +4378,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr if ((ret == NULL) /* || pyrna_is_deferred_prop(ret) */ ) { StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__"); if (srna) { - PropertyRNA *prop = RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr)); + PropertyRNA *prop = RNA_struct_type_find_property(srna, PyUnicode_AsUTF8(attr)); if (prop) { PointerRNA tptr; PyErr_Clear(); /* Clear error from tp_getattro. */ @@ -4397,7 +4397,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb { StructRNA *srna = srna_from_self(cls, "StructRNA.__setattr__"); const bool is_deferred_prop = (value && pyrna_is_deferred_prop(value)); - const char *attr_str = _PyUnicode_AsString(attr); + const char *attr_str = PyUnicode_AsUTF8(attr); if (srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, attr_str))) { @@ -4458,7 +4458,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PropertyRNA *prop = NULL; PYRNA_STRUCT_CHECK_INT(self); @@ -4550,7 +4550,7 @@ static PyObject *pyrna_prop_array_getattro(BPy_PropertyRNA *self, PyObject *pyna static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject *pyname) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); if (name == NULL) { PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string"); @@ -4618,7 +4618,7 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject /* --------------- setattr------------------------------------------- */ static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pyname, PyObject *value) { - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); PropertyRNA *prop; PointerRNA r_ptr; @@ -5015,7 +5015,7 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args } if (PyUnicode_Check(key_ob)) { - const char *key = _PyUnicode_AsString(key_ob); + const char *key = PyUnicode_AsUTF8(key_ob); if (RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr)) { return pyrna_struct_CreatePyObject(&newptr); @@ -5050,7 +5050,7 @@ PyDoc_STRVAR(pyrna_prop_collection_find_doc, static PyObject *pyrna_prop_collection_find(BPy_PropertyRNA *self, PyObject *key_ob) { Py_ssize_t key_len_ssize_t; - const char *key = _PyUnicode_AsStringAndSize(key_ob, &key_len_ssize_t); + const char *key = PyUnicode_AsUTF8AndSize(key_ob, &key_len_ssize_t); const int key_len = (int)key_len_ssize_t; /* Compare with same type. */ char name[256], *nameptr; @@ -6035,7 +6035,7 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look while (PyDict_Next(dict, &pos, &key, &value)) { if (PyUnicode_Check(key)) { - if (STREQ(key_lookup, _PyUnicode_AsString(key))) { + if (STREQ(key_lookup, PyUnicode_AsUTF8(key))) { return value; } } @@ -6189,7 +6189,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject #ifdef DEBUG_STRING_FREE if (item) { if (PyUnicode_Check(item)) { - PyList_APPEND(string_free_ls, PyUnicode_FromString(_PyUnicode_AsString(item))); + PyList_APPEND(string_free_ls, PyUnicode_FromString(PyUnicode_AsUTF8(item))); } } #endif @@ -6245,7 +6245,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject while (PyDict_Next(kw, &pos, &key, &value)) { - arg_name = _PyUnicode_AsString(key); + arg_name = PyUnicode_AsUTF8(key); found = false; if (arg_name == NULL) { /* Unlikely the argname is not a string, but ignore if it is. */ @@ -7664,7 +7664,7 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname { PointerRNA newptr; PyObject *ret; - const char *name = _PyUnicode_AsString(pyname); + const char *name = PyUnicode_AsUTF8(pyname); if (name == NULL) { PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string"); @@ -7675,14 +7675,14 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname if (ret == NULL) { PyErr_Format(PyExc_RuntimeError, "bpy.types.%.200s subtype could not be generated, this is a bug!", - _PyUnicode_AsString(pyname)); + PyUnicode_AsUTF8(pyname)); } } else { #if 0 PyErr_Format(PyExc_AttributeError, "bpy.types.%.200s RNA_Struct does not exist", - _PyUnicode_AsString(pyname)); + PyUnicode_AsUTF8(pyname)); return NULL; #endif /* The error raised here will be displayed. */ @@ -7889,12 +7889,12 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item if (PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) { PyObject *args_fake; - if (*_PyUnicode_AsString(key) == '_') { + if (*PyUnicode_AsUTF8(key) == '_') { PyErr_Format(PyExc_ValueError, "bpy_struct \"%.200s\" registration error: " "%.200s could not register because the property starts with an '_'\n", RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); + PyUnicode_AsUTF8(key)); return -1; } py_srna_cobject = PyCapsule_New(srna, NULL, NULL); @@ -7938,7 +7938,7 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item "bpy_struct \"%.200s\" registration error: " "%.200s could not register\n", RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); + PyUnicode_AsUTF8(key)); return -1; } } @@ -7992,7 +7992,7 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict) } printf(" assign as a type annotation: %.200s.%.200s\n", RNA_struct_identifier(srna), - _PyUnicode_AsString(key)); + PyUnicode_AsUTF8(key)); } ret = deferred_register_prop(srna, key, item); @@ -9088,7 +9088,7 @@ static PyObject *pyrna_bl_owner_id_set(PyObject *UNUSED(self), PyObject *value) name = NULL; } else if (PyUnicode_Check(value)) { - name = _PyUnicode_AsString(value); + name = PyUnicode_AsUTF8(value); } else { PyErr_Format(PyExc_ValueError, diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c index e2c894e90f8..00b414e027e 100644 --- a/source/blender/python/intern/bpy_traceback.c +++ b/source/blender/python/intern/bpy_traceback.c @@ -149,7 +149,7 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset) PyObject *filename_py, *text_py; if (parse_syntax_error(value, &message, &filename_py, lineno, offset, &text_py)) { - const char *filename = _PyUnicode_AsString(filename_py); + const char *filename = PyUnicode_AsUTF8(filename_py); /* python adds a '/', prefix, so check for both */ if ((BLI_path_cmp(filename, filepath) == 0) || (ELEM(filename[0], '\\', '/') && BLI_path_cmp(filename + 1, filepath) == 0)) { diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c index ebc71706bef..f2a8af18073 100644 --- a/source/blender/python/mathutils/mathutils_Euler.c +++ b/source/blender/python/mathutils/mathutils_Euler.c @@ -670,7 +670,7 @@ static int Euler_order_set(EulerObject *self, PyObject *value, void *UNUSED(clos return -1; } - if (((order_str = _PyUnicode_AsString(value)) == NULL) || + if (((order_str = PyUnicode_AsUTF8(value)) == NULL) || ((order = euler_order_from_string(order_str, "euler.order")) == -1)) { return -1; } diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c index 87d16656d70..016ba462030 100644 --- a/source/blender/python/mathutils/mathutils_Matrix.c +++ b/source/blender/python/mathutils/mathutils_Matrix.c @@ -499,7 +499,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args) } if (vec && PyUnicode_Check(vec)) { - axis = _PyUnicode_AsString((PyObject *)vec); + axis = PyUnicode_AsUTF8((PyObject *)vec); if (axis == NULL || axis[0] == '\0' || axis[1] != '\0' || axis[0] < 'X' || axis[0] > 'Z') { PyErr_SetString(PyExc_ValueError, "Matrix.Rotation(): " @@ -768,7 +768,7 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args) if (PyUnicode_Check(axis)) { /* ortho projection onto cardinal plane */ Py_ssize_t plane_len; - const char *plane = _PyUnicode_AsStringAndSize(axis, &plane_len); + const char *plane = PyUnicode_AsUTF8AndSize(axis, &plane_len); if (matSize == 2) { if (plane_len == 1 && plane[0] == 'X') { mat[0] = 1.0f; diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c index 8d2ab614728..3bc60190d56 100644 --- a/source/blender/python/mathutils/mathutils_Quaternion.c +++ b/source/blender/python/mathutils/mathutils_Quaternion.c @@ -195,7 +195,7 @@ static PyObject *Quaternion_to_swing_twist(QuaternionObject *self, PyObject *axi int axis; if (axis_arg && PyUnicode_Check(axis_arg)) { - axis_str = _PyUnicode_AsString(axis_arg); + axis_str = PyUnicode_AsUTF8(axis_arg); } if (axis_str && axis_str[0] >= 'X' && axis_str[0] <= 'Z' && axis_str[1] == 0) { From ec882b803382cd58032a1f41ee37cfaedd61a0ae Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 12 Feb 2021 20:08:43 +0100 Subject: [PATCH 145/519] Fix geometry nodes build error with TBB enabled and OpenVDB disabled Don't rely on TBB includes coming along with OpenVDB. --- source/blender/nodes/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 64c240eb5fd..9fd578b625d 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -357,6 +357,9 @@ if(WITH_INTERNATIONAL) endif() if(WITH_TBB) + list(APPEND INC_SYS + ${TBB_INCLUDE_DIRS} + ) add_definitions(-DWITH_TBB) endif() From 40aadd894016f6ad6a1cde3d60b63ba47a72ec6c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 13 Feb 2021 15:36:19 +0100 Subject: [PATCH 146/519] Build: fix macOS minimum version link warning with pystring Patch OpenColorIO again to pass along build flags, and remove outdated patches which were no longer being used. --- .../build_environment/cmake/opencolorio.cmake | 3 +- .../patches/opencolorio.diff | 47 ++++++----------- .../patches/opencolorio_win.diff | 51 ------------------- 3 files changed, 16 insertions(+), 85 deletions(-) delete mode 100644 build_files/build_environment/patches/opencolorio_win.diff diff --git a/build_files/build_environment/cmake/opencolorio.cmake b/build_files/build_environment/cmake/opencolorio.cmake index 7622a2afdaa..87099a06d17 100644 --- a/build_files/build_environment/cmake/opencolorio.cmake +++ b/build_files/build_environment/cmake/opencolorio.cmake @@ -44,13 +44,11 @@ if(APPLE AND NOT("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) endif() if(WIN32) - set(OCIO_PATCH opencolorio_win.diff) set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} -DOCIO_INLINES_HIDDEN=OFF ) else() - set(OCIO_PATCH opencolorio.diff) set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} ) @@ -61,6 +59,7 @@ ExternalProject_Add(external_opencolorio DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${OPENCOLORIO_HASH} PREFIX ${BUILD_DIR}/opencolorio + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencolorio/src/external_opencolorio < ${PATCH_DIR}/opencolorio.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio ${DEFAULT_CMAKE_FLAGS} ${OPENCOLORIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencolorio ) diff --git a/build_files/build_environment/patches/opencolorio.diff b/build_files/build_environment/patches/opencolorio.diff index c76c62c1057..2255cbc02ed 100644 --- a/build_files/build_environment/patches/opencolorio.diff +++ b/build_files/build_environment/patches/opencolorio.diff @@ -1,33 +1,16 @@ -diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt -index 1eb691b..cff9bd8 100644 ---- a/src/core/CMakeLists.txt -+++ b/src/core/CMakeLists.txt -@@ -23,8 +23,6 @@ if(WIN32) - if("${CMAKE_BUILD_TYPE}" STREQUAL "Release") - set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} /WX") - endif() --else() -- set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -Werror") - endif() - - # SHARED ---- a/CMakeLists.txt 2018-09-10 22:15:29.000000000 +0200 -+++ b/CMakeLists.txt 2018-09-10 22:17:40.000000000 +0200 -@@ -229,7 +229,7 @@ - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${TINYXML_PATCHFILE} - BINARY_DIR ext/build/tinyxml - INSTALL_DIR ext/dist -- CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -+ CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} +diff --git a/share/cmake/modules/Findpystring.cmake b/share/cmake/modules/Findpystring.cmake +index 7b894a45..92618215 100644 +--- a/share/cmake/modules/Findpystring.cmake ++++ b/share/cmake/modules/Findpystring.cmake +@@ -113,6 +113,11 @@ if(NOT pystring_FOUND) + -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} + -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} + -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} ++ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ++ -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} ++ -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ++ -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} ++ -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} ) - if(WIN32) - set(TINYXML_STATIC_LIBRARIES ${PROJECT_BINARY_DIR}/ext/dist/lib/tinyxml.lib) -@@ -343,7 +343,7 @@ - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${YAML_CPP_PATCHFILE} - BINARY_DIR ext/build/yaml-cpp - INSTALL_DIR ext/dist -- CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -+ CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} - ) - set(YAML_CPP_INCLUDE_DIRS ${PROJECT_BINARY_DIR}/ext/dist/include) - set(YAML_CPP_LIBRARY_DIRS ${PROJECT_BINARY_DIR}/ext/dist/lib) + if(CMAKE_TOOLCHAIN_FILE) + set(pystring_CMAKE_ARGS diff --git a/build_files/build_environment/patches/opencolorio_win.diff b/build_files/build_environment/patches/opencolorio_win.diff deleted file mode 100644 index eb65411b61a..00000000000 --- a/build_files/build_environment/patches/opencolorio_win.diff +++ /dev/null @@ -1,51 +0,0 @@ -diff -Naur external_opencolorio/CMakeLists.txt external_opencolorio.patched/CMakeLists.txt ---- external_opencolorio/CMakeLists.txt 2018-01-04 18:38:27 -0700 -+++ external_opencolorio.patched/CMakeLists.txt 2018-08-15 11:46:53 -0600 -@@ -251,25 +251,30 @@ - if(USE_EXTERNAL_YAML) - # Set minimum yaml version for non-patched sources. - set(YAML_VERSION_MIN "0.3.0") -- include(FindPkgConfig) -- pkg_check_modules(PC_YAML_CPP REQUIRED QUIET yaml-cpp) -- find_path(YAML_CPP_INCLUDE_DIR yaml-cpp/yaml.h -- HINTS ${PC_YAML_CPP_INCLUDEDIR} ${PC_YAML_CPP_INCLUDE_DIRS} ) -- find_library(YAML_CPP_LIBRARY LIBRARY_NAMES yaml-cpp libyaml-cpp -- HINTS ${PC_YAML_CPP_LIBRARY_DIRS} ) -- set(YAML_CPP_LIBRARIES ${YAML_CPP_LIBRARY}) -- set(YAML_CPP_INCLUDE_DIRS ${YAML_CPP_INCLUDE_DIR}) -- set(YAML_CPP_VERSION ${PC_YAML_CPP_VERSION}) -+ if(NOT WIN32) -+ include(FindPkgConfig) -+ pkg_check_modules(PC_YAML_CPP REQUIRED QUIET yaml-cpp) -+ find_path(YAML_CPP_INCLUDE_DIR yaml-cpp/yaml.h -+ HINTS ${PC_YAML_CPP_INCLUDEDIR} ${PC_YAML_CPP_INCLUDE_DIRS} ) -+ find_library(YAML_CPP_LIBRARY LIBRARY_NAMES yaml-cpp libyaml-cpp -+ HINTS ${PC_YAML_CPP_LIBRARY_DIRS} ) -+ set(YAML_CPP_LIBRARIES ${YAML_CPP_LIBRARY}) -+ set(YAML_CPP_INCLUDE_DIRS ${YAML_CPP_INCLUDE_DIR}) -+ set(YAML_CPP_VERSION ${PC_YAML_CPP_VERSION}) - -- if(YAML_CPP_VERSION VERSION_LESS ${YAML_VERSION_MIN}) -- message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") -- endif() -- -- find_package_handle_standard_args(yaml-cpp -- REQUIRED_VARS YAML_CPP_LIBRARIES YAML_CPP_INCLUDE_DIRS ) -- set(YAML_CPP_FOUND ${YAML-CPP_FOUND}) -- mark_as_advanced(YAML_CPP_INCLUDE_DIR YAML_CPP_LIBRARY YAML-CPP_FOUND) -+ if(YAML_CPP_VERSION VERSION_LESS ${YAML_VERSION_MIN}) -+ message(FATAL_ERROR "ERROR: yaml-cpp ${YAML_VERSION_MIN} or greater is required.") -+ endif() - -+ find_package_handle_standard_args(yaml-cpp -+ REQUIRED_VARS YAML_CPP_LIBRARIES YAML_CPP_INCLUDE_DIRS ) -+ set(YAML_CPP_FOUND ${YAML-CPP_FOUND}) -+ mark_as_advanced(YAML_CPP_INCLUDE_DIR YAML_CPP_LIBRARY YAML-CPP_FOUND) -+ else() -+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${INC_1}) -+ set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${INC_2}) -+ message("INCLUDE DIRS = i:${EXTERNAL_INCLUDE_DIRS} |1:${INC_1} |2:${INC_2}") -+ endif() - if(YAML_CPP_FOUND) - if(YAML_CPP_VERSION VERSION_GREATER "0.5.0") - # Need to also get the boost headers here, as yaml-cpp 0.5.0+ requires them. From 7f7e6830991bf66e285fb54cdbae6c6618ed7afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:43:09 +0100 Subject: [PATCH 147/519] EEVEE: Refactor closure_lit_lib.glsl This refactor was needed for some reasons: - closure_lit_lib.glsl was unreadable and could not be easily extended to use new features. - It was generating ~5K LOC for any shader. Slowing down compilation. - Some calculations were incorrect and BSDF/Closure code had lots of workaround/hacks. What this refactor does: - Add some macros to define the light object loops / eval. - Clear separation between each closures which now have separate files. Each closure implements the eval functions. - Make principled BSDF a bit more correct in some cases (specular coloring, mix between glass and opaque). - The BSDF term are applied outside of the eval function and on the whole lighting (was separated for lights before). - Make light iteration last to avoid carrying more data than needed. - Makes sure that all inputs are within correct ranges before evaluating the closures (use `safe_normalize` on normals). - Making each BSDF isolated means that we might carry duplicated data (normals for instance) but this should be optimized by compilers. - Makes Translucent BSDF its own closure type to avoid having to disable raytraced shadows using hacks. - Separate transmission roughness is now working on Principled BSDF. - Makes principled shader variations using constants. Removing a lot of duplicated code. This needed `const` keyword detection in `gpu_material_library.c`. - SSR/SSS masking and data loading is a bit more consistent and defined outside of closure eval. The loading functions will act as accumulator if the lighting is not to be separated. - SSR pass now do a full deferred lighting evaluation, including lights, in order to avoid interference with the closure eval code. However, it seems that the cost of having a global SSR toggle uniform is making the surface shader more expensive (which is already the case, by the way). - Principle fully black specular tint now returns black instead of white. - This fixed some artifact issue on my AMD computer on normal surfaces (which might have been some uninitialized variables). - This touched the Ambient Occlusion because it needs to be evaluated for each closure. But to avoid the cost of this, we use another approach to just pass the result of the occlusion on interpolated normals and modify it using the bent normal for each Closure. This tends to reduce shadowing. I'm still looking into improving this but this is out of the scope of this patch. - Performance might be a bit worse with this patch since it is more oriented towards code modularity. But not by a lot. Render tests needs to be updated after this. Reviewed By: jbakker Differential Revision: https://developer.blender.org/D10390 # Conflicts: # source/blender/draw/engines/eevee/eevee_shaders.c # source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl # source/blender/draw/intern/shaders/common_math_lib.glsl --- source/blender/draw/CMakeLists.txt | 8 +- .../engines/eevee/eevee_screen_raytrace.c | 7 +- .../draw/engines/eevee/eevee_shaders.c | 32 +- .../eevee/shaders/ambient_occlusion_lib.glsl | 27 +- .../eevee/shaders/bsdf_common_lib.glsl | 19 +- .../shaders/closure_eval_diffuse_lib.glsl | 85 +++ .../shaders/closure_eval_glossy_lib.glsl | 136 +++++ .../eevee/shaders/closure_eval_lib.glsl | 316 ++++++++++ .../shaders/closure_eval_refraction_lib.glsl | 128 ++++ .../shaders/closure_eval_translucent_lib.glsl | 71 +++ .../eevee/shaders/closure_lit_lib.glsl | 545 ----------------- ...closure_lib.glsl => closure_type_lib.glsl} | 26 +- .../eevee/shaders/common_utiltex_lib.glsl | 13 + .../eevee/shaders/effect_ssr_frag.glsl | 143 +++-- .../engines/eevee/shaders/lightprobe_lib.glsl | 9 +- .../engines/eevee/shaders/lights_lib.glsl | 61 +- .../engines/eevee/shaders/prepass_frag.glsl | 8 +- .../eevee/shaders/shadow_accum_frag.glsl | 8 +- .../engines/eevee/shaders/surface_frag.glsl | 9 +- .../engines/eevee/shaders/surface_lib.glsl | 12 +- .../eevee/shaders/volumetric_frag.glsl | 2 +- .../draw/intern/shaders/common_math_lib.glsl | 10 + .../blender/gpu/intern/gpu_material_library.c | 4 + ...gpu_shader_material_ambient_occlusion.glsl | 2 +- .../material/gpu_shader_material_diffuse.glsl | 23 +- .../gpu_shader_material_eevee_specular.glsl | 78 ++- .../material/gpu_shader_material_glass.glsl | 55 +- .../material/gpu_shader_material_glossy.glsl | 37 +- .../gpu_shader_material_principled.glsl | 562 +++++------------- .../gpu_shader_material_refraction.glsl | 29 +- ...shader_material_subsurface_scattering.glsl | 32 +- .../gpu_shader_material_translucent.glsl | 16 +- .../nodes/node_shader_bsdf_principled.c | 46 +- 33 files changed, 1296 insertions(+), 1263 deletions(-) create mode 100644 source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl create mode 100644 source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl delete mode 100644 source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl rename source/blender/draw/engines/eevee/shaders/{closure_lib.glsl => closure_type_lib.glsl} (86%) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index e52e30a6c44..8abd353d36d 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -197,7 +197,6 @@ set(LIB data_to_c_simple(engines/eevee/shaders/ambient_occlusion_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC) -data_to_c_simple(engines/eevee/shaders/closure_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/common_utiltex_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/lights_lib.glsl SRC) @@ -215,7 +214,12 @@ data_to_c_simple(engines/eevee/shaders/lightprobe_grid_fill_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_vert.glsl SRC) data_to_c_simple(engines/eevee/shaders/lookdev_world_frag.glsl SRC) -data_to_c_simple(engines/eevee/shaders/closure_lit_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_diffuse_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_glossy_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_refraction_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_eval_translucent_lib.glsl SRC) +data_to_c_simple(engines/eevee/shaders/closure_type_lib.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_dof_bokeh_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl SRC) diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index 1465c9dd84c..db5c86dc5e1 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -191,6 +191,12 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_texture_ref(grp, "hitBuffer", &effects->ssr_hit_output); DRW_shgroup_uniform_texture_ref(grp, "pdfBuffer", &effects->ssr_pdf_output); DRW_shgroup_uniform_texture_ref(grp, "prevColorBuffer", &txl->color_double_buffer); + DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); + DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool); + DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool); + DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); + DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); + DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); @@ -198,7 +204,6 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); DRW_shgroup_uniform_int(grp, "neighborOffset", &effects->ssr_neighbor_ofs, 1); if ((effects->enabled_effects & EFFECT_GTAO) != 0) { - DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); } diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index ec058afd58e..64efca83915 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -149,7 +149,6 @@ static struct { struct GPUShader *volumetric_accum_sh; /* Shader strings */ - char *closure_lit_lib; char *surface_lit_frag; char *surface_prepass_frag; char *surface_geom_barycentric; @@ -191,7 +190,7 @@ extern char datatoc_bsdf_common_lib_glsl[]; extern char datatoc_bsdf_lut_frag_glsl[]; extern char datatoc_bsdf_sampling_lib_glsl[]; extern char datatoc_btdf_lut_frag_glsl[]; -extern char datatoc_closure_lib_glsl[]; +extern char datatoc_closure_type_lib_glsl[]; extern char datatoc_common_uniforms_lib_glsl[]; extern char datatoc_common_utiltex_lib_glsl[]; extern char datatoc_cryptomatte_frag_glsl[]; @@ -241,7 +240,11 @@ extern char datatoc_lightprobe_planar_downsample_geom_glsl[]; extern char datatoc_lightprobe_planar_downsample_vert_glsl[]; extern char datatoc_lightprobe_vert_glsl[]; extern char datatoc_lights_lib_glsl[]; -extern char datatoc_closure_lit_lib_glsl[]; +extern char datatoc_closure_eval_lib_glsl[]; +extern char datatoc_closure_eval_diffuse_lib_glsl[]; +extern char datatoc_closure_eval_glossy_lib_glsl[]; +extern char datatoc_closure_eval_refraction_lib_glsl[]; +extern char datatoc_closure_eval_translucent_lib_glsl[]; extern char datatoc_ltc_lib_glsl[]; extern char datatoc_object_motion_frag_glsl[]; extern char datatoc_object_motion_vert_glsl[]; @@ -296,24 +299,14 @@ static void eevee_shader_library_ensure(void) DRW_SHADER_LIB_ADD(e_data.lib, lights_lib); DRW_SHADER_LIB_ADD(e_data.lib, surface_lib); DRW_SHADER_LIB_ADD(e_data.lib, volumetric_lib); - DRW_SHADER_LIB_ADD(e_data.lib, closure_lib); DRW_SHADER_LIB_ADD(e_data.lib, ssr_lib); DRW_SHADER_LIB_ADD(e_data.lib, effect_dof_lib); - - /* Add one for each Closure */ - e_data.closure_lit_lib = BLI_string_joinN(datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl, - datatoc_closure_lit_lib_glsl); - - DRW_shader_library_add_file(e_data.lib, e_data.closure_lit_lib, "closure_lit_lib.glsl"); + DRW_SHADER_LIB_ADD(e_data.lib, closure_type_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_diffuse_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_glossy_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_translucent_lib); + DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_refraction_lib); e_data.surface_lit_frag = DRW_shader_library_create_shader_string(e_data.lib, datatoc_surface_frag_glsl); @@ -1545,7 +1538,6 @@ struct GPUMaterial *EEVEE_material_get( void EEVEE_shaders_free(void) { - MEM_SAFE_FREE(e_data.closure_lit_lib); MEM_SAFE_FREE(e_data.surface_prepass_frag); MEM_SAFE_FREE(e_data.surface_lit_frag); MEM_SAFE_FREE(e_data.surface_geom_barycentric); diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl index 2f6f8327f58..7c0ae3881d7 100644 --- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl @@ -191,15 +191,15 @@ void gtao_deferred( dirs.xy = get_ao_dir(noise.x * 0.5); dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5); - bent_normal = normal * 1e-8; - visibility = 1e-8; + bent_normal = vec3(0.0); + visibility = 0.0; horizons = unpack_horizons(horizons); integrate_slice(normal, dirs.xy, horizons.xy, visibility, bent_normal); integrate_slice(normal, dirs.zw, horizons.zw, visibility, bent_normal); - bent_normal = normalize(bent_normal / visibility); + bent_normal = safe_normalize(bent_normal); visibility *= 0.5; /* We integrated 2 slices. */ } @@ -240,13 +240,24 @@ float gtao_multibounce(float visibility, vec3 albedo) return max(x, ((x * a + b) * x + c) * x); } +float diffuse_occlusion(vec3 N, vec3 vis_cone_dir, float vis_cone_aperture_cos, vec3 albedo) +{ + if ((int(aoSettings) & USE_AO) == 0) { + return 1.0; + } + /* If the shading normal is orthogonal to the geometric normal, it should be half lit. */ + float horizon_fac = saturate(dot(N, vis_cone_dir) * 0.5 + 0.5); + float ao = vis_cone_aperture_cos * horizon_fac; + return gtao_multibounce(ao, albedo); +} + float specular_occlusion(float NV, float AO, float roughness) { return saturate(pow(NV + AO, roughness) - 1.0 + AO); } /* Use the right occlusion */ -float occlusion_compute(vec3 N, vec3 vpos, float user_occlusion, vec4 rand, out vec3 bent_normal) +float occlusion_compute(vec3 N, vec3 vpos, vec4 rand, out vec3 bent_normal) { #ifndef USE_REFRACTION if ((int(aoSettings) & USE_AO) != 0) { @@ -263,10 +274,6 @@ float occlusion_compute(vec3 N, vec3 vpos, float user_occlusion, vec4 rand, out visibility = max(1e-3, visibility); if ((int(aoSettings) & USE_BENT_NORMAL) != 0) { - /* The bent normal will show the facet look of the mesh. Try to minimize this. */ - float mix_fac = visibility * visibility * visibility; - bent_normal = normalize(mix(bent_normal, vnor, mix_fac)); - bent_normal = transform_direction(ViewMatrixInverse, bent_normal); } else { @@ -276,10 +283,10 @@ float occlusion_compute(vec3 N, vec3 vpos, float user_occlusion, vec4 rand, out /* Scale by user factor */ visibility = pow(visibility, aoFactor); - return min(visibility, user_occlusion); + return visibility; } #endif bent_normal = N; - return user_occlusion; + return 1.0; } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 3560ae62a84..f050cf3a08a 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -1,6 +1,15 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) +vec3 diffuse_dominant_dir(vec3 N, vec3 vis_cone_dir, float vis_cone_aperture_cos) +{ + /* TODO(fclem) revisit this. bent too much towards vis_cone_dir. */ + vis_cone_aperture_cos *= sqr(vis_cone_aperture_cos); + + N = mix(vis_cone_dir, N, vis_cone_aperture_cos); + return normalize(N); +} + vec3 specular_dominant_dir(vec3 N, vec3 V, float roughness) { vec3 R = -reflect(V, N); @@ -79,7 +88,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut) { /* Unreal specular matching : if specular color is below 2% intensity, * treat as shadowning */ - return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y * abs(f90) + lut.x * f0; + return lut.y * f90 + lut.x * f0; } /* Multi-scattering brdf approximation from : @@ -87,11 +96,7 @@ vec3 F_brdf_single_scatter(vec3 f0, vec3 f90, vec2 lut) * by Carmelo J. Fdez-Agüera. */ vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut) { - vec3 FssEss = F_brdf_single_scatter(f0, f90, lut); - /* Hack to avoid many more shader variations. */ - if (f90.g < 0.0) { - return FssEss; - } + vec3 FssEss = lut.y * f90 + lut.x * f0; float Ess = lut.x + lut.y; float Ems = 1.0 - Ess; @@ -102,8 +107,6 @@ vec3 F_brdf_multi_scatter(vec3 f0, vec3 f90, vec2 lut) return FssEss + Fms * Ems; } -#define F_brdf(f0, f90, lut) F_brdf_multi_scatter(f0, f90, lut) - /* GGX */ float D_ggx_opti(float NH, float a2) { diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl new file mode 100644 index 00000000000..1e65d3ccb87 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl @@ -0,0 +1,85 @@ +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputDiffuse { + vec3 N; /** Shading normal. */ + vec3 albedo; /** Used for multibounce GTAO approximation. Not applied to final radiance. */ +}; + +#define CLOSURE_INPUT_Diffuse_DEFAULT ClosureInputDiffuse(vec3(0.0), vec3(0.0)) + +struct ClosureEvalDiffuse { + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float ambient_occlusion; /** Final occlusion for distant lighting. */ +}; + +/* Stubs. */ +#define ClosureOutputDiffuse ClosureOutput +#define closure_Diffuse_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Diffuse_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalDiffuse closure_Diffuse_eval_init(inout ClosureInputDiffuse cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputDiffuse cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_out.radiance = vec3(0.0); + + ClosureEvalDiffuse cl_eval; + cl_eval.ambient_occlusion = diffuse_occlusion( + cl_in.N, cl_common.bent_normal, cl_common.occlusion, cl_in.albedo); + cl_eval.probe_sampling_dir = diffuse_dominant_dir( + cl_in.N, cl_common.bent_normal, cl_common.occlusion); + return cl_eval; +} + +void closure_Diffuse_light_eval(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputDiffuse cl_out) +{ + float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L); + /* TODO(fclem) We could try to shadow lights that are shadowless with the ambient_occlusion + * factor here. */ + cl_out.radiance += light.data.l_color * (light.vis * light.contact_shadow * radiance); +} + +void closure_Diffuse_grid_eval(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + ClosureGridData grid, + inout ClosureOutputDiffuse cl_out) +{ + vec3 probe_radiance = probe_evaluate_grid( + grid.data, cl_common.P, cl_eval.probe_sampling_dir, grid.local_pos); + cl_out.radiance += grid.attenuation * probe_radiance; +} + +void closure_Diffuse_indirect_end(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputDiffuse cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (cl_common.diffuse_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_diff(cl_eval.probe_sampling_dir); + cl_out.radiance += cl_common.diffuse_accum * probe_radiance; + } + /* Apply occlusion on radiance before the light loop. */ + cl_out.radiance *= cl_eval.ambient_occlusion; +} + +void closure_Diffuse_eval_end(ClosureInputDiffuse cl_in, + ClosureEvalDiffuse cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputDiffuse cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl new file mode 100644 index 00000000000..9d539ec5a48 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -0,0 +1,136 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputGlossy { + vec3 N; /** Shading normal. */ + float roughness; /** Input roughness, not squared. */ +}; + +#define CLOSURE_INPUT_Glossy_DEFAULT ClosureInputGlossy(vec3(0.0), 0.0) + +struct ClosureEvalGlossy { + vec4 ltc_mat; /** LTC matrix values. */ + float ltc_brdf_scale; /** LTC BRDF scaling. */ + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float spec_occlusion; /** Specular Occlusion. */ + vec3 raytrace_radiance; /** Raytrace reflection to be accumulated after occlusion. */ +}; + +/* Stubs. */ +#define ClosureOutputGlossy ClosureOutput +#define closure_Glossy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) + +#ifdef STEP_RESOLVE /* SSR */ +/* Prototype. */ +void raytrace_resolve(ClosureInputGlossy cl_in, + inout ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out); +#endif + +ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in, + inout ClosureEvalCommon cl_common, + out ClosureOutputGlossy cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999); + cl_out.radiance = vec3(0.0); + + float NV = dot(cl_in.N, cl_common.V); + vec2 lut_uv = lut_coords_ltc(NV, cl_in.roughness); + + ClosureEvalGlossy cl_eval; + cl_eval.ltc_mat = texture(utilTex, vec3(lut_uv, LTC_MAT_LAYER)); + cl_eval.probe_sampling_dir = specular_dominant_dir(cl_in.N, cl_common.V, sqr(cl_in.roughness)); + cl_eval.spec_occlusion = specular_occlusion(NV, cl_common.occlusion, cl_in.roughness); + cl_eval.raytrace_radiance = vec3(0.0); + +#ifdef STEP_RESOLVE /* SSR */ + raytrace_resolve(cl_in, cl_eval, cl_common, cl_out); +#endif + + /* The brdf split sum LUT is applied after the radiance accumulation. + * Correct the LTC so that its energy is constant. */ + /* TODO(fclem) Optimize this so that only one scale factor is stored. */ + vec4 ltc_brdf = texture(utilTex, vec3(lut_uv, LTC_BRDF_LAYER)).barg; + vec2 split_sum_brdf = ltc_brdf.zw; + cl_eval.ltc_brdf_scale = (ltc_brdf.x + ltc_brdf.y) / (split_sum_brdf.x + split_sum_brdf.y); + return cl_eval; +} + +void closure_Glossy_light_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputGlossy cl_out) +{ + float radiance = light_specular(light.data, cl_eval.ltc_mat, cl_in.N, cl_common.V, light.L); + radiance *= cl_eval.ltc_brdf_scale; + cl_out.radiance += light.data.l_color * + (light.data.l_spec * light.vis * light.contact_shadow * radiance); +} + +void closure_Glossy_planar_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + ClosurePlanarData planar, + inout ClosureOutputGlossy cl_out) +{ +#ifndef STEP_RESOLVE /* SSR already evaluates planar reflections. */ + vec3 probe_radiance = probe_evaluate_planar( + planar.id, planar.data, cl_common.P, cl_in.N, cl_common.V, cl_in.roughness); + cl_out.radiance += planar.attenuation * probe_radiance; +#else + /* HACK: Fix an issue with planar reflections still being counted inside the specular + * accumulator. This only works because we only use one Glossy closure in the resolve pass. */ + cl_common.specular_accum += planar.attenuation; +#endif +} + +void closure_Glossy_cubemap_eval(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + ClosureCubemapData cube, + inout ClosureOutputGlossy cl_out) +{ + vec3 probe_radiance = probe_evaluate_cube( + cube.id, cl_common.P, cl_eval.probe_sampling_dir, cl_in.roughness); + cl_out.radiance += cube.attenuation * probe_radiance; +} + +void closure_Glossy_indirect_end(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (specToggle && cl_common.specular_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir, cl_in.roughness); + cl_out.radiance += cl_common.specular_accum * probe_radiance; + } + + /* Apply occlusion on distant lighting. */ + cl_out.radiance *= cl_eval.spec_occlusion; + /* Apply Raytrace reflections after occlusion since they are direct, local reflections. */ + cl_out.radiance += cl_eval.raytrace_radiance; +} + +void closure_Glossy_eval_end(ClosureInputGlossy cl_in, + ClosureEvalGlossy cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif + + if (!specToggle) { + cl_out.radiance = vec3(0.0); + } +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl new file mode 100644 index 00000000000..b1bb5f96f5c --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -0,0 +1,316 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) + +/** + * Extensive use of Macros to be able to change the maximum amount of evaluated closure easily. + * NOTE: GLSL does not support variadic macros. + * + * Example + * // Declare the cl_eval function + * CLOSURE_EVAL_FUNCTION_DECLARE_3(name, Diffuse, Glossy, Refraction); + * // Declare the inputs & outputs + * CLOSURE_VARS_DECLARE(Diffuse, Glossy, Refraction); + * // Specify inputs + * in_Diffuse_0.N = N; + * ... + * // Call the cl_eval function + * CLOSURE_EVAL_FUNCTION_3(name, Diffuse, Glossy, Refraction); + * // Get the cl_out + * closure.radiance = out_Diffuse_0.radiance + out_Glossy_1.radiance + out_Refraction_2.radiance; + **/ + +#define CLOSURE_VARS_DECLARE(t0, t1, t2, t3) \ + ClosureInputCommon in_common = CLOSURE_INPUT_COMMON_DEFAULT; \ + ClosureInput##t0 in_##t0##_0 = CLOSURE_INPUT_##t0##_DEFAULT; \ + ClosureInput##t1 in_##t1##_1 = CLOSURE_INPUT_##t1##_DEFAULT; \ + ClosureInput##t2 in_##t2##_2 = CLOSURE_INPUT_##t2##_DEFAULT; \ + ClosureInput##t3 in_##t3##_3 = CLOSURE_INPUT_##t3##_DEFAULT; \ + ClosureOutput##t0 out_##t0##_0; \ + ClosureOutput##t1 out_##t1##_1; \ + ClosureOutput##t2 out_##t2##_2; \ + ClosureOutput##t3 out_##t3##_3; + +#define CLOSURE_EVAL_DECLARE(t0, t1, t2, t3) \ + ClosureEvalCommon cl_common = closure_Common_eval_init(in_common); \ + ClosureEval##t0 eval_##t0##_0 = closure_##t0##_eval_init(in_##t0##_0, cl_common, out_##t0##_0); \ + ClosureEval##t1 eval_##t1##_1 = closure_##t1##_eval_init(in_##t1##_1, cl_common, out_##t1##_1); \ + ClosureEval##t2 eval_##t2##_2 = closure_##t2##_eval_init(in_##t2##_2, cl_common, out_##t2##_2); \ + ClosureEval##t3 eval_##t3##_3 = closure_##t3##_eval_init(in_##t3##_3, cl_common, out_##t3##_3); + +#define CLOSURE_META_SUBROUTINE(subroutine, t0, t1, t2, t3) \ + closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, out_##t0##_0); \ + closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, out_##t1##_1); \ + closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, out_##t2##_2); \ + closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, out_##t3##_3); + +#define CLOSURE_META_SUBROUTINE_DATA(subroutine, sub_data, t0, t1, t2, t3) \ + closure_##t0##_##subroutine(in_##t0##_0, eval_##t0##_0, cl_common, sub_data, out_##t0##_0); \ + closure_##t1##_##subroutine(in_##t1##_1, eval_##t1##_1, cl_common, sub_data, out_##t1##_1); \ + closure_##t2##_##subroutine(in_##t2##_2, eval_##t2##_2, cl_common, sub_data, out_##t2##_2); \ + closure_##t3##_##subroutine(in_##t3##_3, eval_##t3##_3, cl_common, sub_data, out_##t3##_3); + +/* Inputs are inout so that callers can get the final inputs used for evaluation. */ +#define CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3) \ + void closure_##name##_eval(ClosureInputCommon in_common, \ + inout ClosureInput##t0 in_##t0##_0, \ + inout ClosureInput##t1 in_##t1##_1, \ + inout ClosureInput##t2 in_##t2##_2, \ + inout ClosureInput##t3 in_##t3##_3, \ + out ClosureOutput##t0 out_##t0##_0, \ + out ClosureOutput##t1 out_##t1##_1, \ + out ClosureOutput##t2 out_##t2##_2, \ + out ClosureOutput##t3 out_##t3##_3) \ + { \ + CLOSURE_EVAL_DECLARE(t0, t1, t2, t3); \ +\ + for (int i = 0; cl_common.specular_accum > 0.0 && i < prbNumPlanar && i < MAX_PLANAR; i++) { \ + ClosurePlanarData planar = closure_planar_eval_init(i, cl_common); \ + if (planar.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(planar_eval, planar, t0, t1, t2, t3); \ + } \ + } \ +\ + /* Starts at 1 because 0 is world cubemap. */ \ + for (int i = 1; cl_common.specular_accum > 0.0 && i < prbNumRenderCube && i < MAX_PROBE; \ + i++) { \ + ClosureCubemapData cube = closure_cubemap_eval_init(i, cl_common); \ + if (cube.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(cubemap_eval, cube, t0, t1, t2, t3); \ + } \ + } \ +\ + /* Starts at 1 because 0 is world irradiance. */ \ + for (int i = 1; cl_common.diffuse_accum > 0.0 && i < prbNumRenderGrid && i < MAX_GRID; i++) { \ + ClosureGridData grid = closure_grid_eval_init(i, cl_common); \ + if (grid.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(grid_eval, grid, t0, t1, t2, t3); \ + } \ + } \ +\ + CLOSURE_META_SUBROUTINE(indirect_end, t0, t1, t2, t3); \ +\ + for (int i = 0; i < laNumLight && i < MAX_LIGHT; i++) { \ + ClosureLightData light = closure_light_eval_init(cl_common, i); \ + if (light.vis > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(light_eval, light, t0, t1, t2, t3); \ + } \ + } \ +\ + CLOSURE_META_SUBROUTINE(eval_end, t0, t1, t2, t3); \ + } + +#define CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3) \ + closure_##name##_eval(in_common, \ + in_##t0##_0, \ + in_##t1##_1, \ + in_##t2##_2, \ + in_##t3##_3, \ + out_##t0##_0, \ + out_##t1##_1, \ + out_##t2##_2, \ + out_##t3##_3) + +#define CLOSURE_EVAL_FUNCTION_DECLARE_1(name, t0) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, Dummy, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_2(name, t0, t1) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_3(name, t0, t1, t2) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, Dummy) +#define CLOSURE_EVAL_FUNCTION_DECLARE_4(name, t0, t1, t2, t3) \ + CLOSURE_EVAL_FUNCTION_DECLARE(name, t0, t1, t2, t3) + +#define CLOSURE_VARS_DECLARE_1(t0) CLOSURE_VARS_DECLARE(t0, Dummy, Dummy, Dummy) +#define CLOSURE_VARS_DECLARE_2(t0, t1) CLOSURE_VARS_DECLARE(t0, t1, Dummy, Dummy) +#define CLOSURE_VARS_DECLARE_3(t0, t1, t2) CLOSURE_VARS_DECLARE(t0, t1, t2, Dummy) +#define CLOSURE_VARS_DECLARE_4(t0, t1, t2, t3) CLOSURE_VARS_DECLARE(t0, t1, t2, t3) + +#define CLOSURE_EVAL_FUNCTION_1(name, t0) CLOSURE_EVAL_FUNCTION(name, t0, Dummy, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_2(name, t0, t1) CLOSURE_EVAL_FUNCTION(name, t0, t1, Dummy, Dummy) +#define CLOSURE_EVAL_FUNCTION_3(name, t0, t1, t2) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, Dummy) +#define CLOSURE_EVAL_FUNCTION_4(name, t0, t1, t2, t3) CLOSURE_EVAL_FUNCTION(name, t0, t1, t2, t3) + +/* -------------------------------------------------------------------- */ +/** \name Dummy Closure + * + * Dummy closure type that will be optimized out by the compiler. + * \{ */ + +#define ClosureInputDummy ClosureOutput +#define ClosureOutputDummy ClosureOutput +#define ClosureEvalDummy ClosureOutput +#define CLOSURE_EVAL_DUMMY ClosureOutput(vec3(0)) +#define CLOSURE_INPUT_Dummy_DEFAULT CLOSURE_EVAL_DUMMY +#define closure_Dummy_eval_init(cl_in, cl_common, cl_out) CLOSURE_EVAL_DUMMY +#define closure_Dummy_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_indirect_end(cl_in, cl_eval, cl_common, cl_out) +#define closure_Dummy_light_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Dummy_eval_end(cl_in, cl_eval, cl_common, cl_out) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common cl_eval data + * + * Eval data not dependant on input parameters. All might not be used but unused ones + * will be optimized out. + * \{ */ + +struct ClosureInputCommon { + /** Custom occlusion value set by the user. */ + float occlusion; +}; + +#define CLOSURE_INPUT_COMMON_DEFAULT ClosureInputCommon(1.0) + +struct ClosureEvalCommon { + /** View vector. */ + vec3 V; + /** Surface position. */ + vec3 P; + /** Normal vector, always facing camera. */ + vec3 N; + /** Normal vector, always facing camera. (viewspace) */ + vec3 vN; + /** Surface position. (viewspace) */ + vec3 vP; + /** Geometric normal, always facing camera. (viewspace) */ + vec3 vNg; + /** Random numbers. 3 random sequences. zw is a random point on a circle. */ + vec4 rand; + /** Final occlusion factor. Mix of the user occlusion and SSAO. */ + float occlusion; + /** Least occluded direction in the hemisphere. */ + vec3 bent_normal; + + /** Specular probe accumulator. Shared between planar and cubemap probe. */ + float specular_accum; + /** Diffuse probe accumulator. */ + float diffuse_accum; + /** Viewspace depth to start raytracing from. */ + float tracing_depth; +}; + +/* Common cl_out struct used by most closures. */ +struct ClosureOutput { + vec3 radiance; +}; + +ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) +{ + ClosureEvalCommon cl_eval; + cl_eval.rand = texelfetch_noise_tex(gl_FragCoord.xy); + cl_eval.V = cameraVec; + cl_eval.P = worldPosition; + cl_eval.N = safe_normalize(gl_FrontFacing ? worldNormal : -worldNormal); + cl_eval.vN = safe_normalize(gl_FrontFacing ? viewNormal : -viewNormal); + cl_eval.vP = viewPosition; + cl_eval.vNg = safe_normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + /* TODO(fclem) See if we can avoid this complicated setup. */ + cl_eval.tracing_depth = gl_FragCoord.z; + /* Constant bias (due to depth buffer precision) */ + /* Magic numbers for 24bits of precision. + * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ + cl_eval.tracing_depth -= mix(2.4e-7, 4.8e-7, gl_FragCoord.z); + /* Convert to view Z. */ + cl_eval.tracing_depth = get_view_z_from_depth(cl_eval.tracing_depth); + + /* TODO(fclem) Do occlusion evaluation per Closure using shading normal. */ + cl_eval.occlusion = min( + cl_in.occlusion, + occlusion_compute(cl_eval.N, cl_eval.vP, cl_eval.rand, cl_eval.bent_normal)); + + cl_eval.specular_accum = 1.0; + cl_eval.diffuse_accum = 1.0; + return cl_eval; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Loop data + * + * Loop datas are conveniently packed into struct to make it future proof. + * \{ */ + +struct ClosureLightData { + LightData data; /** Light Data. */ + vec4 L; /** Non-Normalized Light Vector (surface to light) with length in W component. */ + float vis; /** Light visibility. */ + float contact_shadow; /** Result of contact shadow tracing. */ +}; + +ClosureLightData closure_light_eval_init(ClosureEvalCommon cl_common, int light_id) +{ + ClosureLightData light; + light.data = lights_data[light_id]; + + light.L.xyz = light.data.l_position - cl_common.P; + light.L.w = length(light.L.xyz); + + light.vis = light_visibility(light.data, cl_common.P, light.L); + light.contact_shadow = light_contact_shadows(light.data, + cl_common.P, + cl_common.vP, + cl_common.tracing_depth, + cl_common.vNg, + cl_common.rand.x, + light.vis); + + return light; +} + +struct ClosureCubemapData { + int id; /** Probe id. */ + float attenuation; /** Attenuation. */ +}; + +ClosureCubemapData closure_cubemap_eval_init(int cube_id, inout ClosureEvalCommon cl_common) +{ + ClosureCubemapData cube; + cube.id = cube_id; + cube.attenuation = probe_attenuation_cube(cube_id, cl_common.P); + cube.attenuation = min(cube.attenuation, cl_common.specular_accum); + cl_common.specular_accum -= cube.attenuation; + return cube; +} + +struct ClosurePlanarData { + int id; /** Probe id. */ + PlanarData data; /** planars_data[id]. */ + float attenuation; /** Attenuation. */ +}; + +ClosurePlanarData closure_planar_eval_init(int planar_id, inout ClosureEvalCommon cl_common) +{ + ClosurePlanarData planar; + planar.id = planar_id; + planar.data = planars_data[planar_id]; + planar.attenuation = probe_attenuation_planar(planar.data, cl_common.P, cl_common.N, 0.0); + planar.attenuation = min(planar.attenuation, cl_common.specular_accum); + cl_common.specular_accum -= planar.attenuation; + return planar; +} + +struct ClosureGridData { + int id; /** Grid id. */ + GridData data; /** grids_data[id] */ + float attenuation; /** Attenuation. */ + vec3 local_pos; /** Local position inside the grid. */ +}; + +ClosureGridData closure_grid_eval_init(int id, inout ClosureEvalCommon cl_common) +{ + ClosureGridData grid; + grid.id = id; + grid.data = grids_data[id]; + grid.attenuation = probe_attenuation_grid(grid.data, cl_common.P, grid.local_pos); + grid.attenuation = min(grid.attenuation, cl_common.diffuse_accum); + cl_common.diffuse_accum -= grid.attenuation; + return grid; +} + +/** \} */ diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl new file mode 100644 index 00000000000..9011eea07c4 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_refraction_lib.glsl @@ -0,0 +1,128 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) +#pragma BLENDER_REQUIRE(ssr_lib.glsl) + +struct ClosureInputRefraction { + vec3 N; /** Shading normal. */ + float roughness; /** Input roughness, not squared. */ + float ior; /** Index of refraction ratio. */ +}; + +#define CLOSURE_INPUT_Refraction_DEFAULT ClosureInputRefraction(vec3(0.0), 0.0, 0.0) + +struct ClosureEvalRefraction { + vec3 P; /** LTC matrix values. */ + vec3 ltc_brdf; /** LTC BRDF values. */ + vec3 probe_sampling_dir; /** Direction to sample probes from. */ + float probes_weight; /** Factor to apply to probe radiance. */ +}; + +/* Stubs. */ +#define ClosureOutputRefraction ClosureOutput +#define closure_Refraction_grid_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalRefraction closure_Refraction_eval_init(inout ClosureInputRefraction cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputRefraction cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_in.roughness = clamp(cl_in.roughness, 1e-8, 0.9999); + cl_in.ior = max(cl_in.ior, 1e-5); + cl_out.radiance = vec3(0.0); + + ClosureEvalRefraction cl_eval; + vec3 cl_V; + float eval_ior; + /* Refract the view vector using the depth heuristic. + * Then later Refract a second time the already refracted + * ray using the inverse ior. */ + if (refractionDepth > 0.0) { + eval_ior = 1.0 / cl_in.ior; + cl_V = -refract(-cl_common.V, cl_in.N, eval_ior); + vec3 plane_pos = cl_common.P - cl_in.N * refractionDepth; + cl_eval.P = line_plane_intersect(cl_common.P, cl_V, plane_pos, cl_in.N); + } + else { + eval_ior = cl_in.ior; + cl_V = cl_common.V; + cl_eval.P = cl_common.P; + } + + cl_eval.probe_sampling_dir = refraction_dominant_dir(cl_in.N, cl_V, cl_in.roughness, eval_ior); + cl_eval.probes_weight = 1.0; + +#ifdef USE_REFRACTION + if (ssrefractToggle && cl_in.roughness < ssrMaxRoughness + 0.2) { + /* Find approximated position of the 2nd refraction event. */ + vec3 vP = (refractionDepth > 0.0) ? transform_point(ViewMatrix, cl_eval.P) : cl_common.vP; + vec4 ssr_output = screen_space_refraction( + vP, cl_in.N, cl_V, eval_ior, sqr(cl_in.roughness), cl_common.rand); + ssr_output.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, cl_in.roughness); + cl_out.radiance += ssr_output.rgb * ssr_output.a; + cl_eval.probes_weight -= ssr_output.a; + } +#endif + return cl_eval; +} + +void closure_Refraction_light_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputRefraction cl_out) +{ + /* Not implemented yet. */ +} + +void closure_Refraction_planar_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosurePlanarData planar, + inout ClosureOutputRefraction cl_out) +{ + /* Not implemented yet. */ +} + +void closure_Refraction_cubemap_eval(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + ClosureCubemapData cube, + inout ClosureOutputRefraction cl_out) +{ + vec3 probe_radiance = probe_evaluate_cube( + cube.id, cl_eval.P, cl_eval.probe_sampling_dir, sqr(cl_in.roughness)); + cl_out.radiance += (cube.attenuation * cl_eval.probes_weight) * probe_radiance; +} + +void closure_Refraction_indirect_end(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputRefraction cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (specToggle && cl_common.specular_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_spec(cl_eval.probe_sampling_dir, + sqr(cl_in.roughness)); + cl_out.radiance += (cl_common.specular_accum * cl_eval.probes_weight) * probe_radiance; + } +} + +void closure_Refraction_eval_end(ClosureInputRefraction cl_in, + ClosureEvalRefraction cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputRefraction cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif + + if (!specToggle) { + cl_out.radiance = vec3(0.0); + } +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl new file mode 100644 index 00000000000..66c467af29b --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_translucent_lib.glsl @@ -0,0 +1,71 @@ + +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(lights_lib.glsl) +#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) +#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) + +struct ClosureInputTranslucent { + vec3 N; /** Shading normal. */ +}; + +#define CLOSURE_INPUT_Translucent_DEFAULT ClosureInputTranslucent(vec3(0.0)) + +/* Stubs. */ +#define ClosureEvalTranslucent ClosureEvalDummy +#define ClosureOutputTranslucent ClosureOutput +#define closure_Translucent_planar_eval(cl_in, cl_eval, cl_common, data, cl_out) +#define closure_Translucent_cubemap_eval(cl_in, cl_eval, cl_common, data, cl_out) + +ClosureEvalTranslucent closure_Translucent_eval_init(inout ClosureInputTranslucent cl_in, + ClosureEvalCommon cl_common, + out ClosureOutputTranslucent cl_out) +{ + cl_in.N = safe_normalize(cl_in.N); + cl_out.radiance = vec3(0.0); + return CLOSURE_EVAL_DUMMY; +} + +void closure_Translucent_light_eval(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + ClosureLightData light, + inout ClosureOutputTranslucent cl_out) +{ + float radiance = light_diffuse(light.data, cl_in.N, cl_common.V, light.L); + cl_out.radiance += light.data.l_color * (light.vis * radiance); +} + +void closure_Translucent_grid_eval(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + ClosureGridData grid, + inout ClosureOutputTranslucent cl_out) +{ + vec3 probe_radiance = probe_evaluate_grid(grid.data, cl_common.P, cl_in.N, grid.local_pos); + cl_out.radiance += grid.attenuation * probe_radiance; +} + +void closure_Translucent_indirect_end(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputTranslucent cl_out) +{ + /* If not enough light has been accumulated from probes, use the world specular cubemap + * to fill the remaining energy needed. */ + if (cl_common.diffuse_accum > 0.0) { + vec3 probe_radiance = probe_evaluate_world_diff(cl_in.N); + cl_out.radiance += cl_common.diffuse_accum * probe_radiance; + } +} + +void closure_Translucent_eval_end(ClosureInputTranslucent cl_in, + ClosureEvalTranslucent cl_eval, + ClosureEvalCommon cl_common, + inout ClosureOutputTranslucent cl_out) +{ +#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) + /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ + cl_out.radiance = vec3(0.0); + return; +#endif +} diff --git a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl deleted file mode 100644 index 30ce60f3ec0..00000000000 --- a/source/blender/draw/engines/eevee/shaders/closure_lit_lib.glsl +++ /dev/null @@ -1,545 +0,0 @@ - -#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) -#pragma BLENDER_REQUIRE(lightprobe_lib.glsl) -#pragma BLENDER_REQUIRE(ambient_occlusion_lib.glsl) -#pragma BLENDER_REQUIRE(ssr_lib.glsl) - -/** - * AUTO CONFIG - * We include the file multiple times each time with a different configuration. - * This leads to a lot of deadcode. Better idea would be to only generate the one needed. - */ -#if !defined(SURFACE_DEFAULT) -# define SURFACE_DEFAULT -# define CLOSURE_NAME eevee_closure_default -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -#endif /* SURFACE_DEFAULT */ - -#if !defined(SURFACE_DEFAULT_CLEARCOAT) && !defined(CLOSURE_NAME) -# define SURFACE_DEFAULT_CLEARCOAT -# define CLOSURE_NAME eevee_closure_default_clearcoat -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -#endif /* SURFACE_DEFAULT_CLEARCOAT */ - -#if !defined(SURFACE_PRINCIPLED) && !defined(CLOSURE_NAME) -# define SURFACE_PRINCIPLED -# define CLOSURE_NAME eevee_closure_principled -# define CLOSURE_DIFFUSE -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -# define CLOSURE_REFRACTION -# define CLOSURE_SUBSURFACE -#endif /* SURFACE_PRINCIPLED */ - -#if !defined(SURFACE_CLEARCOAT) && !defined(CLOSURE_NAME) -# define SURFACE_CLEARCOAT -# define CLOSURE_NAME eevee_closure_clearcoat -# define CLOSURE_GLOSSY -# define CLOSURE_CLEARCOAT -#endif /* SURFACE_CLEARCOAT */ - -#if !defined(SURFACE_DIFFUSE) && !defined(CLOSURE_NAME) -# define SURFACE_DIFFUSE -# define CLOSURE_NAME eevee_closure_diffuse -# define CLOSURE_DIFFUSE -#endif /* SURFACE_DIFFUSE */ - -#if !defined(SURFACE_SUBSURFACE) && !defined(CLOSURE_NAME) -# define SURFACE_SUBSURFACE -# define CLOSURE_NAME eevee_closure_subsurface -# define CLOSURE_DIFFUSE -# define CLOSURE_SUBSURFACE -#endif /* SURFACE_SUBSURFACE */ - -#if !defined(SURFACE_SKIN) && !defined(CLOSURE_NAME) -# define SURFACE_SKIN -# define CLOSURE_NAME eevee_closure_skin -# define CLOSURE_DIFFUSE -# define CLOSURE_SUBSURFACE -# define CLOSURE_GLOSSY -#endif /* SURFACE_SKIN */ - -#if !defined(SURFACE_GLOSSY) && !defined(CLOSURE_NAME) -# define SURFACE_GLOSSY -# define CLOSURE_NAME eevee_closure_glossy -# define CLOSURE_GLOSSY -#endif /* SURFACE_GLOSSY */ - -#if !defined(SURFACE_REFRACT) && !defined(CLOSURE_NAME) -# define SURFACE_REFRACT -# define CLOSURE_NAME eevee_closure_refraction -# define CLOSURE_REFRACTION -#endif /* SURFACE_REFRACT */ - -#if !defined(SURFACE_GLASS) && !defined(CLOSURE_NAME) -# define SURFACE_GLASS -# define CLOSURE_NAME eevee_closure_glass -# define CLOSURE_GLOSSY -# define CLOSURE_REFRACTION -#endif /* SURFACE_GLASS */ - -/* Safety : CLOSURE_CLEARCOAT implies CLOSURE_GLOSSY */ -#ifdef CLOSURE_CLEARCOAT -# ifndef CLOSURE_GLOSSY -# define CLOSURE_GLOSSY -# endif -#endif /* CLOSURE_CLEARCOAT */ - -void CLOSURE_NAME(vec3 N -#ifdef CLOSURE_DIFFUSE - , - vec3 albedo -#endif -#ifdef CLOSURE_GLOSSY - , - vec3 f0, - vec3 f90, - int ssr_id -#endif -#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - , - float roughness -#endif -#ifdef CLOSURE_CLEARCOAT - , - vec3 C_N, - float C_intensity, - float C_roughness -#endif -#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE) - , - float ao -#endif -#ifdef CLOSURE_SUBSURFACE - , - float sss_scale -#endif -#ifdef CLOSURE_REFRACTION - , - float ior -#endif - , - const bool use_contact_shadows -#ifdef CLOSURE_DIFFUSE - , - out vec3 out_diff -#endif -#ifdef CLOSURE_GLOSSY - , - out vec3 out_spec -#endif -#ifdef CLOSURE_REFRACTION - , - out vec3 out_refr -#endif -#ifdef CLOSURE_GLOSSY - , - out vec3 ssr_spec -#endif -) -{ -#ifdef CLOSURE_DIFFUSE - out_diff = vec3(0.0); -#endif - -#ifdef CLOSURE_GLOSSY - out_spec = vec3(0.0); -#endif - -#ifdef CLOSURE_REFRACTION - out_refr = vec3(0.0); -#endif - -#if defined(DEPTH_SHADER) || defined(WORLD_BACKGROUND) - /* This makes shader resources become unused and avoid issues with samplers. (see T59747) */ - return; -#else - - /* Zero length vectors cause issues, see: T51979. */ - float len = length(N); - if (isnan(len)) { - return; - } - N /= len; - -# ifdef CLOSURE_CLEARCOAT - len = length(C_N); - if (isnan(len)) { - return; - } - C_N /= len; -# endif - -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - roughness = clamp(roughness, 1e-8, 0.9999); - float roughnessSquared = roughness * roughness; -# endif - -# ifdef CLOSURE_CLEARCOAT - C_roughness = clamp(C_roughness, 1e-8, 0.9999); - float C_roughnessSquared = C_roughness * C_roughness; -# endif - - vec3 V = cameraVec; - - vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - - /* ---------------------------------------------------------------- */ - /* -------------------- SCENE LIGHTS LIGHTING --------------------- */ - /* ---------------------------------------------------------------- */ - -# ifdef CLOSURE_GLOSSY - vec2 lut_uv = lut_coords_ltc(dot(N, V), roughness); - vec4 ltc_mat = texture(utilTex, vec3(lut_uv, 0.0)).rgba; -# endif - -# ifdef CLOSURE_CLEARCOAT - vec2 lut_uv_clear = lut_coords_ltc(dot(C_N, V), C_roughness); - vec4 ltc_mat_clear = texture(utilTex, vec3(lut_uv_clear, 0.0)).rgba; - vec3 out_spec_clear = vec3(0.0); -# endif - - float tracing_depth = gl_FragCoord.z; - /* Constant bias (due to depth buffer precision) */ - /* Magic numbers for 24bits of precision. - * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ - tracing_depth -= mix(2.4e-7, 4.8e-7, gl_FragCoord.z); - /* Convert to view Z. */ - tracing_depth = get_view_z_from_depth(tracing_depth); - - vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); - - for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { - LightData ld = lights_data[i]; - - vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - worldPosition; - l_vector.w = length(l_vector.xyz); - - float l_vis = light_visibility(ld, - worldPosition, - viewPosition, - tracing_depth, - true_normal, - rand.x, - use_contact_shadows, - l_vector); - - if (l_vis < 1e-8) { - continue; - } - - vec3 l_color_vis = ld.l_color * l_vis; - -# ifdef CLOSURE_DIFFUSE - out_diff += l_color_vis * light_diffuse(ld, N, V, l_vector); -# endif - -# ifdef CLOSURE_GLOSSY - out_spec += l_color_vis * light_specular(ld, ltc_mat, N, V, l_vector) * ld.l_spec; -# endif - -# ifdef CLOSURE_CLEARCOAT - out_spec_clear += l_color_vis * light_specular(ld, ltc_mat_clear, C_N, V, l_vector) * - ld.l_spec; -# endif - } - -# ifdef CLOSURE_GLOSSY - vec2 brdf_lut_lights = texture(utilTex, vec3(lut_uv, 1.0)).ba; - out_spec *= F_brdf(f0, f90, brdf_lut_lights.xy); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec2 brdf_lut_lights_clear = texture(utilTex, vec3(lut_uv_clear, 1.0)).ba; - out_spec_clear *= F_brdf(vec3(0.04), vec3(1.0), brdf_lut_lights_clear.xy); - out_spec += out_spec_clear * C_intensity; -# endif - - /* ---------------------------------------------------------------- */ - /* ---------------- SPECULAR ENVIRONMENT LIGHTING ----------------- */ - /* ---------------------------------------------------------------- */ - - /* Accumulate incoming light from all sources until accumulator is full. Then apply Occlusion and - * BRDF. */ -# ifdef CLOSURE_GLOSSY - vec4 spec_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec4 C_spec_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_REFRACTION - vec4 refr_accum = vec4(0.0); -# endif - -# ifdef CLOSURE_GLOSSY - /* ---------------------------- */ - /* Planar Reflections */ - /* ---------------------------- */ - - for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar && spec_accum.a < 0.999; i++) { - PlanarData pd = planars_data[i]; - - /* Fade on geometric normal. */ - float fade = probe_attenuation_planar( - pd, worldPosition, (gl_FrontFacing) ? worldNormal : -worldNormal, roughness); - - if (fade > 0.0) { - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_planar(float(i), pd, worldPosition, N, V, roughness, fade); - accumulate_light(spec, fade, spec_accum); - } - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_planar(float(i), pd, worldPosition, C_N, V, C_roughness, fade); - accumulate_light(C_spec, fade, C_spec_accum); -# endif - } - } -# endif - -# ifdef CLOSURE_GLOSSY - vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared); -# endif - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec_dir = specular_dominant_dir(C_N, V, C_roughnessSquared); -# endif - -# ifdef CLOSURE_REFRACTION - /* Refract the view vector using the depth heuristic. - * Then later Refract a second time the already refracted - * ray using the inverse ior. */ - float final_ior = (refractionDepth > 0.0) ? 1.0 / ior : ior; - vec3 refr_V = (refractionDepth > 0.0) ? -refract(-V, N, final_ior) : V; - vec3 refr_pos = (refractionDepth > 0.0) ? - line_plane_intersect( - worldPosition, refr_V, worldPosition - N * refractionDepth, N) : - worldPosition; - vec3 refr_dir = refraction_dominant_dir(N, refr_V, roughness, final_ior); -# endif - -# ifdef CLOSURE_REFRACTION -/* ---------------------------- */ -/* Screen Space Refraction */ -/* ---------------------------- */ -# ifdef USE_REFRACTION - if (ssrefractToggle && roughness < ssrMaxRoughness + 0.2) { - /* Find approximated position of the 2nd refraction event. */ - vec3 refr_vpos = (refractionDepth > 0.0) ? transform_point(ViewMatrix, refr_pos) : - viewPosition; - vec4 trans = screen_space_refraction(refr_vpos, N, refr_V, final_ior, roughnessSquared, rand); - trans.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); - accumulate_light(trans.rgb, trans.a, refr_accum); - } -# endif - -# endif - - /* ---------------------------- */ - /* Specular probes */ - /* ---------------------------- */ -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION) - -# if defined(CLOSURE_GLOSSY) && defined(CLOSURE_REFRACTION) -# define GLASS_ACCUM 1 -# define ACCUM min(refr_accum.a, spec_accum.a) -# elif defined(CLOSURE_REFRACTION) -# define GLASS_ACCUM 0 -# define ACCUM refr_accum.a -# else -# define GLASS_ACCUM 0 -# define ACCUM spec_accum.a -# endif - - /* Starts at 1 because 0 is world probe */ - for (int i = 1; ACCUM < 0.999 && i < prbNumRenderCube && i < MAX_PROBE; i++) { - float fade = probe_attenuation_cube(i, worldPosition); - - if (fade > 0.0) { - -# if GLASS_ACCUM - if (spec_accum.a < 0.999) { -# endif -# ifdef CLOSURE_GLOSSY - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_cube(i, worldPosition, spec_dir, roughness); - accumulate_light(spec, fade, spec_accum); - } -# endif - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_cube(i, worldPosition, C_spec_dir, C_roughness); - accumulate_light(C_spec, fade, C_spec_accum); -# endif -# if GLASS_ACCUM - } -# endif - -# if GLASS_ACCUM - if (refr_accum.a < 0.999) { -# endif -# ifdef CLOSURE_REFRACTION - vec3 trans = probe_evaluate_cube(i, refr_pos, refr_dir, roughnessSquared); - accumulate_light(trans, fade, refr_accum); -# endif -# if GLASS_ACCUM - } -# endif - } - } - -# undef GLASS_ACCUM -# undef ACCUM - -/* ---------------------------- */ -/* World Probe */ -/* ---------------------------- */ -# ifdef CLOSURE_GLOSSY - if (spec_accum.a < 0.999) { - if (!(ssrToggle && ssr_id == outputSsrId)) { - vec3 spec = probe_evaluate_world_spec(spec_dir, roughness); - accumulate_light(spec, 1.0, spec_accum); - } - -# ifdef CLOSURE_CLEARCOAT - vec3 C_spec = probe_evaluate_world_spec(C_spec_dir, C_roughness); - accumulate_light(C_spec, 1.0, C_spec_accum); -# endif - } -# endif - -# ifdef CLOSURE_REFRACTION - if (refr_accum.a < 0.999) { - vec3 trans = probe_evaluate_world_spec(refr_dir, roughnessSquared); - accumulate_light(trans, 1.0, refr_accum); - } -# endif -# endif /* Specular probes */ - - /* ---------------------------- */ - /* Ambient Occlusion */ - /* ---------------------------- */ -# if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE) - if (!use_contact_shadows) { - /* HACK: Fix for translucent BSDF. (see T65631) */ - N = -N; - } - vec3 bent_normal; - float final_ao = occlusion_compute(N, viewPosition, ao, rand, bent_normal); - if (!use_contact_shadows) { - N = -N; - /* Bypass bent normal. */ - bent_normal = N; - } -# endif - - /* ---------------------------- */ - /* Specular Output */ - /* ---------------------------- */ - float NV = dot(N, V); -# ifdef CLOSURE_GLOSSY - vec2 uv = lut_coords(NV, roughness); - vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg; - - /* This factor is outputted to be used by SSR in order - * to match the intensity of the regular reflections. */ - ssr_spec = F_brdf(f0, f90, brdf_lut); - float spec_occlu = specular_occlusion(NV, final_ao, roughness); - - /* The SSR pass recompute the occlusion to not apply it to the SSR */ - if (ssrToggle && ssr_id == outputSsrId) { - spec_occlu = 1.0; - } - - out_spec += spec_accum.rgb * ssr_spec * spec_occlu; -# endif - -# ifdef CLOSURE_REFRACTION - float btdf = get_btdf_lut(NV, roughness, ior); - - out_refr += refr_accum.rgb * btdf; - - /* Global toggle for lightprobe baking. */ - out_refr *= float(specToggle); -# endif - -# ifdef CLOSURE_CLEARCOAT - NV = dot(C_N, V); - vec2 C_uv = lut_coords(NV, C_roughness); - vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg; - vec3 C_fresnel = F_brdf(vec3(0.04), vec3(1.0), C_brdf_lut) * - specular_occlusion(NV, final_ao, C_roughness); - - out_spec += C_spec_accum.rgb * C_fresnel * C_intensity; -# endif - -# ifdef CLOSURE_GLOSSY - /* Global toggle for lightprobe baking. */ - out_spec *= float(specToggle); -# endif - - /* ---------------------------------------------------------------- */ - /* ---------------- DIFFUSE ENVIRONMENT LIGHTING ------------------ */ - /* ---------------------------------------------------------------- */ - - /* Accumulate light from all sources until accumulator is full. Then apply Occlusion and BRDF. */ -# ifdef CLOSURE_DIFFUSE - vec4 diff_accum = vec4(0.0); - - /* ---------------------------- */ - /* Irradiance Grids */ - /* ---------------------------- */ - /* Start at 1 because 0 is world irradiance */ - for (int i = 1; i < MAX_GRID && i < prbNumRenderGrid && diff_accum.a < 0.999; i++) { - GridData gd = grids_data[i]; - - vec3 localpos; - float fade = probe_attenuation_grid(gd, grids_data[i].localmat, worldPosition, localpos); - - if (fade > 0.0) { - vec3 diff = probe_evaluate_grid(gd, worldPosition, bent_normal, localpos); - accumulate_light(diff, fade, diff_accum); - } - } - - /* ---------------------------- */ - /* World Diffuse */ - /* ---------------------------- */ - if (diff_accum.a < 0.999 && prbNumRenderGrid > 0) { - vec3 diff = probe_evaluate_world_diff(bent_normal); - accumulate_light(diff, 1.0, diff_accum); - } - - out_diff += diff_accum.rgb * gtao_multibounce(final_ao, albedo); -# endif -#endif -} - -/* Cleanup for next configuration */ -#undef CLOSURE_NAME - -#ifdef CLOSURE_DIFFUSE -# undef CLOSURE_DIFFUSE -#endif - -#ifdef CLOSURE_GLOSSY -# undef CLOSURE_GLOSSY -#endif - -#ifdef CLOSURE_CLEARCOAT -# undef CLOSURE_CLEARCOAT -#endif - -#ifdef CLOSURE_REFRACTION -# undef CLOSURE_REFRACTION -#endif - -#ifdef CLOSURE_SUBSURFACE -# undef CLOSURE_SUBSURFACE -#endif diff --git a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl similarity index 86% rename from source/blender/draw/engines/eevee/shaders/closure_lib.glsl rename to source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl index b56a186ab3f..9ca25ef240f 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl @@ -147,17 +147,27 @@ Closure closure_emission(vec3 rgb) #ifndef VOLUMETRICS +/* Let radiance passthrough or replace it to get the BRDF and color + * to applied to the SSR result. */ +vec3 closure_mask_ssr_radiance(vec3 radiance, float ssr_id) +{ + return (ssrToggle && int(ssr_id) == outputSsrId) ? vec3(1.0) : radiance; +} + void closure_load_ssr_data( - vec3 ssr_spec, float roughness, vec3 N, vec3 viewVec, int ssr_id, inout Closure cl) + vec3 ssr_radiance, float roughness, vec3 N, float ssr_id, inout Closure cl) { /* Still encode to avoid artifacts in the SSR pass. */ vec3 vN = normalize(mat3(ViewMatrix) * N); - cl.ssr_normal = normal_encode(vN, viewVec); + cl.ssr_normal = normal_encode(vN, viewCameraVec); - if (ssr_id == outputSsrId) { - cl.ssr_data = vec4(ssr_spec, roughness); + if (ssrToggle && int(ssr_id) == outputSsrId) { + cl.ssr_data = vec4(ssr_radiance, roughness); cl.flag |= CLOSURE_SSR_FLAG; } + else { + cl.radiance += ssr_radiance; + } } void closure_load_sss_data( @@ -169,13 +179,11 @@ void closure_load_sss_data( cl.sss_radius = radius; cl.sss_albedo = sss_albedo; cl.flag |= CLOSURE_SSS_FLAG; - cl.radiance += render_pass_diffuse_mask(sss_albedo, vec3(0)); + /* Irradiance will be convolved by SSSS pass. Do not add to radiance. */ + sss_irradiance = vec3(0); } - else # endif - { - cl.radiance += render_pass_diffuse_mask(sss_albedo, sss_irradiance * sss_albedo); - } + cl.radiance += render_pass_diffuse_mask(vec3(1), sss_irradiance) * sss_albedo; } #endif diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl index 427657b19b7..7b1a0b263c0 100644 --- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl @@ -12,6 +12,13 @@ uniform sampler2DArray utilTex; #define LUT_SIZE 64 +#define LTC_MAT_LAYER 0 +#define LTC_BRDF_LAYER 1 +#define BRDF_LUT_LAYER 1 +#define NOISE_LAYER 2 +#define LTC_DISK_LAYER 3 /* UNUSED */ +/* Layers 4 to 20 are for BTDF Lut. */ + /** * Reminder: The 4 noise values are based of 3 uncorrelated blue noises: * x : Uniformly distributed value [0..1] (noise 1). @@ -23,6 +30,7 @@ uniform sampler2DArray utilTex; /* Return texture coordinates to sample Surface LUT */ vec2 lut_coords(float cosTheta, float roughness) { + /* TODO(fclem) Ugly Acos here. Get rid ot this. Should use same mapping as lut_coords_ltc. */ float theta = acos(cosTheta); vec2 coords = vec2(roughness, theta / M_PI_2); @@ -38,6 +46,11 @@ vec2 lut_coords_ltc(float cosTheta, float roughness) return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; } +vec2 brdf_lut(float cosTheta, float roughness) +{ + return textureLod(utilTex, vec3(lut_coords(cosTheta, roughness), BRDF_LUT_LAYER), 0.0).rg; +} + float get_btdf_lut(float NV, float roughness, float ior) { const vec3 lut_scale_bias_texel_size = vec3((LUT_SIZE - 1.0), 0.5, 1.5) / LUT_SIZE; diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index d50a4eaea3c..b49cd987a6e 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -2,6 +2,8 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) #pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) #pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) #pragma BLENDER_REQUIRE(raytrace_lib.glsl) #pragma BLENDER_REQUIRE(lightprobe_lib.glsl) #pragma BLENDER_REQUIRE(ssr_lib.glsl) @@ -170,7 +172,7 @@ void main() /* Importance sampling bias */ rand.x = mix(rand.x, 0.0, ssrBrdfBias); - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); + vec3 W = transform_point(ViewMatrixInverse, viewPosition); vec3 wN = transform_direction(ViewMatrixInverse, N); vec3 T, B; @@ -180,12 +182,12 @@ void main() for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { PlanarData pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, worldPosition, wN, 0.0); + float fade = probe_attenuation_planar(pd, W, wN, 0.0); if (fade > 0.5) { /* Find view vector / reflection plane intersection. */ /* TODO optimize, use view space for all. */ - vec3 tracePosition = line_plane_intersect(worldPosition, cameraVec, pd.pl_plane_eq); + vec3 tracePosition = line_plane_intersect(W, cameraVec, pd.pl_plane_eq); tracePosition = transform_point(ViewMatrix, tracePosition); vec3 planeNormal = transform_direction(ViewMatrix, pd.pl_normal); @@ -213,6 +215,8 @@ uniform sampler2D pdfBuffer; uniform int neighborOffset; +in vec4 uvcoordsvar; + const ivec2 neighbors[32] = ivec2[32](ivec2(0, 0), ivec2(1, 1), ivec2(-2, 0), @@ -298,7 +302,7 @@ float get_sample_depth(vec2 hit_co, bool is_planar, float planar_index) vec3 get_hit_vector(vec3 hit_pos, PlanarData pd, - vec3 worldPosition, + vec3 P, vec3 N, vec3 V, bool is_planar, @@ -309,7 +313,7 @@ vec3 get_hit_vector(vec3 hit_pos, if (is_planar) { /* Reflect back the hit position to have it in non-reflected world space */ - vec3 trace_pos = line_plane_intersect(worldPosition, V, pd.pl_plane_eq); + vec3 trace_pos = line_plane_intersect(P, V, pd.pl_plane_eq); hit_vec = hit_pos - trace_pos; hit_vec = reflect(hit_vec, pd.pl_normal); /* Modify here so mip texel alignment is correct. */ @@ -317,8 +321,8 @@ vec3 get_hit_vector(vec3 hit_pos, } else { /* Find hit position in previous frame. */ - hit_co = get_reprojected_reflection(hit_pos, worldPosition, N); - hit_vec = hit_pos - worldPosition; + hit_co = get_reprojected_reflection(hit_pos, P, N); + hit_vec = hit_pos - P; } mask = screen_border_mask(hit_co); @@ -339,7 +343,7 @@ vec4 get_ssr_samples(vec4 hit_pdf, ivec4 hit_data[2], PlanarData pd, float planar_index, - vec3 worldPosition, + vec3 P, vec3 N, vec3 V, float roughnessSquared, @@ -379,14 +383,10 @@ vec4 get_ssr_samples(vec4 hit_pdf, /* Get actual hit vector and hit coordinate (from last frame). */ vec4 mask = vec4(1.0); - hit_pos[0] = get_hit_vector( - hit_pos[0], pd, worldPosition, N, V, is_planar.x, hit_co[0].xy, mask.x); - hit_pos[1] = get_hit_vector( - hit_pos[1], pd, worldPosition, N, V, is_planar.y, hit_co[0].zw, mask.y); - hit_pos[2] = get_hit_vector( - hit_pos[2], pd, worldPosition, N, V, is_planar.z, hit_co[1].xy, mask.z); - hit_pos[3] = get_hit_vector( - hit_pos[3], pd, worldPosition, N, V, is_planar.w, hit_co[1].zw, mask.w); + hit_pos[0] = get_hit_vector(hit_pos[0], pd, P, N, V, is_planar.x, hit_co[0].xy, mask.x); + hit_pos[1] = get_hit_vector(hit_pos[1], pd, P, N, V, is_planar.y, hit_co[0].zw, mask.y); + hit_pos[2] = get_hit_vector(hit_pos[2], pd, P, N, V, is_planar.z, hit_co[1].xy, mask.z); + hit_pos[3] = get_hit_vector(hit_pos[3], pd, P, N, V, is_planar.w, hit_co[1].zw, mask.w); vec4 hit_dist; hit_dist.x = length(hit_pos[0]); @@ -476,47 +476,30 @@ vec4 get_ssr_samples(vec4 hit_pdf, return accum; } -void main() +void raytrace_resolve(ClosureInputGlossy cl_in, + inout ClosureEvalGlossy cl_eval, + inout ClosureEvalCommon cl_common, + inout ClosureOutputGlossy cl_out) { - ivec2 fullres_texel = ivec2(gl_FragCoord.xy); # ifdef FULLRES - ivec2 halfres_texel = fullres_texel; + ivec2 texel = ivec2(gl_FragCoord.xy); # else - ivec2 halfres_texel = ivec2(gl_FragCoord.xy / 2.0); + ivec2 texel = ivec2(gl_FragCoord.xy / 2.0); # endif - vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0)); - - float depth = textureLod(depthBuffer, uvs, 0.0).r; - - /* Early out */ - if (depth == 1.0) { - discard; - } - /* Using world space */ - vec3 viewPosition = get_view_space_from_depth(uvs, depth); /* Needed for viewCameraVec */ - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); - vec3 V = cameraVec; - vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, viewCameraVec); - vec3 N = transform_direction(ViewMatrixInverse, vN); - vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba; + vec3 V = cl_common.V; + vec3 N = cl_in.N; + vec3 P = cl_common.P; - /* Early out */ - if (dot(speccol_roughness.rgb, vec3(1.0)) == 0.0) { - discard; - } - - float roughness = speccol_roughness.a; - float roughnessSquared = max(1e-3, roughness * roughness); - - vec4 spec_accum = vec4(0.0); + float roughness = cl_in.roughness; + float roughnessSquared = max(1e-3, sqr(roughness)); /* Resolve SSR */ float cone_cos = cone_cosine(roughnessSquared); float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos; cone_tan *= mix(saturate(dot(N, -V) * 2.0), 1.0, roughness); /* Elongation fit */ - vec2 source_uvs = project_point(pastViewProjectionMatrix, worldPosition).xy * 0.5 + 0.5; + vec2 source_uvs = project_point(pastViewProjectionMatrix, P).xy * 0.5 + 0.5; vec4 ssr_accum = vec4(0.0); float weight_acc = 0.0; @@ -525,16 +508,16 @@ void main() /* TODO optimize with textureGather */ /* Doing these fetches early to hide latency. */ vec4 hit_pdf; - hit_pdf.x = texelFetch(pdfBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).r; - hit_pdf.y = texelFetch(pdfBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).r; - hit_pdf.z = texelFetch(pdfBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).r; - hit_pdf.w = texelFetch(pdfBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).r; + hit_pdf.x = texelFetch(pdfBuffer, texel + neighbors[0 + neighborOffset], 0).r; + hit_pdf.y = texelFetch(pdfBuffer, texel + neighbors[1 + neighborOffset], 0).r; + hit_pdf.z = texelFetch(pdfBuffer, texel + neighbors[2 + neighborOffset], 0).r; + hit_pdf.w = texelFetch(pdfBuffer, texel + neighbors[3 + neighborOffset], 0).r; ivec4 hit_data[2]; - hit_data[0].xy = texelFetch(hitBuffer, halfres_texel + neighbors[0 + neighborOffset], 0).rg; - hit_data[0].zw = texelFetch(hitBuffer, halfres_texel + neighbors[1 + neighborOffset], 0).rg; - hit_data[1].xy = texelFetch(hitBuffer, halfres_texel + neighbors[2 + neighborOffset], 0).rg; - hit_data[1].zw = texelFetch(hitBuffer, halfres_texel + neighbors[3 + neighborOffset], 0).rg; + hit_data[0].xy = texelFetch(hitBuffer, texel + neighbors[0 + neighborOffset], 0).rg; + hit_data[0].zw = texelFetch(hitBuffer, texel + neighbors[1 + neighborOffset], 0).rg; + hit_data[1].xy = texelFetch(hitBuffer, texel + neighbors[2 + neighborOffset], 0).rg; + hit_data[1].zw = texelFetch(hitBuffer, texel + neighbors[3 + neighborOffset], 0).rg; /* Find Planar Reflections affecting this pixel */ PlanarData pd; @@ -542,7 +525,7 @@ void main() for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, worldPosition, N, 0.0); + float fade = probe_attenuation_planar(pd, P, N, 0.0); if (fade > 0.5) { planar_index = float(i); @@ -554,7 +537,7 @@ void main() hit_data, pd, planar_index, - worldPosition, + P, N, V, roughnessSquared, @@ -564,19 +547,51 @@ void main() } /* Compute SSR contribution */ - if (weight_acc > 0.0) { - ssr_accum /= weight_acc; - /* fade between 0.5 and 1.0 roughness */ - ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); - accumulate_light(ssr_accum.rgb, ssr_accum.a, spec_accum); + ssr_accum *= (weight_acc == 0.0) ? 0.0 : (1.0 / weight_acc); + /* fade between 0.5 and 1.0 roughness */ + ssr_accum.a *= smoothstep(ssrMaxRoughness + 0.2, ssrMaxRoughness, roughness); + + cl_eval.raytrace_radiance = ssr_accum.rgb * ssr_accum.a; + cl_common.specular_accum -= ssr_accum.a; +} + +CLOSURE_EVAL_FUNCTION_DECLARE_1(ssr_resolve, Glossy) + +void main() +{ + ivec2 texel = ivec2(gl_FragCoord.xy); + float depth = texelFetch(depthBuffer, texel, 0).r; + + if (depth == 1.0) { + discard; } - /* If SSR contribution is not 1.0, blend with cubemaps */ - if (spec_accum.a < 1.0) { - fallback_cubemap(N, V, worldPosition, viewPosition, roughness, roughnessSquared, spec_accum); + vec4 speccol_roughness = texelFetch(specroughBuffer, texel, 0).rgba; + vec3 brdf = speccol_roughness.rgb; + float roughness = speccol_roughness.a; + + if (max_v3(brdf) <= 0.0) { + discard; } - fragColor = vec4(spec_accum.rgb * speccol_roughness.rgb, 1.0); + viewPosition = get_view_space_from_depth(uvcoordsvar.xy, depth); + worldPosition = transform_point(ViewMatrixInverse, viewPosition); + + vec2 normal_encoded = texelFetch(normalBuffer, texel, 0).rg; + viewNormal = normal_decode(normal_encoded, viewCameraVec); + worldNormal = transform_direction(ViewMatrixInverse, viewNormal); + + CLOSURE_VARS_DECLARE_1(Glossy); + + in_Glossy_0.N = worldNormal; + in_Glossy_0.roughness = roughness; + + /* Do a full deferred evaluation of the glossy BSDF. The only difference is that we inject the + * SSR resolve before the cubemap iter. BRDF term is already computed during main pass and is + * passed as specular color. */ + CLOSURE_EVAL_FUNCTION_1(ssr_resolve, Glossy); + + fragColor = vec4(out_Glossy_0.radiance * brdf, 1.0); } #endif diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index a2e25b83532..fe4f3dcaa2f 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -137,9 +137,9 @@ float probe_attenuation_planar(PlanarData pd, vec3 W, vec3 N, float roughness) return fac; } -float probe_attenuation_grid(GridData gd, mat4 localmat, vec3 W, out vec3 localpos) +float probe_attenuation_grid(GridData gd, vec3 W, out vec3 localpos) { - localpos = transform_point(localmat, W); + localpos = transform_point(gd.localmat, W); vec3 pos_to_edge = max(vec3(0.0), abs(localpos) - 1.0); float fade = length(pos_to_edge); return saturate(-fade * gd.g_atten_scale + gd.g_atten_bias); @@ -183,8 +183,7 @@ vec3 probe_evaluate_world_spec(vec3 R, float roughness) return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), roughness * prbLodCubeMax).rgb; } -vec3 probe_evaluate_planar( - float id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness, inout float fade) +vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness) { /* Find view vector / reflection plane intersection. */ vec3 point_on_plane = line_plane_intersect(W, V, pd.pl_plane_eq); @@ -226,7 +225,7 @@ void fallback_cubemap(vec3 N, #ifdef SSR_AO vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); vec3 bent_normal; - float final_ao = occlusion_compute(N, viewPosition, 1.0, rand, bent_normal); + float final_ao = occlusion_compute(N, viewPosition, rand, bent_normal); final_ao = specular_occlusion(dot(N, V), final_ao, roughness); #else const float final_ao = 1.0; diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl index 949e4d8f04f..b0845057a43 100644 --- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl @@ -252,32 +252,29 @@ float light_attenuation(LightData ld, vec4 l_vector) return vis; } -float light_shadowing(LightData ld, - vec3 W, -#ifndef VOLUMETRICS - vec3 viewPosition, - float tracing_depth, - vec3 true_normal, - float rand_x, - const bool use_contact_shadows, -#endif - float vis) +float light_shadowing(LightData ld, vec3 W, float vis) { #if !defined(VOLUMETRICS) || defined(VOLUME_SHADOW) - /* shadowing */ if (ld.l_shadowid >= 0.0 && vis > 0.001) { - if (ld.l_type == SUN) { vis *= sample_cascade_shadow(int(ld.l_shadowid), W); } else { vis *= sample_cube_shadow(int(ld.l_shadowid), W); } + } +#endif + return vis; +} -# ifndef VOLUMETRICS +#ifndef VOLUMETRICS +float light_contact_shadows( + LightData ld, vec3 P, vec3 vP, float tracing_depth, vec3 vNg, float rand_x, float vis) +{ + if (ld.l_shadowid >= 0.0 && vis > 0.001) { ShadowData sd = shadows_data[int(ld.l_shadowid)]; /* Only compute if not already in shadow. */ - if (use_contact_shadows && sd.sh_contact_dist > 0.0 && vis > 1e-8) { + if (sd.sh_contact_dist > 0.0) { /* Contact Shadows. */ vec3 ray_ori, ray_dir; float trace_distance; @@ -287,54 +284,34 @@ float light_shadowing(LightData ld, ray_dir = shadows_cascade_data[int(sd.sh_data_index)].sh_shadow_vec * trace_distance; } else { - ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - W; + ray_dir = shadows_cube_data[int(sd.sh_data_index)].position.xyz - P; float len = length(ray_dir); trace_distance = min(sd.sh_contact_dist, len); ray_dir *= trace_distance / len; } ray_dir = transform_direction(ViewMatrix, ray_dir); - ray_ori = vec3(viewPosition.xy, tracing_depth) + true_normal * sd.sh_contact_offset; + ray_ori = vec3(vP.xy, tracing_depth) + vNg * sd.sh_contact_offset; vec3 hit_pos = raycast( -1, ray_ori, ray_dir, sd.sh_contact_thickness, rand_x, 0.1, 0.001, false); if (hit_pos.z > 0.0) { hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z); - float hit_dist = distance(viewPosition, hit_pos); + float hit_dist = distance(vP, hit_pos); float dist_ratio = hit_dist / trace_distance; - return vis * saturate(dist_ratio * 3.0 - 2.0); + return saturate(dist_ratio * 3.0 - 2.0); } } -# endif /* VOLUMETRICS */ } -#endif - - return vis; + return 1.0; } +#endif /* VOLUMETRICS */ -float light_visibility(LightData ld, - vec3 W, -#ifndef VOLUMETRICS - vec3 viewPosition, - float tracing_depth, - vec3 true_normal, - float rand_x, - const bool use_contact_shadows, -#endif - vec4 l_vector) +float light_visibility(LightData ld, vec3 W, vec4 l_vector) { float l_atten = light_attenuation(ld, l_vector); - return light_shadowing(ld, - W, -#ifndef VOLUMETRICS - viewPosition, - tracing_depth, - true_normal, - rand_x, - use_contact_shadows, -#endif - l_atten); + return light_shadowing(ld, W, l_atten); } float light_diffuse(LightData ld, vec3 N, vec3 V, vec4 l_vector) diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl index 34999076f9c..fd08dfda060 100644 --- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl @@ -5,8 +5,12 @@ #pragma BLENDER_REQUIRE(common_view_lib.glsl) #pragma BLENDER_REQUIRE(common_uniforms_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lit_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl) #pragma BLENDER_REQUIRE(surface_lib.glsl) #ifdef USE_ALPHA_HASH diff --git a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl index e0b9d4a60db..19eecdb5b79 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl @@ -39,7 +39,7 @@ void main() vec3 viewPosition = get_view_space_from_depth(uvs, depth); vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); - vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + vec3 true_normal = safe_normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { LightData ld = lights_data[i]; @@ -48,8 +48,10 @@ void main() l_vector.xyz = ld.l_position - worldPosition; l_vector.w = length(l_vector.xyz); - float l_vis = light_shadowing( - ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, true, 1.0); + float l_vis = light_shadowing(ld, worldPosition, 1.0); + + l_vis *= light_contact_shadows( + ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, 1.0); accum_light += l_vis; } diff --git a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl index d0297c8cb7f..62930b9944a 100644 --- a/source/blender/draw/engines/eevee/shaders/surface_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/surface_frag.glsl @@ -3,8 +3,13 @@ #pragma BLENDER_REQUIRE(common_hair_lib.glsl) #pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lit_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_diffuse_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_glossy_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_translucent_lib.glsl) +#pragma BLENDER_REQUIRE(closure_eval_refraction_lib.glsl) + #pragma BLENDER_REQUIRE(surface_lib.glsl) #pragma BLENDER_REQUIRE(volumetric_lib.glsl) diff --git a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl index b93a3a23eff..e80dc1761f0 100644 --- a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl @@ -13,7 +13,15 @@ uniform float refractionDepth; vec3 worldNormal; \ vec3 viewNormal; -#ifdef GPU_GEOMETRY_SHADER +#if defined(STEP_RESOLVE) || defined(STEP_RAYTRACE) +/* SSR will set these global variables itself. + * Also make false positive compiler warnings disapear by setting values. */ +vec3 worldPosition = vec3(0); +vec3 viewPosition = vec3(0); +vec3 worldNormal = vec3(0); +vec3 viewNormal = vec3(0); + +#elif defined(GPU_GEOMETRY_SHADER) in ShaderStageInterface{SURFACE_INTERFACE} dataIn[]; out ShaderStageInterface{SURFACE_INTERFACE} dataOut; @@ -24,7 +32,7 @@ out ShaderStageInterface{SURFACE_INTERFACE} dataOut; dataOut.worldNormal = dataIn[vert].worldNormal; \ dataOut.viewNormal = dataIn[vert].viewNormal; -#else +#else /* GPU_VERTEX_SHADER || GPU_FRAGMENT_SHADER*/ IN_OUT ShaderStageInterface{SURFACE_INTERFACE}; diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl index bac69ab0355..25661a0d731 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl @@ -1,6 +1,6 @@ #pragma BLENDER_REQUIRE(volumetric_lib.glsl) -#pragma BLENDER_REQUIRE(closure_lib.glsl) +#pragma BLENDER_REQUIRE(closure_type_lib.glsl) /* Based on Frosbite Unified Volumetric. * https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite */ diff --git a/source/blender/draw/intern/shaders/common_math_lib.glsl b/source/blender/draw/intern/shaders/common_math_lib.glsl index 9cb1723346d..0213ba2622b 100644 --- a/source/blender/draw/intern/shaders/common_math_lib.glsl +++ b/source/blender/draw/intern/shaders/common_math_lib.glsl @@ -96,6 +96,7 @@ float len_squared(vec2 a) { return dot(a, a); } #define weighted_sum(val0, val1, val2, val3, weights) ((val0 * weights[0] + val1 * weights[1] + val2 * weights[2] + val3 * weights[3]) * safe_rcp(sum(weights))); #define weighted_sum_array(val, weights) ((val[0] * weights[0] + val[1] * weights[1] + val[2] * weights[2] + val[3] * weights[3]) * safe_rcp(sum(weights))); + /* clang-format on */ #define saturate(a) clamp(a, 0.0, 1.0) @@ -112,6 +113,15 @@ float distance_squared(vec3 a, vec3 b) return dot(a, a); } +vec3 safe_normalize(vec3 v) +{ + float len = length(v); + if (isnan(len) || len == 0.0) { + return vec3(1.0, 0.0, 0.0); + } + return v / len; +} + /** \} */ /* ---------------------------------------------------------------------- */ diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c index 496988c4ba9..64cd375d466 100644 --- a/source/blender/gpu/intern/gpu_material_library.c +++ b/source/blender/gpu/intern/gpu_material_library.c @@ -755,6 +755,10 @@ static void gpu_parse_material_library(GHash *hash, GPUMaterialLibrary *library) /* get parameters */ while (*code && *code != ')') { + if (BLI_str_startswith(code, "const ")) { + code = gpu_str_skip_token(code, NULL, 0); + } + /* test if it's an input or output */ qual = FUNCTION_QUAL_IN; if (BLI_str_startswith(code, "out ")) { diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl index eea8d19efce..d718cc3f4fe 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl @@ -4,7 +4,7 @@ void node_ambient_occlusion( { vec3 bent_normal; vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - result_ao = occlusion_compute(normalize(normal), viewPosition, 1.0, rand, bent_normal); + result_ao = occlusion_compute(normalize(normal), viewPosition, rand, bent_normal); result_color = result_ao * color; } #else diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl index d7b6143d2a1..01a16e194ca 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_diffuse.glsl @@ -1,12 +1,27 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_diffuse, Diffuse) + void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result) { - N = normalize(N); + CLOSURE_VARS_DECLARE_1(Diffuse); + + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = color.rgb; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_diffuse, Diffuse); + result = CLOSURE_DEFAULT; - eevee_closure_diffuse(N, color.rgb, 1.0, true, result.radiance); - result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb); - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); + + out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1.0), out_Diffuse_0.radiance); + out_Diffuse_0.radiance *= color.rgb; + + result.radiance = out_Diffuse_0.radiance; + + /* TODO(fclem) Try to not use this. */ + closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result); } + #else /* Stub diffuse because it is not compatible with volumetrics. */ # define node_bsdf_diffuse(a, b, c, d) (d = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl index 443bab7529b..429c4ed41ac 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl @@ -1,4 +1,7 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_3(node_eevee_specular, Diffuse, Glossy, Glossy) + void node_eevee_specular(vec4 diffuse, vec4 specular, float roughness, @@ -12,34 +15,63 @@ void node_eevee_specular(vec4 diffuse, float ssr_id, out Closure result) { - normal = normalize(normal); + CLOSURE_VARS_DECLARE_3(Diffuse, Glossy, Glossy); - vec3 out_diff, out_spec, ssr_spec; - eevee_closure_default_clearcoat(normal, - diffuse.rgb, - specular.rgb, - vec3(1.0), - int(ssr_id), - roughness, - clearcoat_normal, - clearcoat * 0.25, - clearcoat_roughness, - occlusion, - true, - out_diff, - out_spec, - ssr_spec); + in_common.occlusion = occlusion; + + in_Diffuse_0.N = normal; /* Normalized during eval. */ + in_Diffuse_0.albedo = diffuse.rgb; + + in_Glossy_1.N = normal; /* Normalized during eval. */ + in_Glossy_1.roughness = roughness; + + in_Glossy_2.N = clearcoat_normal; /* Normalized during eval. */ + in_Glossy_2.roughness = clearcoat_roughness; + + CLOSURE_EVAL_FUNCTION_3(node_eevee_specular, Diffuse, Glossy, Glossy); - float alpha = 1.0 - transp; result = CLOSURE_DEFAULT; - result.radiance = render_pass_diffuse_mask(diffuse.rgb, out_diff * diffuse.rgb); - result.radiance += render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_emission_mask(emissive.rgb); - result.radiance *= alpha; - result.transmittance = vec3(transp); - closure_load_ssr_data(ssr_spec * alpha, roughness, normal, viewCameraVec, int(ssr_id), result); + { + /* Diffuse. */ + out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1), out_Diffuse_0.radiance); + out_Diffuse_0.radiance *= in_Diffuse_0.albedo; + result += out_Diffuse_0.radiance; + } + { + /* Glossy. */ + float NV = dot(in_Glossy_1.N, cameraVec); + vec2 split_sum = brdf_lut(NV, in_Glossy_1.roughness); + vec3 brdf = F_brdf_single_scatter(specular.rgb, vec3(1.0), split_sum); + + out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id); + out_Glossy_1.radiance *= brdf; + out_Glossy_1.radiance = render_pass_glossy_mask(spec_color, out_Glossy_1.radiance); + closure_load_ssr_data( + out_Glossy_1.radiance, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result); + } + { + /* Clearcoat. */ + float NV = dot(in_Glossy_2.N, cameraVec); + vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); + vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); + + out_Glossy_2.radiance *= brdf * clearcoat * 0.25; + out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance); + result.radiance += out_Glossy_2.radiance; + } + { + /* Emission. */ + vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb); + result.radiance += out_emission_radiance; + } + + float trans = 1.0 - trans; + result.transmittance = vec3(trans); + result.radiance *= alpha; + result.ssr_data.rgb *= alpha; } + #else /* Stub specular because it is not compatible with volumetrics. */ # define node_eevee_specular(a, b, c, d, e, f, g, h, i, j, k, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl index c328b4800bc..ba02ae6d886 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -1,4 +1,7 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_2(node_bsdf_glass, Glossy, Refraction) + void node_bsdf_glass(vec4 color, float roughness, float ior, @@ -7,32 +10,38 @@ void node_bsdf_glass(vec4 color, float ssr_id, out Closure result) { - N = normalize(N); - vec3 out_spec, out_refr, ssr_spec; - vec3 refr_color = (refractionDepth > 0.0) ? color.rgb * color.rgb : - color.rgb; /* Simulate 2 transmission event */ - eevee_closure_glass(N, - vec3(1.0), - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? vec3(1.0) : -vec3(1.0), - int(ssr_id), - roughness, - 1.0, - ior, - true, - out_spec, - out_refr, - ssr_spec); - float fresnel = F_eta(ior, dot(N, cameraVec)); - vec3 vN = mat3(ViewMatrix) * N; - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color) * (1.0 - fresnel); - result.radiance += render_pass_glossy_mask(color.rgb, out_spec * color.rgb) * fresnel; + CLOSURE_VARS_DECLARE_2(Glossy, Refraction); + in_Glossy_0.N = N; /* Normalized during eval. */ + in_Glossy_0.roughness = roughness; + + in_Refraction_1.N = N; /* Normalized during eval. */ + in_Refraction_1.roughness = roughness; + in_Refraction_1.ior = ior; + + CLOSURE_EVAL_FUNCTION_2(node_bsdf_glass, Glossy, Refraction); + + result = CLOSURE_DEFAULT; + + float fresnel = F_eta(in_Refraction_1.ior, dot(in_Glossy_0.N, cameraVec)); + + vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec), in_Glossy_0.roughness); + vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : + F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); + out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); + out_Glossy_0.radiance *= brdf; + out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance); + out_Glossy_0.radiance *= color.rgb * fresnel; closure_load_ssr_data( - ssr_spec * color.rgb * fresnel, roughness, N, viewCameraVec, int(ssr_id), result); + out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result); + + out_Refraction_1.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_1.radiance); + out_Refraction_1.radiance *= color.rgb * (1.0 - fresnel); + /* Simulate 2nd absorption event. */ + out_Refraction_1.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); + result.radiance += out_Refraction_1.radiance; } + #else /* Stub glass because it is not compatible with volumetrics. */ # define node_bsdf_glass(a, b, c, d, e, f, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl index 36675cf720d..ca7c3749597 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -1,23 +1,32 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_glossy, Glossy) + void node_bsdf_glossy( vec4 color, float roughness, vec3 N, float use_multiscatter, float ssr_id, out Closure result) { - N = normalize(N); - vec3 out_spec, ssr_spec; - eevee_closure_glossy(N, - vec3(1.0), - use_multiscatter != 0.0 ? vec3(1.0) : vec3(-1.0), /* HACK */ - int(ssr_id), - roughness, - 1.0, - true, - out_spec, - ssr_spec); - vec3 vN = mat3(ViewMatrix) * N; + bool do_ssr = (ssrToggle && int(ssr_id) == outputSsrId); + + CLOSURE_VARS_DECLARE_1(Glossy); + + in_Glossy_0.N = N; /* Normalized during eval. */ + in_Glossy_0.roughness = roughness; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_glossy, Glossy); + result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec) * color.rgb; - closure_load_ssr_data(ssr_spec * color.rgb, roughness, N, viewCameraVec, int(ssr_id), result); + + vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec), in_Glossy_0.roughness); + vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : + F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); + out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); + out_Glossy_0.radiance *= brdf; + out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance); + out_Glossy_0.radiance *= color.rgb; + closure_load_ssr_data( + out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result); } + #else /* Stub glossy because it is not compatible with volumetrics. */ # define node_bsdf_glossy(a, b, c, d, e, result) (result = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 3bd578e1ffc..15958dcf65e 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -1,41 +1,20 @@ #ifndef VOLUMETRICS vec3 tint_from_color(vec3 color) { - float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */ - return (lum > 0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */ + float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */ + return (lum > 0.0) ? color / lum : vec3(0.0); /* normalize lum. to isolate hue+sat */ } -void convert_metallic_to_specular_tinted(vec3 basecol, - vec3 basecol_tint, - float metallic, - float specular_fac, - float specular_tint, - out vec3 diffuse, - out vec3 f0) -{ - vec3 tmp_col = mix(vec3(1.0), basecol_tint, specular_tint); - f0 = mix((0.08 * specular_fac) * tmp_col, basecol, metallic); - diffuse = basecol * (1.0 - metallic); -} - -/* Output sheen is to be multiplied by sheen_color. */ -void principled_sheen(float NV, - vec3 basecol_tint, - float sheen, - float sheen_tint, - out float out_sheen, - out vec3 sheen_color) +float principled_sheen(float NV) { float f = 1.0 - NV; - /* Temporary fix for T59784. Normal map seems to contain NaNs for tangent space normal maps, - * therefore we need to clamp value. */ - f = clamp(f, 0.0, 1.0); /* Empirical approximation (manual curve fitting). Can be refined. */ - out_sheen = f * f * f * 0.077 + f * 0.01 + 0.00026; - - sheen_color = sheen * mix(vec3(1.0), basecol_tint, sheen_tint); + float sheen = f * f * f * 0.077 + f * 0.01 + 0.00026; + return sheen; } +CLOSURE_EVAL_FUNCTION_DECLARE_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction) + void node_bsdf_principled(vec4 base_color, float subsurface, vec3 subsurface_radius, @@ -59,434 +38,163 @@ void node_bsdf_principled(vec4 base_color, vec3 N, vec3 CN, vec3 T, - vec3 I, - float use_multiscatter, + const float do_diffuse, + const float do_clearcoat, + const float do_refraction, + const float do_multiscatter, float ssr_id, float sss_id, vec3 sss_scale, out Closure result) { - N = normalize(N); - ior = max(ior, 1e-5); + /* Match cycles. */ metallic = saturate(metallic); transmission = saturate(transmission); - float m_transmission = 1.0 - transmission; + float diffuse_weight = (1.0 - transmission) * (1.0 - metallic); + transmission *= (1.0 - metallic); + float specular_weight = (1.0 - transmission); + clearcoat = max(clearcoat, 0.0); + transmission_roughness = 1.0 - (1.0 - roughness) * (1.0 - transmission_roughness); - float dielectric = 1.0 - metallic; - transmission *= dielectric; - sheen *= dielectric; - subsurface_color *= dielectric; + CLOSURE_VARS_DECLARE_4(Diffuse, Glossy, Glossy, Refraction); - vec3 diffuse, f0, out_diff, out_spec, out_refr, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = mix(base_color.rgb, subsurface_color.rgb, subsurface); - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); + in_Glossy_1.N = N; /* Normalized during eval. */ + in_Glossy_1.roughness = roughness; - vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic); + in_Glossy_2.N = CN; /* Normalized during eval. */ + in_Glossy_2.roughness = clearcoat_roughness; - /* Far from being accurate, but 2 glossy evaluation is too expensive. - * Most noticeable difference is at grazing angles since the bsdf lut - * f0 color interpolation is done on top of this interpolation. */ - vec3 f0_glass = mix(vec3(1.0), base_color.rgb, specular_tint); - float fresnel = F_eta(ior, NV); - vec3 spec_col = F_color_blend(ior, fresnel, f0_glass) * fresnel; - f0 = mix(f0, spec_col, transmission); - f90 = mix(f90, spec_col, transmission); + in_Refraction_3.N = N; /* Normalized during eval. */ + in_Refraction_3.roughness = do_multiscatter != 0.0 ? roughness : transmission_roughness; + in_Refraction_3.ior = ior; + - /* Really poor approximation but needed to workaround issues with renderpasses. */ - spec_col = mix(vec3(1.0), spec_col, transmission); - /* Match cycles. */ - spec_col += float(clearcoat > 1e-5); - - vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface); - - float sss_scalef = avg(sss_scale) * subsurface; - eevee_closure_principled(N, - mixed_ss_base_color, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - CN, - clearcoat * 0.25, - clearcoat_roughness, - 1.0, - sss_scalef, - ior, - true, - out_diff, - out_spec, - out_refr, - ssr_spec); - - vec3 refr_color = base_color.rgb; - refr_color *= (refractionDepth > 0.0) ? refr_color : - vec3(1.0); /* Simulate 2 transmission event */ - refr_color *= saturate(1.0 - fresnel) * transmission; - - sheen_color *= m_transmission; - mixed_ss_base_color *= m_transmission; + CLOSURE_EVAL_FUNCTION_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction); result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color); - result.radiance += render_pass_glossy_mask(spec_col, out_spec); - /* Coarse approx. */ - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - mixed_ss_base_color *= alpha; - closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); - result.transmittance = vec3(1.0 - alpha); -} + /* This will tag the whole eval for optimisation. */ + if (do_diffuse == 0.0) { + out_Diffuse_0.radiance = vec3(0); + } + if (do_clearcoat == 0.0) { + out_Glossy_2.radiance = vec3(0); + } + if (do_refraction == 0.0) { + out_Refraction_3.radiance = vec3(0); + } -void node_bsdf_principled_dielectric(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - N = normalize(N); - metallic = saturate(metallic); - float dielectric = 1.0 - metallic; + /* Glossy_1 will always be evaluated. */ + float NV = dot(in_Glossy_1.N, cameraVec); - vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); + vec3 base_color_tint = tint_from_color(base_color.rgb); - vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic); + /* TODO(fclem) This isn't good for rough glass using multiscatter (since the fresnel is applied + * on each microfacet in cycles). */ + float fresnel = F_eta(in_Refraction_3.ior, NV); - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); + { + /* Glossy reflections. + * Separate Glass reflections and main specular reflections to match Cycles renderpasses. */ + out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id); - eevee_closure_default(N, - diffuse, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - true, - out_diff, - out_spec, - ssr_spec); + vec2 split_sum = brdf_lut(NV, roughness); - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_diffuse_mask(diffuse, out_diff * diffuse); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); + vec3 glossy_radiance_final = vec3(0.0); + if (transmission > 1e-5) { + /* Glass Reflection: Reuse radiance from Glossy1. */ + vec3 out_glass_refl_radiance = out_Glossy_1.radiance; + + /* Poor approximation since we baked the LUT using a fixed IOR. */ + vec3 f0 = mix(vec3(1.0), base_color.rgb, specular_tint); + vec3 f90 = vec3(1); + + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) : + F_brdf_single_scatter(f0, f90, split_sum); + + out_glass_refl_radiance *= brdf; + out_glass_refl_radiance = render_pass_glossy_mask(vec3(1), out_glass_refl_radiance); + out_glass_refl_radiance *= fresnel * transmission; + glossy_radiance_final += out_glass_refl_radiance; + } + if (specular_weight > 1e-5) { + vec3 dielectric_f0_color = mix(vec3(1.0), base_color_tint, specular_tint); + vec3 metallic_f0_color = base_color.rgb; + vec3 f0 = mix((0.08 * specular) * dielectric_f0_color, metallic_f0_color, metallic); + /* Cycles does this blending using the microfacet fresnel factor. However, our fresnel + * is already baked inside the split sum LUT. We approximate using by modifying the + * changing the f90 color directly in a non linear fashion. */ + vec3 f90 = mix(f0, vec3(1), fast_sqrt(specular)); + + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(f0, f90, split_sum) : + F_brdf_single_scatter(f0, f90, split_sum); + + out_Glossy_1.radiance *= brdf; + out_Glossy_1.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_1.radiance); + out_Glossy_1.radiance *= specular_weight; + glossy_radiance_final += out_Glossy_1.radiance; + } + + closure_load_ssr_data( + glossy_radiance_final, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result); + } + + if (diffuse_weight > 1e-5) { + /* Mask over all diffuse radiance. */ + out_Diffuse_0.radiance *= diffuse_weight; + + /* Sheen Coarse approximation: We reuse the diffuse radiance and just scale it. */ + vec3 sheen_color = mix(vec3(1), base_color_tint, sheen_tint); + vec3 out_sheen_radiance = out_Diffuse_0.radiance * principled_sheen(NV); + out_sheen_radiance = render_pass_diffuse_mask(vec3(1), out_sheen_radiance); + out_sheen_radiance *= sheen * sheen_color; + result.radiance += out_sheen_radiance; + + /* Diffuse / Subsurface. */ + float scale = avg(sss_scale) * subsurface; + closure_load_sss_data(scale, out_Diffuse_0.radiance, in_Diffuse_0.albedo, int(sss_id), result); + } + + if (transmission > 1e-5) { + /* TODO(fclem) This could be going to a transmission render pass instead. */ + out_Refraction_3.radiance = render_pass_glossy_mask(vec3(1), out_Refraction_3.radiance); + out_Refraction_3.radiance *= base_color.rgb; + /* Simulate 2nd transmission event. */ + out_Refraction_3.radiance *= (refractionDepth > 0.0) ? base_color.rgb : vec3(1); + out_Refraction_3.radiance *= (1.0 - fresnel) * transmission; + result.radiance += out_Refraction_3.radiance; + } + + if (clearcoat > 1e-5) { + float NV = dot(in_Glossy_2.N, cameraVec); + vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); + vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); + + out_Glossy_2.radiance *= brdf * clearcoat * 0.25; + out_Glossy_2.radiance = render_pass_glossy_mask(vec3(1), out_Glossy_2.radiance); + result.radiance += out_Glossy_2.radiance; + } + + { + vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb); + out_emission_radiance *= emission_strength; + result.radiance += out_emission_radiance; + } result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_metallic(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - N = normalize(N); - vec3 out_spec, ssr_spec; - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_glossy(N, - base_color.rgb, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - true, - out_spec, - ssr_spec); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - result.transmittance = vec3(1.0 - alpha); + result.ssr_data.rgb *= alpha; +# ifdef USE_SSS + result.sss_irradiance *= alpha; +# endif } -void node_bsdf_principled_clearcoat(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - vec3 out_spec, ssr_spec; - N = normalize(N); - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_clearcoat(N, - base_color.rgb, - /* HACK: Pass the multiscatter flag as the sign to not add closure - * variations or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - CN, - clearcoat * 0.25, - clearcoat_roughness, - 1.0, - true, - out_spec, - ssr_spec); - /* Match cycles. */ - float spec_col = 1.0 + float(clearcoat > 1e-5); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(spec_col), out_spec); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_subsurface(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - metallic = saturate(metallic); - N = normalize(N); - - vec3 diffuse, f0, out_diff, out_spec, ssr_spec, sheen_color; - float out_sheen; - vec3 ctint = tint_from_color(base_color.rgb); - convert_metallic_to_specular_tinted( - base_color.rgb, ctint, metallic, specular, specular_tint, diffuse, f0); - - subsurface_color = subsurface_color * (1.0 - metallic); - vec3 mixed_ss_base_color = mix(diffuse, subsurface_color.rgb, subsurface); - float sss_scalef = avg(sss_scale) * subsurface; - - float NV = dot(N, cameraVec); - principled_sheen(NV, ctint, sheen, sheen_tint, out_sheen, sheen_color); - - vec3 f90 = mix(vec3(1.0), base_color.rgb, (1.0 - specular) * metallic); - - eevee_closure_skin(N, - mixed_ss_base_color, - f0, - /* HACK: Pass the multiscatter flag as the sign to not add closure variations - * or increase register usage. */ - (use_multiscatter != 0.0) ? f90 : -f90, - int(ssr_id), - roughness, - 1.0, - sss_scalef, - true, - out_diff, - out_spec, - ssr_spec); - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec); - result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - - mixed_ss_base_color *= alpha; - closure_load_sss_data(sss_scalef, out_diff, mixed_ss_base_color, int(sss_id), result); - - result.transmittance = vec3(1.0 - alpha); -} - -void node_bsdf_principled_glass(vec4 base_color, - float subsurface, - vec3 subsurface_radius, - vec4 subsurface_color, - float metallic, - float specular, - float specular_tint, - float roughness, - float anisotropic, - float anisotropic_rotation, - float sheen, - float sheen_tint, - float clearcoat, - float clearcoat_roughness, - float ior, - float transmission, - float transmission_roughness, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, - vec3 CN, - vec3 T, - vec3 I, - float use_multiscatter, - float ssr_id, - float sss_id, - vec3 sss_scale, - out Closure result) -{ - ior = max(ior, 1e-5); - N = normalize(N); - - vec3 f0, out_spec, out_refr, ssr_spec; - f0 = mix(vec3(1.0), base_color.rgb, specular_tint); - - eevee_closure_glass(N, - vec3(1.0), - vec3((use_multiscatter != 0.0) ? 1.0 : -1.0), - int(ssr_id), - roughness, - 1.0, - ior, - true, - out_spec, - out_refr, - ssr_spec); - - vec3 refr_color = base_color.rgb; - refr_color *= (refractionDepth > 0.0) ? refr_color : - vec3(1.0); /* Simulate 2 transmission events */ - - float fresnel = F_eta(ior, dot(N, cameraVec)); - vec3 spec_col = F_color_blend(ior, fresnel, f0); - spec_col *= fresnel; - refr_color *= (1.0 - fresnel); - - ssr_spec *= spec_col; - - result = CLOSURE_DEFAULT; - result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color); - result.radiance += render_pass_glossy_mask(spec_col, out_spec * spec_col); - result.radiance += render_pass_emission_mask(emission.rgb * emission_strength); - result.radiance *= alpha; - closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result); - result.transmittance = vec3(1.0 - alpha); -} #else /* clang-format off */ /* Stub principled because it is not compatible with volumetrics. */ -# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_dielectric(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_metallic(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_clearcoat(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_subsurface(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) -# define node_bsdf_principled_glass(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, result) (result = CLOSURE_DEFAULT) +# define node_bsdf_principled(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, cc, dd, result) (result = CLOSURE_DEFAULT) /* clang-format on */ #endif diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl index cd043020a7f..db820efa42e 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl @@ -1,15 +1,30 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_refraction, Refraction) + void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Closure result) { - N = normalize(N); - vec3 out_refr; - color.rgb *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); /* Simulate 2 absorption event. */ - eevee_closure_refraction(N, roughness, ior, true, out_refr); - vec3 vN = mat3(ViewMatrix) * N; + CLOSURE_VARS_DECLARE_1(Refraction); + + in_Refraction_0.N = N; /* Normalized during eval. */ + in_Refraction_0.roughness = roughness; + in_Refraction_0.ior = ior; + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_refraction, Refraction); + result = CLOSURE_DEFAULT; - result.ssr_normal = normal_encode(vN, viewCameraVec); - result.radiance = render_pass_glossy_mask(color.rgb, out_refr * color.rgb); + + out_Refraction_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_0.radiance); + out_Refraction_0.radiance *= color.rgb; + /* Simulate 2nd absorption event. */ + out_Refraction_0.radiance *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); + + result.radiance = out_Refraction_0.radiance; + + /* TODO(fclem) Try to not use this. */ + result.ssr_normal = normal_encode(mat3(ViewMatrix) * in_Refraction_0.N, viewCameraVec); } + #else /* Stub refraction because it is not compatible with volumetrics. */ # define node_bsdf_refraction(a, b, c, d, e) (e = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl index c13b55513da..5a68f802659 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl @@ -1,4 +1,7 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_subsurface_scattering, Diffuse) + void node_subsurface_scattering(vec4 color, float scale, vec3 radius, @@ -8,20 +11,29 @@ void node_subsurface_scattering(vec4 color, float sss_id, out Closure result) { - N = normalize(N); - vec3 out_diff; - vec3 vN = mat3(ViewMatrix) * N; + CLOSURE_VARS_DECLARE_1(Diffuse); + + in_Diffuse_0.N = N; /* Normalized during eval. */ + in_Diffuse_0.albedo = color.rgb; + + CLOSURE_EVAL_FUNCTION_1(node_subsurface_scattering, Diffuse); + result = CLOSURE_DEFAULT; - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); - eevee_closure_subsurface(N, color.rgb, 1.0, scale, true, out_diff); + /* Not perfect for texture_blur values between 0.0 and 1.0. + * Interpolate between separated color and color applied on irradiance. */ + float one_minus_texture_blur = 1.0 - texture_blur; + vec3 sss_albedo = color.rgb * texture_blur + one_minus_texture_blur; + vec3 radiance_tint = color.rgb * one_minus_texture_blur + texture_blur; + /* Consider output radiance as irradiance. */ + out_Diffuse_0.radiance *= radiance_tint; - /* Not perfect for texture_blur not exactly equal to 0.0 or 1.0. */ - vec3 sss_albedo = mix(color.rgb, vec3(1.0), texture_blur); - out_diff *= mix(vec3(1.0), color.rgb, texture_blur); - result.radiance = render_pass_sss_mask(sss_albedo); - closure_load_sss_data(scale, out_diff, sss_albedo, int(sss_id), result); + closure_load_sss_data(scale, out_Diffuse_0.radiance, sss_albedo, int(sss_id), result); + + /* TODO(fclem) Try to not use this. */ + closure_load_ssr_data(vec3(0.0), 0.0, in_Diffuse_0.N, -1.0, result); } + #else /* Stub subsurface scattering because it is not compatible with volumetrics. */ # define node_subsurface_scattering(a, b, c, d, e, f, g, h) (h = CLOSURE_DEFAULT) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl index 79bfd9b24bb..80bd3941b22 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl @@ -1,12 +1,20 @@ #ifndef VOLUMETRICS + +CLOSURE_EVAL_FUNCTION_DECLARE_1(node_bsdf_translucent, Translucent) + void node_bsdf_translucent(vec4 color, vec3 N, out Closure result) { - N = normalize(N); + CLOSURE_VARS_DECLARE_1(Translucent); + + in_Translucent_0.N = -N; /* Normalized during eval. */ + + CLOSURE_EVAL_FUNCTION_1(node_bsdf_translucent, Translucent); + result = CLOSURE_DEFAULT; - eevee_closure_diffuse(-N, color.rgb, 1.0, false, result.radiance); - closure_load_ssr_data(vec3(0.0), 0.0, N, viewCameraVec, -1, result); - result.radiance = render_pass_diffuse_mask(color.rgb, result.radiance * color.rgb); + closure_load_ssr_data(vec3(0.0), 0.0, -in_Translucent_0.N, -1.0, result); + result.radiance = render_pass_diffuse_mask(color.rgb, out_Translucent_0.radiance * color.rgb); } + #else /* Stub translucent because it is not compatible with volumetrics. */ # define node_bsdf_translucent(a, b, c) (c = CLOSURE_DEFAULT) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c index b9f0e793a61..f601f3e9fd0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c @@ -134,54 +134,32 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, GPU_link(mat, "set_rgb_one", &sss_scale); } - /* Due to the manual effort done per config, we only optimize the most common permutations. */ - char *node_name; - uint flag = 0; - if (!use_subsurf && use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_dielectric"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY; + uint flag = GPU_MATFLAG_GLOSSY; + if (use_diffuse) { + flag |= GPU_MATFLAG_DIFFUSE; } - else if (!use_subsurf && !use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_metallic"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY; + if (use_refract) { + flag |= GPU_MATFLAG_REFRACT; } - else if (!use_subsurf && !use_diffuse && !use_refract && use_clear) { - static char name[] = "node_bsdf_principled_clearcoat"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY; - } - else if (use_subsurf && use_diffuse && !use_refract && !use_clear) { - static char name[] = "node_bsdf_principled_subsurface"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY; - } - else if (!use_subsurf && !use_diffuse && use_refract && !use_clear && !socket_not_zero(4)) { - static char name[] = "node_bsdf_principled_glass"; - node_name = name; - flag = GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT; - } - else { - static char name[] = "node_bsdf_principled"; - node_name = name; - flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT; - } - if (use_subsurf) { flag |= GPU_MATFLAG_SSS; } + float f_use_diffuse = use_diffuse ? 1.0f : 0.0f; + float f_use_clearcoat = use_clear ? 1.0f : 0.0f; + float f_use_refraction = use_refract ? 1.0f : 0.0f; float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f; GPU_material_flag_set(mat, flag); return GPU_stack_link(mat, node, - node_name, + "node_bsdf_principled", in, out, - GPU_builtin(GPU_VIEW_POSITION), + GPU_constant(&f_use_diffuse), + GPU_constant(&f_use_clearcoat), + GPU_constant(&f_use_refraction), GPU_constant(&use_multi_scatter), GPU_constant(&node->ssr_id), GPU_constant(&node->sss_id), From 06492fd61984c1a92fb1f93d30028de97ead451f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:49:42 +0100 Subject: [PATCH 148/519] EEVEE: Fix incorrect fresnel function. The optimized version was not correct. Also it is not showing any benefit over the non optimized version. --- .../eevee/shaders/bsdf_common_lib.glsl | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index f050cf3a08a..cb4d8931af0 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -24,6 +24,7 @@ float ior_from_f0(float f0) return (-f - 1.0) / (f - 1.0); } +/* Simplified form of F_eta(eta, 1.0). */ float f0_from_ior(float eta) { float A = (eta - 1.0) / (eta + 1.0); @@ -56,30 +57,21 @@ float F_eta(float eta, float cos_theta) * the refracted direction */ float c = abs(cos_theta); float g = eta * eta - 1.0 + c * c; - float result; - if (g > 0.0) { g = sqrt(g); - vec2 g_c = vec2(g) + vec2(c, -c); - float A = g_c.y / g_c.x; - A *= A; - g_c *= c; - float B = (g_c.y - 1.0) / (g_c.x + 1.0); - B *= B; - result = 0.5 * A * (1.0 + B); + float A = (g - c) / (g + c); + float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0); + return 0.5 * A * A * (1.0 + B * B); } - else { - result = 1.0; /* TIR (no refracted component) */ - } - - return result; + /* Total internal reflections. */ + return 1.0; } /* Fresnel color blend base on fresnel factor */ vec3 F_color_blend(float eta, float fresnel, vec3 f0_color) { - float f0 = F_eta(eta, 1.0); - float fac = saturate((fresnel - f0) / max(1e-8, 1.0 - f0)); + float f0 = f0_from_ior(eta); + float fac = saturate((fresnel - f0) / (1.0 - f0)); return mix(f0_color, vec3(1.0), fac); } From 83ac8628c490eda4fa5237b7a4256bc670dc0682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:50:09 +0100 Subject: [PATCH 149/519] EEVEE: Update LUT GGX generation shader This modifies the principled BSDF and the Glass BSDF which now have better fit to multiscatter GGX. Code to generate the LUT have been updated and can run at runtime. The refraction LUT has been changed to have the critical angle always centered around one pixel so that interpolation can be mitigated. Offline LUT data will be updated in another commit This simplify the BTDF retreival removing the manual clean cut at low roughness. This maximize the precision of the LUT by scalling the sides by the critical angle. I also touched the ior > 1.0 approximation to be smoother. Also incluse some cleanup of bsdf_sampling.glsl --- source/blender/draw/CMakeLists.txt | 1 + .../draw/engines/eevee/eevee_lut_gen.c | 206 +++++++----------- .../draw/engines/eevee/eevee_materials.c | 21 +- .../draw/engines/eevee/eevee_private.h | 4 + .../draw/engines/eevee/eevee_shaders.c | 7 +- .../engines/eevee/shaders/bsdf_lut_frag.glsl | 67 +++--- .../eevee/shaders/bsdf_sampling_lib.glsl | 41 +--- .../engines/eevee/shaders/btdf_lut_frag.glsl | 101 +++++---- .../shaders/closure_eval_glossy_lib.glsl | 2 +- .../eevee/shaders/common_utiltex_lib.glsl | 92 +++++--- .../lightprobe_filter_diffuse_frag.glsl | 5 +- .../lightprobe_filter_glossy_frag.glsl | 9 +- .../lightprobe_filter_visibility_frag.glsl | 5 +- .../material/gpu_shader_material_glass.glsl | 21 +- .../gpu_shader_material_principled.glsl | 11 +- 15 files changed, 307 insertions(+), 286 deletions(-) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 8abd353d36d..dff9e302fdf 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -90,6 +90,7 @@ set(SRC engines/eevee/eevee_lights.c engines/eevee/eevee_lookdev.c engines/eevee/eevee_lut.c + engines/eevee/eevee_lut_gen.c engines/eevee/eevee_materials.c engines/eevee/eevee_mist.c engines/eevee/eevee_motion_blur.c diff --git a/source/blender/draw/engines/eevee/eevee_lut_gen.c b/source/blender/draw/engines/eevee/eevee_lut_gen.c index 18645fea5e0..770134d27f9 100644 --- a/source/blender/draw/engines/eevee/eevee_lut_gen.c +++ b/source/blender/draw/engines/eevee/eevee_lut_gen.c @@ -27,145 +27,97 @@ #include "DRW_render.h" -#include "BLI_alloca.h" +#include "BLI_fileops.h" #include "BLI_rand.h" #include "BLI_string_utils.h" #include "eevee_private.h" -static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h)) +#define DO_FILE_OUTPUT 0 + +float *EEVEE_lut_update_ggx_brdf(int lut_size) { - struct GPUTexture *tex; - struct GPUFrameBuffer *fb = NULL; - static float samples_len = 8192.0f; - static float inv_samples_len = 1.0f / 8192.0f; - - DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR); + DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR); DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_lut_sh_get(), pass); - DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1); - DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1); - DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley); - DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter); - - struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call(grp, geom, NULL); - - float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); - - tex = DRW_texture_create_2d(w, h, GPU_RG16F, DRW_TEX_FILTER, (float *)texels); - - DRWFboTexture tex_filter = {&tex, GPU_RG16F, DRW_TEX_FILTER}; - GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); + DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */ + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + GPUTexture *tex = DRW_texture_create_2d(lut_size, lut_size, GPU_RG16F, 0, NULL); + GPUFrameBuffer *fb = NULL; + GPU_framebuffer_ensure_config(&fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(tex), + }); GPU_framebuffer_bind(fb); DRW_draw_pass(pass); + GPU_FRAMEBUFFER_FREE_SAFE(fb); - float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); - GPU_framebuffer_read_color(fb, 0, 0, w, h, 3, 0, GPU_DATA_FLOAT, data); - - printf("{"); - for (int i = 0; i < w * h * 3; i += 3) { - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, ", data[i], data[i + 1]); - i += 3; - printf("%ff, %ff, \n", data[i], data[i + 1]); + float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0); + GPU_texture_free(tex); +#if DO_FILE_OUTPUT + /* Content is to be put inside eevee_lut.c */ + FILE *f = BLI_fopen("bsdf_split_sum_ggx.h", "w"); + fprintf(f, "const float bsdf_split_sum_ggx[%d * %d * 2] = {", lut_size, lut_size); + for (int i = 0; i < lut_size * lut_size * 2;) { + fprintf(f, "\n "); + for (int j = 0; j < 4; j++, i += 2) { + fprintf(f, "%ff, %ff, ", data[i], data[i + 1]); + } } - printf("}"); - - MEM_freeN(texels); - MEM_freeN(data); - - return tex; -} - -static struct GPUTexture *create_ggx_refraction_lut_texture(int w, int h) -{ - struct GPUTexture *tex; - struct GPUTexture *hammersley = create_hammersley_sample_texture(8192); - struct GPUFrameBuffer *fb = NULL; - static float samples_len = 8192.0f; - static float a2 = 0.0f; - static float inv_samples_len = 1.0f / 8192.0f; - - DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass); - DRW_shgroup_uniform_float(grp, "a2", &a2, 1); - DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1); - DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1); - DRW_shgroup_uniform_texture(grp, "texHammersley", hammersley); - DRW_shgroup_uniform_texture(grp, "utilTex", e_data.util_tex); - - struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call(grp, geom, NULL); - - float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); - - tex = DRW_texture_create_2d(w, h, GPU_R16F, DRW_TEX_FILTER, (float *)texels); - - DRWFboTexture tex_filter = {&tex, GPU_R16F, DRW_TEX_FILTER}; - GPU_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); - - GPU_framebuffer_bind(fb); - - float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); - - float inc = 1.0f / 31.0f; - float roughness = 1e-8f - inc; - FILE *f = BLI_fopen("btdf_split_sum_ggx.h", "w"); - fprintf(f, "static float btdf_split_sum_ggx[32][64 * 64] = {\n"); - do { - roughness += inc; - CLAMP(roughness, 1e-4f, 1.0f); - a2 = powf(roughness, 4.0f); - DRW_draw_pass(pass); - - GPU_framebuffer_read_data(0, 0, w, h, 3, 0, data); - -#if 1 - fprintf(f, "\t{\n\t\t"); - for (int i = 0; i < w * h * 3; i += 3) { - fprintf(f, "%ff,", data[i]); - if (((i / 3) + 1) % 12 == 0) { - fprintf(f, "\n\t\t"); - } - else { - fprintf(f, " "); - } - } - fprintf(f, "\n\t},\n"); -#else - for (int i = 0; i < w * h * 3; i += 3) { - if (data[i] < 0.01) { - printf(" "); - } - else if (data[i] < 0.3) { - printf("."); - } - else if (data[i] < 0.6) { - printf("+"); - } - else if (data[i] < 0.9) { - printf("%%"); - } - else { - printf("#"); - } - if ((i / 3 + 1) % 64 == 0) { - printf("\n"); - } - } + fprintf(f, "\n};\n"); + fclose(f); #endif - } while (roughness < 1.0f); - fprintf(f, "\n};\n"); - - fclose(f); - - MEM_freeN(texels); - MEM_freeN(data); - - return tex; + return data; +} + +float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth) +{ + float roughness; + DRWPass *pass = DRW_pass_create(__func__, DRW_STATE_WRITE_COLOR); + DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass); + DRW_shgroup_uniform_float_copy(grp, "sampleCount", 64.0f); /* Actual sample count is squared. */ + DRW_shgroup_uniform_float(grp, "z", &roughness, 1); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + GPUTexture *tex = DRW_texture_create_2d_array(lut_size, lut_size, lut_depth, GPU_RG16F, 0, NULL); + GPUFrameBuffer *fb = NULL; + for (int i = 0; i < lut_depth; i++) { + GPU_framebuffer_ensure_config(&fb, + { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE_LAYER(tex, i), + }); + GPU_framebuffer_bind(fb); + roughness = i / (lut_depth - 1.0f); + DRW_draw_pass(pass); + } + + GPU_FRAMEBUFFER_FREE_SAFE(fb); + + float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 0); + GPU_texture_free(tex); + +#if DO_FILE_OUTPUT + /* Content is to be put inside eevee_lut.c. Don't forget to format the output. */ + FILE *f = BLI_fopen("btdf_split_sum_ggx.h", "w"); + fprintf(f, "const float btdf_split_sum_ggx[%d][%d * %d * 2] = {", lut_depth, lut_size, lut_size); + fprintf(f, "\n "); + int ofs = 0; + for (int d = 0; d < lut_depth; d++) { + fprintf(f, "{\n"); + for (int i = 0; i < lut_size * lut_size * 2;) { + for (int j = 0; j < 4; j++, i += 2, ofs += 2) { + fprintf(f, "%ff, %ff, ", data[ofs], data[ofs + 1]); + } + fprintf(f, "\n "); + } + fprintf(f, "},\n"); + } + fprintf(f, "};\n"); + fclose(f); +#endif + + return data; } diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 5f2821730f1..841da7fd076 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -142,11 +142,20 @@ static void eevee_init_noise_texture(void) e_data.noise_tex = DRW_texture_create_2d(64, 64, GPU_RGBA16F, 0, (float *)blue_noise); } +#define RUNTIME_LUT_CREATION 1 + static void eevee_init_util_texture(void) { const int layers = 4 + 16; float(*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels"); float(*texels_layer)[4] = texels; +#if RUNTIME_LUT_CREATION + float *bsdf_ggx_lut = EEVEE_lut_update_ggx_brdf(64); + float(*btdf_ggx_lut)[64 * 64 * 2] = (float(*)[64 * 64 * 2]) EEVEE_lut_update_ggx_btdf(64, 16); +#else + const float *bsdf_ggx_lut = bsdf_split_sum_ggx; + const float(*btdf_ggx_lut)[64 * 64 * 2] = btdf_split_sum_ggx; +#endif /* Copy ltc_mat_ggx into 1st layer */ memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64); @@ -155,8 +164,8 @@ static void eevee_init_util_texture(void) /* Copy bsdf_split_sum_ggx into 2nd layer red and green channels. * Copy ltc_mag_ggx into 2nd layer blue and alpha channel. */ for (int i = 0; i < 64 * 64; i++) { - texels_layer[i][0] = bsdf_split_sum_ggx[i * 2 + 0]; - texels_layer[i][1] = bsdf_split_sum_ggx[i * 2 + 1]; + texels_layer[i][0] = bsdf_ggx_lut[i * 2 + 0]; + texels_layer[i][1] = bsdf_ggx_lut[i * 2 + 1]; texels_layer[i][2] = ltc_mag_ggx[i * 2 + 0]; texels_layer[i][3] = ltc_mag_ggx[i * 2 + 1]; } @@ -183,8 +192,8 @@ static void eevee_init_util_texture(void) /* Copy Refraction GGX LUT in layer 5 - 21 */ for (int j = 0; j < 16; j++) { for (int i = 0; i < 64 * 64; i++) { - texels_layer[i][0] = btdf_split_sum_ggx[j * 2][i]; - texels_layer[i][1] = 0.0; /* UNUSED */ + texels_layer[i][0] = btdf_ggx_lut[j][i * 2 + 0]; + texels_layer[i][1] = btdf_ggx_lut[j][i * 2 + 1]; texels_layer[i][2] = 0.0; /* UNUSED */ texels_layer[i][3] = 0.0; /* UNUSED */ } @@ -195,6 +204,10 @@ static void eevee_init_util_texture(void) 64, 64, layers, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_WRAP, (float *)texels); MEM_freeN(texels); +#if RUNTIME_LUT_CREATION + MEM_freeN(bsdf_ggx_lut); + MEM_freeN(btdf_ggx_lut); +#endif } void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3]) diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 9761264f03e..17d0ead86c5 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -1518,6 +1518,10 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata); /** eevee_engine.c */ void EEVEE_cache_populate(void *vedata, Object *ob); +/** eevee_lut_gen.c */ +float *EEVEE_lut_update_ggx_brdf(int lut_size); +float *EEVEE_lut_update_ggx_btdf(int lut_size, int lut_depth); + /* Shadow Matrix */ static const float texcomat[4][4] = { /* From NDC to TexCo */ diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 64efca83915..2c52295b32f 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -567,11 +567,8 @@ GPUShader *EEVEE_shaders_effect_maxz_copydepth_sh_get(void) GPUShader *EEVEE_shaders_ggx_lut_sh_get(void) { if (e_data.ggx_lut_sh == NULL) { - e_data.ggx_lut_sh = DRW_shader_create_with_shaderlib(datatoc_lightprobe_vert_glsl, - datatoc_lightprobe_geom_glsl, - datatoc_bsdf_lut_frag_glsl, - e_data.lib, - "#define HAMMERSLEY_SIZE 8192\n"); + e_data.ggx_lut_sh = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_bsdf_lut_frag_glsl, e_data.lib, NULL); } return e_data.ggx_lut_sh; } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl index 1e051994693..46ea8b747c8 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl @@ -1,48 +1,57 @@ +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) #pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl) -out vec4 FragColor; +uniform float sampleCount; + +out vec2 FragColor; void main() { - vec3 N, T, B, V; + /* Make sure coordinates are covering the whole [0..1] range at texel center. */ + float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1); + float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1); - float NV = (1.0 - (clamp(gl_FragCoord.y / LUT_SIZE, 1e-4, 0.9999))); - float sqrtRoughness = clamp(gl_FragCoord.x / LUT_SIZE, 1e-4, 0.9999); - float a = sqrtRoughness * sqrtRoughness; - float a2 = a * a; + float NV = clamp(1.0 - y * y, 1e-4, 0.9999); + float a = x * x; + float a2 = clamp(a * a, 1e-4, 0.9999); - N = vec3(0.0, 0.0, 1.0); - T = vec3(1.0, 0.0, 0.0); - B = vec3(0.0, 1.0, 0.0); - V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); - - setup_noise(); + vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); /* Integrating BRDF */ float brdf_accum = 0.0; float fresnel_accum = 0.0; - for (float i = 0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */ - vec3 L = -reflect(V, H); - float NL = L.z; + for (float j = 0.0; j < sampleCount; j++) { + for (float i = 0.0; i < sampleCount; i++) { + vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount; + Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI)); - if (NL > 0.0) { - float NH = max(H.z, 0.0); - float VH = max(dot(V, H), 0.0); + vec3 H = sample_ggx(Xi, a2); /* Microfacet normal */ + vec3 L = -reflect(V, H); + float NL = L.z; - float G1_v = G1_Smith_GGX(NV, a2); - float G1_l = G1_Smith_GGX(NL, a2); - float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */ + if (NL > 0.0) { + float NH = max(H.z, 0.0); + float VH = max(dot(V, H), 0.0); - float brdf = (G_smith * VH) / (NH * NV); - float Fc = pow(1.0 - VH, 5.0); + float G1_v = G1_Smith_GGX(NV, a2); + float G1_l = G1_Smith_GGX(NL, a2); + float G_smith = 4.0 * NV * NL / (G1_v * G1_l); /* See G1_Smith_GGX for explanations. */ - brdf_accum += (1.0 - Fc) * brdf; - fresnel_accum += Fc * brdf; + float brdf = (G_smith * VH) / (NH * NV); + + /* Follow maximum specular value for principled bsdf. */ + const float specular = 1.0; + const float eta = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0; + float fresnel = F_eta(eta, VH); + float Fc = F_color_blend(eta, fresnel, vec3(0)).r; + + brdf_accum += (1.0 - Fc) * brdf; + fresnel_accum += Fc * brdf; + } } } - brdf_accum /= sampleCount; - fresnel_accum /= sampleCount; + brdf_accum /= sampleCount * sampleCount; + fresnel_accum /= sampleCount * sampleCount; - FragColor = vec4(brdf_accum, fresnel_accum, 0.0, 1.0); + FragColor = vec2(brdf_accum, fresnel_accum); } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl index 066ea58e2bf..20c3b64e07a 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl @@ -1,21 +1,7 @@ -#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) +#pragma BLENDER_REQUIRE(bsdf_common_lib.glsl) uniform sampler1D texHammersley; -uniform float sampleCount; -uniform float invSampleCount; - -vec2 jitternoise = vec2(0.0); - -#ifndef UTIL_TEX -# define UTIL_TEX - -#endif /* UTIL_TEX */ - -void setup_noise(void) -{ - jitternoise = texelfetch_noise_tex(gl_FragCoord.xy).rg; /* Global variable */ -} vec3 tangent_to_world(vec3 vector, vec3 N, vec3 T, vec3 B) { @@ -27,20 +13,11 @@ vec3 hammersley_3d(float i, float invsamplenbr) { vec3 Xi; /* Theta, cos(Phi), sin(Phi) */ - Xi.x = i * invsamplenbr; /* i/samples */ - Xi.x = fract(Xi.x + jitternoise.x); - - int u = int(mod(i + jitternoise.y * HAMMERSLEY_SIZE, HAMMERSLEY_SIZE)); - - Xi.yz = texelFetch(texHammersley, u, 0).rg; + Xi.x = i * invsamplenbr; + Xi.yz = texelFetch(texHammersley, int(i), 0).rg; return Xi; } - -vec3 hammersley_3d(float i) -{ - return hammersley_3d(i, invSampleCount); -} #endif /* -------------- BSDFS -------------- */ @@ -75,16 +52,16 @@ vec3 sample_ggx(vec3 rand, float a2, vec3 N, vec3 T, vec3 B, out float NH) } #ifdef HAMMERSLEY_SIZE -vec3 sample_ggx(float nsample, float a2, vec3 N, vec3 T, vec3 B) +vec3 sample_ggx(float nsample, float inv_sample_count, float a2, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); vec3 Ht = sample_ggx(Xi, a2); return tangent_to_world(Ht, N, T, B); } -vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B) +vec3 sample_hemisphere(float nsample, float inv_sample_count, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); float z = Xi.x; /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ @@ -96,9 +73,9 @@ vec3 sample_hemisphere(float nsample, vec3 N, vec3 T, vec3 B) return tangent_to_world(Ht, N, T, B); } -vec3 sample_cone(float nsample, float angle, vec3 N, vec3 T, vec3 B) +vec3 sample_cone(float nsample, float inv_sample_count, float angle, vec3 N, vec3 T, vec3 B) { - vec3 Xi = hammersley_3d(nsample); + vec3 Xi = hammersley_3d(nsample, inv_sample_count); float z = cos(angle * Xi.x); /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ diff --git a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl index d815d9d4e6b..2ffe23a9197 100644 --- a/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/btdf_lut_frag.glsl @@ -1,62 +1,89 @@ +#pragma BLENDER_REQUIRE(common_utiltex_lib.glsl) #pragma BLENDER_REQUIRE(bsdf_sampling_lib.glsl) -uniform float a2; +uniform float sampleCount; +uniform float z; out vec4 FragColor; void main() { - vec3 N, T, B, V; + float x = floor(gl_FragCoord.x) / (LUT_SIZE - 1.0); + float y = floor(gl_FragCoord.y) / (LUT_SIZE - 1.0); - float x = gl_FragCoord.x / LUT_SIZE; - float y = gl_FragCoord.y / LUT_SIZE; - /* There is little variation if ior > 1.0 so we - * maximize LUT precision for ior < 1.0 */ - x = x * 1.1; - float ior = (x > 1.0) ? ior_from_f0((x - 1.0) * 10.0) : sqrt(x); - float NV = (1.0 - (clamp(y, 1e-4, 0.9999))); + float ior = clamp(sqrt(x), 0.05, 0.999); + /* ior is sin of critical angle. */ + float critical_cos = sqrt(1.0 - saturate(ior * ior)); - N = vec3(0.0, 0.0, 1.0); - T = vec3(1.0, 0.0, 0.0); - B = vec3(0.0, 1.0, 0.0); - V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); + y = y * 2.0 - 1.0; + /* Maximize texture usage on both sides of the critical angle. */ + y *= (y > 0.0) ? (1.0 - critical_cos) : critical_cos; + /* Center LUT around critical angle to avoid strange interpolation issues when the critical + * angle is changing. */ + y += critical_cos; + float NV = clamp(y, 1e-4, 0.9999); - setup_noise(); + float a = z * z; + float a2 = clamp(a * a, 1e-8, 0.9999); + + vec3 V = vec3(sqrt(1.0 - NV * NV), 0.0, NV); /* Integrating BTDF */ float btdf_accum = 0.0; - for (float i = 0.0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */ + float fresnel_accum = 0.0; + for (float j = 0.0; j < sampleCount; j++) { + for (float i = 0.0; i < sampleCount; i++) { + vec3 Xi = (vec3(i, j, 0.0) + 0.5) / sampleCount; + Xi.yz = vec2(cos(Xi.y * M_2PI), sin(Xi.y * M_2PI)); - float VH = dot(V, H); + /* Microfacet normal. */ + vec3 H = sample_ggx(Xi, a2); - /* Check if there is total internal reflections. */ - float c = abs(VH); - float g = ior * ior - 1.0 + c * c; + float VH = dot(V, H); - float eta = 1.0 / ior; - if (dot(H, V) < 0.0) { - H = -H; - eta = ior; - } + /* Check if there is total internal reflections. */ + float fresnel = F_eta(ior, VH); - vec3 L = refract(-V, H, eta); - float NL = -dot(N, L); + fresnel_accum += fresnel; - if ((NL > 0.0) && (g > 0.0)) { - float LH = dot(L, H); + float eta = 1.0 / ior; + if (dot(H, V) < 0.0) { + H = -H; + eta = ior; + } - float G1_l = NL * 2.0 / - G1_Smith_GGX(NL, a2); /* Balancing the adjustments made in G1_Smith */ + vec3 L = refract(-V, H, eta); + float NL = -L.z; - /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV) - * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */ - float btdf = G1_l * abs(VH * LH) / (VH * abs(LH)); + if ((NL > 0.0) && (fresnel < 0.999)) { + float LH = dot(L, H); - btdf_accum += btdf; + /* Balancing the adjustments made in G1_Smith. */ + float G1_l = NL * 2.0 / G1_Smith_GGX(NL, a2); + + /* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV) + * pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */ + float btdf = G1_l * abs(VH * LH) / (VH * abs(LH)); + + btdf_accum += btdf; + } } } - btdf_accum /= sampleCount; + btdf_accum /= sampleCount * sampleCount; + fresnel_accum /= sampleCount * sampleCount; - FragColor = vec4(btdf_accum, 0.0, 0.0, 1.0); + if (z == 0.0) { + /* Perfect mirror. Increased precision because the roughness is clamped. */ + fresnel_accum = F_eta(ior, NV); + } + + if (x == 0.0) { + /* Special case. */ + fresnel_accum = 1.0; + btdf_accum = 0.0; + } + + /* There is place to put multiscater result (which is a little bit different still) + * and / or lobe fitting for better sampling of */ + FragColor = vec4(btdf_accum, fresnel_accum, 0.0, 1.0); } diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl index 9d539ec5a48..2e506d6ba78 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -40,7 +40,7 @@ ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in, cl_out.radiance = vec3(0.0); float NV = dot(cl_in.N, cl_common.V); - vec2 lut_uv = lut_coords_ltc(NV, cl_in.roughness); + vec2 lut_uv = lut_coords(NV, cl_in.roughness); ClosureEvalGlossy cl_eval; cl_eval.ltc_mat = texture(utilTex, vec3(lut_uv, LTC_MAT_LAYER)); diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl index 7b1a0b263c0..821859b3228 100644 --- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl @@ -17,7 +17,10 @@ uniform sampler2DArray utilTex; #define BRDF_LUT_LAYER 1 #define NOISE_LAYER 2 #define LTC_DISK_LAYER 3 /* UNUSED */ + /* Layers 4 to 20 are for BTDF Lut. */ +const float lut_btdf_layer_first = 4.0; +const float lut_btdf_layer_count = 16.0; /** * Reminder: The 4 noise values are based of 3 uncorrelated blue noises: @@ -27,56 +30,77 @@ uniform sampler2DArray utilTex; **/ #define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0) -/* Return texture coordinates to sample Surface LUT */ -vec2 lut_coords(float cosTheta, float roughness) +/* Return texture coordinates to sample Surface LUT. */ +vec2 lut_coords(float cos_theta, float roughness) { - /* TODO(fclem) Ugly Acos here. Get rid ot this. Should use same mapping as lut_coords_ltc. */ - float theta = acos(cosTheta); - vec2 coords = vec2(roughness, theta / M_PI_2); - + vec2 coords = vec2(roughness, sqrt(1.0 - cos_theta)); /* scale and bias coordinates, for correct filtered lookup */ return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; } -vec2 lut_coords_ltc(float cosTheta, float roughness) +/* Returns the GGX split-sum precomputed in LUT. */ +vec2 brdf_lut(float cos_theta, float roughness) { - vec2 coords = vec2(roughness, sqrt(1.0 - cosTheta)); - - /* scale and bias coordinates, for correct filtered lookup */ - return coords * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; + return textureLod(utilTex, vec3(lut_coords(cos_theta, roughness), BRDF_LUT_LAYER), 0.0).rg; } -vec2 brdf_lut(float cosTheta, float roughness) +/* Return texture coordinates to sample Surface LUT. */ +vec3 lut_coords_btdf(float cos_theta, float roughness, float ior) { - return textureLod(utilTex, vec3(lut_coords(cosTheta, roughness), BRDF_LUT_LAYER), 0.0).rg; -} - -float get_btdf_lut(float NV, float roughness, float ior) -{ - const vec3 lut_scale_bias_texel_size = vec3((LUT_SIZE - 1.0), 0.5, 1.5) / LUT_SIZE; + /* ior is sin of critical angle. */ + float critical_cos = sqrt(1.0 - ior * ior); vec3 coords; - /* Try to compensate for the low resolution and interpolation error. */ - coords.x = (ior > 1.0) ? (0.9 + lut_scale_bias_texel_size.z) + - (0.1 - lut_scale_bias_texel_size.z) * f0_from_ior(ior) : - (0.9 + lut_scale_bias_texel_size.z) * ior * ior; - coords.y = 1.0 - saturate(NV); - coords.xy *= lut_scale_bias_texel_size.x; - coords.xy += lut_scale_bias_texel_size.y; + coords.x = sqr(ior); + coords.y = cos_theta; + coords.y -= critical_cos; + coords.y /= (coords.y > 0.0) ? (1.0 - critical_cos) : critical_cos; + coords.y = coords.y * 0.5 + 0.5; + coords.z = roughness; - const float lut_lvl_ofs = 4.0; /* First texture lvl of roughness. */ - const float lut_lvl_scale = 16.0; /* How many lvl of roughness in the lut. */ + coords = saturate(coords); - float mip = roughness * lut_lvl_scale; - float mip_floor = floor(mip); + /* scale and bias coordinates, for correct filtered lookup */ + coords.xy = coords.xy * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; - coords.z = lut_lvl_ofs + mip_floor + 1.0; - float btdf_high = textureLod(utilTex, coords, 0.0).r; + return coords; +} - coords.z -= 1.0; - float btdf_low = textureLod(utilTex, coords, 0.0).r; +/* Returns GGX BTDF in first component and fresnel in second. */ +vec2 btdf_lut(float cos_theta, float roughness, float ior) +{ + if (ior <= 1e-5) { + return vec2(0.0); + } - float btdf = (ior == 1.0) ? 1.0 : mix(btdf_low, btdf_high, mip - coords.z); + if (ior >= 1.0) { + vec2 split_sum = brdf_lut(cos_theta, roughness); + float f0 = f0_from_ior(ior); + /* Baked IOR for GGX BRDF. */ + const float specular = 1.0; + const float eta_brdf = (2.0 / (1.0 - sqrt(0.08 * specular))) - 1.0; + /* Avoid harsh transition comming from ior == 1. */ + float f90 = fast_sqrt(saturate(f0 / (f0_from_ior(eta_brdf) * 0.25))); + float fresnel = F_brdf_single_scatter(vec3(f0), vec3(f90), split_sum).r; + /* Setting the BTDF to one is not really important since it is only used for multiscatter + * and it's already quite close to ground truth. */ + float btdf = 1.0; + return vec2(btdf, fresnel); + } + + vec3 coords = lut_coords_btdf(cos_theta, roughness, ior); + + float layer = coords.z * lut_btdf_layer_count; + float layer_floored = floor(layer); + + coords.z = lut_btdf_layer_first + layer_floored; + vec2 btdf_low = textureLod(utilTex, coords, 0.0).rg; + + coords.z += 1.0; + vec2 btdf_high = textureLod(utilTex, coords, 0.0).rg; + + /* Manual trilinear interpolation. */ + vec2 btdf = mix(btdf_low, btdf_high, layer - layer_floored); return btdf; } diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl index bf45169ebaa..4c4cbb069fe 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl @@ -9,6 +9,9 @@ uniform float lodFactor; uniform float lodMax; uniform float intensityFac; +uniform float sampleCount; +uniform float invSampleCount; + in vec3 worldPosition; out vec4 FragColor; @@ -144,7 +147,7 @@ void main() float weight = 0.0; vec3 out_radiance = vec3(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 L = sample_hemisphere(i, N, T, B); /* Microfacet normal */ + vec3 L = sample_hemisphere(i, invSampleCount, N, T, B); /* Microfacet normal */ float NL = dot(N, L); if (NL > 0.0) { diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl index ccb77427ed2..35fdbcb715f 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl @@ -11,6 +11,9 @@ uniform float paddingSize; uniform float intensityFac; uniform float fireflyFactor; +uniform float sampleCount; +uniform float invSampleCount; + in vec3 worldPosition; out vec4 FragColor; @@ -45,15 +48,11 @@ void main() make_orthonormal_basis(N, T, B); /* Generate tangent space */ - /* Noise to dither the samples */ - /* Note : ghosting is better looking than noise. */ - // setup_noise(); - /* Integrating Envmap */ float weight = 0.0; vec3 out_radiance = vec3(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 H = sample_ggx(i, roughnessSquared, N, T, B); /* Microfacet normal */ + vec3 H = sample_ggx(i, invSampleCount, roughnessSquared, N, T, B); /* Microfacet normal */ vec3 L = -reflect(V, H); float NL = dot(N, L); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl index 8d7c58a93d5..a974e1d538d 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl @@ -13,6 +13,9 @@ uniform float farClip; uniform float visibilityRange; uniform float visibilityBlur; +uniform float sampleCount; +uniform float invSampleCount; + out vec4 FragColor; vec3 octahedral_to_cubemap_proj(vec2 co) @@ -77,7 +80,7 @@ void main() vec2 accum = vec2(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 sample = sample_cone(i, M_PI_2 * visibilityBlur, cos, T, B); + vec3 sample = sample_cone(i, invSampleCount, M_PI_2 * visibilityBlur, cos, T, B); float depth = texture(probeDepth, sample).r; depth = get_world_distance(depth, sample); accum += vec2(depth, depth * depth); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl index ba02ae6d886..6788b34c938 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -6,8 +6,8 @@ void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, - float use_multiscatter, - float ssr_id, + const float do_multiscatter, + const float ssr_id, out Closure result) { CLOSURE_VARS_DECLARE_2(Glossy, Refraction); @@ -23,11 +23,16 @@ void node_bsdf_glass(vec4 color, result = CLOSURE_DEFAULT; - float fresnel = F_eta(in_Refraction_1.ior, dot(in_Glossy_0.N, cameraVec)); + float NV = dot(in_Refraction_1.N, cameraVec); + + float fresnel = (do_multiscatter != 0.0) ? + btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).y : + F_eta(in_Refraction_1.ior, NV); + + vec2 split_sum = brdf_lut(NV, in_Glossy_0.roughness); + vec3 brdf = (do_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : + F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); - vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec), in_Glossy_0.roughness); - vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : - F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); out_Glossy_0.radiance *= brdf; out_Glossy_0.radiance = render_pass_glossy_mask(vec3(1.0), out_Glossy_0.radiance); @@ -35,6 +40,10 @@ void node_bsdf_glass(vec4 color, closure_load_ssr_data( out_Glossy_0.radiance, in_Glossy_0.roughness, in_Glossy_0.N, ssr_id, result); + float btdf = (do_multiscatter != 0.0) ? + 1.0 : + btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).x; + out_Refraction_1.radiance *= btdf; out_Refraction_1.radiance = render_pass_glossy_mask(vec3(1.0), out_Refraction_1.radiance); out_Refraction_1.radiance *= color.rgb * (1.0 - fresnel); /* Simulate 2nd absorption event. */ diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 15958dcf65e..139dcb33222 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -70,7 +70,6 @@ void node_bsdf_principled(vec4 base_color, in_Refraction_3.N = N; /* Normalized during eval. */ in_Refraction_3.roughness = do_multiscatter != 0.0 ? roughness : transmission_roughness; in_Refraction_3.ior = ior; - CLOSURE_EVAL_FUNCTION_4(node_bsdf_principled, Diffuse, Glossy, Glossy, Refraction); @@ -92,9 +91,9 @@ void node_bsdf_principled(vec4 base_color, vec3 base_color_tint = tint_from_color(base_color.rgb); - /* TODO(fclem) This isn't good for rough glass using multiscatter (since the fresnel is applied - * on each microfacet in cycles). */ - float fresnel = F_eta(in_Refraction_3.ior, NV); + float fresnel = (do_multiscatter != 0.0) ? + btdf_lut(NV, in_Glossy_1.roughness, in_Refraction_3.ior).y : + F_eta(in_Refraction_3.ior, NV); { /* Glossy reflections. @@ -159,7 +158,11 @@ void node_bsdf_principled(vec4 base_color, } if (transmission > 1e-5) { + float btdf = (do_multiscatter != 0.0) ? + 1.0 : + btdf_lut(NV, in_Refraction_3.roughness, in_Refraction_3.ior).x; /* TODO(fclem) This could be going to a transmission render pass instead. */ + out_Refraction_3.radiance *= btdf; out_Refraction_3.radiance = render_pass_glossy_mask(vec3(1), out_Refraction_3.radiance); out_Refraction_3.radiance *= base_color.rgb; /* Simulate 2nd transmission event. */ From e7f61685edc03be69fec7268956a9e3d8df07fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:53:51 +0100 Subject: [PATCH 150/519] EEVEE: Update Offline LUT This follows a change in the LUT generation code. --- source/blender/draw/engines/eevee/eevee_lut.c | 34923 ++++++++-------- source/blender/draw/engines/eevee/eevee_lut.h | 2 +- .../draw/engines/eevee/eevee_materials.c | 2 +- 3 files changed, 17448 insertions(+), 17479 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lut.c b/source/blender/draw/engines/eevee/eevee_lut.c index b380269db99..27ce66ebec7 100644 --- a/source/blender/draw/engines/eevee/eevee_lut.c +++ b/source/blender/draw/engines/eevee/eevee_lut.c @@ -2988,1033 +2988,6 @@ const float ltc_mag_ggx[64 * 64 * 2] = { 0.932164, 0.047190, }; -const float bsdf_split_sum_ggx[64 * 64 * 2] = { - 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, - 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000001f, - 0.998047f, 0.000001f, 0.997559f, 0.000002f, 0.997070f, 0.000003f, 0.996094f, 0.000004f, - 0.994629f, 0.000004f, 0.993652f, 0.000006f, 0.991699f, 0.000007f, 0.989746f, 0.000008f, - 0.987305f, 0.000010f, 0.984375f, 0.000012f, 0.980957f, 0.000013f, 0.977539f, 0.000016f, - 0.973145f, 0.000018f, 0.967773f, 0.000020f, 0.961914f, 0.000023f, 0.955566f, 0.000025f, - 0.947754f, 0.000028f, 0.939941f, 0.000031f, 0.930664f, 0.000033f, 0.920410f, 0.000036f, - 0.909180f, 0.000039f, 0.896973f, 0.000042f, 0.884277f, 0.000044f, 0.870117f, 0.000047f, - 0.854980f, 0.000049f, 0.838867f, 0.000051f, 0.821777f, 0.000053f, 0.803711f, 0.000055f, - 0.785156f, 0.000057f, 0.765625f, 0.000058f, 0.745605f, 0.000059f, 0.724609f, 0.000060f, - 0.703613f, 0.000061f, 0.681641f, 0.000061f, 0.659668f, 0.000061f, 0.637695f, 0.000061f, - 0.615234f, 0.000061f, 0.592773f, 0.000060f, 0.570801f, 0.000060f, 0.548340f, 0.000059f, - 0.526855f, 0.000058f, 0.504883f, 0.000057f, 0.483887f, 0.000055f, 0.462891f, 0.000054f, - 0.442627f, 0.000053f, 0.422607f, 0.000051f, 0.403320f, 0.000050f, 0.384766f, 0.000048f, - 0.366455f, 0.000046f, 0.348877f, 0.000045f, 0.332031f, 0.000043f, 0.315918f, 0.000041f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.999512f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 0.999512f, 0.000000f, 0.999023f, 0.000001f, 0.999023f, 0.000001f, 0.998535f, 0.000002f, - 0.998047f, 0.000003f, 0.997559f, 0.000004f, 0.997070f, 0.000005f, 0.996094f, 0.000006f, - 0.994629f, 0.000008f, 0.993164f, 0.000010f, 0.991699f, 0.000012f, 0.989746f, 0.000015f, - 0.987305f, 0.000018f, 0.984375f, 0.000020f, 0.980957f, 0.000024f, 0.977051f, 0.000027f, - 0.972168f, 0.000031f, 0.967285f, 0.000035f, 0.961426f, 0.000039f, 0.954590f, 0.000043f, - 0.947266f, 0.000048f, 0.938965f, 0.000052f, 0.929199f, 0.000057f, 0.919434f, 0.000061f, - 0.908203f, 0.000065f, 0.895996f, 0.000069f, 0.882812f, 0.000073f, 0.868652f, 0.000077f, - 0.853027f, 0.000080f, 0.837402f, 0.000083f, 0.820312f, 0.000086f, 0.802246f, 0.000088f, - 0.783691f, 0.000090f, 0.764160f, 0.000092f, 0.744141f, 0.000093f, 0.723633f, 0.000093f, - 0.702637f, 0.000094f, 0.681152f, 0.000094f, 0.659180f, 0.000093f, 0.637207f, 0.000093f, - 0.615234f, 0.000091f, 0.593262f, 0.000090f, 0.571289f, 0.000088f, 0.549316f, 0.000087f, - 0.527344f, 0.000085f, 0.505859f, 0.000082f, 0.485107f, 0.000080f, 0.464355f, 0.000078f, - 0.444336f, 0.000075f, 0.424561f, 0.000072f, 0.405273f, 0.000070f, 0.386719f, 0.000067f, - 0.368652f, 0.000065f, 0.351318f, 0.000062f, 0.334473f, 0.000059f, 0.318115f, 0.000057f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, - 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, - 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999023f, 0.000002f, 0.998535f, 0.000004f, - 0.998047f, 0.000005f, 0.997559f, 0.000007f, 0.997070f, 0.000009f, 0.996094f, 0.000011f, - 0.994629f, 0.000013f, 0.993164f, 0.000017f, 0.991211f, 0.000020f, 0.989258f, 0.000024f, - 0.986816f, 0.000028f, 0.983887f, 0.000033f, 0.980469f, 0.000038f, 0.976562f, 0.000043f, - 0.971680f, 0.000049f, 0.966797f, 0.000055f, 0.960449f, 0.000062f, 0.953613f, 0.000068f, - 0.946289f, 0.000075f, 0.937500f, 0.000081f, 0.928223f, 0.000088f, 0.917969f, 0.000094f, - 0.906738f, 0.000100f, 0.894531f, 0.000106f, 0.880859f, 0.000111f, 0.866699f, 0.000116f, - 0.851562f, 0.000120f, 0.835449f, 0.000124f, 0.818359f, 0.000127f, 0.800781f, 0.000130f, - 0.782227f, 0.000132f, 0.762695f, 0.000134f, 0.742676f, 0.000134f, 0.722656f, 0.000135f, - 0.701660f, 0.000134f, 0.680176f, 0.000133f, 0.658691f, 0.000132f, 0.636719f, 0.000130f, - 0.615234f, 0.000128f, 0.593262f, 0.000125f, 0.571289f, 0.000123f, 0.549805f, 0.000119f, - 0.528320f, 0.000116f, 0.507324f, 0.000112f, 0.486328f, 0.000109f, 0.466064f, 0.000105f, - 0.446045f, 0.000101f, 0.426514f, 0.000097f, 0.407471f, 0.000093f, 0.388916f, 0.000089f, - 0.370850f, 0.000085f, 0.353516f, 0.000082f, 0.336914f, 0.000078f, 0.320557f, 0.000074f, - 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, - 1.000000f, 0.000000f, 1.000000f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000002f, - 0.999512f, 0.000002f, 0.999023f, 0.000003f, 0.999023f, 0.000005f, 0.998535f, 0.000006f, - 0.998535f, 0.000008f, 0.997559f, 0.000011f, 0.997070f, 0.000014f, 0.996094f, 0.000017f, - 0.994629f, 0.000020f, 0.993164f, 0.000026f, 0.991211f, 0.000030f, 0.989258f, 0.000036f, - 0.986816f, 0.000043f, 0.983398f, 0.000050f, 0.979980f, 0.000058f, 0.976074f, 0.000066f, - 0.971191f, 0.000074f, 0.965820f, 0.000082f, 0.959961f, 0.000093f, 0.952637f, 0.000101f, - 0.945312f, 0.000111f, 0.936523f, 0.000120f, 0.927246f, 0.000129f, 0.916504f, 0.000137f, - 0.905273f, 0.000145f, 0.892578f, 0.000153f, 0.879395f, 0.000160f, 0.865234f, 0.000166f, - 0.850098f, 0.000171f, 0.833984f, 0.000176f, 0.816895f, 0.000179f, 0.799316f, 0.000182f, - 0.780762f, 0.000184f, 0.761230f, 0.000185f, 0.741699f, 0.000185f, 0.721191f, 0.000184f, - 0.700684f, 0.000183f, 0.679688f, 0.000181f, 0.658203f, 0.000178f, 0.636719f, 0.000175f, - 0.615234f, 0.000171f, 0.593262f, 0.000167f, 0.571777f, 0.000162f, 0.550293f, 0.000158f, - 0.529297f, 0.000152f, 0.508301f, 0.000147f, 0.487793f, 0.000142f, 0.467529f, 0.000136f, - 0.447754f, 0.000131f, 0.428223f, 0.000125f, 0.409424f, 0.000120f, 0.391113f, 0.000115f, - 0.373291f, 0.000109f, 0.355957f, 0.000104f, 0.339355f, 0.000099f, 0.323242f, 0.000094f, - 0.999512f, 0.000002f, 0.999512f, 0.000002f, 1.000000f, 0.000002f, 0.999512f, 0.000002f, - 1.000000f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000003f, - 0.999512f, 0.000004f, 0.999512f, 0.000005f, 0.999023f, 0.000007f, 0.998535f, 0.000010f, - 0.998047f, 0.000012f, 0.997559f, 0.000017f, 0.996582f, 0.000020f, 0.995605f, 0.000025f, - 0.994629f, 0.000032f, 0.993164f, 0.000038f, 0.991211f, 0.000047f, 0.988770f, 0.000055f, - 0.986328f, 0.000063f, 0.983398f, 0.000074f, 0.979492f, 0.000085f, 0.975586f, 0.000095f, - 0.970703f, 0.000108f, 0.965332f, 0.000121f, 0.958984f, 0.000132f, 0.952148f, 0.000145f, - 0.944336f, 0.000157f, 0.935547f, 0.000170f, 0.925781f, 0.000181f, 0.915039f, 0.000192f, - 0.903809f, 0.000203f, 0.891113f, 0.000212f, 0.877930f, 0.000220f, 0.863281f, 0.000227f, - 0.848145f, 0.000234f, 0.832031f, 0.000239f, 0.814941f, 0.000242f, 0.797363f, 0.000245f, - 0.778809f, 0.000247f, 0.759766f, 0.000247f, 0.740234f, 0.000246f, 0.720215f, 0.000244f, - 0.699707f, 0.000241f, 0.678711f, 0.000237f, 0.657715f, 0.000233f, 0.636230f, 0.000228f, - 0.614746f, 0.000222f, 0.593750f, 0.000216f, 0.572266f, 0.000209f, 0.551270f, 0.000202f, - 0.530273f, 0.000195f, 0.509277f, 0.000187f, 0.489014f, 0.000180f, 0.468994f, 0.000172f, - 0.449463f, 0.000165f, 0.430176f, 0.000157f, 0.411377f, 0.000150f, 0.393311f, 0.000143f, - 0.375488f, 0.000136f, 0.358398f, 0.000129f, 0.341797f, 0.000123f, 0.325684f, 0.000116f, - 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000005f, - 0.999512f, 0.000005f, 0.999512f, 0.000005f, 0.999512f, 0.000006f, 0.999512f, 0.000007f, - 0.999512f, 0.000008f, 0.999512f, 0.000011f, 0.999023f, 0.000013f, 0.998535f, 0.000015f, - 0.998047f, 0.000019f, 0.997559f, 0.000026f, 0.996582f, 0.000033f, 0.995605f, 0.000040f, - 0.994141f, 0.000047f, 0.993164f, 0.000058f, 0.991211f, 0.000069f, 0.988770f, 0.000080f, - 0.985840f, 0.000093f, 0.982910f, 0.000106f, 0.979004f, 0.000121f, 0.975098f, 0.000137f, - 0.970215f, 0.000153f, 0.964355f, 0.000169f, 0.958008f, 0.000186f, 0.951172f, 0.000201f, - 0.943359f, 0.000218f, 0.934082f, 0.000233f, 0.924316f, 0.000248f, 0.914062f, 0.000262f, - 0.902344f, 0.000275f, 0.889648f, 0.000286f, 0.875977f, 0.000295f, 0.861816f, 0.000304f, - 0.846680f, 0.000311f, 0.830566f, 0.000316f, 0.813477f, 0.000319f, 0.795898f, 0.000321f, - 0.777344f, 0.000322f, 0.758301f, 0.000320f, 0.739258f, 0.000318f, 0.719238f, 0.000314f, - 0.698730f, 0.000309f, 0.678223f, 0.000303f, 0.657227f, 0.000296f, 0.636230f, 0.000288f, - 0.614746f, 0.000280f, 0.593750f, 0.000271f, 0.572754f, 0.000262f, 0.551758f, 0.000252f, - 0.531250f, 0.000243f, 0.510742f, 0.000233f, 0.490479f, 0.000223f, 0.470703f, 0.000213f, - 0.451172f, 0.000203f, 0.432129f, 0.000194f, 0.413574f, 0.000184f, 0.395508f, 0.000175f, - 0.377930f, 0.000166f, 0.360840f, 0.000157f, 0.344238f, 0.000149f, 0.328125f, 0.000141f, - 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f, 0.999512f, 0.000011f, - 0.999512f, 0.000011f, 0.999512f, 0.000012f, 0.999512f, 0.000014f, 0.999512f, 0.000015f, - 0.999512f, 0.000017f, 0.999023f, 0.000020f, 0.998535f, 0.000022f, 0.998535f, 0.000028f, - 0.998047f, 0.000034f, 0.997559f, 0.000042f, 0.996582f, 0.000050f, 0.995605f, 0.000060f, - 0.994141f, 0.000072f, 0.992676f, 0.000084f, 0.990723f, 0.000099f, 0.988281f, 0.000115f, - 0.985840f, 0.000133f, 0.982422f, 0.000150f, 0.978516f, 0.000171f, 0.974609f, 0.000191f, - 0.969238f, 0.000211f, 0.963867f, 0.000232f, 0.957520f, 0.000253f, 0.950195f, 0.000274f, - 0.941895f, 0.000294f, 0.933105f, 0.000314f, 0.922852f, 0.000332f, 0.912109f, 0.000348f, - 0.900879f, 0.000363f, 0.888184f, 0.000377f, 0.874512f, 0.000387f, 0.859863f, 0.000397f, - 0.844727f, 0.000404f, 0.828613f, 0.000408f, 0.811523f, 0.000411f, 0.793945f, 0.000412f, - 0.775879f, 0.000411f, 0.756836f, 0.000407f, 0.737793f, 0.000403f, 0.717773f, 0.000396f, - 0.697754f, 0.000389f, 0.677246f, 0.000380f, 0.656738f, 0.000370f, 0.635742f, 0.000359f, - 0.614746f, 0.000347f, 0.594238f, 0.000335f, 0.573242f, 0.000323f, 0.552734f, 0.000310f, - 0.532227f, 0.000297f, 0.511719f, 0.000284f, 0.491943f, 0.000272f, 0.472412f, 0.000259f, - 0.453125f, 0.000246f, 0.434082f, 0.000234f, 0.415771f, 0.000222f, 0.397705f, 0.000211f, - 0.380127f, 0.000199f, 0.363281f, 0.000189f, 0.346680f, 0.000178f, 0.330811f, 0.000168f, - 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f, 0.999512f, 0.000022f, - 0.999512f, 0.000023f, 0.999512f, 0.000025f, 0.999512f, 0.000024f, 0.999512f, 0.000028f, - 0.999023f, 0.000030f, 0.999023f, 0.000035f, 0.999023f, 0.000040f, 0.998535f, 0.000046f, - 0.998047f, 0.000056f, 0.997559f, 0.000063f, 0.996094f, 0.000077f, 0.995605f, 0.000089f, - 0.994141f, 0.000106f, 0.992188f, 0.000123f, 0.990234f, 0.000143f, 0.987793f, 0.000163f, - 0.985352f, 0.000185f, 0.981934f, 0.000211f, 0.978027f, 0.000236f, 0.973633f, 0.000261f, - 0.968750f, 0.000288f, 0.962891f, 0.000314f, 0.956055f, 0.000341f, 0.949219f, 0.000366f, - 0.940918f, 0.000391f, 0.931641f, 0.000414f, 0.921875f, 0.000436f, 0.910645f, 0.000455f, - 0.898926f, 0.000471f, 0.886230f, 0.000487f, 0.872559f, 0.000499f, 0.858398f, 0.000509f, - 0.842773f, 0.000515f, 0.826660f, 0.000518f, 0.810059f, 0.000520f, 0.792480f, 0.000519f, - 0.774414f, 0.000515f, 0.755371f, 0.000509f, 0.736328f, 0.000501f, 0.716797f, 0.000492f, - 0.696777f, 0.000480f, 0.676758f, 0.000468f, 0.656250f, 0.000454f, 0.635742f, 0.000439f, - 0.615234f, 0.000424f, 0.594238f, 0.000408f, 0.573730f, 0.000392f, 0.553223f, 0.000375f, - 0.533203f, 0.000359f, 0.513184f, 0.000342f, 0.493408f, 0.000326f, 0.474121f, 0.000310f, - 0.455078f, 0.000294f, 0.436279f, 0.000279f, 0.417969f, 0.000264f, 0.400146f, 0.000250f, - 0.382812f, 0.000237f, 0.365723f, 0.000223f, 0.349365f, 0.000211f, 0.333496f, 0.000199f, - 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f, - 0.999512f, 0.000042f, 0.999512f, 0.000044f, 0.999512f, 0.000046f, 0.999512f, 0.000049f, - 0.999512f, 0.000054f, 0.999512f, 0.000059f, 0.999023f, 0.000065f, 0.998535f, 0.000076f, - 0.998047f, 0.000087f, 0.997070f, 0.000098f, 0.996582f, 0.000117f, 0.995117f, 0.000135f, - 0.993652f, 0.000152f, 0.992188f, 0.000176f, 0.989746f, 0.000201f, 0.987793f, 0.000228f, - 0.984863f, 0.000256f, 0.981445f, 0.000286f, 0.977539f, 0.000318f, 0.973145f, 0.000352f, - 0.967773f, 0.000384f, 0.961914f, 0.000417f, 0.955566f, 0.000451f, 0.947754f, 0.000481f, - 0.939453f, 0.000510f, 0.930176f, 0.000537f, 0.919922f, 0.000563f, 0.909180f, 0.000585f, - 0.897461f, 0.000604f, 0.884766f, 0.000620f, 0.871094f, 0.000632f, 0.856445f, 0.000641f, - 0.841309f, 0.000647f, 0.825195f, 0.000648f, 0.808105f, 0.000648f, 0.790527f, 0.000643f, - 0.772949f, 0.000637f, 0.754395f, 0.000627f, 0.735352f, 0.000615f, 0.715820f, 0.000601f, - 0.695801f, 0.000585f, 0.675781f, 0.000568f, 0.655762f, 0.000550f, 0.635742f, 0.000530f, - 0.615234f, 0.000510f, 0.594727f, 0.000490f, 0.574707f, 0.000469f, 0.554199f, 0.000448f, - 0.534180f, 0.000428f, 0.514648f, 0.000407f, 0.495117f, 0.000387f, 0.475830f, 0.000367f, - 0.456787f, 0.000348f, 0.438232f, 0.000329f, 0.420166f, 0.000311f, 0.402344f, 0.000294f, - 0.385254f, 0.000277f, 0.368408f, 0.000262f, 0.352051f, 0.000246f, 0.336182f, 0.000232f, - 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f, 0.999512f, 0.000072f, - 0.999512f, 0.000073f, 0.999512f, 0.000076f, 0.999512f, 0.000078f, 0.999512f, 0.000082f, - 0.999023f, 0.000086f, 0.999023f, 0.000095f, 0.998535f, 0.000102f, 0.998047f, 0.000116f, - 0.998047f, 0.000131f, 0.997070f, 0.000147f, 0.996094f, 0.000167f, 0.995117f, 0.000195f, - 0.993652f, 0.000219f, 0.991699f, 0.000246f, 0.989746f, 0.000278f, 0.987305f, 0.000315f, - 0.984375f, 0.000350f, 0.980957f, 0.000385f, 0.976562f, 0.000427f, 0.972168f, 0.000467f, - 0.967285f, 0.000509f, 0.960938f, 0.000548f, 0.954102f, 0.000587f, 0.946777f, 0.000623f, - 0.937988f, 0.000657f, 0.928711f, 0.000690f, 0.918457f, 0.000718f, 0.907715f, 0.000741f, - 0.895508f, 0.000762f, 0.882812f, 0.000778f, 0.869141f, 0.000791f, 0.854492f, 0.000798f, - 0.839355f, 0.000802f, 0.823242f, 0.000801f, 0.806152f, 0.000796f, 0.789062f, 0.000788f, - 0.770996f, 0.000777f, 0.752930f, 0.000762f, 0.733887f, 0.000745f, 0.714844f, 0.000726f, - 0.695312f, 0.000704f, 0.675293f, 0.000682f, 0.655273f, 0.000658f, 0.635254f, 0.000633f, - 0.615234f, 0.000607f, 0.595215f, 0.000582f, 0.575195f, 0.000556f, 0.555176f, 0.000530f, - 0.535645f, 0.000504f, 0.515625f, 0.000479f, 0.496582f, 0.000455f, 0.477539f, 0.000431f, - 0.458984f, 0.000407f, 0.440430f, 0.000385f, 0.422363f, 0.000363f, 0.404785f, 0.000343f, - 0.387695f, 0.000323f, 0.370850f, 0.000304f, 0.354736f, 0.000286f, 0.338867f, 0.000268f, - 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f, 0.999512f, 0.000119f, - 0.999512f, 0.000121f, 0.999512f, 0.000122f, 0.999512f, 0.000128f, 0.999512f, 0.000131f, - 0.999512f, 0.000139f, 0.999023f, 0.000149f, 0.998535f, 0.000161f, 0.998047f, 0.000179f, - 0.998047f, 0.000194f, 0.997070f, 0.000220f, 0.996094f, 0.000247f, 0.994629f, 0.000275f, - 0.993652f, 0.000309f, 0.991699f, 0.000344f, 0.989746f, 0.000385f, 0.986816f, 0.000429f, - 0.983887f, 0.000471f, 0.980469f, 0.000519f, 0.976074f, 0.000565f, 0.971680f, 0.000614f, - 0.966309f, 0.000664f, 0.959961f, 0.000710f, 0.953125f, 0.000754f, 0.945312f, 0.000797f, - 0.936523f, 0.000837f, 0.927246f, 0.000873f, 0.916992f, 0.000902f, 0.905762f, 0.000929f, - 0.893555f, 0.000950f, 0.880859f, 0.000966f, 0.866699f, 0.000977f, 0.852539f, 0.000981f, - 0.836914f, 0.000981f, 0.821289f, 0.000977f, 0.804688f, 0.000968f, 0.787109f, 0.000955f, - 0.769531f, 0.000937f, 0.751465f, 0.000917f, 0.732422f, 0.000894f, 0.713379f, 0.000868f, - 0.694336f, 0.000840f, 0.674805f, 0.000811f, 0.655273f, 0.000780f, 0.635254f, 0.000749f, - 0.615723f, 0.000716f, 0.595703f, 0.000685f, 0.575684f, 0.000653f, 0.556152f, 0.000621f, - 0.536621f, 0.000590f, 0.517090f, 0.000559f, 0.498291f, 0.000530f, 0.479492f, 0.000501f, - 0.460938f, 0.000473f, 0.442627f, 0.000446f, 0.424805f, 0.000420f, 0.407227f, 0.000396f, - 0.390137f, 0.000373f, 0.373535f, 0.000350f, 0.357422f, 0.000329f, 0.341553f, 0.000309f, - 0.999512f, 0.000187f, 0.999512f, 0.000187f, 0.999512f, 0.000188f, 0.999512f, 0.000188f, - 0.999512f, 0.000190f, 0.999512f, 0.000194f, 0.999512f, 0.000201f, 0.999023f, 0.000204f, - 0.999023f, 0.000213f, 0.999023f, 0.000228f, 0.998535f, 0.000242f, 0.998535f, 0.000264f, - 0.997559f, 0.000285f, 0.997070f, 0.000311f, 0.996094f, 0.000351f, 0.995117f, 0.000386f, - 0.993164f, 0.000429f, 0.991211f, 0.000470f, 0.989258f, 0.000520f, 0.986328f, 0.000575f, - 0.983398f, 0.000628f, 0.979492f, 0.000683f, 0.975586f, 0.000741f, 0.970703f, 0.000801f, - 0.965332f, 0.000855f, 0.958984f, 0.000910f, 0.951660f, 0.000961f, 0.943848f, 0.001009f, - 0.935059f, 0.001053f, 0.925781f, 0.001090f, 0.915039f, 0.001123f, 0.903809f, 0.001152f, - 0.891602f, 0.001172f, 0.878906f, 0.001186f, 0.864746f, 0.001194f, 0.850586f, 0.001195f, - 0.835449f, 0.001191f, 0.819336f, 0.001181f, 0.802734f, 0.001164f, 0.785645f, 0.001144f, - 0.768066f, 0.001121f, 0.750000f, 0.001092f, 0.731445f, 0.001061f, 0.712402f, 0.001027f, - 0.693359f, 0.000992f, 0.674316f, 0.000955f, 0.654785f, 0.000916f, 0.635254f, 0.000877f, - 0.615723f, 0.000838f, 0.596191f, 0.000799f, 0.576660f, 0.000760f, 0.557129f, 0.000721f, - 0.538086f, 0.000684f, 0.518555f, 0.000648f, 0.500000f, 0.000612f, 0.481445f, 0.000578f, - 0.462891f, 0.000545f, 0.444824f, 0.000513f, 0.427246f, 0.000483f, 0.409912f, 0.000454f, - 0.392822f, 0.000427f, 0.376221f, 0.000401f, 0.360107f, 0.000376f, 0.344482f, 0.000353f, - 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000284f, 0.999512f, 0.000285f, - 0.999512f, 0.000287f, 0.999512f, 0.000292f, 0.999512f, 0.000296f, 0.999023f, 0.000307f, - 0.999023f, 0.000320f, 0.999023f, 0.000338f, 0.998535f, 0.000349f, 0.998047f, 0.000381f, - 0.997559f, 0.000407f, 0.996582f, 0.000447f, 0.995605f, 0.000480f, 0.994629f, 0.000531f, - 0.992676f, 0.000579f, 0.990723f, 0.000637f, 0.988770f, 0.000693f, 0.985840f, 0.000755f, - 0.982422f, 0.000824f, 0.979004f, 0.000889f, 0.975098f, 0.000958f, 0.969727f, 0.001024f, - 0.963867f, 0.001090f, 0.957520f, 0.001152f, 0.950684f, 0.001211f, 0.942383f, 0.001263f, - 0.933594f, 0.001309f, 0.923828f, 0.001353f, 0.913086f, 0.001387f, 0.901855f, 0.001413f, - 0.889648f, 0.001432f, 0.876465f, 0.001443f, 0.862793f, 0.001446f, 0.848145f, 0.001442f, - 0.833008f, 0.001431f, 0.817383f, 0.001413f, 0.800781f, 0.001390f, 0.783691f, 0.001362f, - 0.766113f, 0.001328f, 0.748535f, 0.001291f, 0.729980f, 0.001250f, 0.711426f, 0.001207f, - 0.692871f, 0.001163f, 0.673828f, 0.001116f, 0.654785f, 0.001068f, 0.635254f, 0.001020f, - 0.616211f, 0.000973f, 0.596680f, 0.000926f, 0.577637f, 0.000878f, 0.558105f, 0.000833f, - 0.539062f, 0.000788f, 0.520508f, 0.000745f, 0.501465f, 0.000702f, 0.483154f, 0.000663f, - 0.465088f, 0.000624f, 0.447266f, 0.000587f, 0.429443f, 0.000552f, 0.412354f, 0.000518f, - 0.395508f, 0.000486f, 0.378906f, 0.000456f, 0.363037f, 0.000427f, 0.347168f, 0.000400f, - 0.999512f, 0.000417f, 0.999512f, 0.000417f, 0.999512f, 0.000418f, 0.999512f, 0.000419f, - 0.999512f, 0.000422f, 0.999512f, 0.000425f, 0.999023f, 0.000434f, 0.999023f, 0.000447f, - 0.999023f, 0.000462f, 0.999023f, 0.000480f, 0.998047f, 0.000508f, 0.998047f, 0.000538f, - 0.997070f, 0.000576f, 0.996582f, 0.000621f, 0.995605f, 0.000669f, 0.993652f, 0.000721f, - 0.992188f, 0.000784f, 0.990723f, 0.000849f, 0.987793f, 0.000918f, 0.985840f, 0.000996f, - 0.982422f, 0.001071f, 0.978516f, 0.001148f, 0.973633f, 0.001225f, 0.968750f, 0.001304f, - 0.962891f, 0.001378f, 0.956543f, 0.001447f, 0.948730f, 0.001511f, 0.940918f, 0.001568f, - 0.931641f, 0.001617f, 0.921875f, 0.001660f, 0.911621f, 0.001697f, 0.899902f, 0.001719f, - 0.887695f, 0.001735f, 0.874512f, 0.001740f, 0.860840f, 0.001738f, 0.846191f, 0.001725f, - 0.831055f, 0.001706f, 0.815430f, 0.001679f, 0.798828f, 0.001646f, 0.782227f, 0.001607f, - 0.764648f, 0.001562f, 0.747070f, 0.001514f, 0.729004f, 0.001462f, 0.710449f, 0.001409f, - 0.691895f, 0.001352f, 0.673340f, 0.001295f, 0.654297f, 0.001237f, 0.635254f, 0.001179f, - 0.616211f, 0.001122f, 0.597168f, 0.001065f, 0.578125f, 0.001010f, 0.559570f, 0.000955f, - 0.540527f, 0.000902f, 0.521973f, 0.000852f, 0.503418f, 0.000803f, 0.485352f, 0.000755f, - 0.467285f, 0.000710f, 0.449463f, 0.000668f, 0.431885f, 0.000626f, 0.414795f, 0.000587f, - 0.398193f, 0.000551f, 0.381836f, 0.000516f, 0.365723f, 0.000483f, 0.350098f, 0.000452f, - 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000597f, 0.999023f, 0.000598f, - 0.999023f, 0.000602f, 0.999023f, 0.000610f, 0.999023f, 0.000618f, 0.999023f, 0.000632f, - 0.998535f, 0.000651f, 0.998535f, 0.000675f, 0.998047f, 0.000704f, 0.997559f, 0.000742f, - 0.997070f, 0.000787f, 0.996094f, 0.000843f, 0.995117f, 0.000902f, 0.993652f, 0.000966f, - 0.992188f, 0.001039f, 0.990234f, 0.001117f, 0.987793f, 0.001197f, 0.984863f, 0.001286f, - 0.981445f, 0.001372f, 0.977539f, 0.001464f, 0.972656f, 0.001553f, 0.967773f, 0.001639f, - 0.961914f, 0.001722f, 0.955078f, 0.001798f, 0.947754f, 0.001868f, 0.938965f, 0.001928f, - 0.930176f, 0.001982f, 0.920410f, 0.002026f, 0.909668f, 0.002056f, 0.897949f, 0.002075f, - 0.885254f, 0.002085f, 0.872559f, 0.002083f, 0.858398f, 0.002071f, 0.844238f, 0.002048f, - 0.828613f, 0.002018f, 0.812988f, 0.001980f, 0.796875f, 0.001934f, 0.780273f, 0.001883f, - 0.763184f, 0.001824f, 0.745605f, 0.001763f, 0.728027f, 0.001698f, 0.709473f, 0.001632f, - 0.691406f, 0.001563f, 0.672852f, 0.001494f, 0.654297f, 0.001422f, 0.635254f, 0.001355f, - 0.616699f, 0.001286f, 0.598145f, 0.001218f, 0.579102f, 0.001152f, 0.560547f, 0.001089f, - 0.541992f, 0.001027f, 0.523438f, 0.000968f, 0.505371f, 0.000911f, 0.487305f, 0.000857f, - 0.469482f, 0.000804f, 0.451904f, 0.000755f, 0.434570f, 0.000708f, 0.417480f, 0.000663f, - 0.400879f, 0.000621f, 0.384521f, 0.000581f, 0.368652f, 0.000544f, 0.353027f, 0.000508f, - 0.999023f, 0.000833f, 0.999023f, 0.000833f, 0.999023f, 0.000834f, 0.999023f, 0.000835f, - 0.999023f, 0.000840f, 0.999023f, 0.000845f, 0.998535f, 0.000861f, 0.998535f, 0.000875f, - 0.998535f, 0.000897f, 0.998047f, 0.000928f, 0.997559f, 0.000965f, 0.997070f, 0.001007f, - 0.996582f, 0.001061f, 0.995605f, 0.001128f, 0.994629f, 0.001195f, 0.993164f, 0.001276f, - 0.991699f, 0.001362f, 0.989258f, 0.001453f, 0.986816f, 0.001539f, 0.983887f, 0.001645f, - 0.980469f, 0.001747f, 0.976562f, 0.001849f, 0.971680f, 0.001945f, 0.966309f, 0.002045f, - 0.959961f, 0.002136f, 0.953613f, 0.002218f, 0.945801f, 0.002291f, 0.937500f, 0.002357f, - 0.928223f, 0.002407f, 0.917969f, 0.002447f, 0.907227f, 0.002472f, 0.895508f, 0.002487f, - 0.883301f, 0.002485f, 0.870117f, 0.002474f, 0.856445f, 0.002451f, 0.841797f, 0.002417f, - 0.826660f, 0.002373f, 0.811035f, 0.002317f, 0.794922f, 0.002258f, 0.778320f, 0.002190f, - 0.761230f, 0.002117f, 0.744141f, 0.002041f, 0.726562f, 0.001961f, 0.708496f, 0.001880f, - 0.690430f, 0.001796f, 0.672363f, 0.001713f, 0.654297f, 0.001630f, 0.635742f, 0.001547f, - 0.617188f, 0.001466f, 0.598633f, 0.001387f, 0.580078f, 0.001310f, 0.561523f, 0.001235f, - 0.543457f, 0.001164f, 0.524902f, 0.001095f, 0.507324f, 0.001029f, 0.489258f, 0.000967f, - 0.471680f, 0.000906f, 0.454346f, 0.000850f, 0.437012f, 0.000796f, 0.420166f, 0.000745f, - 0.403564f, 0.000698f, 0.387451f, 0.000652f, 0.371582f, 0.000609f, 0.356201f, 0.000569f, - 0.998535f, 0.001139f, 0.998535f, 0.001139f, 0.998535f, 0.001140f, 0.998535f, 0.001142f, - 0.998535f, 0.001147f, 0.998535f, 0.001159f, 0.998535f, 0.001168f, 0.998047f, 0.001190f, - 0.998047f, 0.001217f, 0.997559f, 0.001254f, 0.997559f, 0.001301f, 0.997070f, 0.001356f, - 0.996094f, 0.001416f, 0.995605f, 0.001493f, 0.994141f, 0.001574f, 0.992676f, 0.001663f, - 0.990723f, 0.001759f, 0.988770f, 0.001867f, 0.986328f, 0.001980f, 0.982910f, 0.002087f, - 0.979492f, 0.002199f, 0.975586f, 0.002319f, 0.970703f, 0.002422f, 0.965332f, 0.002531f, - 0.958496f, 0.002628f, 0.952148f, 0.002714f, 0.944336f, 0.002792f, 0.935547f, 0.002851f, - 0.926270f, 0.002903f, 0.916016f, 0.002935f, 0.904785f, 0.002954f, 0.893066f, 0.002956f, - 0.880859f, 0.002947f, 0.867676f, 0.002920f, 0.853516f, 0.002882f, 0.839355f, 0.002831f, - 0.824219f, 0.002769f, 0.809082f, 0.002699f, 0.792969f, 0.002619f, 0.776367f, 0.002533f, - 0.759766f, 0.002443f, 0.742676f, 0.002350f, 0.725586f, 0.002251f, 0.708008f, 0.002151f, - 0.689941f, 0.002052f, 0.671875f, 0.001953f, 0.653809f, 0.001854f, 0.635742f, 0.001758f, - 0.617676f, 0.001663f, 0.599121f, 0.001572f, 0.581055f, 0.001482f, 0.562988f, 0.001395f, - 0.544922f, 0.001313f, 0.526855f, 0.001234f, 0.508789f, 0.001158f, 0.491455f, 0.001086f, - 0.473877f, 0.001018f, 0.456787f, 0.000954f, 0.439697f, 0.000892f, 0.422852f, 0.000834f, - 0.406494f, 0.000780f, 0.390381f, 0.000729f, 0.374512f, 0.000680f, 0.359131f, 0.000635f, - 0.998047f, 0.001528f, 0.998047f, 0.001528f, 0.998047f, 0.001529f, 0.998047f, 0.001532f, - 0.998047f, 0.001539f, 0.998047f, 0.001546f, 0.998047f, 0.001562f, 0.998047f, 0.001589f, - 0.997559f, 0.001621f, 0.997559f, 0.001668f, 0.996582f, 0.001715f, 0.996582f, 0.001777f, - 0.995605f, 0.001859f, 0.994629f, 0.001939f, 0.993652f, 0.002035f, 0.992188f, 0.002140f, - 0.990234f, 0.002243f, 0.987793f, 0.002369f, 0.985352f, 0.002489f, 0.981934f, 0.002621f, - 0.978516f, 0.002750f, 0.974121f, 0.002876f, 0.969238f, 0.002991f, 0.963867f, 0.003105f, - 0.957031f, 0.003206f, 0.950195f, 0.003300f, 0.942383f, 0.003374f, 0.933594f, 0.003431f, - 0.923828f, 0.003473f, 0.913574f, 0.003498f, 0.902344f, 0.003506f, 0.890625f, 0.003494f, - 0.878418f, 0.003468f, 0.865234f, 0.003426f, 0.851074f, 0.003366f, 0.836914f, 0.003296f, - 0.822266f, 0.003216f, 0.806641f, 0.003122f, 0.791016f, 0.003023f, 0.774902f, 0.002916f, - 0.758301f, 0.002804f, 0.741211f, 0.002689f, 0.724121f, 0.002573f, 0.707031f, 0.002453f, - 0.689453f, 0.002335f, 0.671875f, 0.002216f, 0.653809f, 0.002102f, 0.636230f, 0.001987f, - 0.618164f, 0.001878f, 0.600098f, 0.001771f, 0.582031f, 0.001668f, 0.564453f, 0.001569f, - 0.546387f, 0.001475f, 0.528809f, 0.001384f, 0.511230f, 0.001297f, 0.493652f, 0.001217f, - 0.476318f, 0.001139f, 0.459229f, 0.001065f, 0.442383f, 0.000996f, 0.425781f, 0.000930f, - 0.409424f, 0.000869f, 0.393311f, 0.000811f, 0.377686f, 0.000757f, 0.362305f, 0.000707f, - 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002018f, 0.997559f, 0.002022f, - 0.997559f, 0.002028f, 0.997559f, 0.002045f, 0.997559f, 0.002066f, 0.997559f, 0.002092f, - 0.997559f, 0.002129f, 0.996582f, 0.002176f, 0.996094f, 0.002235f, 0.995605f, 0.002312f, - 0.995605f, 0.002407f, 0.993652f, 0.002491f, 0.992676f, 0.002605f, 0.991211f, 0.002729f, - 0.989258f, 0.002846f, 0.987305f, 0.002987f, 0.984375f, 0.003120f, 0.980957f, 0.003263f, - 0.977051f, 0.003403f, 0.972656f, 0.003542f, 0.967285f, 0.003666f, 0.961914f, 0.003782f, - 0.955566f, 0.003889f, 0.947754f, 0.003967f, 0.939941f, 0.004044f, 0.931152f, 0.004097f, - 0.921387f, 0.004131f, 0.911133f, 0.004139f, 0.899902f, 0.004131f, 0.888184f, 0.004108f, - 0.875488f, 0.004055f, 0.862305f, 0.003990f, 0.848633f, 0.003914f, 0.834473f, 0.003819f, - 0.819824f, 0.003712f, 0.804199f, 0.003593f, 0.788574f, 0.003469f, 0.772949f, 0.003338f, - 0.756348f, 0.003201f, 0.739746f, 0.003063f, 0.723145f, 0.002924f, 0.706055f, 0.002781f, - 0.688965f, 0.002644f, 0.671387f, 0.002506f, 0.653809f, 0.002371f, 0.636230f, 0.002239f, - 0.618652f, 0.002111f, 0.601074f, 0.001989f, 0.583496f, 0.001871f, 0.565430f, 0.001759f, - 0.547852f, 0.001650f, 0.530273f, 0.001547f, 0.513184f, 0.001449f, 0.495850f, 0.001356f, - 0.478760f, 0.001269f, 0.461670f, 0.001185f, 0.445068f, 0.001107f, 0.428467f, 0.001035f, - 0.412354f, 0.000965f, 0.396240f, 0.000901f, 0.380615f, 0.000840f, 0.365479f, 0.000783f, - 0.997070f, 0.002625f, 0.997070f, 0.002625f, 0.997070f, 0.002626f, 0.997070f, 0.002630f, - 0.997070f, 0.002640f, 0.997070f, 0.002659f, 0.997070f, 0.002676f, 0.996582f, 0.002708f, - 0.996582f, 0.002752f, 0.996094f, 0.002813f, 0.995605f, 0.002886f, 0.995117f, 0.002956f, - 0.994141f, 0.003071f, 0.992676f, 0.003172f, 0.991699f, 0.003292f, 0.990234f, 0.003433f, - 0.988281f, 0.003580f, 0.985840f, 0.003727f, 0.982910f, 0.003870f, 0.979492f, 0.004028f, - 0.975586f, 0.004177f, 0.971191f, 0.004322f, 0.966309f, 0.004456f, 0.959961f, 0.004570f, - 0.953125f, 0.004669f, 0.945801f, 0.004757f, 0.937500f, 0.004826f, 0.928711f, 0.004864f, - 0.918945f, 0.004883f, 0.908691f, 0.004875f, 0.897461f, 0.004845f, 0.885254f, 0.004795f, - 0.872559f, 0.004723f, 0.859863f, 0.004631f, 0.846191f, 0.004520f, 0.832031f, 0.004398f, - 0.817383f, 0.004261f, 0.802246f, 0.004116f, 0.786621f, 0.003963f, 0.770996f, 0.003805f, - 0.754883f, 0.003639f, 0.738770f, 0.003475f, 0.722168f, 0.003307f, 0.705078f, 0.003143f, - 0.688477f, 0.002981f, 0.671387f, 0.002821f, 0.653809f, 0.002665f, 0.636719f, 0.002512f, - 0.619141f, 0.002367f, 0.602051f, 0.002226f, 0.584473f, 0.002090f, 0.566895f, 0.001963f, - 0.549805f, 0.001840f, 0.532227f, 0.001722f, 0.515137f, 0.001613f, 0.498047f, 0.001508f, - 0.481201f, 0.001409f, 0.464355f, 0.001316f, 0.447754f, 0.001228f, 0.431396f, 0.001145f, - 0.415283f, 0.001069f, 0.399414f, 0.000997f, 0.383789f, 0.000929f, 0.368652f, 0.000865f, - 0.996582f, 0.003370f, 0.996582f, 0.003370f, 0.996582f, 0.003372f, 0.996582f, 0.003378f, - 0.996582f, 0.003389f, 0.996094f, 0.003410f, 0.996094f, 0.003435f, 0.996094f, 0.003471f, - 0.996094f, 0.003523f, 0.995117f, 0.003588f, 0.995117f, 0.003664f, 0.994141f, 0.003754f, - 0.993164f, 0.003864f, 0.992676f, 0.003990f, 0.990723f, 0.004128f, 0.989746f, 0.004288f, - 0.987793f, 0.004429f, 0.984375f, 0.004601f, 0.981445f, 0.004757f, 0.978027f, 0.004925f, - 0.974121f, 0.005089f, 0.969727f, 0.005241f, 0.964355f, 0.005375f, 0.958008f, 0.005486f, - 0.951172f, 0.005596f, 0.943848f, 0.005665f, 0.935547f, 0.005718f, 0.925781f, 0.005737f, - 0.916016f, 0.005733f, 0.905762f, 0.005707f, 0.894531f, 0.005650f, 0.882324f, 0.005569f, - 0.870117f, 0.005466f, 0.856934f, 0.005341f, 0.843262f, 0.005199f, 0.829102f, 0.005043f, - 0.814941f, 0.004871f, 0.799805f, 0.004692f, 0.784668f, 0.004505f, 0.769043f, 0.004314f, - 0.753418f, 0.004116f, 0.737305f, 0.003922f, 0.721191f, 0.003729f, 0.704590f, 0.003536f, - 0.687988f, 0.003347f, 0.670898f, 0.003162f, 0.654297f, 0.002983f, 0.637207f, 0.002810f, - 0.620117f, 0.002642f, 0.603027f, 0.002481f, 0.585938f, 0.002329f, 0.568359f, 0.002182f, - 0.551270f, 0.002045f, 0.534180f, 0.001913f, 0.517090f, 0.001788f, 0.500488f, 0.001671f, - 0.483643f, 0.001560f, 0.467041f, 0.001456f, 0.450684f, 0.001358f, 0.434326f, 0.001266f, - 0.418213f, 0.001181f, 0.402588f, 0.001101f, 0.386963f, 0.001025f, 0.371826f, 0.000954f, - 0.995605f, 0.004276f, 0.995605f, 0.004276f, 0.995605f, 0.004280f, 0.995605f, 0.004284f, - 0.995605f, 0.004299f, 0.995117f, 0.004318f, 0.995117f, 0.004349f, 0.995117f, 0.004383f, - 0.994629f, 0.004456f, 0.994629f, 0.004524f, 0.994141f, 0.004612f, 0.993164f, 0.004704f, - 0.992676f, 0.004848f, 0.991699f, 0.004974f, 0.990234f, 0.005142f, 0.987793f, 0.005291f, - 0.986328f, 0.005474f, 0.982910f, 0.005638f, 0.980469f, 0.005825f, 0.976562f, 0.005989f, - 0.972656f, 0.006157f, 0.967773f, 0.006313f, 0.961914f, 0.006443f, 0.955566f, 0.006554f, - 0.948730f, 0.006645f, 0.940918f, 0.006702f, 0.932617f, 0.006733f, 0.923340f, 0.006733f, - 0.913574f, 0.006699f, 0.902832f, 0.006645f, 0.891602f, 0.006550f, 0.879395f, 0.006435f, - 0.867188f, 0.006294f, 0.854004f, 0.006130f, 0.840332f, 0.005951f, 0.826660f, 0.005756f, - 0.812500f, 0.005543f, 0.797363f, 0.005325f, 0.782715f, 0.005100f, 0.767090f, 0.004871f, - 0.751465f, 0.004642f, 0.735840f, 0.004414f, 0.719727f, 0.004185f, 0.703613f, 0.003960f, - 0.687500f, 0.003744f, 0.670898f, 0.003531f, 0.654297f, 0.003326f, 0.637695f, 0.003128f, - 0.620605f, 0.002939f, 0.604004f, 0.002756f, 0.586914f, 0.002584f, 0.569824f, 0.002420f, - 0.553223f, 0.002264f, 0.536133f, 0.002117f, 0.519531f, 0.001978f, 0.502930f, 0.001847f, - 0.486328f, 0.001723f, 0.469727f, 0.001607f, 0.453369f, 0.001498f, 0.437256f, 0.001395f, - 0.421387f, 0.001300f, 0.405762f, 0.001211f, 0.390381f, 0.001127f, 0.375244f, 0.001050f, - 0.994141f, 0.005367f, 0.994141f, 0.005367f, 0.994141f, 0.005371f, 0.994141f, 0.005375f, - 0.994141f, 0.005394f, 0.994141f, 0.005413f, 0.994141f, 0.005447f, 0.994141f, 0.005508f, - 0.993652f, 0.005558f, 0.993652f, 0.005650f, 0.992676f, 0.005741f, 0.991699f, 0.005848f, - 0.991211f, 0.006004f, 0.990234f, 0.006149f, 0.988281f, 0.006317f, 0.986328f, 0.006504f, - 0.984863f, 0.006687f, 0.981934f, 0.006866f, 0.978516f, 0.007050f, 0.974609f, 0.007233f, - 0.970215f, 0.007393f, 0.965820f, 0.007553f, 0.959961f, 0.007675f, 0.953125f, 0.007774f, - 0.946289f, 0.007843f, 0.938477f, 0.007889f, 0.929688f, 0.007889f, 0.920410f, 0.007858f, - 0.910156f, 0.007793f, 0.899414f, 0.007694f, 0.888672f, 0.007565f, 0.876465f, 0.007401f, - 0.864258f, 0.007214f, 0.851074f, 0.007008f, 0.837402f, 0.006779f, 0.823730f, 0.006535f, - 0.809570f, 0.006279f, 0.794922f, 0.006023f, 0.780273f, 0.005753f, 0.765137f, 0.005482f, - 0.750000f, 0.005215f, 0.734375f, 0.004944f, 0.718750f, 0.004681f, 0.703125f, 0.004425f, - 0.687012f, 0.004173f, 0.670898f, 0.003929f, 0.654297f, 0.003700f, 0.638184f, 0.003473f, - 0.621582f, 0.003260f, 0.604980f, 0.003056f, 0.588379f, 0.002861f, 0.571777f, 0.002676f, - 0.555176f, 0.002502f, 0.538574f, 0.002337f, 0.521973f, 0.002180f, 0.505371f, 0.002035f, - 0.488770f, 0.001898f, 0.472656f, 0.001769f, 0.456299f, 0.001649f, 0.440430f, 0.001534f, - 0.424561f, 0.001430f, 0.408936f, 0.001329f, 0.393555f, 0.001238f, 0.378418f, 0.001151f, - 0.993164f, 0.006672f, 0.993164f, 0.006672f, 0.993164f, 0.006676f, 0.993164f, 0.006687f, - 0.993164f, 0.006699f, 0.993164f, 0.006721f, 0.992676f, 0.006760f, 0.992676f, 0.006821f, - 0.992188f, 0.006897f, 0.991699f, 0.006973f, 0.991211f, 0.007099f, 0.990234f, 0.007206f, - 0.990234f, 0.007366f, 0.988281f, 0.007519f, 0.986328f, 0.007706f, 0.984863f, 0.007912f, - 0.982422f, 0.008087f, 0.979980f, 0.008286f, 0.977051f, 0.008476f, 0.972656f, 0.008667f, - 0.968262f, 0.008827f, 0.962891f, 0.008980f, 0.957520f, 0.009079f, 0.951172f, 0.009171f, - 0.943848f, 0.009216f, 0.935547f, 0.009224f, 0.926758f, 0.009193f, 0.917480f, 0.009125f, - 0.906738f, 0.009010f, 0.895996f, 0.008865f, 0.885254f, 0.008682f, 0.873047f, 0.008469f, - 0.860840f, 0.008232f, 0.847656f, 0.007973f, 0.834473f, 0.007690f, 0.820801f, 0.007397f, - 0.807129f, 0.007092f, 0.792969f, 0.006783f, 0.778320f, 0.006462f, 0.763184f, 0.006145f, - 0.748535f, 0.005833f, 0.733398f, 0.005524f, 0.717773f, 0.005219f, 0.702148f, 0.004925f, - 0.686523f, 0.004639f, 0.670898f, 0.004364f, 0.654785f, 0.004097f, 0.638672f, 0.003847f, - 0.622559f, 0.003605f, 0.605957f, 0.003376f, 0.589844f, 0.003157f, 0.573242f, 0.002951f, - 0.556641f, 0.002756f, 0.540527f, 0.002573f, 0.523926f, 0.002399f, 0.507812f, 0.002237f, - 0.491455f, 0.002085f, 0.475342f, 0.001943f, 0.459229f, 0.001809f, 0.443359f, 0.001684f, - 0.427734f, 0.001567f, 0.412109f, 0.001457f, 0.396973f, 0.001356f, 0.382080f, 0.001261f, - 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008217f, 0.991699f, 0.008232f, - 0.991211f, 0.008240f, 0.991211f, 0.008270f, 0.991211f, 0.008324f, 0.991211f, 0.008377f, - 0.990723f, 0.008461f, 0.990234f, 0.008553f, 0.989746f, 0.008682f, 0.988770f, 0.008820f, - 0.987793f, 0.008972f, 0.986816f, 0.009163f, 0.985352f, 0.009338f, 0.982910f, 0.009567f, - 0.980957f, 0.009758f, 0.977539f, 0.009956f, 0.974609f, 0.010155f, 0.970215f, 0.010330f, - 0.965820f, 0.010483f, 0.960449f, 0.010597f, 0.954590f, 0.010696f, 0.947754f, 0.010750f, - 0.940430f, 0.010757f, 0.932129f, 0.010735f, 0.923340f, 0.010651f, 0.913574f, 0.010536f, - 0.903809f, 0.010376f, 0.892578f, 0.010162f, 0.881348f, 0.009926f, 0.869629f, 0.009651f, - 0.857422f, 0.009354f, 0.844727f, 0.009026f, 0.831543f, 0.008690f, 0.817871f, 0.008331f, - 0.804199f, 0.007973f, 0.790527f, 0.007603f, 0.775879f, 0.007233f, 0.761719f, 0.006866f, - 0.747070f, 0.006500f, 0.731934f, 0.006145f, 0.716797f, 0.005798f, 0.701660f, 0.005466f, - 0.686523f, 0.005138f, 0.670898f, 0.004829f, 0.655273f, 0.004532f, 0.639160f, 0.004246f, - 0.623535f, 0.003975f, 0.607422f, 0.003719f, 0.591309f, 0.003477f, 0.575195f, 0.003246f, - 0.558594f, 0.003029f, 0.542480f, 0.002827f, 0.526367f, 0.002634f, 0.510254f, 0.002455f, - 0.494141f, 0.002285f, 0.478271f, 0.002129f, 0.462402f, 0.001980f, 0.446533f, 0.001843f, - 0.430908f, 0.001715f, 0.415527f, 0.001594f, 0.400391f, 0.001483f, 0.385498f, 0.001378f, - 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010040f, 0.989746f, 0.010048f, - 0.989746f, 0.010071f, 0.989746f, 0.010094f, 0.989258f, 0.010147f, 0.989258f, 0.010223f, - 0.988770f, 0.010300f, 0.988770f, 0.010406f, 0.987793f, 0.010529f, 0.986816f, 0.010696f, - 0.986328f, 0.010857f, 0.984863f, 0.011055f, 0.982422f, 0.011238f, 0.981445f, 0.011467f, - 0.978516f, 0.011673f, 0.975098f, 0.011871f, 0.972168f, 0.012062f, 0.967285f, 0.012215f, - 0.962402f, 0.012352f, 0.957031f, 0.012459f, 0.951172f, 0.012535f, 0.944336f, 0.012535f, - 0.937012f, 0.012520f, 0.928711f, 0.012428f, 0.919922f, 0.012299f, 0.910156f, 0.012115f, - 0.899414f, 0.011879f, 0.889160f, 0.011612f, 0.877441f, 0.011299f, 0.865723f, 0.010956f, - 0.853516f, 0.010582f, 0.841309f, 0.010193f, 0.828125f, 0.009773f, 0.814941f, 0.009361f, - 0.801270f, 0.008926f, 0.787598f, 0.008499f, 0.773926f, 0.008064f, 0.759766f, 0.007641f, - 0.745117f, 0.007225f, 0.730469f, 0.006817f, 0.716309f, 0.006424f, 0.701172f, 0.006042f, - 0.686035f, 0.005676f, 0.670898f, 0.005329f, 0.655273f, 0.004993f, 0.640137f, 0.004673f, - 0.624512f, 0.004372f, 0.608398f, 0.004086f, 0.592773f, 0.003817f, 0.576660f, 0.003561f, - 0.561035f, 0.003323f, 0.544922f, 0.003098f, 0.528809f, 0.002884f, 0.512695f, 0.002686f, - 0.497070f, 0.002501f, 0.481201f, 0.002327f, 0.465332f, 0.002165f, 0.449707f, 0.002014f, - 0.434326f, 0.001873f, 0.418945f, 0.001740f, 0.403809f, 0.001617f, 0.388916f, 0.001504f, - 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012169f, 0.987793f, 0.012184f, - 0.987305f, 0.012207f, 0.987305f, 0.012245f, 0.987305f, 0.012291f, 0.986816f, 0.012360f, - 0.986816f, 0.012459f, 0.986328f, 0.012573f, 0.985840f, 0.012695f, 0.984863f, 0.012878f, - 0.983887f, 0.013046f, 0.982422f, 0.013237f, 0.980469f, 0.013466f, 0.979004f, 0.013680f, - 0.976074f, 0.013878f, 0.972656f, 0.014069f, 0.969238f, 0.014259f, 0.964355f, 0.014397f, - 0.959961f, 0.014488f, 0.954102f, 0.014580f, 0.947754f, 0.014595f, 0.940430f, 0.014557f, - 0.933105f, 0.014481f, 0.925293f, 0.014328f, 0.915527f, 0.014122f, 0.906250f, 0.013870f, - 0.895996f, 0.013565f, 0.885254f, 0.013206f, 0.873535f, 0.012817f, 0.862305f, 0.012383f, - 0.850098f, 0.011932f, 0.837891f, 0.011452f, 0.824707f, 0.010963f, 0.812012f, 0.010460f, - 0.798828f, 0.009964f, 0.785156f, 0.009460f, 0.771484f, 0.008965f, 0.757812f, 0.008484f, - 0.743652f, 0.008003f, 0.729492f, 0.007542f, 0.715332f, 0.007095f, 0.700684f, 0.006668f, - 0.686035f, 0.006256f, 0.670898f, 0.005863f, 0.655762f, 0.005489f, 0.640625f, 0.005135f, - 0.625488f, 0.004799f, 0.609863f, 0.004478f, 0.594238f, 0.004181f, 0.578613f, 0.003901f, - 0.562988f, 0.003635f, 0.547363f, 0.003386f, 0.531250f, 0.003153f, 0.515625f, 0.002935f, - 0.500000f, 0.002729f, 0.484131f, 0.002539f, 0.468506f, 0.002361f, 0.453125f, 0.002195f, - 0.437744f, 0.002041f, 0.422363f, 0.001897f, 0.407471f, 0.001763f, 0.392578f, 0.001637f, - 0.985352f, 0.014641f, 0.985352f, 0.014641f, 0.984863f, 0.014648f, 0.984863f, 0.014656f, - 0.984863f, 0.014679f, 0.984863f, 0.014717f, 0.984863f, 0.014771f, 0.984375f, 0.014839f, - 0.984375f, 0.014938f, 0.983398f, 0.015060f, 0.983398f, 0.015244f, 0.981934f, 0.015388f, - 0.980957f, 0.015587f, 0.979492f, 0.015778f, 0.977539f, 0.015976f, 0.975586f, 0.016190f, - 0.972656f, 0.016388f, 0.969727f, 0.016571f, 0.965820f, 0.016739f, 0.961426f, 0.016861f, - 0.956055f, 0.016922f, 0.950684f, 0.016953f, 0.943848f, 0.016922f, 0.937012f, 0.016815f, - 0.929199f, 0.016663f, 0.920410f, 0.016434f, 0.911621f, 0.016144f, 0.901855f, 0.015793f, - 0.891602f, 0.015411f, 0.880859f, 0.014954f, 0.869629f, 0.014473f, 0.857910f, 0.013947f, - 0.846191f, 0.013390f, 0.833984f, 0.012825f, 0.821289f, 0.012253f, 0.809082f, 0.011665f, - 0.795898f, 0.011086f, 0.782715f, 0.010506f, 0.769531f, 0.009933f, 0.755859f, 0.009377f, - 0.742188f, 0.008842f, 0.728516f, 0.008316f, 0.714355f, 0.007812f, 0.700195f, 0.007336f, - 0.685547f, 0.006874f, 0.670898f, 0.006435f, 0.656250f, 0.006020f, 0.641602f, 0.005623f, - 0.626465f, 0.005253f, 0.611328f, 0.004902f, 0.596191f, 0.004570f, 0.580566f, 0.004261f, - 0.564941f, 0.003967f, 0.549316f, 0.003695f, 0.533691f, 0.003437f, 0.518066f, 0.003199f, - 0.502930f, 0.002975f, 0.487305f, 0.002766f, 0.471680f, 0.002571f, 0.456299f, 0.002388f, - 0.441162f, 0.002220f, 0.426025f, 0.002062f, 0.411133f, 0.001916f, 0.396240f, 0.001781f, - 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017502f, 0.982422f, 0.017517f, - 0.981934f, 0.017532f, 0.981934f, 0.017593f, 0.981934f, 0.017639f, 0.981934f, 0.017731f, - 0.981445f, 0.017838f, 0.980957f, 0.017960f, 0.979980f, 0.018112f, 0.979004f, 0.018295f, - 0.978027f, 0.018478f, 0.975586f, 0.018677f, 0.974609f, 0.018860f, 0.972168f, 0.019073f, - 0.969238f, 0.019287f, 0.965820f, 0.019455f, 0.962402f, 0.019562f, 0.958008f, 0.019653f, - 0.952637f, 0.019653f, 0.946289f, 0.019623f, 0.939453f, 0.019516f, 0.932617f, 0.019348f, - 0.924316f, 0.019089f, 0.916016f, 0.018784f, 0.907227f, 0.018387f, 0.897461f, 0.017944f, - 0.887207f, 0.017426f, 0.876465f, 0.016861f, 0.865234f, 0.016266f, 0.854004f, 0.015640f, - 0.842285f, 0.014999f, 0.830078f, 0.014320f, 0.818359f, 0.013641f, 0.805664f, 0.012962f, - 0.792969f, 0.012291f, 0.780273f, 0.011627f, 0.767090f, 0.010979f, 0.753906f, 0.010345f, - 0.740723f, 0.009735f, 0.727539f, 0.009155f, 0.713867f, 0.008591f, 0.699707f, 0.008049f, - 0.685547f, 0.007534f, 0.671387f, 0.007050f, 0.656738f, 0.006588f, 0.642578f, 0.006149f, - 0.627441f, 0.005737f, 0.612793f, 0.005352f, 0.597656f, 0.004986f, 0.582520f, 0.004642f, - 0.567383f, 0.004322f, 0.551758f, 0.004021f, 0.536621f, 0.003744f, 0.520996f, 0.003481f, - 0.505859f, 0.003235f, 0.490479f, 0.003006f, 0.475098f, 0.002794f, 0.459717f, 0.002596f, - 0.444580f, 0.002411f, 0.429688f, 0.002241f, 0.414795f, 0.002081f, 0.400146f, 0.001933f, - 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020798f, 0.979004f, 0.020813f, - 0.979004f, 0.020844f, 0.978516f, 0.020874f, 0.978516f, 0.020935f, 0.978027f, 0.021027f, - 0.978027f, 0.021149f, 0.977539f, 0.021286f, 0.977051f, 0.021454f, 0.975586f, 0.021622f, - 0.974121f, 0.021820f, 0.972656f, 0.021988f, 0.970215f, 0.022186f, 0.968750f, 0.022385f, - 0.965820f, 0.022552f, 0.961914f, 0.022675f, 0.958008f, 0.022736f, 0.953613f, 0.022751f, - 0.948242f, 0.022736f, 0.942383f, 0.022614f, 0.935547f, 0.022415f, 0.927734f, 0.022156f, - 0.919922f, 0.021790f, 0.911621f, 0.021362f, 0.901855f, 0.020859f, 0.892090f, 0.020279f, - 0.882324f, 0.019638f, 0.872070f, 0.018951f, 0.860840f, 0.018234f, 0.849609f, 0.017487f, - 0.838379f, 0.016708f, 0.826172f, 0.015930f, 0.814453f, 0.015144f, 0.802246f, 0.014359f, - 0.790527f, 0.013588f, 0.777832f, 0.012833f, 0.765137f, 0.012100f, 0.752441f, 0.011383f, - 0.739258f, 0.010696f, 0.726074f, 0.010040f, 0.712891f, 0.009415f, 0.699219f, 0.008812f, - 0.685547f, 0.008240f, 0.671875f, 0.007698f, 0.657715f, 0.007191f, 0.643555f, 0.006710f, - 0.628906f, 0.006252f, 0.614258f, 0.005829f, 0.599609f, 0.005428f, 0.584473f, 0.005051f, - 0.569336f, 0.004704f, 0.554199f, 0.004372f, 0.539062f, 0.004063f, 0.523926f, 0.003780f, - 0.508789f, 0.003513f, 0.493652f, 0.003263f, 0.478271f, 0.003033f, 0.463135f, 0.002817f, - 0.448242f, 0.002615f, 0.433350f, 0.002430f, 0.418457f, 0.002256f, 0.403809f, 0.002094f, - 0.975098f, 0.024582f, 0.975098f, 0.024567f, 0.975098f, 0.024582f, 0.975098f, 0.024597f, - 0.975098f, 0.024628f, 0.975098f, 0.024658f, 0.975098f, 0.024734f, 0.974609f, 0.024826f, - 0.973633f, 0.024933f, 0.973633f, 0.025055f, 0.972656f, 0.025223f, 0.972168f, 0.025421f, - 0.970215f, 0.025589f, 0.968262f, 0.025742f, 0.966309f, 0.025925f, 0.964355f, 0.026108f, - 0.960938f, 0.026230f, 0.957520f, 0.026321f, 0.953613f, 0.026352f, 0.948242f, 0.026260f, - 0.943848f, 0.026154f, 0.937500f, 0.025970f, 0.930664f, 0.025650f, 0.922852f, 0.025253f, - 0.915039f, 0.024765f, 0.906738f, 0.024200f, 0.897461f, 0.023560f, 0.887207f, 0.022827f, - 0.877441f, 0.022064f, 0.866699f, 0.021225f, 0.855957f, 0.020370f, 0.845215f, 0.019470f, - 0.833984f, 0.018570f, 0.822266f, 0.017654f, 0.811035f, 0.016754f, 0.799316f, 0.015854f, - 0.787109f, 0.014984f, 0.775391f, 0.014122f, 0.763184f, 0.013298f, 0.750488f, 0.012489f, - 0.737793f, 0.011726f, 0.725098f, 0.010986f, 0.712402f, 0.010284f, 0.699219f, 0.009621f, - 0.685547f, 0.008987f, 0.671875f, 0.008392f, 0.658203f, 0.007828f, 0.644531f, 0.007305f, - 0.630371f, 0.006802f, 0.615723f, 0.006336f, 0.601562f, 0.005898f, 0.586914f, 0.005489f, - 0.571777f, 0.005104f, 0.557129f, 0.004745f, 0.541992f, 0.004414f, 0.526855f, 0.004101f, - 0.511719f, 0.003809f, 0.496826f, 0.003538f, 0.481689f, 0.003286f, 0.466797f, 0.003052f, - 0.451904f, 0.002832f, 0.437012f, 0.002630f, 0.422363f, 0.002441f, 0.407715f, 0.002268f, - 0.970703f, 0.028870f, 0.970703f, 0.028870f, 0.970703f, 0.028885f, 0.970703f, 0.028900f, - 0.970703f, 0.028915f, 0.970703f, 0.028961f, 0.970215f, 0.029022f, 0.970215f, 0.029114f, - 0.969727f, 0.029251f, 0.968750f, 0.029373f, 0.968262f, 0.029526f, 0.966797f, 0.029678f, - 0.966309f, 0.029877f, 0.964844f, 0.030045f, 0.962402f, 0.030167f, 0.959473f, 0.030304f, - 0.956543f, 0.030411f, 0.953125f, 0.030411f, 0.948242f, 0.030319f, 0.943359f, 0.030197f, - 0.938477f, 0.029968f, 0.931641f, 0.029648f, 0.924805f, 0.029221f, 0.917969f, 0.028687f, - 0.909180f, 0.028030f, 0.900879f, 0.027313f, 0.891602f, 0.026505f, 0.881836f, 0.025620f, - 0.871582f, 0.024673f, 0.861816f, 0.023697f, 0.851074f, 0.022659f, 0.840820f, 0.021622f, - 0.829590f, 0.020569f, 0.818359f, 0.019516f, 0.807129f, 0.018478f, 0.795898f, 0.017456f, - 0.784180f, 0.016464f, 0.772461f, 0.015503f, 0.760742f, 0.014572f, 0.748535f, 0.013672f, - 0.736816f, 0.012817f, 0.724121f, 0.012001f, 0.711914f, 0.011215f, 0.698730f, 0.010483f, - 0.686035f, 0.009789f, 0.672852f, 0.009132f, 0.659180f, 0.008514f, 0.645508f, 0.007935f, - 0.631836f, 0.007389f, 0.617676f, 0.006878f, 0.603516f, 0.006397f, 0.588867f, 0.005951f, - 0.574219f, 0.005531f, 0.559570f, 0.005142f, 0.544922f, 0.004776f, 0.529785f, 0.004436f, - 0.515137f, 0.004120f, 0.500000f, 0.003828f, 0.485352f, 0.003555f, 0.470215f, 0.003302f, - 0.455566f, 0.003065f, 0.440918f, 0.002844f, 0.426270f, 0.002642f, 0.411621f, 0.002451f, - 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033752f, 0.965820f, 0.033783f, - 0.965820f, 0.033783f, 0.965820f, 0.033875f, 0.965332f, 0.033905f, 0.965332f, 0.033997f, - 0.964844f, 0.034088f, 0.963867f, 0.034241f, 0.963379f, 0.034393f, 0.962402f, 0.034546f, - 0.960938f, 0.034698f, 0.958496f, 0.034851f, 0.957520f, 0.034973f, 0.954102f, 0.035034f, - 0.951172f, 0.035034f, 0.947754f, 0.034943f, 0.942871f, 0.034821f, 0.937988f, 0.034576f, - 0.932129f, 0.034180f, 0.926270f, 0.033722f, 0.918945f, 0.033142f, 0.911133f, 0.032410f, - 0.902832f, 0.031616f, 0.894531f, 0.030685f, 0.885254f, 0.029694f, 0.876465f, 0.028641f, - 0.866699f, 0.027512f, 0.856445f, 0.026337f, 0.846191f, 0.025146f, 0.835449f, 0.023926f, - 0.825195f, 0.022720f, 0.814453f, 0.021515f, 0.803711f, 0.020340f, 0.792480f, 0.019165f, - 0.781250f, 0.018051f, 0.770020f, 0.016968f, 0.758789f, 0.015915f, 0.747070f, 0.014931f, - 0.735352f, 0.013977f, 0.723145f, 0.013069f, 0.710938f, 0.012215f, 0.698730f, 0.011398f, - 0.686035f, 0.010635f, 0.673340f, 0.009918f, 0.660156f, 0.009239f, 0.646484f, 0.008598f, - 0.633301f, 0.008003f, 0.619141f, 0.007446f, 0.605469f, 0.006927f, 0.591309f, 0.006439f, - 0.576660f, 0.005985f, 0.562500f, 0.005562f, 0.547852f, 0.005165f, 0.533203f, 0.004795f, - 0.518066f, 0.004456f, 0.503418f, 0.004135f, 0.488770f, 0.003841f, 0.474121f, 0.003565f, - 0.459229f, 0.003311f, 0.444580f, 0.003073f, 0.430176f, 0.002853f, 0.415771f, 0.002647f, - 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039276f, 0.960449f, 0.039307f, - 0.960449f, 0.039337f, 0.959961f, 0.039368f, 0.959961f, 0.039429f, 0.959961f, 0.039520f, - 0.959473f, 0.039612f, 0.958984f, 0.039764f, 0.958008f, 0.039886f, 0.956543f, 0.040009f, - 0.955566f, 0.040131f, 0.953125f, 0.040253f, 0.951172f, 0.040314f, 0.948242f, 0.040283f, - 0.945801f, 0.040222f, 0.940918f, 0.040039f, 0.936523f, 0.039764f, 0.931152f, 0.039368f, - 0.926270f, 0.038879f, 0.919434f, 0.038208f, 0.913086f, 0.037445f, 0.905273f, 0.036530f, - 0.897461f, 0.035522f, 0.888184f, 0.034393f, 0.879395f, 0.033173f, 0.870117f, 0.031891f, - 0.860352f, 0.030563f, 0.850586f, 0.029190f, 0.840820f, 0.027802f, 0.830566f, 0.026398f, - 0.820312f, 0.025009f, 0.810059f, 0.023636f, 0.799805f, 0.022308f, 0.789062f, 0.020996f, - 0.778809f, 0.019730f, 0.767578f, 0.018524f, 0.756348f, 0.017365f, 0.745605f, 0.016251f, - 0.733887f, 0.015213f, 0.722656f, 0.014206f, 0.710938f, 0.013260f, 0.698730f, 0.012367f, - 0.686523f, 0.011536f, 0.673828f, 0.010742f, 0.661133f, 0.010002f, 0.647949f, 0.009308f, - 0.634766f, 0.008659f, 0.621094f, 0.008057f, 0.607422f, 0.007488f, 0.593262f, 0.006958f, - 0.579102f, 0.006466f, 0.564941f, 0.006004f, 0.550781f, 0.005577f, 0.536133f, 0.005177f, - 0.521484f, 0.004807f, 0.506836f, 0.004463f, 0.492432f, 0.004143f, 0.477783f, 0.003847f, - 0.463135f, 0.003571f, 0.448730f, 0.003315f, 0.434082f, 0.003077f, 0.419922f, 0.002857f, - 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045502f, 0.954102f, 0.045532f, - 0.954102f, 0.045563f, 0.954102f, 0.045593f, 0.953613f, 0.045654f, 0.953613f, 0.045715f, - 0.953125f, 0.045868f, 0.952148f, 0.045990f, 0.951660f, 0.046082f, 0.950195f, 0.046143f, - 0.948242f, 0.046265f, 0.946777f, 0.046265f, 0.943848f, 0.046265f, 0.941895f, 0.046204f, - 0.938477f, 0.046021f, 0.935059f, 0.045685f, 0.929199f, 0.045258f, 0.925293f, 0.044708f, - 0.919434f, 0.044006f, 0.912109f, 0.043121f, 0.905273f, 0.042145f, 0.897949f, 0.041016f, - 0.890137f, 0.039734f, 0.881348f, 0.038391f, 0.872559f, 0.036926f, 0.863770f, 0.035431f, - 0.854004f, 0.033813f, 0.844727f, 0.032227f, 0.835449f, 0.030640f, 0.825195f, 0.029037f, - 0.815430f, 0.027451f, 0.806152f, 0.025909f, 0.795898f, 0.024399f, 0.785645f, 0.022934f, - 0.775391f, 0.021530f, 0.765137f, 0.020187f, 0.754883f, 0.018890f, 0.743652f, 0.017670f, - 0.732910f, 0.016510f, 0.721680f, 0.015411f, 0.710449f, 0.014374f, 0.698730f, 0.013405f, - 0.686523f, 0.012482f, 0.674316f, 0.011620f, 0.662109f, 0.010811f, 0.649414f, 0.010063f, - 0.636230f, 0.009354f, 0.623047f, 0.008698f, 0.609375f, 0.008080f, 0.595703f, 0.007507f, - 0.582031f, 0.006973f, 0.567871f, 0.006477f, 0.553711f, 0.006016f, 0.539551f, 0.005585f, - 0.524902f, 0.005180f, 0.510254f, 0.004810f, 0.496094f, 0.004463f, 0.481689f, 0.004147f, - 0.467041f, 0.003847f, 0.452637f, 0.003571f, 0.438232f, 0.003315f, 0.424072f, 0.003077f, - 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052490f, 0.947266f, 0.052521f, - 0.947266f, 0.052551f, 0.946777f, 0.052582f, 0.946777f, 0.052612f, 0.946289f, 0.052734f, - 0.945801f, 0.052795f, 0.945312f, 0.052887f, 0.944336f, 0.052948f, 0.942871f, 0.053040f, - 0.941406f, 0.053009f, 0.939941f, 0.053009f, 0.937012f, 0.052917f, 0.934570f, 0.052704f, - 0.931641f, 0.052399f, 0.926758f, 0.051971f, 0.922852f, 0.051331f, 0.917480f, 0.050568f, - 0.911133f, 0.049622f, 0.904297f, 0.048523f, 0.898438f, 0.047272f, 0.890137f, 0.045868f, - 0.882812f, 0.044312f, 0.874512f, 0.042694f, 0.865723f, 0.040955f, 0.856934f, 0.039154f, - 0.847656f, 0.037354f, 0.838867f, 0.035522f, 0.829590f, 0.033661f, 0.820312f, 0.031830f, - 0.811035f, 0.030060f, 0.801270f, 0.028305f, 0.791992f, 0.026611f, 0.782227f, 0.024994f, - 0.772461f, 0.023422f, 0.762695f, 0.021927f, 0.752441f, 0.020508f, 0.742188f, 0.019165f, - 0.731445f, 0.017883f, 0.721191f, 0.016678f, 0.709961f, 0.015556f, 0.698730f, 0.014488f, - 0.687012f, 0.013489f, 0.675293f, 0.012550f, 0.663086f, 0.011673f, 0.650879f, 0.010849f, - 0.638184f, 0.010086f, 0.625000f, 0.009369f, 0.611816f, 0.008705f, 0.598145f, 0.008087f, - 0.584961f, 0.007511f, 0.570801f, 0.006977f, 0.556641f, 0.006474f, 0.542480f, 0.006012f, - 0.528320f, 0.005581f, 0.514160f, 0.005180f, 0.499756f, 0.004807f, 0.485596f, 0.004459f, - 0.471191f, 0.004139f, 0.456787f, 0.003843f, 0.442383f, 0.003569f, 0.428467f, 0.003313f, - 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f, 0.939453f, 0.060333f, - 0.939453f, 0.060394f, 0.938965f, 0.060394f, 0.938965f, 0.060455f, 0.938477f, 0.060516f, - 0.937988f, 0.060577f, 0.937500f, 0.060638f, 0.936035f, 0.060669f, 0.935547f, 0.060669f, - 0.933594f, 0.060608f, 0.931641f, 0.060516f, 0.929688f, 0.060272f, 0.927246f, 0.059967f, - 0.922363f, 0.059448f, 0.918945f, 0.058868f, 0.914062f, 0.057953f, 0.908691f, 0.056946f, - 0.902832f, 0.055786f, 0.897461f, 0.054382f, 0.890137f, 0.052826f, 0.882324f, 0.051117f, - 0.874023f, 0.049255f, 0.866211f, 0.047302f, 0.858398f, 0.045288f, 0.849609f, 0.043213f, - 0.840820f, 0.041107f, 0.832031f, 0.038971f, 0.823730f, 0.036896f, 0.814453f, 0.034821f, - 0.806152f, 0.032806f, 0.796875f, 0.030853f, 0.788086f, 0.028961f, 0.778809f, 0.027161f, - 0.769531f, 0.025421f, 0.760254f, 0.023788f, 0.750488f, 0.022217f, 0.740723f, 0.020737f, - 0.730957f, 0.019333f, 0.720703f, 0.018021f, 0.709961f, 0.016785f, 0.698730f, 0.015625f, - 0.687500f, 0.014549f, 0.676270f, 0.013535f, 0.664551f, 0.012573f, 0.652344f, 0.011688f, - 0.640137f, 0.010864f, 0.627441f, 0.010086f, 0.614258f, 0.009369f, 0.601074f, 0.008698f, - 0.587402f, 0.008080f, 0.573730f, 0.007500f, 0.560059f, 0.006962f, 0.545898f, 0.006462f, - 0.531738f, 0.006001f, 0.517578f, 0.005569f, 0.503418f, 0.005165f, 0.489502f, 0.004795f, - 0.475098f, 0.004452f, 0.460938f, 0.004131f, 0.446777f, 0.003838f, 0.432861f, 0.003563f, - 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f, 0.930664f, 0.069031f, - 0.930664f, 0.069092f, 0.930664f, 0.069092f, 0.930176f, 0.069214f, 0.929688f, 0.069153f, - 0.929199f, 0.069214f, 0.929199f, 0.069275f, 0.927246f, 0.069214f, 0.926758f, 0.069153f, - 0.925293f, 0.069031f, 0.923340f, 0.068787f, 0.920410f, 0.068420f, 0.917480f, 0.067932f, - 0.914551f, 0.067261f, 0.911133f, 0.066345f, 0.905273f, 0.065247f, 0.900391f, 0.063965f, - 0.894043f, 0.062469f, 0.888184f, 0.060699f, 0.880859f, 0.058807f, 0.873535f, 0.056763f, - 0.866211f, 0.054565f, 0.858887f, 0.052277f, 0.850586f, 0.049896f, 0.841797f, 0.047485f, - 0.833496f, 0.045105f, 0.825684f, 0.042664f, 0.817383f, 0.040283f, 0.809082f, 0.037964f, - 0.800781f, 0.035706f, 0.792480f, 0.033539f, 0.784180f, 0.031433f, 0.775391f, 0.029449f, - 0.766602f, 0.027542f, 0.757812f, 0.025726f, 0.748535f, 0.024017f, 0.739258f, 0.022400f, - 0.729980f, 0.020874f, 0.719727f, 0.019440f, 0.709961f, 0.018097f, 0.699219f, 0.016830f, - 0.688477f, 0.015656f, 0.677246f, 0.014557f, 0.665527f, 0.013527f, 0.653809f, 0.012573f, - 0.641602f, 0.011681f, 0.629395f, 0.010841f, 0.616699f, 0.010071f, 0.603516f, 0.009346f, - 0.590332f, 0.008682f, 0.577148f, 0.008057f, 0.563477f, 0.007481f, 0.549316f, 0.006943f, - 0.535645f, 0.006443f, 0.521484f, 0.005978f, 0.507324f, 0.005550f, 0.493408f, 0.005150f, - 0.479248f, 0.004780f, 0.465332f, 0.004436f, 0.451172f, 0.004124f, 0.437256f, 0.003828f, - 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f, 0.920898f, 0.078735f, - 0.920898f, 0.078796f, 0.920898f, 0.078796f, 0.920410f, 0.078796f, 0.919922f, 0.078857f, - 0.919922f, 0.078857f, 0.918945f, 0.078796f, 0.917480f, 0.078735f, 0.916992f, 0.078613f, - 0.915039f, 0.078308f, 0.913086f, 0.077942f, 0.910645f, 0.077454f, 0.908691f, 0.076660f, - 0.905273f, 0.075745f, 0.899902f, 0.074585f, 0.895996f, 0.073181f, 0.889648f, 0.071533f, - 0.883789f, 0.069641f, 0.877930f, 0.067566f, 0.872070f, 0.065247f, 0.864258f, 0.062805f, - 0.856934f, 0.060242f, 0.849121f, 0.057556f, 0.841797f, 0.054810f, 0.833984f, 0.052063f, - 0.827148f, 0.049316f, 0.818848f, 0.046570f, 0.811035f, 0.043915f, 0.803223f, 0.041290f, - 0.795898f, 0.038788f, 0.788086f, 0.036377f, 0.779785f, 0.034058f, 0.771973f, 0.031830f, - 0.763672f, 0.029755f, 0.755371f, 0.027771f, 0.747070f, 0.025894f, 0.738281f, 0.024139f, - 0.729004f, 0.022476f, 0.719238f, 0.020935f, 0.709473f, 0.019470f, 0.699707f, 0.018097f, - 0.688965f, 0.016830f, 0.678223f, 0.015640f, 0.666992f, 0.014534f, 0.655762f, 0.013496f, - 0.643555f, 0.012535f, 0.631348f, 0.011642f, 0.619141f, 0.010803f, 0.606445f, 0.010033f, - 0.593262f, 0.009308f, 0.580078f, 0.008644f, 0.566406f, 0.008018f, 0.553223f, 0.007446f, - 0.539062f, 0.006908f, 0.525391f, 0.006413f, 0.511230f, 0.005951f, 0.497559f, 0.005527f, - 0.483643f, 0.005131f, 0.469482f, 0.004765f, 0.455566f, 0.004421f, 0.441650f, 0.004108f, - 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f, 0.910156f, 0.089539f, - 0.910156f, 0.089539f, 0.909668f, 0.089539f, 0.909668f, 0.089539f, 0.909180f, 0.089539f, - 0.908691f, 0.089478f, 0.907715f, 0.089417f, 0.907227f, 0.089233f, 0.905762f, 0.088989f, - 0.904297f, 0.088562f, 0.902832f, 0.088013f, 0.900391f, 0.087280f, 0.896973f, 0.086243f, - 0.895020f, 0.085083f, 0.889160f, 0.083557f, 0.884766f, 0.081787f, 0.878906f, 0.079712f, - 0.874512f, 0.077393f, 0.867676f, 0.074951f, 0.860840f, 0.072205f, 0.854492f, 0.069275f, - 0.848145f, 0.066223f, 0.840820f, 0.063171f, 0.833008f, 0.060059f, 0.826172f, 0.056885f, - 0.819336f, 0.053741f, 0.812012f, 0.050690f, 0.804688f, 0.047699f, 0.797852f, 0.044800f, - 0.790527f, 0.042023f, 0.783691f, 0.039337f, 0.776367f, 0.036804f, 0.768555f, 0.034393f, - 0.761230f, 0.032074f, 0.753418f, 0.029922f, 0.745117f, 0.027893f, 0.736816f, 0.025970f, - 0.728516f, 0.024170f, 0.719238f, 0.022491f, 0.709961f, 0.020905f, 0.700195f, 0.019440f, - 0.689941f, 0.018066f, 0.679688f, 0.016785f, 0.668457f, 0.015587f, 0.657227f, 0.014473f, - 0.645996f, 0.013443f, 0.633789f, 0.012474f, 0.621582f, 0.011581f, 0.609375f, 0.010750f, - 0.596191f, 0.009972f, 0.583496f, 0.009262f, 0.569824f, 0.008591f, 0.556641f, 0.007973f, - 0.542969f, 0.007404f, 0.529297f, 0.006874f, 0.515625f, 0.006378f, 0.501465f, 0.005920f, - 0.487793f, 0.005501f, 0.474121f, 0.005108f, 0.460205f, 0.004742f, 0.446289f, 0.004406f, - 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f, 0.898438f, 0.101440f, - 0.897949f, 0.101440f, 0.897949f, 0.101440f, 0.897461f, 0.101440f, 0.896973f, 0.101379f, - 0.896973f, 0.101318f, 0.895996f, 0.101135f, 0.895508f, 0.100830f, 0.894043f, 0.100464f, - 0.893066f, 0.099854f, 0.890625f, 0.099121f, 0.888184f, 0.098083f, 0.885254f, 0.096802f, - 0.882324f, 0.095215f, 0.878418f, 0.093323f, 0.872559f, 0.091125f, 0.869629f, 0.088623f, - 0.862793f, 0.085815f, 0.855957f, 0.082764f, 0.850098f, 0.079590f, 0.844727f, 0.076172f, - 0.837402f, 0.072693f, 0.831055f, 0.069092f, 0.824219f, 0.065491f, 0.817871f, 0.061981f, - 0.811035f, 0.058472f, 0.804688f, 0.055023f, 0.797852f, 0.051697f, 0.791992f, 0.048492f, - 0.785645f, 0.045410f, 0.778809f, 0.042480f, 0.771973f, 0.039673f, 0.765625f, 0.037018f, - 0.758789f, 0.034515f, 0.750977f, 0.032166f, 0.743652f, 0.029968f, 0.735840f, 0.027878f, - 0.727539f, 0.025940f, 0.718750f, 0.024124f, 0.709961f, 0.022430f, 0.700684f, 0.020844f, - 0.690918f, 0.019363f, 0.680664f, 0.017975f, 0.670410f, 0.016693f, 0.659180f, 0.015495f, - 0.647949f, 0.014389f, 0.636230f, 0.013359f, 0.624512f, 0.012398f, 0.611816f, 0.011505f, - 0.599609f, 0.010681f, 0.586426f, 0.009911f, 0.573730f, 0.009201f, 0.560547f, 0.008537f, - 0.546875f, 0.007927f, 0.533203f, 0.007355f, 0.519531f, 0.006828f, 0.505859f, 0.006340f, - 0.492432f, 0.005890f, 0.478516f, 0.005470f, 0.464844f, 0.005077f, 0.450928f, 0.004719f, - 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f, 0.885254f, 0.114624f, - 0.884766f, 0.114624f, 0.884766f, 0.114563f, 0.884766f, 0.114502f, 0.884277f, 0.114380f, - 0.883789f, 0.114258f, 0.883301f, 0.114014f, 0.882324f, 0.113525f, 0.881348f, 0.112976f, - 0.879395f, 0.112183f, 0.877441f, 0.111145f, 0.875977f, 0.109802f, 0.872559f, 0.108215f, - 0.869141f, 0.106201f, 0.865723f, 0.103821f, 0.860352f, 0.101196f, 0.854492f, 0.098145f, - 0.850586f, 0.094849f, 0.845215f, 0.091187f, 0.838379f, 0.087463f, 0.833496f, 0.083496f, - 0.826660f, 0.079468f, 0.820801f, 0.075378f, 0.814453f, 0.071289f, 0.809082f, 0.067322f, - 0.803711f, 0.063354f, 0.797363f, 0.059540f, 0.791992f, 0.055878f, 0.786133f, 0.052338f, - 0.780762f, 0.048950f, 0.774414f, 0.045746f, 0.768555f, 0.042664f, 0.762207f, 0.039795f, - 0.755859f, 0.037079f, 0.749023f, 0.034546f, 0.741699f, 0.032135f, 0.734863f, 0.029892f, - 0.727051f, 0.027802f, 0.718750f, 0.025833f, 0.710449f, 0.024002f, 0.701172f, 0.022293f, - 0.691895f, 0.020706f, 0.682129f, 0.019226f, 0.671875f, 0.017853f, 0.661133f, 0.016571f, - 0.650391f, 0.015381f, 0.639160f, 0.014282f, 0.626953f, 0.013252f, 0.615234f, 0.012299f, - 0.602539f, 0.011414f, 0.590332f, 0.010597f, 0.577148f, 0.009834f, 0.563965f, 0.009132f, - 0.550781f, 0.008476f, 0.537598f, 0.007866f, 0.523926f, 0.007309f, 0.510254f, 0.006786f, - 0.496826f, 0.006306f, 0.483154f, 0.005856f, 0.469482f, 0.005440f, 0.455811f, 0.005054f, - 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870605f, 0.129028f, - 0.870605f, 0.129028f, 0.870605f, 0.129028f, 0.870117f, 0.128906f, 0.870117f, 0.128784f, - 0.869629f, 0.128540f, 0.869141f, 0.128052f, 0.868164f, 0.127563f, 0.867188f, 0.126709f, - 0.865723f, 0.125732f, 0.863281f, 0.124329f, 0.862305f, 0.122742f, 0.858887f, 0.120544f, - 0.854980f, 0.118103f, 0.850098f, 0.115173f, 0.847168f, 0.111938f, 0.843750f, 0.108276f, - 0.836426f, 0.104309f, 0.832031f, 0.100159f, 0.827148f, 0.095764f, 0.821289f, 0.091187f, - 0.815918f, 0.086609f, 0.810547f, 0.081970f, 0.806152f, 0.077393f, 0.800781f, 0.072937f, - 0.795410f, 0.068542f, 0.790039f, 0.064270f, 0.785645f, 0.060242f, 0.780762f, 0.056335f, - 0.775391f, 0.052643f, 0.770020f, 0.049133f, 0.765137f, 0.045807f, 0.759766f, 0.042694f, - 0.753906f, 0.039734f, 0.747559f, 0.036987f, 0.740723f, 0.034393f, 0.733887f, 0.031982f, - 0.726562f, 0.029739f, 0.719238f, 0.027618f, 0.710449f, 0.025650f, 0.702148f, 0.023834f, - 0.692871f, 0.022125f, 0.683594f, 0.020538f, 0.673828f, 0.019058f, 0.663574f, 0.017685f, - 0.652832f, 0.016418f, 0.641602f, 0.015244f, 0.629883f, 0.014153f, 0.618164f, 0.013138f, - 0.605957f, 0.012192f, 0.593750f, 0.011314f, 0.581055f, 0.010506f, 0.567871f, 0.009750f, - 0.555176f, 0.009056f, 0.541504f, 0.008408f, 0.528320f, 0.007809f, 0.514648f, 0.007252f, - 0.501465f, 0.006741f, 0.487793f, 0.006260f, 0.474365f, 0.005817f, 0.460938f, 0.005409f, - 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f, 0.854492f, 0.145020f, - 0.854492f, 0.144897f, 0.854492f, 0.144897f, 0.854004f, 0.144653f, 0.854492f, 0.144531f, - 0.854004f, 0.144165f, 0.853027f, 0.143555f, 0.852051f, 0.142822f, 0.851074f, 0.141724f, - 0.850586f, 0.140503f, 0.848145f, 0.138672f, 0.846191f, 0.136475f, 0.843262f, 0.133911f, - 0.839844f, 0.130859f, 0.835449f, 0.127319f, 0.832031f, 0.123474f, 0.828613f, 0.119141f, - 0.823242f, 0.114502f, 0.819824f, 0.109558f, 0.813477f, 0.104431f, 0.809570f, 0.099304f, - 0.804199f, 0.094055f, 0.799316f, 0.088867f, 0.794922f, 0.083740f, 0.791992f, 0.078735f, - 0.786621f, 0.073914f, 0.783203f, 0.069214f, 0.779297f, 0.064758f, 0.774902f, 0.060516f, - 0.770508f, 0.056488f, 0.765625f, 0.052673f, 0.761230f, 0.049072f, 0.756348f, 0.045715f, - 0.750977f, 0.042511f, 0.745605f, 0.039551f, 0.739746f, 0.036774f, 0.733398f, 0.034180f, - 0.726562f, 0.031738f, 0.719238f, 0.029495f, 0.711426f, 0.027390f, 0.703125f, 0.025421f, - 0.694336f, 0.023605f, 0.685059f, 0.021912f, 0.675781f, 0.020340f, 0.665527f, 0.018875f, - 0.655273f, 0.017517f, 0.644043f, 0.016251f, 0.632812f, 0.015091f, 0.621582f, 0.014008f, - 0.609375f, 0.013000f, 0.597168f, 0.012070f, 0.584473f, 0.011200f, 0.571777f, 0.010406f, - 0.559082f, 0.009659f, 0.545898f, 0.008972f, 0.532715f, 0.008339f, 0.519531f, 0.007748f, - 0.505859f, 0.007198f, 0.492676f, 0.006691f, 0.479248f, 0.006218f, 0.465820f, 0.005783f, - 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162476f, 0.837402f, 0.162354f, - 0.837402f, 0.162354f, 0.836914f, 0.162231f, 0.836914f, 0.161987f, 0.836426f, 0.161743f, - 0.836426f, 0.161133f, 0.835449f, 0.160522f, 0.835449f, 0.159546f, 0.834473f, 0.158203f, - 0.833496f, 0.156372f, 0.831055f, 0.154175f, 0.830078f, 0.151489f, 0.826660f, 0.148315f, - 0.823242f, 0.144531f, 0.821289f, 0.140381f, 0.817383f, 0.135620f, 0.812012f, 0.130615f, - 0.810547f, 0.125122f, 0.805176f, 0.119507f, 0.800293f, 0.113647f, 0.797852f, 0.107788f, - 0.792480f, 0.101868f, 0.788574f, 0.096008f, 0.785156f, 0.090332f, 0.782715f, 0.084839f, - 0.779297f, 0.079468f, 0.774902f, 0.074341f, 0.772461f, 0.069458f, 0.769531f, 0.064819f, - 0.765137f, 0.060486f, 0.761719f, 0.056366f, 0.758301f, 0.052490f, 0.753418f, 0.048828f, - 0.749023f, 0.045410f, 0.743652f, 0.042206f, 0.738770f, 0.039215f, 0.732422f, 0.036438f, - 0.726074f, 0.033844f, 0.719238f, 0.031433f, 0.711914f, 0.029190f, 0.704102f, 0.027100f, - 0.695801f, 0.025146f, 0.687012f, 0.023346f, 0.677734f, 0.021667f, 0.667969f, 0.020111f, - 0.657715f, 0.018646f, 0.646973f, 0.017319f, 0.636230f, 0.016068f, 0.624512f, 0.014923f, - 0.612793f, 0.013855f, 0.601074f, 0.012863f, 0.588379f, 0.011948f, 0.576172f, 0.011093f, - 0.563477f, 0.010300f, 0.550293f, 0.009567f, 0.537109f, 0.008896f, 0.523926f, 0.008263f, - 0.510742f, 0.007687f, 0.497559f, 0.007145f, 0.484375f, 0.006645f, 0.470947f, 0.006180f, - 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.818359f, 0.181519f, 0.817871f, 0.181519f, - 0.817871f, 0.181396f, 0.817871f, 0.181274f, 0.817871f, 0.181030f, 0.817871f, 0.180542f, - 0.817871f, 0.179932f, 0.817383f, 0.178955f, 0.816406f, 0.177612f, 0.815918f, 0.175903f, - 0.814941f, 0.173584f, 0.812500f, 0.170898f, 0.811035f, 0.167603f, 0.808594f, 0.163696f, - 0.805664f, 0.159180f, 0.802246f, 0.154175f, 0.799805f, 0.148560f, 0.796875f, 0.142700f, - 0.792480f, 0.136353f, 0.789551f, 0.129883f, 0.787598f, 0.123230f, 0.782227f, 0.116577f, - 0.780273f, 0.109985f, 0.777344f, 0.103516f, 0.774414f, 0.097168f, 0.771973f, 0.091125f, - 0.770508f, 0.085205f, 0.767578f, 0.079651f, 0.765625f, 0.074341f, 0.763184f, 0.069336f, - 0.760254f, 0.064636f, 0.757812f, 0.060181f, 0.754395f, 0.056000f, 0.750977f, 0.052063f, - 0.747559f, 0.048431f, 0.742188f, 0.044983f, 0.737793f, 0.041779f, 0.732422f, 0.038818f, - 0.726074f, 0.036041f, 0.719727f, 0.033447f, 0.712891f, 0.031052f, 0.705566f, 0.028824f, - 0.697266f, 0.026749f, 0.688965f, 0.024826f, 0.679688f, 0.023041f, 0.670410f, 0.021393f, - 0.660645f, 0.019852f, 0.649902f, 0.018433f, 0.639160f, 0.017105f, 0.627930f, 0.015869f, - 0.616211f, 0.014748f, 0.604492f, 0.013687f, 0.592773f, 0.012718f, 0.580078f, 0.011818f, - 0.567871f, 0.010979f, 0.554688f, 0.010201f, 0.541992f, 0.009483f, 0.528809f, 0.008812f, - 0.515625f, 0.008194f, 0.502441f, 0.007626f, 0.489502f, 0.007088f, 0.476318f, 0.006599f, - 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f, 0.797363f, 0.202393f, - 0.797363f, 0.202148f, 0.797363f, 0.202026f, 0.797363f, 0.201660f, 0.797363f, 0.201050f, - 0.796875f, 0.200195f, 0.796875f, 0.198975f, 0.796387f, 0.197266f, 0.795898f, 0.195068f, - 0.794922f, 0.192261f, 0.792969f, 0.188843f, 0.792480f, 0.184937f, 0.789551f, 0.180298f, - 0.787598f, 0.174927f, 0.785645f, 0.168823f, 0.782715f, 0.162231f, 0.779297f, 0.155273f, - 0.775879f, 0.148071f, 0.775391f, 0.140747f, 0.772461f, 0.133179f, 0.770508f, 0.125732f, - 0.767578f, 0.118347f, 0.766113f, 0.111206f, 0.764648f, 0.104248f, 0.763184f, 0.097595f, - 0.762695f, 0.091187f, 0.761719f, 0.085144f, 0.759277f, 0.079407f, 0.758301f, 0.073975f, - 0.755859f, 0.068909f, 0.754395f, 0.064087f, 0.751465f, 0.059631f, 0.748535f, 0.055450f, - 0.745117f, 0.051514f, 0.741211f, 0.047852f, 0.737305f, 0.044434f, 0.731934f, 0.041260f, - 0.726562f, 0.038300f, 0.720215f, 0.035553f, 0.713867f, 0.032990f, 0.706543f, 0.030624f, - 0.699219f, 0.028427f, 0.690918f, 0.026382f, 0.682129f, 0.024475f, 0.672852f, 0.022720f, - 0.663086f, 0.021088f, 0.652832f, 0.019577f, 0.642578f, 0.018173f, 0.631348f, 0.016876f, - 0.620117f, 0.015671f, 0.608398f, 0.014565f, 0.596680f, 0.013535f, 0.584473f, 0.012573f, - 0.572266f, 0.011681f, 0.559570f, 0.010857f, 0.546875f, 0.010101f, 0.533691f, 0.009392f, - 0.520996f, 0.008736f, 0.507812f, 0.008125f, 0.494629f, 0.007565f, 0.481689f, 0.007042f, - 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f, 0.774414f, 0.225098f, - 0.774414f, 0.224854f, 0.774902f, 0.224609f, 0.774414f, 0.224121f, 0.774414f, 0.223389f, - 0.774414f, 0.222290f, 0.773926f, 0.220581f, 0.773926f, 0.218628f, 0.773926f, 0.215942f, - 0.773438f, 0.212524f, 0.772461f, 0.208374f, 0.771484f, 0.203491f, 0.770508f, 0.197754f, - 0.769043f, 0.191284f, 0.766113f, 0.184204f, 0.763672f, 0.176514f, 0.760742f, 0.168457f, - 0.760742f, 0.160278f, 0.757812f, 0.151855f, 0.757812f, 0.143433f, 0.756836f, 0.135132f, - 0.754395f, 0.126953f, 0.755371f, 0.119141f, 0.755371f, 0.111511f, 0.754395f, 0.104309f, - 0.753418f, 0.097351f, 0.754395f, 0.090820f, 0.753906f, 0.084595f, 0.752441f, 0.078796f, - 0.751465f, 0.073303f, 0.750000f, 0.068176f, 0.748535f, 0.063354f, 0.746094f, 0.058899f, - 0.743164f, 0.054718f, 0.740234f, 0.050812f, 0.736816f, 0.047150f, 0.731934f, 0.043793f, - 0.727051f, 0.040649f, 0.721191f, 0.037720f, 0.714844f, 0.035004f, 0.708008f, 0.032501f, - 0.700684f, 0.030167f, 0.692871f, 0.027985f, 0.684570f, 0.025986f, 0.675781f, 0.024124f, - 0.666016f, 0.022385f, 0.656250f, 0.020782f, 0.645996f, 0.019302f, 0.635254f, 0.017929f, - 0.624023f, 0.016647f, 0.612793f, 0.015480f, 0.601074f, 0.014381f, 0.588867f, 0.013367f, - 0.576660f, 0.012428f, 0.563965f, 0.011559f, 0.551270f, 0.010750f, 0.539062f, 0.010002f, - 0.525879f, 0.009308f, 0.513184f, 0.008659f, 0.500000f, 0.008064f, 0.487061f, 0.007511f, - 0.750000f, 0.249878f, 0.749512f, 0.249878f, 0.750000f, 0.249878f, 0.750000f, 0.249756f, - 0.750000f, 0.249512f, 0.750000f, 0.249146f, 0.750000f, 0.248413f, 0.750488f, 0.247559f, - 0.750488f, 0.246094f, 0.750488f, 0.244141f, 0.750488f, 0.241577f, 0.750488f, 0.238281f, - 0.748535f, 0.234009f, 0.749512f, 0.229004f, 0.749023f, 0.223022f, 0.747070f, 0.216309f, - 0.745117f, 0.208496f, 0.743164f, 0.200195f, 0.744629f, 0.191406f, 0.741211f, 0.182251f, - 0.741699f, 0.172852f, 0.740234f, 0.163330f, 0.742676f, 0.154053f, 0.741211f, 0.144775f, - 0.743652f, 0.135864f, 0.744629f, 0.127197f, 0.743164f, 0.118958f, 0.744629f, 0.111145f, - 0.745605f, 0.103638f, 0.746582f, 0.096558f, 0.748047f, 0.089966f, 0.747559f, 0.083679f, - 0.747559f, 0.077820f, 0.746582f, 0.072327f, 0.745605f, 0.067261f, 0.744629f, 0.062469f, - 0.742676f, 0.058014f, 0.739746f, 0.053864f, 0.735840f, 0.049988f, 0.731934f, 0.046417f, - 0.727539f, 0.043091f, 0.722168f, 0.039978f, 0.716309f, 0.037079f, 0.709473f, 0.034424f, - 0.702637f, 0.031952f, 0.695312f, 0.029663f, 0.687012f, 0.027542f, 0.678223f, 0.025558f, - 0.668945f, 0.023743f, 0.659180f, 0.022049f, 0.649414f, 0.020477f, 0.638672f, 0.019028f, - 0.627930f, 0.017670f, 0.616699f, 0.016434f, 0.604980f, 0.015274f, 0.593262f, 0.014198f, - 0.581055f, 0.013206f, 0.568848f, 0.012283f, 0.556641f, 0.011429f, 0.543945f, 0.010643f, - 0.531250f, 0.009903f, 0.518066f, 0.009224f, 0.505371f, 0.008591f, 0.492676f, 0.008003f, - 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f, 0.723145f, 0.276611f, - 0.723145f, 0.276123f, 0.723145f, 0.275635f, 0.723145f, 0.274902f, 0.723633f, 0.273682f, - 0.723633f, 0.271973f, 0.724121f, 0.269531f, 0.724609f, 0.266113f, 0.725098f, 0.262207f, - 0.725098f, 0.257080f, 0.724609f, 0.250732f, 0.722656f, 0.243652f, 0.725586f, 0.235474f, - 0.724121f, 0.226685f, 0.723145f, 0.216919f, 0.722656f, 0.206787f, 0.720703f, 0.196289f, - 0.723145f, 0.185791f, 0.723633f, 0.175171f, 0.724121f, 0.164795f, 0.728027f, 0.154663f, - 0.730469f, 0.144897f, 0.731934f, 0.135498f, 0.734863f, 0.126587f, 0.737305f, 0.118103f, - 0.739258f, 0.110107f, 0.739746f, 0.102478f, 0.741699f, 0.095398f, 0.743164f, 0.088745f, - 0.743652f, 0.082520f, 0.743652f, 0.076660f, 0.743652f, 0.071228f, 0.742676f, 0.066101f, - 0.741211f, 0.061401f, 0.739258f, 0.057007f, 0.735840f, 0.052887f, 0.732422f, 0.049103f, - 0.728516f, 0.045563f, 0.723145f, 0.042297f, 0.717773f, 0.039246f, 0.711914f, 0.036438f, - 0.704590f, 0.033813f, 0.697754f, 0.031403f, 0.689453f, 0.029160f, 0.681152f, 0.027069f, - 0.671875f, 0.025146f, 0.662598f, 0.023346f, 0.652832f, 0.021698f, 0.642578f, 0.020157f, - 0.631836f, 0.018738f, 0.621094f, 0.017426f, 0.609375f, 0.016205f, 0.597656f, 0.015076f, - 0.585938f, 0.014023f, 0.573730f, 0.013054f, 0.561523f, 0.012146f, 0.548828f, 0.011314f, - 0.536621f, 0.010536f, 0.523926f, 0.009811f, 0.511230f, 0.009148f, 0.498291f, 0.008530f, - 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f, 0.693848f, 0.305664f, - 0.693848f, 0.305176f, 0.694336f, 0.304443f, 0.694824f, 0.303467f, 0.695312f, 0.302002f, - 0.695312f, 0.299561f, 0.696289f, 0.296631f, 0.696777f, 0.292725f, 0.696777f, 0.287598f, - 0.697754f, 0.281250f, 0.698242f, 0.273926f, 0.698730f, 0.265137f, 0.697266f, 0.255615f, - 0.699707f, 0.245239f, 0.699707f, 0.234131f, 0.700195f, 0.222412f, 0.702637f, 0.210693f, - 0.705078f, 0.198853f, 0.708496f, 0.187134f, 0.708984f, 0.175781f, 0.715332f, 0.164673f, - 0.718750f, 0.154053f, 0.722168f, 0.143921f, 0.724121f, 0.134277f, 0.727539f, 0.125244f, - 0.731934f, 0.116638f, 0.733398f, 0.108582f, 0.736816f, 0.101013f, 0.738281f, 0.093872f, - 0.740234f, 0.087219f, 0.741699f, 0.081055f, 0.741211f, 0.075256f, 0.741211f, 0.069885f, - 0.740723f, 0.064880f, 0.738281f, 0.060211f, 0.736328f, 0.055908f, 0.732910f, 0.051849f, - 0.729004f, 0.048157f, 0.724609f, 0.044678f, 0.719727f, 0.041473f, 0.713379f, 0.038483f, - 0.707031f, 0.035736f, 0.699707f, 0.033173f, 0.692383f, 0.030823f, 0.684082f, 0.028625f, - 0.675293f, 0.026596f, 0.666016f, 0.024704f, 0.656738f, 0.022964f, 0.646484f, 0.021347f, - 0.636230f, 0.019852f, 0.625488f, 0.018463f, 0.614258f, 0.017181f, 0.602539f, 0.015976f, - 0.590820f, 0.014877f, 0.578613f, 0.013855f, 0.566895f, 0.012901f, 0.554688f, 0.012024f, - 0.541992f, 0.011200f, 0.529297f, 0.010437f, 0.516602f, 0.009735f, 0.503906f, 0.009079f, - 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.337158f, 0.662598f, 0.336914f, - 0.662598f, 0.336670f, 0.663086f, 0.335938f, 0.663086f, 0.334473f, 0.664062f, 0.332520f, - 0.665039f, 0.329834f, 0.666016f, 0.325928f, 0.665527f, 0.320801f, 0.667969f, 0.314697f, - 0.667480f, 0.306885f, 0.669922f, 0.298096f, 0.669434f, 0.287842f, 0.671387f, 0.276367f, - 0.675781f, 0.264404f, 0.675781f, 0.251465f, 0.677734f, 0.238403f, 0.681152f, 0.225342f, - 0.686035f, 0.212036f, 0.690430f, 0.199219f, 0.694824f, 0.186768f, 0.700684f, 0.174805f, - 0.702637f, 0.163330f, 0.708008f, 0.152466f, 0.714844f, 0.142212f, 0.718750f, 0.132446f, - 0.724609f, 0.123291f, 0.728516f, 0.114685f, 0.731445f, 0.106628f, 0.734375f, 0.099121f, - 0.736816f, 0.092102f, 0.738770f, 0.085510f, 0.740723f, 0.079407f, 0.740234f, 0.073730f, - 0.739258f, 0.068420f, 0.738770f, 0.063538f, 0.736328f, 0.058960f, 0.734375f, 0.054718f, - 0.730469f, 0.050781f, 0.726562f, 0.047150f, 0.721191f, 0.043762f, 0.715332f, 0.040619f, - 0.709473f, 0.037720f, 0.702637f, 0.035034f, 0.695312f, 0.032532f, 0.687500f, 0.030243f, - 0.678711f, 0.028107f, 0.669922f, 0.026123f, 0.660645f, 0.024277f, 0.650391f, 0.022583f, - 0.640137f, 0.021011f, 0.629395f, 0.019547f, 0.618652f, 0.018188f, 0.607422f, 0.016937f, - 0.595703f, 0.015778f, 0.583984f, 0.014694f, 0.572266f, 0.013695f, 0.560059f, 0.012764f, - 0.547852f, 0.011902f, 0.535156f, 0.011101f, 0.522461f, 0.010353f, 0.510254f, 0.009666f, - 0.628418f, 0.371338f, 0.628418f, 0.371338f, 0.628418f, 0.371094f, 0.628418f, 0.371094f, - 0.628418f, 0.370361f, 0.629395f, 0.369385f, 0.629883f, 0.367920f, 0.630859f, 0.365234f, - 0.631836f, 0.361816f, 0.633301f, 0.357178f, 0.634766f, 0.350830f, 0.635742f, 0.343262f, - 0.638184f, 0.333984f, 0.640137f, 0.322998f, 0.641113f, 0.311035f, 0.645508f, 0.297852f, - 0.647949f, 0.283691f, 0.652344f, 0.269043f, 0.657227f, 0.254395f, 0.662598f, 0.239868f, - 0.669922f, 0.225464f, 0.673340f, 0.211426f, 0.680664f, 0.197876f, 0.685547f, 0.184937f, - 0.693359f, 0.172729f, 0.700684f, 0.161011f, 0.705566f, 0.150146f, 0.711426f, 0.139771f, - 0.718750f, 0.130005f, 0.722168f, 0.120911f, 0.727051f, 0.112427f, 0.732422f, 0.104431f, - 0.733887f, 0.097046f, 0.737305f, 0.090088f, 0.738770f, 0.083618f, 0.740234f, 0.077637f, - 0.739258f, 0.072083f, 0.738281f, 0.066895f, 0.736816f, 0.062073f, 0.734375f, 0.057648f, - 0.731934f, 0.053497f, 0.728027f, 0.049683f, 0.723145f, 0.046112f, 0.717773f, 0.042816f, - 0.712402f, 0.039764f, 0.705566f, 0.036957f, 0.698242f, 0.034332f, 0.690430f, 0.031891f, - 0.682617f, 0.029663f, 0.673340f, 0.027573f, 0.664551f, 0.025650f, 0.654785f, 0.023865f, - 0.644531f, 0.022202f, 0.634277f, 0.020676f, 0.623535f, 0.019257f, 0.612305f, 0.017929f, - 0.601074f, 0.016708f, 0.589355f, 0.015579f, 0.577637f, 0.014526f, 0.565430f, 0.013550f, - 0.553223f, 0.012642f, 0.541016f, 0.011787f, 0.528809f, 0.011009f, 0.516113f, 0.010277f, - 0.591309f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407959f, 0.591797f, 0.407471f, - 0.592285f, 0.406982f, 0.592773f, 0.405762f, 0.593750f, 0.403564f, 0.594727f, 0.400391f, - 0.596680f, 0.396240f, 0.598145f, 0.390137f, 0.600098f, 0.382568f, 0.602539f, 0.373047f, - 0.604980f, 0.361816f, 0.606934f, 0.348877f, 0.611816f, 0.334473f, 0.616699f, 0.319336f, - 0.620605f, 0.302979f, 0.627930f, 0.286865f, 0.634277f, 0.270508f, 0.638672f, 0.254150f, - 0.647949f, 0.238525f, 0.654297f, 0.223389f, 0.663086f, 0.208862f, 0.673828f, 0.195068f, - 0.680176f, 0.182007f, 0.689941f, 0.169678f, 0.696289f, 0.157959f, 0.705078f, 0.147095f, - 0.713867f, 0.136841f, 0.719727f, 0.127197f, 0.724121f, 0.118225f, 0.729980f, 0.109863f, - 0.731934f, 0.101990f, 0.735840f, 0.094727f, 0.737305f, 0.087952f, 0.738770f, 0.081604f, - 0.740234f, 0.075745f, 0.739258f, 0.070312f, 0.738281f, 0.065247f, 0.735840f, 0.060608f, - 0.733398f, 0.056274f, 0.729492f, 0.052246f, 0.725098f, 0.048523f, 0.720703f, 0.045074f, - 0.714355f, 0.041870f, 0.708496f, 0.038910f, 0.701660f, 0.036163f, 0.693848f, 0.033630f, - 0.686035f, 0.031281f, 0.677734f, 0.029099f, 0.668457f, 0.027069f, 0.659180f, 0.025192f, - 0.648926f, 0.023453f, 0.639160f, 0.021851f, 0.628418f, 0.020355f, 0.617676f, 0.018967f, - 0.605957f, 0.017685f, 0.594727f, 0.016495f, 0.583008f, 0.015388f, 0.571289f, 0.014366f, - 0.559570f, 0.013412f, 0.546875f, 0.012520f, 0.534668f, 0.011696f, 0.522461f, 0.010925f, - 0.551758f, 0.447754f, 0.551758f, 0.447754f, 0.552246f, 0.447510f, 0.552246f, 0.447266f, - 0.552734f, 0.446289f, 0.553223f, 0.444580f, 0.555176f, 0.441895f, 0.556152f, 0.438232f, - 0.558594f, 0.432617f, 0.561035f, 0.425049f, 0.563477f, 0.415527f, 0.566406f, 0.404053f, - 0.570312f, 0.390381f, 0.575195f, 0.375000f, 0.578613f, 0.358154f, 0.584473f, 0.340332f, - 0.593750f, 0.322266f, 0.600098f, 0.303955f, 0.611328f, 0.286133f, 0.617676f, 0.268555f, - 0.629395f, 0.251709f, 0.640625f, 0.235352f, 0.649902f, 0.219849f, 0.661621f, 0.205078f, - 0.671387f, 0.191284f, 0.678711f, 0.178223f, 0.688965f, 0.166016f, 0.699707f, 0.154419f, - 0.707031f, 0.143555f, 0.714844f, 0.133545f, 0.719727f, 0.124084f, 0.726074f, 0.115295f, - 0.731445f, 0.107056f, 0.734863f, 0.099365f, 0.737305f, 0.092285f, 0.739258f, 0.085632f, - 0.740234f, 0.079529f, 0.739746f, 0.073792f, 0.739258f, 0.068542f, 0.737793f, 0.063599f, - 0.734863f, 0.059082f, 0.731934f, 0.054871f, 0.727539f, 0.050964f, 0.723633f, 0.047394f, - 0.717773f, 0.044006f, 0.711426f, 0.040924f, 0.705078f, 0.038055f, 0.697754f, 0.035400f, - 0.689941f, 0.032928f, 0.681641f, 0.030655f, 0.672852f, 0.028534f, 0.663574f, 0.026581f, - 0.653809f, 0.024750f, 0.644043f, 0.023071f, 0.633301f, 0.021515f, 0.622559f, 0.020050f, - 0.611328f, 0.018707f, 0.600098f, 0.017456f, 0.588867f, 0.016296f, 0.577148f, 0.015221f, - 0.565430f, 0.014221f, 0.553223f, 0.013290f, 0.541504f, 0.012421f, 0.528809f, 0.011620f, - 0.509277f, 0.490234f, 0.509277f, 0.490234f, 0.509277f, 0.489990f, 0.509766f, 0.489502f, - 0.510254f, 0.488525f, 0.511230f, 0.486328f, 0.512695f, 0.482910f, 0.514160f, 0.478027f, - 0.517578f, 0.470947f, 0.520996f, 0.461670f, 0.523926f, 0.449707f, 0.528809f, 0.435303f, - 0.534180f, 0.418945f, 0.540527f, 0.400635f, 0.548340f, 0.381348f, 0.554688f, 0.361328f, - 0.566895f, 0.340820f, 0.577637f, 0.320801f, 0.588867f, 0.301270f, 0.601074f, 0.282471f, - 0.610352f, 0.264404f, 0.624023f, 0.247070f, 0.637207f, 0.230591f, 0.649414f, 0.215210f, - 0.662109f, 0.200562f, 0.672852f, 0.186768f, 0.685547f, 0.173828f, 0.693359f, 0.161743f, - 0.702148f, 0.150391f, 0.711426f, 0.139771f, 0.720703f, 0.129883f, 0.726074f, 0.120667f, - 0.730469f, 0.112061f, 0.733887f, 0.104065f, 0.738281f, 0.096619f, 0.739258f, 0.089722f, - 0.740234f, 0.083252f, 0.741699f, 0.077332f, 0.740723f, 0.071777f, 0.739258f, 0.066711f, - 0.736816f, 0.061951f, 0.734375f, 0.057556f, 0.730469f, 0.053497f, 0.726074f, 0.049713f, - 0.720703f, 0.046234f, 0.714844f, 0.042999f, 0.708496f, 0.039978f, 0.701172f, 0.037231f, - 0.693848f, 0.034637f, 0.685547f, 0.032257f, 0.677246f, 0.030060f, 0.667969f, 0.028000f, - 0.658691f, 0.026108f, 0.648926f, 0.024338f, 0.638672f, 0.022705f, 0.627930f, 0.021194f, - 0.617188f, 0.019775f, 0.605957f, 0.018463f, 0.594727f, 0.017258f, 0.583008f, 0.016129f, - 0.571289f, 0.015076f, 0.559570f, 0.014099f, 0.547852f, 0.013191f, 0.535645f, 0.012337f, - 0.463623f, 0.536133f, 0.463623f, 0.536133f, 0.463867f, 0.535645f, 0.464111f, 0.535156f, - 0.465088f, 0.533691f, 0.466064f, 0.530762f, 0.468506f, 0.526367f, 0.471191f, 0.520020f, - 0.474609f, 0.511230f, 0.478516f, 0.499268f, 0.483643f, 0.484375f, 0.489990f, 0.466797f, - 0.495361f, 0.447266f, 0.502441f, 0.425537f, 0.515137f, 0.403564f, 0.526855f, 0.380859f, - 0.540039f, 0.358887f, 0.553711f, 0.336914f, 0.564453f, 0.315918f, 0.587891f, 0.295898f, - 0.600098f, 0.276611f, 0.610840f, 0.258545f, 0.624512f, 0.241211f, 0.641113f, 0.225098f, - 0.657715f, 0.209717f, 0.668457f, 0.195312f, 0.678223f, 0.181763f, 0.687988f, 0.169067f, - 0.701172f, 0.157104f, 0.707031f, 0.146118f, 0.715332f, 0.135620f, 0.723145f, 0.125977f, - 0.728516f, 0.117126f, 0.734375f, 0.108704f, 0.736328f, 0.100952f, 0.739746f, 0.093750f, - 0.741699f, 0.087036f, 0.742188f, 0.080872f, 0.741699f, 0.075134f, 0.741211f, 0.069763f, - 0.739258f, 0.064819f, 0.736816f, 0.060272f, 0.733398f, 0.056030f, 0.729004f, 0.052124f, - 0.724121f, 0.048492f, 0.718750f, 0.045105f, 0.712402f, 0.041992f, 0.705078f, 0.039093f, - 0.698242f, 0.036407f, 0.689941f, 0.033905f, 0.681641f, 0.031616f, 0.672852f, 0.029480f, - 0.663574f, 0.027512f, 0.653809f, 0.025665f, 0.644043f, 0.023956f, 0.633301f, 0.022369f, - 0.622559f, 0.020889f, 0.611816f, 0.019516f, 0.601074f, 0.018250f, 0.589355f, 0.017059f, - 0.578125f, 0.015961f, 0.565918f, 0.014946f, 0.554199f, 0.013992f, 0.542480f, 0.013107f, - 0.414551f, 0.584961f, 0.414551f, 0.584961f, 0.414795f, 0.584961f, 0.415039f, 0.583984f, - 0.416260f, 0.582031f, 0.418457f, 0.578613f, 0.420166f, 0.572754f, 0.424072f, 0.563965f, - 0.428467f, 0.552246f, 0.433838f, 0.537109f, 0.441162f, 0.518066f, 0.448730f, 0.497070f, - 0.458984f, 0.473633f, 0.467773f, 0.449219f, 0.480713f, 0.424072f, 0.497559f, 0.399414f, - 0.511719f, 0.375244f, 0.529297f, 0.352051f, 0.543945f, 0.329834f, 0.566895f, 0.308838f, - 0.581543f, 0.288574f, 0.598633f, 0.269531f, 0.619629f, 0.251465f, 0.635742f, 0.234497f, - 0.646973f, 0.218506f, 0.659668f, 0.203369f, 0.674805f, 0.189331f, 0.684570f, 0.176025f, - 0.695801f, 0.163696f, 0.707031f, 0.152222f, 0.718750f, 0.141357f, 0.723145f, 0.131348f, - 0.729004f, 0.122009f, 0.734375f, 0.113342f, 0.738281f, 0.105286f, 0.741211f, 0.097778f, - 0.743164f, 0.090820f, 0.744629f, 0.084412f, 0.744629f, 0.078430f, 0.743652f, 0.072876f, - 0.742676f, 0.067749f, 0.739746f, 0.062988f, 0.735840f, 0.058624f, 0.731934f, 0.054535f, - 0.727539f, 0.050751f, 0.721680f, 0.047241f, 0.715820f, 0.044006f, 0.709473f, 0.040985f, - 0.702148f, 0.038208f, 0.694824f, 0.035614f, 0.686523f, 0.033234f, 0.677734f, 0.031006f, - 0.668457f, 0.028946f, 0.659180f, 0.027023f, 0.649414f, 0.025238f, 0.639160f, 0.023590f, - 0.628906f, 0.022049f, 0.618164f, 0.020630f, 0.606934f, 0.019287f, 0.595703f, 0.018051f, - 0.584473f, 0.016907f, 0.572754f, 0.015839f, 0.561035f, 0.014839f, 0.549316f, 0.013908f, - 0.361816f, 0.637695f, 0.361816f, 0.637695f, 0.362061f, 0.637207f, 0.362793f, 0.636230f, - 0.364258f, 0.633301f, 0.366455f, 0.628906f, 0.369873f, 0.621094f, 0.374512f, 0.609375f, - 0.378906f, 0.593750f, 0.387451f, 0.573730f, 0.396484f, 0.550293f, 0.407471f, 0.524414f, - 0.419189f, 0.497314f, 0.433594f, 0.469971f, 0.453613f, 0.442627f, 0.473633f, 0.416016f, - 0.488037f, 0.390381f, 0.509277f, 0.365967f, 0.528809f, 0.343262f, 0.549805f, 0.320801f, - 0.574707f, 0.299805f, 0.590332f, 0.280029f, 0.609375f, 0.261475f, 0.631836f, 0.243774f, - 0.641602f, 0.227173f, 0.659668f, 0.211426f, 0.671387f, 0.196777f, 0.685059f, 0.183105f, - 0.698730f, 0.170166f, 0.705078f, 0.158203f, 0.715820f, 0.146973f, 0.723145f, 0.136597f, - 0.730469f, 0.126831f, 0.737793f, 0.117920f, 0.740723f, 0.109558f, 0.741699f, 0.101807f, - 0.745117f, 0.094604f, 0.747559f, 0.087891f, 0.747070f, 0.081726f, 0.747070f, 0.075989f, - 0.744141f, 0.070679f, 0.742676f, 0.065796f, 0.739258f, 0.061218f, 0.735840f, 0.056976f, - 0.730957f, 0.053070f, 0.725586f, 0.049438f, 0.719727f, 0.046082f, 0.713867f, 0.042938f, - 0.706543f, 0.040070f, 0.699219f, 0.037384f, 0.690918f, 0.034882f, 0.682617f, 0.032562f, - 0.673828f, 0.030426f, 0.664551f, 0.028442f, 0.654785f, 0.026581f, 0.645020f, 0.024857f, - 0.634766f, 0.023254f, 0.624023f, 0.021774f, 0.613281f, 0.020386f, 0.602051f, 0.019089f, - 0.590820f, 0.017899f, 0.579590f, 0.016769f, 0.567871f, 0.015732f, 0.556641f, 0.014755f, - 0.305420f, 0.694336f, 0.305420f, 0.694336f, 0.305664f, 0.693848f, 0.306641f, 0.691895f, - 0.308105f, 0.687988f, 0.311279f, 0.681152f, 0.316162f, 0.669922f, 0.321777f, 0.654297f, - 0.330078f, 0.632812f, 0.344238f, 0.606934f, 0.353027f, 0.578125f, 0.367432f, 0.547852f, - 0.385498f, 0.517578f, 0.405273f, 0.487793f, 0.422852f, 0.458496f, 0.448730f, 0.431152f, - 0.473633f, 0.404541f, 0.493896f, 0.379639f, 0.519531f, 0.355469f, 0.539551f, 0.332520f, - 0.563477f, 0.310791f, 0.583008f, 0.290283f, 0.604004f, 0.270752f, 0.626953f, 0.252686f, - 0.642090f, 0.235352f, 0.657715f, 0.218994f, 0.672852f, 0.203857f, 0.686523f, 0.189575f, - 0.699219f, 0.176270f, 0.707031f, 0.163818f, 0.717285f, 0.152344f, 0.723633f, 0.141602f, - 0.730469f, 0.131592f, 0.739258f, 0.122375f, 0.741699f, 0.113708f, 0.745605f, 0.105713f, - 0.747559f, 0.098267f, 0.748047f, 0.091370f, 0.749023f, 0.085022f, 0.748535f, 0.079102f, - 0.747070f, 0.073608f, 0.746582f, 0.068542f, 0.742188f, 0.063843f, 0.739258f, 0.059448f, - 0.734375f, 0.055420f, 0.730469f, 0.051666f, 0.724609f, 0.048187f, 0.717773f, 0.044952f, - 0.710938f, 0.041962f, 0.704102f, 0.039154f, 0.695801f, 0.036591f, 0.687988f, 0.034180f, - 0.679199f, 0.031952f, 0.670410f, 0.029892f, 0.660645f, 0.027969f, 0.650879f, 0.026184f, - 0.640625f, 0.024521f, 0.630371f, 0.022964f, 0.619629f, 0.021515f, 0.608887f, 0.020172f, - 0.598145f, 0.018921f, 0.586914f, 0.017761f, 0.575195f, 0.016663f, 0.563965f, 0.015656f, - 0.244995f, 0.754395f, 0.245117f, 0.754395f, 0.245483f, 0.753418f, 0.246704f, 0.750977f, - 0.249634f, 0.745117f, 0.253662f, 0.734863f, 0.260010f, 0.717773f, 0.268555f, 0.694336f, - 0.277344f, 0.665527f, 0.292480f, 0.632812f, 0.309814f, 0.599121f, 0.331787f, 0.565918f, - 0.352539f, 0.533203f, 0.376465f, 0.501953f, 0.405518f, 0.472412f, 0.433838f, 0.444336f, - 0.456787f, 0.417236f, 0.488281f, 0.391357f, 0.510254f, 0.366211f, 0.540039f, 0.343018f, - 0.564941f, 0.320557f, 0.579590f, 0.299561f, 0.606445f, 0.279541f, 0.627441f, 0.260498f, - 0.638184f, 0.242676f, 0.666504f, 0.226074f, 0.670898f, 0.210327f, 0.687988f, 0.195801f, - 0.700684f, 0.182129f, 0.706055f, 0.169312f, 0.718262f, 0.157471f, 0.727539f, 0.146362f, - 0.735840f, 0.136108f, 0.738770f, 0.126587f, 0.743164f, 0.117737f, 0.746582f, 0.109497f, - 0.751953f, 0.101868f, 0.751953f, 0.094788f, 0.753906f, 0.088257f, 0.752930f, 0.082153f, - 0.750977f, 0.076538f, 0.749512f, 0.071289f, 0.745605f, 0.066406f, 0.742188f, 0.061951f, - 0.738281f, 0.057770f, 0.734375f, 0.053894f, 0.729004f, 0.050293f, 0.722656f, 0.046967f, - 0.715332f, 0.043854f, 0.708496f, 0.040985f, 0.701172f, 0.038330f, 0.693359f, 0.035828f, - 0.684570f, 0.033539f, 0.676270f, 0.031403f, 0.666992f, 0.029404f, 0.657227f, 0.027542f, - 0.646973f, 0.025818f, 0.636719f, 0.024200f, 0.626465f, 0.022705f, 0.615723f, 0.021301f, - 0.604980f, 0.020004f, 0.593750f, 0.018784f, 0.582520f, 0.017654f, 0.571289f, 0.016586f, - 0.180542f, 0.818848f, 0.180664f, 0.818848f, 0.181274f, 0.817383f, 0.183350f, 0.812988f, - 0.187134f, 0.802734f, 0.193237f, 0.784180f, 0.201416f, 0.757324f, 0.214355f, 0.723145f, - 0.231445f, 0.685547f, 0.248901f, 0.648438f, 0.272217f, 0.611816f, 0.302979f, 0.577148f, - 0.329834f, 0.544922f, 0.364258f, 0.514160f, 0.394043f, 0.484619f, 0.425781f, 0.456055f, - 0.456543f, 0.428467f, 0.481934f, 0.402344f, 0.512207f, 0.376709f, 0.540039f, 0.352783f, - 0.566406f, 0.329346f, 0.579102f, 0.307617f, 0.607910f, 0.286865f, 0.627930f, 0.267822f, - 0.645996f, 0.249512f, 0.661621f, 0.232178f, 0.677734f, 0.216309f, 0.691406f, 0.201172f, - 0.702637f, 0.187256f, 0.711426f, 0.174194f, 0.721680f, 0.161987f, 0.730957f, 0.150879f, - 0.736328f, 0.140259f, 0.742188f, 0.130493f, 0.746582f, 0.121582f, 0.750488f, 0.113159f, - 0.751953f, 0.105347f, 0.752930f, 0.098083f, 0.756836f, 0.091370f, 0.755859f, 0.085144f, - 0.755371f, 0.079346f, 0.752441f, 0.073975f, 0.750488f, 0.069031f, 0.746582f, 0.064392f, - 0.743652f, 0.060120f, 0.737793f, 0.056152f, 0.733398f, 0.052460f, 0.727051f, 0.049011f, - 0.720215f, 0.045837f, 0.713867f, 0.042847f, 0.706543f, 0.040100f, 0.699219f, 0.037537f, - 0.690430f, 0.035156f, 0.682129f, 0.032928f, 0.672852f, 0.030884f, 0.663086f, 0.028961f, - 0.653809f, 0.027161f, 0.644043f, 0.025497f, 0.633301f, 0.023941f, 0.622559f, 0.022491f, - 0.612305f, 0.021133f, 0.601074f, 0.019867f, 0.590332f, 0.018692f, 0.579102f, 0.017578f, - 0.111816f, 0.888184f, 0.112000f, 0.887207f, 0.112976f, 0.883789f, 0.115845f, 0.873047f, - 0.122864f, 0.849609f, 0.133301f, 0.813477f, 0.147217f, 0.770996f, 0.167236f, 0.728027f, - 0.196411f, 0.688965f, 0.222290f, 0.653320f, 0.258057f, 0.619629f, 0.293457f, 0.587402f, - 0.328613f, 0.556152f, 0.361328f, 0.524902f, 0.392578f, 0.495850f, 0.430420f, 0.466064f, - 0.459961f, 0.437744f, 0.482422f, 0.410889f, 0.511230f, 0.385010f, 0.536621f, 0.359863f, - 0.568848f, 0.336182f, 0.592773f, 0.313721f, 0.614258f, 0.293213f, 0.626953f, 0.273193f, - 0.646484f, 0.254639f, 0.657227f, 0.237427f, 0.683105f, 0.221191f, 0.693359f, 0.205933f, - 0.698242f, 0.191772f, 0.709473f, 0.178589f, 0.724609f, 0.166260f, 0.733398f, 0.154907f, - 0.739746f, 0.144165f, 0.745605f, 0.134399f, 0.750977f, 0.125122f, 0.753906f, 0.116577f, - 0.754883f, 0.108704f, 0.758301f, 0.101257f, 0.759766f, 0.094482f, 0.757812f, 0.088074f, - 0.759766f, 0.082092f, 0.758301f, 0.076660f, 0.756348f, 0.071594f, 0.752441f, 0.066833f, - 0.748047f, 0.062469f, 0.741699f, 0.058380f, 0.736816f, 0.054596f, 0.732910f, 0.051086f, - 0.726074f, 0.047791f, 0.719727f, 0.044769f, 0.711914f, 0.041901f, 0.704590f, 0.039276f, - 0.696289f, 0.036804f, 0.688477f, 0.034546f, 0.678711f, 0.032410f, 0.669922f, 0.030411f, - 0.660156f, 0.028564f, 0.650391f, 0.026840f, 0.640625f, 0.025223f, 0.630371f, 0.023727f, - 0.619629f, 0.022324f, 0.608887f, 0.020996f, 0.597656f, 0.019775f, 0.586914f, 0.018631f, - 0.038452f, 0.960938f, 0.039124f, 0.957520f, 0.042480f, 0.933594f, 0.051575f, 0.879395f, - 0.069275f, 0.824219f, 0.091064f, 0.785156f, 0.126343f, 0.753906f, 0.154419f, 0.725586f, - 0.192139f, 0.695312f, 0.234375f, 0.663086f, 0.273438f, 0.630371f, 0.305908f, 0.597656f, - 0.338379f, 0.565430f, 0.379150f, 0.532227f, 0.413818f, 0.501465f, 0.444336f, 0.471191f, - 0.471436f, 0.442383f, 0.504395f, 0.414795f, 0.531250f, 0.388672f, 0.547363f, 0.364014f, - 0.579590f, 0.340088f, 0.603516f, 0.317627f, 0.622559f, 0.297119f, 0.635742f, 0.276855f, - 0.669434f, 0.258301f, 0.670410f, 0.241089f, 0.685547f, 0.224854f, 0.699219f, 0.209717f, - 0.712402f, 0.195190f, 0.720703f, 0.182373f, 0.729980f, 0.169678f, 0.746582f, 0.158325f, - 0.744629f, 0.147705f, 0.748535f, 0.137695f, 0.760254f, 0.128296f, 0.757812f, 0.119629f, - 0.761230f, 0.111755f, 0.762207f, 0.104248f, 0.764160f, 0.097290f, 0.763184f, 0.090881f, - 0.762207f, 0.084900f, 0.760742f, 0.079285f, 0.759766f, 0.074097f, 0.755859f, 0.069275f, - 0.752930f, 0.064758f, 0.747559f, 0.060669f, 0.742676f, 0.056793f, 0.737305f, 0.053131f, - 0.731445f, 0.049774f, 0.725586f, 0.046661f, 0.718262f, 0.043732f, 0.710449f, 0.041077f, - 0.702637f, 0.038544f, 0.694336f, 0.036163f, 0.685547f, 0.033966f, 0.676758f, 0.031921f, - 0.667480f, 0.030014f, 0.657715f, 0.028229f, 0.647461f, 0.026566f, 0.637207f, 0.025009f, - 0.626953f, 0.023544f, 0.616699f, 0.022186f, 0.605957f, 0.020920f, 0.594727f, 0.019730f, -}; - const float ltc_disk_integral[64 * 64] = { 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, @@ -4530,16456 +3503,6 @@ const float ltc_disk_integral[64 * 64] = { 0.888889f, 0.904762f, 0.920635f, 0.936508f, 0.952381f, 0.968254f, 0.984127f, 1.000000f, }; -const float btdf_split_sum_ggx[32][64 * 64] = { - { - 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.039917f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - }, - { - 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.004147f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.897949f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.996094f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002439f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000366f, 0.078308f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 1.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.001098f, 0.992188f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.005001f, 0.998535f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.902344f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002928f, - 0.997070f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000732f, 0.301758f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.002562f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.433594f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.004021f, 0.996582f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.949219f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000610f, - 0.012039f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.002073f, 0.993652f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000854f, 0.725586f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000610f, 0.011856f, 0.998047f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.002905f, 0.995117f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001098f, 0.978027f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, - 0.314941f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000731f, 0.017670f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000366f, 0.005852f, 0.997559f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.003050f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001957f, 0.993652f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.990234f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001220f, 0.986816f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.001220f, - 0.984375f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.001098f, 0.985352f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.001220f, 0.989258f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.001341f, 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.001586f, 0.996094f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.002802f, 0.997559f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000117f, 0.000122f, 0.000122f, 0.000243f, 0.006088f, 0.998535f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.026321f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000732f, 0.892578f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000975f, - 0.993652f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.002317f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.017944f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000731f, 0.983887f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, - 0.000122f, 0.000122f, 0.001653f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.026108f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000732f, 0.995605f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.003777f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000365f, 0.991211f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002195f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000364f, 0.993164f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.002672f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000360f, 0.998047f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.017075f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000731f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.997070f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.006874f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000480f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.996582f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000067f, 0.005440f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000365f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000121f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.995605f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f, - }, - { - 0.003168f, 0.995605f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000976f, 0.053314f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000732f, 0.003660f, 0.653809f, 0.995117f, 0.998047f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.001463f, 0.010452f, 0.947266f, 0.995605f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000853f, 0.002928f, 0.037750f, - 0.980957f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000610f, 0.001342f, - 0.006100f, 0.314453f, 0.989746f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.001091f, 0.002317f, 0.015839f, 0.910645f, 0.993652f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000366f, 0.000732f, 0.001463f, 0.005302f, 0.068909f, 0.977539f, 0.995605f, 0.998047f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000244f, 0.000732f, 0.001098f, 0.002560f, 0.011551f, 0.658691f, 0.989746f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000732f, 0.001585f, 0.004868f, 0.041077f, - 0.958984f, 0.994141f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000732f, 0.001215f, 0.002802f, - 0.010834f, 0.441895f, 0.987305f, 0.996094f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000488f, 0.000850f, - 0.001586f, 0.004753f, 0.039154f, 0.948242f, 0.993652f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, - 0.000732f, 0.001220f, 0.003159f, 0.012032f, 0.480713f, 0.985840f, 0.996094f, 0.998047f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000240f, 0.000731f, 0.001097f, 0.001950f, 0.005966f, 0.054413f, 0.957520f, 0.994141f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000486f, 0.000732f, 0.001534f, 0.003536f, 0.016937f, 0.726562f, - 0.988281f, 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f, 0.002192f, 0.008278f, - 0.125244f, 0.974121f, 0.994629f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.000947f, 0.001828f, - 0.005314f, 0.031677f, 0.916016f, 0.991699f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, - 0.001339f, 0.003294f, 0.014389f, 0.562012f, 0.985840f, 0.996094f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.001098f, 0.002310f, 0.008163f, 0.123779f, 0.973633f, 0.994629f, 0.997559f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000365f, 0.000732f, 0.001097f, 0.002071f, 0.005669f, 0.041199f, 0.937988f, 0.992676f, - 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000366f, 0.000728f, 0.000732f, 0.001585f, 0.004143f, 0.020813f, 0.813965f, - 0.989746f, 0.996582f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.001220f, 0.003292f, 0.012581f, - 0.446533f, 0.984863f, 0.996094f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000471f, 0.000732f, 0.001220f, 0.002796f, - 0.009338f, 0.161865f, 0.977051f, 0.995117f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000732f, 0.001098f, - 0.002285f, 0.006870f, 0.074097f, 0.965820f, 0.994141f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f, - 0.001086f, 0.001945f, 0.005238f, 0.043732f, 0.947754f, 0.993652f, 0.997559f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, - 0.000730f, 0.000893f, 0.001826f, 0.004871f, 0.030411f, 0.922852f, 0.992188f, 0.997559f, - 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000243f, 0.000609f, 0.000732f, 0.001407f, 0.004375f, 0.023758f, 0.892090f, 0.992188f, - 0.997070f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000605f, 0.000732f, 0.001579f, 0.003941f, 0.020767f, 0.862793f, - 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000238f, 0.000483f, 0.000732f, 0.001449f, 0.003654f, 0.018951f, - 0.847656f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000233f, 0.000485f, 0.000732f, 0.001308f, 0.003353f, - 0.018997f, 0.855469f, 0.991699f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000118f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, 0.000732f, 0.001292f, - 0.003649f, 0.019791f, 0.881836f, 0.992188f, 0.997559f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000432f, 0.000732f, - 0.001220f, 0.003635f, 0.021912f, 0.916992f, 0.993652f, 0.997559f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.001245f, 0.004002f, 0.028107f, 0.946289f, 0.994141f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000085f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000475f, 0.000732f, 0.001611f, 0.004581f, 0.040466f, 0.966309f, 0.995605f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000487f, 0.000732f, 0.001703f, 0.005589f, 0.073486f, 0.979980f, 0.996094f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000475f, 0.000732f, 0.001706f, 0.006809f, 0.198730f, 0.987305f, - 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000488f, 0.000732f, 0.002071f, 0.009590f, 0.647949f, - 0.992188f, 0.997559f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000710f, 0.001093f, 0.002541f, 0.015533f, - 0.922852f, 0.995117f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000728f, 0.001218f, 0.003387f, - 0.034454f, 0.975586f, 0.996582f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000365f, 0.000731f, 0.001219f, - 0.004959f, 0.161865f, 0.989746f, 0.998047f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000366f, 0.000731f, - 0.001767f, 0.009331f, 0.849121f, 0.994629f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000487f, - 0.000732f, 0.002644f, 0.024231f, 0.977051f, 0.997559f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000685f, 0.001217f, 0.004139f, 0.195435f, 0.992676f, 0.998535f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000362f, 0.000731f, 0.001570f, 0.010086f, 0.944824f, 0.997070f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000365f, 0.000745f, 0.002781f, 0.051758f, 0.990723f, 0.998535f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000599f, 0.001176f, 0.006641f, 0.899414f, 0.997070f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000731f, 0.002066f, 0.032654f, 0.991211f, 0.998535f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000448f, 0.001088f, 0.005440f, 0.918457f, 0.997070f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000725f, 0.001822f, 0.038452f, 0.994141f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000329f, 0.000848f, 0.005672f, 0.972168f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000581f, 0.001982f, 0.155273f, - 0.997070f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000330f, 0.000848f, 0.009247f, - 0.992676f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000589f, 0.002625f, - 0.958496f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.001199f, - 0.083374f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000716f, - 0.007244f, 0.996582f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.002277f, 0.991211f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000070f, 0.000121f, 0.000122f, 0.000122f, - 0.000854f, 0.950684f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000121f, 0.000122f, - 0.000475f, 0.067139f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000122f, - 0.000002f, 0.005859f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, - 0.000014f, 0.001376f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000572f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000077f, 0.000002f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000103f, 0.992188f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.940430f, 0.940430f, 0.940918f, 0.940918f, 0.940430f, 0.940430f, - }, - { - 0.014023f, 0.979492f, 0.994629f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000488f, 0.004757f, 0.163330f, 0.975098f, 0.993164f, 0.996582f, 0.997559f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000610f, 0.002928f, 0.017166f, 0.563965f, 0.978027f, 0.992676f, 0.996094f, - 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000364f, 0.000732f, 0.002192f, 0.006573f, 0.044952f, 0.830566f, 0.980957f, - 0.992676f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000366f, 0.000854f, 0.001586f, 0.004253f, 0.014313f, 0.130371f, - 0.919922f, 0.984375f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000488f, 0.000854f, 0.001342f, 0.003025f, 0.007305f, - 0.028870f, 0.407715f, 0.954590f, 0.987305f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000609f, 0.000842f, 0.000976f, 0.002193f, - 0.005112f, 0.012505f, 0.066589f, 0.768066f, 0.970703f, 0.989746f, 0.994629f, 0.996582f, - 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000599f, 0.000609f, 0.000976f, - 0.001829f, 0.003046f, 0.007256f, 0.023499f, 0.194946f, 0.908691f, 0.979980f, 0.991699f, - 0.995117f, 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f, 0.000609f, - 0.000976f, 0.001583f, 0.002647f, 0.004726f, 0.012169f, 0.050537f, 0.568359f, 0.954102f, - 0.985840f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000488f, - 0.000610f, 0.000975f, 0.001211f, 0.001946f, 0.003532f, 0.007793f, 0.022446f, 0.139648f, - 0.856445f, 0.974121f, 0.989746f, 0.994141f, 0.996094f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, - 0.000310f, 0.000609f, 0.000807f, 0.001098f, 0.001822f, 0.002794f, 0.005699f, 0.012878f, - 0.047821f, 0.469238f, 0.941406f, 0.982910f, 0.991699f, 0.995117f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000244f, 0.000609f, 0.000732f, 0.001098f, 0.001461f, 0.002274f, 0.004025f, - 0.008247f, 0.023254f, 0.135254f, 0.833984f, 0.969727f, 0.987793f, 0.993652f, 0.995605f, - 0.997070f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000207f, 0.000244f, 0.000609f, 0.000610f, 0.001096f, 0.001098f, 0.002071f, - 0.003370f, 0.006172f, 0.014442f, 0.052795f, 0.486572f, 0.940430f, 0.981934f, 0.991699f, - 0.994629f, 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000485f, 0.000610f, 0.001080f, 0.001098f, - 0.001742f, 0.002668f, 0.004692f, 0.010147f, 0.028076f, 0.168701f, 0.854004f, 0.970703f, - 0.988770f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000487f, 0.000610f, 0.000731f, - 0.001098f, 0.001413f, 0.002411f, 0.003895f, 0.007072f, 0.017242f, 0.069580f, 0.605957f, - 0.948730f, 0.983398f, 0.992188f, 0.995117f, 0.996582f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000244f, 0.000609f, - 0.000610f, 0.001094f, 0.001337f, 0.001828f, 0.003275f, 0.005814f, 0.012054f, 0.036987f, - 0.270752f, 0.899414f, 0.975586f, 0.989746f, 0.993652f, 0.996094f, 0.997070f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000365f, - 0.000597f, 0.000610f, 0.000970f, 0.001098f, 0.001815f, 0.002771f, 0.005009f, 0.008888f, - 0.023804f, 0.115845f, 0.775879f, 0.962891f, 0.986328f, 0.993164f, 0.995605f, 0.997070f, - 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000536f, 0.000731f, 0.000937f, 0.001203f, 0.001581f, 0.002186f, 0.004005f, - 0.007061f, 0.016830f, 0.061218f, 0.522949f, 0.940430f, 0.981934f, 0.991211f, 0.994629f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000363f, 0.000487f, 0.000731f, 0.000732f, 0.001097f, 0.001339f, 0.002071f, - 0.003498f, 0.005947f, 0.012390f, 0.037964f, 0.268799f, 0.896973f, 0.975586f, 0.989258f, - 0.994141f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000244f, 0.000366f, 0.000609f, 0.000610f, 0.001094f, 0.001215f, - 0.002056f, 0.003183f, 0.004742f, 0.009880f, 0.026337f, 0.139526f, 0.813477f, 0.966309f, - 0.986816f, 0.993164f, 0.996094f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000163f, 0.000363f, 0.000600f, 0.000731f, 0.001088f, - 0.001216f, 0.001616f, 0.002640f, 0.004402f, 0.008156f, 0.019669f, 0.083191f, 0.664062f, - 0.953125f, 0.984375f, 0.992188f, 0.995117f, 0.997070f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000244f, 0.000523f, 0.000731f, - 0.000732f, 0.001097f, 0.001690f, 0.002169f, 0.003998f, 0.006939f, 0.015808f, 0.055634f, - 0.471191f, 0.935059f, 0.980957f, 0.991211f, 0.995117f, 0.996582f, 0.997559f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000336f, 0.000486f, - 0.000731f, 0.000732f, 0.001097f, 0.001558f, 0.002069f, 0.003525f, 0.006058f, 0.013062f, - 0.040894f, 0.306396f, 0.910156f, 0.978027f, 0.990234f, 0.994141f, 0.996582f, 0.997559f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f, - 0.000515f, 0.000731f, 0.000731f, 0.001094f, 0.001219f, 0.002148f, 0.003159f, 0.005577f, - 0.011360f, 0.031952f, 0.203979f, 0.874512f, 0.973633f, 0.989258f, 0.994141f, 0.996582f, - 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000325f, 0.000366f, 0.000731f, 0.000731f, 0.001093f, 0.001219f, 0.001820f, 0.002916f, - 0.005291f, 0.009758f, 0.026352f, 0.145020f, 0.832520f, 0.969238f, 0.988281f, 0.993652f, - 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000244f, 0.000440f, 0.000605f, 0.000731f, 0.001086f, 0.001097f, 0.001646f, - 0.002670f, 0.004230f, 0.008835f, 0.022415f, 0.112183f, 0.786133f, 0.966309f, 0.987793f, - 0.993652f, 0.996094f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000272f, 0.000358f, 0.000565f, 0.000731f, 0.000790f, 0.001210f, - 0.001573f, 0.002434f, 0.004360f, 0.008102f, 0.020660f, 0.092896f, 0.741699f, 0.962891f, - 0.987305f, 0.993164f, 0.996094f, 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000723f, 0.000731f, 0.000731f, - 0.001216f, 0.001698f, 0.002510f, 0.003998f, 0.007484f, 0.018463f, 0.082336f, 0.709961f, - 0.961426f, 0.986816f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000362f, 0.000704f, 0.000730f, - 0.000845f, 0.001096f, 0.001513f, 0.002302f, 0.003941f, 0.007168f, 0.017746f, 0.076782f, - 0.693848f, 0.961426f, 0.987305f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000364f, 0.000579f, - 0.000728f, 0.000731f, 0.001096f, 0.001491f, 0.002069f, 0.003899f, 0.007195f, 0.017059f, - 0.075439f, 0.701172f, 0.962402f, 0.987793f, 0.993652f, 0.996094f, 0.997559f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000357f, - 0.000482f, 0.000730f, 0.000731f, 0.001094f, 0.001334f, 0.002230f, 0.003708f, 0.007217f, - 0.017410f, 0.079163f, 0.730469f, 0.965820f, 0.988281f, 0.994141f, 0.996582f, 0.998047f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, - 0.000243f, 0.000365f, 0.000729f, 0.000731f, 0.001095f, 0.001330f, 0.002066f, 0.003637f, - 0.007118f, 0.018112f, 0.087708f, 0.775391f, 0.969238f, 0.989258f, 0.994629f, 0.997070f, - 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000073f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000323f, 0.000390f, 0.000729f, 0.000731f, 0.001094f, 0.001332f, 0.002275f, - 0.003782f, 0.007252f, 0.019379f, 0.105042f, 0.827637f, 0.973145f, 0.990723f, 0.994629f, - 0.997070f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000240f, 0.000369f, 0.000729f, 0.000731f, 0.001093f, 0.001330f, - 0.002209f, 0.003937f, 0.007896f, 0.021805f, 0.137207f, 0.876953f, 0.979004f, 0.991699f, - 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000272f, 0.000479f, 0.000727f, 0.000731f, 0.001085f, - 0.001331f, 0.002291f, 0.004105f, 0.008446f, 0.025024f, 0.202271f, 0.916504f, 0.982910f, - 0.993164f, 0.996094f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000360f, 0.000469f, 0.000681f, 0.000731f, - 0.001092f, 0.001331f, 0.002184f, 0.004227f, 0.009521f, 0.030899f, 0.335205f, 0.945312f, - 0.986816f, 0.993652f, 0.996582f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000116f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000429f, 0.000726f, - 0.000731f, 0.001091f, 0.001649f, 0.002464f, 0.004810f, 0.010895f, 0.041931f, 0.563477f, - 0.963867f, 0.989746f, 0.995117f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000101f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000288f, 0.000481f, - 0.000720f, 0.000731f, 0.001093f, 0.001571f, 0.002735f, 0.005405f, 0.013199f, 0.064880f, - 0.786133f, 0.976562f, 0.992188f, 0.995605f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000240f, - 0.000481f, 0.000727f, 0.000731f, 0.001093f, 0.001655f, 0.003132f, 0.005909f, 0.017181f, - 0.123169f, 0.904297f, 0.984375f, 0.993652f, 0.996582f, 0.998047f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000120f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000264f, 0.000392f, 0.000727f, 0.000835f, 0.001196f, 0.001765f, 0.003252f, 0.007343f, - 0.024521f, 0.304199f, 0.954102f, 0.989258f, 0.995605f, 0.997559f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000034f, 0.000119f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000235f, 0.000375f, 0.000728f, 0.000822f, 0.001095f, 0.002024f, 0.003952f, - 0.009193f, 0.040894f, 0.694824f, 0.975586f, 0.992676f, 0.996582f, 0.998047f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000112f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000307f, 0.000475f, 0.000728f, 0.000943f, 0.001216f, 0.002283f, - 0.004829f, 0.013008f, 0.092224f, 0.908203f, 0.986328f, 0.995117f, 0.997559f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000073f, 0.000118f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000576f, 0.000728f, 0.001073f, 0.001569f, - 0.002668f, 0.005947f, 0.020889f, 0.331543f, 0.965820f, 0.992188f, 0.996582f, 0.998047f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000362f, 0.000630f, 0.000729f, 0.001087f, - 0.001567f, 0.003241f, 0.008240f, 0.043793f, 0.824219f, 0.984375f, 0.994629f, 0.997559f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000075f, 0.000119f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000363f, 0.000689f, 0.000730f, - 0.001185f, 0.002022f, 0.004108f, 0.013702f, 0.161011f, 0.957031f, 0.991699f, 0.996582f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000105f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000156f, 0.000372f, 0.000689f, - 0.000730f, 0.001198f, 0.002651f, 0.006214f, 0.028854f, 0.750000f, 0.984375f, 0.995605f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f, - 0.000118f, 0.000120f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000472f, - 0.000724f, 0.000966f, 0.001658f, 0.003397f, 0.010582f, 0.116028f, 0.959473f, 0.993164f, - 0.997559f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000111f, 0.000119f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, - 0.000479f, 0.000726f, 0.001163f, 0.002157f, 0.004829f, 0.024338f, 0.776855f, 0.987793f, - 0.996582f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000097f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000219f, 0.000580f, 0.000728f, 0.001203f, 0.002872f, 0.009109f, 0.130371f, 0.972168f, - 0.995117f, 0.998047f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000112f, 0.000118f, 0.000121f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000333f, 0.000681f, 0.000940f, 0.001629f, 0.004120f, 0.025467f, 0.890625f, - 0.991699f, 0.997559f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000083f, 0.000116f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000353f, 0.000722f, 0.000961f, 0.002403f, 0.009354f, 0.295166f, - 0.985840f, 0.997070f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000105f, - 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000130f, 0.000427f, 0.000605f, 0.001345f, 0.004620f, 0.041229f, - 0.966797f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000074f, 0.000114f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000089f, 0.000562f, 0.000942f, 0.002352f, 0.012459f, - 0.854004f, 0.994141f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000007f, 0.000002f, 0.000231f, 0.000596f, 0.001180f, 0.005474f, - 0.211426f, 0.991211f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000118f, 0.000120f, 0.000121f, - 0.000121f, 0.000122f, 0.000029f, 0.000004f, 0.000001f, 0.000348f, 0.000896f, 0.002764f, - 0.032562f, 0.984375f, 0.998535f, 0.998535f, 0.999023f, 0.998535f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000089f, 0.000116f, 0.000119f, - 0.000121f, 0.000121f, 0.000121f, 0.000013f, 0.000003f, 0.000075f, 0.000586f, 0.001508f, - 0.010292f, 0.963379f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000107f, - 0.000118f, 0.000120f, 0.000121f, 0.000116f, 0.000008f, 0.000002f, 0.000233f, 0.000857f, - 0.004566f, 0.834961f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000083f, 0.000114f, 0.000119f, 0.000120f, 0.000060f, 0.000005f, 0.000001f, 0.000557f, - 0.002064f, 0.182373f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000103f, 0.000117f, 0.000120f, 0.000024f, 0.000003f, 0.000168f, - 0.000968f, 0.026428f, 0.996582f, 0.997070f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000047f, 0.000110f, 0.000118f, 0.000017f, 0.000002f, - 0.000513f, 0.006870f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000115f, 0.000011f, - 0.000042f, 0.001919f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000044f, 0.000109f, - 0.000008f, 0.000314f, 0.985840f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000089f, 0.000060f, 0.964355f, 0.964355f, 0.963867f, 0.963867f, 0.963379f, 0.964355f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000022f, 0.818848f, 0.819824f, 0.819336f, 0.819824f, 0.819824f, 0.819824f, - }, - { - 0.038849f, 0.941406f, 0.984375f, 0.992188f, 0.994141f, 0.996094f, 0.996582f, 0.997070f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, 0.999512f, - 0.001582f, 0.014984f, 0.262451f, 0.930664f, 0.979980f, 0.989258f, 0.993164f, 0.995117f, - 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.000244f, 0.002317f, 0.009003f, 0.047180f, 0.524902f, 0.936523f, 0.978027f, 0.988281f, - 0.992188f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, 1.000000f, - 0.000122f, 0.001098f, 0.002560f, 0.006824f, 0.020493f, 0.108826f, 0.715820f, 0.946289f, - 0.978516f, 0.988281f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000607f, 0.001098f, 0.002310f, 0.005646f, 0.012825f, 0.040131f, 0.231201f, - 0.825195f, 0.954590f, 0.979980f, 0.988281f, 0.992188f, 0.994141f, 0.995117f, 0.996582f, - 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000244f, 0.000609f, 0.001341f, 0.002310f, 0.004208f, 0.008865f, 0.021591f, - 0.074585f, 0.439209f, 0.885742f, 0.962402f, 0.981934f, 0.989258f, 0.992676f, 0.994141f, - 0.995605f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 0.999512f, - 0.000000f, 0.000122f, 0.000483f, 0.000610f, 0.001460f, 0.002192f, 0.003994f, 0.007030f, - 0.013847f, 0.036316f, 0.146362f, 0.661621f, 0.921875f, 0.969238f, 0.983398f, 0.989746f, - 0.993164f, 0.994141f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000243f, 0.000604f, 0.000730f, 0.001307f, 0.001944f, 0.003017f, - 0.004997f, 0.009834f, 0.021606f, 0.063416f, 0.295410f, 0.808594f, 0.944336f, 0.974609f, - 0.985352f, 0.990234f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, 1.000000f, - 0.000000f, 0.000000f, 0.000119f, 0.000366f, 0.000495f, 0.000731f, 0.001217f, 0.001823f, - 0.002796f, 0.004398f, 0.007656f, 0.015366f, 0.035828f, 0.119263f, 0.531738f, 0.886230f, - 0.958496f, 0.979004f, 0.986816f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000366f, 0.000607f, 0.000731f, 0.001211f, - 0.001650f, 0.002441f, 0.003975f, 0.006207f, 0.011536f, 0.023315f, 0.060822f, 0.242798f, - 0.744141f, 0.927734f, 0.969238f, 0.982422f, 0.989258f, 0.992188f, 0.994141f, 0.995605f, - 0.996094f, 0.996582f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000211f, 0.000455f, 0.000486f, 0.000853f, - 0.001081f, 0.001810f, 0.002426f, 0.003759f, 0.005501f, 0.009094f, 0.016876f, 0.037109f, - 0.114075f, 0.475586f, 0.862305f, 0.951172f, 0.975586f, 0.985840f, 0.990234f, 0.992676f, - 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000364f, 0.000366f, 0.000464f, - 0.000731f, 0.001093f, 0.001577f, 0.002235f, 0.002798f, 0.004841f, 0.007637f, 0.013008f, - 0.025635f, 0.063965f, 0.238403f, 0.720215f, 0.919434f, 0.965820f, 0.981445f, 0.987793f, - 0.991211f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.000609f, - 0.000712f, 0.000974f, 0.000976f, 0.001507f, 0.002031f, 0.002680f, 0.004066f, 0.006294f, - 0.010284f, 0.018326f, 0.040924f, 0.124146f, 0.485596f, 0.859375f, 0.949707f, 0.975586f, - 0.984375f, 0.989746f, 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997070f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000113f, 0.000487f, - 0.000488f, 0.000610f, 0.000961f, 0.000976f, 0.001337f, 0.001705f, 0.002663f, 0.003521f, - 0.005417f, 0.008408f, 0.014809f, 0.028793f, 0.073120f, 0.270996f, 0.741699f, 0.922363f, - 0.965332f, 0.980957f, 0.987793f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.997070f, - 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000244f, 0.000224f, - 0.000486f, 0.000609f, 0.000610f, 0.000973f, 0.000975f, 0.001306f, 0.001703f, 0.002350f, - 0.003239f, 0.004848f, 0.007122f, 0.011955f, 0.021820f, 0.048859f, 0.152710f, 0.554199f, - 0.875977f, 0.953125f, 0.976562f, 0.985352f, 0.990234f, 0.993164f, 0.994629f, 0.995605f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000234f, - 0.000244f, 0.000485f, 0.000488f, 0.000610f, 0.000969f, 0.000975f, 0.001335f, 0.001693f, - 0.001991f, 0.002811f, 0.004097f, 0.006397f, 0.009903f, 0.017303f, 0.035034f, 0.094421f, - 0.354736f, 0.795898f, 0.933594f, 0.969238f, 0.981934f, 0.988281f, 0.991699f, 0.993652f, - 0.995117f, 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000244f, 0.000244f, 0.000480f, 0.000608f, 0.000488f, 0.000922f, 0.000975f, 0.000976f, - 0.001339f, 0.001827f, 0.002674f, 0.003891f, 0.005688f, 0.008324f, 0.014320f, 0.026917f, - 0.064392f, 0.216431f, 0.668945f, 0.904785f, 0.959961f, 0.978516f, 0.986816f, 0.990723f, - 0.993652f, 0.994141f, 0.996094f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 1.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000188f, 0.000220f, 0.000480f, 0.000608f, 0.000609f, 0.000876f, 0.000975f, - 0.000976f, 0.001454f, 0.002068f, 0.002649f, 0.003481f, 0.004757f, 0.007801f, 0.012230f, - 0.021698f, 0.046814f, 0.138306f, 0.506348f, 0.859375f, 0.947754f, 0.974121f, 0.984375f, - 0.989746f, 0.992188f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000244f, 0.000446f, 0.000487f, 0.000609f, 0.000731f, - 0.000973f, 0.000975f, 0.001310f, 0.001823f, 0.002304f, 0.002869f, 0.004890f, 0.006813f, - 0.010475f, 0.017731f, 0.036163f, 0.095337f, 0.353516f, 0.792480f, 0.932129f, 0.968262f, - 0.982422f, 0.988770f, 0.992188f, 0.993652f, 0.995605f, 0.996094f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000241f, 0.000362f, 0.000487f, 0.000609f, - 0.000609f, 0.000973f, 0.001213f, 0.001419f, 0.001807f, 0.002068f, 0.002794f, 0.004070f, - 0.005917f, 0.009140f, 0.015129f, 0.029053f, 0.070068f, 0.242554f, 0.700684f, 0.911621f, - 0.961914f, 0.979492f, 0.987305f, 0.991211f, 0.993164f, 0.995117f, 0.995605f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000483f, 0.000603f, - 0.000609f, 0.000730f, 0.001076f, 0.000975f, 0.001327f, 0.001598f, 0.002056f, 0.002848f, - 0.003519f, 0.005589f, 0.008041f, 0.013321f, 0.024155f, 0.054718f, 0.171875f, 0.590332f, - 0.885742f, 0.955566f, 0.977051f, 0.985840f, 0.990723f, 0.993164f, 0.994629f, 0.995605f, - 0.997070f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000192f, 0.000122f, 0.000244f, 0.000483f, - 0.000606f, 0.000608f, 0.000731f, 0.000953f, 0.001095f, 0.001258f, 0.001575f, 0.002066f, - 0.002594f, 0.003857f, 0.004734f, 0.007683f, 0.011642f, 0.021179f, 0.044464f, 0.127930f, - 0.476807f, 0.850586f, 0.947266f, 0.974121f, 0.984375f, 0.989746f, 0.992676f, 0.994141f, - 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000229f, 0.000239f, 0.000244f, - 0.000343f, 0.000483f, 0.000608f, 0.000609f, 0.000857f, 0.000973f, 0.001097f, 0.001571f, - 0.002041f, 0.002399f, 0.002922f, 0.004471f, 0.006836f, 0.010643f, 0.018661f, 0.037354f, - 0.100037f, 0.378418f, 0.810547f, 0.937988f, 0.971191f, 0.983887f, 0.989258f, 0.992188f, - 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000161f, - 0.000230f, 0.000244f, 0.000486f, 0.000607f, 0.000609f, 0.000819f, 0.000972f, 0.000975f, - 0.001431f, 0.001945f, 0.002283f, 0.003031f, 0.004238f, 0.006424f, 0.009995f, 0.016068f, - 0.032104f, 0.081360f, 0.302246f, 0.765625f, 0.928223f, 0.968750f, 0.982422f, 0.988770f, - 0.992676f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000240f, 0.000240f, 0.000244f, 0.000450f, 0.000607f, 0.000609f, 0.000731f, 0.001084f, - 0.000974f, 0.001341f, 0.001910f, 0.002254f, 0.003216f, 0.004017f, 0.005692f, 0.008980f, - 0.014832f, 0.028854f, 0.069641f, 0.248657f, 0.719238f, 0.918945f, 0.965820f, 0.981445f, - 0.988770f, 0.992188f, 0.994629f, 0.995605f, 0.996094f, 0.997070f, 0.997559f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000243f, 0.000360f, 0.000461f, 0.000607f, 0.000608f, 0.000731f, - 0.001086f, 0.001202f, 0.001307f, 0.001592f, 0.002066f, 0.003134f, 0.003990f, 0.005611f, - 0.008133f, 0.013680f, 0.025986f, 0.061462f, 0.211670f, 0.676758f, 0.910156f, 0.963867f, - 0.980957f, 0.988281f, 0.991699f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000240f, 0.000243f, 0.000482f, 0.000604f, 0.000608f, - 0.000730f, 0.001040f, 0.001188f, 0.001287f, 0.001574f, 0.002064f, 0.002613f, 0.003721f, - 0.005428f, 0.008018f, 0.013161f, 0.024200f, 0.055573f, 0.186401f, 0.642578f, 0.904785f, - 0.962402f, 0.980469f, 0.987793f, 0.991699f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, - 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000480f, 0.000602f, - 0.000721f, 0.000705f, 0.000907f, 0.001094f, 0.001096f, 0.001493f, 0.002058f, 0.002607f, - 0.003639f, 0.004826f, 0.007595f, 0.012413f, 0.022171f, 0.051697f, 0.171143f, 0.619629f, - 0.899414f, 0.961426f, 0.980957f, 0.987793f, 0.992188f, 0.994629f, 0.995605f, 0.996582f, - 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000172f, 0.000232f, 0.000243f, 0.000244f, - 0.000576f, 0.000711f, 0.000608f, 0.000767f, 0.001089f, 0.001213f, 0.001509f, 0.002029f, - 0.002684f, 0.003550f, 0.005161f, 0.007107f, 0.011871f, 0.021545f, 0.049347f, 0.163086f, - 0.609863f, 0.900391f, 0.962891f, 0.980957f, 0.988281f, 0.992676f, 0.994629f, 0.996094f, - 0.996582f, 0.997559f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000210f, 0.000122f, 0.000337f, - 0.000290f, 0.000594f, 0.000726f, 0.000730f, 0.000731f, 0.001090f, 0.001212f, 0.001506f, - 0.002029f, 0.002335f, 0.003489f, 0.005077f, 0.007000f, 0.011398f, 0.021027f, 0.048218f, - 0.161133f, 0.614258f, 0.903809f, 0.963379f, 0.981934f, 0.988770f, 0.992188f, 0.994629f, - 0.996094f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000281f, 0.000440f, 0.000683f, 0.000726f, 0.000730f, 0.000731f, 0.001087f, 0.001095f, - 0.001485f, 0.001793f, 0.002214f, 0.002991f, 0.004951f, 0.006912f, 0.011162f, 0.020905f, - 0.048187f, 0.165527f, 0.633789f, 0.910156f, 0.965820f, 0.982422f, 0.989746f, 0.993164f, - 0.995117f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000241f, 0.000243f, 0.000480f, 0.000725f, 0.000697f, 0.000731f, 0.001007f, - 0.001094f, 0.001360f, 0.001795f, 0.002161f, 0.003244f, 0.004871f, 0.006966f, 0.011330f, - 0.020706f, 0.049591f, 0.178345f, 0.667969f, 0.918457f, 0.968262f, 0.983887f, 0.990234f, - 0.993652f, 0.995605f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000086f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000243f, 0.000243f, 0.000465f, 0.000592f, 0.000729f, 0.000730f, - 0.001079f, 0.001093f, 0.001332f, 0.001885f, 0.002129f, 0.003254f, 0.004818f, 0.006889f, - 0.011429f, 0.021957f, 0.052521f, 0.201294f, 0.714355f, 0.929199f, 0.972168f, 0.985352f, - 0.991211f, 0.994141f, 0.995605f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000115f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000184f, 0.000241f, 0.000347f, 0.000453f, 0.000579f, 0.000728f, - 0.000729f, 0.001034f, 0.001093f, 0.001292f, 0.001857f, 0.002131f, 0.003296f, 0.004826f, - 0.006958f, 0.011726f, 0.023071f, 0.057983f, 0.239258f, 0.767578f, 0.939453f, 0.976074f, - 0.987305f, 0.992676f, 0.994629f, 0.996094f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000088f, 0.000119f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000191f, 0.000242f, 0.000425f, 0.000558f, - 0.000723f, 0.000730f, 0.001058f, 0.001092f, 0.001297f, 0.001653f, 0.002352f, 0.003124f, - 0.004860f, 0.007072f, 0.012131f, 0.024551f, 0.066406f, 0.300537f, 0.820312f, 0.951172f, - 0.979492f, 0.988281f, 0.993164f, 0.995117f, 0.996582f, 0.997070f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000227f, 0.000239f, 0.000341f, 0.000359f, - 0.000587f, 0.000605f, 0.000729f, 0.001040f, 0.001185f, 0.001275f, 0.001849f, 0.002390f, - 0.003399f, 0.005001f, 0.007404f, 0.012871f, 0.027237f, 0.079529f, 0.395264f, 0.868164f, - 0.960938f, 0.982910f, 0.990234f, 0.993164f, 0.995605f, 0.997070f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000120f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000211f, 0.000239f, 0.000307f, - 0.000394f, 0.000704f, 0.000711f, 0.000728f, 0.001001f, 0.001088f, 0.001204f, 0.001713f, - 0.002367f, 0.003151f, 0.004639f, 0.007820f, 0.014084f, 0.030609f, 0.102722f, 0.527344f, - 0.906250f, 0.969727f, 0.985840f, 0.991699f, 0.994629f, 0.996094f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000115f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000196f, - 0.000332f, 0.000363f, 0.000686f, 0.000719f, 0.000723f, 0.000963f, 0.001089f, 0.001290f, - 0.001849f, 0.002394f, 0.003458f, 0.004833f, 0.008301f, 0.015579f, 0.036926f, 0.143188f, - 0.676270f, 0.934570f, 0.976562f, 0.988281f, 0.992676f, 0.995605f, 0.996582f, 0.998047f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000102f, 0.000120f, - 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000311f, 0.000345f, 0.000479f, 0.000723f, 0.000728f, 0.000934f, 0.001085f, - 0.001282f, 0.001821f, 0.002399f, 0.003355f, 0.005524f, 0.008881f, 0.017807f, 0.047058f, - 0.222046f, 0.803223f, 0.954102f, 0.981445f, 0.990723f, 0.994141f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000090f, - 0.000116f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000201f, 0.000239f, 0.000358f, 0.000618f, 0.000719f, 0.000727f, 0.000863f, - 0.001087f, 0.001350f, 0.001945f, 0.002689f, 0.003731f, 0.005817f, 0.010033f, 0.021332f, - 0.064514f, 0.374512f, 0.885254f, 0.969238f, 0.986328f, 0.992676f, 0.995605f, 0.996582f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000086f, 0.000117f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000164f, 0.000238f, 0.000353f, 0.000596f, 0.000591f, 0.000727f, - 0.000901f, 0.001085f, 0.001266f, 0.001767f, 0.002663f, 0.003914f, 0.006153f, 0.011612f, - 0.026871f, 0.100525f, 0.605957f, 0.934082f, 0.978027f, 0.989746f, 0.994141f, 0.996094f, - 0.997559f, 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000107f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000195f, 0.000323f, 0.000339f, 0.000461f, 0.000706f, - 0.000726f, 0.000845f, 0.001086f, 0.001298f, 0.001843f, 0.003027f, 0.004387f, 0.007011f, - 0.013832f, 0.036530f, 0.183228f, 0.805664f, 0.959961f, 0.984863f, 0.991699f, 0.995605f, - 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000120f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000336f, 0.000464f, - 0.000708f, 0.000726f, 0.000965f, 0.001083f, 0.001458f, 0.002180f, 0.003096f, 0.004425f, - 0.008377f, 0.017639f, 0.056610f, 0.390869f, 0.909180f, 0.975586f, 0.989746f, 0.994141f, - 0.996582f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000113f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000135f, 0.000336f, - 0.000467f, 0.000713f, 0.000725f, 0.000959f, 0.001191f, 0.001287f, 0.001939f, 0.003231f, - 0.005306f, 0.009888f, 0.024414f, 0.105835f, 0.709961f, 0.955078f, 0.984863f, 0.993164f, - 0.996094f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000061f, 0.000089f, - 0.000118f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000309f, - 0.000299f, 0.000460f, 0.000710f, 0.000724f, 0.000997f, 0.001073f, 0.001410f, 0.002117f, - 0.003506f, 0.006031f, 0.012863f, 0.038391f, 0.260742f, 0.892090f, 0.975098f, 0.990723f, - 0.995117f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000085f, 0.000110f, 0.000118f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000317f, 0.000499f, 0.000706f, 0.000599f, 0.000851f, 0.001069f, 0.001633f, - 0.002367f, 0.003918f, 0.007580f, 0.017929f, 0.074646f, 0.645508f, 0.956055f, 0.986328f, - 0.994141f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000099f, 0.000113f, 0.000119f, 0.000119f, 0.000120f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000160f, 0.000326f, 0.000308f, 0.000578f, 0.000602f, 0.000921f, 0.001071f, - 0.001807f, 0.002783f, 0.004620f, 0.010017f, 0.029465f, 0.211792f, 0.896484f, 0.979004f, - 0.992188f, 0.996094f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000103f, 0.000114f, 0.000118f, 0.000120f, - 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000090f, 0.000212f, 0.000309f, 0.000586f, 0.000602f, 0.000937f, - 0.001147f, 0.002031f, 0.003237f, 0.006134f, 0.014969f, 0.063171f, 0.665527f, 0.964355f, - 0.989258f, 0.995117f, 0.999023f, 0.998535f, 0.999023f, 0.999023f, 0.998535f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000103f, 0.000113f, - 0.000117f, 0.000119f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000004f, 0.000002f, 0.000199f, 0.000390f, 0.000586f, 0.000665f, - 0.000946f, 0.001365f, 0.002207f, 0.003767f, 0.008308f, 0.025955f, 0.227661f, 0.924316f, - 0.984863f, 0.994141f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000098f, 0.000109f, 0.000117f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000193f, 0.000388f, 0.000586f, - 0.000659f, 0.000952f, 0.001580f, 0.002762f, 0.005363f, 0.013153f, 0.066589f, 0.781738f, - 0.977051f, 0.993164f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000075f, 0.000112f, 0.000116f, 0.000118f, 0.000119f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, - 0.000088f, 0.000026f, 0.000010f, 0.000005f, 0.000003f, 0.000002f, 0.000186f, 0.000407f, - 0.000586f, 0.000760f, 0.000986f, 0.001796f, 0.003275f, 0.007565f, 0.026794f, 0.363281f, - 0.959473f, 0.990723f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000010f, 0.000090f, 0.000110f, 0.000115f, 0.000117f, - 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000077f, 0.000023f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, 0.000158f, - 0.000407f, 0.000587f, 0.000826f, 0.001264f, 0.002174f, 0.004894f, 0.013359f, 0.098511f, - 0.911133f, 0.987793f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000107f, - 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000093f, 0.000024f, 0.000011f, 0.000005f, 0.000003f, 0.000002f, - 0.000220f, 0.000476f, 0.000585f, 0.000913f, 0.001374f, 0.002951f, 0.007511f, 0.034973f, - 0.736328f, 0.982910f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000056f, 0.000102f, 0.000112f, 0.000116f, 0.000117f, 0.000119f, 0.000120f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000075f, 0.000025f, 0.000010f, 0.000005f, 0.000003f, - 0.000034f, 0.000222f, 0.000491f, 0.000589f, 0.001020f, 0.001881f, 0.004669f, 0.015717f, - 0.298340f, 0.974609f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000048f, 0.000095f, 0.000106f, 0.000114f, 0.000117f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000121f, 0.000089f, 0.000029f, 0.000012f, 0.000006f, - 0.000003f, 0.000002f, 0.000223f, 0.000525f, 0.000687f, 0.001122f, 0.002672f, 0.008255f, - 0.079590f, 0.954590f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000077f, 0.000104f, 0.000112f, - 0.000115f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000109f, 0.000031f, 0.000013f, - 0.000006f, 0.000003f, 0.000002f, 0.000254f, 0.000550f, 0.000846f, 0.001545f, 0.004223f, - 0.027771f, 0.901855f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f, - 0.000090f, 0.000107f, 0.000113f, 0.000116f, 0.000118f, 0.000119f, 0.000120f, 0.000041f, - 0.000015f, 0.000007f, 0.000004f, 0.000002f, 0.000271f, 0.000563f, 0.000786f, 0.002211f, - 0.012207f, 0.711426f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.994629f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000028f, 0.000083f, 0.000102f, 0.000110f, 0.000114f, 0.000117f, 0.000118f, - 0.000052f, 0.000019f, 0.000008f, 0.000004f, 0.000002f, 0.000314f, 0.000444f, 0.001049f, - 0.005669f, 0.266846f, 0.993164f, 0.993652f, 0.993164f, 0.993652f, 0.993164f, 0.993164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000048f, 0.000089f, 0.000106f, 0.000112f, - 0.000115f, 0.000077f, 0.000026f, 0.000010f, 0.000005f, 0.000079f, 0.000425f, 0.000405f, - 0.002468f, 0.064209f, 0.990234f, 0.990723f, 0.990234f, 0.990234f, 0.990234f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000020f, 0.000075f, - 0.000098f, 0.000108f, 0.000113f, 0.000044f, 0.000016f, 0.000006f, 0.000027f, 0.000270f, - 0.000825f, 0.018448f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000049f, 0.000085f, 0.000102f, 0.000070f, 0.000022f, 0.000008f, 0.000133f, - 0.000295f, 0.005318f, 0.978516f, 0.979004f, 0.977539f, 0.977539f, 0.978027f, 0.978516f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000066f, 0.000092f, 0.000036f, 0.000011f, - 0.000135f, 0.000925f, 0.959473f, 0.959961f, 0.959961f, 0.959473f, 0.959961f, 0.959473f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000027f, 0.000065f, - 0.000016f, 0.000109f, 0.907715f, 0.907227f, 0.907715f, 0.907227f, 0.907715f, 0.907715f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000017f, 0.711914f, 0.712402f, 0.711426f, 0.711426f, 0.711914f, 0.712402f, - }, - { - 0.076172f, 0.877441f, 0.964355f, 0.980957f, 0.987305f, 0.990723f, 0.992676f, 0.993652f, - 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003897f, 0.033173f, 0.320557f, 0.863770f, 0.953613f, 0.975586f, 0.984863f, 0.988770f, - 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000975f, 0.005951f, 0.020935f, 0.093140f, 0.501465f, 0.873047f, 0.950684f, 0.973145f, - 0.981934f, 0.986816f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000610f, 0.002430f, 0.006081f, 0.015915f, 0.045593f, 0.179810f, 0.635254f, 0.889648f, - 0.951172f, 0.972168f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.994629f, - 0.995117f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.001219f, 0.002796f, 0.006172f, 0.012848f, 0.028458f, 0.081177f, 0.301758f, - 0.733398f, 0.905273f, 0.953613f, 0.972168f, 0.981445f, 0.986328f, 0.989258f, 0.991699f, - 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000731f, 0.001706f, 0.003166f, 0.005470f, 0.010406f, 0.020813f, 0.047089f, - 0.136719f, 0.449951f, 0.803223f, 0.919434f, 0.957520f, 0.973633f, 0.981934f, 0.986328f, - 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000366f, 0.001214f, 0.001894f, 0.003159f, 0.005108f, 0.008720f, 0.015839f, - 0.031586f, 0.074951f, 0.224121f, 0.596680f, 0.851074f, 0.932617f, 0.962402f, 0.975586f, - 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000366f, 0.000731f, 0.000976f, 0.001827f, 0.002987f, 0.004757f, 0.007988f, - 0.013023f, 0.023544f, 0.048431f, 0.120239f, 0.352783f, 0.717285f, 0.887207f, 0.943848f, - 0.966309f, 0.978027f, 0.983887f, 0.987305f, 0.990234f, 0.992188f, 0.993652f, 0.994629f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000434f, 0.000488f, 0.000704f, 0.001218f, 0.002190f, 0.002783f, 0.004723f, - 0.006878f, 0.011040f, 0.018372f, 0.034241f, 0.073242f, 0.194336f, 0.510742f, 0.803711f, - 0.912598f, 0.952637f, 0.970703f, 0.979004f, 0.984863f, 0.988281f, 0.991211f, 0.992676f, - 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000243f, 0.000488f, 0.000488f, 0.000916f, 0.001219f, 0.002308f, 0.002914f, - 0.004124f, 0.006523f, 0.009537f, 0.014793f, 0.025833f, 0.050446f, 0.116089f, 0.312744f, - 0.661133f, 0.860840f, 0.931641f, 0.960449f, 0.974121f, 0.981445f, 0.986328f, 0.989258f, - 0.991211f, 0.992676f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000121f, 0.000356f, 0.000488f, 0.000609f, 0.000944f, 0.001339f, 0.002296f, - 0.002964f, 0.003880f, 0.005676f, 0.008476f, 0.012909f, 0.020874f, 0.036926f, 0.075500f, - 0.187988f, 0.474854f, 0.774414f, 0.900391f, 0.946289f, 0.966309f, 0.978027f, 0.983887f, - 0.987793f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000244f, 0.000483f, 0.000488f, 0.000731f, 0.001070f, 0.001551f, - 0.002024f, 0.002520f, 0.003990f, 0.004738f, 0.007584f, 0.010834f, 0.016800f, 0.028763f, - 0.054535f, 0.120728f, 0.309082f, 0.642090f, 0.848145f, 0.926270f, 0.957031f, 0.971191f, - 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992188f, 0.993652f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000485f, 0.000608f, 0.000731f, 0.001091f, - 0.001339f, 0.001943f, 0.002602f, 0.003466f, 0.004845f, 0.006649f, 0.009529f, 0.014824f, - 0.023407f, 0.041351f, 0.083496f, 0.199951f, 0.482422f, 0.770996f, 0.896484f, 0.944336f, - 0.965332f, 0.976562f, 0.982910f, 0.986816f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, - 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000243f, 0.000602f, 0.000609f, 0.000799f, - 0.001088f, 0.001459f, 0.001822f, 0.002432f, 0.003033f, 0.004375f, 0.006042f, 0.008560f, - 0.012810f, 0.019791f, 0.032715f, 0.061584f, 0.135254f, 0.335693f, 0.660156f, 0.853027f, - 0.926758f, 0.956543f, 0.972168f, 0.980469f, 0.984863f, 0.988281f, 0.991211f, 0.992676f, - 0.993652f, 0.994141f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000243f, 0.000366f, 0.000605f, 0.000730f, - 0.000731f, 0.001201f, 0.001458f, 0.001804f, 0.002428f, 0.003593f, 0.004234f, 0.005745f, - 0.007755f, 0.011139f, 0.016754f, 0.027054f, 0.047424f, 0.097107f, 0.231323f, 0.525879f, - 0.791016f, 0.902832f, 0.945801f, 0.966797f, 0.977051f, 0.982910f, 0.987793f, 0.990234f, - 0.991699f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000116f, 0.000122f, 0.000365f, 0.000244f, 0.000602f, - 0.000721f, 0.000730f, 0.000852f, 0.001451f, 0.001842f, 0.002518f, 0.002993f, 0.004097f, - 0.005253f, 0.007099f, 0.009865f, 0.014908f, 0.022827f, 0.038879f, 0.072815f, 0.163940f, - 0.396484f, 0.707031f, 0.869141f, 0.932129f, 0.960449f, 0.973145f, 0.980957f, 0.986328f, - 0.988770f, 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000110f, 0.000361f, 0.000242f, 0.000244f, - 0.000602f, 0.000728f, 0.000853f, 0.001260f, 0.001569f, 0.001704f, 0.002287f, 0.003103f, - 0.003857f, 0.004848f, 0.006680f, 0.009003f, 0.012978f, 0.019897f, 0.032135f, 0.057983f, - 0.121033f, 0.291504f, 0.604980f, 0.827148f, 0.915039f, 0.953125f, 0.969238f, 0.978516f, - 0.984375f, 0.988281f, 0.991211f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996582f, 0.996582f, 0.997070f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000241f, 0.000241f, 0.000365f, - 0.000365f, 0.000589f, 0.000852f, 0.000852f, 0.001246f, 0.001562f, 0.001812f, 0.002241f, - 0.002794f, 0.003633f, 0.004669f, 0.006069f, 0.008202f, 0.011772f, 0.016891f, 0.027618f, - 0.047089f, 0.093506f, 0.216309f, 0.495605f, 0.771484f, 0.894531f, 0.942383f, 0.965332f, - 0.976074f, 0.982910f, 0.987305f, 0.989746f, 0.991699f, 0.993164f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000364f, - 0.000242f, 0.000487f, 0.000737f, 0.000730f, 0.000974f, 0.001083f, 0.001520f, 0.001701f, - 0.001938f, 0.002768f, 0.003658f, 0.004227f, 0.005741f, 0.007671f, 0.010796f, 0.015511f, - 0.023529f, 0.040009f, 0.074158f, 0.165405f, 0.395264f, 0.703613f, 0.868164f, 0.932129f, - 0.959473f, 0.973633f, 0.980957f, 0.985840f, 0.988770f, 0.991699f, 0.992676f, 0.994141f, - 0.995117f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000100f, 0.000000f, 0.000241f, - 0.000224f, 0.000487f, 0.000488f, 0.000710f, 0.000972f, 0.000848f, 0.001181f, 0.001333f, - 0.001910f, 0.001830f, 0.002661f, 0.003298f, 0.004154f, 0.005386f, 0.007271f, 0.009735f, - 0.013908f, 0.021149f, 0.034149f, 0.062042f, 0.130371f, 0.313477f, 0.627930f, 0.837402f, - 0.919922f, 0.954590f, 0.970215f, 0.979492f, 0.985352f, 0.988770f, 0.991211f, 0.992676f, - 0.993652f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000049f, - 0.000242f, 0.000483f, 0.000606f, 0.000487f, 0.000695f, 0.000970f, 0.000974f, 0.001136f, - 0.001328f, 0.001694f, 0.002028f, 0.002617f, 0.002953f, 0.003847f, 0.004951f, 0.006653f, - 0.009193f, 0.012672f, 0.018661f, 0.029968f, 0.052673f, 0.106689f, 0.250977f, 0.549805f, - 0.801758f, 0.907227f, 0.948242f, 0.967773f, 0.978027f, 0.984375f, 0.987793f, 0.990723f, - 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000166f, 0.000243f, 0.000485f, 0.000487f, 0.000487f, 0.000945f, 0.000834f, 0.000974f, - 0.000974f, 0.001300f, 0.001810f, 0.002058f, 0.002573f, 0.002703f, 0.003761f, 0.004887f, - 0.006393f, 0.008514f, 0.011818f, 0.016937f, 0.026672f, 0.046051f, 0.089478f, 0.204712f, - 0.476807f, 0.762207f, 0.891602f, 0.942383f, 0.965820f, 0.976562f, 0.983398f, 0.987793f, - 0.990234f, 0.992188f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000224f, 0.000358f, 0.000477f, 0.000486f, 0.000487f, 0.000580f, 0.000841f, - 0.000973f, 0.001079f, 0.001255f, 0.001649f, 0.002045f, 0.002241f, 0.002995f, 0.003841f, - 0.004826f, 0.005920f, 0.007866f, 0.010925f, 0.015930f, 0.024109f, 0.040619f, 0.077454f, - 0.171509f, 0.412354f, 0.720215f, 0.876953f, 0.936035f, 0.962402f, 0.975098f, 0.982422f, - 0.987305f, 0.990234f, 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000165f, 0.000205f, 0.000411f, 0.000480f, 0.000486f, 0.000608f, 0.000688f, - 0.000966f, 0.000968f, 0.000974f, 0.001421f, 0.001489f, 0.001695f, 0.002090f, 0.002886f, - 0.003326f, 0.004608f, 0.005604f, 0.007317f, 0.010414f, 0.014862f, 0.022232f, 0.036469f, - 0.067810f, 0.146973f, 0.359375f, 0.680664f, 0.861816f, 0.931152f, 0.959961f, 0.974609f, - 0.981934f, 0.986816f, 0.989746f, 0.991699f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000242f, 0.000453f, 0.000539f, 0.000486f, 0.000487f, - 0.000487f, 0.000957f, 0.000969f, 0.001202f, 0.001139f, 0.001393f, 0.001986f, 0.002045f, - 0.002863f, 0.003216f, 0.004128f, 0.005417f, 0.007378f, 0.009689f, 0.013466f, 0.020432f, - 0.033722f, 0.060883f, 0.129395f, 0.318115f, 0.642090f, 0.847656f, 0.926270f, 0.958008f, - 0.973145f, 0.981934f, 0.986328f, 0.989746f, 0.992188f, 0.993164f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000380f, 0.000482f, 0.000606f, - 0.000607f, 0.000608f, 0.000829f, 0.000970f, 0.000972f, 0.001070f, 0.001402f, 0.001812f, - 0.002138f, 0.002619f, 0.003246f, 0.004082f, 0.005318f, 0.006699f, 0.009262f, 0.012764f, - 0.019318f, 0.031052f, 0.055878f, 0.116821f, 0.286621f, 0.610352f, 0.835938f, 0.922852f, - 0.956543f, 0.973145f, 0.981445f, 0.986328f, 0.989746f, 0.991699f, 0.993652f, 0.995117f, - 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000243f, 0.000350f, 0.000480f, - 0.000605f, 0.000596f, 0.000608f, 0.000890f, 0.000963f, 0.000972f, 0.000974f, 0.001316f, - 0.001798f, 0.002058f, 0.002560f, 0.002811f, 0.003983f, 0.005108f, 0.006489f, 0.008888f, - 0.012314f, 0.018021f, 0.029495f, 0.051941f, 0.107422f, 0.263428f, 0.585449f, 0.827148f, - 0.919434f, 0.956055f, 0.971680f, 0.981445f, 0.986816f, 0.989746f, 0.992188f, 0.994141f, - 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000176f, 0.000462f, - 0.000483f, 0.000604f, 0.000607f, 0.000638f, 0.000922f, 0.000965f, 0.000971f, 0.001235f, - 0.001376f, 0.001769f, 0.002041f, 0.002575f, 0.003130f, 0.003487f, 0.004936f, 0.006264f, - 0.008415f, 0.012047f, 0.017517f, 0.027786f, 0.049164f, 0.101257f, 0.249512f, 0.568848f, - 0.821777f, 0.918945f, 0.956055f, 0.972168f, 0.981445f, 0.986816f, 0.990234f, 0.992188f, - 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000130f, 0.000122f, 0.000242f, - 0.000352f, 0.000560f, 0.000602f, 0.000604f, 0.000606f, 0.000767f, 0.001046f, 0.001089f, - 0.000973f, 0.001327f, 0.001583f, 0.002033f, 0.002272f, 0.002657f, 0.003563f, 0.004589f, - 0.006138f, 0.008194f, 0.011299f, 0.016861f, 0.026718f, 0.047119f, 0.097656f, 0.240967f, - 0.562500f, 0.821289f, 0.919922f, 0.957031f, 0.973145f, 0.981934f, 0.987305f, 0.990234f, - 0.992676f, 0.994141f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000241f, 0.000314f, 0.000459f, 0.000600f, 0.000605f, 0.000598f, 0.000804f, 0.000958f, - 0.001084f, 0.001104f, 0.001389f, 0.001709f, 0.002041f, 0.002211f, 0.002645f, 0.003635f, - 0.004467f, 0.005718f, 0.008072f, 0.011185f, 0.016846f, 0.026184f, 0.046112f, 0.094971f, - 0.239014f, 0.565430f, 0.825684f, 0.922363f, 0.958496f, 0.973633f, 0.983398f, 0.987793f, - 0.990723f, 0.992676f, 0.994141f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, - 0.000122f, 0.000173f, 0.000246f, 0.000387f, 0.000480f, 0.000604f, 0.000604f, 0.000701f, - 0.000951f, 0.000968f, 0.001184f, 0.001315f, 0.001597f, 0.001899f, 0.002268f, 0.002813f, - 0.003716f, 0.004372f, 0.005886f, 0.007759f, 0.010918f, 0.015915f, 0.025726f, 0.045685f, - 0.095459f, 0.243774f, 0.579102f, 0.833984f, 0.926270f, 0.960449f, 0.976074f, 0.983887f, - 0.988770f, 0.991211f, 0.993164f, 0.994629f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000238f, 0.000237f, 0.000242f, 0.000463f, 0.000585f, 0.000587f, 0.000718f, - 0.000607f, 0.000885f, 0.001081f, 0.001087f, 0.001299f, 0.001553f, 0.001982f, 0.002104f, - 0.002777f, 0.003494f, 0.004406f, 0.005798f, 0.007645f, 0.010750f, 0.016159f, 0.025467f, - 0.045959f, 0.097778f, 0.256104f, 0.603516f, 0.847168f, 0.931152f, 0.963379f, 0.977539f, - 0.985352f, 0.989258f, 0.991699f, 0.993652f, 0.995117f, 0.996094f, 0.996582f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000231f, 0.000122f, 0.000242f, 0.000242f, 0.000400f, 0.000525f, 0.000495f, - 0.000605f, 0.000607f, 0.000898f, 0.001075f, 0.001191f, 0.001133f, 0.001420f, 0.001794f, - 0.002041f, 0.002733f, 0.003548f, 0.004448f, 0.005585f, 0.007656f, 0.010735f, 0.015671f, - 0.025589f, 0.047363f, 0.102783f, 0.276855f, 0.637695f, 0.862793f, 0.938477f, 0.966797f, - 0.979004f, 0.985840f, 0.990234f, 0.992676f, 0.994141f, 0.995117f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f, 0.000242f, 0.000470f, 0.000469f, - 0.000547f, 0.000711f, 0.000723f, 0.000829f, 0.001024f, 0.001188f, 0.001081f, 0.001415f, - 0.001765f, 0.002048f, 0.002708f, 0.003252f, 0.004448f, 0.005711f, 0.007557f, 0.010780f, - 0.016220f, 0.026398f, 0.048950f, 0.111267f, 0.309082f, 0.680664f, 0.880371f, 0.945801f, - 0.970703f, 0.980957f, 0.986816f, 0.990723f, 0.993164f, 0.994629f, 0.995605f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000204f, 0.000239f, 0.000242f, 0.000283f, - 0.000479f, 0.000594f, 0.000603f, 0.000606f, 0.000779f, 0.001068f, 0.001084f, 0.001118f, - 0.001515f, 0.001926f, 0.002098f, 0.002674f, 0.002975f, 0.004040f, 0.005478f, 0.007488f, - 0.010651f, 0.016327f, 0.027222f, 0.052460f, 0.123718f, 0.355713f, 0.729980f, 0.899902f, - 0.952637f, 0.973145f, 0.983887f, 0.988770f, 0.991699f, 0.994141f, 0.995117f, 0.996094f, - 0.997070f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000236f, 0.000207f, 0.000240f, - 0.000435f, 0.000534f, 0.000594f, 0.000602f, 0.000722f, 0.000727f, 0.000947f, 0.001081f, - 0.001090f, 0.001471f, 0.001829f, 0.002010f, 0.002478f, 0.002956f, 0.004051f, 0.005753f, - 0.007717f, 0.011040f, 0.017105f, 0.028748f, 0.057159f, 0.142944f, 0.421387f, 0.780762f, - 0.916992f, 0.960449f, 0.976562f, 0.985352f, 0.989746f, 0.992676f, 0.994629f, 0.996094f, - 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000232f, - 0.000230f, 0.000382f, 0.000472f, 0.000576f, 0.000715f, 0.000721f, 0.000727f, 0.001046f, - 0.001078f, 0.001186f, 0.001434f, 0.001674f, 0.002066f, 0.002546f, 0.003407f, 0.004181f, - 0.005634f, 0.007542f, 0.011330f, 0.017609f, 0.031189f, 0.064392f, 0.172729f, 0.506836f, - 0.828125f, 0.933105f, 0.966309f, 0.980469f, 0.987305f, 0.991211f, 0.993652f, 0.995117f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000232f, 0.000234f, 0.000352f, 0.000461f, 0.000535f, 0.000594f, 0.000722f, 0.000725f, - 0.000921f, 0.001116f, 0.001192f, 0.001416f, 0.001637f, 0.001911f, 0.002380f, 0.002949f, - 0.003948f, 0.005589f, 0.007942f, 0.011650f, 0.018631f, 0.034302f, 0.075867f, 0.219238f, - 0.607422f, 0.870605f, 0.946777f, 0.972656f, 0.983887f, 0.989258f, 0.992676f, 0.995117f, - 0.996094f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000239f, 0.000302f, 0.000396f, 0.000564f, 0.000674f, 0.000617f, - 0.000722f, 0.001003f, 0.001068f, 0.001084f, 0.001302f, 0.001598f, 0.001929f, 0.002375f, - 0.002935f, 0.004349f, 0.005714f, 0.007957f, 0.012306f, 0.020493f, 0.039001f, 0.092590f, - 0.293213f, 0.711426f, 0.905762f, 0.958984f, 0.978027f, 0.986328f, 0.990723f, 0.994141f, - 0.995605f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000232f, 0.000227f, 0.000240f, 0.000282f, 0.000542f, 0.000703f, - 0.000718f, 0.000724f, 0.000833f, 0.001069f, 0.001184f, 0.001346f, 0.001464f, 0.001898f, - 0.002649f, 0.003164f, 0.004467f, 0.005863f, 0.008400f, 0.013199f, 0.022614f, 0.046051f, - 0.120605f, 0.406738f, 0.801270f, 0.931641f, 0.968262f, 0.982422f, 0.988770f, 0.992676f, - 0.994629f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000219f, 0.000237f, 0.000235f, 0.000241f, 0.000480f, - 0.000584f, 0.000715f, 0.000723f, 0.000775f, 0.001061f, 0.000959f, 0.001139f, 0.001526f, - 0.001770f, 0.002546f, 0.003151f, 0.004250f, 0.006195f, 0.009071f, 0.014595f, 0.026413f, - 0.056763f, 0.169067f, 0.557617f, 0.869141f, 0.951172f, 0.976074f, 0.986328f, 0.990723f, - 0.994141f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000120f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000216f, 0.000228f, 0.000285f, 0.000339f, - 0.000454f, 0.000572f, 0.000595f, 0.000721f, 0.000604f, 0.000930f, 0.000958f, 0.001171f, - 0.001431f, 0.001888f, 0.002663f, 0.003256f, 0.004402f, 0.006527f, 0.009964f, 0.016281f, - 0.031189f, 0.074524f, 0.258301f, 0.714355f, 0.916016f, 0.965332f, 0.982422f, 0.989746f, - 0.992676f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000063f, 0.000120f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000184f, 0.000228f, - 0.000340f, 0.000396f, 0.000668f, 0.000571f, 0.000478f, 0.000602f, 0.000919f, 0.000956f, - 0.001061f, 0.001497f, 0.001888f, 0.002565f, 0.003523f, 0.004578f, 0.006935f, 0.010765f, - 0.018417f, 0.038635f, 0.107727f, 0.416260f, 0.832520f, 0.946289f, 0.975586f, 0.986328f, - 0.991699f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000045f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000234f, 0.000294f, 0.000220f, 0.000486f, 0.000579f, 0.000588f, 0.000669f, 0.000878f, - 0.001038f, 0.001135f, 0.001451f, 0.001820f, 0.002529f, 0.003551f, 0.005199f, 0.007542f, - 0.012230f, 0.022369f, 0.051910f, 0.174927f, 0.630859f, 0.905273f, 0.965332f, 0.982910f, - 0.990234f, 0.993652f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000117f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000171f, 0.000151f, 0.000166f, 0.000195f, 0.000342f, 0.000452f, 0.000594f, 0.000599f, - 0.000862f, 0.001019f, 0.001135f, 0.001465f, 0.002031f, 0.002676f, 0.003714f, 0.005497f, - 0.008286f, 0.014320f, 0.028854f, 0.077332f, 0.322754f, 0.809082f, 0.946289f, 0.977051f, - 0.987793f, 0.993164f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000105f, 0.000120f, - 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000008f, 0.000006f, 0.000098f, 0.000137f, 0.000233f, 0.000324f, 0.000566f, 0.000589f, - 0.000618f, 0.000874f, 0.000941f, 0.001108f, 0.001621f, 0.001880f, 0.002726f, 0.003788f, - 0.005840f, 0.009583f, 0.017563f, 0.039368f, 0.133545f, 0.582520f, 0.906738f, 0.968262f, - 0.984863f, 0.992188f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000114f, - 0.000117f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000021f, - 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000090f, 0.000206f, 0.000305f, 0.000538f, - 0.000585f, 0.000596f, 0.000869f, 0.000941f, 0.001149f, 0.001516f, 0.002150f, 0.002729f, - 0.004475f, 0.006660f, 0.011360f, 0.022690f, 0.061401f, 0.281494f, 0.813965f, 0.952148f, - 0.980957f, 0.990723f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, - 0.000085f, 0.000114f, 0.000117f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000122f, 0.000122f, 0.000077f, 0.000041f, - 0.000022f, 0.000013f, 0.000009f, 0.000006f, 0.000066f, 0.000107f, 0.000223f, 0.000250f, - 0.000532f, 0.000576f, 0.000593f, 0.000784f, 0.000937f, 0.001126f, 0.001523f, 0.002306f, - 0.003193f, 0.004574f, 0.007717f, 0.014191f, 0.032410f, 0.116577f, 0.595215f, 0.921875f, - 0.974609f, 0.988770f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000056f, 0.000112f, 0.000114f, 0.000118f, 0.000119f, 0.000120f, - 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000074f, - 0.000038f, 0.000021f, 0.000013f, 0.000009f, 0.000006f, 0.000004f, 0.000003f, 0.000179f, - 0.000258f, 0.000367f, 0.000469f, 0.000583f, 0.000770f, 0.000932f, 0.001131f, 0.001758f, - 0.002483f, 0.003517f, 0.005432f, 0.009232f, 0.019302f, 0.054504f, 0.293457f, 0.853516f, - 0.964844f, 0.986816f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000084f, 0.000107f, 0.000113f, 0.000117f, - 0.000118f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000076f, 0.000042f, 0.000023f, 0.000015f, 0.000009f, 0.000007f, 0.000005f, 0.000004f, - 0.000147f, 0.000238f, 0.000457f, 0.000545f, 0.000586f, 0.000821f, 0.000936f, 0.001139f, - 0.001849f, 0.002665f, 0.003687f, 0.006367f, 0.011810f, 0.028931f, 0.120605f, 0.687988f, - 0.947754f, 0.982910f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000082f, 0.000095f, - 0.000111f, 0.000115f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000083f, 0.000042f, 0.000026f, 0.000015f, 0.000010f, 0.000007f, 0.000005f, - 0.000013f, 0.000086f, 0.000185f, 0.000309f, 0.000552f, 0.000577f, 0.000796f, 0.000925f, - 0.001251f, 0.001838f, 0.002878f, 0.004509f, 0.007572f, 0.016617f, 0.054932f, 0.391602f, - 0.912109f, 0.978516f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000095f, 0.000106f, 0.000112f, 0.000113f, 0.000115f, 0.000118f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000099f, 0.000048f, 0.000027f, 0.000017f, 0.000011f, 0.000008f, - 0.000006f, 0.000004f, 0.000089f, 0.000182f, 0.000347f, 0.000495f, 0.000570f, 0.000777f, - 0.000922f, 0.001316f, 0.001831f, 0.003004f, 0.005028f, 0.010078f, 0.028183f, 0.161865f, - 0.833496f, 0.972168f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000074f, 0.000093f, 0.000107f, 0.000111f, 0.000115f, - 0.000116f, 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000057f, 0.000032f, 0.000021f, 0.000013f, - 0.000008f, 0.000006f, 0.000005f, 0.000034f, 0.000159f, 0.000267f, 0.000514f, 0.000566f, - 0.000714f, 0.000888f, 0.001348f, 0.001995f, 0.003302f, 0.006447f, 0.015945f, 0.069153f, - 0.646484f, 0.960449f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000095f, - 0.000102f, 0.000109f, 0.000114f, 0.000115f, 0.000116f, 0.000118f, 0.000118f, 0.000119f, - 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000077f, 0.000044f, 0.000025f, - 0.000015f, 0.000011f, 0.000007f, 0.000005f, 0.000004f, 0.000106f, 0.000244f, 0.000476f, - 0.000561f, 0.000622f, 0.000893f, 0.001266f, 0.001968f, 0.003990f, 0.009476f, 0.033234f, - 0.342529f, 0.940918f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000046f, 0.000079f, 0.000093f, 0.000104f, 0.000110f, 0.000111f, 0.000113f, 0.000116f, - 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000092f, 0.000050f, - 0.000029f, 0.000019f, 0.000012f, 0.000009f, 0.000006f, 0.000004f, 0.000061f, 0.000188f, - 0.000324f, 0.000456f, 0.000525f, 0.000657f, 0.001371f, 0.002445f, 0.005634f, 0.017563f, - 0.135986f, 0.902832f, 0.992188f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000038f, 0.000075f, 0.000092f, 0.000100f, 0.000105f, - 0.000111f, 0.000112f, 0.000114f, 0.000116f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, - 0.000074f, 0.000041f, 0.000024f, 0.000016f, 0.000010f, 0.000007f, 0.000005f, 0.000033f, - 0.000167f, 0.000423f, 0.000410f, 0.000413f, 0.000575f, 0.001446f, 0.003387f, 0.009644f, - 0.056183f, 0.817383f, 0.990234f, 0.990234f, 0.990234f, 0.990723f, 0.990234f, 0.990723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000011f, 0.000067f, - 0.000084f, 0.000096f, 0.000103f, 0.000108f, 0.000110f, 0.000113f, 0.000115f, 0.000115f, - 0.000116f, 0.000104f, 0.000057f, 0.000035f, 0.000021f, 0.000013f, 0.000009f, 0.000006f, - 0.000054f, 0.000161f, 0.000317f, 0.000332f, 0.000393f, 0.000723f, 0.001760f, 0.005203f, - 0.025345f, 0.617676f, 0.987793f, 0.987793f, 0.987793f, 0.988281f, 0.988281f, 0.988281f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000017f, 0.000052f, 0.000075f, 0.000091f, 0.000097f, 0.000105f, 0.000108f, - 0.000111f, 0.000113f, 0.000114f, 0.000085f, 0.000050f, 0.000031f, 0.000018f, 0.000012f, - 0.000008f, 0.000005f, 0.000095f, 0.000314f, 0.000306f, 0.000363f, 0.000813f, 0.002583f, - 0.011734f, 0.308105f, 0.983887f, 0.984375f, 0.984375f, 0.984375f, 0.983887f, 0.983887f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000037f, 0.000065f, 0.000083f, - 0.000093f, 0.000099f, 0.000105f, 0.000108f, 0.000110f, 0.000082f, 0.000045f, 0.000027f, - 0.000017f, 0.000011f, 0.000007f, 0.000114f, 0.000245f, 0.000209f, 0.000379f, 0.001151f, - 0.005260f, 0.107971f, 0.977539f, 0.979004f, 0.978027f, 0.978027f, 0.978027f, 0.978027f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000007f, 0.000045f, 0.000069f, 0.000084f, 0.000093f, 0.000099f, 0.000104f, 0.000076f, - 0.000044f, 0.000026f, 0.000016f, 0.000010f, 0.000012f, 0.000152f, 0.000179f, 0.000373f, - 0.001760f, 0.035522f, 0.969238f, 0.968750f, 0.968750f, 0.968750f, 0.968750f, 0.968750f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000050f, 0.000070f, 0.000082f, - 0.000092f, 0.000075f, 0.000044f, 0.000026f, 0.000015f, 0.000009f, 0.000121f, 0.000117f, - 0.000611f, 0.010231f, 0.951172f, 0.951172f, 0.951172f, 0.951172f, 0.950684f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000020f, 0.000047f, 0.000069f, 0.000077f, 0.000042f, 0.000024f, 0.000013f, 0.000078f, - 0.000130f, 0.001914f, 0.915039f, 0.915527f, 0.915039f, 0.915527f, 0.916016f, 0.915039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000047f, 0.000040f, 0.000019f, - 0.000035f, 0.000188f, 0.833984f, 0.833496f, 0.833496f, 0.834473f, 0.834473f, 0.833984f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000014f, 0.000007f, 0.642578f, 0.643555f, 0.643066f, 0.643555f, 0.642578f, 0.642578f, - }, - { - 0.113464f, 0.797852f, 0.930176f, 0.961914f, 0.974609f, 0.980469f, 0.984863f, 0.987793f, - 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.007183f, 0.058716f, 0.349609f, 0.784668f, 0.912598f, 0.952148f, 0.968262f, 0.977539f, - 0.981934f, 0.985352f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993652f, 0.993652f, - 0.994141f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002432f, 0.011818f, 0.039581f, 0.143677f, 0.482910f, 0.800293f, 0.908691f, 0.947266f, - 0.964844f, 0.974609f, 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.990723f, 0.991699f, - 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001096f, 0.005062f, 0.012482f, 0.030151f, 0.079956f, 0.239014f, 0.581055f, 0.819824f, - 0.909180f, 0.946289f, 0.963379f, 0.973145f, 0.979492f, 0.983398f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000610f, 0.002434f, 0.005779f, 0.012207f, 0.023972f, 0.052765f, 0.129883f, 0.342773f, - 0.660156f, 0.841309f, 0.914062f, 0.947266f, 0.963379f, 0.973145f, 0.979004f, 0.982910f, - 0.985840f, 0.987793f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, - 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000397f, 0.001559f, 0.003397f, 0.006058f, 0.011177f, 0.020355f, 0.039307f, 0.083130f, - 0.196777f, 0.452148f, 0.724121f, 0.862305f, 0.920410f, 0.949219f, 0.964355f, 0.973145f, - 0.979004f, 0.982910f, 0.985840f, 0.988770f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, - 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000366f, 0.001097f, 0.002163f, 0.003523f, 0.006268f, 0.010941f, 0.017487f, 0.030930f, - 0.058411f, 0.122925f, 0.281738f, 0.556152f, 0.776367f, 0.881348f, 0.928223f, 0.951660f, - 0.966309f, 0.973633f, 0.979492f, 0.983398f, 0.986328f, 0.988281f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000728f, 0.001340f, 0.002533f, 0.003813f, 0.006081f, 0.009750f, 0.015419f, - 0.025177f, 0.044067f, 0.084473f, 0.179077f, 0.384033f, 0.649902f, 0.818848f, 0.897949f, - 0.935547f, 0.956055f, 0.967285f, 0.975098f, 0.980957f, 0.983887f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000609f, 0.000854f, 0.001898f, 0.002781f, 0.004246f, 0.006218f, 0.008835f, - 0.013504f, 0.021362f, 0.035400f, 0.062347f, 0.121460f, 0.255127f, 0.495361f, 0.726562f, - 0.852539f, 0.912598f, 0.943359f, 0.959473f, 0.969238f, 0.976562f, 0.981445f, 0.984375f, - 0.987305f, 0.988770f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000731f, 0.001295f, 0.002159f, 0.003092f, 0.004051f, 0.005836f, - 0.008560f, 0.011925f, 0.018585f, 0.029373f, 0.048950f, 0.088013f, 0.174194f, 0.354980f, - 0.604492f, 0.788086f, 0.880371f, 0.925293f, 0.950195f, 0.963867f, 0.972168f, 0.978027f, - 0.982422f, 0.985840f, 0.987793f, 0.990234f, 0.991699f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000114f, 0.000244f, 0.000709f, 0.001089f, 0.001580f, 0.002100f, 0.002848f, 0.004028f, - 0.005646f, 0.008232f, 0.011276f, 0.016647f, 0.024948f, 0.039215f, 0.067566f, 0.125244f, - 0.249878f, 0.471436f, 0.698242f, 0.834961f, 0.902344f, 0.937012f, 0.955078f, 0.967773f, - 0.974609f, 0.979492f, 0.983887f, 0.987305f, 0.988770f, 0.990723f, 0.991699f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000244f, 0.000480f, 0.001081f, 0.001216f, 0.001684f, 0.002287f, 0.003113f, - 0.004246f, 0.005711f, 0.007412f, 0.010658f, 0.014900f, 0.021408f, 0.033173f, 0.053711f, - 0.094299f, 0.179688f, 0.351807f, 0.591309f, 0.774902f, 0.871582f, 0.919922f, 0.946289f, - 0.961426f, 0.971191f, 0.977051f, 0.981934f, 0.984863f, 0.987305f, 0.989258f, 0.991211f, - 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000364f, 0.000366f, 0.000729f, 0.001195f, 0.001218f, 0.001693f, 0.002209f, - 0.003038f, 0.004192f, 0.005249f, 0.006981f, 0.009926f, 0.013405f, 0.019165f, 0.028473f, - 0.044250f, 0.073975f, 0.134521f, 0.260010f, 0.476562f, 0.696289f, 0.830566f, 0.898438f, - 0.933594f, 0.954102f, 0.966309f, 0.974609f, 0.979492f, 0.982910f, 0.986328f, 0.988281f, - 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000226f, 0.000365f, 0.000488f, 0.000731f, 0.001090f, 0.001245f, 0.002028f, - 0.002169f, 0.003023f, 0.003952f, 0.005043f, 0.006790f, 0.009026f, 0.012276f, 0.016754f, - 0.024628f, 0.037384f, 0.060120f, 0.104431f, 0.196045f, 0.372803f, 0.604980f, 0.779785f, - 0.872070f, 0.919922f, 0.945312f, 0.960938f, 0.970703f, 0.977539f, 0.980957f, 0.984863f, - 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000364f, 0.000487f, 0.000488f, 0.000608f, 0.001092f, 0.001323f, - 0.001909f, 0.002028f, 0.002829f, 0.003754f, 0.004940f, 0.006329f, 0.008850f, 0.011353f, - 0.015572f, 0.022110f, 0.032196f, 0.050293f, 0.083984f, 0.151978f, 0.288574f, 0.507812f, - 0.715332f, 0.839844f, 0.902832f, 0.936035f, 0.955566f, 0.966797f, 0.974609f, 0.979492f, - 0.983887f, 0.986816f, 0.988281f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000341f, 0.000486f, 0.000487f, 0.000591f, 0.000846f, 0.001213f, - 0.001407f, 0.002018f, 0.002306f, 0.003119f, 0.003736f, 0.004700f, 0.005936f, 0.007858f, - 0.010498f, 0.013939f, 0.019913f, 0.028564f, 0.043060f, 0.069275f, 0.120972f, 0.225830f, - 0.416748f, 0.642090f, 0.798828f, 0.881836f, 0.924805f, 0.948730f, 0.962891f, 0.971191f, - 0.978516f, 0.982422f, 0.985352f, 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993164f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000121f, 0.000122f, 0.000475f, 0.000486f, 0.000487f, 0.000714f, 0.000913f, - 0.001296f, 0.001350f, 0.001884f, 0.002163f, 0.002871f, 0.003702f, 0.004578f, 0.005573f, - 0.007278f, 0.009819f, 0.013039f, 0.017883f, 0.025589f, 0.037445f, 0.058655f, 0.099243f, - 0.180542f, 0.338867f, 0.563965f, 0.751465f, 0.857422f, 0.912109f, 0.941406f, 0.958496f, - 0.968262f, 0.976074f, 0.980957f, 0.984375f, 0.986816f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000242f, 0.000417f, 0.000607f, 0.000602f, 0.000644f, - 0.001016f, 0.001223f, 0.001337f, 0.002010f, 0.002087f, 0.002752f, 0.003380f, 0.004486f, - 0.005760f, 0.007523f, 0.009048f, 0.012169f, 0.016312f, 0.022949f, 0.033295f, 0.050812f, - 0.082886f, 0.146851f, 0.275635f, 0.486572f, 0.696777f, 0.828613f, 0.896484f, 0.933594f, - 0.953613f, 0.965820f, 0.973633f, 0.979980f, 0.983887f, 0.986328f, 0.988770f, 0.990723f, - 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000262f, 0.000463f, 0.000603f, 0.000665f, - 0.000716f, 0.001069f, 0.001322f, 0.001538f, 0.001895f, 0.002293f, 0.003120f, 0.003323f, - 0.004166f, 0.005638f, 0.006828f, 0.008942f, 0.011368f, 0.015465f, 0.021057f, 0.029663f, - 0.044861f, 0.070923f, 0.123169f, 0.228149f, 0.416504f, 0.640137f, 0.797363f, 0.880859f, - 0.924805f, 0.948730f, 0.963379f, 0.971680f, 0.978516f, 0.982422f, 0.985840f, 0.988281f, - 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000120f, 0.000172f, 0.000243f, 0.000365f, 0.000475f, 0.000607f, - 0.000608f, 0.000609f, 0.001013f, 0.001424f, 0.001456f, 0.001904f, 0.002411f, 0.002903f, - 0.003145f, 0.004314f, 0.004944f, 0.006607f, 0.008156f, 0.010719f, 0.014297f, 0.018906f, - 0.027069f, 0.040070f, 0.062103f, 0.104858f, 0.191162f, 0.355469f, 0.581543f, 0.762695f, - 0.863281f, 0.915039f, 0.943848f, 0.960449f, 0.970703f, 0.977051f, 0.981445f, 0.985840f, - 0.987793f, 0.989746f, 0.991211f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.997070f, 0.997070f, 0.998047f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000096f, 0.000239f, 0.000241f, 0.000336f, 0.000482f, - 0.000719f, 0.000729f, 0.000831f, 0.001049f, 0.001552f, 0.001576f, 0.001710f, 0.002373f, - 0.002846f, 0.003254f, 0.004051f, 0.005035f, 0.006405f, 0.007706f, 0.009987f, 0.013092f, - 0.017715f, 0.024872f, 0.035980f, 0.055328f, 0.091248f, 0.163330f, 0.305664f, 0.524902f, - 0.726562f, 0.845215f, 0.906250f, 0.938965f, 0.957031f, 0.969238f, 0.976074f, 0.981445f, - 0.984863f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000000f, 0.000000f, 0.000118f, 0.000120f, 0.000351f, 0.000364f, 0.000421f, - 0.000480f, 0.000606f, 0.000728f, 0.000852f, 0.001175f, 0.001535f, 0.001673f, 0.001671f, - 0.002277f, 0.002743f, 0.003220f, 0.003922f, 0.004868f, 0.005951f, 0.007488f, 0.009430f, - 0.012527f, 0.016266f, 0.022964f, 0.033142f, 0.049805f, 0.080688f, 0.141846f, 0.265625f, - 0.473145f, 0.688477f, 0.825684f, 0.897949f, 0.934082f, 0.954102f, 0.966797f, 0.975098f, - 0.980469f, 0.984375f, 0.987305f, 0.989258f, 0.991211f, 0.992676f, 0.993164f, 0.993652f, - 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000058f, 0.000235f, 0.000360f, 0.000243f, - 0.000440f, 0.000583f, 0.000847f, 0.000851f, 0.000852f, 0.001189f, 0.001411f, 0.001645f, - 0.001898f, 0.002417f, 0.002617f, 0.003435f, 0.003695f, 0.004616f, 0.005733f, 0.007278f, - 0.009216f, 0.012016f, 0.015701f, 0.021561f, 0.030396f, 0.045746f, 0.073120f, 0.125732f, - 0.233521f, 0.428223f, 0.653320f, 0.807617f, 0.887695f, 0.929688f, 0.951660f, 0.965820f, - 0.974121f, 0.980469f, 0.984375f, 0.986816f, 0.989746f, 0.991211f, 0.992676f, 0.993164f, - 0.994141f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000237f, 0.000237f, 0.000362f, - 0.000365f, 0.000558f, 0.000814f, 0.000727f, 0.000729f, 0.000935f, 0.001189f, 0.001403f, - 0.001569f, 0.001989f, 0.002216f, 0.002533f, 0.003307f, 0.003906f, 0.004463f, 0.005646f, - 0.006908f, 0.008980f, 0.011230f, 0.014755f, 0.020020f, 0.028320f, 0.041931f, 0.065979f, - 0.113098f, 0.209229f, 0.389648f, 0.620605f, 0.789551f, 0.879395f, 0.924805f, 0.950684f, - 0.964844f, 0.974121f, 0.979980f, 0.983398f, 0.987305f, 0.989258f, 0.991211f, 0.992676f, - 0.993652f, 0.993652f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000121f, - 0.000241f, 0.000486f, 0.000575f, 0.000707f, 0.000726f, 0.000971f, 0.000849f, 0.000966f, - 0.001350f, 0.001660f, 0.001678f, 0.002224f, 0.002483f, 0.003197f, 0.003611f, 0.004200f, - 0.005318f, 0.006744f, 0.008476f, 0.010506f, 0.014145f, 0.019089f, 0.026627f, 0.039001f, - 0.061096f, 0.103333f, 0.189819f, 0.358887f, 0.591309f, 0.773438f, 0.872559f, 0.922363f, - 0.948730f, 0.963867f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f, 0.991211f, - 0.992188f, 0.993164f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000175f, 0.000361f, - 0.000481f, 0.000485f, 0.000364f, 0.000562f, 0.000703f, 0.000827f, 0.000842f, 0.000972f, - 0.001172f, 0.001321f, 0.001675f, 0.001684f, 0.002153f, 0.002455f, 0.003122f, 0.003391f, - 0.004177f, 0.005314f, 0.006325f, 0.007896f, 0.010368f, 0.013527f, 0.018082f, 0.025162f, - 0.037140f, 0.057343f, 0.095886f, 0.175659f, 0.334473f, 0.567871f, 0.760742f, 0.866699f, - 0.919922f, 0.947754f, 0.963379f, 0.972656f, 0.979492f, 0.984375f, 0.987305f, 0.989258f, - 0.991211f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997070f, - 0.998047f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000325f, - 0.000311f, 0.000243f, 0.000484f, 0.000486f, 0.000536f, 0.000698f, 0.000723f, 0.000844f, - 0.000972f, 0.001081f, 0.001312f, 0.001658f, 0.001914f, 0.001932f, 0.002390f, 0.003017f, - 0.003668f, 0.004353f, 0.005199f, 0.006336f, 0.007812f, 0.009972f, 0.012802f, 0.017029f, - 0.024200f, 0.035034f, 0.053833f, 0.090027f, 0.164185f, 0.316162f, 0.549805f, 0.751465f, - 0.863281f, 0.918457f, 0.947266f, 0.963379f, 0.974121f, 0.979492f, 0.984375f, 0.987793f, - 0.989746f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, - 0.000231f, 0.000453f, 0.000480f, 0.000484f, 0.000485f, 0.000486f, 0.000917f, 0.000963f, - 0.000969f, 0.000970f, 0.001043f, 0.001288f, 0.001523f, 0.001684f, 0.001885f, 0.002464f, - 0.002531f, 0.003565f, 0.004124f, 0.004745f, 0.006077f, 0.007580f, 0.009605f, 0.012634f, - 0.016953f, 0.023346f, 0.033386f, 0.051697f, 0.085632f, 0.156250f, 0.303955f, 0.537598f, - 0.746582f, 0.860840f, 0.918457f, 0.947754f, 0.963867f, 0.973633f, 0.979980f, 0.984863f, - 0.987793f, 0.990234f, 0.991699f, 0.993652f, 0.994141f, 0.995117f, 0.996094f, 0.996582f, - 0.997070f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000235f, 0.000239f, 0.000359f, 0.000484f, 0.000485f, 0.000486f, 0.000628f, - 0.000957f, 0.000967f, 0.000969f, 0.001065f, 0.001288f, 0.001602f, 0.001850f, 0.001995f, - 0.002409f, 0.002523f, 0.003462f, 0.003838f, 0.004993f, 0.005917f, 0.007233f, 0.009338f, - 0.012230f, 0.015610f, 0.022415f, 0.032288f, 0.049805f, 0.082947f, 0.151489f, 0.296631f, - 0.532715f, 0.745117f, 0.862793f, 0.919434f, 0.948242f, 0.964844f, 0.974609f, 0.980957f, - 0.985352f, 0.988281f, 0.990723f, 0.992676f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000187f, 0.000437f, 0.000473f, 0.000483f, 0.000485f, 0.000606f, - 0.000583f, 0.000711f, 0.000772f, 0.000968f, 0.001107f, 0.001287f, 0.001434f, 0.001662f, - 0.001984f, 0.002449f, 0.002634f, 0.003145f, 0.003777f, 0.004410f, 0.005722f, 0.007114f, - 0.008926f, 0.011696f, 0.016006f, 0.021683f, 0.031342f, 0.048309f, 0.080750f, 0.149170f, - 0.294678f, 0.534668f, 0.749512f, 0.866211f, 0.922363f, 0.950684f, 0.966309f, 0.975586f, - 0.981934f, 0.985840f, 0.989258f, 0.991699f, 0.992676f, 0.994141f, 0.994629f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000247f, 0.000238f, 0.000407f, 0.000482f, 0.000484f, - 0.000604f, 0.000869f, 0.000909f, 0.000721f, 0.000955f, 0.001000f, 0.001241f, 0.001342f, - 0.001655f, 0.001721f, 0.002329f, 0.002623f, 0.003086f, 0.003677f, 0.004349f, 0.005600f, - 0.006962f, 0.008835f, 0.011581f, 0.015274f, 0.021286f, 0.030884f, 0.047760f, 0.079895f, - 0.148926f, 0.298584f, 0.543945f, 0.758301f, 0.872559f, 0.925781f, 0.953125f, 0.967773f, - 0.977051f, 0.982910f, 0.986816f, 0.989258f, 0.991211f, 0.993164f, 0.994629f, 0.995605f, - 0.996094f, 0.996582f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000237f, 0.000410f, 0.000472f, 0.000481f, - 0.000483f, 0.000485f, 0.000687f, 0.000913f, 0.000956f, 0.000966f, 0.000997f, 0.001341f, - 0.001415f, 0.001813f, 0.002029f, 0.002043f, 0.002594f, 0.003210f, 0.003641f, 0.004734f, - 0.005356f, 0.006882f, 0.008675f, 0.011360f, 0.014816f, 0.020920f, 0.030380f, 0.047485f, - 0.080200f, 0.151733f, 0.308105f, 0.561523f, 0.772949f, 0.881348f, 0.931152f, 0.956055f, - 0.969727f, 0.978516f, 0.983887f, 0.987793f, 0.990234f, 0.992188f, 0.993652f, 0.994629f, - 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000254f, 0.000345f, 0.000468f, - 0.000585f, 0.000482f, 0.000603f, 0.000485f, 0.000862f, 0.000928f, 0.000965f, 0.001174f, - 0.001162f, 0.001405f, 0.001761f, 0.002016f, 0.002182f, 0.002733f, 0.002831f, 0.003504f, - 0.004456f, 0.005440f, 0.006775f, 0.008553f, 0.011055f, 0.014694f, 0.020859f, 0.030334f, - 0.047852f, 0.081970f, 0.157593f, 0.325439f, 0.586914f, 0.790527f, 0.890137f, 0.936523f, - 0.959473f, 0.973145f, 0.980469f, 0.985352f, 0.988770f, 0.990723f, 0.992676f, 0.994141f, - 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000241f, 0.000237f, 0.000340f, - 0.000457f, 0.000580f, 0.000481f, 0.000601f, 0.000605f, 0.000742f, 0.000951f, 0.000953f, - 0.001131f, 0.001257f, 0.001396f, 0.001730f, 0.001936f, 0.002102f, 0.002682f, 0.002762f, - 0.003733f, 0.004425f, 0.005344f, 0.006516f, 0.008354f, 0.010971f, 0.014793f, 0.020859f, - 0.030640f, 0.048859f, 0.085144f, 0.167358f, 0.350586f, 0.620117f, 0.811035f, 0.900391f, - 0.942383f, 0.963379f, 0.975098f, 0.981934f, 0.986816f, 0.989746f, 0.992188f, 0.993164f, - 0.994629f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000131f, - 0.000301f, 0.000430f, 0.000470f, 0.000593f, 0.000571f, 0.000587f, 0.000693f, 0.000906f, - 0.000959f, 0.000965f, 0.001094f, 0.001364f, 0.001522f, 0.001783f, 0.002094f, 0.002615f, - 0.003038f, 0.003365f, 0.004307f, 0.005135f, 0.006493f, 0.008347f, 0.011055f, 0.014824f, - 0.020844f, 0.031204f, 0.050507f, 0.090027f, 0.182129f, 0.385498f, 0.659668f, 0.834473f, - 0.913086f, 0.949219f, 0.967285f, 0.978027f, 0.983887f, 0.987793f, 0.991211f, 0.992188f, - 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000189f, 0.000122f, 0.000122f, - 0.000241f, 0.000295f, 0.000425f, 0.000457f, 0.000592f, 0.000481f, 0.000603f, 0.000697f, - 0.000926f, 0.000943f, 0.000960f, 0.001022f, 0.001435f, 0.001632f, 0.001658f, 0.002024f, - 0.002468f, 0.003010f, 0.003210f, 0.004124f, 0.005219f, 0.006351f, 0.008163f, 0.010933f, - 0.015030f, 0.021271f, 0.032257f, 0.053009f, 0.097534f, 0.203003f, 0.432373f, 0.704102f, - 0.858887f, 0.924805f, 0.955566f, 0.970703f, 0.979492f, 0.985840f, 0.989258f, 0.991699f, - 0.993164f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f, - 0.000201f, 0.000239f, 0.000241f, 0.000383f, 0.000461f, 0.000474f, 0.000479f, 0.000598f, - 0.000736f, 0.000905f, 0.000947f, 0.001072f, 0.001180f, 0.001376f, 0.001572f, 0.001752f, - 0.001900f, 0.002258f, 0.002792f, 0.003487f, 0.004055f, 0.005161f, 0.006424f, 0.008209f, - 0.010933f, 0.015030f, 0.021942f, 0.033630f, 0.056671f, 0.107666f, 0.233276f, 0.492188f, - 0.752441f, 0.881836f, 0.937012f, 0.961914f, 0.975098f, 0.982910f, 0.987305f, 0.990234f, - 0.992676f, 0.994629f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000132f, - 0.000224f, 0.000129f, 0.000237f, 0.000240f, 0.000337f, 0.000430f, 0.000468f, 0.000579f, - 0.000593f, 0.000602f, 0.000881f, 0.000936f, 0.000956f, 0.000963f, 0.001282f, 0.001519f, - 0.001607f, 0.001852f, 0.002150f, 0.002737f, 0.003508f, 0.003990f, 0.005077f, 0.006516f, - 0.008179f, 0.011185f, 0.015511f, 0.022446f, 0.035614f, 0.061859f, 0.122681f, 0.275879f, - 0.563965f, 0.798828f, 0.903809f, 0.946777f, 0.967773f, 0.978516f, 0.984863f, 0.988770f, - 0.991699f, 0.993652f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000149f, 0.000122f, 0.000207f, 0.000371f, 0.000430f, 0.000573f, - 0.000591f, 0.000598f, 0.000597f, 0.000804f, 0.000901f, 0.000948f, 0.001053f, 0.001083f, - 0.001376f, 0.001584f, 0.001878f, 0.002331f, 0.002529f, 0.003376f, 0.003944f, 0.005230f, - 0.006504f, 0.008537f, 0.011459f, 0.015747f, 0.024002f, 0.038361f, 0.069458f, 0.144409f, - 0.336914f, 0.644043f, 0.841797f, 0.922363f, 0.957520f, 0.972656f, 0.981934f, 0.987305f, - 0.990234f, 0.993164f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000234f, 0.000235f, 0.000268f, 0.000400f, - 0.000448f, 0.000585f, 0.000590f, 0.000599f, 0.000641f, 0.000788f, 0.000930f, 0.000968f, - 0.001107f, 0.001251f, 0.001656f, 0.001701f, 0.002047f, 0.002691f, 0.003437f, 0.003998f, - 0.004829f, 0.006329f, 0.008492f, 0.011757f, 0.016525f, 0.025345f, 0.042297f, 0.080200f, - 0.177490f, 0.420654f, 0.724121f, 0.878906f, 0.938965f, 0.964355f, 0.977539f, 0.984863f, - 0.989746f, 0.992188f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000214f, 0.000235f, 0.000228f, 0.000240f, - 0.000429f, 0.000439f, 0.000574f, 0.000654f, 0.000583f, 0.000493f, 0.000788f, 0.000813f, - 0.000947f, 0.001062f, 0.001225f, 0.001569f, 0.001721f, 0.002048f, 0.002844f, 0.002979f, - 0.003902f, 0.004997f, 0.006454f, 0.008698f, 0.012192f, 0.018143f, 0.027634f, 0.047913f, - 0.095886f, 0.228394f, 0.526855f, 0.796875f, 0.910156f, 0.953125f, 0.973145f, 0.982422f, - 0.987793f, 0.991699f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000236f, - 0.000232f, 0.000299f, 0.000446f, 0.000417f, 0.000466f, 0.000580f, 0.000508f, 0.000710f, - 0.000800f, 0.000940f, 0.000954f, 0.001228f, 0.001496f, 0.001631f, 0.002043f, 0.002798f, - 0.003359f, 0.004139f, 0.004951f, 0.006680f, 0.008995f, 0.012764f, 0.018860f, 0.030823f, - 0.056061f, 0.120911f, 0.307617f, 0.645508f, 0.855957f, 0.934082f, 0.964355f, 0.978516f, - 0.985840f, 0.990234f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000226f, - 0.000122f, 0.000226f, 0.000373f, 0.000272f, 0.000325f, 0.000460f, 0.000471f, 0.000477f, - 0.000673f, 0.000877f, 0.000929f, 0.000951f, 0.001129f, 0.001446f, 0.001614f, 0.002096f, - 0.002619f, 0.002939f, 0.003941f, 0.005363f, 0.006844f, 0.009491f, 0.013596f, 0.020905f, - 0.035370f, 0.068420f, 0.161743f, 0.426270f, 0.755859f, 0.900879f, 0.952148f, 0.973145f, - 0.983398f, 0.989746f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000111f, 0.000236f, 0.000297f, 0.000368f, 0.000449f, 0.000467f, - 0.000588f, 0.000641f, 0.000813f, 0.000924f, 0.001035f, 0.001124f, 0.001348f, 0.001764f, - 0.001922f, 0.002439f, 0.003160f, 0.004005f, 0.005280f, 0.007107f, 0.010109f, 0.014748f, - 0.023148f, 0.041595f, 0.088440f, 0.232910f, 0.578125f, 0.841797f, 0.933594f, 0.965820f, - 0.980469f, 0.987305f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000014f, 0.000011f, 0.000116f, 0.000148f, 0.000128f, 0.000369f, 0.000418f, - 0.000563f, 0.000470f, 0.000592f, 0.000776f, 0.000901f, 0.000937f, 0.001112f, 0.001348f, - 0.001743f, 0.001904f, 0.002470f, 0.003187f, 0.003986f, 0.005360f, 0.007557f, 0.010674f, - 0.016068f, 0.026871f, 0.051666f, 0.122925f, 0.356445f, 0.729492f, 0.901855f, 0.955078f, - 0.976074f, 0.985840f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.000122f, 0.000122f, 0.000121f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000028f, 0.000019f, 0.000014f, 0.000011f, 0.000033f, 0.000118f, 0.000247f, 0.000305f, - 0.000412f, 0.000447f, 0.000576f, 0.000587f, 0.000693f, 0.000850f, 0.000949f, 0.001083f, - 0.001319f, 0.001557f, 0.001957f, 0.002424f, 0.003340f, 0.004417f, 0.005688f, 0.007774f, - 0.011497f, 0.017731f, 0.032257f, 0.068604f, 0.189575f, 0.541992f, 0.843262f, 0.938477f, - 0.970703f, 0.983887f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000121f, 0.000118f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000067f, - 0.000042f, 0.000028f, 0.000020f, 0.000015f, 0.000066f, 0.000009f, 0.000101f, 0.000118f, - 0.000260f, 0.000358f, 0.000520f, 0.000456f, 0.000563f, 0.000711f, 0.000872f, 0.000980f, - 0.001059f, 0.001309f, 0.001699f, 0.002066f, 0.002708f, 0.003248f, 0.004166f, 0.005836f, - 0.008224f, 0.012619f, 0.021484f, 0.041260f, 0.101074f, 0.323486f, 0.733887f, 0.912109f, - 0.962402f, 0.980957f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000000f, 0.000119f, 0.000119f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000105f, - 0.000067f, 0.000042f, 0.000029f, 0.000022f, 0.000015f, 0.000011f, 0.000040f, 0.000033f, - 0.000153f, 0.000204f, 0.000313f, 0.000501f, 0.000554f, 0.000575f, 0.000585f, 0.000778f, - 0.000925f, 0.000980f, 0.001245f, 0.001634f, 0.001989f, 0.002413f, 0.003433f, 0.004028f, - 0.005989f, 0.008911f, 0.014374f, 0.026443f, 0.057495f, 0.170166f, 0.549805f, 0.864746f, - 0.951172f, 0.977051f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.995605f, 0.994629f, - 0.000000f, 0.000046f, 0.000088f, 0.000118f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000108f, 0.000069f, 0.000047f, 0.000030f, 0.000022f, 0.000016f, 0.000012f, 0.000052f, - 0.000081f, 0.000100f, 0.000184f, 0.000226f, 0.000400f, 0.000467f, 0.000452f, 0.000597f, - 0.000807f, 0.000895f, 0.000942f, 0.001219f, 0.001611f, 0.002022f, 0.002352f, 0.003222f, - 0.004177f, 0.006481f, 0.009850f, 0.017517f, 0.034668f, 0.090637f, 0.331055f, 0.776367f, - 0.932129f, 0.972656f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000107f, 0.000115f, 0.000112f, 0.000119f, 0.000118f, - 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000117f, 0.000072f, 0.000049f, 0.000032f, 0.000023f, 0.000017f, 0.000013f, - 0.000011f, 0.000008f, 0.000075f, 0.000151f, 0.000207f, 0.000305f, 0.000509f, 0.000499f, - 0.000560f, 0.000704f, 0.000863f, 0.000917f, 0.001220f, 0.001505f, 0.001740f, 0.002174f, - 0.003153f, 0.004559f, 0.007095f, 0.011826f, 0.022247f, 0.051147f, 0.173462f, 0.618652f, - 0.902344f, 0.966309f, 0.993164f, 0.993652f, 0.992676f, 0.992676f, 0.993164f, 0.993164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000060f, 0.000102f, 0.000113f, - 0.000117f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000078f, 0.000052f, 0.000038f, 0.000027f, 0.000019f, - 0.000015f, 0.000011f, 0.000054f, 0.000007f, 0.000085f, 0.000108f, 0.000258f, 0.000466f, - 0.000533f, 0.000560f, 0.000662f, 0.000849f, 0.000856f, 0.000965f, 0.001180f, 0.001678f, - 0.002075f, 0.003193f, 0.005016f, 0.008095f, 0.014343f, 0.030899f, 0.090820f, 0.401367f, - 0.848145f, 0.956543f, 0.992188f, 0.992188f, 0.992188f, 0.992676f, 0.991699f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000059f, 0.000096f, - 0.000107f, 0.000112f, 0.000115f, 0.000116f, 0.000117f, 0.000118f, 0.000118f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000088f, 0.000059f, 0.000041f, 0.000031f, - 0.000022f, 0.000017f, 0.000013f, 0.000010f, 0.000056f, 0.000091f, 0.000183f, 0.000201f, - 0.000309f, 0.000506f, 0.000547f, 0.000525f, 0.000629f, 0.000613f, 0.000817f, 0.001012f, - 0.001640f, 0.002420f, 0.003588f, 0.005520f, 0.009453f, 0.019119f, 0.050415f, 0.214722f, - 0.751465f, 0.943848f, 0.990723f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000055f, 0.000095f, 0.000103f, 0.000105f, 0.000112f, 0.000114f, 0.000115f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000105f, 0.000069f, 0.000048f, - 0.000035f, 0.000025f, 0.000019f, 0.000015f, 0.000011f, 0.000014f, 0.000008f, 0.000071f, - 0.000193f, 0.000311f, 0.000315f, 0.000524f, 0.000483f, 0.000558f, 0.000591f, 0.000705f, - 0.000950f, 0.001389f, 0.002428f, 0.003494f, 0.006321f, 0.012306f, 0.029480f, 0.108948f, - 0.581543f, 0.924316f, 0.989746f, 0.989746f, 0.989258f, 0.989746f, 0.989258f, 0.989746f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000069f, 0.000096f, 0.000103f, 0.000107f, - 0.000109f, 0.000112f, 0.000113f, 0.000115f, 0.000115f, 0.000116f, 0.000117f, 0.000117f, - 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000119f, 0.000119f, 0.000084f, - 0.000061f, 0.000042f, 0.000031f, 0.000023f, 0.000018f, 0.000014f, 0.000011f, 0.000009f, - 0.000095f, 0.000127f, 0.000223f, 0.000402f, 0.000432f, 0.000399f, 0.000494f, 0.000535f, - 0.000557f, 0.000933f, 0.001474f, 0.002300f, 0.004192f, 0.007919f, 0.017838f, 0.057068f, - 0.360840f, 0.890625f, 0.986816f, 0.987793f, 0.987305f, 0.987305f, 0.987793f, 0.987305f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000035f, 0.000041f, - 0.000088f, 0.000098f, 0.000103f, 0.000106f, 0.000110f, 0.000110f, 0.000113f, 0.000113f, - 0.000115f, 0.000116f, 0.000116f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000118f, - 0.000111f, 0.000074f, 0.000053f, 0.000038f, 0.000029f, 0.000022f, 0.000016f, 0.000013f, - 0.000010f, 0.000008f, 0.000073f, 0.000152f, 0.000296f, 0.000369f, 0.000365f, 0.000437f, - 0.000507f, 0.000661f, 0.000876f, 0.001451f, 0.002531f, 0.004898f, 0.010384f, 0.031113f, - 0.183838f, 0.833008f, 0.984375f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, 0.984863f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000024f, 0.000044f, 0.000073f, 0.000087f, 0.000097f, 0.000102f, 0.000105f, - 0.000108f, 0.000110f, 0.000111f, 0.000113f, 0.000114f, 0.000114f, 0.000115f, 0.000115f, - 0.000116f, 0.000116f, 0.000101f, 0.000070f, 0.000052f, 0.000037f, 0.000027f, 0.000021f, - 0.000016f, 0.000013f, 0.000010f, 0.000008f, 0.000083f, 0.000183f, 0.000352f, 0.000355f, - 0.000362f, 0.000365f, 0.000528f, 0.000790f, 0.001469f, 0.003029f, 0.005970f, 0.017242f, - 0.089050f, 0.728516f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000033f, 0.000041f, 0.000073f, - 0.000083f, 0.000088f, 0.000097f, 0.000102f, 0.000105f, 0.000108f, 0.000108f, 0.000111f, - 0.000112f, 0.000113f, 0.000113f, 0.000114f, 0.000097f, 0.000068f, 0.000049f, 0.000038f, - 0.000028f, 0.000021f, 0.000016f, 0.000013f, 0.000010f, 0.000056f, 0.000151f, 0.000243f, - 0.000264f, 0.000221f, 0.000328f, 0.000449f, 0.000850f, 0.001612f, 0.003340f, 0.009361f, - 0.043121f, 0.548340f, 0.976074f, 0.976562f, 0.975586f, 0.976074f, 0.976074f, 0.976562f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000019f, 0.000052f, 0.000065f, 0.000077f, 0.000088f, 0.000094f, 0.000098f, - 0.000100f, 0.000104f, 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000095f, 0.000069f, - 0.000052f, 0.000037f, 0.000028f, 0.000021f, 0.000017f, 0.000013f, 0.000025f, 0.000063f, - 0.000195f, 0.000233f, 0.000205f, 0.000264f, 0.000401f, 0.000789f, 0.001532f, 0.004520f, - 0.020844f, 0.321289f, 0.969238f, 0.968750f, 0.969238f, 0.968750f, 0.969238f, 0.969238f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000018f, 0.000039f, 0.000053f, - 0.000066f, 0.000079f, 0.000086f, 0.000090f, 0.000096f, 0.000100f, 0.000102f, 0.000105f, - 0.000098f, 0.000074f, 0.000053f, 0.000041f, 0.000031f, 0.000023f, 0.000017f, 0.000013f, - 0.000028f, 0.000139f, 0.000189f, 0.000179f, 0.000219f, 0.000333f, 0.000840f, 0.002119f, - 0.009193f, 0.144775f, 0.958496f, 0.958496f, 0.958008f, 0.958496f, 0.958008f, 0.958008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000025f, 0.000040f, 0.000052f, 0.000067f, 0.000077f, 0.000082f, - 0.000089f, 0.000093f, 0.000097f, 0.000079f, 0.000059f, 0.000044f, 0.000033f, 0.000024f, - 0.000018f, 0.000014f, 0.000034f, 0.000084f, 0.000157f, 0.000199f, 0.000309f, 0.000817f, - 0.003424f, 0.054901f, 0.940918f, 0.940918f, 0.940918f, 0.940918f, 0.941406f, 0.940430f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000021f, - 0.000040f, 0.000054f, 0.000063f, 0.000072f, 0.000078f, 0.000085f, 0.000065f, 0.000049f, - 0.000036f, 0.000026f, 0.000019f, 0.000014f, 0.000042f, 0.000114f, 0.000122f, 0.000276f, - 0.001024f, 0.016357f, 0.912109f, 0.912598f, 0.911621f, 0.912598f, 0.911621f, 0.913086f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000016f, 0.000032f, 0.000045f, 0.000056f, - 0.000065f, 0.000054f, 0.000039f, 0.000028f, 0.000019f, 0.000013f, 0.000049f, 0.000079f, - 0.000226f, 0.003199f, 0.860840f, 0.859863f, 0.860352f, 0.860840f, 0.860840f, 0.860352f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000004f, 0.000021f, 0.000035f, 0.000040f, 0.000027f, 0.000018f, 0.000013f, - 0.000033f, 0.000333f, 0.764160f, 0.765137f, 0.764648f, 0.764648f, 0.764648f, 0.765137f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, - 0.000011f, 0.000009f, 0.600586f, 0.602051f, 0.602051f, 0.601562f, 0.601074f, 0.601074f, - }, - { - 0.142456f, 0.713867f, 0.883789f, 0.933105f, 0.953613f, 0.964844f, 0.972168f, 0.977539f, - 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, - 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.012886f, 0.087646f, 0.360840f, 0.709473f, 0.859863f, 0.916992f, 0.943848f, 0.958496f, - 0.967773f, 0.973633f, 0.978516f, 0.980957f, 0.984375f, 0.986328f, 0.987793f, 0.988770f, - 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003895f, 0.020126f, 0.063599f, 0.188721f, 0.464844f, 0.727539f, 0.853027f, 0.909668f, - 0.938477f, 0.954590f, 0.965332f, 0.971680f, 0.976562f, 0.979980f, 0.982910f, 0.985840f, - 0.986816f, 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002062f, 0.008438f, 0.021774f, 0.049713f, 0.117676f, 0.279541f, 0.541016f, 0.751465f, - 0.855469f, 0.909180f, 0.936035f, 0.952637f, 0.963379f, 0.970703f, 0.975098f, 0.979492f, - 0.982910f, 0.984863f, 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.990723f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f, - 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001335f, 0.004597f, 0.010628f, 0.020844f, 0.040283f, 0.082764f, 0.177612f, 0.366211f, - 0.605469f, 0.773926f, 0.863281f, 0.910156f, 0.936035f, 0.952148f, 0.962402f, 0.969727f, - 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, - 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000851f, 0.002769f, 0.006130f, 0.010994f, 0.019394f, 0.034943f, 0.063293f, 0.122253f, - 0.244019f, 0.448242f, 0.660156f, 0.798828f, 0.872559f, 0.914062f, 0.937988f, 0.954102f, - 0.961914f, 0.970215f, 0.974609f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.987793f, - 0.988770f, 0.989746f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000466f, 0.001933f, 0.003809f, 0.007095f, 0.011353f, 0.018204f, 0.030029f, 0.050568f, - 0.090759f, 0.170898f, 0.318848f, 0.526367f, 0.708496f, 0.820801f, 0.884277f, 0.918457f, - 0.940918f, 0.954102f, 0.963867f, 0.970215f, 0.975098f, 0.978516f, 0.981934f, 0.984863f, - 0.986328f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000487f, 0.001685f, 0.002766f, 0.004467f, 0.007305f, 0.011215f, 0.017136f, 0.026489f, - 0.042419f, 0.071716f, 0.125244f, 0.228271f, 0.399658f, 0.599609f, 0.751953f, 0.842773f, - 0.894531f, 0.924805f, 0.943359f, 0.955566f, 0.965820f, 0.971191f, 0.976562f, 0.979980f, - 0.981934f, 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, - 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000965f, 0.002024f, 0.003202f, 0.005009f, 0.007050f, 0.011070f, 0.015869f, - 0.023987f, 0.036835f, 0.058563f, 0.097168f, 0.169800f, 0.297852f, 0.484131f, 0.664062f, - 0.789062f, 0.861816f, 0.905273f, 0.930176f, 0.947266f, 0.958984f, 0.967285f, 0.972168f, - 0.976562f, 0.980469f, 0.982910f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.990723f, - 0.992188f, 0.992188f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000974f, 0.001576f, 0.002403f, 0.003510f, 0.005344f, 0.007332f, 0.010567f, - 0.015099f, 0.022064f, 0.032104f, 0.048706f, 0.078003f, 0.130249f, 0.224243f, 0.378174f, - 0.566406f, 0.720703f, 0.820312f, 0.879883f, 0.915039f, 0.936523f, 0.951660f, 0.961426f, - 0.968262f, 0.974121f, 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.987793f, 0.989258f, - 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000240f, 0.000609f, 0.001096f, 0.001580f, 0.002674f, 0.004131f, 0.005245f, 0.007660f, - 0.010757f, 0.014221f, 0.019775f, 0.028381f, 0.041870f, 0.064697f, 0.103638f, 0.173706f, - 0.293945f, 0.466553f, 0.642090f, 0.769531f, 0.849121f, 0.895996f, 0.924316f, 0.942871f, - 0.956055f, 0.963867f, 0.970703f, 0.975098f, 0.979004f, 0.981934f, 0.984863f, 0.986328f, - 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, - 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000000f, 0.000608f, 0.001062f, 0.001268f, 0.002001f, 0.003099f, 0.003937f, 0.005379f, - 0.007595f, 0.010078f, 0.013176f, 0.018524f, 0.025787f, 0.036896f, 0.054932f, 0.085327f, - 0.137573f, 0.229980f, 0.376953f, 0.555664f, 0.708984f, 0.810547f, 0.873047f, 0.909180f, - 0.933594f, 0.948730f, 0.959961f, 0.967285f, 0.973145f, 0.977539f, 0.980469f, 0.983398f, - 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000606f, 0.000609f, 0.001317f, 0.001564f, 0.002674f, 0.003273f, 0.004402f, - 0.005630f, 0.007141f, 0.009514f, 0.012398f, 0.016678f, 0.023331f, 0.032776f, 0.047363f, - 0.071594f, 0.112610f, 0.183960f, 0.303711f, 0.470215f, 0.639648f, 0.766113f, 0.844727f, - 0.892090f, 0.921875f, 0.941895f, 0.954590f, 0.963379f, 0.970215f, 0.975098f, 0.979004f, - 0.981934f, 0.984863f, 0.986328f, 0.987793f, 0.989746f, 0.991211f, 0.991699f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, - 0.996582f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000727f, 0.000803f, 0.001575f, 0.002035f, 0.002821f, 0.003527f, - 0.004475f, 0.005421f, 0.007023f, 0.009491f, 0.011879f, 0.015976f, 0.021530f, 0.029587f, - 0.041809f, 0.061737f, 0.094360f, 0.150146f, 0.246460f, 0.393066f, 0.566406f, 0.712891f, - 0.812500f, 0.872070f, 0.909180f, 0.933105f, 0.948242f, 0.959961f, 0.967773f, 0.972656f, - 0.977539f, 0.980957f, 0.982910f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000244f, 0.000244f, 0.000471f, 0.000727f, 0.000967f, 0.001572f, 0.002161f, 0.002680f, - 0.003246f, 0.004337f, 0.005241f, 0.006950f, 0.009087f, 0.011497f, 0.015038f, 0.019913f, - 0.026688f, 0.037537f, 0.054352f, 0.080383f, 0.125122f, 0.202515f, 0.327148f, 0.493652f, - 0.656250f, 0.774414f, 0.849609f, 0.895508f, 0.923828f, 0.942383f, 0.954590f, 0.963867f, - 0.971191f, 0.975586f, 0.979004f, 0.982422f, 0.984863f, 0.987305f, 0.988281f, 0.989746f, - 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.000121f, 0.000244f, 0.000244f, 0.000715f, 0.001089f, 0.001278f, 0.001781f, 0.002275f, - 0.002548f, 0.003334f, 0.004150f, 0.005314f, 0.006824f, 0.008430f, 0.011200f, 0.014145f, - 0.018631f, 0.024750f, 0.033905f, 0.047760f, 0.069885f, 0.106445f, 0.169312f, 0.273682f, - 0.426270f, 0.596191f, 0.732422f, 0.823242f, 0.879883f, 0.914062f, 0.936035f, 0.950684f, - 0.960938f, 0.968750f, 0.973633f, 0.978516f, 0.981934f, 0.984375f, 0.986328f, 0.988281f, - 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, - 0.000241f, 0.000244f, 0.000365f, 0.000600f, 0.000961f, 0.000972f, 0.001621f, 0.001697f, - 0.002274f, 0.002684f, 0.003359f, 0.004238f, 0.005573f, 0.006691f, 0.008057f, 0.010529f, - 0.013832f, 0.017593f, 0.022812f, 0.031174f, 0.042786f, 0.061462f, 0.092407f, 0.143799f, - 0.231201f, 0.366943f, 0.535645f, 0.688477f, 0.794922f, 0.861816f, 0.902832f, 0.928711f, - 0.945801f, 0.957520f, 0.966797f, 0.972656f, 0.976562f, 0.980469f, 0.983398f, 0.985840f, - 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000243f, 0.000365f, 0.000365f, 0.000798f, 0.000968f, 0.001249f, 0.001528f, - 0.001798f, 0.002457f, 0.002798f, 0.003494f, 0.004353f, 0.005306f, 0.006363f, 0.008141f, - 0.010147f, 0.012596f, 0.016006f, 0.021423f, 0.028503f, 0.039185f, 0.055420f, 0.081116f, - 0.124390f, 0.198120f, 0.316895f, 0.478516f, 0.641113f, 0.763672f, 0.842773f, 0.891113f, - 0.921387f, 0.941406f, 0.954590f, 0.963867f, 0.970215f, 0.975586f, 0.979492f, 0.982910f, - 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000238f, 0.000365f, 0.000365f, 0.000598f, 0.000820f, 0.001200f, 0.001279f, - 0.001631f, 0.001736f, 0.002172f, 0.002874f, 0.003576f, 0.004391f, 0.005096f, 0.006176f, - 0.007545f, 0.009674f, 0.012505f, 0.015945f, 0.020187f, 0.026550f, 0.035706f, 0.049835f, - 0.072510f, 0.109253f, 0.171631f, 0.275391f, 0.426514f, 0.594238f, 0.730469f, 0.822754f, - 0.877930f, 0.913574f, 0.936523f, 0.951172f, 0.961426f, 0.969727f, 0.974609f, 0.978027f, - 0.982422f, 0.984863f, 0.986816f, 0.988770f, 0.989746f, 0.991699f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000364f, 0.000486f, 0.000487f, 0.000562f, 0.000822f, 0.000967f, - 0.001213f, 0.001871f, 0.001803f, 0.002485f, 0.002796f, 0.003410f, 0.004242f, 0.005070f, - 0.006153f, 0.007698f, 0.009262f, 0.011635f, 0.014709f, 0.019104f, 0.024521f, 0.033295f, - 0.045746f, 0.065674f, 0.096741f, 0.150635f, 0.241455f, 0.380127f, 0.548828f, 0.698242f, - 0.802246f, 0.867188f, 0.906738f, 0.931152f, 0.948242f, 0.959473f, 0.967285f, 0.973633f, - 0.978516f, 0.981445f, 0.984375f, 0.986328f, 0.988281f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000350f, 0.000483f, 0.000486f, 0.000604f, 0.000743f, 0.001093f, - 0.001187f, 0.001297f, 0.001601f, 0.001921f, 0.002501f, 0.002922f, 0.003296f, 0.004200f, - 0.005211f, 0.006054f, 0.007603f, 0.008904f, 0.011169f, 0.014091f, 0.017685f, 0.023331f, - 0.030991f, 0.042358f, 0.059326f, 0.087646f, 0.134521f, 0.213867f, 0.341309f, 0.506348f, - 0.665039f, 0.780762f, 0.854492f, 0.899414f, 0.927246f, 0.945312f, 0.957520f, 0.966309f, - 0.973145f, 0.977539f, 0.981445f, 0.984375f, 0.986328f, 0.988770f, 0.989746f, 0.991211f, - 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000120f, 0.000360f, 0.000485f, 0.000486f, 0.000487f, 0.000604f, - 0.000947f, 0.001201f, 0.001374f, 0.001715f, 0.002127f, 0.002239f, 0.002876f, 0.003426f, - 0.004063f, 0.005276f, 0.005810f, 0.006744f, 0.008713f, 0.010597f, 0.013680f, 0.016754f, - 0.021744f, 0.028778f, 0.039093f, 0.054901f, 0.079956f, 0.121399f, 0.191895f, 0.307861f, - 0.468262f, 0.633301f, 0.760742f, 0.842285f, 0.892090f, 0.923340f, 0.942383f, 0.956543f, - 0.965332f, 0.972168f, 0.977539f, 0.980469f, 0.983887f, 0.985840f, 0.988281f, 0.989746f, - 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000121f, 0.000219f, 0.000474f, 0.000484f, 0.000486f, 0.000487f, - 0.000720f, 0.001108f, 0.001199f, 0.001209f, 0.001689f, 0.002253f, 0.002489f, 0.002916f, - 0.003714f, 0.004040f, 0.005054f, 0.006001f, 0.006737f, 0.008713f, 0.010376f, 0.012665f, - 0.016251f, 0.020615f, 0.027145f, 0.036499f, 0.050720f, 0.073181f, 0.110474f, 0.174072f, - 0.280518f, 0.434570f, 0.604980f, 0.742188f, 0.830566f, 0.885742f, 0.918945f, 0.940918f, - 0.954102f, 0.964355f, 0.971680f, 0.977051f, 0.980957f, 0.984375f, 0.986816f, 0.988281f, - 0.989746f, 0.990723f, 0.992188f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000000f, 0.000120f, 0.000239f, 0.000319f, 0.000475f, 0.000484f, 0.000485f, - 0.000618f, 0.000844f, 0.001094f, 0.001201f, 0.001570f, 0.001782f, 0.002010f, 0.002407f, - 0.003046f, 0.003099f, 0.004208f, 0.004700f, 0.005882f, 0.006878f, 0.007980f, 0.009949f, - 0.012344f, 0.015358f, 0.019821f, 0.026047f, 0.034271f, 0.047455f, 0.067993f, 0.102112f, - 0.160034f, 0.258057f, 0.406494f, 0.578613f, 0.723633f, 0.820312f, 0.880371f, 0.916016f, - 0.938965f, 0.953125f, 0.963867f, 0.971191f, 0.976562f, 0.980469f, 0.983887f, 0.985840f, - 0.988770f, 0.989746f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996582f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000242f, 0.000455f, 0.000481f, 0.000583f, - 0.000601f, 0.000804f, 0.000912f, 0.001247f, 0.001319f, 0.001571f, 0.001793f, 0.002337f, - 0.002464f, 0.003099f, 0.003164f, 0.003809f, 0.004627f, 0.005764f, 0.006397f, 0.008118f, - 0.009605f, 0.011917f, 0.015083f, 0.018692f, 0.024384f, 0.032806f, 0.044983f, 0.063477f, - 0.095337f, 0.148560f, 0.240112f, 0.382324f, 0.556641f, 0.708984f, 0.812500f, 0.875488f, - 0.913574f, 0.937500f, 0.953125f, 0.963867f, 0.971191f, 0.977051f, 0.980957f, 0.983887f, - 0.986816f, 0.988281f, 0.990234f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995605f, - 0.995605f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000240f, 0.000242f, 0.000524f, 0.000597f, - 0.000604f, 0.000606f, 0.000674f, 0.001040f, 0.001238f, 0.001427f, 0.001637f, 0.001670f, - 0.002104f, 0.002432f, 0.002775f, 0.003416f, 0.003860f, 0.004482f, 0.005573f, 0.006374f, - 0.007828f, 0.009384f, 0.011635f, 0.014175f, 0.018219f, 0.023224f, 0.031052f, 0.042603f, - 0.060730f, 0.089661f, 0.139526f, 0.225464f, 0.363525f, 0.538574f, 0.696289f, 0.806152f, - 0.872559f, 0.912109f, 0.937012f, 0.952637f, 0.963867f, 0.971191f, 0.976562f, 0.981445f, - 0.984863f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000192f, 0.000240f, 0.000242f, 0.000535f, - 0.000478f, 0.000600f, 0.000843f, 0.000925f, 0.001027f, 0.001236f, 0.001502f, 0.001490f, - 0.001658f, 0.002256f, 0.002430f, 0.002880f, 0.003056f, 0.003983f, 0.004292f, 0.005333f, - 0.006264f, 0.007393f, 0.009064f, 0.011131f, 0.013741f, 0.017242f, 0.022690f, 0.029922f, - 0.040680f, 0.057831f, 0.085022f, 0.132446f, 0.214844f, 0.349121f, 0.524414f, 0.688477f, - 0.801758f, 0.871094f, 0.912109f, 0.937500f, 0.953125f, 0.964355f, 0.971680f, 0.977539f, - 0.981445f, 0.985352f, 0.987305f, 0.989258f, 0.991211f, 0.992188f, 0.993652f, 0.994629f, - 0.995117f, 0.995605f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000232f, 0.000233f, 0.000363f, - 0.000457f, 0.000714f, 0.000724f, 0.000727f, 0.000847f, 0.000992f, 0.001177f, 0.001525f, - 0.001560f, 0.001740f, 0.002090f, 0.002329f, 0.002718f, 0.003372f, 0.003902f, 0.004307f, - 0.005184f, 0.005886f, 0.007446f, 0.008667f, 0.010574f, 0.013588f, 0.016556f, 0.021744f, - 0.028854f, 0.039124f, 0.055176f, 0.081726f, 0.127075f, 0.206421f, 0.338867f, 0.515625f, - 0.683105f, 0.800293f, 0.870605f, 0.912598f, 0.937500f, 0.954590f, 0.965332f, 0.973145f, - 0.978516f, 0.982422f, 0.985840f, 0.988281f, 0.989746f, 0.991211f, 0.992676f, 0.993652f, - 0.994141f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000103f, 0.000120f, 0.000240f, 0.000240f, - 0.000484f, 0.000574f, 0.000596f, 0.000837f, 0.000820f, 0.000859f, 0.000985f, 0.001070f, - 0.001509f, 0.001554f, 0.001785f, 0.002214f, 0.002476f, 0.002754f, 0.002991f, 0.003487f, - 0.004303f, 0.005074f, 0.005920f, 0.007126f, 0.008743f, 0.010361f, 0.013023f, 0.016403f, - 0.021011f, 0.027817f, 0.037811f, 0.053375f, 0.079041f, 0.123291f, 0.201172f, 0.333252f, - 0.511719f, 0.682129f, 0.801270f, 0.872070f, 0.914062f, 0.939941f, 0.955078f, 0.966309f, - 0.973633f, 0.979004f, 0.982910f, 0.986328f, 0.988770f, 0.990234f, 0.991699f, 0.992676f, - 0.993652f, 0.995117f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000079f, 0.000053f, 0.000118f, 0.000418f, - 0.000358f, 0.000363f, 0.000678f, 0.000708f, 0.000825f, 0.000838f, 0.000878f, 0.001146f, - 0.000978f, 0.001483f, 0.001541f, 0.001769f, 0.001812f, 0.002434f, 0.002699f, 0.003225f, - 0.003298f, 0.004002f, 0.004948f, 0.005932f, 0.007084f, 0.008461f, 0.010414f, 0.012665f, - 0.015915f, 0.020615f, 0.027023f, 0.036743f, 0.051941f, 0.077332f, 0.120789f, 0.198608f, - 0.331543f, 0.512695f, 0.686523f, 0.805664f, 0.875488f, 0.917480f, 0.941406f, 0.957031f, - 0.968262f, 0.975098f, 0.980469f, 0.983887f, 0.986816f, 0.989258f, 0.990723f, 0.992188f, - 0.993164f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998535f, 0.998535f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000109f, 0.000232f, 0.000349f, - 0.000478f, 0.000483f, 0.000483f, 0.000609f, 0.000795f, 0.000835f, 0.000806f, 0.000726f, - 0.001022f, 0.001222f, 0.001442f, 0.001536f, 0.001650f, 0.001714f, 0.002377f, 0.002588f, - 0.003159f, 0.003643f, 0.004036f, 0.004929f, 0.005718f, 0.006813f, 0.008072f, 0.009880f, - 0.012527f, 0.015854f, 0.020035f, 0.026352f, 0.035950f, 0.051178f, 0.076416f, 0.119751f, - 0.198730f, 0.334229f, 0.519531f, 0.694824f, 0.812988f, 0.880859f, 0.920898f, 0.944336f, - 0.958984f, 0.969727f, 0.976562f, 0.980957f, 0.984863f, 0.987793f, 0.989746f, 0.991211f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000068f, 0.000265f, - 0.000361f, 0.000478f, 0.000480f, 0.000479f, 0.000568f, 0.000693f, 0.000714f, 0.000806f, - 0.000843f, 0.000919f, 0.001222f, 0.001376f, 0.001531f, 0.001554f, 0.001987f, 0.002342f, - 0.002558f, 0.002798f, 0.003132f, 0.004021f, 0.004864f, 0.005455f, 0.006664f, 0.008110f, - 0.009613f, 0.011955f, 0.015335f, 0.019608f, 0.025879f, 0.035522f, 0.050629f, 0.075623f, - 0.120239f, 0.201416f, 0.342041f, 0.533203f, 0.707031f, 0.821777f, 0.887695f, 0.925293f, - 0.946777f, 0.961914f, 0.971680f, 0.977539f, 0.982422f, 0.985352f, 0.988281f, 0.989746f, - 0.992188f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, - 0.000322f, 0.000241f, 0.000478f, 0.000480f, 0.000480f, 0.000510f, 0.000695f, 0.000710f, - 0.000958f, 0.000765f, 0.001075f, 0.001116f, 0.001318f, 0.001606f, 0.001546f, 0.001916f, - 0.002306f, 0.002499f, 0.002905f, 0.003202f, 0.003914f, 0.004498f, 0.005459f, 0.006611f, - 0.007687f, 0.009331f, 0.011757f, 0.014923f, 0.019241f, 0.025833f, 0.035492f, 0.050507f, - 0.076233f, 0.122131f, 0.207153f, 0.355225f, 0.551758f, 0.724609f, 0.833496f, 0.894531f, - 0.930664f, 0.951660f, 0.964844f, 0.973145f, 0.979492f, 0.983887f, 0.986816f, 0.989258f, - 0.991211f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000351f, 0.000458f, 0.000476f, 0.000480f, 0.000482f, 0.000528f, 0.000650f, - 0.000704f, 0.000956f, 0.000828f, 0.000963f, 0.001111f, 0.001265f, 0.001474f, 0.001806f, - 0.001872f, 0.002308f, 0.002445f, 0.002701f, 0.003229f, 0.003851f, 0.004375f, 0.005356f, - 0.006317f, 0.007458f, 0.009300f, 0.011574f, 0.014725f, 0.019165f, 0.025696f, 0.035461f, - 0.050812f, 0.077637f, 0.125977f, 0.216797f, 0.374756f, 0.576660f, 0.745117f, 0.848145f, - 0.904785f, 0.936523f, 0.956055f, 0.967773f, 0.975586f, 0.980957f, 0.984863f, 0.987793f, - 0.990234f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000292f, 0.000224f, 0.000452f, 0.000453f, 0.000479f, 0.000480f, 0.000517f, - 0.000614f, 0.000902f, 0.000712f, 0.000959f, 0.000978f, 0.001100f, 0.001276f, 0.001461f, - 0.001524f, 0.001651f, 0.002041f, 0.002350f, 0.002853f, 0.003433f, 0.003622f, 0.004166f, - 0.005043f, 0.006187f, 0.007534f, 0.009209f, 0.011551f, 0.014908f, 0.019012f, 0.025406f, - 0.035461f, 0.051575f, 0.079651f, 0.131714f, 0.230957f, 0.401367f, 0.607910f, 0.769531f, - 0.863281f, 0.914062f, 0.942871f, 0.959961f, 0.970703f, 0.978027f, 0.982910f, 0.986816f, - 0.988770f, 0.991699f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000238f, 0.000355f, 0.000449f, 0.000462f, 0.000474f, 0.000477f, - 0.000482f, 0.000846f, 0.000726f, 0.000706f, 0.000953f, 0.000889f, 0.001012f, 0.001259f, - 0.001390f, 0.001755f, 0.001658f, 0.002060f, 0.002369f, 0.002539f, 0.003170f, 0.003460f, - 0.004131f, 0.004993f, 0.006008f, 0.007431f, 0.009109f, 0.011444f, 0.014252f, 0.019058f, - 0.025574f, 0.036011f, 0.053162f, 0.083435f, 0.140381f, 0.250488f, 0.436035f, 0.645996f, - 0.795898f, 0.880371f, 0.924316f, 0.949219f, 0.963867f, 0.973145f, 0.980469f, 0.984863f, - 0.988281f, 0.990723f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000239f, 0.000306f, 0.000440f, 0.000437f, 0.000474f, - 0.000478f, 0.000481f, 0.000523f, 0.000664f, 0.000731f, 0.000802f, 0.000935f, 0.001022f, - 0.001173f, 0.001314f, 0.001504f, 0.001831f, 0.001984f, 0.002317f, 0.002472f, 0.003199f, - 0.003370f, 0.004189f, 0.004868f, 0.005924f, 0.007320f, 0.008926f, 0.011421f, 0.014595f, - 0.019119f, 0.026260f, 0.036987f, 0.055176f, 0.088440f, 0.152466f, 0.277832f, 0.479980f, - 0.686523f, 0.823242f, 0.895508f, 0.933105f, 0.955566f, 0.969238f, 0.976562f, 0.982422f, - 0.986816f, 0.989746f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000280f, 0.000417f, 0.000448f, - 0.000468f, 0.000476f, 0.000479f, 0.000490f, 0.000845f, 0.000688f, 0.000740f, 0.000945f, - 0.000998f, 0.001148f, 0.001266f, 0.001414f, 0.001475f, 0.001667f, 0.002262f, 0.002537f, - 0.003019f, 0.003288f, 0.004223f, 0.004768f, 0.005890f, 0.007259f, 0.009026f, 0.011360f, - 0.014297f, 0.019272f, 0.026474f, 0.038116f, 0.058197f, 0.095032f, 0.168945f, 0.313965f, - 0.533203f, 0.731445f, 0.850098f, 0.911133f, 0.942871f, 0.961914f, 0.972656f, 0.979980f, - 0.984863f, 0.988770f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000187f, 0.000233f, 0.000141f, 0.000271f, 0.000341f, - 0.000380f, 0.000465f, 0.000473f, 0.000590f, 0.000605f, 0.000798f, 0.000847f, 0.000934f, - 0.000946f, 0.000836f, 0.001009f, 0.001142f, 0.001430f, 0.001495f, 0.001850f, 0.002111f, - 0.002541f, 0.003035f, 0.003300f, 0.004139f, 0.004913f, 0.005718f, 0.007141f, 0.008934f, - 0.011475f, 0.014832f, 0.019653f, 0.027573f, 0.039917f, 0.062225f, 0.104919f, 0.192017f, - 0.362305f, 0.594238f, 0.775879f, 0.875977f, 0.925293f, 0.952148f, 0.967773f, 0.977051f, - 0.983398f, 0.988281f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000238f, 0.000243f, - 0.000238f, 0.000424f, 0.000453f, 0.000467f, 0.000475f, 0.000581f, 0.000689f, 0.000795f, - 0.000634f, 0.000823f, 0.001014f, 0.000900f, 0.001083f, 0.001485f, 0.001731f, 0.001851f, - 0.002056f, 0.002373f, 0.002621f, 0.003445f, 0.004082f, 0.004578f, 0.005821f, 0.007217f, - 0.008881f, 0.011330f, 0.014778f, 0.020416f, 0.028473f, 0.042419f, 0.067993f, 0.118286f, - 0.225342f, 0.425293f, 0.661621f, 0.818848f, 0.899902f, 0.939453f, 0.960449f, 0.973145f, - 0.980957f, 0.985840f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000224f, 0.000122f, - 0.000231f, 0.000245f, 0.000411f, 0.000520f, 0.000463f, 0.000470f, 0.000587f, 0.000361f, - 0.000712f, 0.000694f, 0.000815f, 0.000978f, 0.001055f, 0.001105f, 0.001390f, 0.001438f, - 0.001705f, 0.001984f, 0.002333f, 0.002546f, 0.003408f, 0.003876f, 0.004627f, 0.005783f, - 0.007198f, 0.008995f, 0.011383f, 0.015396f, 0.020828f, 0.030029f, 0.045654f, 0.075439f, - 0.137451f, 0.271973f, 0.503418f, 0.728516f, 0.857910f, 0.920410f, 0.951172f, 0.968262f, - 0.977539f, 0.984375f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000173f, 0.000150f, 0.000278f, 0.000376f, 0.000427f, 0.000470f, 0.000352f, 0.000356f, - 0.000475f, 0.000441f, 0.000709f, 0.000774f, 0.000970f, 0.001013f, 0.000998f, 0.001193f, - 0.001397f, 0.001677f, 0.001957f, 0.002268f, 0.002529f, 0.003353f, 0.003874f, 0.004555f, - 0.005692f, 0.007160f, 0.008987f, 0.011543f, 0.015732f, 0.021896f, 0.032135f, 0.050140f, - 0.086548f, 0.165894f, 0.337646f, 0.593750f, 0.791504f, 0.892090f, 0.938477f, 0.961914f, - 0.974609f, 0.982422f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000187f, 0.000130f, 0.000231f, 0.000315f, 0.000298f, 0.000332f, 0.000343f, - 0.000465f, 0.000472f, 0.000579f, 0.000717f, 0.000839f, 0.000932f, 0.000817f, 0.001086f, - 0.001090f, 0.001545f, 0.001735f, 0.001837f, 0.002485f, 0.002493f, 0.003288f, 0.003828f, - 0.004520f, 0.005833f, 0.007156f, 0.009193f, 0.012123f, 0.015839f, 0.022934f, 0.034760f, - 0.056488f, 0.102600f, 0.208862f, 0.427734f, 0.687988f, 0.846191f, 0.919434f, 0.952637f, - 0.969727f, 0.979980f, 0.993652f, 0.994629f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000133f, 0.000141f, 0.000234f, 0.000300f, 0.000397f, - 0.000436f, 0.000456f, 0.000465f, 0.000534f, 0.000663f, 0.000810f, 0.000796f, 0.000812f, - 0.001062f, 0.001237f, 0.001428f, 0.001565f, 0.001818f, 0.002182f, 0.002783f, 0.002943f, - 0.003773f, 0.004715f, 0.005482f, 0.007195f, 0.009285f, 0.012207f, 0.016922f, 0.024567f, - 0.038483f, 0.066101f, 0.127563f, 0.274170f, 0.540527f, 0.774414f, 0.891113f, 0.940430f, - 0.965332f, 0.977539f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000124f, 0.000116f, 0.000119f, 0.000125f, 0.000121f, 0.000197f, - 0.000323f, 0.000418f, 0.000446f, 0.000433f, 0.000467f, 0.000612f, 0.000710f, 0.000783f, - 0.000911f, 0.000817f, 0.001161f, 0.001343f, 0.001514f, 0.001707f, 0.002081f, 0.002386f, - 0.002882f, 0.003609f, 0.004627f, 0.005478f, 0.007011f, 0.009384f, 0.012695f, 0.017960f, - 0.026901f, 0.044067f, 0.080078f, 0.167114f, 0.374023f, 0.664062f, 0.845703f, 0.923340f, - 0.957031f, 0.974121f, 0.992676f, 0.993652f, 0.993164f, 0.993652f, 0.993652f, 0.993164f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000121f, 0.000121f, 0.000052f, 0.000039f, 0.000029f, 0.000054f, 0.000045f, 0.000118f, - 0.000128f, 0.000231f, 0.000387f, 0.000429f, 0.000446f, 0.000544f, 0.000539f, 0.000648f, - 0.000749f, 0.000790f, 0.000978f, 0.001102f, 0.001195f, 0.001501f, 0.001761f, 0.001978f, - 0.002661f, 0.003170f, 0.003519f, 0.004509f, 0.005344f, 0.007004f, 0.009361f, 0.013229f, - 0.019196f, 0.030258f, 0.052002f, 0.102661f, 0.234131f, 0.511230f, 0.774902f, 0.898438f, - 0.947754f, 0.970215f, 0.992188f, 0.992676f, 0.993164f, 0.992676f, 0.992188f, 0.992188f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000070f, 0.000052f, 0.000038f, 0.000030f, 0.000023f, 0.000060f, - 0.000116f, 0.000121f, 0.000252f, 0.000337f, 0.000306f, 0.000435f, 0.000450f, 0.000562f, - 0.000584f, 0.000722f, 0.000858f, 0.000888f, 0.000969f, 0.001230f, 0.001429f, 0.001576f, - 0.001827f, 0.002361f, 0.002863f, 0.003267f, 0.004047f, 0.005394f, 0.007256f, 0.009781f, - 0.013855f, 0.021439f, 0.035034f, 0.065063f, 0.141724f, 0.346680f, 0.665527f, 0.859375f, - 0.934570f, 0.965820f, 0.991699f, 0.991699f, 0.991699f, 0.992188f, 0.991699f, 0.991699f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000099f, 0.000069f, 0.000051f, 0.000039f, 0.000030f, 0.000023f, - 0.000024f, 0.000115f, 0.000103f, 0.000224f, 0.000204f, 0.000339f, 0.000407f, 0.000437f, - 0.000452f, 0.000489f, 0.000663f, 0.000821f, 0.000922f, 0.001004f, 0.001086f, 0.001279f, - 0.001554f, 0.001651f, 0.001997f, 0.002390f, 0.003136f, 0.004223f, 0.005508f, 0.007339f, - 0.010094f, 0.014854f, 0.024048f, 0.042664f, 0.087036f, 0.213867f, 0.516113f, 0.799805f, - 0.915527f, 0.958984f, 0.990723f, 0.991211f, 0.990723f, 0.990723f, 0.990723f, 0.991211f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000096f, 0.000073f, 0.000053f, 0.000040f, 0.000031f, - 0.000025f, 0.000020f, 0.000017f, 0.000105f, 0.000110f, 0.000135f, 0.000235f, 0.000380f, - 0.000462f, 0.000513f, 0.000556f, 0.000638f, 0.000804f, 0.000868f, 0.000897f, 0.001002f, - 0.001079f, 0.001246f, 0.001596f, 0.002153f, 0.002213f, 0.003094f, 0.004158f, 0.005306f, - 0.007458f, 0.010887f, 0.017166f, 0.028748f, 0.055176f, 0.128174f, 0.350586f, 0.703613f, - 0.888184f, 0.951172f, 0.988770f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, - 0.000122f, 0.000120f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000101f, 0.000073f, 0.000057f, 0.000043f, - 0.000033f, 0.000027f, 0.000021f, 0.000018f, 0.000105f, 0.000112f, 0.000111f, 0.000161f, - 0.000320f, 0.000390f, 0.000421f, 0.000438f, 0.000559f, 0.000665f, 0.000735f, 0.000719f, - 0.000704f, 0.000887f, 0.001223f, 0.001384f, 0.001867f, 0.002462f, 0.003216f, 0.004032f, - 0.005367f, 0.007988f, 0.012054f, 0.019943f, 0.035919f, 0.078064f, 0.215332f, 0.566895f, - 0.845703f, 0.939941f, 0.987793f, 0.988281f, 0.987793f, 0.987793f, 0.988281f, 0.988281f, - 0.000000f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000103f, 0.000077f, 0.000061f, - 0.000046f, 0.000037f, 0.000030f, 0.000023f, 0.000019f, 0.000016f, 0.000039f, 0.000094f, - 0.000181f, 0.000205f, 0.000350f, 0.000392f, 0.000423f, 0.000510f, 0.000619f, 0.000672f, - 0.000705f, 0.000632f, 0.000807f, 0.001038f, 0.001278f, 0.001894f, 0.002245f, 0.002758f, - 0.003883f, 0.005863f, 0.008636f, 0.013672f, 0.023880f, 0.048828f, 0.127441f, 0.400879f, - 0.779297f, 0.925781f, 0.985840f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f, - 0.000000f, 0.000100f, 0.000108f, 0.000118f, 0.000119f, 0.000118f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000111f, 0.000086f, - 0.000066f, 0.000051f, 0.000041f, 0.000032f, 0.000026f, 0.000021f, 0.000018f, 0.000015f, - 0.000086f, 0.000131f, 0.000190f, 0.000293f, 0.000419f, 0.000481f, 0.000477f, 0.000438f, - 0.000542f, 0.000564f, 0.000599f, 0.000700f, 0.000916f, 0.001122f, 0.001589f, 0.001997f, - 0.002678f, 0.004017f, 0.005814f, 0.009361f, 0.015808f, 0.031250f, 0.075989f, 0.250732f, - 0.676758f, 0.904297f, 0.983887f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, - 0.000000f, 0.000000f, 0.000077f, 0.000112f, 0.000104f, 0.000115f, 0.000115f, 0.000117f, - 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000119f, 0.000118f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000097f, 0.000076f, 0.000060f, 0.000046f, 0.000037f, 0.000030f, 0.000024f, 0.000020f, - 0.000045f, 0.000063f, 0.000091f, 0.000140f, 0.000202f, 0.000333f, 0.000305f, 0.000399f, - 0.000462f, 0.000452f, 0.000535f, 0.000531f, 0.000631f, 0.000866f, 0.000858f, 0.001307f, - 0.001844f, 0.002823f, 0.004070f, 0.006264f, 0.010536f, 0.020035f, 0.045990f, 0.145996f, - 0.532227f, 0.874023f, 0.980957f, 0.981445f, 0.980957f, 0.981445f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000091f, 0.000103f, 0.000105f, 0.000106f, - 0.000111f, 0.000113f, 0.000115f, 0.000114f, 0.000116f, 0.000116f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, 0.000118f, - 0.000118f, 0.000112f, 0.000084f, 0.000069f, 0.000055f, 0.000043f, 0.000036f, 0.000028f, - 0.000024f, 0.000020f, 0.000028f, 0.000039f, 0.000083f, 0.000141f, 0.000211f, 0.000262f, - 0.000413f, 0.000305f, 0.000370f, 0.000358f, 0.000489f, 0.000564f, 0.000599f, 0.000893f, - 0.001084f, 0.001696f, 0.002697f, 0.004074f, 0.006836f, 0.012878f, 0.028122f, 0.083496f, - 0.364014f, 0.826660f, 0.976562f, 0.977539f, 0.977051f, 0.977539f, 0.978027f, 0.977051f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000015f, 0.000086f, - 0.000077f, 0.000103f, 0.000100f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000112f, - 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000116f, - 0.000117f, 0.000117f, 0.000117f, 0.000100f, 0.000079f, 0.000066f, 0.000053f, 0.000041f, - 0.000035f, 0.000028f, 0.000023f, 0.000019f, 0.000017f, 0.000034f, 0.000113f, 0.000174f, - 0.000257f, 0.000325f, 0.000356f, 0.000324f, 0.000409f, 0.000454f, 0.000474f, 0.000659f, - 0.000778f, 0.001243f, 0.001575f, 0.002472f, 0.004105f, 0.007957f, 0.016800f, 0.047852f, - 0.217529f, 0.755371f, 0.972656f, 0.973145f, 0.973145f, 0.973145f, 0.973145f, 0.973145f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000028f, 0.000049f, 0.000085f, 0.000081f, 0.000096f, 0.000101f, 0.000104f, - 0.000106f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000112f, 0.000113f, 0.000113f, - 0.000114f, 0.000114f, 0.000114f, 0.000115f, 0.000115f, 0.000096f, 0.000078f, 0.000064f, - 0.000051f, 0.000043f, 0.000035f, 0.000029f, 0.000024f, 0.000020f, 0.000026f, 0.000055f, - 0.000087f, 0.000135f, 0.000248f, 0.000261f, 0.000274f, 0.000258f, 0.000296f, 0.000359f, - 0.000474f, 0.000627f, 0.001012f, 0.001484f, 0.002630f, 0.004536f, 0.010277f, 0.027405f, - 0.119507f, 0.645996f, 0.966797f, 0.967285f, 0.967285f, 0.967285f, 0.966797f, 0.966797f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000021f, 0.000065f, 0.000074f, - 0.000077f, 0.000091f, 0.000091f, 0.000099f, 0.000098f, 0.000103f, 0.000103f, 0.000106f, - 0.000107f, 0.000108f, 0.000109f, 0.000110f, 0.000111f, 0.000111f, 0.000112f, 0.000096f, - 0.000079f, 0.000064f, 0.000053f, 0.000043f, 0.000036f, 0.000030f, 0.000024f, 0.000021f, - 0.000018f, 0.000028f, 0.000072f, 0.000125f, 0.000233f, 0.000243f, 0.000220f, 0.000258f, - 0.000320f, 0.000353f, 0.000630f, 0.000932f, 0.001324f, 0.002357f, 0.005402f, 0.014534f, - 0.062561f, 0.493164f, 0.958008f, 0.958008f, 0.958984f, 0.958496f, 0.958496f, 0.958008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000011f, 0.000035f, 0.000041f, 0.000064f, 0.000074f, 0.000081f, 0.000082f, 0.000090f, - 0.000092f, 0.000096f, 0.000099f, 0.000100f, 0.000102f, 0.000104f, 0.000105f, 0.000106f, - 0.000107f, 0.000099f, 0.000082f, 0.000067f, 0.000055f, 0.000047f, 0.000038f, 0.000031f, - 0.000026f, 0.000022f, 0.000018f, 0.000037f, 0.000071f, 0.000111f, 0.000190f, 0.000204f, - 0.000153f, 0.000245f, 0.000299f, 0.000482f, 0.000790f, 0.001330f, 0.002619f, 0.007282f, - 0.031097f, 0.318115f, 0.946289f, 0.946777f, 0.946777f, 0.946777f, 0.946777f, 0.946777f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f, 0.000029f, 0.000044f, - 0.000055f, 0.000063f, 0.000073f, 0.000075f, 0.000081f, 0.000087f, 0.000090f, 0.000092f, - 0.000094f, 0.000097f, 0.000099f, 0.000100f, 0.000087f, 0.000071f, 0.000059f, 0.000049f, - 0.000040f, 0.000034f, 0.000028f, 0.000024f, 0.000020f, 0.000016f, 0.000072f, 0.000114f, - 0.000169f, 0.000147f, 0.000181f, 0.000246f, 0.000367f, 0.000626f, 0.001325f, 0.003117f, - 0.013741f, 0.167480f, 0.929688f, 0.929688f, 0.929688f, 0.930176f, 0.930664f, 0.930176f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000030f, 0.000044f, 0.000049f, 0.000062f, - 0.000068f, 0.000072f, 0.000078f, 0.000081f, 0.000084f, 0.000087f, 0.000090f, 0.000079f, - 0.000065f, 0.000054f, 0.000044f, 0.000037f, 0.000030f, 0.000025f, 0.000021f, 0.000017f, - 0.000052f, 0.000100f, 0.000132f, 0.000130f, 0.000164f, 0.000297f, 0.000552f, 0.001273f, - 0.005009f, 0.071594f, 0.903809f, 0.905273f, 0.904297f, 0.904785f, 0.904785f, 0.904785f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000013f, 0.000028f, 0.000036f, 0.000045f, 0.000053f, 0.000060f, 0.000066f, - 0.000071f, 0.000075f, 0.000071f, 0.000058f, 0.000049f, 0.000040f, 0.000033f, 0.000027f, - 0.000022f, 0.000018f, 0.000032f, 0.000078f, 0.000090f, 0.000123f, 0.000175f, 0.000441f, - 0.001637f, 0.022537f, 0.865234f, 0.865234f, 0.865723f, 0.865723f, 0.865234f, 0.864746f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, - 0.000017f, 0.000027f, 0.000036f, 0.000042f, 0.000050f, 0.000056f, 0.000052f, 0.000043f, - 0.000035f, 0.000028f, 0.000022f, 0.000018f, 0.000049f, 0.000055f, 0.000047f, 0.000108f, - 0.000342f, 0.004566f, 0.802734f, 0.803711f, 0.803711f, 0.803711f, 0.803711f, 0.803711f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f, - 0.000022f, 0.000030f, 0.000033f, 0.000027f, 0.000021f, 0.000015f, 0.000011f, 0.000031f, - 0.000045f, 0.000449f, 0.708496f, 0.707520f, 0.708984f, 0.708496f, 0.707520f, 0.708008f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f, - 0.000006f, 0.000007f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, 0.575195f, - }, - { - 0.158813f, 0.632812f, 0.824219f, 0.891602f, 0.924805f, 0.942383f, 0.954102f, 0.962402f, - 0.968262f, 0.972656f, 0.976074f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.985840f, - 0.986816f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, - 0.993652f, 0.993652f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, - 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.019775f, 0.115845f, 0.361084f, 0.642578f, 0.798340f, 0.872559f, 0.911133f, 0.933594f, - 0.947266f, 0.957031f, 0.964355f, 0.968750f, 0.973145f, 0.976562f, 0.979492f, 0.981934f, - 0.983398f, 0.984863f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990234f, 0.991211f, - 0.991699f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.006638f, 0.031082f, 0.089661f, 0.222168f, 0.448242f, 0.663086f, 0.794434f, 0.864258f, - 0.903320f, 0.926758f, 0.942383f, 0.953613f, 0.961426f, 0.966797f, 0.972168f, 0.975586f, - 0.978027f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, - 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003246f, 0.013367f, 0.032806f, 0.072754f, 0.152954f, 0.304199f, 0.509766f, 0.687500f, - 0.797852f, 0.862305f, 0.900391f, 0.923828f, 0.940430f, 0.950684f, 0.959473f, 0.965820f, - 0.970703f, 0.974121f, 0.977051f, 0.979492f, 0.981934f, 0.983887f, 0.985840f, 0.987305f, - 0.987793f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f, - 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, - 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.002029f, 0.007267f, 0.016678f, 0.032288f, 0.061462f, 0.115051f, 0.215088f, 0.376709f, - 0.562988f, 0.712891f, 0.807617f, 0.865234f, 0.901367f, 0.923828f, 0.939453f, 0.950684f, - 0.958984f, 0.965332f, 0.970215f, 0.974609f, 0.977051f, 0.979980f, 0.981934f, 0.983887f, - 0.984863f, 0.986328f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.990723f, 0.991699f, - 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001274f, 0.004623f, 0.009880f, 0.017792f, 0.030869f, 0.052673f, 0.091431f, 0.160645f, - 0.277832f, 0.442383f, 0.610352f, 0.737793f, 0.819824f, 0.870605f, 0.902832f, 0.924805f, - 0.939941f, 0.950195f, 0.958496f, 0.964844f, 0.970215f, 0.973633f, 0.977051f, 0.979980f, - 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, - 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000943f, 0.003231f, 0.006317f, 0.011040f, 0.018051f, 0.029190f, 0.046936f, 0.075867f, - 0.125488f, 0.210449f, 0.341797f, 0.503906f, 0.652344f, 0.761230f, 0.832031f, 0.877441f, - 0.906738f, 0.927734f, 0.940918f, 0.951172f, 0.959473f, 0.965820f, 0.970703f, 0.974121f, - 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.985352f, 0.987305f, 0.988281f, 0.989258f, - 0.990234f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000731f, 0.001970f, 0.004425f, 0.007351f, 0.011627f, 0.017975f, 0.027161f, 0.041779f, - 0.064270f, 0.101685f, 0.164917f, 0.265137f, 0.406494f, 0.561035f, 0.692383f, 0.785156f, - 0.845703f, 0.884766f, 0.911621f, 0.930176f, 0.942871f, 0.953125f, 0.959961f, 0.965332f, - 0.970703f, 0.974121f, 0.977539f, 0.979492f, 0.982422f, 0.983887f, 0.985840f, 0.987305f, - 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998535f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000487f, 0.001872f, 0.003445f, 0.005367f, 0.008400f, 0.012405f, 0.017822f, 0.025345f, - 0.037964f, 0.056244f, 0.085327f, 0.132935f, 0.210327f, 0.325928f, 0.471924f, 0.615723f, - 0.729004f, 0.807617f, 0.859375f, 0.894043f, 0.916504f, 0.934570f, 0.945801f, 0.955078f, - 0.961426f, 0.967285f, 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.984863f, - 0.985840f, 0.986816f, 0.988770f, 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.992676f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.000363f, 0.001300f, 0.002499f, 0.003784f, 0.006153f, 0.008896f, 0.012367f, 0.017227f, - 0.024185f, 0.034241f, 0.049591f, 0.072754f, 0.111023f, 0.170776f, 0.263184f, 0.391113f, - 0.535645f, 0.665527f, 0.761719f, 0.828613f, 0.871582f, 0.902344f, 0.922852f, 0.937988f, - 0.949219f, 0.957031f, 0.963867f, 0.968750f, 0.972656f, 0.976074f, 0.979004f, 0.981445f, - 0.983887f, 0.984863f, 0.986328f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, - 0.992676f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, - 0.000365f, 0.000972f, 0.001874f, 0.003323f, 0.004669f, 0.006599f, 0.008919f, 0.012360f, - 0.016785f, 0.022720f, 0.031616f, 0.044647f, 0.064026f, 0.094055f, 0.141235f, 0.215332f, - 0.323486f, 0.459229f, 0.597168f, 0.710449f, 0.791992f, 0.847656f, 0.885254f, 0.910645f, - 0.929199f, 0.941895f, 0.952148f, 0.960449f, 0.965332f, 0.970703f, 0.974121f, 0.977539f, - 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, - 0.991211f, 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999512f, 0.999512f, 0.999023f, - 0.000244f, 0.000764f, 0.001375f, 0.002415f, 0.003582f, 0.004963f, 0.006973f, 0.008751f, - 0.011726f, 0.016113f, 0.021683f, 0.029129f, 0.040283f, 0.057098f, 0.081421f, 0.119019f, - 0.178955f, 0.268311f, 0.390625f, 0.528809f, 0.654785f, 0.751465f, 0.820312f, 0.866211f, - 0.896973f, 0.919434f, 0.935547f, 0.946777f, 0.956055f, 0.962402f, 0.968262f, 0.972168f, - 0.975098f, 0.979004f, 0.981445f, 0.983398f, 0.985352f, 0.986816f, 0.987793f, 0.989258f, - 0.990723f, 0.991211f, 0.992188f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000122f, 0.000606f, 0.001439f, 0.002058f, 0.002743f, 0.004169f, 0.005035f, 0.006775f, - 0.009010f, 0.012085f, 0.015717f, 0.020813f, 0.027573f, 0.037170f, 0.050812f, 0.071472f, - 0.102905f, 0.151489f, 0.225708f, 0.332031f, 0.463623f, 0.596191f, 0.707031f, 0.787598f, - 0.844238f, 0.881348f, 0.908691f, 0.927246f, 0.940918f, 0.951660f, 0.958984f, 0.965820f, - 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987305f, - 0.988281f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000118f, 0.000846f, 0.001303f, 0.001593f, 0.002180f, 0.003050f, 0.004353f, 0.005577f, - 0.006954f, 0.009331f, 0.011826f, 0.015007f, 0.019653f, 0.025391f, 0.034119f, 0.046112f, - 0.063660f, 0.090210f, 0.130737f, 0.192139f, 0.283203f, 0.404053f, 0.537598f, 0.658691f, - 0.753418f, 0.818848f, 0.865234f, 0.896973f, 0.918945f, 0.934570f, 0.946289f, 0.955566f, - 0.962402f, 0.967285f, 0.972168f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f, - 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000117f, 0.000487f, 0.000957f, 0.001514f, 0.002008f, 0.002619f, 0.003424f, 0.004551f, - 0.005836f, 0.007381f, 0.009155f, 0.011459f, 0.014366f, 0.018646f, 0.024017f, 0.031281f, - 0.042664f, 0.057068f, 0.080139f, 0.113586f, 0.165894f, 0.243164f, 0.352051f, 0.481934f, - 0.610840f, 0.716309f, 0.793945f, 0.847168f, 0.884766f, 0.910645f, 0.928223f, 0.942383f, - 0.952637f, 0.959961f, 0.965332f, 0.970703f, 0.975098f, 0.978027f, 0.980957f, 0.983398f, - 0.984863f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.997559f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000608f, 0.000952f, 0.001111f, 0.001660f, 0.002102f, 0.002817f, 0.003517f, - 0.004742f, 0.005585f, 0.007080f, 0.008980f, 0.011078f, 0.014191f, 0.017838f, 0.022614f, - 0.029404f, 0.038940f, 0.052551f, 0.071533f, 0.100769f, 0.145020f, 0.211548f, 0.307373f, - 0.430176f, 0.561523f, 0.676758f, 0.764648f, 0.828613f, 0.872070f, 0.900879f, 0.921875f, - 0.937012f, 0.948730f, 0.957520f, 0.964355f, 0.969238f, 0.973633f, 0.977539f, 0.979980f, - 0.982422f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, - 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000244f, 0.000576f, 0.000727f, 0.001083f, 0.001186f, 0.001810f, 0.002558f, 0.002968f, - 0.003725f, 0.004913f, 0.005955f, 0.007011f, 0.008759f, 0.010918f, 0.013718f, 0.016953f, - 0.021423f, 0.027832f, 0.035980f, 0.047913f, 0.064941f, 0.090332f, 0.128174f, 0.185791f, - 0.270264f, 0.384033f, 0.514160f, 0.638184f, 0.736328f, 0.807617f, 0.856934f, 0.891602f, - 0.915039f, 0.932617f, 0.945801f, 0.954102f, 0.962402f, 0.968262f, 0.972168f, 0.976562f, - 0.979492f, 0.981445f, 0.983887f, 0.985840f, 0.987305f, 0.988281f, 0.990234f, 0.990723f, - 0.992188f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000000f, 0.000244f, 0.000708f, 0.000903f, 0.001129f, 0.001511f, 0.002031f, 0.002565f, - 0.003189f, 0.004112f, 0.004696f, 0.005989f, 0.006954f, 0.008865f, 0.010826f, 0.013031f, - 0.016312f, 0.020493f, 0.026154f, 0.033966f, 0.044159f, 0.059845f, 0.081665f, 0.114929f, - 0.164917f, 0.239624f, 0.343750f, 0.469971f, 0.598145f, 0.706055f, 0.786133f, 0.842773f, - 0.881348f, 0.908203f, 0.927246f, 0.941895f, 0.952148f, 0.959961f, 0.966797f, 0.971191f, - 0.976074f, 0.978516f, 0.981445f, 0.983887f, 0.985352f, 0.987305f, 0.988281f, 0.989258f, - 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, - 0.996094f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000122f, 0.000244f, 0.000482f, 0.000674f, 0.001029f, 0.001440f, 0.001746f, 0.002153f, - 0.002804f, 0.003206f, 0.003859f, 0.004948f, 0.005722f, 0.007206f, 0.008568f, 0.010498f, - 0.012413f, 0.015793f, 0.019989f, 0.024826f, 0.031799f, 0.041382f, 0.054932f, 0.074768f, - 0.103882f, 0.147949f, 0.213867f, 0.308838f, 0.429932f, 0.560059f, 0.675781f, 0.765625f, - 0.827148f, 0.871582f, 0.901367f, 0.923340f, 0.937988f, 0.949707f, 0.958496f, 0.965820f, - 0.969727f, 0.974609f, 0.978027f, 0.980469f, 0.983398f, 0.985840f, 0.986816f, 0.988281f, - 0.989258f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000244f, 0.000363f, 0.000604f, 0.000834f, 0.001020f, 0.001548f, 0.001970f, - 0.002262f, 0.002548f, 0.003157f, 0.003914f, 0.004681f, 0.005962f, 0.006943f, 0.008263f, - 0.010277f, 0.012589f, 0.015144f, 0.018951f, 0.023788f, 0.030014f, 0.039001f, 0.051056f, - 0.069092f, 0.094666f, 0.133911f, 0.192993f, 0.279053f, 0.394287f, 0.524414f, 0.646484f, - 0.743652f, 0.812988f, 0.861328f, 0.895020f, 0.917969f, 0.935547f, 0.947754f, 0.957520f, - 0.963867f, 0.969238f, 0.974121f, 0.978027f, 0.980469f, 0.983398f, 0.984863f, 0.987305f, - 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000118f, 0.000244f, 0.000244f, 0.000584f, 0.000837f, 0.000847f, 0.001295f, 0.001681f, - 0.002018f, 0.002348f, 0.003014f, 0.003157f, 0.004124f, 0.004547f, 0.005432f, 0.006607f, - 0.008163f, 0.010071f, 0.011925f, 0.014786f, 0.017990f, 0.022659f, 0.028824f, 0.036621f, - 0.047882f, 0.063477f, 0.087158f, 0.122559f, 0.175781f, 0.254639f, 0.363037f, 0.492188f, - 0.618652f, 0.722168f, 0.799805f, 0.852051f, 0.889648f, 0.914551f, 0.932129f, 0.944824f, - 0.955078f, 0.962891f, 0.968262f, 0.973633f, 0.977051f, 0.980469f, 0.982910f, 0.984863f, - 0.987305f, 0.988281f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, - 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000242f, 0.000243f, 0.000243f, 0.000481f, 0.000742f, 0.000843f, 0.000969f, 0.001348f, - 0.001726f, 0.001791f, 0.002348f, 0.002853f, 0.003452f, 0.003735f, 0.004757f, 0.005516f, - 0.006744f, 0.008102f, 0.009621f, 0.011948f, 0.014320f, 0.017365f, 0.021698f, 0.027298f, - 0.034546f, 0.044891f, 0.059875f, 0.081055f, 0.112915f, 0.161255f, 0.234009f, 0.335693f, - 0.462646f, 0.592285f, 0.702637f, 0.785645f, 0.843750f, 0.883301f, 0.911133f, 0.929688f, - 0.944336f, 0.954590f, 0.961914f, 0.967773f, 0.973633f, 0.977539f, 0.980469f, 0.982910f, - 0.985352f, 0.986816f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, - 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000100f, 0.000216f, 0.000243f, 0.000365f, 0.000517f, 0.000836f, 0.000964f, 0.001148f, - 0.001472f, 0.001674f, 0.001785f, 0.002438f, 0.002815f, 0.003490f, 0.004070f, 0.004837f, - 0.005608f, 0.006630f, 0.008095f, 0.009483f, 0.011551f, 0.013847f, 0.016953f, 0.020584f, - 0.025879f, 0.033051f, 0.042664f, 0.055817f, 0.075500f, 0.105103f, 0.149536f, 0.216553f, - 0.312988f, 0.436768f, 0.568359f, 0.685059f, 0.773926f, 0.835449f, 0.878418f, 0.907227f, - 0.927734f, 0.943359f, 0.953125f, 0.962402f, 0.967285f, 0.973145f, 0.977051f, 0.980469f, - 0.983887f, 0.985352f, 0.987305f, 0.989258f, 0.990234f, 0.991699f, 0.992188f, 0.993164f, - 0.994141f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000150f, 0.000242f, 0.000364f, 0.000441f, 0.000627f, 0.000916f, 0.000959f, - 0.000968f, 0.001463f, 0.001671f, 0.002222f, 0.002577f, 0.002714f, 0.003479f, 0.004208f, - 0.004723f, 0.005669f, 0.006886f, 0.007637f, 0.009315f, 0.011154f, 0.013596f, 0.016205f, - 0.019821f, 0.024963f, 0.031250f, 0.040375f, 0.053009f, 0.071167f, 0.098511f, 0.139648f, - 0.202271f, 0.293457f, 0.414307f, 0.548340f, 0.669434f, 0.762695f, 0.829590f, 0.874512f, - 0.904785f, 0.926758f, 0.941895f, 0.953613f, 0.961914f, 0.968262f, 0.973633f, 0.977539f, - 0.980957f, 0.983398f, 0.985352f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, - 0.993164f, 0.994629f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000231f, 0.000232f, 0.000363f, 0.000486f, 0.000503f, 0.000724f, 0.001104f, - 0.001080f, 0.001271f, 0.001509f, 0.001976f, 0.002247f, 0.002476f, 0.002895f, 0.003553f, - 0.004192f, 0.004871f, 0.005623f, 0.006332f, 0.007584f, 0.008957f, 0.010849f, 0.012917f, - 0.015396f, 0.019226f, 0.023941f, 0.030060f, 0.038513f, 0.050385f, 0.067627f, 0.093140f, - 0.131714f, 0.190674f, 0.278076f, 0.395752f, 0.530273f, 0.655762f, 0.753906f, 0.823242f, - 0.870605f, 0.903320f, 0.925781f, 0.941406f, 0.953125f, 0.961914f, 0.969238f, 0.974121f, - 0.978027f, 0.980957f, 0.983887f, 0.985840f, 0.988281f, 0.989258f, 0.990723f, 0.991699f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000000f, 0.000009f, 0.000116f, 0.000360f, 0.000484f, 0.000485f, 0.000536f, 0.000827f, - 0.000935f, 0.001077f, 0.001204f, 0.001561f, 0.001974f, 0.002136f, 0.002777f, 0.002964f, - 0.003517f, 0.004192f, 0.004711f, 0.005505f, 0.006283f, 0.007408f, 0.008713f, 0.010674f, - 0.012375f, 0.015099f, 0.018677f, 0.022797f, 0.028732f, 0.036835f, 0.047974f, 0.064270f, - 0.088318f, 0.124634f, 0.180664f, 0.264893f, 0.380615f, 0.516113f, 0.645020f, 0.747559f, - 0.819824f, 0.870117f, 0.902344f, 0.925293f, 0.941406f, 0.953613f, 0.962402f, 0.969238f, - 0.974121f, 0.978027f, 0.981934f, 0.984375f, 0.986328f, 0.988281f, 0.989746f, 0.990723f, - 0.992676f, 0.993164f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.998047f, 0.998047f, - 0.000000f, 0.000000f, 0.000074f, 0.000337f, 0.000481f, 0.000484f, 0.000485f, 0.000556f, - 0.000823f, 0.001143f, 0.001187f, 0.001391f, 0.001781f, 0.002155f, 0.002327f, 0.002760f, - 0.003008f, 0.003433f, 0.004101f, 0.004681f, 0.005417f, 0.006443f, 0.007393f, 0.008560f, - 0.010345f, 0.012177f, 0.014496f, 0.018127f, 0.022125f, 0.027740f, 0.035736f, 0.046173f, - 0.061920f, 0.084717f, 0.119324f, 0.173218f, 0.254883f, 0.368652f, 0.505371f, 0.637207f, - 0.742676f, 0.818359f, 0.868164f, 0.902832f, 0.925781f, 0.942383f, 0.953613f, 0.963379f, - 0.970215f, 0.975098f, 0.979004f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990723f, - 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000188f, 0.000358f, 0.000481f, 0.000484f, 0.000484f, - 0.000704f, 0.000852f, 0.001165f, 0.001316f, 0.001500f, 0.001685f, 0.001933f, 0.002079f, - 0.002720f, 0.003136f, 0.003727f, 0.003723f, 0.004513f, 0.005207f, 0.006275f, 0.007236f, - 0.008453f, 0.010056f, 0.011848f, 0.014191f, 0.017212f, 0.021652f, 0.026978f, 0.034241f, - 0.044678f, 0.058990f, 0.081421f, 0.114929f, 0.167236f, 0.247070f, 0.360596f, 0.498291f, - 0.632812f, 0.741211f, 0.818359f, 0.869629f, 0.903809f, 0.927734f, 0.943848f, 0.955566f, - 0.964355f, 0.970703f, 0.976074f, 0.979492f, 0.982422f, 0.985840f, 0.987793f, 0.989258f, - 0.990723f, 0.992188f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000121f, 0.000120f, 0.000288f, 0.000357f, 0.000479f, 0.000483f, - 0.000535f, 0.000711f, 0.000862f, 0.001256f, 0.001351f, 0.001502f, 0.001719f, 0.002146f, - 0.002037f, 0.002653f, 0.003248f, 0.003222f, 0.003820f, 0.004456f, 0.005173f, 0.006008f, - 0.007072f, 0.008247f, 0.009758f, 0.011826f, 0.013771f, 0.016861f, 0.020935f, 0.025986f, - 0.032928f, 0.043030f, 0.057587f, 0.078918f, 0.111755f, 0.162964f, 0.241943f, 0.355713f, - 0.495117f, 0.632324f, 0.742676f, 0.819336f, 0.871582f, 0.905762f, 0.929688f, 0.945312f, - 0.957031f, 0.965332f, 0.972168f, 0.976562f, 0.980957f, 0.983887f, 0.986328f, 0.988281f, - 0.990234f, 0.991699f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000200f, 0.000412f, 0.000471f, 0.000599f, - 0.000598f, 0.000596f, 0.000805f, 0.001099f, 0.001334f, 0.001417f, 0.001456f, 0.001723f, - 0.002102f, 0.002283f, 0.002579f, 0.003208f, 0.003233f, 0.003740f, 0.004574f, 0.005287f, - 0.006012f, 0.006870f, 0.008018f, 0.009354f, 0.011208f, 0.013542f, 0.016495f, 0.020370f, - 0.025284f, 0.032410f, 0.041901f, 0.056183f, 0.077087f, 0.109558f, 0.160278f, 0.239380f, - 0.354492f, 0.496094f, 0.635254f, 0.747070f, 0.823730f, 0.875488f, 0.908691f, 0.931641f, - 0.947266f, 0.958008f, 0.966309f, 0.972656f, 0.978027f, 0.981445f, 0.984863f, 0.986816f, - 0.989258f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000237f, 0.000239f, 0.000430f, 0.000465f, - 0.000599f, 0.000724f, 0.000716f, 0.000815f, 0.000981f, 0.001334f, 0.001299f, 0.001545f, - 0.001617f, 0.001935f, 0.002110f, 0.002501f, 0.002823f, 0.003408f, 0.003790f, 0.004467f, - 0.005112f, 0.005848f, 0.006718f, 0.007942f, 0.009514f, 0.011093f, 0.013092f, 0.015945f, - 0.019608f, 0.024689f, 0.031494f, 0.041046f, 0.054901f, 0.075989f, 0.108032f, 0.158936f, - 0.239014f, 0.356201f, 0.500488f, 0.642090f, 0.753418f, 0.830566f, 0.880859f, 0.912598f, - 0.935059f, 0.950195f, 0.960449f, 0.968262f, 0.975098f, 0.979980f, 0.982910f, 0.985352f, - 0.987793f, 0.990234f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.997070f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000120f, 0.000121f, 0.000312f, 0.000407f, - 0.000707f, 0.000597f, 0.000648f, 0.000720f, 0.000941f, 0.001008f, 0.001229f, 0.001289f, - 0.001423f, 0.001726f, 0.002060f, 0.002211f, 0.002506f, 0.002985f, 0.003036f, 0.003683f, - 0.004066f, 0.004833f, 0.005592f, 0.006611f, 0.007675f, 0.008965f, 0.010811f, 0.012833f, - 0.015854f, 0.019485f, 0.024429f, 0.031036f, 0.040466f, 0.054108f, 0.074890f, 0.107727f, - 0.159180f, 0.241699f, 0.362549f, 0.510742f, 0.653809f, 0.763184f, 0.837891f, 0.887207f, - 0.917480f, 0.938477f, 0.953613f, 0.962891f, 0.970703f, 0.976562f, 0.980469f, 0.984375f, - 0.986816f, 0.988770f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000000f, 0.000000f, 0.000117f, 0.000118f, 0.000120f, 0.000129f, 0.000434f, - 0.000536f, 0.000613f, 0.000716f, 0.000799f, 0.000720f, 0.000768f, 0.001024f, 0.001202f, - 0.001501f, 0.001530f, 0.001568f, 0.001897f, 0.002190f, 0.002502f, 0.002893f, 0.003105f, - 0.003551f, 0.004021f, 0.004791f, 0.005405f, 0.006313f, 0.007309f, 0.008720f, 0.010712f, - 0.012657f, 0.015472f, 0.018982f, 0.023697f, 0.030579f, 0.040009f, 0.054138f, 0.075012f, - 0.107849f, 0.161377f, 0.247070f, 0.373047f, 0.525391f, 0.667969f, 0.776855f, 0.847656f, - 0.894043f, 0.923340f, 0.942871f, 0.956543f, 0.965820f, 0.973145f, 0.978027f, 0.982422f, - 0.985352f, 0.987793f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996582f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000081f, 0.000116f, 0.000227f, 0.000360f, - 0.000366f, 0.000642f, 0.000691f, 0.000711f, 0.000806f, 0.000721f, 0.000925f, 0.000947f, - 0.001155f, 0.001478f, 0.001554f, 0.001612f, 0.001929f, 0.002354f, 0.002291f, 0.002712f, - 0.003029f, 0.003441f, 0.003876f, 0.004452f, 0.005276f, 0.006256f, 0.007149f, 0.008568f, - 0.010040f, 0.012566f, 0.015160f, 0.018677f, 0.023376f, 0.030411f, 0.039642f, 0.053986f, - 0.075134f, 0.109436f, 0.165527f, 0.255127f, 0.387695f, 0.544434f, 0.686523f, 0.791016f, - 0.858398f, 0.901367f, 0.928711f, 0.947266f, 0.959961f, 0.968262f, 0.975098f, 0.980469f, - 0.983887f, 0.987305f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000088f, 0.000085f, 0.000338f, 0.000351f, - 0.000359f, 0.000480f, 0.000539f, 0.000698f, 0.000798f, 0.000793f, 0.000834f, 0.000891f, - 0.000941f, 0.001143f, 0.001422f, 0.001512f, 0.001833f, 0.001955f, 0.002144f, 0.002426f, - 0.002716f, 0.003262f, 0.003572f, 0.003860f, 0.004456f, 0.005173f, 0.006191f, 0.006939f, - 0.008545f, 0.010162f, 0.012375f, 0.014969f, 0.018555f, 0.023376f, 0.029953f, 0.039673f, - 0.054077f, 0.076477f, 0.112000f, 0.171509f, 0.268066f, 0.408203f, 0.569336f, 0.709961f, - 0.808105f, 0.872070f, 0.910645f, 0.935059f, 0.951660f, 0.963379f, 0.971680f, 0.977539f, - 0.982422f, 0.985840f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000116f, 0.000340f, - 0.000353f, 0.000349f, 0.000480f, 0.000576f, 0.000668f, 0.000700f, 0.000818f, 0.000833f, - 0.000787f, 0.001125f, 0.001110f, 0.001407f, 0.001489f, 0.001563f, 0.001804f, 0.002073f, - 0.002285f, 0.002409f, 0.002985f, 0.003052f, 0.003853f, 0.004433f, 0.005100f, 0.006046f, - 0.007046f, 0.008156f, 0.009827f, 0.012138f, 0.014740f, 0.018311f, 0.023071f, 0.029770f, - 0.040009f, 0.054810f, 0.078003f, 0.116150f, 0.180176f, 0.284668f, 0.434570f, 0.599121f, - 0.735352f, 0.827637f, 0.885254f, 0.919922f, 0.941895f, 0.957031f, 0.967285f, 0.975098f, - 0.979980f, 0.984375f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995605f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000235f, - 0.000320f, 0.000351f, 0.000353f, 0.000478f, 0.000602f, 0.000651f, 0.000793f, 0.000706f, - 0.000816f, 0.000814f, 0.000898f, 0.001062f, 0.001259f, 0.001441f, 0.001564f, 0.001772f, - 0.001743f, 0.002134f, 0.002512f, 0.002668f, 0.003193f, 0.003746f, 0.004341f, 0.004902f, - 0.005909f, 0.006920f, 0.008125f, 0.009605f, 0.011711f, 0.014549f, 0.018280f, 0.023163f, - 0.030334f, 0.040375f, 0.055939f, 0.080566f, 0.122070f, 0.192383f, 0.307373f, 0.467773f, - 0.634277f, 0.763184f, 0.846191f, 0.897461f, 0.928711f, 0.948730f, 0.962402f, 0.971680f, - 0.978516f, 0.982422f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000185f, 0.000190f, - 0.000272f, 0.000281f, 0.000464f, 0.000466f, 0.000476f, 0.000521f, 0.000654f, 0.000680f, - 0.000699f, 0.000815f, 0.000814f, 0.000890f, 0.001110f, 0.001283f, 0.001311f, 0.001590f, - 0.001727f, 0.001801f, 0.002020f, 0.002312f, 0.002897f, 0.003267f, 0.003592f, 0.004143f, - 0.004810f, 0.005844f, 0.006618f, 0.008018f, 0.009697f, 0.011597f, 0.014374f, 0.018127f, - 0.023056f, 0.030258f, 0.041107f, 0.057373f, 0.084045f, 0.129517f, 0.208618f, 0.337646f, - 0.508789f, 0.673828f, 0.793457f, 0.866211f, 0.911133f, 0.938965f, 0.955566f, 0.967285f, - 0.975586f, 0.980469f, 0.994141f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000226f, 0.000431f, 0.000456f, 0.000467f, 0.000352f, 0.000496f, 0.000588f, - 0.000891f, 0.000771f, 0.000803f, 0.000947f, 0.000972f, 0.001078f, 0.001033f, 0.001279f, - 0.001436f, 0.001483f, 0.001831f, 0.002033f, 0.002264f, 0.002710f, 0.002996f, 0.003582f, - 0.004032f, 0.004665f, 0.005592f, 0.006527f, 0.007820f, 0.009323f, 0.011581f, 0.014328f, - 0.018219f, 0.023239f, 0.030777f, 0.042084f, 0.059448f, 0.089233f, 0.140869f, 0.230713f, - 0.375977f, 0.556641f, 0.715332f, 0.822266f, 0.885742f, 0.924316f, 0.947266f, 0.962402f, - 0.972656f, 0.978516f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000283f, 0.000229f, 0.000425f, 0.000303f, 0.000336f, 0.000469f, 0.000474f, - 0.000728f, 0.000663f, 0.000883f, 0.000695f, 0.000679f, 0.000858f, 0.000919f, 0.000980f, - 0.001218f, 0.001330f, 0.001665f, 0.001637f, 0.002054f, 0.002335f, 0.002508f, 0.002880f, - 0.003323f, 0.004055f, 0.004730f, 0.005463f, 0.006485f, 0.007740f, 0.009293f, 0.011566f, - 0.014175f, 0.017944f, 0.023346f, 0.031433f, 0.043304f, 0.063232f, 0.096313f, 0.155518f, - 0.260498f, 0.424561f, 0.611328f, 0.758789f, 0.852051f, 0.904785f, 0.937012f, 0.955566f, - 0.968262f, 0.977051f, 0.992676f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000256f, 0.000216f, 0.000406f, 0.000426f, 0.000457f, 0.000453f, - 0.000472f, 0.000651f, 0.000593f, 0.000876f, 0.000571f, 0.000590f, 0.000819f, 0.000809f, - 0.001000f, 0.001224f, 0.001293f, 0.001637f, 0.001790f, 0.001863f, 0.002298f, 0.002550f, - 0.002995f, 0.003201f, 0.003933f, 0.004677f, 0.005360f, 0.006447f, 0.007763f, 0.009377f, - 0.011330f, 0.014420f, 0.017944f, 0.023560f, 0.032196f, 0.045380f, 0.067383f, 0.105469f, - 0.175659f, 0.301025f, 0.484375f, 0.669922f, 0.801270f, 0.879395f, 0.922852f, 0.948242f, - 0.963379f, 0.974121f, 0.992188f, 0.992188f, 0.992188f, 0.993164f, 0.992188f, 0.993164f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000230f, 0.000206f, 0.000355f, 0.000335f, 0.000305f, - 0.000461f, 0.000565f, 0.000474f, 0.000429f, 0.000520f, 0.000758f, 0.000777f, 0.000668f, - 0.000821f, 0.001013f, 0.001089f, 0.001325f, 0.001570f, 0.001787f, 0.001707f, 0.002037f, - 0.002457f, 0.002892f, 0.003359f, 0.003881f, 0.004616f, 0.005203f, 0.006336f, 0.007477f, - 0.009048f, 0.011345f, 0.014015f, 0.018356f, 0.024307f, 0.033661f, 0.048279f, 0.073303f, - 0.118774f, 0.204102f, 0.354492f, 0.554688f, 0.729492f, 0.840332f, 0.902832f, 0.937988f, - 0.958008f, 0.971191f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000205f, 0.000248f, 0.000213f, 0.000344f, - 0.000437f, 0.000351f, 0.000352f, 0.000359f, 0.000389f, 0.000482f, 0.000676f, 0.000560f, - 0.000806f, 0.000813f, 0.000927f, 0.001230f, 0.001392f, 0.001526f, 0.001627f, 0.001629f, - 0.002047f, 0.002321f, 0.002661f, 0.003317f, 0.003752f, 0.004406f, 0.005119f, 0.005936f, - 0.007156f, 0.009003f, 0.010941f, 0.013985f, 0.018539f, 0.025131f, 0.035248f, 0.051880f, - 0.081543f, 0.137207f, 0.244507f, 0.424561f, 0.632812f, 0.787598f, 0.876465f, 0.924805f, - 0.951172f, 0.966797f, 0.990723f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000224f, 0.000171f, 0.000276f, - 0.000278f, 0.000288f, 0.000329f, 0.000365f, 0.000459f, 0.000483f, 0.000626f, 0.000716f, - 0.000767f, 0.000793f, 0.000800f, 0.000897f, 0.000976f, 0.001156f, 0.001322f, 0.001427f, - 0.001799f, 0.001997f, 0.002256f, 0.002773f, 0.002806f, 0.003515f, 0.004040f, 0.004910f, - 0.005730f, 0.007046f, 0.008858f, 0.011124f, 0.014374f, 0.018982f, 0.026123f, 0.037659f, - 0.057129f, 0.093445f, 0.164062f, 0.301514f, 0.511230f, 0.712402f, 0.838867f, 0.906738f, - 0.942383f, 0.961914f, 0.989746f, 0.990234f, 0.989746f, 0.990234f, 0.989746f, 0.990234f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000173f, 0.000140f, - 0.000138f, 0.000232f, 0.000291f, 0.000318f, 0.000338f, 0.000346f, 0.000422f, 0.000368f, - 0.000680f, 0.000722f, 0.000765f, 0.000766f, 0.000803f, 0.001069f, 0.001103f, 0.001185f, - 0.001611f, 0.001593f, 0.001939f, 0.002211f, 0.002569f, 0.003008f, 0.003239f, 0.003952f, - 0.004681f, 0.005630f, 0.007008f, 0.008720f, 0.011200f, 0.014587f, 0.019653f, 0.027527f, - 0.040955f, 0.064514f, 0.110413f, 0.204224f, 0.381104f, 0.609863f, 0.785645f, 0.881836f, - 0.931152f, 0.956543f, 0.988770f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000123f, 0.000121f, 0.000090f, - 0.000102f, 0.000063f, 0.000156f, 0.000248f, 0.000333f, 0.000321f, 0.000431f, 0.000392f, - 0.000349f, 0.000434f, 0.000674f, 0.000741f, 0.000776f, 0.000936f, 0.000888f, 0.001049f, - 0.001179f, 0.001326f, 0.001686f, 0.001732f, 0.002050f, 0.002150f, 0.002453f, 0.003016f, - 0.003601f, 0.004444f, 0.005692f, 0.006741f, 0.008324f, 0.011093f, 0.014709f, 0.020752f, - 0.029800f, 0.045654f, 0.074951f, 0.136108f, 0.264893f, 0.486816f, 0.710938f, 0.848145f, - 0.916992f, 0.950684f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f, 0.987793f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000100f, - 0.000049f, 0.000039f, 0.000125f, 0.000121f, 0.000184f, 0.000280f, 0.000366f, 0.000392f, - 0.000333f, 0.000341f, 0.000477f, 0.000597f, 0.000607f, 0.000747f, 0.000767f, 0.000961f, - 0.000936f, 0.001056f, 0.001306f, 0.001388f, 0.001633f, 0.001836f, 0.001997f, 0.002348f, - 0.002878f, 0.003332f, 0.004131f, 0.005165f, 0.006519f, 0.008568f, 0.011444f, 0.015419f, - 0.021881f, 0.032532f, 0.052032f, 0.091187f, 0.177246f, 0.357910f, 0.610352f, 0.800781f, - 0.897461f, 0.942871f, 0.985352f, 0.986328f, 0.986816f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000099f, 0.000076f, - 0.000060f, 0.000108f, 0.000040f, 0.000127f, 0.000127f, 0.000121f, 0.000200f, 0.000265f, - 0.000360f, 0.000316f, 0.000428f, 0.000455f, 0.000456f, 0.000583f, 0.000682f, 0.000750f, - 0.000773f, 0.000824f, 0.000937f, 0.001220f, 0.001262f, 0.001384f, 0.001622f, 0.001862f, - 0.002157f, 0.002817f, 0.003414f, 0.004082f, 0.004993f, 0.006561f, 0.008560f, 0.011696f, - 0.016022f, 0.023529f, 0.036469f, 0.062286f, 0.117126f, 0.245605f, 0.487549f, 0.732910f, - 0.870605f, 0.933105f, 0.983887f, 0.984863f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000096f, - 0.000075f, 0.000061f, 0.000083f, 0.000096f, 0.000034f, 0.000101f, 0.000121f, 0.000137f, - 0.000211f, 0.000324f, 0.000381f, 0.000373f, 0.000420f, 0.000472f, 0.000494f, 0.000690f, - 0.000793f, 0.000768f, 0.000853f, 0.000867f, 0.000978f, 0.001003f, 0.001145f, 0.001416f, - 0.001888f, 0.002125f, 0.002491f, 0.003004f, 0.003864f, 0.005028f, 0.006500f, 0.008682f, - 0.011856f, 0.016922f, 0.025757f, 0.042603f, 0.078247f, 0.161743f, 0.358398f, 0.641602f, - 0.833496f, 0.920410f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000122f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, - 0.000097f, 0.000078f, 0.000062f, 0.000051f, 0.000043f, 0.000072f, 0.000030f, 0.000060f, - 0.000109f, 0.000206f, 0.000216f, 0.000333f, 0.000347f, 0.000395f, 0.000415f, 0.000458f, - 0.000568f, 0.000664f, 0.000709f, 0.000598f, 0.000781f, 0.000628f, 0.001053f, 0.001046f, - 0.001179f, 0.001579f, 0.001649f, 0.002386f, 0.002857f, 0.003727f, 0.004894f, 0.006363f, - 0.008789f, 0.012314f, 0.018616f, 0.029709f, 0.052429f, 0.105652f, 0.244385f, 0.524414f, - 0.782715f, 0.904785f, 0.979492f, 0.980957f, 0.979980f, 0.979980f, 0.980469f, 0.980469f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000097f, 0.000079f, 0.000065f, 0.000054f, 0.000045f, 0.000073f, 0.000032f, - 0.000089f, 0.000038f, 0.000134f, 0.000138f, 0.000211f, 0.000333f, 0.000370f, 0.000400f, - 0.000420f, 0.000496f, 0.000566f, 0.000494f, 0.000584f, 0.000714f, 0.000708f, 0.000843f, - 0.001056f, 0.001019f, 0.001327f, 0.001812f, 0.001908f, 0.002798f, 0.003479f, 0.004578f, - 0.006195f, 0.008881f, 0.012901f, 0.020599f, 0.035339f, 0.069214f, 0.159058f, 0.394531f, - 0.709961f, 0.882812f, 0.977051f, 0.978027f, 0.977539f, 0.976562f, 0.977051f, 0.977539f, - 0.000000f, 0.000121f, 0.000120f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, - 0.000119f, 0.000120f, 0.000102f, 0.000084f, 0.000071f, 0.000059f, 0.000048f, 0.000041f, - 0.000035f, 0.000062f, 0.000026f, 0.000098f, 0.000103f, 0.000136f, 0.000230f, 0.000327f, - 0.000356f, 0.000338f, 0.000387f, 0.000499f, 0.000577f, 0.000627f, 0.000669f, 0.000611f, - 0.000699f, 0.000904f, 0.000893f, 0.001340f, 0.001666f, 0.002068f, 0.002377f, 0.003105f, - 0.004345f, 0.006218f, 0.009178f, 0.013962f, 0.024170f, 0.045441f, 0.101868f, 0.271973f, - 0.612305f, 0.853027f, 0.973145f, 0.974121f, 0.973633f, 0.974121f, 0.973633f, 0.974121f, - 0.000121f, 0.000120f, 0.000119f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000108f, 0.000091f, 0.000075f, 0.000063f, 0.000053f, - 0.000045f, 0.000039f, 0.000034f, 0.000040f, 0.000090f, 0.000068f, 0.000104f, 0.000127f, - 0.000220f, 0.000302f, 0.000412f, 0.000316f, 0.000444f, 0.000495f, 0.000428f, 0.000510f, - 0.000463f, 0.000614f, 0.000726f, 0.000719f, 0.001164f, 0.001533f, 0.001707f, 0.002079f, - 0.002848f, 0.004189f, 0.006142f, 0.009491f, 0.016113f, 0.029343f, 0.064758f, 0.175415f, - 0.490723f, 0.812012f, 0.968750f, 0.969727f, 0.969238f, 0.969727f, 0.969727f, 0.969727f, - 0.000000f, 0.000117f, 0.000117f, 0.000115f, 0.000118f, 0.000118f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000117f, - 0.000117f, 0.000117f, 0.000117f, 0.000118f, 0.000117f, 0.000100f, 0.000082f, 0.000070f, - 0.000060f, 0.000051f, 0.000043f, 0.000038f, 0.000033f, 0.000053f, 0.000027f, 0.000089f, - 0.000105f, 0.000137f, 0.000227f, 0.000277f, 0.000293f, 0.000284f, 0.000300f, 0.000420f, - 0.000367f, 0.000473f, 0.000467f, 0.000555f, 0.000625f, 0.000870f, 0.001177f, 0.001563f, - 0.001982f, 0.002714f, 0.004051f, 0.006134f, 0.010384f, 0.018967f, 0.040314f, 0.108887f, - 0.358643f, 0.755859f, 0.962891f, 0.963867f, 0.964355f, 0.963867f, 0.963379f, 0.963379f, - 0.000000f, 0.000000f, 0.000098f, 0.000103f, 0.000111f, 0.000112f, 0.000112f, 0.000114f, - 0.000113f, 0.000115f, 0.000114f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, - 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000116f, 0.000109f, 0.000094f, - 0.000078f, 0.000067f, 0.000058f, 0.000050f, 0.000043f, 0.000038f, 0.000033f, 0.000054f, - 0.000025f, 0.000078f, 0.000091f, 0.000173f, 0.000203f, 0.000252f, 0.000331f, 0.000277f, - 0.000264f, 0.000407f, 0.000342f, 0.000444f, 0.000470f, 0.000542f, 0.000773f, 0.001081f, - 0.001245f, 0.001682f, 0.002602f, 0.003744f, 0.006248f, 0.011566f, 0.025040f, 0.065491f, - 0.236938f, 0.678223f, 0.956055f, 0.956543f, 0.956543f, 0.956543f, 0.957031f, 0.957031f, - 0.000000f, 0.000000f, 0.000021f, 0.000080f, 0.000072f, 0.000089f, 0.000100f, 0.000099f, - 0.000105f, 0.000107f, 0.000107f, 0.000110f, 0.000109f, 0.000110f, 0.000111f, 0.000111f, - 0.000112f, 0.000112f, 0.000112f, 0.000113f, 0.000113f, 0.000113f, 0.000113f, 0.000113f, - 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000057f, 0.000050f, 0.000043f, 0.000038f, - 0.000033f, 0.000029f, 0.000025f, 0.000055f, 0.000091f, 0.000130f, 0.000225f, 0.000275f, - 0.000254f, 0.000290f, 0.000259f, 0.000378f, 0.000333f, 0.000362f, 0.000458f, 0.000587f, - 0.000876f, 0.001062f, 0.001382f, 0.002398f, 0.003763f, 0.006603f, 0.014496f, 0.038300f, - 0.143677f, 0.573730f, 0.946777f, 0.947266f, 0.947266f, 0.947266f, 0.948242f, 0.947266f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000014f, 0.000036f, 0.000072f, - 0.000082f, 0.000080f, 0.000094f, 0.000096f, 0.000099f, 0.000098f, 0.000103f, 0.000103f, - 0.000103f, 0.000106f, 0.000105f, 0.000107f, 0.000107f, 0.000108f, 0.000108f, 0.000109f, - 0.000109f, 0.000109f, 0.000105f, 0.000090f, 0.000078f, 0.000067f, 0.000059f, 0.000051f, - 0.000045f, 0.000039f, 0.000034f, 0.000030f, 0.000026f, 0.000045f, 0.000086f, 0.000108f, - 0.000143f, 0.000212f, 0.000227f, 0.000204f, 0.000231f, 0.000263f, 0.000315f, 0.000354f, - 0.000481f, 0.000702f, 0.000888f, 0.001257f, 0.002018f, 0.003738f, 0.007675f, 0.021317f, - 0.080933f, 0.444336f, 0.934082f, 0.935059f, 0.935059f, 0.935059f, 0.935059f, 0.935059f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000024f, 0.000038f, 0.000059f, 0.000063f, 0.000076f, 0.000080f, 0.000085f, - 0.000089f, 0.000091f, 0.000092f, 0.000095f, 0.000097f, 0.000099f, 0.000098f, 0.000101f, - 0.000101f, 0.000102f, 0.000103f, 0.000104f, 0.000104f, 0.000091f, 0.000080f, 0.000069f, - 0.000062f, 0.000053f, 0.000046f, 0.000041f, 0.000035f, 0.000032f, 0.000027f, 0.000039f, - 0.000052f, 0.000103f, 0.000139f, 0.000178f, 0.000190f, 0.000178f, 0.000185f, 0.000247f, - 0.000274f, 0.000368f, 0.000528f, 0.000637f, 0.001027f, 0.001937f, 0.003853f, 0.010445f, - 0.041718f, 0.304199f, 0.917480f, 0.917480f, 0.917969f, 0.917480f, 0.918457f, 0.917969f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000023f, 0.000037f, - 0.000048f, 0.000048f, 0.000063f, 0.000063f, 0.000074f, 0.000077f, 0.000080f, 0.000083f, - 0.000086f, 0.000088f, 0.000090f, 0.000091f, 0.000092f, 0.000094f, 0.000095f, 0.000096f, - 0.000084f, 0.000073f, 0.000064f, 0.000057f, 0.000049f, 0.000043f, 0.000037f, 0.000033f, - 0.000029f, 0.000025f, 0.000060f, 0.000061f, 0.000087f, 0.000118f, 0.000156f, 0.000131f, - 0.000175f, 0.000226f, 0.000230f, 0.000373f, 0.000507f, 0.000992f, 0.001814f, 0.004639f, - 0.018799f, 0.176758f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895020f, 0.895996f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000019f, 0.000028f, 0.000034f, 0.000043f, - 0.000052f, 0.000057f, 0.000062f, 0.000067f, 0.000070f, 0.000074f, 0.000075f, 0.000079f, - 0.000081f, 0.000083f, 0.000085f, 0.000076f, 0.000068f, 0.000059f, 0.000051f, 0.000046f, - 0.000040f, 0.000035f, 0.000030f, 0.000026f, 0.000028f, 0.000038f, 0.000072f, 0.000100f, - 0.000120f, 0.000107f, 0.000152f, 0.000156f, 0.000254f, 0.000436f, 0.000722f, 0.001875f, - 0.007088f, 0.083069f, 0.863281f, 0.862305f, 0.863281f, 0.862305f, 0.863281f, 0.862793f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000005f, 0.000015f, 0.000022f, 0.000030f, 0.000037f, 0.000042f, - 0.000048f, 0.000053f, 0.000058f, 0.000060f, 0.000064f, 0.000067f, 0.000069f, 0.000061f, - 0.000053f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f, 0.000023f, 0.000020f, - 0.000036f, 0.000063f, 0.000082f, 0.000081f, 0.000104f, 0.000149f, 0.000263f, 0.000616f, - 0.002337f, 0.028168f, 0.816406f, 0.816895f, 0.816895f, 0.816895f, 0.817383f, 0.816895f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000003f, 0.000011f, 0.000019f, 0.000026f, 0.000031f, 0.000036f, - 0.000041f, 0.000045f, 0.000050f, 0.000047f, 0.000041f, 0.000036f, 0.000031f, 0.000027f, - 0.000023f, 0.000019f, 0.000028f, 0.000029f, 0.000053f, 0.000052f, 0.000072f, 0.000165f, - 0.000511f, 0.006050f, 0.751465f, 0.752441f, 0.752930f, 0.752441f, 0.752441f, 0.752930f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000011f, 0.000017f, 0.000021f, 0.000027f, - 0.000028f, 0.000024f, 0.000020f, 0.000017f, 0.000013f, 0.000020f, 0.000021f, 0.000029f, - 0.000057f, 0.000588f, 0.665039f, 0.664551f, 0.665527f, 0.665039f, 0.665039f, 0.665039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000009f, 0.000006f, - 0.000004f, 0.000007f, 0.557129f, 0.558105f, 0.557617f, 0.557617f, 0.558594f, 0.558105f, - }, - { - 0.163818f, 0.558105f, 0.755859f, 0.841797f, 0.886230f, 0.912109f, 0.929199f, 0.941406f, - 0.950195f, 0.957031f, 0.961914f, 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.978027f, - 0.979492f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, - 0.989258f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.998047f, 0.998047f, - 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999512f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.027023f, 0.138184f, 0.353760f, 0.583984f, 0.735352f, 0.819336f, 0.868652f, 0.898926f, - 0.918945f, 0.933594f, 0.943848f, 0.952148f, 0.958984f, 0.963867f, 0.967773f, 0.971680f, - 0.974121f, 0.976562f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f, - 0.986816f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.990723f, 0.991699f, 0.992676f, - 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.009819f, 0.044250f, 0.113525f, 0.244995f, 0.430420f, 0.608887f, 0.733887f, 0.810547f, - 0.860352f, 0.892578f, 0.913086f, 0.929688f, 0.940918f, 0.949219f, 0.956055f, 0.961426f, - 0.966309f, 0.970215f, 0.972656f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.983398f, - 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988281f, 0.989746f, 0.989746f, 0.991211f, - 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, - 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.004848f, 0.020447f, 0.046814f, 0.096313f, 0.183228f, 0.319092f, 0.484375f, 0.631836f, - 0.739258f, 0.810547f, 0.857422f, 0.888672f, 0.910645f, 0.925781f, 0.938965f, 0.947754f, - 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.971191f, 0.974609f, 0.977051f, 0.979004f, - 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, - 0.990234f, 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.992676f, 0.993652f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.003096f, 0.011017f, 0.024399f, 0.046600f, 0.083191f, 0.145386f, 0.243774f, 0.379395f, - 0.529297f, 0.656738f, 0.750977f, 0.813965f, 0.857910f, 0.887695f, 0.909668f, 0.925293f, - 0.937500f, 0.946289f, 0.953613f, 0.959473f, 0.964355f, 0.968262f, 0.971191f, 0.974121f, - 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f, - 0.988281f, 0.989258f, 0.989746f, 0.991211f, 0.991699f, 0.991699f, 0.992676f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, - 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001808f, 0.006992f, 0.014923f, 0.026413f, 0.044403f, 0.073120f, 0.119446f, 0.193115f, - 0.300537f, 0.433594f, 0.568848f, 0.680664f, 0.763184f, 0.821289f, 0.860840f, 0.890137f, - 0.909668f, 0.925293f, 0.937500f, 0.945801f, 0.953613f, 0.959473f, 0.963867f, 0.968262f, - 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.984863f, - 0.986816f, 0.987305f, 0.987793f, 0.989746f, 0.989746f, 0.991211f, 0.991699f, 0.992188f, - 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, 0.996094f, 0.996094f, - 0.996094f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.001668f, 0.005253f, 0.010010f, 0.016602f, 0.026459f, 0.042023f, 0.065369f, 0.101868f, - 0.158081f, 0.241455f, 0.354248f, 0.483887f, 0.606934f, 0.706055f, 0.777832f, 0.830566f, - 0.867188f, 0.893066f, 0.912109f, 0.926270f, 0.938477f, 0.946289f, 0.953125f, 0.959473f, - 0.964355f, 0.968750f, 0.971680f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, - 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990234f, 0.991211f, - 0.992188f, 0.993164f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998047f, 0.998535f, 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.001086f, 0.003477f, 0.006756f, 0.011604f, 0.018066f, 0.027222f, 0.039978f, 0.059448f, - 0.088257f, 0.132690f, 0.198120f, 0.291504f, 0.408447f, 0.531250f, 0.641602f, 0.728516f, - 0.793457f, 0.839844f, 0.873047f, 0.896973f, 0.915527f, 0.929199f, 0.939941f, 0.948730f, - 0.955566f, 0.960938f, 0.965332f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f, - 0.981445f, 0.983398f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.989746f, - 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.994629f, - 0.995605f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, 0.997559f, - 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000982f, 0.002764f, 0.004925f, 0.008194f, 0.012703f, 0.018417f, 0.026154f, 0.037964f, - 0.053894f, 0.078552f, 0.113770f, 0.166626f, 0.242310f, 0.343262f, 0.460449f, 0.576660f, - 0.675293f, 0.753418f, 0.809570f, 0.851074f, 0.879883f, 0.902344f, 0.919434f, 0.931152f, - 0.941895f, 0.950195f, 0.956055f, 0.960938f, 0.965820f, 0.969727f, 0.973145f, 0.976074f, - 0.978027f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000723f, 0.002268f, 0.003639f, 0.006371f, 0.009392f, 0.013046f, 0.018570f, 0.026016f, - 0.035919f, 0.049957f, 0.070618f, 0.099609f, 0.142212f, 0.204590f, 0.290039f, 0.396973f, - 0.512207f, 0.619141f, 0.707520f, 0.775391f, 0.825195f, 0.860352f, 0.887207f, 0.907715f, - 0.923340f, 0.935547f, 0.944824f, 0.951660f, 0.958496f, 0.963379f, 0.967773f, 0.971191f, - 0.974121f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.985352f, 0.987305f, - 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993164f, - 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000364f, 0.001690f, 0.003056f, 0.004982f, 0.007217f, 0.010124f, 0.013931f, 0.018738f, - 0.025177f, 0.034332f, 0.045990f, 0.063599f, 0.088501f, 0.124146f, 0.175781f, 0.248047f, - 0.341797f, 0.451416f, 0.562012f, 0.659668f, 0.738281f, 0.797852f, 0.841797f, 0.872559f, - 0.896484f, 0.914062f, 0.928711f, 0.938477f, 0.947266f, 0.954590f, 0.959473f, 0.964844f, - 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983398f, 0.985352f, - 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, - 0.997070f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000365f, 0.001221f, 0.002531f, 0.003979f, 0.005829f, 0.007874f, 0.010475f, 0.013962f, - 0.018402f, 0.024368f, 0.032257f, 0.042847f, 0.057983f, 0.079346f, 0.109375f, 0.153198f, - 0.214233f, 0.295898f, 0.397705f, 0.506836f, 0.609863f, 0.698730f, 0.767578f, 0.817871f, - 0.854980f, 0.883301f, 0.903809f, 0.920410f, 0.933105f, 0.942871f, 0.950195f, 0.957031f, - 0.962402f, 0.966797f, 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981445f, 0.982910f, - 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.989746f, 0.989746f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000343f, 0.001357f, 0.002039f, 0.003130f, 0.004398f, 0.006432f, 0.008141f, 0.010925f, - 0.014008f, 0.018326f, 0.023331f, 0.030655f, 0.040558f, 0.053680f, 0.071960f, 0.098206f, - 0.134644f, 0.187012f, 0.258057f, 0.349854f, 0.455566f, 0.562012f, 0.656738f, 0.734863f, - 0.792969f, 0.836914f, 0.868652f, 0.894043f, 0.912598f, 0.926758f, 0.937988f, 0.947266f, - 0.954590f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.975586f, 0.978027f, 0.980469f, - 0.981934f, 0.983398f, 0.985840f, 0.986816f, 0.988281f, 0.989258f, 0.990723f, 0.990723f, - 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.001185f, 0.001561f, 0.002504f, 0.003990f, 0.005272f, 0.006573f, 0.008606f, - 0.010933f, 0.013878f, 0.017715f, 0.022415f, 0.029068f, 0.038086f, 0.049774f, 0.066162f, - 0.088257f, 0.120361f, 0.164917f, 0.227173f, 0.308838f, 0.407959f, 0.515137f, 0.615723f, - 0.700684f, 0.767090f, 0.817383f, 0.854492f, 0.882812f, 0.904297f, 0.920898f, 0.932617f, - 0.943359f, 0.951172f, 0.957520f, 0.962891f, 0.967773f, 0.971191f, 0.974121f, 0.977539f, - 0.979492f, 0.981445f, 0.983887f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989258f, - 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000243f, 0.000847f, 0.001555f, 0.002224f, 0.003141f, 0.004093f, 0.005264f, 0.006817f, - 0.008850f, 0.010948f, 0.014053f, 0.017456f, 0.022339f, 0.028351f, 0.036011f, 0.046326f, - 0.060791f, 0.080444f, 0.107788f, 0.146851f, 0.201660f, 0.274658f, 0.366699f, 0.470215f, - 0.574707f, 0.666016f, 0.740234f, 0.797363f, 0.839355f, 0.871094f, 0.895508f, 0.913574f, - 0.927734f, 0.938965f, 0.947754f, 0.955566f, 0.960449f, 0.965332f, 0.969727f, 0.973145f, - 0.976074f, 0.979004f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.987305f, 0.988770f, - 0.989258f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, - 0.995117f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000767f, 0.001042f, 0.001934f, 0.002502f, 0.003588f, 0.004292f, 0.005558f, - 0.006824f, 0.008667f, 0.010872f, 0.013802f, 0.017426f, 0.021637f, 0.027176f, 0.033936f, - 0.043304f, 0.056549f, 0.073914f, 0.098083f, 0.132446f, 0.180664f, 0.245239f, 0.330078f, - 0.429199f, 0.533203f, 0.631348f, 0.711914f, 0.775879f, 0.823242f, 0.860352f, 0.886230f, - 0.907227f, 0.923340f, 0.935059f, 0.944824f, 0.952148f, 0.958984f, 0.964844f, 0.968750f, - 0.972168f, 0.975586f, 0.978516f, 0.980957f, 0.982422f, 0.983887f, 0.985840f, 0.987305f, - 0.988770f, 0.989746f, 0.990234f, 0.992188f, 0.992676f, 0.992676f, 0.994141f, 0.994141f, - 0.995117f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000000f, 0.000485f, 0.001062f, 0.001658f, 0.002398f, 0.002998f, 0.003805f, 0.004723f, - 0.006004f, 0.007084f, 0.009102f, 0.011093f, 0.013489f, 0.016876f, 0.020813f, 0.025803f, - 0.032257f, 0.040924f, 0.052673f, 0.068298f, 0.090149f, 0.120239f, 0.162598f, 0.221313f, - 0.298096f, 0.392822f, 0.496582f, 0.597656f, 0.684082f, 0.754883f, 0.807617f, 0.848145f, - 0.877930f, 0.900391f, 0.917969f, 0.931641f, 0.941406f, 0.950684f, 0.957031f, 0.962402f, - 0.967773f, 0.971680f, 0.974609f, 0.978027f, 0.980469f, 0.982422f, 0.984375f, 0.985840f, - 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.000477f, 0.000852f, 0.001439f, 0.002045f, 0.002424f, 0.003101f, 0.004093f, - 0.004887f, 0.005989f, 0.007751f, 0.008606f, 0.011002f, 0.013420f, 0.016251f, 0.020035f, - 0.024628f, 0.030579f, 0.039093f, 0.049255f, 0.063599f, 0.083191f, 0.109924f, 0.148071f, - 0.200928f, 0.270996f, 0.359863f, 0.461670f, 0.564453f, 0.656738f, 0.732910f, 0.791992f, - 0.836426f, 0.869629f, 0.894531f, 0.913086f, 0.928223f, 0.939453f, 0.949219f, 0.956055f, - 0.961914f, 0.966797f, 0.970703f, 0.975098f, 0.977051f, 0.979492f, 0.982422f, 0.983887f, - 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, - 0.993652f, 0.994629f, 0.998047f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.998535f, - 0.000242f, 0.000650f, 0.000847f, 0.001138f, 0.001621f, 0.002239f, 0.002527f, 0.003325f, - 0.004227f, 0.005165f, 0.006462f, 0.007389f, 0.008904f, 0.011024f, 0.013130f, 0.015915f, - 0.019272f, 0.023819f, 0.029205f, 0.036652f, 0.046417f, 0.059418f, 0.077209f, 0.101562f, - 0.136230f, 0.183350f, 0.248047f, 0.331055f, 0.429688f, 0.533203f, 0.630859f, 0.711426f, - 0.776367f, 0.824219f, 0.861328f, 0.887695f, 0.908691f, 0.924805f, 0.937500f, 0.946777f, - 0.954102f, 0.960938f, 0.966309f, 0.970215f, 0.974121f, 0.977539f, 0.979492f, 0.981934f, - 0.983887f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992676f, - 0.993164f, 0.994141f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000089f, 0.000243f, 0.000827f, 0.000964f, 0.001418f, 0.001579f, 0.002296f, 0.002914f, - 0.003632f, 0.004280f, 0.005344f, 0.006130f, 0.007545f, 0.008949f, 0.010498f, 0.012733f, - 0.015686f, 0.018646f, 0.023010f, 0.028229f, 0.034851f, 0.044098f, 0.056122f, 0.072388f, - 0.094788f, 0.125610f, 0.168945f, 0.228271f, 0.306396f, 0.401123f, 0.504883f, 0.604492f, - 0.691895f, 0.760742f, 0.813477f, 0.853027f, 0.881836f, 0.904297f, 0.921387f, 0.934570f, - 0.944824f, 0.953125f, 0.959961f, 0.964844f, 0.969727f, 0.973633f, 0.976562f, 0.979492f, - 0.981934f, 0.983887f, 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.991211f, 0.992188f, - 0.992676f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000069f, 0.000461f, 0.000609f, 0.000933f, 0.001088f, 0.001488f, 0.001900f, 0.002378f, - 0.003101f, 0.003687f, 0.004547f, 0.005276f, 0.006233f, 0.007282f, 0.008820f, 0.010239f, - 0.012581f, 0.015312f, 0.018341f, 0.022095f, 0.027344f, 0.034027f, 0.041687f, 0.053467f, - 0.067810f, 0.088440f, 0.117126f, 0.156616f, 0.211426f, 0.284180f, 0.375977f, 0.478760f, - 0.581543f, 0.672363f, 0.746094f, 0.802734f, 0.845703f, 0.877441f, 0.900879f, 0.918457f, - 0.933105f, 0.943848f, 0.951660f, 0.959473f, 0.964355f, 0.968750f, 0.974121f, 0.977051f, - 0.979492f, 0.982422f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.991211f, - 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000244f, 0.000348f, 0.000606f, 0.000737f, 0.001079f, 0.001458f, 0.001783f, 0.002192f, - 0.002924f, 0.003231f, 0.003862f, 0.004551f, 0.005169f, 0.006367f, 0.007381f, 0.008682f, - 0.010590f, 0.012199f, 0.014900f, 0.017761f, 0.021530f, 0.026108f, 0.032349f, 0.039642f, - 0.050446f, 0.064392f, 0.083313f, 0.109436f, 0.145996f, 0.197021f, 0.266357f, 0.354248f, - 0.455811f, 0.560059f, 0.654785f, 0.732910f, 0.793457f, 0.837891f, 0.873047f, 0.897461f, - 0.917480f, 0.931641f, 0.941895f, 0.951172f, 0.958984f, 0.964844f, 0.969727f, 0.973633f, - 0.977051f, 0.979980f, 0.981934f, 0.984375f, 0.985840f, 0.988281f, 0.989258f, 0.990234f, - 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000244f, 0.000520f, 0.000592f, 0.000720f, 0.000812f, 0.001174f, 0.001500f, 0.001884f, - 0.002178f, 0.002831f, 0.003321f, 0.003885f, 0.004471f, 0.005436f, 0.006275f, 0.007584f, - 0.008675f, 0.010521f, 0.012238f, 0.014557f, 0.017197f, 0.020874f, 0.025467f, 0.030960f, - 0.038208f, 0.047821f, 0.061249f, 0.078552f, 0.103149f, 0.136841f, 0.184937f, 0.249878f, - 0.334473f, 0.435059f, 0.539551f, 0.638184f, 0.720215f, 0.784668f, 0.832031f, 0.868164f, - 0.894531f, 0.914062f, 0.929688f, 0.942383f, 0.950684f, 0.958984f, 0.964844f, 0.970215f, - 0.974121f, 0.977539f, 0.979980f, 0.982422f, 0.984863f, 0.985840f, 0.988281f, 0.989258f, - 0.990723f, 0.992188f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, - 0.000000f, 0.000243f, 0.000351f, 0.000603f, 0.000708f, 0.001079f, 0.001493f, 0.001752f, - 0.001936f, 0.002171f, 0.002911f, 0.003382f, 0.003906f, 0.004578f, 0.005222f, 0.006161f, - 0.007362f, 0.008850f, 0.010010f, 0.011971f, 0.014145f, 0.016983f, 0.020477f, 0.024582f, - 0.029739f, 0.036804f, 0.045837f, 0.057648f, 0.074829f, 0.097534f, 0.130127f, 0.174438f, - 0.236572f, 0.318604f, 0.416992f, 0.523926f, 0.624023f, 0.709961f, 0.777344f, 0.827148f, - 0.865234f, 0.893066f, 0.914062f, 0.929688f, 0.941406f, 0.951660f, 0.958496f, 0.965820f, - 0.969238f, 0.974609f, 0.977539f, 0.980469f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, - 0.989746f, 0.990723f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000243f, 0.000244f, 0.000456f, 0.000592f, 0.000602f, 0.001025f, 0.001282f, 0.001656f, - 0.001856f, 0.002073f, 0.002535f, 0.002768f, 0.003487f, 0.003822f, 0.004574f, 0.005589f, - 0.006519f, 0.007336f, 0.008453f, 0.009911f, 0.011581f, 0.013985f, 0.016373f, 0.019638f, - 0.023819f, 0.028473f, 0.035339f, 0.043945f, 0.055939f, 0.071350f, 0.093140f, 0.123474f, - 0.165771f, 0.225342f, 0.304199f, 0.402344f, 0.509277f, 0.612305f, 0.702148f, 0.771973f, - 0.824219f, 0.863281f, 0.891113f, 0.913086f, 0.930176f, 0.942383f, 0.951660f, 0.959473f, - 0.965820f, 0.970215f, 0.974609f, 0.977539f, 0.980957f, 0.983887f, 0.985352f, 0.987305f, - 0.988770f, 0.990723f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000000f, 0.000243f, 0.000276f, 0.000557f, 0.000594f, 0.000849f, 0.000845f, 0.001282f, - 0.001520f, 0.001774f, 0.002119f, 0.002499f, 0.002840f, 0.003252f, 0.004005f, 0.004555f, - 0.005245f, 0.006168f, 0.007233f, 0.008301f, 0.009911f, 0.011330f, 0.013748f, 0.015945f, - 0.019089f, 0.023071f, 0.027786f, 0.034058f, 0.042542f, 0.053619f, 0.068237f, 0.089539f, - 0.117798f, 0.158325f, 0.215698f, 0.293213f, 0.389893f, 0.498291f, 0.603027f, 0.694824f, - 0.767090f, 0.821777f, 0.862305f, 0.891113f, 0.914062f, 0.930176f, 0.942383f, 0.952148f, - 0.959473f, 0.965820f, 0.971680f, 0.975098f, 0.978516f, 0.981445f, 0.983887f, 0.985840f, - 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996094f, 0.996582f, - 0.000240f, 0.000240f, 0.000242f, 0.000365f, 0.000678f, 0.000779f, 0.000957f, 0.001003f, - 0.001390f, 0.001656f, 0.001828f, 0.002274f, 0.002455f, 0.003210f, 0.003704f, 0.004097f, - 0.004616f, 0.005409f, 0.006180f, 0.007092f, 0.008453f, 0.009521f, 0.011154f, 0.013397f, - 0.015656f, 0.018509f, 0.022247f, 0.026810f, 0.032928f, 0.041046f, 0.051727f, 0.065613f, - 0.085205f, 0.113098f, 0.152832f, 0.208496f, 0.284424f, 0.380371f, 0.489258f, 0.596680f, - 0.690918f, 0.764648f, 0.821777f, 0.862305f, 0.892578f, 0.914551f, 0.931152f, 0.943848f, - 0.953613f, 0.960938f, 0.967773f, 0.971680f, 0.976074f, 0.979492f, 0.982422f, 0.984863f, - 0.986816f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, - 0.000000f, 0.000242f, 0.000242f, 0.000364f, 0.000465f, 0.000803f, 0.000927f, 0.000956f, - 0.001275f, 0.001335f, 0.001570f, 0.001968f, 0.002184f, 0.002726f, 0.003069f, 0.003294f, - 0.003906f, 0.004662f, 0.005245f, 0.006027f, 0.007191f, 0.008202f, 0.009460f, 0.010735f, - 0.012970f, 0.015404f, 0.018051f, 0.021484f, 0.026321f, 0.032135f, 0.039581f, 0.049805f, - 0.063538f, 0.082458f, 0.109497f, 0.147827f, 0.202393f, 0.277344f, 0.373535f, 0.483887f, - 0.593262f, 0.688477f, 0.764648f, 0.821289f, 0.863281f, 0.894043f, 0.916016f, 0.932129f, - 0.944336f, 0.954590f, 0.962402f, 0.968262f, 0.973633f, 0.977051f, 0.980957f, 0.983398f, - 0.985352f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, - 0.000000f, 0.000239f, 0.000360f, 0.000362f, 0.000363f, 0.000475f, 0.000767f, 0.000931f, - 0.000951f, 0.001211f, 0.001491f, 0.001634f, 0.002129f, 0.002457f, 0.002678f, 0.002995f, - 0.003393f, 0.003922f, 0.004711f, 0.005135f, 0.005955f, 0.006935f, 0.008072f, 0.009270f, - 0.010841f, 0.012558f, 0.014618f, 0.017502f, 0.020828f, 0.025269f, 0.030884f, 0.038269f, - 0.048218f, 0.061554f, 0.080505f, 0.106567f, 0.144287f, 0.197998f, 0.272705f, 0.369141f, - 0.480469f, 0.591797f, 0.690430f, 0.767090f, 0.824707f, 0.866699f, 0.896484f, 0.918457f, - 0.934570f, 0.946777f, 0.956543f, 0.963379f, 0.969727f, 0.974609f, 0.978027f, 0.981934f, - 0.984375f, 0.986328f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000208f, 0.000238f, 0.000362f, 0.000363f, 0.000555f, 0.000600f, 0.000888f, - 0.001140f, 0.001140f, 0.001272f, 0.001661f, 0.001811f, 0.002041f, 0.002550f, 0.002636f, - 0.002941f, 0.003492f, 0.004032f, 0.004593f, 0.005062f, 0.005875f, 0.007015f, 0.007965f, - 0.009079f, 0.010300f, 0.012291f, 0.014229f, 0.016937f, 0.020248f, 0.024689f, 0.030151f, - 0.037354f, 0.047028f, 0.060211f, 0.078491f, 0.104431f, 0.141602f, 0.195068f, 0.270264f, - 0.367676f, 0.480957f, 0.594238f, 0.693848f, 0.770996f, 0.828613f, 0.869629f, 0.898438f, - 0.921875f, 0.937012f, 0.949219f, 0.958008f, 0.964844f, 0.971680f, 0.976074f, 0.979980f, - 0.982422f, 0.985840f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000229f, 0.000358f, 0.000479f, 0.000362f, 0.000498f, 0.000634f, - 0.000836f, 0.000927f, 0.001288f, 0.001244f, 0.001605f, 0.001732f, 0.002106f, 0.002478f, - 0.002613f, 0.003183f, 0.003510f, 0.004021f, 0.004528f, 0.005047f, 0.005768f, 0.006859f, - 0.007759f, 0.008865f, 0.009933f, 0.011742f, 0.013741f, 0.016678f, 0.019897f, 0.024017f, - 0.029297f, 0.036469f, 0.045990f, 0.058990f, 0.077026f, 0.102722f, 0.140015f, 0.193604f, - 0.269531f, 0.369141f, 0.485107f, 0.600098f, 0.700195f, 0.777344f, 0.833984f, 0.873535f, - 0.903809f, 0.924316f, 0.940430f, 0.951172f, 0.960938f, 0.968262f, 0.973145f, 0.978027f, - 0.980957f, 0.983887f, 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995117f, - 0.000000f, 0.000000f, 0.000078f, 0.000353f, 0.000354f, 0.000360f, 0.000482f, 0.000573f, - 0.000757f, 0.000923f, 0.001230f, 0.001266f, 0.001485f, 0.001679f, 0.001963f, 0.002161f, - 0.002235f, 0.002739f, 0.003115f, 0.003563f, 0.003933f, 0.004436f, 0.004917f, 0.005623f, - 0.006599f, 0.007469f, 0.008484f, 0.010101f, 0.011665f, 0.013695f, 0.016403f, 0.019531f, - 0.023300f, 0.028870f, 0.035889f, 0.045135f, 0.058014f, 0.075928f, 0.101746f, 0.139160f, - 0.193848f, 0.271729f, 0.374023f, 0.492920f, 0.609863f, 0.709473f, 0.786133f, 0.842285f, - 0.880859f, 0.908691f, 0.928711f, 0.943848f, 0.954102f, 0.963867f, 0.969727f, 0.975098f, - 0.979004f, 0.982422f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994629f, - 0.000000f, 0.000000f, 0.000000f, 0.000330f, 0.000336f, 0.000352f, 0.000478f, 0.000481f, - 0.000676f, 0.000822f, 0.001072f, 0.001228f, 0.001283f, 0.001417f, 0.001621f, 0.001938f, - 0.001953f, 0.002377f, 0.002737f, 0.002914f, 0.003624f, 0.003721f, 0.004555f, 0.004845f, - 0.005531f, 0.006325f, 0.007244f, 0.008255f, 0.009911f, 0.011467f, 0.013496f, 0.016068f, - 0.018951f, 0.022888f, 0.028183f, 0.035126f, 0.044617f, 0.057220f, 0.075134f, 0.101501f, - 0.139526f, 0.195679f, 0.276123f, 0.381592f, 0.503418f, 0.622070f, 0.721680f, 0.796387f, - 0.850098f, 0.887207f, 0.914551f, 0.933594f, 0.947266f, 0.957520f, 0.966797f, 0.972656f, - 0.977539f, 0.980957f, 0.993164f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000243f, 0.000466f, 0.000474f, 0.000475f, - 0.000600f, 0.000740f, 0.000796f, 0.001130f, 0.001333f, 0.001339f, 0.001440f, 0.001575f, - 0.001961f, 0.002031f, 0.002388f, 0.002563f, 0.003174f, 0.003345f, 0.003555f, 0.004143f, - 0.004681f, 0.005333f, 0.006191f, 0.007111f, 0.008278f, 0.009666f, 0.011177f, 0.013451f, - 0.015511f, 0.018707f, 0.022629f, 0.027847f, 0.034515f, 0.043976f, 0.056671f, 0.075012f, - 0.101685f, 0.140869f, 0.199341f, 0.282959f, 0.393311f, 0.519043f, 0.639160f, 0.736328f, - 0.809082f, 0.860352f, 0.896484f, 0.920898f, 0.939453f, 0.951660f, 0.961914f, 0.969238f, - 0.975098f, 0.979492f, 0.993164f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000367f, 0.000448f, 0.000589f, - 0.000595f, 0.000719f, 0.000707f, 0.000809f, 0.000966f, 0.001217f, 0.001369f, 0.001405f, - 0.001579f, 0.001786f, 0.002100f, 0.002260f, 0.002600f, 0.002762f, 0.003023f, 0.003531f, - 0.004219f, 0.004810f, 0.005409f, 0.006092f, 0.007053f, 0.008064f, 0.009163f, 0.010941f, - 0.012733f, 0.015251f, 0.018280f, 0.022202f, 0.027573f, 0.034271f, 0.043732f, 0.056458f, - 0.075134f, 0.102661f, 0.143433f, 0.205078f, 0.293701f, 0.409668f, 0.538574f, 0.658203f, - 0.753418f, 0.823242f, 0.870605f, 0.905273f, 0.927734f, 0.943848f, 0.956055f, 0.964844f, - 0.972168f, 0.977539f, 0.992188f, 0.992676f, 0.993164f, 0.993652f, 0.993164f, 0.992676f, - 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000231f, 0.000314f, 0.000562f, - 0.000589f, 0.000699f, 0.000717f, 0.000776f, 0.000926f, 0.000968f, 0.001242f, 0.001360f, - 0.001487f, 0.001564f, 0.001713f, 0.002073f, 0.002169f, 0.002380f, 0.002941f, 0.003229f, - 0.003534f, 0.003914f, 0.004509f, 0.005127f, 0.005939f, 0.006596f, 0.007812f, 0.009354f, - 0.010559f, 0.012581f, 0.015007f, 0.018021f, 0.022079f, 0.027191f, 0.034119f, 0.043427f, - 0.057190f, 0.075623f, 0.104492f, 0.147949f, 0.213135f, 0.308105f, 0.430664f, 0.562500f, - 0.681641f, 0.772949f, 0.839355f, 0.884277f, 0.913574f, 0.934570f, 0.950195f, 0.961426f, - 0.969238f, 0.975098f, 0.991211f, 0.992676f, 0.992676f, 0.992676f, 0.992676f, 0.992188f, - 0.000000f, 0.000000f, 0.000000f, 0.000084f, 0.000117f, 0.000119f, 0.000367f, 0.000473f, - 0.000555f, 0.000576f, 0.000674f, 0.000713f, 0.000816f, 0.000913f, 0.001049f, 0.001168f, - 0.001263f, 0.001473f, 0.001580f, 0.001781f, 0.002005f, 0.002123f, 0.002316f, 0.002674f, - 0.003094f, 0.003475f, 0.003967f, 0.004318f, 0.004833f, 0.005798f, 0.006699f, 0.007801f, - 0.008888f, 0.010429f, 0.012268f, 0.014824f, 0.017792f, 0.021790f, 0.026978f, 0.033844f, - 0.043518f, 0.057068f, 0.077148f, 0.107605f, 0.154053f, 0.224609f, 0.326904f, 0.456543f, - 0.591797f, 0.708984f, 0.795410f, 0.855957f, 0.895508f, 0.923340f, 0.942383f, 0.955566f, - 0.965332f, 0.973145f, 0.991211f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.991699f, - 0.000000f, 0.000000f, 0.000000f, 0.000092f, 0.000070f, 0.000236f, 0.000119f, 0.000376f, - 0.000433f, 0.000561f, 0.000688f, 0.000586f, 0.000742f, 0.000842f, 0.000881f, 0.000937f, - 0.001141f, 0.001300f, 0.001434f, 0.001464f, 0.001598f, 0.001829f, 0.002062f, 0.002338f, - 0.002583f, 0.003036f, 0.003460f, 0.003704f, 0.004383f, 0.004986f, 0.005615f, 0.006439f, - 0.007267f, 0.008797f, 0.010330f, 0.012146f, 0.014473f, 0.017532f, 0.021622f, 0.026535f, - 0.033539f, 0.043579f, 0.058044f, 0.079041f, 0.111572f, 0.162109f, 0.239746f, 0.350830f, - 0.488770f, 0.625000f, 0.737305f, 0.817871f, 0.871582f, 0.908203f, 0.932129f, 0.949219f, - 0.961914f, 0.970215f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000100f, 0.000115f, 0.000335f, 0.000350f, - 0.000355f, 0.000473f, 0.000633f, 0.000678f, 0.000695f, 0.000694f, 0.000812f, 0.000733f, - 0.001109f, 0.001098f, 0.001260f, 0.001452f, 0.001377f, 0.001534f, 0.001972f, 0.001982f, - 0.002232f, 0.002567f, 0.002764f, 0.003273f, 0.003542f, 0.004181f, 0.004738f, 0.005466f, - 0.006268f, 0.007126f, 0.008614f, 0.010170f, 0.012093f, 0.014359f, 0.017075f, 0.021042f, - 0.026459f, 0.033722f, 0.044159f, 0.059113f, 0.082092f, 0.117249f, 0.173218f, 0.259766f, - 0.382080f, 0.526367f, 0.662598f, 0.768066f, 0.840332f, 0.889648f, 0.920410f, 0.940918f, - 0.956543f, 0.966309f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000191f, 0.000236f, 0.000335f, - 0.000337f, 0.000466f, 0.000399f, 0.000608f, 0.000626f, 0.000669f, 0.000696f, 0.000808f, - 0.000859f, 0.000915f, 0.000903f, 0.001168f, 0.001245f, 0.001500f, 0.001525f, 0.001863f, - 0.001941f, 0.002121f, 0.002399f, 0.002861f, 0.002953f, 0.003632f, 0.004105f, 0.004745f, - 0.005333f, 0.006317f, 0.007236f, 0.008255f, 0.009857f, 0.011414f, 0.014015f, 0.016922f, - 0.020828f, 0.026321f, 0.034149f, 0.044861f, 0.061279f, 0.085571f, 0.124878f, 0.187866f, - 0.285645f, 0.420654f, 0.570801f, 0.703125f, 0.799805f, 0.864258f, 0.905273f, 0.932129f, - 0.950684f, 0.963379f, 0.988770f, 0.989258f, 0.989746f, 0.989746f, 0.989746f, 0.989746f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000000f, 0.000122f, 0.000125f, 0.000232f, - 0.000360f, 0.000342f, 0.000463f, 0.000388f, 0.000569f, 0.000638f, 0.000671f, 0.000791f, - 0.000774f, 0.000943f, 0.000774f, 0.001018f, 0.001044f, 0.001245f, 0.001377f, 0.001410f, - 0.001643f, 0.001970f, 0.002041f, 0.002316f, 0.002758f, 0.003023f, 0.003433f, 0.003859f, - 0.004444f, 0.005180f, 0.006134f, 0.006920f, 0.008102f, 0.009354f, 0.011475f, 0.013649f, - 0.016739f, 0.021011f, 0.026566f, 0.034454f, 0.046051f, 0.063843f, 0.090942f, 0.135498f, - 0.207642f, 0.319580f, 0.467529f, 0.620605f, 0.745605f, 0.830566f, 0.886230f, 0.920898f, - 0.943848f, 0.958984f, 0.987793f, 0.988281f, 0.988770f, 0.988770f, 0.988281f, 0.988770f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000188f, 0.000200f, - 0.000332f, 0.000417f, 0.000338f, 0.000459f, 0.000349f, 0.000558f, 0.000642f, 0.000636f, - 0.000629f, 0.000807f, 0.000695f, 0.000747f, 0.000827f, 0.001058f, 0.001182f, 0.001269f, - 0.001422f, 0.001472f, 0.001921f, 0.002100f, 0.002337f, 0.002462f, 0.003073f, 0.003374f, - 0.003708f, 0.004265f, 0.004826f, 0.005646f, 0.006596f, 0.007710f, 0.008926f, 0.011063f, - 0.013580f, 0.016495f, 0.020737f, 0.026459f, 0.035126f, 0.047791f, 0.066833f, 0.097778f, - 0.149170f, 0.233887f, 0.363037f, 0.523438f, 0.674805f, 0.788086f, 0.860352f, 0.906250f, - 0.935547f, 0.954102f, 0.986328f, 0.987305f, 0.987305f, 0.987305f, 0.987305f, 0.987793f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000175f, - 0.000155f, 0.000319f, 0.000241f, 0.000318f, 0.000455f, 0.000462f, 0.000496f, 0.000593f, - 0.000516f, 0.000564f, 0.000667f, 0.000668f, 0.000715f, 0.000749f, 0.000925f, 0.001111f, - 0.001246f, 0.001381f, 0.001443f, 0.001856f, 0.001997f, 0.002264f, 0.002363f, 0.002880f, - 0.003212f, 0.003727f, 0.004208f, 0.004673f, 0.005394f, 0.006367f, 0.007404f, 0.009003f, - 0.010651f, 0.013138f, 0.016312f, 0.020767f, 0.027054f, 0.036377f, 0.050262f, 0.071655f, - 0.107361f, 0.167969f, 0.269287f, 0.418457f, 0.587402f, 0.730957f, 0.828125f, 0.888184f, - 0.924805f, 0.948242f, 0.984863f, 0.986328f, 0.986328f, 0.985840f, 0.986328f, 0.986328f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000202f, 0.000133f, 0.000215f, 0.000263f, 0.000304f, 0.000442f, 0.000332f, 0.000365f, - 0.000403f, 0.000549f, 0.000607f, 0.000750f, 0.000788f, 0.000802f, 0.000841f, 0.000958f, - 0.001049f, 0.001188f, 0.001354f, 0.001318f, 0.001582f, 0.001928f, 0.002064f, 0.002321f, - 0.002594f, 0.003042f, 0.003222f, 0.003796f, 0.004440f, 0.005112f, 0.006081f, 0.007259f, - 0.008736f, 0.010612f, 0.013077f, 0.016464f, 0.020950f, 0.027664f, 0.037506f, 0.052795f, - 0.077698f, 0.120361f, 0.194336f, 0.317627f, 0.486572f, 0.657227f, 0.785156f, 0.865234f, - 0.913086f, 0.942871f, 0.983887f, 0.984863f, 0.984375f, 0.984863f, 0.984375f, 0.984863f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000122f, 0.000152f, 0.000257f, 0.000243f, 0.000288f, 0.000345f, 0.000228f, - 0.000358f, 0.000363f, 0.000432f, 0.000494f, 0.000530f, 0.000582f, 0.000762f, 0.000771f, - 0.000913f, 0.000978f, 0.001100f, 0.001305f, 0.001373f, 0.001706f, 0.001712f, 0.001922f, - 0.002155f, 0.002569f, 0.002573f, 0.003094f, 0.003401f, 0.004272f, 0.004978f, 0.005829f, - 0.006924f, 0.008453f, 0.010452f, 0.012871f, 0.016617f, 0.021072f, 0.028427f, 0.039429f, - 0.056732f, 0.086243f, 0.138916f, 0.231812f, 0.381592f, 0.566406f, 0.726562f, 0.833496f, - 0.896973f, 0.933594f, 0.981934f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, - 0.000122f, 0.000121f, 0.000127f, 0.000215f, 0.000159f, 0.000233f, 0.000284f, 0.000326f, - 0.000339f, 0.000339f, 0.000352f, 0.000394f, 0.000623f, 0.000622f, 0.000731f, 0.000730f, - 0.000741f, 0.000829f, 0.000914f, 0.001017f, 0.001151f, 0.001469f, 0.001263f, 0.001480f, - 0.001740f, 0.002069f, 0.002104f, 0.002443f, 0.002831f, 0.003519f, 0.003929f, 0.004627f, - 0.005455f, 0.006634f, 0.008316f, 0.009949f, 0.012596f, 0.016495f, 0.021729f, 0.029877f, - 0.042084f, 0.062805f, 0.098694f, 0.165283f, 0.284668f, 0.465088f, 0.654297f, 0.793945f, - 0.877930f, 0.924805f, 0.979980f, 0.980957f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, - 0.000121f, 0.000121f, 0.000150f, 0.000163f, 0.000069f, 0.000057f, 0.000121f, 0.000231f, - 0.000291f, 0.000304f, 0.000334f, 0.000339f, 0.000346f, 0.000569f, 0.000648f, 0.000674f, - 0.000649f, 0.000697f, 0.000772f, 0.000834f, 0.000972f, 0.001005f, 0.001189f, 0.001359f, - 0.001237f, 0.001567f, 0.001794f, 0.001963f, 0.002378f, 0.002712f, 0.002867f, 0.003853f, - 0.004330f, 0.005196f, 0.006516f, 0.008026f, 0.009888f, 0.012703f, 0.016479f, 0.022110f, - 0.031158f, 0.045746f, 0.070557f, 0.117004f, 0.204956f, 0.360596f, 0.564453f, 0.740723f, - 0.852051f, 0.912598f, 0.977539f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979004f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000098f, 0.000082f, 0.000067f, 0.000056f, 0.000124f, - 0.000193f, 0.000240f, 0.000258f, 0.000310f, 0.000326f, 0.000335f, 0.000341f, 0.000471f, - 0.000613f, 0.000494f, 0.000716f, 0.000742f, 0.000804f, 0.000873f, 0.000832f, 0.001070f, - 0.001120f, 0.001146f, 0.001225f, 0.001696f, 0.001814f, 0.002041f, 0.002419f, 0.002941f, - 0.003433f, 0.004154f, 0.004818f, 0.006077f, 0.007652f, 0.009521f, 0.012444f, 0.017029f, - 0.023193f, 0.033539f, 0.050690f, 0.082092f, 0.144043f, 0.265869f, 0.463379f, 0.672363f, - 0.818848f, 0.898438f, 0.975586f, 0.976562f, 0.976562f, 0.976562f, 0.976074f, 0.976562f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000114f, 0.000096f, 0.000079f, 0.000125f, 0.000056f, - 0.000142f, 0.000120f, 0.000195f, 0.000246f, 0.000321f, 0.000305f, 0.000319f, 0.000395f, - 0.000442f, 0.000540f, 0.000642f, 0.000638f, 0.000696f, 0.000674f, 0.000687f, 0.000857f, - 0.000955f, 0.001128f, 0.001224f, 0.001364f, 0.001347f, 0.001555f, 0.001910f, 0.002245f, - 0.002714f, 0.003229f, 0.003824f, 0.004673f, 0.005676f, 0.007225f, 0.009293f, 0.012802f, - 0.017273f, 0.024368f, 0.036682f, 0.058075f, 0.100952f, 0.188721f, 0.358154f, 0.587891f, - 0.775879f, 0.881348f, 0.972168f, 0.972656f, 0.972656f, 0.973145f, 0.973145f, 0.973633f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000112f, 0.000093f, 0.000079f, 0.000067f, - 0.000057f, 0.000049f, 0.000133f, 0.000137f, 0.000163f, 0.000244f, 0.000328f, 0.000366f, - 0.000356f, 0.000415f, 0.000436f, 0.000543f, 0.000555f, 0.000638f, 0.000597f, 0.000702f, - 0.000786f, 0.000648f, 0.000891f, 0.000804f, 0.001218f, 0.001070f, 0.001355f, 0.001731f, - 0.002171f, 0.002352f, 0.002796f, 0.003546f, 0.004189f, 0.005558f, 0.006939f, 0.009209f, - 0.012337f, 0.017776f, 0.026016f, 0.040833f, 0.069946f, 0.130981f, 0.262207f, 0.489258f, - 0.719238f, 0.859375f, 0.968262f, 0.969238f, 0.969727f, 0.969727f, 0.969727f, 0.969727f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000110f, 0.000093f, 0.000080f, - 0.000068f, 0.000094f, 0.000119f, 0.000117f, 0.000120f, 0.000123f, 0.000173f, 0.000263f, - 0.000263f, 0.000359f, 0.000386f, 0.000390f, 0.000401f, 0.000556f, 0.000549f, 0.000573f, - 0.000502f, 0.000707f, 0.000789f, 0.000629f, 0.000847f, 0.001003f, 0.001024f, 0.001242f, - 0.001423f, 0.001877f, 0.002012f, 0.002571f, 0.003071f, 0.003925f, 0.005131f, 0.006767f, - 0.009140f, 0.012672f, 0.018509f, 0.028992f, 0.048309f, 0.089233f, 0.183838f, 0.383545f, - 0.646973f, 0.830078f, 0.963867f, 0.964844f, 0.964844f, 0.965820f, 0.965820f, 0.965820f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000113f, 0.000095f, - 0.000083f, 0.000070f, 0.000061f, 0.000054f, 0.000048f, 0.000042f, 0.000115f, 0.000112f, - 0.000151f, 0.000213f, 0.000309f, 0.000298f, 0.000359f, 0.000337f, 0.000382f, 0.000440f, - 0.000576f, 0.000477f, 0.000453f, 0.000690f, 0.000687f, 0.000795f, 0.000776f, 0.000911f, - 0.001117f, 0.001119f, 0.001352f, 0.002001f, 0.002140f, 0.002832f, 0.003609f, 0.004715f, - 0.006302f, 0.008835f, 0.013115f, 0.020004f, 0.032867f, 0.060333f, 0.124512f, 0.281982f, - 0.557617f, 0.794434f, 0.959473f, 0.959961f, 0.960449f, 0.960449f, 0.960449f, 0.959961f, - 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, - 0.000119f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f, - 0.000098f, 0.000087f, 0.000076f, 0.000065f, 0.000057f, 0.000050f, 0.000045f, 0.000091f, - 0.000074f, 0.000106f, 0.000185f, 0.000193f, 0.000228f, 0.000328f, 0.000323f, 0.000399f, - 0.000429f, 0.000498f, 0.000552f, 0.000432f, 0.000542f, 0.000592f, 0.000599f, 0.000729f, - 0.000734f, 0.000885f, 0.001304f, 0.001273f, 0.001756f, 0.001931f, 0.002445f, 0.003120f, - 0.004456f, 0.006165f, 0.008751f, 0.013466f, 0.022141f, 0.040192f, 0.082397f, 0.195679f, - 0.455322f, 0.745117f, 0.952637f, 0.953613f, 0.953613f, 0.954102f, 0.952637f, 0.953613f, - 0.000000f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000118f, 0.000118f, 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, - 0.000117f, 0.000104f, 0.000092f, 0.000079f, 0.000071f, 0.000062f, 0.000055f, 0.000049f, - 0.000044f, 0.000039f, 0.000099f, 0.000106f, 0.000158f, 0.000169f, 0.000241f, 0.000274f, - 0.000293f, 0.000389f, 0.000360f, 0.000399f, 0.000387f, 0.000446f, 0.000401f, 0.000530f, - 0.000565f, 0.000691f, 0.000722f, 0.000848f, 0.001147f, 0.001418f, 0.001677f, 0.002087f, - 0.002972f, 0.004169f, 0.005623f, 0.008835f, 0.014404f, 0.026077f, 0.053467f, 0.129395f, - 0.346924f, 0.685059f, 0.943848f, 0.945801f, 0.945801f, 0.945312f, 0.945801f, 0.945801f, - 0.000000f, 0.000000f, 0.000117f, 0.000116f, 0.000117f, 0.000117f, 0.000116f, 0.000116f, - 0.000115f, 0.000116f, 0.000115f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, - 0.000115f, 0.000115f, 0.000110f, 0.000097f, 0.000086f, 0.000077f, 0.000067f, 0.000060f, - 0.000053f, 0.000048f, 0.000043f, 0.000061f, 0.000090f, 0.000083f, 0.000139f, 0.000139f, - 0.000216f, 0.000254f, 0.000307f, 0.000358f, 0.000269f, 0.000377f, 0.000324f, 0.000369f, - 0.000405f, 0.000455f, 0.000524f, 0.000706f, 0.000701f, 0.001012f, 0.001206f, 0.001316f, - 0.001663f, 0.002350f, 0.003571f, 0.005505f, 0.008873f, 0.016006f, 0.033234f, 0.081848f, - 0.244751f, 0.605469f, 0.934082f, 0.935059f, 0.936035f, 0.935547f, 0.935547f, 0.935547f, - 0.000105f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000111f, 0.000112f, 0.000111f, - 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000112f, 0.000112f, - 0.000112f, 0.000112f, 0.000112f, 0.000112f, 0.000105f, 0.000093f, 0.000083f, 0.000074f, - 0.000066f, 0.000059f, 0.000053f, 0.000048f, 0.000043f, 0.000062f, 0.000052f, 0.000063f, - 0.000092f, 0.000146f, 0.000176f, 0.000216f, 0.000227f, 0.000263f, 0.000244f, 0.000267f, - 0.000370f, 0.000326f, 0.000360f, 0.000391f, 0.000505f, 0.000618f, 0.000726f, 0.000969f, - 0.001117f, 0.001651f, 0.002131f, 0.003090f, 0.005188f, 0.009499f, 0.019836f, 0.049042f, - 0.159180f, 0.509766f, 0.921875f, 0.922852f, 0.922852f, 0.922363f, 0.923340f, 0.922852f, - 0.000000f, 0.000000f, 0.000065f, 0.000098f, 0.000096f, 0.000101f, 0.000100f, 0.000104f, - 0.000104f, 0.000103f, 0.000106f, 0.000106f, 0.000106f, 0.000105f, 0.000107f, 0.000107f, - 0.000106f, 0.000107f, 0.000107f, 0.000108f, 0.000107f, 0.000108f, 0.000104f, 0.000092f, - 0.000082f, 0.000075f, 0.000067f, 0.000059f, 0.000054f, 0.000048f, 0.000044f, 0.000039f, - 0.000037f, 0.000058f, 0.000066f, 0.000122f, 0.000137f, 0.000175f, 0.000208f, 0.000194f, - 0.000208f, 0.000240f, 0.000270f, 0.000281f, 0.000323f, 0.000364f, 0.000479f, 0.000591f, - 0.000712f, 0.000986f, 0.001224f, 0.001896f, 0.002996f, 0.005196f, 0.010506f, 0.027527f, - 0.095581f, 0.399658f, 0.905762f, 0.906738f, 0.906250f, 0.905762f, 0.905762f, 0.907227f, - 0.000000f, 0.000000f, 0.000000f, 0.000017f, 0.000030f, 0.000054f, 0.000061f, 0.000081f, - 0.000087f, 0.000088f, 0.000089f, 0.000093f, 0.000093f, 0.000096f, 0.000096f, 0.000097f, - 0.000098f, 0.000099f, 0.000098f, 0.000100f, 0.000100f, 0.000101f, 0.000100f, 0.000101f, - 0.000101f, 0.000092f, 0.000082f, 0.000074f, 0.000067f, 0.000060f, 0.000054f, 0.000049f, - 0.000045f, 0.000040f, 0.000036f, 0.000037f, 0.000059f, 0.000077f, 0.000093f, 0.000143f, - 0.000155f, 0.000188f, 0.000178f, 0.000184f, 0.000231f, 0.000234f, 0.000272f, 0.000352f, - 0.000420f, 0.000525f, 0.000764f, 0.001091f, 0.001653f, 0.002705f, 0.005474f, 0.013939f, - 0.051880f, 0.283691f, 0.883789f, 0.884766f, 0.885254f, 0.885254f, 0.885742f, 0.885254f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000013f, - 0.000032f, 0.000046f, 0.000050f, 0.000060f, 0.000065f, 0.000065f, 0.000075f, 0.000078f, - 0.000080f, 0.000079f, 0.000084f, 0.000083f, 0.000087f, 0.000087f, 0.000089f, 0.000090f, - 0.000091f, 0.000091f, 0.000092f, 0.000092f, 0.000083f, 0.000075f, 0.000068f, 0.000062f, - 0.000056f, 0.000050f, 0.000046f, 0.000042f, 0.000037f, 0.000039f, 0.000044f, 0.000072f, - 0.000068f, 0.000089f, 0.000125f, 0.000124f, 0.000126f, 0.000153f, 0.000183f, 0.000212f, - 0.000219f, 0.000311f, 0.000363f, 0.000566f, 0.000846f, 0.001332f, 0.002522f, 0.006252f, - 0.023834f, 0.175415f, 0.855957f, 0.856934f, 0.856934f, 0.856934f, 0.857422f, 0.856934f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000024f, 0.000028f, - 0.000040f, 0.000044f, 0.000051f, 0.000053f, 0.000060f, 0.000063f, 0.000064f, 0.000067f, - 0.000071f, 0.000072f, 0.000074f, 0.000076f, 0.000077f, 0.000079f, 0.000079f, 0.000075f, - 0.000068f, 0.000062f, 0.000056f, 0.000051f, 0.000046f, 0.000042f, 0.000038f, 0.000034f, - 0.000031f, 0.000030f, 0.000045f, 0.000079f, 0.000081f, 0.000107f, 0.000114f, 0.000106f, - 0.000144f, 0.000136f, 0.000171f, 0.000254f, 0.000377f, 0.000531f, 0.001037f, 0.002504f, - 0.009140f, 0.088379f, 0.818848f, 0.820801f, 0.819824f, 0.820312f, 0.819336f, 0.820801f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000007f, 0.000014f, 0.000021f, 0.000028f, - 0.000034f, 0.000036f, 0.000042f, 0.000046f, 0.000049f, 0.000052f, 0.000054f, 0.000056f, - 0.000059f, 0.000061f, 0.000064f, 0.000061f, 0.000055f, 0.000050f, 0.000045f, 0.000041f, - 0.000037f, 0.000033f, 0.000030f, 0.000027f, 0.000024f, 0.000033f, 0.000060f, 0.000059f, - 0.000075f, 0.000073f, 0.000101f, 0.000089f, 0.000144f, 0.000226f, 0.000384f, 0.000847f, - 0.003033f, 0.031860f, 0.770020f, 0.770996f, 0.772461f, 0.771973f, 0.772461f, 0.771973f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000016f, - 0.000021f, 0.000023f, 0.000029f, 0.000032f, 0.000036f, 0.000039f, 0.000042f, 0.000044f, - 0.000042f, 0.000038f, 0.000035f, 0.000031f, 0.000028f, 0.000025f, 0.000022f, 0.000020f, - 0.000017f, 0.000024f, 0.000040f, 0.000047f, 0.000053f, 0.000063f, 0.000087f, 0.000190f, - 0.000666f, 0.007278f, 0.708496f, 0.709961f, 0.710449f, 0.710938f, 0.710938f, 0.710449f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000005f, 0.000010f, 0.000014f, 0.000018f, 0.000021f, 0.000024f, 0.000024f, 0.000021f, - 0.000018f, 0.000016f, 0.000014f, 0.000012f, 0.000008f, 0.000020f, 0.000022f, 0.000025f, - 0.000073f, 0.000744f, 0.632324f, 0.632812f, 0.633789f, 0.633789f, 0.633301f, 0.632812f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000006f, 0.000004f, - 0.000005f, 0.000007f, 0.543945f, 0.545410f, 0.545410f, 0.545410f, 0.546387f, 0.545898f, - }, - { - 0.159546f, 0.492676f, 0.684570f, 0.783203f, 0.838379f, 0.873535f, 0.897949f, 0.913574f, - 0.926270f, 0.936035f, 0.943359f, 0.950195f, 0.955566f, 0.959473f, 0.963379f, 0.966797f, - 0.969238f, 0.972168f, 0.973633f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f, - 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.989746f, - 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995117f, 0.995605f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.997070f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, 0.999023f, - 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.034119f, 0.154175f, 0.341309f, 0.532227f, 0.672363f, 0.763184f, 0.820801f, 0.858398f, - 0.885742f, 0.904297f, 0.918945f, 0.929199f, 0.938965f, 0.945801f, 0.951660f, 0.956543f, - 0.961426f, 0.964355f, 0.968262f, 0.970703f, 0.973145f, 0.975586f, 0.977539f, 0.979004f, - 0.980469f, 0.981934f, 0.983398f, 0.984375f, 0.985352f, 0.986328f, 0.987305f, 0.988281f, - 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.993164f, - 0.993652f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.999023f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.013390f, 0.056915f, 0.134155f, 0.257080f, 0.412109f, 0.560547f, 0.675781f, 0.755859f, - 0.812012f, 0.851074f, 0.877930f, 0.898926f, 0.913574f, 0.925781f, 0.935059f, 0.942871f, - 0.949707f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f, 0.971680f, 0.975098f, - 0.976562f, 0.978516f, 0.979980f, 0.980957f, 0.982422f, 0.984375f, 0.985352f, 0.985840f, - 0.987305f, 0.987793f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.991699f, 0.992188f, - 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, 0.995605f, 0.995605f, - 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.998535f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.006939f, 0.027863f, 0.061951f, 0.117859f, 0.204834f, 0.324707f, 0.460205f, 0.585449f, - 0.684570f, 0.757324f, 0.810059f, 0.847168f, 0.874023f, 0.895996f, 0.910645f, 0.922852f, - 0.933105f, 0.940918f, 0.947754f, 0.953613f, 0.958496f, 0.961914f, 0.965820f, 0.968750f, - 0.971680f, 0.974121f, 0.976074f, 0.978027f, 0.979492f, 0.981445f, 0.982910f, 0.983887f, - 0.984863f, 0.986328f, 0.987305f, 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.990723f, - 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.993652f, 0.994141f, 0.995117f, 0.995605f, - 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, - 0.998535f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, - 0.004211f, 0.016022f, 0.034119f, 0.061432f, 0.104797f, 0.170288f, 0.262695f, 0.377686f, - 0.499756f, 0.608887f, 0.696777f, 0.762207f, 0.810547f, 0.847168f, 0.873535f, 0.893066f, - 0.910156f, 0.922852f, 0.932617f, 0.939941f, 0.946777f, 0.953125f, 0.958496f, 0.961914f, - 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f, - 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.987793f, 0.987793f, 0.989258f, 0.989746f, - 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, - 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, - 0.002724f, 0.010384f, 0.020813f, 0.036285f, 0.059784f, 0.093933f, 0.145508f, 0.218018f, - 0.313232f, 0.424072f, 0.534180f, 0.632812f, 0.709961f, 0.769531f, 0.815918f, 0.848145f, - 0.874512f, 0.894043f, 0.909668f, 0.922363f, 0.932129f, 0.939941f, 0.946777f, 0.953125f, - 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986816f, 0.987793f, 0.988281f, - 0.988770f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.002113f, 0.007004f, 0.014091f, 0.023895f, 0.037811f, 0.057373f, 0.085632f, 0.127075f, - 0.185425f, 0.263672f, 0.360596f, 0.465576f, 0.566895f, 0.655762f, 0.725586f, 0.779297f, - 0.822266f, 0.853516f, 0.877441f, 0.895996f, 0.911621f, 0.923828f, 0.933105f, 0.940918f, - 0.947754f, 0.953613f, 0.957520f, 0.962402f, 0.965820f, 0.968750f, 0.972168f, 0.974121f, - 0.976074f, 0.978027f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f, 0.986328f, - 0.988281f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, 0.993164f, - 0.993652f, 0.994629f, 0.994629f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.001575f, 0.005211f, 0.010040f, 0.016220f, 0.025665f, 0.037415f, 0.054138f, 0.078491f, - 0.112915f, 0.160156f, 0.225464f, 0.308594f, 0.405029f, 0.506348f, 0.599121f, 0.678711f, - 0.743164f, 0.791016f, 0.829590f, 0.859375f, 0.881836f, 0.899414f, 0.913086f, 0.924805f, - 0.934570f, 0.942383f, 0.948730f, 0.955078f, 0.958984f, 0.963379f, 0.966797f, 0.970215f, - 0.972168f, 0.974609f, 0.977051f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984863f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.000985f, 0.004086f, 0.007362f, 0.011887f, 0.018127f, 0.026199f, 0.036804f, 0.052002f, - 0.072754f, 0.101318f, 0.140747f, 0.195190f, 0.266113f, 0.352539f, 0.448730f, 0.543945f, - 0.630371f, 0.702637f, 0.759277f, 0.803711f, 0.839355f, 0.865234f, 0.886719f, 0.903320f, - 0.916504f, 0.927734f, 0.936523f, 0.944336f, 0.950195f, 0.955566f, 0.959961f, 0.964355f, - 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.978027f, 0.979004f, 0.980957f, 0.982910f, - 0.984375f, 0.985352f, 0.987305f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.991699f, - 0.991699f, 0.993164f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.999023f, - 0.000829f, 0.002878f, 0.005596f, 0.009109f, 0.013359f, 0.019089f, 0.026901f, 0.036774f, - 0.049347f, 0.067200f, 0.091736f, 0.125854f, 0.171631f, 0.232544f, 0.308594f, 0.397461f, - 0.491455f, 0.581055f, 0.659668f, 0.724609f, 0.775879f, 0.817383f, 0.848633f, 0.873047f, - 0.892090f, 0.907715f, 0.920410f, 0.930664f, 0.939453f, 0.946289f, 0.951660f, 0.957520f, - 0.960938f, 0.965820f, 0.968750f, 0.972168f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, - 0.981934f, 0.983887f, 0.984863f, 0.986328f, 0.986816f, 0.988770f, 0.989746f, 0.990234f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.995605f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000836f, 0.002403f, 0.004837f, 0.006950f, 0.010269f, 0.014679f, 0.019699f, 0.026291f, - 0.035431f, 0.046875f, 0.062744f, 0.084045f, 0.113403f, 0.152588f, 0.204712f, 0.271729f, - 0.353271f, 0.443115f, 0.532715f, 0.617188f, 0.688477f, 0.748047f, 0.793945f, 0.829102f, - 0.857422f, 0.880371f, 0.898438f, 0.912598f, 0.924316f, 0.934082f, 0.941406f, 0.948242f, - 0.954590f, 0.959473f, 0.963379f, 0.967285f, 0.970215f, 0.973145f, 0.975586f, 0.977539f, - 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988281f, 0.988770f, - 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000698f, 0.002052f, 0.003618f, 0.005703f, 0.008430f, 0.011230f, 0.015083f, 0.019821f, - 0.026474f, 0.034393f, 0.044922f, 0.059204f, 0.077698f, 0.102661f, 0.136963f, 0.182373f, - 0.241089f, 0.314941f, 0.398926f, 0.489014f, 0.575195f, 0.652344f, 0.717285f, 0.769043f, - 0.810059f, 0.842773f, 0.869141f, 0.888672f, 0.904785f, 0.917969f, 0.928711f, 0.936523f, - 0.945312f, 0.951660f, 0.957031f, 0.961426f, 0.964844f, 0.968750f, 0.971680f, 0.974121f, - 0.976562f, 0.979004f, 0.980469f, 0.982422f, 0.983887f, 0.985352f, 0.986816f, 0.987793f, - 0.988770f, 0.990234f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994141f, - 0.994629f, 0.995605f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.000244f, 0.001565f, 0.002975f, 0.004433f, 0.006596f, 0.008957f, 0.012215f, 0.015533f, - 0.020294f, 0.026062f, 0.033722f, 0.042816f, 0.055237f, 0.071960f, 0.094543f, 0.124023f, - 0.164185f, 0.216309f, 0.281738f, 0.360352f, 0.446533f, 0.534180f, 0.615234f, 0.686523f, - 0.743652f, 0.790527f, 0.825684f, 0.855957f, 0.878418f, 0.895996f, 0.911133f, 0.923340f, - 0.933105f, 0.941406f, 0.948242f, 0.953613f, 0.959473f, 0.963379f, 0.966797f, 0.970703f, - 0.973145f, 0.976074f, 0.978516f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986328f, - 0.987305f, 0.989258f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.000365f, 0.001394f, 0.002546f, 0.004055f, 0.005394f, 0.007465f, 0.009674f, 0.012070f, - 0.015556f, 0.019913f, 0.025696f, 0.032623f, 0.041046f, 0.052643f, 0.067383f, 0.087463f, - 0.113708f, 0.148315f, 0.194946f, 0.254395f, 0.326416f, 0.408691f, 0.495117f, 0.579102f, - 0.654297f, 0.716797f, 0.768066f, 0.809570f, 0.843262f, 0.868652f, 0.888184f, 0.904785f, - 0.918457f, 0.929199f, 0.937500f, 0.945801f, 0.951660f, 0.957520f, 0.961914f, 0.965820f, - 0.969238f, 0.972656f, 0.975098f, 0.978027f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, - 0.986328f, 0.987793f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000596f, 0.001077f, 0.001882f, 0.003033f, 0.004559f, 0.006241f, 0.007805f, 0.010002f, - 0.012840f, 0.015900f, 0.019974f, 0.025131f, 0.031250f, 0.039337f, 0.049988f, 0.063843f, - 0.080933f, 0.105164f, 0.135986f, 0.176880f, 0.230103f, 0.296631f, 0.374268f, 0.459961f, - 0.544434f, 0.623535f, 0.691895f, 0.748535f, 0.792969f, 0.829102f, 0.857422f, 0.880371f, - 0.897949f, 0.913086f, 0.924805f, 0.934570f, 0.942383f, 0.949219f, 0.955566f, 0.960938f, - 0.964844f, 0.968750f, 0.971191f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f, - 0.984863f, 0.985840f, 0.987305f, 0.989258f, 0.989746f, 0.991211f, 0.991211f, 0.992676f, - 0.993164f, 0.993652f, 0.997559f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.000243f, 0.001173f, 0.001889f, 0.002661f, 0.003933f, 0.005131f, 0.006496f, 0.008324f, - 0.010574f, 0.013115f, 0.015839f, 0.019913f, 0.024445f, 0.030609f, 0.037781f, 0.047333f, - 0.059906f, 0.075928f, 0.097229f, 0.124939f, 0.161743f, 0.209595f, 0.271240f, 0.343994f, - 0.426758f, 0.511719f, 0.592773f, 0.666504f, 0.727051f, 0.776855f, 0.815918f, 0.847656f, - 0.871582f, 0.892090f, 0.907715f, 0.920898f, 0.931152f, 0.940918f, 0.947754f, 0.953613f, - 0.958496f, 0.963867f, 0.967773f, 0.970703f, 0.974121f, 0.976074f, 0.979004f, 0.980469f, - 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.990234f, 0.990234f, 0.992188f, - 0.992188f, 0.993164f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.000351f, 0.000842f, 0.001560f, 0.002363f, 0.003258f, 0.004131f, 0.005272f, 0.007179f, - 0.008682f, 0.010643f, 0.013016f, 0.016037f, 0.019516f, 0.024078f, 0.029602f, 0.036591f, - 0.045044f, 0.056641f, 0.071350f, 0.090576f, 0.116211f, 0.149414f, 0.193237f, 0.248779f, - 0.317871f, 0.396973f, 0.481201f, 0.564453f, 0.640137f, 0.705566f, 0.759766f, 0.802734f, - 0.836914f, 0.863281f, 0.885742f, 0.902832f, 0.916992f, 0.927734f, 0.937012f, 0.945801f, - 0.952637f, 0.958008f, 0.961914f, 0.966309f, 0.970703f, 0.974121f, 0.976074f, 0.978516f, - 0.980957f, 0.982910f, 0.984863f, 0.985840f, 0.987305f, 0.988281f, 0.989746f, 0.990723f, - 0.991211f, 0.992676f, 0.997070f, 0.997559f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, - 0.000000f, 0.000886f, 0.001405f, 0.001915f, 0.002651f, 0.003870f, 0.004845f, 0.006035f, - 0.006912f, 0.008812f, 0.010887f, 0.013229f, 0.016022f, 0.019196f, 0.023590f, 0.028992f, - 0.035248f, 0.043304f, 0.053711f, 0.066956f, 0.085083f, 0.107727f, 0.138428f, 0.178589f, - 0.229980f, 0.293945f, 0.370117f, 0.453369f, 0.537109f, 0.616699f, 0.685059f, 0.743164f, - 0.790039f, 0.826660f, 0.856445f, 0.878906f, 0.897949f, 0.913574f, 0.925293f, 0.935547f, - 0.943848f, 0.951172f, 0.957031f, 0.961914f, 0.966797f, 0.970215f, 0.973145f, 0.976562f, - 0.979004f, 0.980469f, 0.982910f, 0.984375f, 0.985840f, 0.987305f, 0.988770f, 0.989746f, - 0.991211f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000104f, 0.000719f, 0.001065f, 0.001970f, 0.002544f, 0.003149f, 0.004230f, 0.005138f, - 0.006119f, 0.007580f, 0.009201f, 0.010902f, 0.013260f, 0.015526f, 0.019272f, 0.022858f, - 0.027512f, 0.033569f, 0.041199f, 0.050873f, 0.063782f, 0.079895f, 0.101135f, 0.128906f, - 0.165771f, 0.213745f, 0.273193f, 0.345703f, 0.427002f, 0.511719f, 0.592773f, 0.666016f, - 0.727051f, 0.776367f, 0.817871f, 0.848633f, 0.875000f, 0.894531f, 0.909668f, 0.922852f, - 0.934082f, 0.942383f, 0.949707f, 0.956055f, 0.961914f, 0.966309f, 0.970215f, 0.973145f, - 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984375f, 0.986328f, 0.987305f, 0.988281f, - 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000240f, 0.000686f, 0.001052f, 0.001375f, 0.002308f, 0.002735f, 0.003510f, 0.004269f, - 0.005173f, 0.006649f, 0.007442f, 0.009109f, 0.011246f, 0.012886f, 0.015732f, 0.018829f, - 0.022354f, 0.026672f, 0.032867f, 0.039764f, 0.048492f, 0.060455f, 0.075806f, 0.095276f, - 0.121033f, 0.155273f, 0.199097f, 0.255859f, 0.324463f, 0.404053f, 0.488525f, 0.571289f, - 0.646484f, 0.711426f, 0.765625f, 0.808105f, 0.841797f, 0.869141f, 0.890137f, 0.907227f, - 0.920898f, 0.931641f, 0.940918f, 0.948730f, 0.955078f, 0.960449f, 0.965820f, 0.969727f, - 0.972656f, 0.976562f, 0.978516f, 0.980957f, 0.982910f, 0.984863f, 0.986328f, 0.987793f, - 0.989746f, 0.990723f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, - 0.000244f, 0.000597f, 0.000939f, 0.001369f, 0.001999f, 0.002329f, 0.003105f, 0.003786f, - 0.004395f, 0.005413f, 0.006474f, 0.007793f, 0.009254f, 0.010971f, 0.012970f, 0.015526f, - 0.018112f, 0.022049f, 0.026581f, 0.031586f, 0.038666f, 0.046967f, 0.057617f, 0.071777f, - 0.089783f, 0.113953f, 0.145264f, 0.186646f, 0.239990f, 0.305908f, 0.383301f, 0.467285f, - 0.551270f, 0.629883f, 0.697266f, 0.754883f, 0.799805f, 0.835938f, 0.864258f, 0.886719f, - 0.905273f, 0.918945f, 0.931152f, 0.940918f, 0.948242f, 0.955078f, 0.961426f, 0.965332f, - 0.969727f, 0.973633f, 0.976074f, 0.979004f, 0.980957f, 0.983398f, 0.984863f, 0.987305f, - 0.988281f, 0.989258f, 0.996094f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000000f, 0.000475f, 0.000891f, 0.001390f, 0.001730f, 0.002060f, 0.002501f, 0.003109f, - 0.003836f, 0.004837f, 0.005852f, 0.006859f, 0.007740f, 0.009216f, 0.010918f, 0.012863f, - 0.014915f, 0.017731f, 0.021317f, 0.025482f, 0.030930f, 0.037262f, 0.044891f, 0.055115f, - 0.068298f, 0.085510f, 0.107910f, 0.137207f, 0.176025f, 0.226929f, 0.289551f, 0.364746f, - 0.447998f, 0.532715f, 0.613770f, 0.685547f, 0.744629f, 0.791992f, 0.830078f, 0.860352f, - 0.884277f, 0.903320f, 0.917969f, 0.930176f, 0.939941f, 0.947754f, 0.954590f, 0.961426f, - 0.966309f, 0.970215f, 0.973145f, 0.976562f, 0.979492f, 0.981445f, 0.983398f, 0.985352f, - 0.987793f, 0.988281f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.996094f, 0.996094f, - 0.000102f, 0.000243f, 0.000844f, 0.001124f, 0.001554f, 0.002077f, 0.002098f, 0.002682f, - 0.003357f, 0.004280f, 0.005035f, 0.005764f, 0.006805f, 0.007633f, 0.009354f, 0.010872f, - 0.012665f, 0.015099f, 0.017258f, 0.020599f, 0.024887f, 0.029495f, 0.035522f, 0.042999f, - 0.053070f, 0.065125f, 0.081299f, 0.102661f, 0.130371f, 0.166992f, 0.215088f, 0.275635f, - 0.348877f, 0.431641f, 0.517578f, 0.600098f, 0.672852f, 0.735352f, 0.785645f, 0.826172f, - 0.856934f, 0.881836f, 0.900879f, 0.916992f, 0.930176f, 0.940430f, 0.947754f, 0.955078f, - 0.960938f, 0.966309f, 0.969238f, 0.973633f, 0.977051f, 0.979492f, 0.981934f, 0.983887f, - 0.986328f, 0.987793f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000241f, 0.000242f, 0.000823f, 0.000956f, 0.001225f, 0.001549f, 0.002031f, 0.002613f, - 0.003124f, 0.003574f, 0.004467f, 0.004955f, 0.005672f, 0.006752f, 0.007603f, 0.009186f, - 0.010704f, 0.012741f, 0.014366f, 0.017487f, 0.020142f, 0.024002f, 0.028915f, 0.034943f, - 0.041656f, 0.050964f, 0.062622f, 0.077881f, 0.097961f, 0.124207f, 0.158936f, 0.204590f, - 0.263184f, 0.334961f, 0.416748f, 0.502930f, 0.587891f, 0.664062f, 0.728516f, 0.780762f, - 0.822266f, 0.854492f, 0.879395f, 0.900879f, 0.916504f, 0.928711f, 0.940430f, 0.948730f, - 0.955566f, 0.961914f, 0.967285f, 0.970215f, 0.974121f, 0.977539f, 0.979980f, 0.982422f, - 0.984863f, 0.986816f, 0.994629f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000000f, 0.000473f, 0.000607f, 0.000921f, 0.000957f, 0.001448f, 0.001884f, 0.002270f, - 0.002703f, 0.002998f, 0.003862f, 0.004307f, 0.005074f, 0.005665f, 0.006737f, 0.007851f, - 0.009216f, 0.010735f, 0.012459f, 0.014572f, 0.016998f, 0.019821f, 0.023605f, 0.027969f, - 0.033783f, 0.040192f, 0.049286f, 0.060303f, 0.074829f, 0.093750f, 0.118774f, 0.152222f, - 0.195801f, 0.252441f, 0.322754f, 0.404053f, 0.491943f, 0.577637f, 0.655273f, 0.722168f, - 0.776367f, 0.820312f, 0.854004f, 0.878906f, 0.900879f, 0.916992f, 0.929688f, 0.940430f, - 0.949707f, 0.956055f, 0.962402f, 0.967285f, 0.971191f, 0.975586f, 0.978516f, 0.980957f, - 0.983398f, 0.985352f, 0.994141f, 0.995117f, 0.995117f, 0.995605f, 0.995117f, 0.995605f, - 0.000000f, 0.000444f, 0.000605f, 0.000649f, 0.000926f, 0.001096f, 0.001624f, 0.001669f, - 0.002373f, 0.002716f, 0.003231f, 0.003769f, 0.004395f, 0.005005f, 0.005878f, 0.006710f, - 0.007793f, 0.008957f, 0.010712f, 0.012230f, 0.014244f, 0.016693f, 0.019531f, 0.022827f, - 0.027100f, 0.032318f, 0.038971f, 0.047302f, 0.058105f, 0.072021f, 0.089966f, 0.114319f, - 0.146362f, 0.188965f, 0.244019f, 0.312988f, 0.394287f, 0.482178f, 0.569824f, 0.650391f, - 0.718262f, 0.774414f, 0.819336f, 0.853027f, 0.880371f, 0.900879f, 0.917969f, 0.930664f, - 0.940918f, 0.950684f, 0.957031f, 0.962891f, 0.968262f, 0.972656f, 0.976562f, 0.979004f, - 0.981934f, 0.984375f, 0.994141f, 0.994629f, 0.994629f, 0.995117f, 0.994629f, 0.995117f, - 0.000000f, 0.000336f, 0.000601f, 0.000712f, 0.000810f, 0.001174f, 0.001286f, 0.001618f, - 0.002037f, 0.002592f, 0.002920f, 0.003223f, 0.003847f, 0.004463f, 0.005119f, 0.006020f, - 0.006783f, 0.007957f, 0.008888f, 0.010590f, 0.012230f, 0.013885f, 0.016220f, 0.019318f, - 0.022278f, 0.026474f, 0.031403f, 0.037781f, 0.046021f, 0.055969f, 0.069397f, 0.086975f, - 0.110413f, 0.140991f, 0.182739f, 0.236694f, 0.304932f, 0.385986f, 0.475586f, 0.563965f, - 0.646484f, 0.716797f, 0.772461f, 0.818359f, 0.853027f, 0.880859f, 0.901855f, 0.918945f, - 0.932129f, 0.942383f, 0.951172f, 0.958496f, 0.964355f, 0.969238f, 0.973633f, 0.977051f, - 0.979980f, 0.982910f, 0.993652f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f, - 0.000000f, 0.000244f, 0.000418f, 0.000597f, 0.000600f, 0.001085f, 0.001236f, 0.001535f, - 0.001970f, 0.002096f, 0.002354f, 0.002834f, 0.003323f, 0.003822f, 0.004463f, 0.005146f, - 0.005798f, 0.006859f, 0.007587f, 0.008827f, 0.009956f, 0.011833f, 0.013725f, 0.015945f, - 0.018585f, 0.021988f, 0.025665f, 0.030807f, 0.036774f, 0.044373f, 0.054108f, 0.067383f, - 0.084229f, 0.106812f, 0.137207f, 0.177734f, 0.230835f, 0.299072f, 0.380127f, 0.470215f, - 0.560547f, 0.644531f, 0.715820f, 0.774414f, 0.820312f, 0.854980f, 0.882324f, 0.903809f, - 0.921387f, 0.933594f, 0.944824f, 0.952637f, 0.960449f, 0.965820f, 0.971191f, 0.974609f, - 0.978027f, 0.981934f, 0.993164f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000000f, 0.000244f, 0.000411f, 0.000589f, 0.000820f, 0.000729f, 0.001086f, 0.001301f, - 0.001677f, 0.001935f, 0.002312f, 0.002678f, 0.002846f, 0.003590f, 0.003914f, 0.004578f, - 0.005020f, 0.005753f, 0.006706f, 0.007710f, 0.008911f, 0.010155f, 0.011528f, 0.013504f, - 0.015747f, 0.018036f, 0.021408f, 0.024994f, 0.029816f, 0.035858f, 0.043152f, 0.053009f, - 0.065491f, 0.082031f, 0.104065f, 0.133789f, 0.174072f, 0.226929f, 0.294434f, 0.376465f, - 0.467773f, 0.560059f, 0.644531f, 0.717285f, 0.777344f, 0.823242f, 0.857910f, 0.885742f, - 0.906738f, 0.922852f, 0.936523f, 0.947266f, 0.955078f, 0.961426f, 0.967285f, 0.972656f, - 0.976562f, 0.979980f, 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000000f, 0.000243f, 0.000243f, 0.000442f, 0.000695f, 0.000759f, 0.000837f, 0.001089f, - 0.001625f, 0.001702f, 0.002045f, 0.002176f, 0.002756f, 0.003063f, 0.003687f, 0.003893f, - 0.004456f, 0.005337f, 0.006062f, 0.006523f, 0.007572f, 0.008430f, 0.009880f, 0.011612f, - 0.013237f, 0.015114f, 0.017487f, 0.020584f, 0.024445f, 0.028931f, 0.034729f, 0.042023f, - 0.051788f, 0.063843f, 0.079956f, 0.102295f, 0.131592f, 0.171021f, 0.223877f, 0.292236f, - 0.375000f, 0.468018f, 0.562012f, 0.648438f, 0.721191f, 0.781250f, 0.826660f, 0.862305f, - 0.888672f, 0.909668f, 0.926270f, 0.938965f, 0.949707f, 0.957520f, 0.964355f, 0.969727f, - 0.974121f, 0.978027f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f, 0.993164f, - 0.000000f, 0.000242f, 0.000242f, 0.000242f, 0.000564f, 0.000692f, 0.000826f, 0.001094f, - 0.001280f, 0.001457f, 0.001673f, 0.002232f, 0.002411f, 0.002789f, 0.003174f, 0.003649f, - 0.003859f, 0.004349f, 0.004990f, 0.005898f, 0.006622f, 0.007496f, 0.008209f, 0.009583f, - 0.011284f, 0.013062f, 0.014763f, 0.017120f, 0.020020f, 0.023804f, 0.028412f, 0.033905f, - 0.041016f, 0.050140f, 0.062469f, 0.078552f, 0.100159f, 0.129272f, 0.169067f, 0.222290f, - 0.291504f, 0.376465f, 0.470703f, 0.566406f, 0.653320f, 0.728027f, 0.786621f, 0.832031f, - 0.866699f, 0.893555f, 0.914062f, 0.929688f, 0.942383f, 0.952148f, 0.959961f, 0.966797f, - 0.972168f, 0.976074f, 0.991211f, 0.992188f, 0.992676f, 0.992188f, 0.992676f, 0.992676f, - 0.000241f, 0.000241f, 0.000240f, 0.000242f, 0.000486f, 0.000637f, 0.000916f, 0.000933f, - 0.001003f, 0.001284f, 0.001584f, 0.001925f, 0.002134f, 0.002502f, 0.002731f, 0.003134f, - 0.003435f, 0.004036f, 0.004379f, 0.005077f, 0.005688f, 0.006557f, 0.007347f, 0.007942f, - 0.009506f, 0.010712f, 0.012527f, 0.014603f, 0.016693f, 0.019592f, 0.023285f, 0.027512f, - 0.033173f, 0.040283f, 0.049347f, 0.061432f, 0.077271f, 0.098938f, 0.128052f, 0.168091f, - 0.222168f, 0.292725f, 0.379150f, 0.476807f, 0.573730f, 0.662598f, 0.735840f, 0.794434f, - 0.839844f, 0.873535f, 0.898926f, 0.918945f, 0.934082f, 0.945312f, 0.955566f, 0.962402f, - 0.969238f, 0.974609f, 0.990723f, 0.991699f, 0.992188f, 0.992188f, 0.992188f, 0.992188f, - 0.000000f, 0.000238f, 0.000240f, 0.000362f, 0.000362f, 0.000521f, 0.000631f, 0.000909f, - 0.000937f, 0.001249f, 0.001373f, 0.001693f, 0.001746f, 0.002184f, 0.002436f, 0.002680f, - 0.003094f, 0.003576f, 0.003828f, 0.004463f, 0.004990f, 0.005589f, 0.006439f, 0.006943f, - 0.008217f, 0.009384f, 0.010719f, 0.012184f, 0.014130f, 0.016373f, 0.019241f, 0.022675f, - 0.027161f, 0.032379f, 0.039307f, 0.048645f, 0.060455f, 0.076416f, 0.097778f, 0.127441f, - 0.168213f, 0.223633f, 0.296387f, 0.385986f, 0.485107f, 0.583984f, 0.673340f, 0.746582f, - 0.804199f, 0.848633f, 0.880371f, 0.905273f, 0.923828f, 0.938477f, 0.949707f, 0.958984f, - 0.965820f, 0.972656f, 0.990234f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, 0.991211f, - 0.000000f, 0.000234f, 0.000238f, 0.000236f, 0.000360f, 0.000482f, 0.000614f, 0.000786f, - 0.000900f, 0.001056f, 0.001336f, 0.001466f, 0.001671f, 0.001907f, 0.002333f, 0.002546f, - 0.002871f, 0.003067f, 0.003500f, 0.003813f, 0.004425f, 0.004574f, 0.005459f, 0.006092f, - 0.006660f, 0.007660f, 0.008987f, 0.010071f, 0.011841f, 0.013847f, 0.016022f, 0.018829f, - 0.022339f, 0.026779f, 0.031677f, 0.038910f, 0.047913f, 0.059601f, 0.075684f, 0.097290f, - 0.127319f, 0.169189f, 0.226807f, 0.302490f, 0.394775f, 0.497314f, 0.598633f, 0.686523f, - 0.759766f, 0.814941f, 0.857422f, 0.888672f, 0.912109f, 0.930176f, 0.943359f, 0.954102f, - 0.962402f, 0.968750f, 0.988770f, 0.990234f, 0.990234f, 0.990234f, 0.991211f, 0.990723f, - 0.000000f, 0.000036f, 0.000166f, 0.000357f, 0.000356f, 0.000478f, 0.000566f, 0.000638f, - 0.000893f, 0.001146f, 0.001242f, 0.001330f, 0.001502f, 0.001773f, 0.001918f, 0.002024f, - 0.002501f, 0.002604f, 0.003067f, 0.003334f, 0.003708f, 0.004044f, 0.004646f, 0.005268f, - 0.006241f, 0.006931f, 0.007774f, 0.008911f, 0.010277f, 0.011475f, 0.013542f, 0.015732f, - 0.018417f, 0.022049f, 0.026154f, 0.031189f, 0.038269f, 0.047119f, 0.059265f, 0.075256f, - 0.097534f, 0.128906f, 0.172119f, 0.231934f, 0.311035f, 0.407715f, 0.513184f, 0.615723f, - 0.703613f, 0.773926f, 0.827637f, 0.867188f, 0.897461f, 0.919434f, 0.936035f, 0.948730f, - 0.958984f, 0.966309f, 0.988770f, 0.989746f, 0.989746f, 0.990234f, 0.989746f, 0.989746f, - 0.000000f, 0.000028f, 0.000093f, 0.000334f, 0.000465f, 0.000472f, 0.000373f, 0.000685f, - 0.000695f, 0.001027f, 0.001128f, 0.001155f, 0.001419f, 0.001435f, 0.001760f, 0.001850f, - 0.002241f, 0.002373f, 0.002604f, 0.002821f, 0.003334f, 0.003666f, 0.004139f, 0.004627f, - 0.005207f, 0.005886f, 0.006596f, 0.007580f, 0.008705f, 0.009911f, 0.011520f, 0.013237f, - 0.015427f, 0.017944f, 0.021423f, 0.025497f, 0.030945f, 0.037537f, 0.046692f, 0.058624f, - 0.075317f, 0.098267f, 0.130493f, 0.176025f, 0.239136f, 0.323242f, 0.424561f, 0.533691f, - 0.636230f, 0.723145f, 0.790039f, 0.841797f, 0.880371f, 0.906738f, 0.926758f, 0.941406f, - 0.953613f, 0.963379f, 0.987793f, 0.988770f, 0.988770f, 0.989258f, 0.989258f, 0.989258f, - 0.000000f, 0.000000f, 0.000047f, 0.000321f, 0.000332f, 0.000351f, 0.000470f, 0.000596f, - 0.000655f, 0.000727f, 0.001008f, 0.001112f, 0.001350f, 0.001379f, 0.001380f, 0.001751f, - 0.002008f, 0.002151f, 0.002327f, 0.002548f, 0.002691f, 0.003056f, 0.003475f, 0.003925f, - 0.004749f, 0.005161f, 0.005863f, 0.006538f, 0.007153f, 0.008453f, 0.009789f, 0.010986f, - 0.013168f, 0.015121f, 0.017563f, 0.020966f, 0.025009f, 0.030151f, 0.037048f, 0.046570f, - 0.058624f, 0.075623f, 0.099243f, 0.133667f, 0.181641f, 0.249756f, 0.338623f, 0.445312f, - 0.556641f, 0.659180f, 0.744141f, 0.808594f, 0.855957f, 0.890137f, 0.916992f, 0.934570f, - 0.949219f, 0.959473f, 0.986816f, 0.987793f, 0.987793f, 0.987793f, 0.987793f, 0.988281f, - 0.000000f, 0.000000f, 0.000000f, 0.000244f, 0.000429f, 0.000440f, 0.000348f, 0.000592f, - 0.000606f, 0.000755f, 0.000690f, 0.000935f, 0.001172f, 0.001257f, 0.001368f, 0.001458f, - 0.001786f, 0.001809f, 0.002060f, 0.002274f, 0.002478f, 0.002642f, 0.002987f, 0.003435f, - 0.003866f, 0.004337f, 0.005066f, 0.005409f, 0.006355f, 0.007111f, 0.008011f, 0.009392f, - 0.011032f, 0.012321f, 0.014717f, 0.017319f, 0.020432f, 0.024551f, 0.029953f, 0.036835f, - 0.045929f, 0.058716f, 0.076416f, 0.101562f, 0.137695f, 0.189453f, 0.262451f, 0.358154f, - 0.470215f, 0.584961f, 0.686523f, 0.767578f, 0.828125f, 0.871582f, 0.903809f, 0.926270f, - 0.941895f, 0.956055f, 0.985352f, 0.986328f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, - 0.000000f, 0.000000f, 0.000000f, 0.000119f, 0.000237f, 0.000314f, 0.000570f, 0.000575f, - 0.000583f, 0.000632f, 0.000651f, 0.000789f, 0.000947f, 0.001097f, 0.001300f, 0.001320f, - 0.001384f, 0.001443f, 0.001641f, 0.001869f, 0.002047f, 0.002396f, 0.002634f, 0.003025f, - 0.003412f, 0.003757f, 0.004238f, 0.004620f, 0.005463f, 0.006168f, 0.007072f, 0.008080f, - 0.009155f, 0.010590f, 0.012306f, 0.014175f, 0.016769f, 0.020081f, 0.023972f, 0.029495f, - 0.036560f, 0.045959f, 0.059265f, 0.078125f, 0.104797f, 0.143677f, 0.199951f, 0.279785f, - 0.382812f, 0.500977f, 0.616699f, 0.716309f, 0.791992f, 0.847168f, 0.887207f, 0.915527f, - 0.936523f, 0.950684f, 0.984375f, 0.985352f, 0.986328f, 0.985840f, 0.986328f, 0.985840f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000205f, 0.000239f, 0.000299f, 0.000537f, - 0.000574f, 0.000696f, 0.000583f, 0.000740f, 0.000778f, 0.000867f, 0.001013f, 0.001257f, - 0.001325f, 0.001277f, 0.001416f, 0.001718f, 0.001965f, 0.002079f, 0.002356f, 0.002577f, - 0.002771f, 0.003305f, 0.003693f, 0.004028f, 0.004593f, 0.005234f, 0.005905f, 0.006802f, - 0.007698f, 0.008553f, 0.009995f, 0.011635f, 0.013824f, 0.016174f, 0.019547f, 0.023544f, - 0.029114f, 0.036377f, 0.046417f, 0.060211f, 0.080017f, 0.108643f, 0.151611f, 0.213379f, - 0.301758f, 0.414062f, 0.537598f, 0.653320f, 0.748047f, 0.817871f, 0.868164f, 0.903320f, - 0.928711f, 0.945801f, 0.982910f, 0.983887f, 0.984375f, 0.984375f, 0.984863f, 0.984375f, - 0.000000f, 0.000000f, 0.000045f, 0.000105f, 0.000114f, 0.000340f, 0.000371f, 0.000501f, - 0.000639f, 0.000554f, 0.000687f, 0.000675f, 0.000711f, 0.000738f, 0.000824f, 0.001092f, - 0.001040f, 0.001185f, 0.001212f, 0.001408f, 0.001624f, 0.001813f, 0.001982f, 0.002182f, - 0.002634f, 0.002748f, 0.003252f, 0.003540f, 0.004089f, 0.004505f, 0.005001f, 0.005657f, - 0.006500f, 0.007195f, 0.008286f, 0.009750f, 0.011208f, 0.013420f, 0.015762f, 0.019226f, - 0.023209f, 0.029144f, 0.036591f, 0.047150f, 0.061615f, 0.082947f, 0.114014f, 0.161621f, - 0.231323f, 0.329834f, 0.451416f, 0.579590f, 0.692871f, 0.780273f, 0.844238f, 0.888184f, - 0.917969f, 0.939453f, 0.981445f, 0.982422f, 0.982910f, 0.982910f, 0.982910f, 0.982910f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000208f, 0.000311f, 0.000238f, 0.000337f, - 0.000524f, 0.000617f, 0.000533f, 0.000675f, 0.000665f, 0.000776f, 0.000840f, 0.000819f, - 0.000902f, 0.001169f, 0.001130f, 0.001178f, 0.001382f, 0.001571f, 0.001941f, 0.001932f, - 0.002138f, 0.002306f, 0.002586f, 0.002937f, 0.003468f, 0.003740f, 0.004292f, 0.004704f, - 0.005444f, 0.006081f, 0.007019f, 0.008255f, 0.009521f, 0.010796f, 0.012840f, 0.015503f, - 0.018784f, 0.023178f, 0.029129f, 0.036774f, 0.047699f, 0.063416f, 0.086548f, 0.121399f, - 0.175293f, 0.254883f, 0.365234f, 0.496582f, 0.626953f, 0.733398f, 0.813477f, 0.869629f, - 0.906738f, 0.933105f, 0.979980f, 0.980957f, 0.981445f, 0.981445f, 0.980957f, 0.981445f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000208f, 0.000312f, 0.000236f, - 0.000343f, 0.000475f, 0.000496f, 0.000528f, 0.000659f, 0.000582f, 0.000685f, 0.000710f, - 0.000761f, 0.000784f, 0.000941f, 0.001013f, 0.001117f, 0.001339f, 0.001500f, 0.001623f, - 0.001769f, 0.002039f, 0.002298f, 0.002565f, 0.002802f, 0.003119f, 0.003471f, 0.003857f, - 0.004658f, 0.005177f, 0.005836f, 0.006752f, 0.007324f, 0.008911f, 0.010422f, 0.012527f, - 0.015373f, 0.018585f, 0.022964f, 0.029037f, 0.037231f, 0.049072f, 0.066345f, 0.091492f, - 0.131470f, 0.193359f, 0.285645f, 0.409912f, 0.548828f, 0.676758f, 0.776367f, 0.845703f, - 0.893066f, 0.924805f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979492f, 0.979492f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000166f, 0.000228f, 0.000227f, - 0.000369f, 0.000337f, 0.000368f, 0.000452f, 0.000500f, 0.000547f, 0.000543f, 0.000575f, - 0.000623f, 0.000723f, 0.000783f, 0.000874f, 0.001141f, 0.001226f, 0.001279f, 0.001336f, - 0.001499f, 0.001655f, 0.001922f, 0.002090f, 0.002453f, 0.002298f, 0.003139f, 0.003181f, - 0.003674f, 0.004166f, 0.004814f, 0.005447f, 0.006348f, 0.007179f, 0.008736f, 0.010406f, - 0.012321f, 0.014984f, 0.018219f, 0.022934f, 0.028824f, 0.037598f, 0.050476f, 0.069397f, - 0.098694f, 0.144775f, 0.218018f, 0.325439f, 0.464111f, 0.607910f, 0.729492f, 0.817383f, - 0.876953f, 0.915527f, 0.976562f, 0.977539f, 0.977539f, 0.977051f, 0.977051f, 0.977539f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000154f, 0.000200f, - 0.000267f, 0.000316f, 0.000324f, 0.000449f, 0.000319f, 0.000379f, 0.000515f, 0.000519f, - 0.000558f, 0.000628f, 0.000645f, 0.000690f, 0.000777f, 0.000940f, 0.001096f, 0.001204f, - 0.001278f, 0.001485f, 0.001670f, 0.001929f, 0.001961f, 0.002016f, 0.002367f, 0.002785f, - 0.003025f, 0.003248f, 0.003805f, 0.004539f, 0.004845f, 0.005733f, 0.006851f, 0.008278f, - 0.010017f, 0.011841f, 0.014542f, 0.017807f, 0.022705f, 0.029190f, 0.038544f, 0.052612f, - 0.073853f, 0.108093f, 0.162842f, 0.250977f, 0.377930f, 0.529785f, 0.672363f, 0.782715f, - 0.855957f, 0.904297f, 0.973145f, 0.974121f, 0.974609f, 0.975586f, 0.974609f, 0.975098f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000158f, 0.000121f, - 0.000190f, 0.000238f, 0.000397f, 0.000354f, 0.000364f, 0.000365f, 0.000440f, 0.000474f, - 0.000509f, 0.000612f, 0.000611f, 0.000648f, 0.000804f, 0.000755f, 0.000943f, 0.001050f, - 0.001221f, 0.001340f, 0.001338f, 0.001443f, 0.001635f, 0.001822f, 0.002083f, 0.002226f, - 0.002480f, 0.002682f, 0.003185f, 0.003609f, 0.003948f, 0.005074f, 0.005558f, 0.006741f, - 0.007904f, 0.009384f, 0.011360f, 0.014000f, 0.017883f, 0.022675f, 0.029648f, 0.039917f, - 0.055695f, 0.080261f, 0.120728f, 0.188354f, 0.296143f, 0.443848f, 0.603027f, 0.737793f, - 0.831055f, 0.891113f, 0.970703f, 0.971680f, 0.972168f, 0.972656f, 0.971680f, 0.972168f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, - 0.000121f, 0.000251f, 0.000260f, 0.000278f, 0.000315f, 0.000334f, 0.000235f, 0.000357f, - 0.000442f, 0.000513f, 0.000504f, 0.000598f, 0.000556f, 0.000771f, 0.000831f, 0.000886f, - 0.000977f, 0.001145f, 0.001105f, 0.001244f, 0.001281f, 0.001431f, 0.001544f, 0.001850f, - 0.001986f, 0.002131f, 0.002537f, 0.002737f, 0.003252f, 0.003826f, 0.004555f, 0.005184f, - 0.006199f, 0.007195f, 0.009041f, 0.011337f, 0.013878f, 0.017395f, 0.022552f, 0.030502f, - 0.041962f, 0.059875f, 0.089111f, 0.139404f, 0.224609f, 0.357910f, 0.524902f, 0.684082f, - 0.800781f, 0.875977f, 0.967773f, 0.968750f, 0.968262f, 0.968750f, 0.969238f, 0.969238f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000095f, 0.000081f, 0.000217f, 0.000149f, 0.000204f, 0.000212f, 0.000338f, - 0.000345f, 0.000348f, 0.000456f, 0.000463f, 0.000495f, 0.000570f, 0.000583f, 0.000748f, - 0.000799f, 0.000731f, 0.000965f, 0.001041f, 0.001071f, 0.001210f, 0.001318f, 0.001238f, - 0.001410f, 0.001631f, 0.001932f, 0.002327f, 0.002577f, 0.003057f, 0.003452f, 0.003956f, - 0.004639f, 0.005714f, 0.006817f, 0.008446f, 0.010605f, 0.013443f, 0.017319f, 0.022964f, - 0.031021f, 0.044281f, 0.065857f, 0.102112f, 0.166504f, 0.277344f, 0.439941f, 0.617188f, - 0.762207f, 0.856445f, 0.963379f, 0.964355f, 0.965332f, 0.964844f, 0.965332f, 0.965332f, - 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000121f, 0.000107f, 0.000091f, 0.000161f, 0.000119f, 0.000184f, 0.000266f, 0.000284f, - 0.000314f, 0.000319f, 0.000334f, 0.000344f, 0.000565f, 0.000455f, 0.000488f, 0.000667f, - 0.000710f, 0.000713f, 0.000787f, 0.000755f, 0.000849f, 0.000972f, 0.001097f, 0.001286f, - 0.001427f, 0.001556f, 0.001667f, 0.001687f, 0.002155f, 0.002369f, 0.002674f, 0.003086f, - 0.003710f, 0.004536f, 0.005585f, 0.006783f, 0.007957f, 0.010262f, 0.013115f, 0.017212f, - 0.023102f, 0.032715f, 0.047943f, 0.074158f, 0.121155f, 0.207520f, 0.353027f, 0.541504f, - 0.715332f, 0.834473f, 0.959473f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.961426f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000120f, 0.000120f, 0.000103f, 0.000089f, 0.000077f, 0.000080f, 0.000121f, 0.000218f, - 0.000209f, 0.000245f, 0.000303f, 0.000316f, 0.000388f, 0.000341f, 0.000549f, 0.000594f, - 0.000604f, 0.000679f, 0.000625f, 0.000628f, 0.000795f, 0.000883f, 0.000857f, 0.000991f, - 0.001166f, 0.000955f, 0.001194f, 0.001347f, 0.001548f, 0.001804f, 0.002048f, 0.002388f, - 0.002911f, 0.003130f, 0.003933f, 0.004845f, 0.006031f, 0.007385f, 0.009705f, 0.012688f, - 0.017044f, 0.023788f, 0.034882f, 0.053284f, 0.086670f, 0.151123f, 0.271484f, 0.457031f, - 0.658203f, 0.805176f, 0.954102f, 0.955078f, 0.956055f, 0.956055f, 0.956055f, 0.955566f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, - 0.000120f, 0.000120f, 0.000116f, 0.000101f, 0.000088f, 0.000077f, 0.000131f, 0.000071f, - 0.000146f, 0.000200f, 0.000237f, 0.000270f, 0.000289f, 0.000302f, 0.000311f, 0.000441f, - 0.000396f, 0.000588f, 0.000630f, 0.000570f, 0.000575f, 0.000537f, 0.000589f, 0.000750f, - 0.000721f, 0.001048f, 0.001122f, 0.000951f, 0.001243f, 0.001346f, 0.001703f, 0.001592f, - 0.001880f, 0.002340f, 0.002804f, 0.003637f, 0.004356f, 0.005329f, 0.006805f, 0.009094f, - 0.012566f, 0.017181f, 0.025040f, 0.038147f, 0.061249f, 0.107788f, 0.200195f, 0.369629f, - 0.587891f, 0.771973f, 0.948242f, 0.949707f, 0.950195f, 0.949707f, 0.950195f, 0.950195f, - 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000120f, 0.000119f, 0.000119f, 0.000114f, 0.000101f, 0.000088f, 0.000079f, 0.000070f, - 0.000063f, 0.000136f, 0.000136f, 0.000183f, 0.000207f, 0.000277f, 0.000271f, 0.000291f, - 0.000369f, 0.000344f, 0.000494f, 0.000459f, 0.000515f, 0.000509f, 0.000532f, 0.000504f, - 0.000716f, 0.000589f, 0.000691f, 0.000902f, 0.000972f, 0.000968f, 0.001067f, 0.001483f, - 0.001780f, 0.001652f, 0.002090f, 0.002602f, 0.003113f, 0.003738f, 0.004738f, 0.006420f, - 0.008522f, 0.012100f, 0.017334f, 0.026489f, 0.042786f, 0.074524f, 0.142578f, 0.283936f, - 0.509277f, 0.729492f, 0.940918f, 0.941895f, 0.942383f, 0.942383f, 0.942383f, 0.942871f, - 0.000122f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, - 0.000119f, 0.000118f, 0.000118f, 0.000118f, 0.000116f, 0.000102f, 0.000090f, 0.000081f, - 0.000091f, 0.000066f, 0.000059f, 0.000110f, 0.000109f, 0.000155f, 0.000184f, 0.000227f, - 0.000297f, 0.000333f, 0.000355f, 0.000349f, 0.000344f, 0.000421f, 0.000459f, 0.000561f, - 0.000600f, 0.000563f, 0.000630f, 0.000563f, 0.000682f, 0.000737f, 0.000892f, 0.001037f, - 0.001026f, 0.001163f, 0.001743f, 0.001782f, 0.002117f, 0.002573f, 0.003389f, 0.004429f, - 0.005871f, 0.007942f, 0.011841f, 0.018066f, 0.029190f, 0.050842f, 0.098511f, 0.207397f, - 0.422363f, 0.677734f, 0.932129f, 0.933594f, 0.933594f, 0.934082f, 0.934082f, 0.934082f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000118f, 0.000117f, 0.000117f, 0.000117f, 0.000117f, 0.000116f, 0.000104f, 0.000093f, - 0.000084f, 0.000076f, 0.000069f, 0.000091f, 0.000057f, 0.000051f, 0.000112f, 0.000120f, - 0.000179f, 0.000232f, 0.000225f, 0.000283f, 0.000301f, 0.000308f, 0.000353f, 0.000437f, - 0.000395f, 0.000523f, 0.000486f, 0.000504f, 0.000469f, 0.000614f, 0.000581f, 0.000755f, - 0.000789f, 0.001121f, 0.000981f, 0.001218f, 0.001565f, 0.001795f, 0.002296f, 0.002958f, - 0.003866f, 0.005329f, 0.007675f, 0.011658f, 0.019043f, 0.033478f, 0.065430f, 0.144043f, - 0.331299f, 0.613770f, 0.921387f, 0.922852f, 0.923340f, 0.923340f, 0.923340f, 0.923340f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f, - 0.000116f, 0.000116f, 0.000115f, 0.000115f, 0.000115f, 0.000115f, 0.000114f, 0.000108f, - 0.000097f, 0.000087f, 0.000079f, 0.000072f, 0.000065f, 0.000060f, 0.000094f, 0.000050f, - 0.000104f, 0.000104f, 0.000121f, 0.000164f, 0.000195f, 0.000247f, 0.000265f, 0.000328f, - 0.000290f, 0.000355f, 0.000395f, 0.000356f, 0.000361f, 0.000459f, 0.000470f, 0.000515f, - 0.000580f, 0.000624f, 0.000751f, 0.000964f, 0.001105f, 0.001279f, 0.001413f, 0.001823f, - 0.002441f, 0.003407f, 0.004852f, 0.007210f, 0.011803f, 0.021225f, 0.041473f, 0.095032f, - 0.244019f, 0.537598f, 0.907715f, 0.910156f, 0.910156f, 0.909180f, 0.909668f, 0.911133f, - 0.000120f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000114f, 0.000114f, 0.000113f, - 0.000113f, 0.000112f, 0.000112f, 0.000112f, 0.000111f, 0.000112f, 0.000111f, 0.000111f, - 0.000111f, 0.000101f, 0.000093f, 0.000084f, 0.000077f, 0.000070f, 0.000064f, 0.000059f, - 0.000074f, 0.000079f, 0.000059f, 0.000087f, 0.000097f, 0.000128f, 0.000185f, 0.000213f, - 0.000265f, 0.000235f, 0.000239f, 0.000288f, 0.000299f, 0.000371f, 0.000341f, 0.000369f, - 0.000460f, 0.000446f, 0.000490f, 0.000602f, 0.000694f, 0.000904f, 0.001012f, 0.001234f, - 0.001544f, 0.002096f, 0.002989f, 0.004299f, 0.006840f, 0.012383f, 0.024948f, 0.059204f, - 0.166626f, 0.452637f, 0.892578f, 0.894043f, 0.894043f, 0.894531f, 0.894531f, 0.894043f, - 0.000115f, 0.000107f, 0.000108f, 0.000111f, 0.000108f, 0.000109f, 0.000108f, 0.000108f, - 0.000108f, 0.000107f, 0.000108f, 0.000107f, 0.000107f, 0.000106f, 0.000107f, 0.000107f, - 0.000106f, 0.000107f, 0.000106f, 0.000097f, 0.000090f, 0.000082f, 0.000075f, 0.000069f, - 0.000063f, 0.000058f, 0.000053f, 0.000070f, 0.000073f, 0.000085f, 0.000077f, 0.000088f, - 0.000136f, 0.000168f, 0.000190f, 0.000204f, 0.000199f, 0.000252f, 0.000233f, 0.000270f, - 0.000325f, 0.000295f, 0.000348f, 0.000383f, 0.000435f, 0.000534f, 0.000581f, 0.000803f, - 0.001004f, 0.001330f, 0.001812f, 0.002489f, 0.003944f, 0.006832f, 0.013748f, 0.033997f, - 0.104858f, 0.356689f, 0.873047f, 0.873047f, 0.875000f, 0.874023f, 0.874023f, 0.874023f, - 0.000000f, 0.000071f, 0.000063f, 0.000094f, 0.000092f, 0.000094f, 0.000093f, 0.000098f, - 0.000098f, 0.000098f, 0.000098f, 0.000099f, 0.000098f, 0.000099f, 0.000099f, 0.000099f, - 0.000099f, 0.000099f, 0.000099f, 0.000100f, 0.000100f, 0.000094f, 0.000087f, 0.000080f, - 0.000074f, 0.000068f, 0.000062f, 0.000058f, 0.000053f, 0.000049f, 0.000059f, 0.000059f, - 0.000045f, 0.000078f, 0.000082f, 0.000118f, 0.000155f, 0.000160f, 0.000174f, 0.000180f, - 0.000226f, 0.000213f, 0.000248f, 0.000258f, 0.000288f, 0.000352f, 0.000396f, 0.000465f, - 0.000566f, 0.000789f, 0.000941f, 0.001343f, 0.002199f, 0.003616f, 0.006912f, 0.017380f, - 0.058960f, 0.259521f, 0.847656f, 0.849121f, 0.850586f, 0.850098f, 0.849121f, 0.850586f, - 0.000000f, 0.000000f, 0.000019f, 0.000044f, 0.000048f, 0.000061f, 0.000071f, 0.000073f, - 0.000076f, 0.000079f, 0.000079f, 0.000082f, 0.000082f, 0.000082f, 0.000085f, 0.000086f, - 0.000087f, 0.000086f, 0.000088f, 0.000087f, 0.000089f, 0.000089f, 0.000089f, 0.000090f, - 0.000084f, 0.000078f, 0.000072f, 0.000067f, 0.000062f, 0.000057f, 0.000052f, 0.000049f, - 0.000045f, 0.000041f, 0.000038f, 0.000040f, 0.000062f, 0.000092f, 0.000100f, 0.000121f, - 0.000144f, 0.000133f, 0.000137f, 0.000170f, 0.000181f, 0.000168f, 0.000215f, 0.000286f, - 0.000327f, 0.000397f, 0.000504f, 0.000738f, 0.001039f, 0.001729f, 0.003317f, 0.007721f, - 0.028458f, 0.166626f, 0.815430f, 0.818359f, 0.818359f, 0.817383f, 0.818848f, 0.818359f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000008f, - 0.000016f, 0.000031f, 0.000035f, 0.000048f, 0.000050f, 0.000053f, 0.000058f, 0.000059f, - 0.000063f, 0.000064f, 0.000067f, 0.000067f, 0.000070f, 0.000071f, 0.000072f, 0.000073f, - 0.000075f, 0.000075f, 0.000076f, 0.000075f, 0.000069f, 0.000064f, 0.000060f, 0.000055f, - 0.000051f, 0.000047f, 0.000043f, 0.000040f, 0.000037f, 0.000034f, 0.000040f, 0.000041f, - 0.000054f, 0.000069f, 0.000096f, 0.000111f, 0.000109f, 0.000113f, 0.000142f, 0.000136f, - 0.000158f, 0.000196f, 0.000237f, 0.000349f, 0.000423f, 0.000744f, 0.001380f, 0.003214f, - 0.011124f, 0.088135f, 0.777344f, 0.779297f, 0.780273f, 0.779785f, 0.779785f, 0.779785f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000007f, - 0.000021f, 0.000023f, 0.000031f, 0.000034f, 0.000038f, 0.000041f, 0.000043f, 0.000047f, - 0.000049f, 0.000050f, 0.000053f, 0.000055f, 0.000056f, 0.000057f, 0.000059f, 0.000060f, - 0.000055f, 0.000051f, 0.000048f, 0.000044f, 0.000041f, 0.000038f, 0.000035f, 0.000032f, - 0.000029f, 0.000028f, 0.000028f, 0.000037f, 0.000044f, 0.000064f, 0.000078f, 0.000072f, - 0.000089f, 0.000098f, 0.000104f, 0.000146f, 0.000200f, 0.000272f, 0.000479f, 0.001077f, - 0.003733f, 0.033752f, 0.729492f, 0.730957f, 0.732422f, 0.731934f, 0.732422f, 0.732422f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, - 0.000006f, 0.000009f, 0.000013f, 0.000019f, 0.000021f, 0.000025f, 0.000027f, 0.000030f, - 0.000033f, 0.000034f, 0.000037f, 0.000039f, 0.000041f, 0.000039f, 0.000036f, 0.000033f, - 0.000031f, 0.000028f, 0.000026f, 0.000024f, 0.000021f, 0.000019f, 0.000017f, 0.000023f, - 0.000033f, 0.000041f, 0.000043f, 0.000058f, 0.000061f, 0.000081f, 0.000121f, 0.000248f, - 0.000821f, 0.008255f, 0.673340f, 0.674805f, 0.674316f, 0.674805f, 0.674805f, 0.673828f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000006f, 0.000010f, 0.000013f, - 0.000015f, 0.000017f, 0.000020f, 0.000022f, 0.000021f, 0.000019f, 0.000017f, 0.000015f, - 0.000013f, 0.000012f, 0.000010f, 0.000011f, 0.000016f, 0.000019f, 0.000019f, 0.000036f, - 0.000090f, 0.000897f, 0.606934f, 0.609863f, 0.609375f, 0.609863f, 0.609863f, 0.610352f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000003f, 0.000006f, 0.000005f, 0.000004f, 0.000003f, - 0.000004f, 0.000008f, 0.534668f, 0.536621f, 0.537109f, 0.537109f, 0.536621f, 0.536621f, - }, - { - 0.149292f, 0.432373f, 0.614258f, 0.719238f, 0.784180f, 0.826660f, 0.856934f, 0.879883f, - 0.896484f, 0.909180f, 0.919922f, 0.928711f, 0.936035f, 0.942383f, 0.947266f, 0.952148f, - 0.956055f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.970703f, 0.972656f, 0.974609f, - 0.976562f, 0.978027f, 0.979492f, 0.980469f, 0.981934f, 0.983398f, 0.984863f, 0.985352f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990234f, 0.990723f, 0.991699f, - 0.992676f, 0.993164f, 0.993652f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, - 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.998047f, 0.998047f, 0.998535f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.040161f, 0.161255f, 0.324951f, 0.486572f, 0.612305f, 0.704590f, 0.767090f, 0.811523f, - 0.844238f, 0.868652f, 0.887695f, 0.902344f, 0.913574f, 0.924316f, 0.932129f, 0.937988f, - 0.944336f, 0.949707f, 0.954102f, 0.957520f, 0.960938f, 0.964355f, 0.966797f, 0.969727f, - 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979004f, 0.980469f, 0.981445f, 0.982910f, - 0.983887f, 0.985352f, 0.985840f, 0.987305f, 0.987793f, 0.988770f, 0.989258f, 0.990234f, - 0.991211f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.993652f, 0.994141f, 0.995117f, - 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.017395f, 0.068542f, 0.149292f, 0.262451f, 0.392822f, 0.518066f, 0.621582f, 0.700195f, - 0.759766f, 0.803711f, 0.836426f, 0.862305f, 0.880859f, 0.896484f, 0.909668f, 0.919434f, - 0.929199f, 0.935547f, 0.941895f, 0.947754f, 0.952637f, 0.956055f, 0.959961f, 0.963867f, - 0.965820f, 0.968750f, 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.979980f, - 0.981934f, 0.983398f, 0.983887f, 0.984863f, 0.985840f, 0.986816f, 0.987793f, 0.989258f, - 0.989746f, 0.990234f, 0.991211f, 0.991699f, 0.992188f, 0.992676f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, - 0.009125f, 0.035492f, 0.075806f, 0.135864f, 0.219971f, 0.324707f, 0.437012f, 0.543457f, - 0.633789f, 0.704102f, 0.758789f, 0.802246f, 0.833496f, 0.857910f, 0.878418f, 0.894043f, - 0.906738f, 0.917480f, 0.925781f, 0.933594f, 0.940918f, 0.946777f, 0.951172f, 0.954590f, - 0.959473f, 0.962891f, 0.965820f, 0.968262f, 0.971191f, 0.973145f, 0.975098f, 0.976562f, - 0.978516f, 0.979980f, 0.981445f, 0.982422f, 0.983887f, 0.985840f, 0.986328f, 0.987305f, - 0.988281f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.993652f, - 0.994141f, 0.994629f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996582f, 0.997559f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.005848f, 0.021225f, 0.043640f, 0.076782f, 0.124084f, 0.189575f, 0.274414f, 0.372559f, - 0.473633f, 0.567383f, 0.646973f, 0.711426f, 0.761230f, 0.801758f, 0.833496f, 0.857422f, - 0.876953f, 0.893066f, 0.905273f, 0.916504f, 0.925293f, 0.932617f, 0.939941f, 0.945801f, - 0.950684f, 0.955566f, 0.958984f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.972656f, - 0.975098f, 0.977051f, 0.978516f, 0.980469f, 0.981934f, 0.982422f, 0.983887f, 0.985840f, - 0.986328f, 0.987305f, 0.988281f, 0.989258f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.995117f, 0.996094f, 0.996094f, 0.997070f, - 0.997559f, 0.997559f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.003937f, 0.014107f, 0.027664f, 0.047211f, 0.075195f, 0.113953f, 0.166748f, 0.236328f, - 0.320312f, 0.412354f, 0.504395f, 0.589844f, 0.661621f, 0.719727f, 0.768066f, 0.805664f, - 0.834961f, 0.858398f, 0.877441f, 0.893066f, 0.906738f, 0.916992f, 0.926270f, 0.933105f, - 0.940430f, 0.946289f, 0.951172f, 0.955566f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, - 0.970703f, 0.973145f, 0.975098f, 0.977051f, 0.979004f, 0.980469f, 0.981934f, 0.983398f, - 0.984375f, 0.985840f, 0.986328f, 0.987305f, 0.988770f, 0.989746f, 0.990723f, 0.991211f, - 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.994629f, 0.995117f, 0.995605f, 0.995605f, - 0.996582f, 0.997070f, 0.998535f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.002962f, 0.009674f, 0.019348f, 0.031708f, 0.049255f, 0.072754f, 0.105164f, 0.149048f, - 0.206665f, 0.278076f, 0.361572f, 0.448730f, 0.534668f, 0.611816f, 0.677734f, 0.730957f, - 0.775879f, 0.809570f, 0.837891f, 0.861328f, 0.879395f, 0.894531f, 0.907227f, 0.916992f, - 0.926270f, 0.934082f, 0.940918f, 0.946289f, 0.951172f, 0.956055f, 0.959473f, 0.962891f, - 0.966797f, 0.969238f, 0.971191f, 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980957f, - 0.982422f, 0.983398f, 0.984863f, 0.986328f, 0.986816f, 0.988281f, 0.989746f, 0.989746f, - 0.991211f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.994629f, 0.995605f, - 0.996094f, 0.997070f, 0.998535f, 0.999023f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.001900f, 0.007225f, 0.013733f, 0.022552f, 0.033661f, 0.049164f, 0.070374f, 0.097534f, - 0.135132f, 0.183350f, 0.244507f, 0.317871f, 0.400146f, 0.483643f, 0.562988f, 0.633301f, - 0.693848f, 0.743652f, 0.784180f, 0.816895f, 0.842773f, 0.865234f, 0.882812f, 0.896973f, - 0.908691f, 0.919434f, 0.927734f, 0.935547f, 0.942383f, 0.947266f, 0.952637f, 0.957031f, - 0.960938f, 0.964355f, 0.967285f, 0.969727f, 0.971680f, 0.974609f, 0.976074f, 0.978027f, - 0.979980f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.988770f, - 0.989746f, 0.990723f, 0.991699f, 0.992188f, 0.993164f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.001921f, 0.005543f, 0.010223f, 0.016312f, 0.024918f, 0.035217f, 0.049164f, 0.067017f, - 0.091125f, 0.122986f, 0.164673f, 0.217896f, 0.282471f, 0.356934f, 0.436768f, 0.516602f, - 0.590820f, 0.656250f, 0.711426f, 0.757812f, 0.794922f, 0.825684f, 0.850098f, 0.870605f, - 0.885742f, 0.900879f, 0.912109f, 0.921387f, 0.929688f, 0.937500f, 0.943848f, 0.949219f, - 0.953125f, 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970703f, 0.973145f, 0.975098f, - 0.977539f, 0.979004f, 0.980957f, 0.982422f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, - 0.988770f, 0.989258f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995117f, 0.998047f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, - 0.001360f, 0.004257f, 0.007988f, 0.013092f, 0.018753f, 0.026352f, 0.035645f, 0.048096f, - 0.064270f, 0.085449f, 0.113770f, 0.149292f, 0.195190f, 0.251953f, 0.320557f, 0.395020f, - 0.474121f, 0.549316f, 0.618652f, 0.678223f, 0.729492f, 0.770996f, 0.805176f, 0.833496f, - 0.855957f, 0.875977f, 0.891113f, 0.904785f, 0.915039f, 0.924316f, 0.933105f, 0.939453f, - 0.945312f, 0.950684f, 0.955078f, 0.959473f, 0.962891f, 0.966309f, 0.969727f, 0.972168f, - 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.983398f, 0.984375f, 0.986328f, - 0.986816f, 0.988281f, 0.989746f, 0.990234f, 0.991699f, 0.992188f, 0.992676f, 0.994141f, - 0.994141f, 0.994629f, 0.998047f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, - 0.001075f, 0.003492f, 0.006275f, 0.010223f, 0.014473f, 0.019821f, 0.026581f, 0.035492f, - 0.046967f, 0.061829f, 0.080750f, 0.105164f, 0.136475f, 0.177246f, 0.227783f, 0.288818f, - 0.358154f, 0.433594f, 0.509277f, 0.581543f, 0.645508f, 0.701172f, 0.747070f, 0.783691f, - 0.817383f, 0.842773f, 0.864258f, 0.881836f, 0.896484f, 0.908691f, 0.918945f, 0.928223f, - 0.935547f, 0.941895f, 0.948730f, 0.952637f, 0.957031f, 0.962402f, 0.964844f, 0.967773f, - 0.970703f, 0.973633f, 0.975586f, 0.977539f, 0.979492f, 0.981445f, 0.982910f, 0.984375f, - 0.985840f, 0.986816f, 0.988281f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, 0.992676f, - 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.997559f, 0.998047f, - 0.000967f, 0.002928f, 0.005283f, 0.007759f, 0.011612f, 0.015823f, 0.020966f, 0.027802f, - 0.035461f, 0.045959f, 0.059235f, 0.075928f, 0.097778f, 0.126099f, 0.162598f, 0.207153f, - 0.261963f, 0.326416f, 0.398193f, 0.471680f, 0.543945f, 0.612305f, 0.671875f, 0.722656f, - 0.765137f, 0.799805f, 0.828125f, 0.854004f, 0.872070f, 0.888184f, 0.902344f, 0.914062f, - 0.923340f, 0.931641f, 0.938965f, 0.945312f, 0.950684f, 0.955566f, 0.958984f, 0.962891f, - 0.966309f, 0.969727f, 0.972168f, 0.974609f, 0.977051f, 0.978516f, 0.980469f, 0.982422f, - 0.984375f, 0.985352f, 0.987305f, 0.987793f, 0.988770f, 0.990234f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997559f, 0.998047f, 0.997559f, 0.998047f, - 0.000602f, 0.002605f, 0.004345f, 0.006706f, 0.009590f, 0.012650f, 0.016617f, 0.021423f, - 0.027893f, 0.035004f, 0.044495f, 0.056610f, 0.072327f, 0.092285f, 0.116821f, 0.148926f, - 0.189697f, 0.238892f, 0.298340f, 0.365723f, 0.437988f, 0.511230f, 0.579590f, 0.642090f, - 0.698242f, 0.744141f, 0.781738f, 0.814453f, 0.840332f, 0.861816f, 0.880371f, 0.895996f, - 0.907715f, 0.918945f, 0.928223f, 0.935547f, 0.942871f, 0.948730f, 0.953125f, 0.958008f, - 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.973633f, 0.976562f, 0.978516f, 0.979980f, - 0.981934f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, - 0.991699f, 0.992676f, 0.997070f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, - 0.000607f, 0.001955f, 0.003616f, 0.005772f, 0.007656f, 0.010269f, 0.013496f, 0.017273f, - 0.022018f, 0.027466f, 0.034729f, 0.043488f, 0.054932f, 0.068359f, 0.086365f, 0.108765f, - 0.137939f, 0.174316f, 0.219360f, 0.273926f, 0.336670f, 0.406494f, 0.478516f, 0.549316f, - 0.614746f, 0.673340f, 0.722656f, 0.765137f, 0.800293f, 0.828125f, 0.853516f, 0.872070f, - 0.888672f, 0.902832f, 0.914551f, 0.924316f, 0.932129f, 0.940430f, 0.946289f, 0.951660f, - 0.956055f, 0.960449f, 0.964355f, 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f, - 0.980469f, 0.981934f, 0.983398f, 0.985352f, 0.986328f, 0.988281f, 0.988770f, 0.990234f, - 0.990723f, 0.992188f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000600f, 0.001813f, 0.003101f, 0.004559f, 0.006580f, 0.008873f, 0.011047f, 0.014091f, - 0.017639f, 0.022049f, 0.027557f, 0.033997f, 0.042297f, 0.052704f, 0.065369f, 0.081238f, - 0.101929f, 0.127930f, 0.161255f, 0.202515f, 0.252686f, 0.311523f, 0.378174f, 0.449707f, - 0.519531f, 0.587891f, 0.647949f, 0.701660f, 0.746582f, 0.784668f, 0.817383f, 0.843262f, - 0.864746f, 0.882324f, 0.896973f, 0.910156f, 0.920898f, 0.929688f, 0.937012f, 0.943848f, - 0.949707f, 0.955078f, 0.959473f, 0.963379f, 0.966797f, 0.970215f, 0.973145f, 0.975098f, - 0.978027f, 0.980469f, 0.982422f, 0.983887f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.991211f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.000604f, 0.001429f, 0.002676f, 0.003708f, 0.005745f, 0.006973f, 0.009270f, 0.011452f, - 0.014503f, 0.018295f, 0.022369f, 0.027222f, 0.033417f, 0.040833f, 0.050171f, 0.062744f, - 0.077454f, 0.095886f, 0.119995f, 0.150391f, 0.187622f, 0.234253f, 0.289307f, 0.353027f, - 0.421631f, 0.492676f, 0.561523f, 0.625488f, 0.681152f, 0.730469f, 0.770996f, 0.806152f, - 0.833984f, 0.857422f, 0.876465f, 0.893066f, 0.906250f, 0.916992f, 0.926758f, 0.935059f, - 0.942871f, 0.948242f, 0.954102f, 0.958496f, 0.962891f, 0.966309f, 0.969727f, 0.972168f, - 0.975098f, 0.977539f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, - 0.989258f, 0.990234f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000365f, 0.001367f, 0.002123f, 0.003353f, 0.004692f, 0.006054f, 0.007675f, 0.009819f, - 0.012314f, 0.014862f, 0.018066f, 0.022064f, 0.026901f, 0.032471f, 0.039764f, 0.048584f, - 0.060089f, 0.073730f, 0.090698f, 0.112854f, 0.140381f, 0.175415f, 0.218018f, 0.269775f, - 0.329834f, 0.396240f, 0.467285f, 0.537598f, 0.603516f, 0.662109f, 0.712891f, 0.757324f, - 0.793945f, 0.823730f, 0.849121f, 0.869629f, 0.887695f, 0.902344f, 0.914062f, 0.924805f, - 0.932129f, 0.940430f, 0.947266f, 0.952148f, 0.957031f, 0.962402f, 0.966309f, 0.969238f, - 0.972656f, 0.975586f, 0.977051f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, - 0.988281f, 0.988770f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000356f, 0.001341f, 0.001913f, 0.002897f, 0.003983f, 0.005322f, 0.006607f, 0.008514f, - 0.010399f, 0.012451f, 0.015282f, 0.018356f, 0.021912f, 0.026443f, 0.031982f, 0.038635f, - 0.047150f, 0.057495f, 0.070007f, 0.086609f, 0.106689f, 0.131714f, 0.164429f, 0.203613f, - 0.252441f, 0.310059f, 0.374512f, 0.444092f, 0.514160f, 0.582031f, 0.643066f, 0.697266f, - 0.743652f, 0.783691f, 0.814941f, 0.842773f, 0.865234f, 0.882812f, 0.897949f, 0.910645f, - 0.922363f, 0.931152f, 0.938965f, 0.945801f, 0.952148f, 0.957520f, 0.961426f, 0.965820f, - 0.969727f, 0.972168f, 0.975098f, 0.977539f, 0.979980f, 0.981934f, 0.983887f, 0.985352f, - 0.986816f, 0.988281f, 0.995117f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000243f, 0.000937f, 0.001662f, 0.002617f, 0.003527f, 0.004555f, 0.005642f, 0.007217f, - 0.008820f, 0.010483f, 0.012383f, 0.015175f, 0.018341f, 0.022049f, 0.026245f, 0.031067f, - 0.037903f, 0.045563f, 0.054962f, 0.066956f, 0.082092f, 0.101074f, 0.124939f, 0.154663f, - 0.191528f, 0.237305f, 0.291992f, 0.354492f, 0.422852f, 0.492676f, 0.562012f, 0.625488f, - 0.682617f, 0.731934f, 0.772949f, 0.807129f, 0.835449f, 0.859863f, 0.878906f, 0.895020f, - 0.908203f, 0.920898f, 0.929199f, 0.937988f, 0.945312f, 0.951660f, 0.957031f, 0.961914f, - 0.965332f, 0.968750f, 0.972656f, 0.975098f, 0.977539f, 0.979980f, 0.982422f, 0.983887f, - 0.986328f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000362f, 0.000970f, 0.001489f, 0.002251f, 0.002892f, 0.003727f, 0.004978f, 0.006264f, - 0.007530f, 0.009125f, 0.010551f, 0.012756f, 0.015259f, 0.018097f, 0.021637f, 0.025986f, - 0.030594f, 0.036804f, 0.044006f, 0.053162f, 0.064148f, 0.078003f, 0.096130f, 0.118042f, - 0.146118f, 0.181030f, 0.224487f, 0.276123f, 0.336670f, 0.403320f, 0.473633f, 0.543457f, - 0.609375f, 0.667480f, 0.719238f, 0.763184f, 0.799316f, 0.829590f, 0.854492f, 0.875488f, - 0.892578f, 0.906738f, 0.918945f, 0.928711f, 0.937012f, 0.944336f, 0.951172f, 0.956543f, - 0.961426f, 0.965820f, 0.968750f, 0.972656f, 0.975098f, 0.978027f, 0.980469f, 0.982910f, - 0.984375f, 0.985840f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, 0.995117f, - 0.000346f, 0.000923f, 0.001273f, 0.002010f, 0.002619f, 0.003689f, 0.004452f, 0.005177f, - 0.006290f, 0.007561f, 0.009033f, 0.010902f, 0.012970f, 0.015495f, 0.018280f, 0.021576f, - 0.024948f, 0.030304f, 0.035400f, 0.042480f, 0.051086f, 0.061401f, 0.074890f, 0.091187f, - 0.112427f, 0.138794f, 0.171631f, 0.212158f, 0.262451f, 0.320557f, 0.385986f, 0.456055f, - 0.525391f, 0.593262f, 0.654297f, 0.708984f, 0.754883f, 0.792969f, 0.824707f, 0.850098f, - 0.872070f, 0.890137f, 0.904785f, 0.917480f, 0.927734f, 0.937012f, 0.944336f, 0.951172f, - 0.956055f, 0.961914f, 0.966309f, 0.969727f, 0.973145f, 0.976074f, 0.978516f, 0.980469f, - 0.982910f, 0.984863f, 0.993652f, 0.995117f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, - 0.000242f, 0.000666f, 0.001081f, 0.001806f, 0.002512f, 0.003397f, 0.003866f, 0.004894f, - 0.005566f, 0.006859f, 0.007957f, 0.009506f, 0.011009f, 0.013046f, 0.015266f, 0.018173f, - 0.021027f, 0.024811f, 0.029526f, 0.034790f, 0.041443f, 0.049835f, 0.059265f, 0.071899f, - 0.087769f, 0.107422f, 0.132202f, 0.163208f, 0.201782f, 0.249512f, 0.305908f, 0.370361f, - 0.440430f, 0.511230f, 0.578613f, 0.642090f, 0.698730f, 0.746582f, 0.787109f, 0.819824f, - 0.848145f, 0.869141f, 0.888672f, 0.903809f, 0.916992f, 0.927246f, 0.936523f, 0.943848f, - 0.951660f, 0.957031f, 0.961426f, 0.965820f, 0.970215f, 0.973145f, 0.976074f, 0.979004f, - 0.981445f, 0.983398f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994629f, 0.994141f, - 0.000242f, 0.000709f, 0.000917f, 0.001194f, 0.002018f, 0.002634f, 0.003504f, 0.003918f, - 0.005020f, 0.005726f, 0.006935f, 0.008141f, 0.009666f, 0.011040f, 0.012848f, 0.014961f, - 0.017624f, 0.020660f, 0.024368f, 0.028381f, 0.033905f, 0.040283f, 0.047760f, 0.057312f, - 0.069214f, 0.083984f, 0.102539f, 0.126221f, 0.155640f, 0.193359f, 0.238892f, 0.293701f, - 0.356689f, 0.425537f, 0.497070f, 0.568359f, 0.632812f, 0.690918f, 0.739746f, 0.782227f, - 0.816406f, 0.845703f, 0.868652f, 0.887695f, 0.903320f, 0.916992f, 0.927734f, 0.937012f, - 0.944824f, 0.951660f, 0.957031f, 0.962891f, 0.966797f, 0.971191f, 0.973633f, 0.976562f, - 0.979492f, 0.981934f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.994141f, - 0.000244f, 0.000660f, 0.000918f, 0.001343f, 0.002117f, 0.002407f, 0.002779f, 0.003626f, - 0.004246f, 0.005207f, 0.005913f, 0.007145f, 0.008163f, 0.009438f, 0.011101f, 0.012871f, - 0.014999f, 0.017426f, 0.020096f, 0.024185f, 0.027725f, 0.032623f, 0.038910f, 0.046387f, - 0.055298f, 0.066467f, 0.080627f, 0.098328f, 0.120972f, 0.149658f, 0.184814f, 0.229492f, - 0.282715f, 0.344727f, 0.414062f, 0.486084f, 0.556641f, 0.624023f, 0.683594f, 0.735352f, - 0.778320f, 0.814453f, 0.843750f, 0.867188f, 0.887207f, 0.903320f, 0.916504f, 0.928223f, - 0.937500f, 0.945312f, 0.953125f, 0.958008f, 0.964355f, 0.967285f, 0.971680f, 0.975098f, - 0.978516f, 0.980957f, 0.992676f, 0.993652f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.000200f, 0.000480f, 0.000808f, 0.001303f, 0.001680f, 0.002104f, 0.002510f, 0.002934f, - 0.003468f, 0.004429f, 0.005539f, 0.006046f, 0.006889f, 0.008438f, 0.009415f, 0.011108f, - 0.012787f, 0.014572f, 0.017517f, 0.020279f, 0.023483f, 0.027359f, 0.031860f, 0.037964f, - 0.045227f, 0.053711f, 0.064148f, 0.077759f, 0.095093f, 0.116272f, 0.143311f, 0.177856f, - 0.221191f, 0.273193f, 0.334473f, 0.403320f, 0.476318f, 0.548828f, 0.617188f, 0.677734f, - 0.730957f, 0.775879f, 0.812500f, 0.842285f, 0.866699f, 0.887695f, 0.903809f, 0.916992f, - 0.928711f, 0.938477f, 0.946777f, 0.953125f, 0.959473f, 0.963867f, 0.968750f, 0.972656f, - 0.976074f, 0.979004f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, 0.993164f, - 0.000243f, 0.000469f, 0.000878f, 0.001158f, 0.001382f, 0.001801f, 0.002220f, 0.002699f, - 0.003273f, 0.004063f, 0.004715f, 0.005447f, 0.005917f, 0.007099f, 0.008385f, 0.009521f, - 0.011032f, 0.012627f, 0.014870f, 0.016922f, 0.019836f, 0.023010f, 0.026642f, 0.031174f, - 0.036926f, 0.043549f, 0.051941f, 0.062561f, 0.075317f, 0.091553f, 0.112427f, 0.138428f, - 0.172485f, 0.213867f, 0.265381f, 0.326172f, 0.394775f, 0.467773f, 0.541504f, 0.610840f, - 0.673340f, 0.728516f, 0.774414f, 0.812012f, 0.842773f, 0.867676f, 0.887695f, 0.904297f, - 0.918457f, 0.929688f, 0.939453f, 0.948242f, 0.955078f, 0.959961f, 0.965820f, 0.970215f, - 0.974121f, 0.977051f, 0.991211f, 0.993164f, 0.993164f, 0.992188f, 0.993164f, 0.992188f, - 0.000000f, 0.000242f, 0.000799f, 0.000998f, 0.001273f, 0.001671f, 0.002069f, 0.002485f, - 0.003212f, 0.003578f, 0.003948f, 0.004559f, 0.005524f, 0.006321f, 0.007046f, 0.008438f, - 0.009438f, 0.010986f, 0.012390f, 0.014320f, 0.016663f, 0.019165f, 0.022476f, 0.025833f, - 0.030487f, 0.035675f, 0.042358f, 0.050018f, 0.060211f, 0.072693f, 0.088379f, 0.108948f, - 0.134766f, 0.166626f, 0.208008f, 0.258545f, 0.318848f, 0.387451f, 0.461670f, 0.536621f, - 0.606934f, 0.671387f, 0.727539f, 0.773438f, 0.811523f, 0.843750f, 0.868164f, 0.889160f, - 0.906250f, 0.920410f, 0.932617f, 0.941895f, 0.949707f, 0.956055f, 0.962402f, 0.967285f, - 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.992188f, 0.992188f, 0.991699f, - 0.000237f, 0.000482f, 0.000772f, 0.000877f, 0.001109f, 0.001494f, 0.001991f, 0.002041f, - 0.002537f, 0.002975f, 0.003469f, 0.004128f, 0.004841f, 0.005550f, 0.006306f, 0.007359f, - 0.008369f, 0.009415f, 0.010788f, 0.012306f, 0.014160f, 0.016571f, 0.018921f, 0.021896f, - 0.025497f, 0.029587f, 0.034576f, 0.041260f, 0.049011f, 0.058319f, 0.070557f, 0.086060f, - 0.105774f, 0.130737f, 0.162720f, 0.203247f, 0.252930f, 0.313477f, 0.382568f, 0.457275f, - 0.532715f, 0.605469f, 0.671387f, 0.728027f, 0.774902f, 0.814453f, 0.844727f, 0.870605f, - 0.891113f, 0.909180f, 0.922852f, 0.934082f, 0.943359f, 0.951660f, 0.958008f, 0.964355f, - 0.968750f, 0.973145f, 0.990234f, 0.990723f, 0.991699f, 0.991211f, 0.991211f, 0.991211f, - 0.000235f, 0.000461f, 0.000484f, 0.000891f, 0.001105f, 0.001346f, 0.001634f, 0.001936f, - 0.002438f, 0.002874f, 0.003353f, 0.003925f, 0.004189f, 0.004887f, 0.005684f, 0.006279f, - 0.007298f, 0.008339f, 0.009384f, 0.010674f, 0.012360f, 0.013901f, 0.016113f, 0.018677f, - 0.021469f, 0.024841f, 0.029144f, 0.033783f, 0.039948f, 0.047272f, 0.056915f, 0.068726f, - 0.083801f, 0.102905f, 0.127563f, 0.159058f, 0.199341f, 0.248901f, 0.309570f, 0.379395f, - 0.454834f, 0.532715f, 0.606934f, 0.672852f, 0.729980f, 0.778320f, 0.817383f, 0.849121f, - 0.874512f, 0.895020f, 0.911621f, 0.924805f, 0.937012f, 0.946289f, 0.954102f, 0.960938f, - 0.965820f, 0.971191f, 0.989258f, 0.990234f, 0.990723f, 0.991211f, 0.990723f, 0.990723f, - 0.000000f, 0.000360f, 0.000477f, 0.000756f, 0.000896f, 0.001065f, 0.001570f, 0.001622f, - 0.002064f, 0.002525f, 0.002819f, 0.003004f, 0.003700f, 0.004356f, 0.005077f, 0.005428f, - 0.006283f, 0.007370f, 0.008339f, 0.009323f, 0.010567f, 0.012070f, 0.013672f, 0.015839f, - 0.018066f, 0.020844f, 0.024002f, 0.028183f, 0.033051f, 0.039246f, 0.046417f, 0.055450f, - 0.067200f, 0.082031f, 0.100586f, 0.125122f, 0.156250f, 0.196167f, 0.245972f, 0.307129f, - 0.378174f, 0.454834f, 0.533203f, 0.608398f, 0.675781f, 0.734375f, 0.782715f, 0.821777f, - 0.853516f, 0.878906f, 0.898926f, 0.915039f, 0.929199f, 0.939941f, 0.948730f, 0.956055f, - 0.963379f, 0.968262f, 0.988770f, 0.989746f, 0.990234f, 0.989746f, 0.989746f, 0.990234f, - 0.000000f, 0.000256f, 0.000467f, 0.000590f, 0.000772f, 0.001095f, 0.001356f, 0.001781f, - 0.001984f, 0.002161f, 0.002546f, 0.002956f, 0.003338f, 0.003899f, 0.004440f, 0.004986f, - 0.005486f, 0.006310f, 0.006969f, 0.008148f, 0.009148f, 0.010284f, 0.011902f, 0.013573f, - 0.015465f, 0.017853f, 0.020340f, 0.023590f, 0.027298f, 0.032227f, 0.038208f, 0.045563f, - 0.054047f, 0.065796f, 0.080322f, 0.098999f, 0.122864f, 0.153809f, 0.193970f, 0.244629f, - 0.306396f, 0.378662f, 0.457031f, 0.536621f, 0.613770f, 0.681641f, 0.740723f, 0.788574f, - 0.827637f, 0.858398f, 0.884277f, 0.903320f, 0.919922f, 0.932129f, 0.942871f, 0.951660f, - 0.959961f, 0.965820f, 0.987305f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, - 0.000244f, 0.000243f, 0.000583f, 0.000585f, 0.000822f, 0.001073f, 0.001159f, 0.001452f, - 0.001525f, 0.002001f, 0.002201f, 0.002714f, 0.002932f, 0.003525f, 0.003904f, 0.004482f, - 0.004997f, 0.005581f, 0.006233f, 0.006954f, 0.007820f, 0.008949f, 0.009941f, 0.011482f, - 0.013168f, 0.015099f, 0.017151f, 0.020111f, 0.022949f, 0.026947f, 0.031647f, 0.037354f, - 0.044342f, 0.053375f, 0.064331f, 0.078857f, 0.097351f, 0.121033f, 0.152588f, 0.192749f, - 0.244263f, 0.307129f, 0.380615f, 0.461426f, 0.543457f, 0.621582f, 0.690430f, 0.748047f, - 0.796387f, 0.834961f, 0.865723f, 0.889160f, 0.908691f, 0.924316f, 0.937500f, 0.946777f, - 0.955078f, 0.962891f, 0.986328f, 0.987793f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, - 0.000000f, 0.000243f, 0.000308f, 0.000541f, 0.000801f, 0.000827f, 0.001057f, 0.001280f, - 0.001460f, 0.001781f, 0.002090f, 0.002481f, 0.002756f, 0.003054f, 0.003321f, 0.003948f, - 0.004303f, 0.004898f, 0.005306f, 0.006405f, 0.006954f, 0.007851f, 0.008537f, 0.009918f, - 0.011208f, 0.012825f, 0.014534f, 0.016861f, 0.019379f, 0.022629f, 0.026276f, 0.030838f, - 0.036407f, 0.043488f, 0.051819f, 0.063416f, 0.077209f, 0.095825f, 0.119812f, 0.151489f, - 0.192749f, 0.245361f, 0.309814f, 0.385986f, 0.469238f, 0.552246f, 0.630859f, 0.699707f, - 0.757324f, 0.805176f, 0.842773f, 0.873047f, 0.895508f, 0.914062f, 0.929688f, 0.941406f, - 0.952148f, 0.959473f, 0.985840f, 0.986816f, 0.987305f, 0.987305f, 0.987305f, 0.987305f, - 0.000000f, 0.000243f, 0.000242f, 0.000548f, 0.000695f, 0.000803f, 0.001053f, 0.001198f, - 0.001363f, 0.001513f, 0.001886f, 0.002069f, 0.002447f, 0.002676f, 0.003138f, 0.003551f, - 0.003868f, 0.004261f, 0.004936f, 0.005337f, 0.005852f, 0.006615f, 0.007519f, 0.008575f, - 0.009705f, 0.010872f, 0.012688f, 0.014397f, 0.016479f, 0.019119f, 0.022064f, 0.025589f, - 0.030304f, 0.035828f, 0.042603f, 0.050812f, 0.062012f, 0.076355f, 0.094971f, 0.119263f, - 0.151367f, 0.193726f, 0.247925f, 0.314941f, 0.393311f, 0.478271f, 0.563965f, 0.642578f, - 0.711914f, 0.769043f, 0.815430f, 0.851562f, 0.881348f, 0.902832f, 0.921387f, 0.934570f, - 0.945801f, 0.955078f, 0.984375f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, 0.986328f, - 0.000000f, 0.000234f, 0.000239f, 0.000308f, 0.000597f, 0.000690f, 0.000868f, 0.000937f, - 0.001189f, 0.001404f, 0.001696f, 0.001854f, 0.002180f, 0.002249f, 0.002672f, 0.002979f, - 0.003494f, 0.003761f, 0.004257f, 0.004745f, 0.005154f, 0.005821f, 0.006561f, 0.007557f, - 0.008575f, 0.009575f, 0.010963f, 0.012238f, 0.014130f, 0.016113f, 0.018539f, 0.021545f, - 0.025162f, 0.029404f, 0.034851f, 0.041626f, 0.050354f, 0.061218f, 0.075562f, 0.094482f, - 0.119507f, 0.152344f, 0.196167f, 0.252197f, 0.322266f, 0.404053f, 0.490967f, 0.577637f, - 0.658203f, 0.726074f, 0.782715f, 0.827637f, 0.861816f, 0.889648f, 0.910645f, 0.926758f, - 0.940918f, 0.950684f, 0.983398f, 0.985352f, 0.984863f, 0.985352f, 0.985840f, 0.985352f, - 0.000000f, 0.000240f, 0.000237f, 0.000239f, 0.000436f, 0.000648f, 0.000661f, 0.000892f, - 0.001089f, 0.001484f, 0.001446f, 0.001586f, 0.001896f, 0.002176f, 0.002325f, 0.002634f, - 0.003057f, 0.003315f, 0.003561f, 0.004150f, 0.004578f, 0.005180f, 0.005768f, 0.006485f, - 0.007286f, 0.008400f, 0.009453f, 0.010429f, 0.011795f, 0.013680f, 0.015671f, 0.018005f, - 0.020981f, 0.024521f, 0.028748f, 0.034119f, 0.040863f, 0.049622f, 0.060303f, 0.074829f, - 0.094116f, 0.119995f, 0.154297f, 0.199341f, 0.258301f, 0.331787f, 0.416504f, 0.507812f, - 0.595703f, 0.675781f, 0.743164f, 0.797852f, 0.840820f, 0.873535f, 0.899414f, 0.919434f, - 0.934082f, 0.947266f, 0.982422f, 0.983887f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, - 0.000136f, 0.000115f, 0.000237f, 0.000238f, 0.000358f, 0.000452f, 0.000759f, 0.000961f, - 0.001026f, 0.001113f, 0.001433f, 0.001564f, 0.001659f, 0.001955f, 0.002024f, 0.002384f, - 0.002647f, 0.002974f, 0.003267f, 0.003611f, 0.003971f, 0.004498f, 0.005043f, 0.005539f, - 0.006344f, 0.007168f, 0.007942f, 0.009010f, 0.010353f, 0.011711f, 0.013458f, 0.015213f, - 0.017548f, 0.020279f, 0.023926f, 0.028061f, 0.033356f, 0.040283f, 0.048615f, 0.060455f, - 0.074890f, 0.094727f, 0.121216f, 0.156860f, 0.204102f, 0.266846f, 0.344238f, 0.433105f, - 0.526855f, 0.616699f, 0.696289f, 0.761230f, 0.813965f, 0.854492f, 0.884766f, 0.909180f, - 0.927734f, 0.941895f, 0.980957f, 0.982422f, 0.982910f, 0.982422f, 0.982422f, 0.982910f, - 0.000000f, 0.000103f, 0.000208f, 0.000356f, 0.000355f, 0.000400f, 0.000454f, 0.000861f, - 0.000922f, 0.001202f, 0.001088f, 0.001401f, 0.001493f, 0.001779f, 0.001881f, 0.002180f, - 0.002329f, 0.002483f, 0.002846f, 0.003178f, 0.003542f, 0.003914f, 0.004406f, 0.004871f, - 0.005352f, 0.006119f, 0.006927f, 0.007904f, 0.008759f, 0.009972f, 0.011284f, 0.013046f, - 0.014938f, 0.016998f, 0.019943f, 0.023224f, 0.027161f, 0.032776f, 0.039917f, 0.048218f, - 0.059937f, 0.075134f, 0.095642f, 0.123169f, 0.160767f, 0.211670f, 0.278320f, 0.360352f, - 0.454102f, 0.550293f, 0.640625f, 0.718262f, 0.781738f, 0.831055f, 0.869141f, 0.897461f, - 0.919434f, 0.936035f, 0.979492f, 0.980957f, 0.980957f, 0.981934f, 0.981445f, 0.981445f, - 0.000000f, 0.000192f, 0.000191f, 0.000350f, 0.000352f, 0.000354f, 0.000599f, 0.000721f, - 0.000835f, 0.001044f, 0.000988f, 0.001141f, 0.001255f, 0.001479f, 0.001705f, 0.001815f, - 0.001843f, 0.002151f, 0.002369f, 0.002831f, 0.003067f, 0.003431f, 0.003698f, 0.004295f, - 0.004738f, 0.005352f, 0.005859f, 0.006615f, 0.007587f, 0.008583f, 0.009682f, 0.010735f, - 0.012405f, 0.014381f, 0.016708f, 0.018921f, 0.022736f, 0.026947f, 0.032104f, 0.039032f, - 0.048004f, 0.059784f, 0.075500f, 0.096924f, 0.125977f, 0.166626f, 0.221069f, 0.292969f, - 0.380371f, 0.479004f, 0.577637f, 0.667969f, 0.743164f, 0.803711f, 0.849609f, 0.883789f, - 0.910645f, 0.930176f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979980f, 0.979492f, - 0.000000f, 0.000000f, 0.000191f, 0.000214f, 0.000441f, 0.000465f, 0.000351f, 0.000656f, - 0.000672f, 0.000957f, 0.000881f, 0.001092f, 0.001209f, 0.001259f, 0.001315f, 0.001583f, - 0.001630f, 0.001834f, 0.002033f, 0.002367f, 0.002596f, 0.002924f, 0.003387f, 0.003693f, - 0.004063f, 0.004601f, 0.004986f, 0.005676f, 0.006557f, 0.006973f, 0.007801f, 0.008781f, - 0.010475f, 0.012100f, 0.013817f, 0.015625f, 0.018784f, 0.021927f, 0.026260f, 0.031677f, - 0.038879f, 0.048004f, 0.059845f, 0.076233f, 0.098633f, 0.130005f, 0.173950f, 0.233032f, - 0.311035f, 0.405518f, 0.507812f, 0.608887f, 0.698242f, 0.769531f, 0.826172f, 0.868164f, - 0.899414f, 0.922852f, 0.976074f, 0.977539f, 0.977539f, 0.977051f, 0.978027f, 0.978027f, - 0.000000f, 0.000000f, 0.000117f, 0.000211f, 0.000326f, 0.000573f, 0.000574f, 0.000583f, - 0.000584f, 0.000659f, 0.000901f, 0.001014f, 0.001064f, 0.001033f, 0.001163f, 0.001234f, - 0.001546f, 0.001585f, 0.001894f, 0.002085f, 0.002361f, 0.002504f, 0.003023f, 0.003147f, - 0.003580f, 0.004032f, 0.004314f, 0.004936f, 0.005215f, 0.006081f, 0.006725f, 0.007927f, - 0.008743f, 0.009918f, 0.011642f, 0.013367f, 0.015404f, 0.018219f, 0.021545f, 0.025787f, - 0.031174f, 0.038361f, 0.047577f, 0.060425f, 0.077881f, 0.102051f, 0.135376f, 0.182861f, - 0.249023f, 0.333984f, 0.436035f, 0.542969f, 0.644043f, 0.730469f, 0.798340f, 0.848633f, - 0.886719f, 0.914062f, 0.973633f, 0.974609f, 0.975098f, 0.976074f, 0.975098f, 0.976074f, - 0.000000f, 0.000000f, 0.000114f, 0.000112f, 0.000271f, 0.000510f, 0.000450f, 0.000565f, - 0.000572f, 0.000581f, 0.000654f, 0.000825f, 0.000954f, 0.001085f, 0.001050f, 0.001087f, - 0.001282f, 0.001547f, 0.001585f, 0.001825f, 0.002066f, 0.002182f, 0.002384f, 0.002659f, - 0.003172f, 0.003357f, 0.003721f, 0.004238f, 0.004505f, 0.005024f, 0.005878f, 0.006512f, - 0.007324f, 0.008293f, 0.009201f, 0.011040f, 0.012993f, 0.015007f, 0.017639f, 0.020920f, - 0.025131f, 0.030899f, 0.038269f, 0.047760f, 0.061188f, 0.079651f, 0.105469f, 0.142944f, - 0.195801f, 0.268799f, 0.363525f, 0.472168f, 0.582520f, 0.683594f, 0.765137f, 0.826660f, - 0.872070f, 0.905273f, 0.972168f, 0.973633f, 0.973145f, 0.973633f, 0.973633f, 0.973633f, - 0.000000f, 0.000000f, 0.000000f, 0.000111f, 0.000224f, 0.000412f, 0.000494f, 0.000543f, - 0.000561f, 0.000680f, 0.000665f, 0.000675f, 0.000679f, 0.000797f, 0.000926f, 0.001122f, - 0.001132f, 0.001207f, 0.001375f, 0.001606f, 0.001838f, 0.001963f, 0.002163f, 0.002314f, - 0.002480f, 0.002956f, 0.003189f, 0.003489f, 0.003744f, 0.004311f, 0.004749f, 0.005276f, - 0.005867f, 0.006962f, 0.008186f, 0.008987f, 0.010498f, 0.012283f, 0.014374f, 0.017075f, - 0.020355f, 0.024719f, 0.030640f, 0.037720f, 0.048309f, 0.062134f, 0.082336f, 0.110840f, - 0.151978f, 0.212891f, 0.294922f, 0.399170f, 0.515137f, 0.628418f, 0.724609f, 0.799805f, - 0.854980f, 0.894043f, 0.968750f, 0.970215f, 0.970703f, 0.971191f, 0.970703f, 0.970703f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000228f, 0.000233f, 0.000436f, 0.000457f, - 0.000621f, 0.000546f, 0.000622f, 0.000633f, 0.000576f, 0.000644f, 0.000717f, 0.000909f, - 0.000994f, 0.001127f, 0.001179f, 0.001267f, 0.001513f, 0.001628f, 0.001742f, 0.001974f, - 0.002111f, 0.002403f, 0.002810f, 0.003139f, 0.003231f, 0.003466f, 0.004021f, 0.004459f, - 0.004971f, 0.005581f, 0.006809f, 0.007568f, 0.008759f, 0.010002f, 0.011665f, 0.013847f, - 0.016342f, 0.019714f, 0.024368f, 0.030106f, 0.037811f, 0.048706f, 0.063843f, 0.085327f, - 0.118042f, 0.164917f, 0.234131f, 0.328125f, 0.443359f, 0.565430f, 0.677246f, 0.767578f, - 0.833496f, 0.882812f, 0.965820f, 0.967285f, 0.967773f, 0.968262f, 0.967773f, 0.968262f, - 0.000000f, 0.000000f, 0.000000f, 0.000214f, 0.000210f, 0.000296f, 0.000309f, 0.000386f, - 0.000462f, 0.000482f, 0.000525f, 0.000572f, 0.000525f, 0.000558f, 0.000689f, 0.000685f, - 0.000841f, 0.000934f, 0.001008f, 0.001182f, 0.001271f, 0.001412f, 0.001757f, 0.001787f, - 0.001769f, 0.002110f, 0.002321f, 0.002331f, 0.002737f, 0.002951f, 0.003189f, 0.003588f, - 0.004253f, 0.004627f, 0.005505f, 0.006119f, 0.006969f, 0.008018f, 0.009583f, 0.010971f, - 0.013245f, 0.015915f, 0.019257f, 0.023651f, 0.030014f, 0.038086f, 0.049683f, 0.066406f, - 0.091125f, 0.127441f, 0.182617f, 0.262939f, 0.370605f, 0.497070f, 0.623047f, 0.729004f, - 0.810547f, 0.867188f, 0.962891f, 0.963867f, 0.964844f, 0.964844f, 0.964355f, 0.964355f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000200f, 0.000215f, 0.000229f, 0.000319f, - 0.000330f, 0.000411f, 0.000491f, 0.000527f, 0.000547f, 0.000560f, 0.000634f, 0.000648f, - 0.000716f, 0.000778f, 0.000855f, 0.000998f, 0.001182f, 0.001111f, 0.001274f, 0.001625f, - 0.001584f, 0.001559f, 0.001864f, 0.002037f, 0.002296f, 0.002438f, 0.002600f, 0.002993f, - 0.003290f, 0.003801f, 0.004467f, 0.005085f, 0.005508f, 0.006519f, 0.007645f, 0.008743f, - 0.010757f, 0.012558f, 0.014946f, 0.018661f, 0.023422f, 0.029556f, 0.038574f, 0.050964f, - 0.069702f, 0.097351f, 0.140015f, 0.205566f, 0.301025f, 0.424561f, 0.559082f, 0.683594f, - 0.781250f, 0.852051f, 0.958496f, 0.960449f, 0.960938f, 0.960938f, 0.960938f, 0.960449f, - 0.000000f, 0.000000f, 0.000122f, 0.000122f, 0.000122f, 0.000194f, 0.000214f, 0.000251f, - 0.000302f, 0.000365f, 0.000370f, 0.000429f, 0.000495f, 0.000521f, 0.000504f, 0.000547f, - 0.000632f, 0.000656f, 0.000695f, 0.000795f, 0.000922f, 0.001074f, 0.001125f, 0.001192f, - 0.001166f, 0.001303f, 0.001555f, 0.001575f, 0.001763f, 0.001970f, 0.002232f, 0.002560f, - 0.002657f, 0.003082f, 0.003559f, 0.003799f, 0.004620f, 0.005241f, 0.006081f, 0.007103f, - 0.008385f, 0.009796f, 0.012192f, 0.014702f, 0.018234f, 0.022934f, 0.029556f, 0.039307f, - 0.053009f, 0.073547f, 0.106628f, 0.157715f, 0.237793f, 0.351318f, 0.490479f, 0.629883f, - 0.746094f, 0.832031f, 0.954590f, 0.956055f, 0.956055f, 0.957031f, 0.956543f, 0.956055f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000146f, 0.000191f, 0.000200f, - 0.000255f, 0.000232f, 0.000252f, 0.000359f, 0.000291f, 0.000342f, 0.000406f, 0.000498f, - 0.000520f, 0.000533f, 0.000632f, 0.000605f, 0.000689f, 0.000768f, 0.000908f, 0.001013f, - 0.001087f, 0.001030f, 0.001211f, 0.001318f, 0.001497f, 0.001609f, 0.001753f, 0.001957f, - 0.002234f, 0.002352f, 0.002663f, 0.003040f, 0.003635f, 0.004082f, 0.004723f, 0.005516f, - 0.006367f, 0.007675f, 0.009224f, 0.011360f, 0.013695f, 0.017868f, 0.022598f, 0.029724f, - 0.040222f, 0.055542f, 0.080078f, 0.119202f, 0.182617f, 0.281738f, 0.417725f, 0.568848f, - 0.705566f, 0.807129f, 0.948730f, 0.951172f, 0.951172f, 0.951172f, 0.951660f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, - 0.000203f, 0.000186f, 0.000184f, 0.000321f, 0.000231f, 0.000337f, 0.000359f, 0.000430f, - 0.000455f, 0.000531f, 0.000502f, 0.000517f, 0.000728f, 0.000643f, 0.000673f, 0.000816f, - 0.000930f, 0.000991f, 0.001028f, 0.001161f, 0.001284f, 0.001369f, 0.001474f, 0.001719f, - 0.001781f, 0.001883f, 0.002258f, 0.002518f, 0.002831f, 0.003201f, 0.003744f, 0.004349f, - 0.005127f, 0.006130f, 0.007210f, 0.008423f, 0.010696f, 0.013405f, 0.017136f, 0.022522f, - 0.030029f, 0.041321f, 0.059631f, 0.089050f, 0.138062f, 0.218994f, 0.343750f, 0.500488f, - 0.657227f, 0.780762f, 0.943848f, 0.945312f, 0.945312f, 0.945801f, 0.945801f, 0.946289f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, - 0.000118f, 0.000137f, 0.000139f, 0.000241f, 0.000202f, 0.000304f, 0.000313f, 0.000332f, - 0.000357f, 0.000420f, 0.000435f, 0.000463f, 0.000645f, 0.000544f, 0.000700f, 0.000717f, - 0.000669f, 0.000834f, 0.000865f, 0.000916f, 0.001109f, 0.001193f, 0.001246f, 0.001300f, - 0.001488f, 0.001538f, 0.001806f, 0.001929f, 0.002001f, 0.002462f, 0.002666f, 0.003260f, - 0.003904f, 0.004364f, 0.005325f, 0.006306f, 0.008041f, 0.009720f, 0.012718f, 0.016525f, - 0.022217f, 0.030579f, 0.043854f, 0.065247f, 0.101929f, 0.166016f, 0.273193f, 0.428223f, - 0.600586f, 0.748047f, 0.936523f, 0.938477f, 0.938965f, 0.939453f, 0.938965f, 0.938965f, - 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, - 0.000114f, 0.000102f, 0.000090f, 0.000096f, 0.000131f, 0.000245f, 0.000276f, 0.000257f, - 0.000307f, 0.000316f, 0.000322f, 0.000373f, 0.000411f, 0.000440f, 0.000433f, 0.000650f, - 0.000578f, 0.000704f, 0.000746f, 0.000723f, 0.000819f, 0.000756f, 0.000758f, 0.000878f, - 0.001009f, 0.001270f, 0.001399f, 0.001530f, 0.001798f, 0.001803f, 0.002151f, 0.002317f, - 0.002728f, 0.003222f, 0.003782f, 0.004612f, 0.005951f, 0.006985f, 0.009308f, 0.011955f, - 0.016052f, 0.022324f, 0.031525f, 0.047272f, 0.073853f, 0.122192f, 0.209717f, 0.352783f, - 0.537109f, 0.709473f, 0.928223f, 0.930664f, 0.931152f, 0.930664f, 0.931641f, 0.931152f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000120f, 0.000119f, - 0.000119f, 0.000111f, 0.000100f, 0.000139f, 0.000082f, 0.000154f, 0.000121f, 0.000216f, - 0.000147f, 0.000271f, 0.000288f, 0.000298f, 0.000386f, 0.000463f, 0.000370f, 0.000485f, - 0.000555f, 0.000530f, 0.000578f, 0.000574f, 0.000612f, 0.000712f, 0.000776f, 0.000716f, - 0.000931f, 0.000831f, 0.000967f, 0.001154f, 0.001176f, 0.001284f, 0.001497f, 0.001884f, - 0.002270f, 0.002415f, 0.002947f, 0.003412f, 0.004032f, 0.005066f, 0.006485f, 0.008400f, - 0.011215f, 0.015404f, 0.022079f, 0.033264f, 0.052124f, 0.087646f, 0.155029f, 0.279297f, - 0.465820f, 0.664062f, 0.918945f, 0.921387f, 0.921875f, 0.922363f, 0.922363f, 0.921875f, - 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000119f, 0.000119f, - 0.000118f, 0.000118f, 0.000110f, 0.000100f, 0.000091f, 0.000082f, 0.000075f, 0.000095f, - 0.000166f, 0.000113f, 0.000163f, 0.000248f, 0.000258f, 0.000277f, 0.000336f, 0.000301f, - 0.000445f, 0.000495f, 0.000473f, 0.000505f, 0.000494f, 0.000470f, 0.000584f, 0.000752f, - 0.000821f, 0.000814f, 0.000845f, 0.000807f, 0.000932f, 0.000996f, 0.001380f, 0.001481f, - 0.001507f, 0.001757f, 0.002146f, 0.002443f, 0.002869f, 0.003546f, 0.004559f, 0.005878f, - 0.007561f, 0.010475f, 0.015320f, 0.022675f, 0.036133f, 0.060883f, 0.110352f, 0.211670f, - 0.389160f, 0.610352f, 0.908691f, 0.909180f, 0.910645f, 0.912109f, 0.909668f, 0.910156f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, - 0.000117f, 0.000117f, 0.000116f, 0.000110f, 0.000100f, 0.000099f, 0.000083f, 0.000077f, - 0.000071f, 0.000081f, 0.000087f, 0.000166f, 0.000177f, 0.000233f, 0.000238f, 0.000273f, - 0.000325f, 0.000357f, 0.000292f, 0.000406f, 0.000418f, 0.000440f, 0.000428f, 0.000568f, - 0.000459f, 0.000628f, 0.000678f, 0.000688f, 0.000647f, 0.000830f, 0.000925f, 0.001111f, - 0.001011f, 0.001420f, 0.001504f, 0.001771f, 0.001997f, 0.002495f, 0.003147f, 0.003944f, - 0.005077f, 0.006958f, 0.010040f, 0.015053f, 0.023727f, 0.040680f, 0.075989f, 0.153076f, - 0.312012f, 0.547363f, 0.894531f, 0.897461f, 0.897949f, 0.897949f, 0.897949f, 0.898438f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000118f, 0.000117f, 0.000116f, 0.000116f, - 0.000115f, 0.000115f, 0.000114f, 0.000114f, 0.000111f, 0.000101f, 0.000093f, 0.000086f, - 0.000079f, 0.000095f, 0.000095f, 0.000090f, 0.000117f, 0.000109f, 0.000158f, 0.000199f, - 0.000207f, 0.000223f, 0.000286f, 0.000288f, 0.000267f, 0.000347f, 0.000368f, 0.000450f, - 0.000377f, 0.000460f, 0.000504f, 0.000498f, 0.000494f, 0.000616f, 0.000632f, 0.000699f, - 0.000755f, 0.000938f, 0.000978f, 0.001222f, 0.001355f, 0.001673f, 0.002016f, 0.002539f, - 0.003258f, 0.004410f, 0.006332f, 0.009285f, 0.014847f, 0.025864f, 0.049042f, 0.104736f, - 0.236572f, 0.477295f, 0.879395f, 0.881348f, 0.882324f, 0.881836f, 0.882324f, 0.882324f, - 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000114f, 0.000113f, - 0.000112f, 0.000112f, 0.000111f, 0.000111f, 0.000110f, 0.000110f, 0.000103f, 0.000095f, - 0.000088f, 0.000081f, 0.000076f, 0.000070f, 0.000065f, 0.000100f, 0.000104f, 0.000099f, - 0.000120f, 0.000145f, 0.000190f, 0.000204f, 0.000213f, 0.000230f, 0.000241f, 0.000279f, - 0.000325f, 0.000322f, 0.000328f, 0.000381f, 0.000351f, 0.000466f, 0.000452f, 0.000516f, - 0.000591f, 0.000622f, 0.000733f, 0.000882f, 0.000895f, 0.001092f, 0.001456f, 0.001765f, - 0.002069f, 0.002821f, 0.003851f, 0.005558f, 0.008865f, 0.015579f, 0.029999f, 0.066895f, - 0.167480f, 0.400391f, 0.860352f, 0.862793f, 0.863281f, 0.864258f, 0.863281f, 0.863770f, - 0.000119f, 0.000114f, 0.000113f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000109f, - 0.000108f, 0.000107f, 0.000107f, 0.000107f, 0.000106f, 0.000105f, 0.000106f, 0.000105f, - 0.000098f, 0.000090f, 0.000084f, 0.000078f, 0.000073f, 0.000068f, 0.000063f, 0.000063f, - 0.000066f, 0.000053f, 0.000080f, 0.000107f, 0.000126f, 0.000150f, 0.000188f, 0.000187f, - 0.000206f, 0.000205f, 0.000235f, 0.000242f, 0.000277f, 0.000340f, 0.000323f, 0.000308f, - 0.000417f, 0.000411f, 0.000445f, 0.000536f, 0.000622f, 0.000673f, 0.000887f, 0.000985f, - 0.001289f, 0.001623f, 0.002337f, 0.003241f, 0.004929f, 0.008560f, 0.016739f, 0.039307f, - 0.109619f, 0.317383f, 0.837402f, 0.840332f, 0.841309f, 0.840820f, 0.840820f, 0.841309f, - 0.000000f, 0.000106f, 0.000099f, 0.000104f, 0.000102f, 0.000101f, 0.000100f, 0.000101f, - 0.000101f, 0.000100f, 0.000099f, 0.000100f, 0.000099f, 0.000099f, 0.000099f, 0.000098f, - 0.000098f, 0.000098f, 0.000093f, 0.000086f, 0.000080f, 0.000075f, 0.000070f, 0.000065f, - 0.000061f, 0.000057f, 0.000059f, 0.000054f, 0.000061f, 0.000080f, 0.000087f, 0.000101f, - 0.000136f, 0.000147f, 0.000163f, 0.000171f, 0.000179f, 0.000205f, 0.000223f, 0.000237f, - 0.000281f, 0.000272f, 0.000299f, 0.000364f, 0.000373f, 0.000448f, 0.000507f, 0.000643f, - 0.000801f, 0.001000f, 0.001276f, 0.001765f, 0.002712f, 0.004585f, 0.008492f, 0.020462f, - 0.063721f, 0.233643f, 0.811035f, 0.813477f, 0.814453f, 0.813965f, 0.813965f, 0.814453f, - 0.000000f, 0.000057f, 0.000085f, 0.000085f, 0.000083f, 0.000085f, 0.000087f, 0.000086f, - 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f, 0.000086f, 0.000087f, 0.000087f, - 0.000088f, 0.000086f, 0.000088f, 0.000087f, 0.000087f, 0.000081f, 0.000076f, 0.000071f, - 0.000067f, 0.000063f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000046f, 0.000042f, - 0.000051f, 0.000063f, 0.000081f, 0.000101f, 0.000122f, 0.000137f, 0.000147f, 0.000143f, - 0.000157f, 0.000183f, 0.000205f, 0.000188f, 0.000196f, 0.000249f, 0.000310f, 0.000329f, - 0.000413f, 0.000534f, 0.000679f, 0.000944f, 0.001365f, 0.002199f, 0.004150f, 0.009369f, - 0.031677f, 0.153564f, 0.779297f, 0.781250f, 0.782227f, 0.782715f, 0.781738f, 0.781250f, - 0.000000f, 0.000000f, 0.000000f, 0.000009f, 0.000030f, 0.000048f, 0.000051f, 0.000054f, - 0.000055f, 0.000059f, 0.000060f, 0.000065f, 0.000065f, 0.000066f, 0.000068f, 0.000068f, - 0.000070f, 0.000070f, 0.000071f, 0.000071f, 0.000072f, 0.000073f, 0.000073f, 0.000073f, - 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000055f, 0.000051f, 0.000048f, 0.000045f, - 0.000042f, 0.000039f, 0.000044f, 0.000036f, 0.000046f, 0.000056f, 0.000067f, 0.000085f, - 0.000099f, 0.000108f, 0.000107f, 0.000113f, 0.000139f, 0.000144f, 0.000165f, 0.000169f, - 0.000196f, 0.000266f, 0.000311f, 0.000426f, 0.000598f, 0.000948f, 0.001744f, 0.003975f, - 0.012856f, 0.084351f, 0.739746f, 0.743164f, 0.743652f, 0.743652f, 0.743652f, 0.743164f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000012f, 0.000012f, 0.000020f, 0.000028f, 0.000030f, 0.000033f, 0.000034f, - 0.000041f, 0.000041f, 0.000045f, 0.000047f, 0.000048f, 0.000049f, 0.000051f, 0.000052f, - 0.000054f, 0.000054f, 0.000056f, 0.000057f, 0.000056f, 0.000052f, 0.000049f, 0.000046f, - 0.000043f, 0.000041f, 0.000038f, 0.000035f, 0.000033f, 0.000031f, 0.000029f, 0.000029f, - 0.000036f, 0.000055f, 0.000048f, 0.000067f, 0.000067f, 0.000073f, 0.000075f, 0.000097f, - 0.000085f, 0.000111f, 0.000137f, 0.000191f, 0.000233f, 0.000371f, 0.000609f, 0.001319f, - 0.004341f, 0.033844f, 0.696289f, 0.698730f, 0.699219f, 0.698242f, 0.698730f, 0.698730f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000003f, 0.000007f, 0.000009f, 0.000012f, 0.000015f, 0.000020f, - 0.000022f, 0.000023f, 0.000026f, 0.000029f, 0.000030f, 0.000032f, 0.000033f, 0.000035f, - 0.000037f, 0.000037f, 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000026f, - 0.000024f, 0.000022f, 0.000021f, 0.000019f, 0.000024f, 0.000024f, 0.000029f, 0.000037f, - 0.000043f, 0.000046f, 0.000059f, 0.000058f, 0.000075f, 0.000095f, 0.000160f, 0.000306f, - 0.001006f, 0.008865f, 0.643066f, 0.647461f, 0.647949f, 0.647461f, 0.647949f, 0.648438f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000003f, 0.000005f, 0.000007f, 0.000010f, 0.000012f, 0.000013f, 0.000015f, 0.000017f, - 0.000019f, 0.000020f, 0.000018f, 0.000017f, 0.000015f, 0.000014f, 0.000013f, 0.000012f, - 0.000010f, 0.000012f, 0.000014f, 0.000018f, 0.000018f, 0.000025f, 0.000028f, 0.000045f, - 0.000110f, 0.001030f, 0.586914f, 0.589844f, 0.590820f, 0.591309f, 0.591309f, 0.590820f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000002f, 0.000004f, 0.000005f, 0.000004f, 0.000004f, 0.000003f, 0.000003f, - 0.000004f, 0.000009f, 0.527344f, 0.529785f, 0.529785f, 0.530273f, 0.530762f, 0.530762f, - }, - { - 0.135132f, 0.377441f, 0.544434f, 0.653320f, 0.724609f, 0.773926f, 0.811035f, 0.838867f, - 0.860840f, 0.876465f, 0.891113f, 0.902832f, 0.912109f, 0.920898f, 0.928223f, 0.934082f, - 0.938965f, 0.943848f, 0.948242f, 0.952637f, 0.955566f, 0.958984f, 0.961914f, 0.964844f, - 0.966797f, 0.969238f, 0.971191f, 0.973145f, 0.975098f, 0.976562f, 0.978027f, 0.979492f, - 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.985840f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.989746f, 0.990234f, 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994141f, - 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, 0.998047f, 0.998535f, - 0.999023f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, - 0.044891f, 0.163330f, 0.306885f, 0.444336f, 0.559570f, 0.645020f, 0.710938f, 0.760742f, - 0.797852f, 0.827148f, 0.850098f, 0.868652f, 0.883789f, 0.895996f, 0.907227f, 0.916016f, - 0.923340f, 0.930176f, 0.936523f, 0.941406f, 0.946777f, 0.950684f, 0.954102f, 0.957031f, - 0.960938f, 0.963379f, 0.965820f, 0.968262f, 0.970703f, 0.972168f, 0.974609f, 0.976562f, - 0.977539f, 0.979492f, 0.980469f, 0.981934f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, - 0.987793f, 0.988770f, 0.988770f, 0.990234f, 0.991211f, 0.991699f, 0.992676f, 0.993164f, - 0.993164f, 0.994141f, 0.995605f, 0.995605f, 0.996094f, 0.996582f, 0.997070f, 0.997559f, - 0.998047f, 0.998535f, 0.999512f, 0.999512f, 0.999512f, 0.999023f, 0.999023f, 0.999023f, - 0.020325f, 0.077820f, 0.158936f, 0.260498f, 0.372314f, 0.479736f, 0.572754f, 0.648438f, - 0.707520f, 0.754883f, 0.791016f, 0.820312f, 0.843750f, 0.862793f, 0.878906f, 0.891602f, - 0.903320f, 0.912598f, 0.920898f, 0.928223f, 0.933594f, 0.939941f, 0.944824f, 0.949219f, - 0.952637f, 0.956543f, 0.959961f, 0.962402f, 0.965332f, 0.967773f, 0.970215f, 0.971680f, - 0.974121f, 0.976074f, 0.977539f, 0.979004f, 0.980957f, 0.981445f, 0.983398f, 0.984375f, - 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991211f, 0.992188f, - 0.992676f, 0.993164f, 0.994141f, 0.994629f, 0.995605f, 0.996094f, 0.996582f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, - 0.012032f, 0.042908f, 0.088196f, 0.149292f, 0.228027f, 0.319824f, 0.415527f, 0.506348f, - 0.586914f, 0.653809f, 0.709473f, 0.752441f, 0.787598f, 0.817383f, 0.840820f, 0.860352f, - 0.876465f, 0.889648f, 0.900879f, 0.910156f, 0.918945f, 0.926270f, 0.933105f, 0.938965f, - 0.944336f, 0.948730f, 0.952637f, 0.956055f, 0.958984f, 0.962402f, 0.965332f, 0.967773f, - 0.970215f, 0.972656f, 0.974609f, 0.976562f, 0.978027f, 0.979492f, 0.980957f, 0.982422f, - 0.983887f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, - 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.994629f, 0.995117f, 0.996094f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, - 0.007637f, 0.026825f, 0.053436f, 0.090759f, 0.140137f, 0.203125f, 0.279053f, 0.363281f, - 0.449463f, 0.529785f, 0.601562f, 0.663574f, 0.713379f, 0.756348f, 0.789551f, 0.816895f, - 0.840332f, 0.858887f, 0.875488f, 0.887695f, 0.900391f, 0.909668f, 0.918945f, 0.926270f, - 0.932617f, 0.938477f, 0.943848f, 0.948242f, 0.952148f, 0.955566f, 0.959473f, 0.962402f, - 0.965332f, 0.967773f, 0.970215f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979492f, - 0.980957f, 0.981934f, 0.984375f, 0.985352f, 0.985840f, 0.987793f, 0.988281f, 0.989258f, - 0.990723f, 0.991211f, 0.991699f, 0.992676f, 0.993652f, 0.994141f, 0.994629f, 0.995605f, - 0.996094f, 0.997070f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, - 0.004784f, 0.018082f, 0.035400f, 0.058868f, 0.089783f, 0.130981f, 0.183716f, 0.248047f, - 0.321289f, 0.400391f, 0.478760f, 0.552734f, 0.617188f, 0.673828f, 0.720703f, 0.759766f, - 0.792480f, 0.818359f, 0.840820f, 0.859863f, 0.875000f, 0.888184f, 0.899902f, 0.910645f, - 0.918945f, 0.926270f, 0.931641f, 0.938965f, 0.943848f, 0.948242f, 0.952148f, 0.957031f, - 0.959473f, 0.962891f, 0.965332f, 0.968262f, 0.970215f, 0.972656f, 0.975098f, 0.977051f, - 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.985352f, 0.986328f, 0.987305f, - 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, 0.993164f, 0.994141f, 0.994629f, - 0.995605f, 0.996094f, 0.998047f, 0.998535f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.004044f, 0.012550f, 0.024628f, 0.040466f, 0.060760f, 0.087708f, 0.122742f, 0.167236f, - 0.222534f, 0.287109f, 0.358643f, 0.432617f, 0.506348f, 0.573242f, 0.632812f, 0.685059f, - 0.728516f, 0.766602f, 0.797363f, 0.822266f, 0.843750f, 0.861328f, 0.877441f, 0.890625f, - 0.901367f, 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.940430f, 0.944824f, 0.948730f, - 0.953125f, 0.957520f, 0.960449f, 0.963867f, 0.966309f, 0.969238f, 0.970703f, 0.973633f, - 0.976074f, 0.977539f, 0.979004f, 0.980469f, 0.982422f, 0.983398f, 0.984863f, 0.986816f, - 0.986816f, 0.988281f, 0.989746f, 0.990723f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995117f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, 0.998047f, - 0.002975f, 0.009315f, 0.017868f, 0.029129f, 0.043243f, 0.062012f, 0.084961f, 0.115540f, - 0.154419f, 0.201660f, 0.257812f, 0.322754f, 0.391846f, 0.463135f, 0.530762f, 0.594727f, - 0.650391f, 0.698730f, 0.739258f, 0.773926f, 0.803711f, 0.826660f, 0.847656f, 0.865723f, - 0.879883f, 0.892090f, 0.903809f, 0.913086f, 0.921387f, 0.928223f, 0.935059f, 0.940918f, - 0.945801f, 0.950684f, 0.954102f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970215f, - 0.972168f, 0.974609f, 0.976074f, 0.978027f, 0.979980f, 0.981934f, 0.983398f, 0.984375f, - 0.985352f, 0.987305f, 0.988281f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, - 0.993652f, 0.994629f, 0.997559f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f, - 0.002329f, 0.007256f, 0.013611f, 0.021790f, 0.032043f, 0.044617f, 0.061554f, 0.082336f, - 0.108765f, 0.142578f, 0.184448f, 0.234375f, 0.292725f, 0.357422f, 0.424805f, 0.493164f, - 0.556641f, 0.615723f, 0.666504f, 0.711914f, 0.750977f, 0.782715f, 0.809570f, 0.832520f, - 0.853516f, 0.868652f, 0.882812f, 0.895508f, 0.905762f, 0.916016f, 0.923340f, 0.931152f, - 0.936523f, 0.942383f, 0.947266f, 0.951172f, 0.956055f, 0.958984f, 0.962402f, 0.965820f, - 0.968750f, 0.971191f, 0.973633f, 0.975586f, 0.977539f, 0.979980f, 0.980957f, 0.982422f, - 0.983887f, 0.985352f, 0.985840f, 0.988281f, 0.989746f, 0.990234f, 0.991211f, 0.991699f, - 0.993164f, 0.993652f, 0.997070f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, - 0.001871f, 0.006084f, 0.010963f, 0.016953f, 0.024277f, 0.033722f, 0.046234f, 0.060669f, - 0.079224f, 0.103638f, 0.132812f, 0.169678f, 0.214478f, 0.267090f, 0.326172f, 0.390137f, - 0.456543f, 0.519531f, 0.581543f, 0.636230f, 0.685547f, 0.726562f, 0.762207f, 0.792969f, - 0.818359f, 0.839844f, 0.858398f, 0.874023f, 0.887695f, 0.898926f, 0.909668f, 0.918945f, - 0.926270f, 0.933105f, 0.938965f, 0.944336f, 0.949219f, 0.953613f, 0.958008f, 0.961426f, - 0.964844f, 0.967773f, 0.969727f, 0.972168f, 0.974609f, 0.976074f, 0.979004f, 0.979980f, - 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.989746f, 0.990723f, - 0.991211f, 0.992676f, 0.996582f, 0.997070f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, - 0.001322f, 0.004795f, 0.008530f, 0.013504f, 0.018921f, 0.026154f, 0.035065f, 0.045807f, - 0.059662f, 0.076416f, 0.098267f, 0.124512f, 0.157715f, 0.197388f, 0.244873f, 0.299805f, - 0.359619f, 0.423096f, 0.487549f, 0.549316f, 0.605957f, 0.657715f, 0.703125f, 0.741211f, - 0.774902f, 0.802734f, 0.827148f, 0.847656f, 0.865234f, 0.879883f, 0.893066f, 0.903320f, - 0.913086f, 0.920898f, 0.929199f, 0.935547f, 0.941406f, 0.947266f, 0.951172f, 0.956055f, - 0.959473f, 0.962891f, 0.965332f, 0.969238f, 0.971191f, 0.974121f, 0.976562f, 0.977539f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986328f, 0.988281f, 0.988281f, 0.989746f, - 0.990723f, 0.991699f, 0.996582f, 0.996582f, 0.997070f, 0.997070f, 0.997070f, 0.996582f, - 0.001077f, 0.003971f, 0.006985f, 0.010750f, 0.015579f, 0.020920f, 0.027420f, 0.035522f, - 0.045776f, 0.058228f, 0.074097f, 0.093140f, 0.117310f, 0.146851f, 0.182495f, 0.225952f, - 0.276611f, 0.332764f, 0.394287f, 0.456543f, 0.518555f, 0.577637f, 0.630371f, 0.679199f, - 0.720703f, 0.756836f, 0.787598f, 0.813477f, 0.836426f, 0.855469f, 0.872070f, 0.885742f, - 0.897949f, 0.908203f, 0.917480f, 0.925293f, 0.933105f, 0.939453f, 0.944336f, 0.949219f, - 0.954590f, 0.957520f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.974121f, 0.975586f, - 0.978027f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, 0.988770f, - 0.989746f, 0.991211f, 0.996094f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, - 0.000954f, 0.003330f, 0.005733f, 0.008904f, 0.012505f, 0.016617f, 0.022446f, 0.028351f, - 0.036041f, 0.045807f, 0.056854f, 0.071350f, 0.088867f, 0.110596f, 0.137451f, 0.170654f, - 0.209717f, 0.256592f, 0.309326f, 0.366943f, 0.427979f, 0.489502f, 0.549316f, 0.604980f, - 0.655762f, 0.700195f, 0.738770f, 0.772461f, 0.801270f, 0.825195f, 0.845703f, 0.864258f, - 0.879395f, 0.893066f, 0.903809f, 0.914062f, 0.922363f, 0.929688f, 0.936523f, 0.942871f, - 0.947266f, 0.952148f, 0.956055f, 0.960449f, 0.963867f, 0.966797f, 0.969727f, 0.972656f, - 0.975586f, 0.976562f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, - 0.988770f, 0.989746f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, - 0.000949f, 0.002804f, 0.004730f, 0.007236f, 0.010384f, 0.014160f, 0.018478f, 0.023102f, - 0.028992f, 0.036346f, 0.044647f, 0.055542f, 0.068481f, 0.085144f, 0.105286f, 0.130005f, - 0.159668f, 0.195557f, 0.238647f, 0.287842f, 0.343018f, 0.402588f, 0.463135f, 0.522949f, - 0.580566f, 0.632812f, 0.680664f, 0.721680f, 0.757812f, 0.788574f, 0.814453f, 0.836914f, - 0.856934f, 0.872070f, 0.887207f, 0.899414f, 0.909668f, 0.918945f, 0.926758f, 0.933594f, - 0.940430f, 0.946289f, 0.950684f, 0.954590f, 0.959473f, 0.963379f, 0.966797f, 0.969238f, - 0.972168f, 0.975098f, 0.977051f, 0.979492f, 0.980957f, 0.982910f, 0.984375f, 0.986328f, - 0.987793f, 0.988770f, 0.995117f, 0.996094f, 0.995605f, 0.996094f, 0.996094f, 0.995605f, - 0.000828f, 0.002361f, 0.004116f, 0.006119f, 0.008797f, 0.011391f, 0.014854f, 0.018890f, - 0.023666f, 0.029083f, 0.036011f, 0.044434f, 0.053986f, 0.066589f, 0.081543f, 0.100159f, - 0.122314f, 0.149536f, 0.183350f, 0.222900f, 0.269043f, 0.321533f, 0.378418f, 0.438477f, - 0.499023f, 0.556641f, 0.611328f, 0.661133f, 0.703613f, 0.742188f, 0.775391f, 0.804199f, - 0.828613f, 0.849121f, 0.866211f, 0.881348f, 0.894043f, 0.905762f, 0.916016f, 0.924316f, - 0.931641f, 0.938477f, 0.944336f, 0.949707f, 0.954590f, 0.958496f, 0.962402f, 0.966309f, - 0.969238f, 0.972168f, 0.974121f, 0.977051f, 0.979004f, 0.980957f, 0.982910f, 0.984863f, - 0.985840f, 0.987793f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.000606f, 0.001948f, 0.003483f, 0.005394f, 0.007290f, 0.009735f, 0.012352f, 0.015747f, - 0.019485f, 0.023788f, 0.029358f, 0.035706f, 0.043732f, 0.053162f, 0.064331f, 0.077942f, - 0.094971f, 0.116089f, 0.140991f, 0.172485f, 0.209473f, 0.252686f, 0.302002f, 0.356934f, - 0.415283f, 0.475830f, 0.534180f, 0.589844f, 0.641602f, 0.687500f, 0.728516f, 0.763184f, - 0.792969f, 0.819336f, 0.841309f, 0.860840f, 0.876953f, 0.890625f, 0.902344f, 0.913086f, - 0.921875f, 0.930176f, 0.937012f, 0.943359f, 0.948242f, 0.954102f, 0.958008f, 0.961914f, - 0.965820f, 0.969238f, 0.971680f, 0.974609f, 0.977051f, 0.979004f, 0.981445f, 0.983398f, - 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.000672f, 0.001569f, 0.002895f, 0.004528f, 0.006180f, 0.008324f, 0.010864f, 0.013161f, - 0.016357f, 0.020096f, 0.024216f, 0.029327f, 0.035583f, 0.042664f, 0.051453f, 0.062073f, - 0.075012f, 0.091125f, 0.110291f, 0.134155f, 0.162476f, 0.197266f, 0.238037f, 0.285156f, - 0.337646f, 0.395020f, 0.454590f, 0.513672f, 0.570312f, 0.624023f, 0.672363f, 0.714844f, - 0.750977f, 0.783691f, 0.811035f, 0.834473f, 0.854004f, 0.872070f, 0.886230f, 0.899414f, - 0.911133f, 0.918945f, 0.928223f, 0.936035f, 0.942871f, 0.948242f, 0.953613f, 0.957031f, - 0.961426f, 0.965820f, 0.968750f, 0.972168f, 0.974121f, 0.976562f, 0.979492f, 0.981445f, - 0.983398f, 0.985352f, 0.994141f, 0.994629f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.000413f, 0.001430f, 0.002577f, 0.004269f, 0.005703f, 0.007137f, 0.008888f, 0.011124f, - 0.013885f, 0.016891f, 0.020355f, 0.024384f, 0.029221f, 0.035217f, 0.041748f, 0.049988f, - 0.060059f, 0.072083f, 0.086914f, 0.105286f, 0.126953f, 0.154175f, 0.186523f, 0.224731f, - 0.269287f, 0.320557f, 0.375732f, 0.434570f, 0.493896f, 0.552246f, 0.606934f, 0.655762f, - 0.701660f, 0.740723f, 0.774902f, 0.803711f, 0.827637f, 0.848633f, 0.867188f, 0.882812f, - 0.895996f, 0.908203f, 0.917969f, 0.926758f, 0.934570f, 0.941895f, 0.947266f, 0.952637f, - 0.957520f, 0.960938f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.977051f, 0.979980f, - 0.981934f, 0.983887f, 0.993652f, 0.994629f, 0.994141f, 0.994141f, 0.994141f, 0.994141f, - 0.000240f, 0.001406f, 0.002373f, 0.003283f, 0.004620f, 0.006264f, 0.007744f, 0.009552f, - 0.011711f, 0.014069f, 0.017273f, 0.020584f, 0.024429f, 0.028946f, 0.034393f, 0.041046f, - 0.048798f, 0.058289f, 0.070312f, 0.083618f, 0.100403f, 0.121338f, 0.146118f, 0.177002f, - 0.213257f, 0.255371f, 0.304443f, 0.358887f, 0.416504f, 0.476562f, 0.534668f, 0.590332f, - 0.642090f, 0.688965f, 0.729492f, 0.766113f, 0.796387f, 0.822754f, 0.844727f, 0.862305f, - 0.880371f, 0.894043f, 0.905762f, 0.916992f, 0.926270f, 0.934082f, 0.940918f, 0.946777f, - 0.953125f, 0.956543f, 0.961426f, 0.964844f, 0.969238f, 0.972656f, 0.974609f, 0.977539f, - 0.979980f, 0.982422f, 0.992676f, 0.994141f, 0.993652f, 0.993652f, 0.993652f, 0.993652f, - 0.000242f, 0.001257f, 0.001991f, 0.003138f, 0.004299f, 0.005302f, 0.006584f, 0.008308f, - 0.010048f, 0.012283f, 0.014526f, 0.017578f, 0.020340f, 0.023972f, 0.028671f, 0.033661f, - 0.040161f, 0.047821f, 0.056213f, 0.067261f, 0.080444f, 0.096191f, 0.115784f, 0.139771f, - 0.168457f, 0.203125f, 0.243286f, 0.290527f, 0.343506f, 0.400879f, 0.459473f, 0.519043f, - 0.576172f, 0.629395f, 0.678223f, 0.721191f, 0.757324f, 0.789062f, 0.816895f, 0.839844f, - 0.859863f, 0.877930f, 0.892578f, 0.904297f, 0.915527f, 0.925293f, 0.933105f, 0.940430f, - 0.946777f, 0.952148f, 0.957031f, 0.961914f, 0.965820f, 0.969238f, 0.973145f, 0.975586f, - 0.978516f, 0.980469f, 0.992188f, 0.993652f, 0.993164f, 0.993164f, 0.993652f, 0.993164f, - 0.000434f, 0.001172f, 0.001865f, 0.002825f, 0.003633f, 0.004757f, 0.005722f, 0.007175f, - 0.009010f, 0.010651f, 0.012520f, 0.014412f, 0.017532f, 0.020599f, 0.024139f, 0.028488f, - 0.033356f, 0.039001f, 0.046295f, 0.054749f, 0.064758f, 0.077209f, 0.092834f, 0.111084f, - 0.134033f, 0.160767f, 0.193604f, 0.233032f, 0.278320f, 0.329590f, 0.386230f, 0.445068f, - 0.504395f, 0.563477f, 0.617188f, 0.666504f, 0.711426f, 0.750000f, 0.783691f, 0.812500f, - 0.836426f, 0.857422f, 0.875488f, 0.891113f, 0.903809f, 0.915039f, 0.924805f, 0.933105f, - 0.940430f, 0.947266f, 0.953125f, 0.958496f, 0.962402f, 0.966309f, 0.969727f, 0.973145f, - 0.976562f, 0.978516f, 0.991699f, 0.992188f, 0.992676f, 0.993164f, 0.993164f, 0.992676f, - 0.000358f, 0.000835f, 0.001738f, 0.002270f, 0.002996f, 0.004078f, 0.005157f, 0.006416f, - 0.007904f, 0.009331f, 0.010826f, 0.012245f, 0.014938f, 0.017303f, 0.020233f, 0.023926f, - 0.027954f, 0.032715f, 0.038147f, 0.045166f, 0.053070f, 0.062561f, 0.074768f, 0.089661f, - 0.106689f, 0.128052f, 0.154175f, 0.185547f, 0.223022f, 0.266846f, 0.317383f, 0.373047f, - 0.431152f, 0.491943f, 0.550293f, 0.606445f, 0.658203f, 0.704102f, 0.744141f, 0.779297f, - 0.809082f, 0.833984f, 0.855957f, 0.875000f, 0.889648f, 0.903320f, 0.915039f, 0.924805f, - 0.933594f, 0.940918f, 0.947754f, 0.954102f, 0.958984f, 0.962402f, 0.966797f, 0.970703f, - 0.974121f, 0.977539f, 0.990723f, 0.992188f, 0.992676f, 0.992676f, 0.992188f, 0.992676f, - 0.000428f, 0.000789f, 0.001460f, 0.002172f, 0.002695f, 0.003561f, 0.004608f, 0.005848f, - 0.006886f, 0.007736f, 0.009560f, 0.011078f, 0.012817f, 0.015015f, 0.017563f, 0.020157f, - 0.023666f, 0.027145f, 0.031891f, 0.037384f, 0.044189f, 0.051788f, 0.061188f, 0.072327f, - 0.085999f, 0.102966f, 0.123413f, 0.148071f, 0.178101f, 0.214478f, 0.256836f, 0.306396f, - 0.360840f, 0.419678f, 0.479736f, 0.540527f, 0.597656f, 0.649902f, 0.697754f, 0.738770f, - 0.775391f, 0.805664f, 0.831543f, 0.854004f, 0.873535f, 0.889160f, 0.902832f, 0.915039f, - 0.925293f, 0.934082f, 0.941895f, 0.948730f, 0.954102f, 0.959961f, 0.963867f, 0.968262f, - 0.971680f, 0.975586f, 0.990723f, 0.991699f, 0.991699f, 0.991699f, 0.991699f, 0.991211f, - 0.000237f, 0.000782f, 0.001245f, 0.001923f, 0.002417f, 0.003225f, 0.004101f, 0.005062f, - 0.005920f, 0.007030f, 0.008102f, 0.009743f, 0.011009f, 0.013054f, 0.015190f, 0.017380f, - 0.020126f, 0.023346f, 0.027161f, 0.031464f, 0.036316f, 0.042664f, 0.050110f, 0.058807f, - 0.069946f, 0.083191f, 0.099121f, 0.118835f, 0.142822f, 0.171997f, 0.206665f, 0.248413f, - 0.296143f, 0.350586f, 0.408936f, 0.469727f, 0.530762f, 0.589844f, 0.643555f, 0.691895f, - 0.734375f, 0.772461f, 0.803223f, 0.830566f, 0.854492f, 0.873047f, 0.889648f, 0.903809f, - 0.916016f, 0.926270f, 0.935059f, 0.943359f, 0.949219f, 0.955566f, 0.960938f, 0.965332f, - 0.969727f, 0.973145f, 0.989746f, 0.990723f, 0.990723f, 0.990723f, 0.991211f, 0.990723f, - 0.000243f, 0.000793f, 0.001210f, 0.001616f, 0.002260f, 0.003069f, 0.003649f, 0.004444f, - 0.005322f, 0.006088f, 0.006954f, 0.008278f, 0.009766f, 0.011139f, 0.012970f, 0.014908f, - 0.016968f, 0.019897f, 0.023193f, 0.026962f, 0.030792f, 0.035522f, 0.041931f, 0.048920f, - 0.057404f, 0.067993f, 0.080383f, 0.095825f, 0.114929f, 0.137695f, 0.165771f, 0.199585f, - 0.241089f, 0.287842f, 0.341553f, 0.400391f, 0.462402f, 0.523438f, 0.583008f, 0.638184f, - 0.687988f, 0.732422f, 0.770020f, 0.802246f, 0.830566f, 0.854004f, 0.873047f, 0.891113f, - 0.904785f, 0.916992f, 0.926758f, 0.936523f, 0.943848f, 0.951172f, 0.956543f, 0.961914f, - 0.966797f, 0.971191f, 0.989258f, 0.990234f, 0.990234f, 0.990234f, 0.990234f, 0.989746f, - 0.000000f, 0.000484f, 0.000973f, 0.001453f, 0.001999f, 0.002689f, 0.003359f, 0.003864f, - 0.004726f, 0.005444f, 0.006516f, 0.007404f, 0.008461f, 0.009720f, 0.011261f, 0.012985f, - 0.014908f, 0.017120f, 0.019699f, 0.022614f, 0.026093f, 0.030228f, 0.034668f, 0.040619f, - 0.047699f, 0.055756f, 0.066284f, 0.078308f, 0.092834f, 0.111328f, 0.133423f, 0.160889f, - 0.194214f, 0.233765f, 0.281006f, 0.334473f, 0.392822f, 0.455078f, 0.517090f, 0.578125f, - 0.634766f, 0.686035f, 0.730957f, 0.768555f, 0.803223f, 0.831055f, 0.854492f, 0.875488f, - 0.892090f, 0.906250f, 0.918457f, 0.929688f, 0.937988f, 0.945801f, 0.952148f, 0.958496f, - 0.963867f, 0.968750f, 0.988281f, 0.989258f, 0.989746f, 0.989258f, 0.989746f, 0.989258f, - 0.000241f, 0.000699f, 0.000835f, 0.001354f, 0.002066f, 0.002405f, 0.003073f, 0.003466f, - 0.003847f, 0.004868f, 0.005798f, 0.006325f, 0.007446f, 0.008553f, 0.009789f, 0.011375f, - 0.013031f, 0.014702f, 0.016937f, 0.019455f, 0.022171f, 0.025467f, 0.029541f, 0.034271f, - 0.039734f, 0.046295f, 0.054291f, 0.063904f, 0.075745f, 0.089966f, 0.107727f, 0.129395f, - 0.156250f, 0.188965f, 0.228394f, 0.274658f, 0.327637f, 0.386963f, 0.449219f, 0.512695f, - 0.574707f, 0.632324f, 0.684570f, 0.730469f, 0.770508f, 0.804688f, 0.832520f, 0.857422f, - 0.876953f, 0.893066f, 0.908691f, 0.920410f, 0.931152f, 0.940430f, 0.947754f, 0.954590f, - 0.960938f, 0.965820f, 0.986816f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, 0.988770f, - 0.000122f, 0.000480f, 0.000793f, 0.001184f, 0.001847f, 0.002220f, 0.002459f, 0.003109f, - 0.003740f, 0.004234f, 0.005127f, 0.005730f, 0.006557f, 0.007458f, 0.008469f, 0.009911f, - 0.011162f, 0.012848f, 0.014519f, 0.016693f, 0.019135f, 0.021820f, 0.025024f, 0.028931f, - 0.033508f, 0.038757f, 0.045135f, 0.052856f, 0.062042f, 0.073547f, 0.087646f, 0.104736f, - 0.126099f, 0.152588f, 0.184570f, 0.223511f, 0.269775f, 0.323242f, 0.382324f, 0.445801f, - 0.510254f, 0.573242f, 0.631348f, 0.685059f, 0.731934f, 0.772461f, 0.806641f, 0.834961f, - 0.859375f, 0.879883f, 0.897461f, 0.911133f, 0.923828f, 0.933594f, 0.942383f, 0.950195f, - 0.956055f, 0.962402f, 0.985840f, 0.987305f, 0.987793f, 0.987793f, 0.988281f, 0.987793f, - 0.000244f, 0.000471f, 0.000666f, 0.001267f, 0.001592f, 0.001838f, 0.002251f, 0.002855f, - 0.003225f, 0.003828f, 0.004372f, 0.005112f, 0.005695f, 0.006340f, 0.007534f, 0.008797f, - 0.009895f, 0.011215f, 0.012604f, 0.014503f, 0.016602f, 0.018738f, 0.021408f, 0.024567f, - 0.028305f, 0.032654f, 0.037872f, 0.043732f, 0.051239f, 0.060669f, 0.071716f, 0.085510f, - 0.102356f, 0.123230f, 0.149170f, 0.180664f, 0.219849f, 0.265869f, 0.319092f, 0.379150f, - 0.443604f, 0.508789f, 0.572754f, 0.633301f, 0.686523f, 0.734863f, 0.775391f, 0.809570f, - 0.838379f, 0.862305f, 0.883301f, 0.900391f, 0.914551f, 0.926270f, 0.937012f, 0.944824f, - 0.953125f, 0.959473f, 0.985352f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, 0.986816f, - 0.000242f, 0.000346f, 0.000827f, 0.001065f, 0.001428f, 0.001572f, 0.001984f, 0.002367f, - 0.002851f, 0.003277f, 0.003786f, 0.004501f, 0.005253f, 0.005955f, 0.006573f, 0.007736f, - 0.008659f, 0.009880f, 0.011177f, 0.012459f, 0.014153f, 0.016403f, 0.018173f, 0.020859f, - 0.024017f, 0.027496f, 0.031708f, 0.036682f, 0.042877f, 0.050446f, 0.059174f, 0.070068f, - 0.083374f, 0.100159f, 0.120728f, 0.145874f, 0.177612f, 0.216187f, 0.262695f, 0.316650f, - 0.377686f, 0.443115f, 0.509766f, 0.575195f, 0.635742f, 0.691406f, 0.738281f, 0.779785f, - 0.813965f, 0.843750f, 0.866699f, 0.887207f, 0.904297f, 0.918945f, 0.930176f, 0.940918f, - 0.948730f, 0.956055f, 0.984375f, 0.985840f, 0.985840f, 0.985840f, 0.986328f, 0.985840f, - 0.000242f, 0.000540f, 0.000708f, 0.000830f, 0.001143f, 0.001451f, 0.001861f, 0.002249f, - 0.002661f, 0.003010f, 0.003435f, 0.003922f, 0.004707f, 0.005165f, 0.005787f, 0.006840f, - 0.007374f, 0.008545f, 0.009651f, 0.011147f, 0.012581f, 0.014084f, 0.015991f, 0.017899f, - 0.020325f, 0.023392f, 0.026978f, 0.031113f, 0.035919f, 0.042023f, 0.049103f, 0.057831f, - 0.068420f, 0.081543f, 0.098145f, 0.118530f, 0.143921f, 0.175293f, 0.213989f, 0.260742f, - 0.316162f, 0.377441f, 0.444336f, 0.512207f, 0.579590f, 0.641113f, 0.696289f, 0.744629f, - 0.786621f, 0.820801f, 0.849609f, 0.872559f, 0.892578f, 0.908691f, 0.922363f, 0.934570f, - 0.944336f, 0.951660f, 0.982910f, 0.984375f, 0.984863f, 0.984863f, 0.985352f, 0.984863f, - 0.000106f, 0.000477f, 0.000649f, 0.000901f, 0.001110f, 0.001206f, 0.001630f, 0.002121f, - 0.002192f, 0.002743f, 0.003128f, 0.003538f, 0.003941f, 0.004688f, 0.005276f, 0.005905f, - 0.006546f, 0.007568f, 0.008461f, 0.009483f, 0.010674f, 0.011864f, 0.013649f, 0.015549f, - 0.017731f, 0.020111f, 0.023010f, 0.026199f, 0.030304f, 0.035278f, 0.040833f, 0.047821f, - 0.056580f, 0.066895f, 0.079895f, 0.096191f, 0.116760f, 0.141968f, 0.173584f, 0.212646f, - 0.260498f, 0.316162f, 0.379883f, 0.447754f, 0.517578f, 0.584961f, 0.647949f, 0.704102f, - 0.752930f, 0.792969f, 0.827148f, 0.855957f, 0.877930f, 0.898438f, 0.914062f, 0.928223f, - 0.938965f, 0.948242f, 0.981445f, 0.983398f, 0.983887f, 0.983887f, 0.983887f, 0.983398f, - 0.000208f, 0.000456f, 0.000582f, 0.000788f, 0.001016f, 0.001428f, 0.001507f, 0.001769f, - 0.002203f, 0.002525f, 0.002718f, 0.003187f, 0.003761f, 0.004238f, 0.004635f, 0.005348f, - 0.005901f, 0.006805f, 0.007500f, 0.008545f, 0.009270f, 0.010437f, 0.011742f, 0.013344f, - 0.015198f, 0.017242f, 0.019516f, 0.022430f, 0.025665f, 0.029922f, 0.034180f, 0.040161f, - 0.046936f, 0.055420f, 0.065735f, 0.078552f, 0.094666f, 0.114563f, 0.140503f, 0.172485f, - 0.212646f, 0.260986f, 0.318359f, 0.383545f, 0.453125f, 0.524414f, 0.593750f, 0.656738f, - 0.712891f, 0.761230f, 0.801270f, 0.835938f, 0.862305f, 0.885742f, 0.904785f, 0.919922f, - 0.933594f, 0.943359f, 0.980469f, 0.982422f, 0.982422f, 0.981934f, 0.982422f, 0.982422f, - 0.000170f, 0.000350f, 0.000583f, 0.000682f, 0.000845f, 0.001036f, 0.001265f, 0.001821f, - 0.001953f, 0.002163f, 0.002525f, 0.002771f, 0.003418f, 0.003729f, 0.004040f, 0.004871f, - 0.005188f, 0.005726f, 0.006512f, 0.007130f, 0.008087f, 0.009018f, 0.010216f, 0.011490f, - 0.013084f, 0.014565f, 0.016891f, 0.019073f, 0.021851f, 0.025253f, 0.029022f, 0.033539f, - 0.039124f, 0.045563f, 0.054230f, 0.064270f, 0.077271f, 0.093323f, 0.113403f, 0.139648f, - 0.172485f, 0.213379f, 0.262939f, 0.322266f, 0.389404f, 0.461426f, 0.534180f, 0.604492f, - 0.668457f, 0.724609f, 0.772461f, 0.812500f, 0.845703f, 0.872070f, 0.894043f, 0.911621f, - 0.926758f, 0.938477f, 0.979004f, 0.980469f, 0.980957f, 0.980957f, 0.980957f, 0.980957f, - 0.000000f, 0.000332f, 0.000583f, 0.000583f, 0.000848f, 0.000959f, 0.001125f, 0.001425f, - 0.001810f, 0.001899f, 0.002300f, 0.002529f, 0.002996f, 0.003162f, 0.003607f, 0.004150f, - 0.004761f, 0.005146f, 0.005791f, 0.006329f, 0.007099f, 0.008110f, 0.008949f, 0.009941f, - 0.011253f, 0.012756f, 0.014565f, 0.016434f, 0.018707f, 0.021271f, 0.024475f, 0.028290f, - 0.032745f, 0.037964f, 0.044769f, 0.052795f, 0.063416f, 0.076050f, 0.092102f, 0.113464f, - 0.139526f, 0.172974f, 0.214600f, 0.266602f, 0.327637f, 0.397461f, 0.471191f, 0.546387f, - 0.617188f, 0.682129f, 0.737793f, 0.784668f, 0.823730f, 0.854980f, 0.881348f, 0.902344f, - 0.918945f, 0.933105f, 0.977539f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, - 0.000000f, 0.000243f, 0.000553f, 0.000575f, 0.000591f, 0.000798f, 0.000991f, 0.001234f, - 0.001419f, 0.001812f, 0.001935f, 0.002186f, 0.002518f, 0.002975f, 0.003202f, 0.003614f, - 0.004047f, 0.004425f, 0.005013f, 0.005718f, 0.006172f, 0.007046f, 0.007740f, 0.008835f, - 0.009819f, 0.011192f, 0.012444f, 0.014114f, 0.015884f, 0.018204f, 0.020844f, 0.023392f, - 0.027420f, 0.031921f, 0.037170f, 0.043610f, 0.052032f, 0.062408f, 0.075256f, 0.091675f, - 0.112610f, 0.140015f, 0.173950f, 0.217651f, 0.271973f, 0.335693f, 0.407715f, 0.484619f, - 0.561035f, 0.633789f, 0.698242f, 0.752930f, 0.798828f, 0.836426f, 0.867676f, 0.891602f, - 0.911621f, 0.926270f, 0.975098f, 0.977539f, 0.978516f, 0.977539f, 0.977539f, 0.978027f, - 0.000121f, 0.000121f, 0.000241f, 0.000385f, 0.000684f, 0.000693f, 0.000932f, 0.001156f, - 0.001410f, 0.001648f, 0.001893f, 0.002184f, 0.002367f, 0.002579f, 0.002872f, 0.003319f, - 0.003653f, 0.003922f, 0.004425f, 0.004925f, 0.005436f, 0.006180f, 0.006836f, 0.007645f, - 0.008278f, 0.009476f, 0.010788f, 0.012169f, 0.013695f, 0.015305f, 0.017319f, 0.020111f, - 0.022858f, 0.026718f, 0.030975f, 0.036255f, 0.042938f, 0.051270f, 0.061493f, 0.074768f, - 0.091187f, 0.112976f, 0.140747f, 0.176392f, 0.222168f, 0.278809f, 0.345703f, 0.421387f, - 0.500488f, 0.578613f, 0.651855f, 0.715820f, 0.769531f, 0.813965f, 0.850586f, 0.878418f, - 0.901855f, 0.920410f, 0.973633f, 0.975586f, 0.976074f, 0.976562f, 0.976562f, 0.975098f, - 0.000240f, 0.000120f, 0.000281f, 0.000333f, 0.000498f, 0.000680f, 0.000684f, 0.001083f, - 0.001312f, 0.001618f, 0.001606f, 0.001834f, 0.002087f, 0.002316f, 0.002735f, 0.002792f, - 0.003084f, 0.003386f, 0.003944f, 0.004353f, 0.004761f, 0.005390f, 0.005997f, 0.006615f, - 0.007389f, 0.008324f, 0.008987f, 0.010284f, 0.011703f, 0.013382f, 0.014717f, 0.016953f, - 0.019424f, 0.022278f, 0.026047f, 0.030029f, 0.035492f, 0.042145f, 0.050446f, 0.060608f, - 0.073975f, 0.091187f, 0.113831f, 0.142700f, 0.180176f, 0.228271f, 0.288086f, 0.359131f, - 0.437988f, 0.519531f, 0.600098f, 0.673340f, 0.735352f, 0.787598f, 0.830566f, 0.865234f, - 0.891602f, 0.913086f, 0.971680f, 0.974121f, 0.974121f, 0.974121f, 0.974121f, 0.974609f, - 0.000000f, 0.000239f, 0.000236f, 0.000425f, 0.000487f, 0.000608f, 0.000850f, 0.001012f, - 0.001140f, 0.001260f, 0.001410f, 0.001640f, 0.001953f, 0.002003f, 0.002342f, 0.002434f, - 0.002686f, 0.002934f, 0.003305f, 0.003771f, 0.004169f, 0.004692f, 0.005028f, 0.005817f, - 0.006371f, 0.007179f, 0.007919f, 0.008965f, 0.009857f, 0.011261f, 0.012703f, 0.014229f, - 0.016312f, 0.018494f, 0.021744f, 0.025024f, 0.029633f, 0.034790f, 0.041199f, 0.049561f, - 0.060242f, 0.073608f, 0.091675f, 0.114502f, 0.144897f, 0.185547f, 0.236328f, 0.300049f, - 0.375732f, 0.458496f, 0.542969f, 0.624023f, 0.696289f, 0.758301f, 0.808105f, 0.847656f, - 0.879395f, 0.903809f, 0.968750f, 0.971191f, 0.972168f, 0.971680f, 0.972168f, 0.971680f, - 0.000000f, 0.000217f, 0.000235f, 0.000235f, 0.000321f, 0.000560f, 0.000588f, 0.000897f, - 0.001034f, 0.001040f, 0.001246f, 0.001369f, 0.001611f, 0.001692f, 0.001942f, 0.002153f, - 0.002337f, 0.002638f, 0.002878f, 0.003330f, 0.003672f, 0.003986f, 0.004498f, 0.004826f, - 0.005535f, 0.006176f, 0.006561f, 0.007538f, 0.008362f, 0.009544f, 0.010612f, 0.011879f, - 0.013794f, 0.015839f, 0.018326f, 0.020889f, 0.024567f, 0.028625f, 0.033783f, 0.040527f, - 0.049133f, 0.059998f, 0.073608f, 0.092041f, 0.116394f, 0.148682f, 0.191528f, 0.246582f, - 0.315186f, 0.395508f, 0.482910f, 0.570312f, 0.651367f, 0.722168f, 0.781738f, 0.828613f, - 0.866211f, 0.895508f, 0.966797f, 0.968750f, 0.969238f, 0.969727f, 0.969238f, 0.969238f, - 0.000000f, 0.000108f, 0.000215f, 0.000346f, 0.000352f, 0.000501f, 0.000783f, 0.000828f, - 0.000954f, 0.000980f, 0.001130f, 0.001353f, 0.001429f, 0.001522f, 0.001690f, 0.001760f, - 0.002172f, 0.002363f, 0.002522f, 0.002777f, 0.003202f, 0.003550f, 0.004040f, 0.004364f, - 0.004734f, 0.005192f, 0.005909f, 0.006271f, 0.007015f, 0.007957f, 0.008774f, 0.010185f, - 0.011681f, 0.013306f, 0.015327f, 0.017517f, 0.020264f, 0.023636f, 0.027740f, 0.033234f, - 0.039856f, 0.048340f, 0.059387f, 0.074097f, 0.093567f, 0.118896f, 0.153931f, 0.200073f, - 0.260254f, 0.334473f, 0.420410f, 0.511719f, 0.601562f, 0.682129f, 0.750488f, 0.807617f, - 0.851074f, 0.884277f, 0.963867f, 0.966309f, 0.966797f, 0.966797f, 0.966797f, 0.966797f, - 0.000000f, 0.000059f, 0.000292f, 0.000331f, 0.000344f, 0.000613f, 0.000532f, 0.000703f, - 0.000853f, 0.000915f, 0.000936f, 0.001102f, 0.001284f, 0.001430f, 0.001417f, 0.001475f, - 0.001791f, 0.001989f, 0.002161f, 0.002388f, 0.002775f, 0.003017f, 0.003357f, 0.003763f, - 0.004124f, 0.004383f, 0.004917f, 0.005436f, 0.005840f, 0.006733f, 0.007511f, 0.008667f, - 0.009567f, 0.011032f, 0.012474f, 0.014610f, 0.016739f, 0.019379f, 0.022873f, 0.027252f, - 0.032410f, 0.039062f, 0.048065f, 0.059296f, 0.074646f, 0.094971f, 0.123108f, 0.161011f, - 0.211426f, 0.277344f, 0.358154f, 0.450195f, 0.545410f, 0.636230f, 0.715332f, 0.781250f, - 0.832520f, 0.872070f, 0.960449f, 0.962402f, 0.963867f, 0.963379f, 0.962891f, 0.963379f, - 0.000000f, 0.000000f, 0.000098f, 0.000301f, 0.000315f, 0.000566f, 0.000587f, 0.000627f, - 0.000643f, 0.000795f, 0.000974f, 0.001023f, 0.000987f, 0.001031f, 0.001245f, 0.001470f, - 0.001637f, 0.001820f, 0.001884f, 0.002146f, 0.002357f, 0.002630f, 0.002913f, 0.003164f, - 0.003380f, 0.003824f, 0.004189f, 0.004353f, 0.004940f, 0.005688f, 0.006409f, 0.007347f, - 0.008018f, 0.009163f, 0.010559f, 0.012039f, 0.013695f, 0.016144f, 0.018723f, 0.022354f, - 0.026337f, 0.031433f, 0.038818f, 0.047546f, 0.059662f, 0.075623f, 0.097473f, 0.127808f, - 0.169556f, 0.225830f, 0.299072f, 0.387451f, 0.486084f, 0.583984f, 0.674805f, 0.751465f, - 0.812012f, 0.859375f, 0.957031f, 0.958984f, 0.959473f, 0.959961f, 0.959961f, 0.959961f, - 0.000000f, 0.000000f, 0.000004f, 0.000078f, 0.000408f, 0.000432f, 0.000563f, 0.000560f, - 0.000566f, 0.000623f, 0.000782f, 0.000829f, 0.000896f, 0.000956f, 0.001056f, 0.001249f, - 0.001414f, 0.001473f, 0.001646f, 0.001764f, 0.002066f, 0.002230f, 0.002436f, 0.002651f, - 0.003012f, 0.003252f, 0.003414f, 0.004055f, 0.004143f, 0.004784f, 0.005356f, 0.006077f, - 0.006870f, 0.007538f, 0.008728f, 0.009834f, 0.011322f, 0.013130f, 0.015427f, 0.017914f, - 0.021271f, 0.025436f, 0.030960f, 0.038086f, 0.047485f, 0.060303f, 0.077087f, 0.101196f, - 0.134521f, 0.180786f, 0.244507f, 0.326172f, 0.423584f, 0.527832f, 0.628418f, 0.716797f, - 0.788086f, 0.843262f, 0.953125f, 0.955566f, 0.955566f, 0.956543f, 0.956055f, 0.956543f, - 0.000000f, 0.000000f, 0.000000f, 0.000236f, 0.000320f, 0.000484f, 0.000521f, 0.000549f, - 0.000556f, 0.000584f, 0.000574f, 0.000690f, 0.000758f, 0.000841f, 0.001003f, 0.001013f, - 0.001169f, 0.001292f, 0.001437f, 0.001658f, 0.001830f, 0.002001f, 0.002081f, 0.002146f, - 0.002434f, 0.002712f, 0.002964f, 0.003220f, 0.003513f, 0.003963f, 0.004410f, 0.004875f, - 0.005608f, 0.006245f, 0.007179f, 0.008118f, 0.009201f, 0.010582f, 0.012360f, 0.014343f, - 0.016968f, 0.020401f, 0.024628f, 0.030365f, 0.037567f, 0.047455f, 0.060913f, 0.079529f, - 0.105774f, 0.143555f, 0.196167f, 0.268799f, 0.361084f, 0.467041f, 0.576172f, 0.676758f, - 0.760254f, 0.825195f, 0.948242f, 0.951660f, 0.951660f, 0.951660f, 0.951660f, 0.951660f, - 0.000000f, 0.000000f, 0.000000f, 0.000122f, 0.000257f, 0.000334f, 0.000390f, 0.000496f, - 0.000520f, 0.000539f, 0.000590f, 0.000602f, 0.000646f, 0.000725f, 0.000909f, 0.000949f, - 0.001023f, 0.001121f, 0.001181f, 0.001308f, 0.001474f, 0.001457f, 0.001714f, 0.002007f, - 0.001929f, 0.002039f, 0.002468f, 0.002672f, 0.003025f, 0.003317f, 0.003635f, 0.004047f, - 0.004433f, 0.004864f, 0.005756f, 0.006493f, 0.007515f, 0.008331f, 0.009697f, 0.011383f, - 0.014000f, 0.016235f, 0.019653f, 0.024185f, 0.029465f, 0.037109f, 0.047699f, 0.062164f, - 0.082642f, 0.112488f, 0.155151f, 0.216919f, 0.300049f, 0.404541f, 0.520020f, 0.631836f, - 0.728516f, 0.805664f, 0.943848f, 0.946289f, 0.946777f, 0.946777f, 0.947266f, 0.947266f, - 0.000000f, 0.000000f, 0.000122f, 0.000088f, 0.000219f, 0.000229f, 0.000355f, 0.000414f, - 0.000482f, 0.000545f, 0.000559f, 0.000568f, 0.000481f, 0.000668f, 0.000636f, 0.000728f, - 0.000924f, 0.000980f, 0.001017f, 0.001109f, 0.001258f, 0.001353f, 0.001451f, 0.001564f, - 0.001621f, 0.001740f, 0.002066f, 0.002289f, 0.002459f, 0.002621f, 0.002975f, 0.003349f, - 0.003588f, 0.003998f, 0.004723f, 0.005116f, 0.006035f, 0.006859f, 0.007957f, 0.009064f, - 0.010658f, 0.012711f, 0.015511f, 0.018555f, 0.023026f, 0.028854f, 0.037140f, 0.048035f, - 0.064026f, 0.086914f, 0.121033f, 0.171387f, 0.244141f, 0.341797f, 0.458740f, 0.580078f, - 0.691895f, 0.780762f, 0.937988f, 0.940430f, 0.941406f, 0.940918f, 0.941895f, 0.941406f, - 0.000000f, 0.000000f, 0.000000f, 0.000080f, 0.000211f, 0.000221f, 0.000225f, 0.000192f, - 0.000352f, 0.000368f, 0.000397f, 0.000529f, 0.000510f, 0.000504f, 0.000540f, 0.000671f, - 0.000694f, 0.000763f, 0.000902f, 0.000998f, 0.001063f, 0.001074f, 0.001128f, 0.001407f, - 0.001370f, 0.001449f, 0.001682f, 0.001635f, 0.001976f, 0.002108f, 0.002335f, 0.002558f, - 0.002905f, 0.003176f, 0.003637f, 0.003948f, 0.004650f, 0.005341f, 0.006237f, 0.007034f, - 0.008415f, 0.009811f, 0.012032f, 0.014565f, 0.017731f, 0.022324f, 0.028427f, 0.036713f, - 0.048859f, 0.066406f, 0.092957f, 0.133057f, 0.193848f, 0.281250f, 0.395508f, 0.524902f, - 0.648926f, 0.754395f, 0.931152f, 0.934570f, 0.934570f, 0.934570f, 0.935547f, 0.935059f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000181f, 0.000196f, 0.000236f, 0.000250f, - 0.000226f, 0.000281f, 0.000335f, 0.000457f, 0.000406f, 0.000511f, 0.000522f, 0.000593f, - 0.000539f, 0.000663f, 0.000661f, 0.000779f, 0.000978f, 0.000855f, 0.000937f, 0.001128f, - 0.001163f, 0.001253f, 0.001241f, 0.001531f, 0.001595f, 0.001796f, 0.001888f, 0.002226f, - 0.002350f, 0.002609f, 0.002787f, 0.003260f, 0.003656f, 0.004303f, 0.004910f, 0.005577f, - 0.006683f, 0.007603f, 0.009102f, 0.011017f, 0.013603f, 0.016968f, 0.021652f, 0.027939f, - 0.037109f, 0.050262f, 0.070374f, 0.101624f, 0.150391f, 0.225220f, 0.331543f, 0.463867f, - 0.601074f, 0.723145f, 0.923828f, 0.927246f, 0.927246f, 0.928223f, 0.927734f, 0.928223f, - 0.000000f, 0.000000f, 0.000122f, 0.000121f, 0.000121f, 0.000174f, 0.000156f, 0.000204f, - 0.000180f, 0.000221f, 0.000246f, 0.000346f, 0.000313f, 0.000426f, 0.000468f, 0.000482f, - 0.000559f, 0.000582f, 0.000536f, 0.000611f, 0.000770f, 0.000666f, 0.000919f, 0.000947f, - 0.001013f, 0.000948f, 0.001129f, 0.001169f, 0.001463f, 0.001579f, 0.001540f, 0.001555f, - 0.001888f, 0.002007f, 0.002390f, 0.002623f, 0.002708f, 0.003235f, 0.003584f, 0.004223f, - 0.005001f, 0.005791f, 0.006905f, 0.008118f, 0.010117f, 0.012512f, 0.015961f, 0.020798f, - 0.027374f, 0.037628f, 0.052673f, 0.076172f, 0.114197f, 0.175659f, 0.270752f, 0.399658f, - 0.546875f, 0.687012f, 0.915527f, 0.918457f, 0.919434f, 0.919434f, 0.919434f, 0.919434f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000121f, 0.000120f, 0.000139f, 0.000141f, - 0.000152f, 0.000186f, 0.000209f, 0.000222f, 0.000297f, 0.000330f, 0.000367f, 0.000403f, - 0.000433f, 0.000456f, 0.000457f, 0.000484f, 0.000521f, 0.000544f, 0.000594f, 0.000807f, - 0.000790f, 0.000841f, 0.000784f, 0.001025f, 0.001112f, 0.001014f, 0.001146f, 0.001287f, - 0.001485f, 0.001541f, 0.001740f, 0.002014f, 0.002264f, 0.002460f, 0.002825f, 0.003124f, - 0.003683f, 0.004177f, 0.005024f, 0.006004f, 0.007454f, 0.009041f, 0.011833f, 0.014839f, - 0.019791f, 0.027283f, 0.038361f, 0.055817f, 0.084656f, 0.133057f, 0.213013f, 0.334717f, - 0.488770f, 0.645996f, 0.905762f, 0.909668f, 0.909668f, 0.909180f, 0.910645f, 0.908691f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000115f, - 0.000104f, 0.000105f, 0.000203f, 0.000235f, 0.000185f, 0.000290f, 0.000201f, 0.000306f, - 0.000259f, 0.000370f, 0.000401f, 0.000428f, 0.000596f, 0.000617f, 0.000474f, 0.000593f, - 0.000641f, 0.000676f, 0.000682f, 0.000826f, 0.000897f, 0.000934f, 0.000972f, 0.000972f, - 0.001213f, 0.001281f, 0.001410f, 0.001451f, 0.001562f, 0.001786f, 0.002031f, 0.002417f, - 0.002764f, 0.003162f, 0.003763f, 0.004406f, 0.005310f, 0.006454f, 0.008156f, 0.010849f, - 0.014305f, 0.019318f, 0.027328f, 0.039856f, 0.061310f, 0.097717f, 0.162354f, 0.270752f, - 0.424805f, 0.599609f, 0.894043f, 0.897949f, 0.898438f, 0.898438f, 0.898926f, 0.898438f, - 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000118f, - 0.000112f, 0.000102f, 0.000094f, 0.000109f, 0.000131f, 0.000145f, 0.000232f, 0.000171f, - 0.000278f, 0.000230f, 0.000347f, 0.000331f, 0.000379f, 0.000381f, 0.000512f, 0.000427f, - 0.000541f, 0.000566f, 0.000547f, 0.000613f, 0.000706f, 0.000660f, 0.000809f, 0.000941f, - 0.000950f, 0.001035f, 0.001069f, 0.001220f, 0.001149f, 0.001314f, 0.001603f, 0.001801f, - 0.002062f, 0.002394f, 0.002737f, 0.003057f, 0.003771f, 0.004471f, 0.005875f, 0.007217f, - 0.009651f, 0.013344f, 0.018829f, 0.027710f, 0.043091f, 0.069214f, 0.119141f, 0.210571f, - 0.358398f, 0.544922f, 0.881348f, 0.883789f, 0.885254f, 0.885742f, 0.885254f, 0.885254f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, - 0.000116f, 0.000110f, 0.000101f, 0.000094f, 0.000087f, 0.000157f, 0.000151f, 0.000168f, - 0.000146f, 0.000219f, 0.000214f, 0.000261f, 0.000313f, 0.000363f, 0.000311f, 0.000415f, - 0.000476f, 0.000448f, 0.000429f, 0.000460f, 0.000481f, 0.000560f, 0.000544f, 0.000695f, - 0.000626f, 0.000789f, 0.000877f, 0.000894f, 0.000948f, 0.001177f, 0.001175f, 0.001366f, - 0.001487f, 0.001738f, 0.002008f, 0.002304f, 0.002663f, 0.003250f, 0.004002f, 0.004932f, - 0.006416f, 0.008636f, 0.012344f, 0.018127f, 0.028610f, 0.047150f, 0.083923f, 0.156860f, - 0.291260f, 0.487305f, 0.866211f, 0.869141f, 0.870605f, 0.870117f, 0.871094f, 0.870117f, - 0.000000f, 0.000000f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000115f, 0.000115f, - 0.000114f, 0.000114f, 0.000109f, 0.000101f, 0.000094f, 0.000087f, 0.000081f, 0.000085f, - 0.000129f, 0.000150f, 0.000176f, 0.000193f, 0.000216f, 0.000257f, 0.000241f, 0.000302f, - 0.000259f, 0.000299f, 0.000397f, 0.000403f, 0.000384f, 0.000402f, 0.000425f, 0.000582f, - 0.000467f, 0.000614f, 0.000660f, 0.000625f, 0.000650f, 0.000819f, 0.000790f, 0.000879f, - 0.001001f, 0.001140f, 0.001403f, 0.001555f, 0.001844f, 0.002213f, 0.002636f, 0.003235f, - 0.004082f, 0.005604f, 0.007896f, 0.011292f, 0.018005f, 0.030472f, 0.055786f, 0.109985f, - 0.224976f, 0.421875f, 0.848145f, 0.852539f, 0.853027f, 0.852539f, 0.852539f, 0.853027f, - 0.000000f, 0.000119f, 0.000118f, 0.000116f, 0.000115f, 0.000114f, 0.000113f, 0.000112f, - 0.000111f, 0.000111f, 0.000110f, 0.000108f, 0.000101f, 0.000094f, 0.000088f, 0.000082f, - 0.000077f, 0.000109f, 0.000068f, 0.000102f, 0.000127f, 0.000158f, 0.000177f, 0.000192f, - 0.000207f, 0.000214f, 0.000249f, 0.000278f, 0.000296f, 0.000320f, 0.000330f, 0.000342f, - 0.000415f, 0.000371f, 0.000389f, 0.000508f, 0.000463f, 0.000586f, 0.000606f, 0.000649f, - 0.000724f, 0.000841f, 0.000910f, 0.001065f, 0.001236f, 0.001475f, 0.001807f, 0.002138f, - 0.002716f, 0.003622f, 0.004921f, 0.006950f, 0.010574f, 0.018433f, 0.034607f, 0.072449f, - 0.163818f, 0.352295f, 0.827637f, 0.831055f, 0.831543f, 0.832031f, 0.833008f, 0.832520f, - 0.000120f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000110f, 0.000109f, 0.000108f, - 0.000107f, 0.000106f, 0.000106f, 0.000105f, 0.000104f, 0.000101f, 0.000094f, 0.000088f, - 0.000083f, 0.000078f, 0.000073f, 0.000092f, 0.000064f, 0.000097f, 0.000073f, 0.000105f, - 0.000125f, 0.000162f, 0.000179f, 0.000177f, 0.000191f, 0.000221f, 0.000241f, 0.000235f, - 0.000270f, 0.000277f, 0.000287f, 0.000329f, 0.000319f, 0.000428f, 0.000417f, 0.000409f, - 0.000524f, 0.000537f, 0.000612f, 0.000750f, 0.000770f, 0.000961f, 0.001153f, 0.001347f, - 0.001702f, 0.002081f, 0.002903f, 0.003956f, 0.006184f, 0.010368f, 0.019592f, 0.043427f, - 0.109924f, 0.280518f, 0.803223f, 0.806152f, 0.807617f, 0.808594f, 0.809082f, 0.808105f, - 0.000000f, 0.000111f, 0.000106f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000101f, - 0.000101f, 0.000100f, 0.000099f, 0.000098f, 0.000097f, 0.000097f, 0.000097f, 0.000094f, - 0.000088f, 0.000083f, 0.000078f, 0.000073f, 0.000069f, 0.000070f, 0.000061f, 0.000068f, - 0.000059f, 0.000067f, 0.000084f, 0.000097f, 0.000128f, 0.000137f, 0.000165f, 0.000160f, - 0.000176f, 0.000185f, 0.000217f, 0.000239f, 0.000237f, 0.000238f, 0.000272f, 0.000281f, - 0.000314f, 0.000372f, 0.000395f, 0.000430f, 0.000504f, 0.000578f, 0.000665f, 0.000856f, - 0.000969f, 0.001210f, 0.001594f, 0.002216f, 0.003370f, 0.005527f, 0.010170f, 0.023239f, - 0.066101f, 0.207275f, 0.775391f, 0.779785f, 0.780273f, 0.780762f, 0.780273f, 0.780762f, - 0.000000f, 0.000094f, 0.000097f, 0.000095f, 0.000092f, 0.000091f, 0.000091f, 0.000090f, - 0.000089f, 0.000089f, 0.000088f, 0.000088f, 0.000087f, 0.000086f, 0.000087f, 0.000086f, - 0.000086f, 0.000085f, 0.000081f, 0.000076f, 0.000072f, 0.000068f, 0.000064f, 0.000060f, - 0.000057f, 0.000054f, 0.000058f, 0.000048f, 0.000048f, 0.000069f, 0.000068f, 0.000092f, - 0.000110f, 0.000122f, 0.000133f, 0.000136f, 0.000146f, 0.000154f, 0.000175f, 0.000194f, - 0.000204f, 0.000206f, 0.000238f, 0.000262f, 0.000266f, 0.000338f, 0.000361f, 0.000432f, - 0.000527f, 0.000659f, 0.000848f, 0.001183f, 0.001713f, 0.002661f, 0.004921f, 0.010887f, - 0.033936f, 0.138428f, 0.743652f, 0.747559f, 0.748047f, 0.748535f, 0.749512f, 0.749023f, - 0.000045f, 0.000047f, 0.000059f, 0.000059f, 0.000063f, 0.000068f, 0.000068f, 0.000068f, - 0.000067f, 0.000069f, 0.000068f, 0.000070f, 0.000070f, 0.000070f, 0.000071f, 0.000070f, - 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000071f, 0.000069f, 0.000065f, 0.000062f, - 0.000058f, 0.000055f, 0.000052f, 0.000049f, 0.000046f, 0.000044f, 0.000041f, 0.000050f, - 0.000051f, 0.000048f, 0.000061f, 0.000070f, 0.000084f, 0.000095f, 0.000107f, 0.000104f, - 0.000111f, 0.000128f, 0.000143f, 0.000154f, 0.000157f, 0.000186f, 0.000198f, 0.000216f, - 0.000268f, 0.000315f, 0.000414f, 0.000537f, 0.000735f, 0.001149f, 0.002075f, 0.004669f, - 0.014175f, 0.077881f, 0.707031f, 0.710449f, 0.712402f, 0.711914f, 0.712891f, 0.712402f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000012f, 0.000013f, 0.000029f, - 0.000028f, 0.000037f, 0.000035f, 0.000039f, 0.000043f, 0.000043f, 0.000045f, 0.000045f, - 0.000048f, 0.000048f, 0.000050f, 0.000051f, 0.000052f, 0.000052f, 0.000053f, 0.000054f, - 0.000054f, 0.000053f, 0.000050f, 0.000048f, 0.000045f, 0.000043f, 0.000040f, 0.000038f, - 0.000036f, 0.000034f, 0.000032f, 0.000030f, 0.000028f, 0.000030f, 0.000038f, 0.000043f, - 0.000057f, 0.000069f, 0.000072f, 0.000073f, 0.000082f, 0.000095f, 0.000101f, 0.000099f, - 0.000116f, 0.000130f, 0.000184f, 0.000211f, 0.000301f, 0.000443f, 0.000737f, 0.001601f, - 0.004978f, 0.032593f, 0.666504f, 0.669922f, 0.669922f, 0.672363f, 0.670898f, 0.670410f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, - 0.000012f, 0.000015f, 0.000018f, 0.000021f, 0.000022f, 0.000023f, 0.000025f, 0.000028f, - 0.000029f, 0.000029f, 0.000031f, 0.000033f, 0.000033f, 0.000035f, 0.000035f, 0.000035f, - 0.000033f, 0.000031f, 0.000029f, 0.000028f, 0.000026f, 0.000024f, 0.000023f, 0.000021f, - 0.000020f, 0.000019f, 0.000022f, 0.000022f, 0.000030f, 0.000038f, 0.000042f, 0.000041f, - 0.000052f, 0.000047f, 0.000064f, 0.000072f, 0.000078f, 0.000129f, 0.000201f, 0.000382f, - 0.001180f, 0.009117f, 0.620605f, 0.624512f, 0.625000f, 0.625000f, 0.625000f, 0.625488f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000003f, 0.000005f, 0.000007f, 0.000008f, - 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000016f, 0.000016f, 0.000018f, 0.000017f, - 0.000016f, 0.000015f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000010f, 0.000009f, - 0.000011f, 0.000014f, 0.000018f, 0.000018f, 0.000021f, 0.000028f, 0.000035f, 0.000053f, - 0.000136f, 0.001152f, 0.571777f, 0.575684f, 0.575684f, 0.576172f, 0.576660f, 0.576660f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000002f, 0.000004f, 0.000004f, 0.000004f, 0.000003f, 0.000003f, 0.000002f, 0.000004f, - 0.000003f, 0.000011f, 0.520020f, 0.523926f, 0.524902f, 0.524902f, 0.524902f, 0.524902f, - }, - { - 0.119934f, 0.328857f, 0.480713f, 0.586914f, 0.663086f, 0.717773f, 0.759766f, 0.791504f, - 0.818359f, 0.838867f, 0.856934f, 0.871094f, 0.883301f, 0.894043f, 0.902832f, 0.911621f, - 0.917969f, 0.924805f, 0.930664f, 0.936035f, 0.939941f, 0.944824f, 0.948242f, 0.951660f, - 0.954590f, 0.958008f, 0.961426f, 0.962891f, 0.966309f, 0.967285f, 0.970215f, 0.972656f, - 0.973633f, 0.975586f, 0.977539f, 0.978516f, 0.979980f, 0.981445f, 0.982910f, 0.984375f, - 0.985352f, 0.986328f, 0.987793f, 0.988770f, 0.989746f, 0.990234f, 0.991699f, 0.992676f, - 0.993164f, 0.993652f, 0.994629f, 0.995117f, 0.996094f, 0.996582f, 0.997559f, 0.998047f, - 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f, - 0.046875f, 0.160400f, 0.286621f, 0.405518f, 0.507812f, 0.590820f, 0.656250f, 0.708008f, - 0.748535f, 0.781250f, 0.809082f, 0.830566f, 0.848633f, 0.864258f, 0.877441f, 0.888672f, - 0.898926f, 0.906738f, 0.915039f, 0.921387f, 0.928223f, 0.933105f, 0.937988f, 0.942871f, - 0.946777f, 0.950684f, 0.954102f, 0.957031f, 0.959961f, 0.962402f, 0.965332f, 0.966797f, - 0.969727f, 0.971191f, 0.973145f, 0.975098f, 0.977539f, 0.978027f, 0.980469f, 0.981934f, - 0.982910f, 0.984375f, 0.985352f, 0.986816f, 0.987793f, 0.988770f, 0.989258f, 0.990723f, - 0.991699f, 0.992676f, 0.993164f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.996582f, - 0.997559f, 0.998047f, 0.999023f, 0.999023f, 0.999023f, 0.998535f, 0.998535f, 0.998047f, - 0.023788f, 0.084473f, 0.163696f, 0.255615f, 0.351807f, 0.445312f, 0.527832f, 0.597656f, - 0.656738f, 0.703613f, 0.742676f, 0.775879f, 0.802734f, 0.824707f, 0.843262f, 0.858887f, - 0.873047f, 0.884766f, 0.895508f, 0.903809f, 0.913086f, 0.919434f, 0.925781f, 0.931641f, - 0.937012f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956543f, 0.959473f, 0.962402f, - 0.964844f, 0.967285f, 0.969238f, 0.972168f, 0.973633f, 0.975098f, 0.977539f, 0.979492f, - 0.980469f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.986816f, 0.988281f, 0.988770f, - 0.989746f, 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996094f, - 0.996582f, 0.997559f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, - 0.014595f, 0.050110f, 0.097717f, 0.158569f, 0.230347f, 0.311523f, 0.394531f, 0.473145f, - 0.544922f, 0.606934f, 0.660645f, 0.705566f, 0.743164f, 0.775391f, 0.800781f, 0.822266f, - 0.841309f, 0.856934f, 0.870605f, 0.883301f, 0.894043f, 0.902832f, 0.911133f, 0.918945f, - 0.925293f, 0.931152f, 0.936035f, 0.941406f, 0.945801f, 0.949707f, 0.953125f, 0.956055f, - 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.972168f, 0.974121f, 0.975098f, - 0.977539f, 0.979004f, 0.980957f, 0.981934f, 0.983398f, 0.984375f, 0.985840f, 0.987305f, - 0.988281f, 0.989258f, 0.990723f, 0.991699f, 0.992676f, 0.993652f, 0.994629f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998535f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, - 0.009178f, 0.032379f, 0.062561f, 0.102417f, 0.151611f, 0.210938f, 0.279785f, 0.352783f, - 0.426758f, 0.496826f, 0.561035f, 0.618164f, 0.666992f, 0.708496f, 0.744141f, 0.773926f, - 0.800781f, 0.821777f, 0.840820f, 0.856445f, 0.870117f, 0.882324f, 0.893066f, 0.901855f, - 0.910645f, 0.918457f, 0.925293f, 0.930176f, 0.935547f, 0.941406f, 0.946289f, 0.949707f, - 0.953125f, 0.956543f, 0.959961f, 0.962891f, 0.965332f, 0.967773f, 0.969727f, 0.972656f, - 0.974121f, 0.976074f, 0.977539f, 0.979492f, 0.981445f, 0.982422f, 0.984375f, 0.985840f, - 0.986328f, 0.987793f, 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, - 0.994629f, 0.995605f, 0.998047f, 0.998047f, 0.998047f, 0.997559f, 0.997559f, 0.997559f, - 0.006382f, 0.022430f, 0.042908f, 0.068970f, 0.102844f, 0.144653f, 0.195557f, 0.253906f, - 0.318848f, 0.386230f, 0.454590f, 0.518066f, 0.577148f, 0.628906f, 0.675293f, 0.714844f, - 0.748535f, 0.777344f, 0.802246f, 0.823730f, 0.841797f, 0.856934f, 0.871094f, 0.882812f, - 0.893555f, 0.902832f, 0.911133f, 0.918457f, 0.925293f, 0.930176f, 0.937012f, 0.940918f, - 0.945801f, 0.950195f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966309f, 0.968262f, - 0.970703f, 0.973145f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.983398f, - 0.984375f, 0.985840f, 0.988281f, 0.988770f, 0.989746f, 0.990723f, 0.991699f, 0.992676f, - 0.993652f, 0.994629f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997559f, 0.997070f, - 0.004585f, 0.015961f, 0.030930f, 0.049133f, 0.072144f, 0.101013f, 0.137451f, 0.181519f, - 0.232544f, 0.290039f, 0.352539f, 0.416748f, 0.479736f, 0.538574f, 0.592773f, 0.641602f, - 0.684570f, 0.723145f, 0.754395f, 0.782715f, 0.805176f, 0.825195f, 0.843750f, 0.859863f, - 0.872559f, 0.884766f, 0.895020f, 0.904297f, 0.912109f, 0.919922f, 0.926270f, 0.932129f, - 0.937500f, 0.942383f, 0.946289f, 0.950195f, 0.955078f, 0.958008f, 0.961426f, 0.964355f, - 0.967285f, 0.969238f, 0.971680f, 0.974121f, 0.975586f, 0.977539f, 0.979492f, 0.980957f, - 0.982910f, 0.984375f, 0.985840f, 0.986328f, 0.988281f, 0.989746f, 0.990723f, 0.992188f, - 0.992676f, 0.993164f, 0.997559f, 0.997559f, 0.997070f, 0.997070f, 0.997070f, 0.997070f, - 0.003483f, 0.012291f, 0.023209f, 0.036041f, 0.052429f, 0.073486f, 0.099182f, 0.131226f, - 0.169678f, 0.214844f, 0.266846f, 0.323242f, 0.383545f, 0.444580f, 0.503418f, 0.559082f, - 0.609375f, 0.655762f, 0.695312f, 0.730957f, 0.760254f, 0.788086f, 0.810059f, 0.829590f, - 0.847168f, 0.862793f, 0.875488f, 0.886719f, 0.896973f, 0.906250f, 0.914551f, 0.921387f, - 0.927734f, 0.933594f, 0.938965f, 0.944336f, 0.948242f, 0.952148f, 0.956543f, 0.958984f, - 0.961914f, 0.965332f, 0.968262f, 0.970703f, 0.972656f, 0.974609f, 0.977051f, 0.979004f, - 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.986328f, 0.987793f, 0.989746f, 0.990234f, - 0.991699f, 0.992676f, 0.996582f, 0.997070f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, - 0.002962f, 0.009613f, 0.017792f, 0.027481f, 0.039429f, 0.055176f, 0.073914f, 0.096985f, - 0.125610f, 0.159180f, 0.199707f, 0.246216f, 0.297607f, 0.353760f, 0.412842f, 0.470215f, - 0.526367f, 0.578613f, 0.626953f, 0.669434f, 0.707031f, 0.740723f, 0.769043f, 0.794922f, - 0.814941f, 0.835449f, 0.851074f, 0.866699f, 0.879395f, 0.890137f, 0.899902f, 0.909180f, - 0.916992f, 0.924316f, 0.929688f, 0.936035f, 0.941406f, 0.945312f, 0.950195f, 0.953613f, - 0.957520f, 0.960938f, 0.963867f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976562f, - 0.979004f, 0.979980f, 0.981934f, 0.982910f, 0.984375f, 0.986816f, 0.987793f, 0.988770f, - 0.990234f, 0.991699f, 0.996582f, 0.996582f, 0.996582f, 0.996582f, 0.996094f, 0.996094f, - 0.002077f, 0.007637f, 0.013802f, 0.021606f, 0.031006f, 0.042419f, 0.055969f, 0.073242f, - 0.094055f, 0.119446f, 0.150513f, 0.186401f, 0.228638f, 0.276123f, 0.328857f, 0.384277f, - 0.440674f, 0.496338f, 0.549805f, 0.598633f, 0.644043f, 0.683594f, 0.719727f, 0.750977f, - 0.779297f, 0.802246f, 0.823730f, 0.840820f, 0.855957f, 0.871582f, 0.882324f, 0.893555f, - 0.903809f, 0.911621f, 0.920410f, 0.926758f, 0.932617f, 0.938477f, 0.943359f, 0.947754f, - 0.953125f, 0.955566f, 0.959473f, 0.962402f, 0.965332f, 0.968262f, 0.970703f, 0.972656f, - 0.976074f, 0.977051f, 0.979492f, 0.981445f, 0.983398f, 0.984863f, 0.986328f, 0.987793f, - 0.989258f, 0.990723f, 0.995605f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, - 0.002014f, 0.006035f, 0.011299f, 0.017410f, 0.024368f, 0.033020f, 0.043701f, 0.056458f, - 0.072205f, 0.091431f, 0.114807f, 0.141968f, 0.174316f, 0.213257f, 0.256836f, 0.306152f, - 0.358887f, 0.413330f, 0.468018f, 0.520996f, 0.572266f, 0.618652f, 0.661621f, 0.699707f, - 0.732910f, 0.762695f, 0.788574f, 0.810547f, 0.830078f, 0.848145f, 0.862305f, 0.875977f, - 0.887695f, 0.898438f, 0.907227f, 0.915527f, 0.922852f, 0.929199f, 0.936035f, 0.940918f, - 0.946289f, 0.950684f, 0.953613f, 0.958496f, 0.960938f, 0.964355f, 0.967285f, 0.970215f, - 0.972656f, 0.975586f, 0.977539f, 0.979492f, 0.980957f, 0.982910f, 0.984863f, 0.986328f, - 0.987793f, 0.988770f, 0.995117f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, - 0.001496f, 0.005196f, 0.009201f, 0.013985f, 0.019806f, 0.026413f, 0.034943f, 0.044647f, - 0.056641f, 0.070923f, 0.088623f, 0.109680f, 0.135254f, 0.164795f, 0.200073f, 0.240845f, - 0.285645f, 0.335449f, 0.387939f, 0.441650f, 0.495850f, 0.546875f, 0.595215f, 0.639160f, - 0.679199f, 0.715820f, 0.746582f, 0.774414f, 0.798828f, 0.819824f, 0.837402f, 0.854492f, - 0.869629f, 0.881348f, 0.893066f, 0.902832f, 0.912109f, 0.918945f, 0.926758f, 0.933105f, - 0.938477f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.960449f, 0.963379f, 0.966797f, - 0.969238f, 0.972656f, 0.975098f, 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, - 0.986328f, 0.987305f, 0.994629f, 0.995605f, 0.995117f, 0.995117f, 0.995117f, 0.994629f, - 0.001187f, 0.004314f, 0.007740f, 0.011337f, 0.016373f, 0.021759f, 0.028198f, 0.035889f, - 0.045197f, 0.056580f, 0.069946f, 0.085938f, 0.105408f, 0.128784f, 0.155884f, 0.187866f, - 0.225830f, 0.268066f, 0.315186f, 0.365479f, 0.418213f, 0.471680f, 0.522949f, 0.572754f, - 0.617676f, 0.659668f, 0.697754f, 0.730957f, 0.760742f, 0.787109f, 0.809570f, 0.830078f, - 0.846680f, 0.862793f, 0.875488f, 0.888184f, 0.898926f, 0.907715f, 0.916016f, 0.923340f, - 0.930664f, 0.936523f, 0.941895f, 0.947754f, 0.951660f, 0.955566f, 0.959473f, 0.963867f, - 0.966309f, 0.969238f, 0.972168f, 0.974121f, 0.976562f, 0.979004f, 0.980957f, 0.982910f, - 0.984863f, 0.986816f, 0.994141f, 0.994629f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, - 0.001187f, 0.003733f, 0.006496f, 0.009918f, 0.013634f, 0.017899f, 0.023026f, 0.029343f, - 0.036621f, 0.045227f, 0.055786f, 0.068298f, 0.083740f, 0.101135f, 0.122314f, 0.147827f, - 0.177612f, 0.212891f, 0.252686f, 0.297119f, 0.345215f, 0.395996f, 0.448730f, 0.500488f, - 0.550781f, 0.597656f, 0.641113f, 0.680664f, 0.716309f, 0.747559f, 0.774414f, 0.799316f, - 0.820312f, 0.838867f, 0.855957f, 0.870117f, 0.883301f, 0.894531f, 0.904785f, 0.913086f, - 0.920898f, 0.928223f, 0.935059f, 0.940430f, 0.945312f, 0.950684f, 0.955566f, 0.958496f, - 0.962891f, 0.965820f, 0.968750f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980957f, - 0.982910f, 0.984863f, 0.994141f, 0.994141f, 0.994629f, 0.994141f, 0.994141f, 0.994629f, - 0.000998f, 0.003178f, 0.005444f, 0.008179f, 0.011337f, 0.015091f, 0.019058f, 0.024368f, - 0.029587f, 0.037140f, 0.045197f, 0.055115f, 0.066772f, 0.080688f, 0.097229f, 0.117371f, - 0.140869f, 0.169312f, 0.201538f, 0.238770f, 0.280762f, 0.326660f, 0.376709f, 0.427490f, - 0.479248f, 0.530273f, 0.578613f, 0.623535f, 0.664551f, 0.701660f, 0.733887f, 0.763672f, - 0.790039f, 0.812500f, 0.832520f, 0.849121f, 0.865234f, 0.878906f, 0.890625f, 0.901367f, - 0.910645f, 0.919434f, 0.926758f, 0.933105f, 0.939453f, 0.944824f, 0.949707f, 0.954590f, - 0.958008f, 0.961914f, 0.965332f, 0.968750f, 0.971680f, 0.974121f, 0.977051f, 0.979004f, - 0.980957f, 0.982910f, 0.993164f, 0.993164f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.000948f, 0.002638f, 0.004784f, 0.007153f, 0.009590f, 0.012505f, 0.016388f, 0.020599f, - 0.025299f, 0.031097f, 0.037323f, 0.045197f, 0.054047f, 0.065002f, 0.078674f, 0.094055f, - 0.112305f, 0.134399f, 0.160889f, 0.191040f, 0.226318f, 0.265869f, 0.310303f, 0.358154f, - 0.409180f, 0.459473f, 0.510254f, 0.559082f, 0.606445f, 0.648926f, 0.687500f, 0.722168f, - 0.753418f, 0.781250f, 0.804199f, 0.825684f, 0.843262f, 0.860840f, 0.874512f, 0.886719f, - 0.898926f, 0.907227f, 0.916992f, 0.924805f, 0.932129f, 0.937988f, 0.943848f, 0.949219f, - 0.954102f, 0.958496f, 0.961426f, 0.965332f, 0.968750f, 0.972168f, 0.974609f, 0.977051f, - 0.979492f, 0.981445f, 0.992188f, 0.993164f, 0.993164f, 0.993164f, 0.993164f, 0.992676f, - 0.000696f, 0.002352f, 0.004002f, 0.006138f, 0.008446f, 0.010826f, 0.013840f, 0.017258f, - 0.021194f, 0.025970f, 0.031128f, 0.037140f, 0.044281f, 0.053436f, 0.063660f, 0.076050f, - 0.090271f, 0.107727f, 0.128662f, 0.152832f, 0.182007f, 0.214111f, 0.252930f, 0.295166f, - 0.341553f, 0.390625f, 0.442139f, 0.492676f, 0.541992f, 0.589844f, 0.633301f, 0.674316f, - 0.710938f, 0.743652f, 0.772461f, 0.796875f, 0.819824f, 0.839355f, 0.854980f, 0.870605f, - 0.884277f, 0.895508f, 0.906738f, 0.915527f, 0.923828f, 0.931152f, 0.937500f, 0.944336f, - 0.949219f, 0.953613f, 0.958008f, 0.962402f, 0.965332f, 0.968750f, 0.972168f, 0.974609f, - 0.977051f, 0.979980f, 0.991211f, 0.992676f, 0.992188f, 0.992188f, 0.992188f, 0.992676f, - 0.000838f, 0.002033f, 0.003664f, 0.005077f, 0.007282f, 0.009415f, 0.011749f, 0.014931f, - 0.017853f, 0.021606f, 0.025864f, 0.031219f, 0.037231f, 0.044464f, 0.052338f, 0.062500f, - 0.073853f, 0.087463f, 0.104065f, 0.123230f, 0.146362f, 0.173340f, 0.205078f, 0.240845f, - 0.281982f, 0.326660f, 0.374756f, 0.425049f, 0.476807f, 0.526855f, 0.574219f, 0.620117f, - 0.662598f, 0.699219f, 0.733398f, 0.764160f, 0.791016f, 0.813965f, 0.833984f, 0.851074f, - 0.867676f, 0.880859f, 0.893555f, 0.904785f, 0.914062f, 0.922852f, 0.930176f, 0.937012f, - 0.942383f, 0.948242f, 0.953125f, 0.957520f, 0.962402f, 0.966309f, 0.969238f, 0.973145f, - 0.975098f, 0.978027f, 0.991699f, 0.991699f, 0.992676f, 0.992188f, 0.991699f, 0.992188f, - 0.000600f, 0.001687f, 0.003023f, 0.004963f, 0.006405f, 0.008163f, 0.010368f, 0.012718f, - 0.015480f, 0.018311f, 0.022064f, 0.026169f, 0.031097f, 0.036926f, 0.043457f, 0.051392f, - 0.060669f, 0.071350f, 0.084473f, 0.100220f, 0.118103f, 0.140259f, 0.166016f, 0.195679f, - 0.230469f, 0.269531f, 0.313232f, 0.360596f, 0.410156f, 0.460693f, 0.511719f, 0.560547f, - 0.607422f, 0.650879f, 0.689941f, 0.724609f, 0.756348f, 0.784180f, 0.808594f, 0.828613f, - 0.847656f, 0.864258f, 0.879395f, 0.892090f, 0.903320f, 0.912598f, 0.921875f, 0.929688f, - 0.936523f, 0.942871f, 0.947754f, 0.953125f, 0.957520f, 0.961914f, 0.966309f, 0.969238f, - 0.972656f, 0.975586f, 0.990234f, 0.991211f, 0.991211f, 0.991699f, 0.991211f, 0.991211f, - 0.000269f, 0.001538f, 0.002800f, 0.003868f, 0.005524f, 0.007179f, 0.008987f, 0.011063f, - 0.013084f, 0.015747f, 0.019211f, 0.022324f, 0.026474f, 0.031311f, 0.036530f, 0.042969f, - 0.050201f, 0.059174f, 0.069641f, 0.081543f, 0.096680f, 0.114075f, 0.134644f, 0.158691f, - 0.187622f, 0.220581f, 0.258301f, 0.300781f, 0.347168f, 0.395996f, 0.447266f, 0.498291f, - 0.547852f, 0.595215f, 0.640625f, 0.680176f, 0.717285f, 0.749512f, 0.778320f, 0.803223f, - 0.825684f, 0.845215f, 0.862793f, 0.877441f, 0.890625f, 0.901855f, 0.912109f, 0.920898f, - 0.929688f, 0.937012f, 0.942871f, 0.949707f, 0.954102f, 0.958496f, 0.962402f, 0.966309f, - 0.970215f, 0.974121f, 0.989746f, 0.990234f, 0.990723f, 0.990723f, 0.990723f, 0.990234f, - 0.000341f, 0.001337f, 0.002573f, 0.003475f, 0.004765f, 0.006329f, 0.007717f, 0.009499f, - 0.011642f, 0.014107f, 0.016556f, 0.019470f, 0.022491f, 0.026169f, 0.030945f, 0.036011f, - 0.042389f, 0.049042f, 0.057678f, 0.067993f, 0.079468f, 0.093384f, 0.110046f, 0.129883f, - 0.152710f, 0.180420f, 0.212158f, 0.248291f, 0.289551f, 0.334961f, 0.383301f, 0.434570f, - 0.485596f, 0.536133f, 0.584473f, 0.630371f, 0.671875f, 0.710449f, 0.743652f, 0.773926f, - 0.799316f, 0.823242f, 0.843262f, 0.860352f, 0.875977f, 0.889648f, 0.901367f, 0.911621f, - 0.921387f, 0.929688f, 0.937012f, 0.943848f, 0.950195f, 0.955078f, 0.959473f, 0.963379f, - 0.967773f, 0.971191f, 0.988770f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.990234f, - 0.000564f, 0.001324f, 0.002092f, 0.003191f, 0.004471f, 0.005348f, 0.007069f, 0.008438f, - 0.010201f, 0.011810f, 0.014297f, 0.016586f, 0.019470f, 0.022644f, 0.026428f, 0.030579f, - 0.035797f, 0.041718f, 0.048248f, 0.056213f, 0.065857f, 0.076782f, 0.090271f, 0.106262f, - 0.125122f, 0.147095f, 0.173462f, 0.204224f, 0.239746f, 0.279785f, 0.323730f, 0.372314f, - 0.422607f, 0.474121f, 0.526367f, 0.575195f, 0.621582f, 0.664062f, 0.703613f, 0.738770f, - 0.769043f, 0.796387f, 0.820312f, 0.841797f, 0.858887f, 0.875488f, 0.889648f, 0.900879f, - 0.912598f, 0.921875f, 0.930664f, 0.937500f, 0.944336f, 0.950195f, 0.955566f, 0.959961f, - 0.964844f, 0.968750f, 0.987305f, 0.989258f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, - 0.000369f, 0.001128f, 0.001871f, 0.002792f, 0.003712f, 0.004723f, 0.006016f, 0.007542f, - 0.008896f, 0.010773f, 0.012421f, 0.014381f, 0.016632f, 0.019791f, 0.022354f, 0.025955f, - 0.030609f, 0.035065f, 0.040924f, 0.047333f, 0.055084f, 0.064209f, 0.075012f, 0.087769f, - 0.102966f, 0.120911f, 0.142456f, 0.167358f, 0.197144f, 0.231812f, 0.270752f, 0.314209f, - 0.362549f, 0.412598f, 0.464844f, 0.515625f, 0.566895f, 0.614258f, 0.657715f, 0.698730f, - 0.734863f, 0.766602f, 0.794922f, 0.818848f, 0.839844f, 0.858887f, 0.875000f, 0.889648f, - 0.901855f, 0.912598f, 0.922852f, 0.931152f, 0.938965f, 0.945312f, 0.951660f, 0.957520f, - 0.961426f, 0.966309f, 0.986816f, 0.988281f, 0.988281f, 0.988770f, 0.988281f, 0.988281f, - 0.000466f, 0.000900f, 0.001792f, 0.002695f, 0.003458f, 0.004204f, 0.005356f, 0.006512f, - 0.007896f, 0.009300f, 0.010895f, 0.012459f, 0.014786f, 0.016739f, 0.019424f, 0.022461f, - 0.026062f, 0.029831f, 0.034851f, 0.039764f, 0.046417f, 0.053711f, 0.062164f, 0.072388f, - 0.085205f, 0.099365f, 0.117004f, 0.137573f, 0.162231f, 0.190674f, 0.224121f, 0.262451f, - 0.305664f, 0.353027f, 0.403809f, 0.456055f, 0.508301f, 0.559082f, 0.608398f, 0.652832f, - 0.694824f, 0.731445f, 0.764160f, 0.793945f, 0.817871f, 0.839355f, 0.858398f, 0.875488f, - 0.890137f, 0.902832f, 0.913574f, 0.923828f, 0.932617f, 0.940918f, 0.946777f, 0.953613f, - 0.958984f, 0.963379f, 0.985840f, 0.987305f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, - 0.000234f, 0.001040f, 0.001661f, 0.002392f, 0.003101f, 0.003681f, 0.004944f, 0.005844f, - 0.007065f, 0.008217f, 0.009247f, 0.010925f, 0.012894f, 0.014549f, 0.017090f, 0.019455f, - 0.022385f, 0.025650f, 0.029449f, 0.033936f, 0.039215f, 0.045135f, 0.052612f, 0.060944f, - 0.070312f, 0.082397f, 0.096924f, 0.113525f, 0.133179f, 0.156860f, 0.184814f, 0.217773f, - 0.255127f, 0.298340f, 0.345215f, 0.395996f, 0.448242f, 0.501953f, 0.553223f, 0.603516f, - 0.649414f, 0.691895f, 0.729980f, 0.763184f, 0.792480f, 0.818359f, 0.841309f, 0.858887f, - 0.877441f, 0.891113f, 0.904785f, 0.915527f, 0.925781f, 0.933594f, 0.941895f, 0.949219f, - 0.955566f, 0.960449f, 0.984863f, 0.985840f, 0.986328f, 0.986816f, 0.986328f, 0.986816f, - 0.000241f, 0.000808f, 0.001395f, 0.001986f, 0.002731f, 0.003429f, 0.004131f, 0.005402f, - 0.006077f, 0.007347f, 0.008522f, 0.009544f, 0.011345f, 0.013046f, 0.014534f, 0.016953f, - 0.019241f, 0.022339f, 0.025208f, 0.029175f, 0.033691f, 0.038300f, 0.044067f, 0.051331f, - 0.059143f, 0.068726f, 0.080322f, 0.093567f, 0.109802f, 0.129883f, 0.152466f, 0.179810f, - 0.211792f, 0.249390f, 0.291748f, 0.338623f, 0.389404f, 0.442139f, 0.496338f, 0.548340f, - 0.599121f, 0.645996f, 0.689941f, 0.728516f, 0.762695f, 0.792969f, 0.818848f, 0.842285f, - 0.862793f, 0.878906f, 0.894043f, 0.906250f, 0.917969f, 0.927734f, 0.935547f, 0.944336f, - 0.951172f, 0.957031f, 0.983398f, 0.985352f, 0.985840f, 0.985352f, 0.985840f, 0.985352f, - 0.000340f, 0.000735f, 0.001377f, 0.001853f, 0.002382f, 0.003159f, 0.004021f, 0.004642f, - 0.005604f, 0.006340f, 0.007298f, 0.008591f, 0.009895f, 0.011154f, 0.012871f, 0.014580f, - 0.016876f, 0.019180f, 0.022141f, 0.024979f, 0.028748f, 0.032745f, 0.037964f, 0.043213f, - 0.050171f, 0.057831f, 0.066833f, 0.078247f, 0.091553f, 0.107178f, 0.125977f, 0.148315f, - 0.175415f, 0.207153f, 0.244019f, 0.286377f, 0.333008f, 0.383789f, 0.437744f, 0.491943f, - 0.545410f, 0.597168f, 0.645508f, 0.688965f, 0.729004f, 0.764160f, 0.794434f, 0.821289f, - 0.843750f, 0.864258f, 0.881348f, 0.895996f, 0.909180f, 0.920898f, 0.929199f, 0.938965f, - 0.946777f, 0.952637f, 0.982910f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.984863f, - 0.000236f, 0.000605f, 0.001135f, 0.001415f, 0.002329f, 0.002747f, 0.003551f, 0.004158f, - 0.004723f, 0.005535f, 0.006687f, 0.007534f, 0.008545f, 0.009979f, 0.011375f, 0.012993f, - 0.014656f, 0.016754f, 0.018921f, 0.021759f, 0.024506f, 0.028183f, 0.032043f, 0.036743f, - 0.042236f, 0.048645f, 0.056030f, 0.065125f, 0.075928f, 0.089050f, 0.104370f, 0.122681f, - 0.145142f, 0.171509f, 0.202759f, 0.239258f, 0.281250f, 0.328369f, 0.379639f, 0.433838f, - 0.489014f, 0.543945f, 0.596191f, 0.645020f, 0.690430f, 0.730957f, 0.766113f, 0.797852f, - 0.824219f, 0.846680f, 0.867188f, 0.884766f, 0.899414f, 0.912109f, 0.923828f, 0.933105f, - 0.942383f, 0.949707f, 0.980957f, 0.982910f, 0.983398f, 0.983398f, 0.983887f, 0.982910f, - 0.000214f, 0.000710f, 0.001021f, 0.001429f, 0.001858f, 0.002607f, 0.003220f, 0.003738f, - 0.004459f, 0.005032f, 0.005726f, 0.006748f, 0.007748f, 0.008659f, 0.010002f, 0.011368f, - 0.012985f, 0.014656f, 0.016525f, 0.018921f, 0.021286f, 0.024231f, 0.027649f, 0.031464f, - 0.035858f, 0.041321f, 0.047363f, 0.054840f, 0.063538f, 0.074097f, 0.086609f, 0.101990f, - 0.120117f, 0.141846f, 0.168213f, 0.199219f, 0.235352f, 0.277344f, 0.324707f, 0.376953f, - 0.432373f, 0.488037f, 0.543457f, 0.597168f, 0.646973f, 0.692871f, 0.732910f, 0.769531f, - 0.801270f, 0.828125f, 0.850586f, 0.871582f, 0.888184f, 0.903809f, 0.915527f, 0.927246f, - 0.936523f, 0.946289f, 0.979492f, 0.981445f, 0.981934f, 0.982422f, 0.981934f, 0.981934f, - 0.000000f, 0.000468f, 0.001076f, 0.001489f, 0.002048f, 0.002413f, 0.002853f, 0.003468f, - 0.003952f, 0.004444f, 0.005211f, 0.005917f, 0.006733f, 0.007763f, 0.008713f, 0.010262f, - 0.011368f, 0.012733f, 0.014458f, 0.016296f, 0.018478f, 0.021072f, 0.023666f, 0.026810f, - 0.030746f, 0.035278f, 0.040131f, 0.046295f, 0.053711f, 0.062195f, 0.072327f, 0.084717f, - 0.099487f, 0.117371f, 0.139038f, 0.164795f, 0.195923f, 0.232422f, 0.274414f, 0.322266f, - 0.374756f, 0.431641f, 0.488525f, 0.545410f, 0.599121f, 0.650879f, 0.697754f, 0.738770f, - 0.774414f, 0.806641f, 0.832520f, 0.856445f, 0.875488f, 0.893555f, 0.907715f, 0.920410f, - 0.931152f, 0.940918f, 0.978027f, 0.980469f, 0.980469f, 0.980957f, 0.980957f, 0.980957f, - 0.000279f, 0.000497f, 0.000763f, 0.001353f, 0.001794f, 0.002079f, 0.002451f, 0.002956f, - 0.003498f, 0.004150f, 0.004589f, 0.005310f, 0.006130f, 0.006958f, 0.007828f, 0.008888f, - 0.009895f, 0.011124f, 0.012772f, 0.014282f, 0.016235f, 0.018127f, 0.020630f, 0.022873f, - 0.026321f, 0.029938f, 0.034241f, 0.039368f, 0.045319f, 0.052338f, 0.060852f, 0.070801f, - 0.082947f, 0.097595f, 0.115051f, 0.136353f, 0.162231f, 0.193481f, 0.229858f, 0.272217f, - 0.321777f, 0.375000f, 0.432373f, 0.490479f, 0.548340f, 0.604004f, 0.655762f, 0.702637f, - 0.743652f, 0.780273f, 0.812500f, 0.838867f, 0.862305f, 0.881348f, 0.897949f, 0.912598f, - 0.925293f, 0.935547f, 0.976562f, 0.978516f, 0.979492f, 0.979980f, 0.979492f, 0.979004f, - 0.000110f, 0.000473f, 0.000781f, 0.001262f, 0.001584f, 0.001890f, 0.002270f, 0.002607f, - 0.003241f, 0.003704f, 0.004055f, 0.004795f, 0.005356f, 0.005997f, 0.006760f, 0.007896f, - 0.008896f, 0.009918f, 0.011200f, 0.012451f, 0.013802f, 0.015556f, 0.017838f, 0.020065f, - 0.022751f, 0.025864f, 0.029358f, 0.033600f, 0.038574f, 0.044342f, 0.050995f, 0.059296f, - 0.069214f, 0.081116f, 0.095459f, 0.113159f, 0.133911f, 0.160400f, 0.191406f, 0.228638f, - 0.272217f, 0.321289f, 0.375732f, 0.434326f, 0.493896f, 0.552734f, 0.609863f, 0.662109f, - 0.709961f, 0.750977f, 0.787598f, 0.819336f, 0.846680f, 0.868164f, 0.887695f, 0.904297f, - 0.917969f, 0.930176f, 0.975098f, 0.977539f, 0.977051f, 0.977539f, 0.977539f, 0.977539f, - 0.000242f, 0.000464f, 0.000831f, 0.001027f, 0.001271f, 0.001722f, 0.001965f, 0.002243f, - 0.002714f, 0.003036f, 0.003651f, 0.004025f, 0.004902f, 0.005638f, 0.006176f, 0.006943f, - 0.007763f, 0.008789f, 0.009804f, 0.010872f, 0.012070f, 0.013695f, 0.015381f, 0.017395f, - 0.019608f, 0.022232f, 0.025009f, 0.028885f, 0.032623f, 0.037659f, 0.043182f, 0.050018f, - 0.058167f, 0.067810f, 0.079224f, 0.093811f, 0.111328f, 0.132324f, 0.158569f, 0.190063f, - 0.228149f, 0.271973f, 0.322510f, 0.378906f, 0.438477f, 0.499756f, 0.560059f, 0.618164f, - 0.671387f, 0.718750f, 0.760742f, 0.796875f, 0.826660f, 0.854492f, 0.875000f, 0.894531f, - 0.911133f, 0.923828f, 0.973145f, 0.976074f, 0.975586f, 0.976074f, 0.976074f, 0.977051f, - 0.000242f, 0.000552f, 0.000701f, 0.001063f, 0.001186f, 0.001462f, 0.001690f, 0.002340f, - 0.002703f, 0.002728f, 0.003325f, 0.003828f, 0.004333f, 0.004913f, 0.005474f, 0.006077f, - 0.006943f, 0.007607f, 0.008553f, 0.009460f, 0.010582f, 0.011871f, 0.013451f, 0.015091f, - 0.016983f, 0.019165f, 0.021637f, 0.024673f, 0.027863f, 0.031525f, 0.036713f, 0.041962f, - 0.048615f, 0.056396f, 0.066162f, 0.077942f, 0.092590f, 0.110046f, 0.130981f, 0.157593f, - 0.189331f, 0.228394f, 0.273926f, 0.325684f, 0.383301f, 0.444580f, 0.507324f, 0.569824f, - 0.627441f, 0.682129f, 0.729980f, 0.770508f, 0.807129f, 0.837402f, 0.863281f, 0.884766f, - 0.902832f, 0.917969f, 0.971191f, 0.973633f, 0.974609f, 0.974121f, 0.974609f, 0.974609f, - 0.000239f, 0.000239f, 0.000658f, 0.000899f, 0.001204f, 0.001252f, 0.001629f, 0.001815f, - 0.002470f, 0.002430f, 0.003134f, 0.003321f, 0.003925f, 0.004238f, 0.004856f, 0.005341f, - 0.006161f, 0.006615f, 0.007511f, 0.008224f, 0.009277f, 0.010445f, 0.011818f, 0.013046f, - 0.014473f, 0.016510f, 0.018814f, 0.021057f, 0.023834f, 0.027237f, 0.030853f, 0.035675f, - 0.040894f, 0.047241f, 0.055145f, 0.064758f, 0.076782f, 0.090942f, 0.108398f, 0.130371f, - 0.157104f, 0.189819f, 0.229248f, 0.276367f, 0.329834f, 0.390137f, 0.453125f, 0.517578f, - 0.580566f, 0.640625f, 0.694336f, 0.741699f, 0.782715f, 0.817871f, 0.848145f, 0.872559f, - 0.893555f, 0.910645f, 0.969727f, 0.971191f, 0.972656f, 0.972168f, 0.972168f, 0.972168f, - 0.000222f, 0.000463f, 0.000620f, 0.000837f, 0.000900f, 0.001048f, 0.001381f, 0.001820f, - 0.001957f, 0.002329f, 0.002747f, 0.002964f, 0.003330f, 0.003986f, 0.004322f, 0.004677f, - 0.005302f, 0.005760f, 0.006569f, 0.007359f, 0.008141f, 0.009293f, 0.010101f, 0.011452f, - 0.012779f, 0.014496f, 0.016144f, 0.018097f, 0.020157f, 0.023148f, 0.026611f, 0.029785f, - 0.034515f, 0.039856f, 0.046478f, 0.054016f, 0.063843f, 0.075378f, 0.089233f, 0.107666f, - 0.129639f, 0.156860f, 0.190674f, 0.231445f, 0.280518f, 0.336426f, 0.398193f, 0.463379f, - 0.530273f, 0.595215f, 0.654785f, 0.708984f, 0.755371f, 0.796875f, 0.831543f, 0.860352f, - 0.883789f, 0.903809f, 0.966797f, 0.968750f, 0.969727f, 0.970215f, 0.970215f, 0.969727f, - 0.000000f, 0.000345f, 0.000464f, 0.000686f, 0.000782f, 0.001030f, 0.001139f, 0.001598f, - 0.001846f, 0.002237f, 0.002489f, 0.002684f, 0.003067f, 0.003344f, 0.003895f, 0.004158f, - 0.004845f, 0.005131f, 0.005886f, 0.006561f, 0.007195f, 0.007912f, 0.008965f, 0.009941f, - 0.010956f, 0.012383f, 0.013893f, 0.015602f, 0.017303f, 0.019623f, 0.022156f, 0.025452f, - 0.028976f, 0.033722f, 0.038910f, 0.045288f, 0.052887f, 0.062561f, 0.074097f, 0.088623f, - 0.106812f, 0.129639f, 0.157715f, 0.192261f, 0.235107f, 0.285889f, 0.344482f, 0.408691f, - 0.476807f, 0.545410f, 0.610840f, 0.671387f, 0.725098f, 0.771484f, 0.811035f, 0.843750f, - 0.871582f, 0.894043f, 0.964355f, 0.967285f, 0.967285f, 0.967773f, 0.967773f, 0.967773f, - 0.000000f, 0.000320f, 0.000576f, 0.000572f, 0.000767f, 0.000945f, 0.001066f, 0.001375f, - 0.001848f, 0.001980f, 0.002190f, 0.002399f, 0.002695f, 0.002943f, 0.003397f, 0.003664f, - 0.004063f, 0.004566f, 0.005119f, 0.005688f, 0.006130f, 0.007057f, 0.007778f, 0.008675f, - 0.009590f, 0.010666f, 0.011971f, 0.013443f, 0.015129f, 0.016953f, 0.018875f, 0.021576f, - 0.024658f, 0.028488f, 0.032959f, 0.037811f, 0.043793f, 0.051819f, 0.061371f, 0.073181f, - 0.088257f, 0.106506f, 0.129883f, 0.159180f, 0.195679f, 0.240479f, 0.293457f, 0.355225f, - 0.422852f, 0.492432f, 0.563477f, 0.629883f, 0.690918f, 0.743652f, 0.789062f, 0.827148f, - 0.858398f, 0.884277f, 0.961914f, 0.964844f, 0.964355f, 0.964844f, 0.964355f, 0.965332f, - 0.000000f, 0.000242f, 0.000435f, 0.000547f, 0.000688f, 0.000803f, 0.001175f, 0.001318f, - 0.001593f, 0.001652f, 0.001961f, 0.002209f, 0.002481f, 0.002716f, 0.002911f, 0.003210f, - 0.003595f, 0.004005f, 0.004490f, 0.004894f, 0.005508f, 0.006107f, 0.006714f, 0.007462f, - 0.008438f, 0.009277f, 0.010170f, 0.011436f, 0.012756f, 0.014145f, 0.016205f, 0.018433f, - 0.020966f, 0.023819f, 0.027405f, 0.031464f, 0.036713f, 0.043152f, 0.050842f, 0.060577f, - 0.071960f, 0.087219f, 0.106689f, 0.130371f, 0.161377f, 0.199585f, 0.246948f, 0.303467f, - 0.367920f, 0.439697f, 0.512207f, 0.584473f, 0.651855f, 0.712402f, 0.764160f, 0.808105f, - 0.844727f, 0.875000f, 0.958008f, 0.961426f, 0.961914f, 0.961914f, 0.962402f, 0.961914f, - 0.000000f, 0.000237f, 0.000266f, 0.000387f, 0.000557f, 0.000691f, 0.000774f, 0.001221f, - 0.001455f, 0.001492f, 0.001769f, 0.001896f, 0.002151f, 0.002386f, 0.002529f, 0.002911f, - 0.003147f, 0.003523f, 0.003862f, 0.004311f, 0.004848f, 0.005260f, 0.005795f, 0.006416f, - 0.007114f, 0.007942f, 0.008667f, 0.009666f, 0.010818f, 0.012184f, 0.013718f, 0.015541f, - 0.017685f, 0.020126f, 0.023056f, 0.026306f, 0.030853f, 0.035797f, 0.042053f, 0.049683f, - 0.059784f, 0.072144f, 0.086914f, 0.106873f, 0.132202f, 0.164429f, 0.205200f, 0.255615f, - 0.315918f, 0.384521f, 0.458984f, 0.534668f, 0.607910f, 0.676758f, 0.735840f, 0.785645f, - 0.828125f, 0.862305f, 0.955566f, 0.958008f, 0.958984f, 0.958496f, 0.958984f, 0.958984f, - 0.000000f, 0.000119f, 0.000234f, 0.000484f, 0.000603f, 0.000758f, 0.000934f, 0.000999f, - 0.001200f, 0.001343f, 0.001534f, 0.001725f, 0.001860f, 0.002056f, 0.002235f, 0.002445f, - 0.002783f, 0.003115f, 0.003448f, 0.003757f, 0.004192f, 0.004723f, 0.005077f, 0.005653f, - 0.006172f, 0.006527f, 0.007328f, 0.008247f, 0.009140f, 0.010368f, 0.011711f, 0.013351f, - 0.014702f, 0.016937f, 0.019226f, 0.022156f, 0.025604f, 0.029877f, 0.034668f, 0.040710f, - 0.048920f, 0.058624f, 0.071289f, 0.087219f, 0.107727f, 0.134521f, 0.168701f, 0.212769f, - 0.267090f, 0.331543f, 0.404785f, 0.482910f, 0.561523f, 0.635742f, 0.702637f, 0.760742f, - 0.809570f, 0.849121f, 0.951660f, 0.954590f, 0.955566f, 0.955566f, 0.956055f, 0.955566f, - 0.000238f, 0.000218f, 0.000229f, 0.000242f, 0.000313f, 0.000859f, 0.000623f, 0.000978f, - 0.001021f, 0.001150f, 0.001320f, 0.001431f, 0.001546f, 0.001746f, 0.001895f, 0.002106f, - 0.002502f, 0.002630f, 0.002926f, 0.003296f, 0.003651f, 0.003918f, 0.004391f, 0.004910f, - 0.005249f, 0.005558f, 0.006413f, 0.007114f, 0.007866f, 0.008789f, 0.009872f, 0.011093f, - 0.012413f, 0.013939f, 0.015945f, 0.018692f, 0.021225f, 0.024643f, 0.028687f, 0.033936f, - 0.040192f, 0.047791f, 0.058014f, 0.070923f, 0.087585f, 0.109131f, 0.137573f, 0.174683f, - 0.222290f, 0.280762f, 0.350830f, 0.428955f, 0.511230f, 0.592285f, 0.666992f, 0.733398f, - 0.789062f, 0.834473f, 0.947754f, 0.951172f, 0.951660f, 0.951172f, 0.951660f, 0.951172f, - 0.000000f, 0.000205f, 0.000222f, 0.000344f, 0.000301f, 0.000775f, 0.000827f, 0.000719f, - 0.000944f, 0.000976f, 0.001306f, 0.001249f, 0.001404f, 0.001569f, 0.001604f, 0.001819f, - 0.002182f, 0.002354f, 0.002569f, 0.002857f, 0.003113f, 0.003426f, 0.003649f, 0.004112f, - 0.004307f, 0.004925f, 0.005508f, 0.005802f, 0.006565f, 0.007450f, 0.008125f, 0.009079f, - 0.010269f, 0.011665f, 0.013565f, 0.015213f, 0.017410f, 0.020203f, 0.023743f, 0.028168f, - 0.032684f, 0.039062f, 0.047058f, 0.057404f, 0.070984f, 0.088623f, 0.111389f, 0.142090f, - 0.182373f, 0.234253f, 0.298828f, 0.375000f, 0.458008f, 0.543945f, 0.627441f, 0.702148f, - 0.765137f, 0.818359f, 0.942871f, 0.946289f, 0.947266f, 0.947266f, 0.946777f, 0.947266f, - 0.000064f, 0.000095f, 0.000197f, 0.000213f, 0.000459f, 0.000491f, 0.000647f, 0.000696f, - 0.000884f, 0.000911f, 0.001121f, 0.001115f, 0.001234f, 0.001371f, 0.001410f, 0.001743f, - 0.001905f, 0.002016f, 0.002207f, 0.002438f, 0.002714f, 0.002939f, 0.003183f, 0.003323f, - 0.003727f, 0.004143f, 0.004555f, 0.005276f, 0.005531f, 0.006264f, 0.006702f, 0.007572f, - 0.008705f, 0.009712f, 0.011238f, 0.012650f, 0.014320f, 0.016815f, 0.019516f, 0.022400f, - 0.026566f, 0.031799f, 0.038055f, 0.046417f, 0.057037f, 0.071350f, 0.089722f, 0.114868f, - 0.148193f, 0.192749f, 0.249878f, 0.321045f, 0.404053f, 0.493408f, 0.583008f, 0.666016f, - 0.739258f, 0.799316f, 0.937988f, 0.941406f, 0.941895f, 0.942383f, 0.942383f, 0.942383f, - 0.000000f, 0.000007f, 0.000144f, 0.000427f, 0.000443f, 0.000566f, 0.000589f, 0.000615f, - 0.000725f, 0.000731f, 0.000896f, 0.000953f, 0.001062f, 0.001167f, 0.001344f, 0.001345f, - 0.001636f, 0.001774f, 0.001893f, 0.002069f, 0.002350f, 0.002457f, 0.002678f, 0.002743f, - 0.003105f, 0.003513f, 0.003830f, 0.004227f, 0.004589f, 0.005047f, 0.005669f, 0.006176f, - 0.007153f, 0.007896f, 0.008911f, 0.010231f, 0.011818f, 0.013618f, 0.015465f, 0.018188f, - 0.021576f, 0.025452f, 0.030533f, 0.037048f, 0.045685f, 0.056915f, 0.071533f, 0.091675f, - 0.118958f, 0.156006f, 0.205444f, 0.270020f, 0.349609f, 0.439941f, 0.533691f, 0.625977f, - 0.708984f, 0.778320f, 0.931641f, 0.936035f, 0.936523f, 0.937012f, 0.937012f, 0.937012f, - 0.000000f, 0.000000f, 0.000137f, 0.000262f, 0.000432f, 0.000437f, 0.000444f, 0.000590f, - 0.000558f, 0.000606f, 0.000817f, 0.000877f, 0.000909f, 0.000951f, 0.001191f, 0.001244f, - 0.001373f, 0.001506f, 0.001702f, 0.001690f, 0.001955f, 0.001940f, 0.002283f, 0.002340f, - 0.002571f, 0.002871f, 0.003265f, 0.003475f, 0.003910f, 0.004181f, 0.004608f, 0.005112f, - 0.005833f, 0.006416f, 0.007145f, 0.008209f, 0.009636f, 0.010750f, 0.012642f, 0.014481f, - 0.017197f, 0.020203f, 0.024353f, 0.029694f, 0.036041f, 0.045105f, 0.056702f, 0.072388f, - 0.094482f, 0.124329f, 0.166504f, 0.223022f, 0.295898f, 0.384766f, 0.482910f, 0.582031f, - 0.675293f, 0.754883f, 0.926270f, 0.929688f, 0.930664f, 0.930664f, 0.931152f, 0.930664f, - 0.000000f, 0.000000f, 0.000000f, 0.000232f, 0.000357f, 0.000411f, 0.000513f, 0.000527f, - 0.000490f, 0.000504f, 0.000653f, 0.000750f, 0.000780f, 0.000976f, 0.000942f, 0.000967f, - 0.001180f, 0.001252f, 0.001385f, 0.001425f, 0.001559f, 0.001801f, 0.001886f, 0.002144f, - 0.002111f, 0.002354f, 0.002645f, 0.002827f, 0.003187f, 0.003414f, 0.003792f, 0.004360f, - 0.004662f, 0.005146f, 0.005875f, 0.006783f, 0.007610f, 0.008797f, 0.010033f, 0.011566f, - 0.013565f, 0.016006f, 0.019165f, 0.023163f, 0.028320f, 0.035400f, 0.044647f, 0.057129f, - 0.074402f, 0.098572f, 0.132812f, 0.180542f, 0.245728f, 0.330078f, 0.428955f, 0.535156f, - 0.638184f, 0.728516f, 0.919434f, 0.922852f, 0.923828f, 0.923828f, 0.923828f, 0.924316f, - 0.000000f, 0.000000f, 0.000000f, 0.000114f, 0.000248f, 0.000359f, 0.000386f, 0.000342f, - 0.000465f, 0.000461f, 0.000490f, 0.000609f, 0.000638f, 0.000694f, 0.000807f, 0.000923f, - 0.000961f, 0.001074f, 0.001123f, 0.001268f, 0.001311f, 0.001494f, 0.001537f, 0.001754f, - 0.001899f, 0.001917f, 0.002199f, 0.002241f, 0.002583f, 0.002769f, 0.003101f, 0.003441f, - 0.003775f, 0.004200f, 0.004787f, 0.005272f, 0.006062f, 0.006702f, 0.007732f, 0.009102f, - 0.010582f, 0.012466f, 0.014984f, 0.017990f, 0.021957f, 0.027222f, 0.034332f, 0.044128f, - 0.057434f, 0.076538f, 0.104126f, 0.143799f, 0.199829f, 0.275879f, 0.373047f, 0.482422f, - 0.594727f, 0.698730f, 0.910645f, 0.914551f, 0.916504f, 0.916016f, 0.916504f, 0.915527f, - 0.000000f, 0.000000f, 0.000000f, 0.000121f, 0.000221f, 0.000222f, 0.000392f, 0.000402f, - 0.000396f, 0.000434f, 0.000476f, 0.000548f, 0.000536f, 0.000644f, 0.000642f, 0.000793f, - 0.000795f, 0.000912f, 0.000953f, 0.000989f, 0.001164f, 0.001197f, 0.001285f, 0.001480f, - 0.001511f, 0.001674f, 0.001703f, 0.001901f, 0.002075f, 0.002340f, 0.002499f, 0.002800f, - 0.003019f, 0.003296f, 0.003695f, 0.004093f, 0.004780f, 0.005260f, 0.006207f, 0.006939f, - 0.008034f, 0.009598f, 0.011353f, 0.013702f, 0.016678f, 0.020874f, 0.026062f, 0.033539f, - 0.044006f, 0.058746f, 0.080139f, 0.111877f, 0.158447f, 0.226318f, 0.317627f, 0.428711f, - 0.548828f, 0.665039f, 0.901367f, 0.907227f, 0.907715f, 0.908203f, 0.908203f, 0.907227f, - 0.000000f, 0.000000f, 0.000122f, 0.000173f, 0.000191f, 0.000215f, 0.000224f, 0.000261f, - 0.000340f, 0.000374f, 0.000380f, 0.000496f, 0.000416f, 0.000535f, 0.000592f, 0.000622f, - 0.000701f, 0.000772f, 0.000742f, 0.000774f, 0.000990f, 0.000945f, 0.001088f, 0.001105f, - 0.001348f, 0.001231f, 0.001460f, 0.001620f, 0.001758f, 0.001941f, 0.002008f, 0.002092f, - 0.002430f, 0.002615f, 0.002886f, 0.003208f, 0.003519f, 0.004112f, 0.004704f, 0.005371f, - 0.006149f, 0.007351f, 0.008659f, 0.010201f, 0.012550f, 0.015549f, 0.019577f, 0.025436f, - 0.032928f, 0.044220f, 0.060608f, 0.084961f, 0.123474f, 0.180664f, 0.263184f, 0.372314f, - 0.498291f, 0.626465f, 0.892578f, 0.895996f, 0.896973f, 0.896973f, 0.897949f, 0.897949f, - 0.000000f, 0.000000f, 0.000121f, 0.000121f, 0.000120f, 0.000192f, 0.000201f, 0.000222f, - 0.000222f, 0.000276f, 0.000295f, 0.000344f, 0.000433f, 0.000470f, 0.000485f, 0.000549f, - 0.000555f, 0.000558f, 0.000566f, 0.000639f, 0.000678f, 0.000757f, 0.000840f, 0.000905f, - 0.000999f, 0.000946f, 0.001018f, 0.001309f, 0.001402f, 0.001417f, 0.001624f, 0.001692f, - 0.001869f, 0.002003f, 0.002184f, 0.002602f, 0.002851f, 0.003157f, 0.003595f, 0.004063f, - 0.004734f, 0.005398f, 0.006275f, 0.007542f, 0.009148f, 0.011383f, 0.014275f, 0.018250f, - 0.024063f, 0.032135f, 0.044922f, 0.063721f, 0.093811f, 0.139648f, 0.211914f, 0.314697f, - 0.444092f, 0.584961f, 0.879883f, 0.884766f, 0.885254f, 0.885742f, 0.886230f, 0.885742f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000120f, 0.000154f, 0.000150f, 0.000160f, - 0.000202f, 0.000217f, 0.000308f, 0.000319f, 0.000278f, 0.000392f, 0.000362f, 0.000432f, - 0.000416f, 0.000448f, 0.000495f, 0.000526f, 0.000710f, 0.000754f, 0.000657f, 0.000755f, - 0.000806f, 0.000919f, 0.000815f, 0.001080f, 0.001152f, 0.001207f, 0.001218f, 0.001373f, - 0.001320f, 0.001685f, 0.001764f, 0.001819f, 0.002068f, 0.002380f, 0.002668f, 0.003033f, - 0.003584f, 0.003979f, 0.004829f, 0.005402f, 0.006630f, 0.008080f, 0.010254f, 0.013069f, - 0.017044f, 0.023422f, 0.031647f, 0.046417f, 0.068604f, 0.104919f, 0.165161f, 0.258789f, - 0.387207f, 0.537598f, 0.867188f, 0.871582f, 0.872559f, 0.872559f, 0.872559f, 0.873047f, - 0.000000f, 0.000121f, 0.000120f, 0.000120f, 0.000119f, 0.000118f, 0.000122f, 0.000108f, - 0.000143f, 0.000149f, 0.000184f, 0.000194f, 0.000189f, 0.000210f, 0.000321f, 0.000282f, - 0.000376f, 0.000420f, 0.000533f, 0.000437f, 0.000467f, 0.000477f, 0.000587f, 0.000519f, - 0.000673f, 0.000662f, 0.000679f, 0.000845f, 0.000881f, 0.000863f, 0.001016f, 0.001093f, - 0.001176f, 0.001191f, 0.001336f, 0.001561f, 0.001573f, 0.001754f, 0.001919f, 0.002264f, - 0.002596f, 0.002911f, 0.003372f, 0.003870f, 0.004723f, 0.005733f, 0.007092f, 0.008965f, - 0.011650f, 0.015701f, 0.022339f, 0.032043f, 0.048370f, 0.076050f, 0.124084f, 0.204834f, - 0.328369f, 0.485596f, 0.852539f, 0.856934f, 0.858887f, 0.858887f, 0.858887f, 0.858398f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, - 0.000105f, 0.000110f, 0.000165f, 0.000133f, 0.000157f, 0.000240f, 0.000256f, 0.000257f, - 0.000249f, 0.000303f, 0.000342f, 0.000346f, 0.000485f, 0.000510f, 0.000398f, 0.000493f, - 0.000492f, 0.000524f, 0.000590f, 0.000585f, 0.000601f, 0.000740f, 0.000647f, 0.000871f, - 0.000834f, 0.000969f, 0.001020f, 0.001190f, 0.001244f, 0.001432f, 0.001393f, 0.001702f, - 0.001912f, 0.002171f, 0.002445f, 0.002958f, 0.003330f, 0.004025f, 0.004860f, 0.006161f, - 0.007896f, 0.010742f, 0.014671f, 0.021378f, 0.032928f, 0.052612f, 0.089050f, 0.155884f, - 0.268555f, 0.430664f, 0.836426f, 0.841309f, 0.841309f, 0.842285f, 0.842773f, 0.842285f, - 0.000000f, 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000115f, 0.000114f, 0.000114f, - 0.000111f, 0.000103f, 0.000097f, 0.000118f, 0.000115f, 0.000130f, 0.000176f, 0.000130f, - 0.000223f, 0.000235f, 0.000244f, 0.000252f, 0.000274f, 0.000389f, 0.000309f, 0.000430f, - 0.000340f, 0.000399f, 0.000408f, 0.000459f, 0.000514f, 0.000501f, 0.000519f, 0.000657f, - 0.000588f, 0.000775f, 0.000813f, 0.000789f, 0.000904f, 0.001076f, 0.001027f, 0.001170f, - 0.001342f, 0.001425f, 0.001662f, 0.002005f, 0.002298f, 0.002699f, 0.003227f, 0.003990f, - 0.005062f, 0.006855f, 0.009415f, 0.013504f, 0.020905f, 0.034424f, 0.060333f, 0.112000f, - 0.210693f, 0.371094f, 0.816406f, 0.822754f, 0.822754f, 0.823242f, 0.823242f, 0.823730f, - 0.000000f, 0.000119f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000112f, 0.000111f, - 0.000110f, 0.000109f, 0.000102f, 0.000095f, 0.000090f, 0.000084f, 0.000093f, 0.000103f, - 0.000118f, 0.000165f, 0.000162f, 0.000190f, 0.000204f, 0.000218f, 0.000223f, 0.000237f, - 0.000256f, 0.000272f, 0.000344f, 0.000365f, 0.000365f, 0.000396f, 0.000386f, 0.000412f, - 0.000530f, 0.000466f, 0.000492f, 0.000615f, 0.000611f, 0.000748f, 0.000712f, 0.000795f, - 0.000908f, 0.000971f, 0.001106f, 0.001353f, 0.001572f, 0.001822f, 0.002251f, 0.002676f, - 0.003290f, 0.004349f, 0.005951f, 0.008316f, 0.012543f, 0.021149f, 0.038025f, 0.075500f, - 0.156006f, 0.308838f, 0.794922f, 0.800293f, 0.800781f, 0.801270f, 0.801758f, 0.802246f, - 0.000121f, 0.000116f, 0.000114f, 0.000113f, 0.000111f, 0.000109f, 0.000108f, 0.000107f, - 0.000106f, 0.000104f, 0.000104f, 0.000100f, 0.000094f, 0.000088f, 0.000083f, 0.000078f, - 0.000074f, 0.000105f, 0.000078f, 0.000122f, 0.000113f, 0.000153f, 0.000174f, 0.000175f, - 0.000207f, 0.000216f, 0.000225f, 0.000215f, 0.000262f, 0.000308f, 0.000297f, 0.000287f, - 0.000307f, 0.000342f, 0.000363f, 0.000411f, 0.000401f, 0.000453f, 0.000522f, 0.000555f, - 0.000680f, 0.000701f, 0.000751f, 0.000873f, 0.000966f, 0.001181f, 0.001445f, 0.001666f, - 0.002077f, 0.002512f, 0.003359f, 0.004856f, 0.007347f, 0.012001f, 0.022049f, 0.046417f, - 0.107117f, 0.245361f, 0.770508f, 0.775879f, 0.776367f, 0.776855f, 0.777344f, 0.777832f, - 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000103f, 0.000101f, 0.000100f, - 0.000099f, 0.000098f, 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f, - 0.000077f, 0.000073f, 0.000069f, 0.000079f, 0.000084f, 0.000091f, 0.000074f, 0.000100f, - 0.000117f, 0.000140f, 0.000144f, 0.000166f, 0.000174f, 0.000178f, 0.000225f, 0.000197f, - 0.000234f, 0.000239f, 0.000273f, 0.000289f, 0.000283f, 0.000293f, 0.000338f, 0.000386f, - 0.000386f, 0.000432f, 0.000459f, 0.000525f, 0.000625f, 0.000691f, 0.000800f, 0.001004f, - 0.001227f, 0.001479f, 0.001984f, 0.002745f, 0.003983f, 0.006413f, 0.011642f, 0.025269f, - 0.066040f, 0.182495f, 0.743164f, 0.748535f, 0.749023f, 0.749512f, 0.750000f, 0.749512f, - 0.000000f, 0.000102f, 0.000101f, 0.000098f, 0.000094f, 0.000093f, 0.000092f, 0.000090f, - 0.000089f, 0.000088f, 0.000087f, 0.000086f, 0.000085f, 0.000084f, 0.000085f, 0.000082f, - 0.000078f, 0.000074f, 0.000070f, 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000056f, - 0.000061f, 0.000060f, 0.000073f, 0.000087f, 0.000100f, 0.000105f, 0.000124f, 0.000136f, - 0.000140f, 0.000140f, 0.000159f, 0.000179f, 0.000186f, 0.000205f, 0.000214f, 0.000229f, - 0.000248f, 0.000267f, 0.000299f, 0.000344f, 0.000367f, 0.000422f, 0.000496f, 0.000557f, - 0.000639f, 0.000837f, 0.001037f, 0.001419f, 0.002081f, 0.003202f, 0.005730f, 0.012199f, - 0.034943f, 0.122925f, 0.711426f, 0.716797f, 0.718750f, 0.718262f, 0.718262f, 0.718750f, - 0.000094f, 0.000079f, 0.000078f, 0.000074f, 0.000074f, 0.000075f, 0.000074f, 0.000073f, - 0.000071f, 0.000072f, 0.000070f, 0.000071f, 0.000071f, 0.000070f, 0.000070f, 0.000069f, - 0.000070f, 0.000069f, 0.000068f, 0.000065f, 0.000062f, 0.000059f, 0.000056f, 0.000053f, - 0.000050f, 0.000048f, 0.000045f, 0.000044f, 0.000041f, 0.000050f, 0.000050f, 0.000061f, - 0.000068f, 0.000085f, 0.000091f, 0.000101f, 0.000102f, 0.000107f, 0.000119f, 0.000129f, - 0.000144f, 0.000151f, 0.000160f, 0.000184f, 0.000212f, 0.000213f, 0.000235f, 0.000294f, - 0.000315f, 0.000392f, 0.000505f, 0.000637f, 0.000880f, 0.001400f, 0.002462f, 0.005333f, - 0.015160f, 0.070312f, 0.678223f, 0.683105f, 0.684082f, 0.684570f, 0.684570f, 0.684570f, - 0.000000f, 0.000000f, 0.000023f, 0.000034f, 0.000032f, 0.000038f, 0.000037f, 0.000044f, - 0.000043f, 0.000047f, 0.000045f, 0.000047f, 0.000049f, 0.000049f, 0.000049f, 0.000048f, - 0.000051f, 0.000050f, 0.000051f, 0.000051f, 0.000052f, 0.000052f, 0.000052f, 0.000049f, - 0.000047f, 0.000045f, 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000035f, 0.000033f, - 0.000031f, 0.000029f, 0.000038f, 0.000037f, 0.000042f, 0.000051f, 0.000055f, 0.000067f, - 0.000074f, 0.000073f, 0.000083f, 0.000093f, 0.000088f, 0.000102f, 0.000122f, 0.000122f, - 0.000142f, 0.000169f, 0.000206f, 0.000265f, 0.000355f, 0.000531f, 0.000897f, 0.001822f, - 0.005493f, 0.030579f, 0.640137f, 0.644531f, 0.647461f, 0.647949f, 0.647461f, 0.648438f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000000f, 0.000008f, 0.000012f, 0.000014f, 0.000014f, 0.000019f, 0.000021f, - 0.000022f, 0.000024f, 0.000026f, 0.000027f, 0.000027f, 0.000028f, 0.000029f, 0.000031f, - 0.000031f, 0.000032f, 0.000032f, 0.000033f, 0.000033f, 0.000032f, 0.000030f, 0.000029f, - 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000019f, 0.000018f, - 0.000021f, 0.000024f, 0.000028f, 0.000033f, 0.000043f, 0.000041f, 0.000046f, 0.000053f, - 0.000050f, 0.000059f, 0.000068f, 0.000094f, 0.000096f, 0.000140f, 0.000239f, 0.000447f, - 0.001340f, 0.009087f, 0.600098f, 0.605957f, 0.606934f, 0.606934f, 0.607422f, 0.606934f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000002f, 0.000004f, 0.000006f, 0.000006f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, - 0.000013f, 0.000014f, 0.000015f, 0.000016f, 0.000017f, 0.000016f, 0.000015f, 0.000014f, - 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000010f, 0.000009f, 0.000008f, 0.000012f, - 0.000014f, 0.000018f, 0.000017f, 0.000022f, 0.000022f, 0.000026f, 0.000040f, 0.000060f, - 0.000157f, 0.001244f, 0.557129f, 0.563477f, 0.563477f, 0.564941f, 0.564941f, 0.564941f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000003f, - 0.000003f, 0.000004f, 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000003f, 0.000003f, - 0.000003f, 0.000012f, 0.513672f, 0.520020f, 0.520020f, 0.520508f, 0.521484f, 0.521484f, - }, - { - 0.103943f, 0.284912f, 0.422119f, 0.523438f, 0.600586f, 0.659668f, 0.705078f, 0.741699f, - 0.771484f, 0.795898f, 0.816895f, 0.834961f, 0.850586f, 0.862793f, 0.874512f, 0.884277f, - 0.894043f, 0.901855f, 0.909180f, 0.915039f, 0.921387f, 0.926270f, 0.932129f, 0.936035f, - 0.940430f, 0.944336f, 0.948242f, 0.951660f, 0.954590f, 0.957520f, 0.959961f, 0.962891f, - 0.965332f, 0.967285f, 0.969727f, 0.971680f, 0.973145f, 0.975586f, 0.977051f, 0.979004f, - 0.979980f, 0.981934f, 0.983887f, 0.984375f, 0.985840f, 0.986816f, 0.988770f, 0.989258f, - 0.990723f, 0.992188f, 0.992676f, 0.993652f, 0.994629f, 0.995605f, 0.996582f, 0.997559f, - 0.998535f, 0.999023f, 0.999512f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f, - 0.046997f, 0.153564f, 0.264160f, 0.369385f, 0.460205f, 0.538574f, 0.602051f, 0.654785f, - 0.697754f, 0.733398f, 0.762695f, 0.787598f, 0.809082f, 0.827637f, 0.843262f, 0.856934f, - 0.868652f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.912598f, 0.918945f, 0.924805f, - 0.929688f, 0.935059f, 0.938965f, 0.943359f, 0.947266f, 0.951172f, 0.954102f, 0.956543f, - 0.959961f, 0.961914f, 0.964844f, 0.966797f, 0.969727f, 0.971191f, 0.974121f, 0.975098f, - 0.977051f, 0.979492f, 0.980469f, 0.981934f, 0.983887f, 0.985352f, 0.985840f, 0.987305f, - 0.989258f, 0.990234f, 0.991211f, 0.992188f, 0.993164f, 0.994141f, 0.995117f, 0.996094f, - 0.996582f, 0.997559f, 0.999023f, 0.998535f, 0.998047f, 0.997559f, 0.997070f, 0.997070f, - 0.025940f, 0.088501f, 0.162964f, 0.246094f, 0.331055f, 0.411865f, 0.486328f, 0.550293f, - 0.606934f, 0.655762f, 0.695312f, 0.729980f, 0.758301f, 0.783691f, 0.804199f, 0.823730f, - 0.838867f, 0.853027f, 0.865723f, 0.877441f, 0.887207f, 0.895996f, 0.904785f, 0.911133f, - 0.916992f, 0.923828f, 0.928223f, 0.933594f, 0.937988f, 0.942871f, 0.946777f, 0.950195f, - 0.953613f, 0.956543f, 0.959473f, 0.962402f, 0.964844f, 0.967285f, 0.970215f, 0.971680f, - 0.973633f, 0.976074f, 0.977539f, 0.979492f, 0.980469f, 0.982422f, 0.984863f, 0.985352f, - 0.986816f, 0.987793f, 0.989258f, 0.990234f, 0.991699f, 0.992676f, 0.994141f, 0.995117f, - 0.995605f, 0.996582f, 0.998535f, 0.998047f, 0.998047f, 0.997559f, 0.997070f, 0.996582f, - 0.016159f, 0.055176f, 0.104126f, 0.162720f, 0.229126f, 0.300781f, 0.372803f, 0.442871f, - 0.506836f, 0.563477f, 0.613281f, 0.657715f, 0.696289f, 0.729004f, 0.757324f, 0.782227f, - 0.802734f, 0.821289f, 0.837402f, 0.852539f, 0.865234f, 0.875977f, 0.885742f, 0.895508f, - 0.903320f, 0.910156f, 0.917480f, 0.922852f, 0.928711f, 0.934082f, 0.937988f, 0.942871f, - 0.947266f, 0.950195f, 0.954102f, 0.957031f, 0.959473f, 0.962402f, 0.964844f, 0.968262f, - 0.969727f, 0.972168f, 0.974121f, 0.976562f, 0.978516f, 0.979980f, 0.981934f, 0.982910f, - 0.983887f, 0.985840f, 0.986816f, 0.988770f, 0.989746f, 0.991211f, 0.992188f, 0.993652f, - 0.994141f, 0.995117f, 0.998047f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f, - 0.010841f, 0.036865f, 0.070007f, 0.110962f, 0.159546f, 0.214355f, 0.276367f, 0.340576f, - 0.405029f, 0.465820f, 0.523926f, 0.576172f, 0.623535f, 0.664062f, 0.699707f, 0.731445f, - 0.758301f, 0.782227f, 0.803223f, 0.821289f, 0.837891f, 0.852051f, 0.864258f, 0.875488f, - 0.884766f, 0.894531f, 0.903320f, 0.910156f, 0.916992f, 0.923828f, 0.928223f, 0.933594f, - 0.938477f, 0.943359f, 0.947266f, 0.950684f, 0.954102f, 0.957520f, 0.960449f, 0.962891f, - 0.965820f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977539f, 0.978516f, 0.980957f, - 0.982422f, 0.984375f, 0.985352f, 0.987305f, 0.988281f, 0.989746f, 0.990723f, 0.992188f, - 0.993164f, 0.994141f, 0.997559f, 0.997559f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, - 0.007637f, 0.026566f, 0.049896f, 0.078247f, 0.113403f, 0.154663f, 0.202637f, 0.255371f, - 0.313232f, 0.372314f, 0.431152f, 0.488037f, 0.540039f, 0.588867f, 0.633301f, 0.670898f, - 0.704102f, 0.734375f, 0.761230f, 0.785156f, 0.804688f, 0.822754f, 0.838867f, 0.852539f, - 0.864746f, 0.876953f, 0.886230f, 0.895996f, 0.903320f, 0.910645f, 0.917480f, 0.923828f, - 0.929199f, 0.935059f, 0.938965f, 0.943359f, 0.948730f, 0.952148f, 0.954590f, 0.958496f, - 0.961426f, 0.964355f, 0.966797f, 0.969238f, 0.971680f, 0.974121f, 0.976074f, 0.978027f, - 0.979980f, 0.981445f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989258f, 0.990723f, - 0.991699f, 0.993164f, 0.996582f, 0.996582f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, - 0.005714f, 0.019485f, 0.036194f, 0.056976f, 0.082336f, 0.113342f, 0.149048f, 0.191284f, - 0.238770f, 0.290039f, 0.344727f, 0.400391f, 0.454590f, 0.507324f, 0.557129f, 0.602539f, - 0.642578f, 0.679199f, 0.711426f, 0.740234f, 0.766602f, 0.788574f, 0.807617f, 0.825195f, - 0.841309f, 0.854980f, 0.867676f, 0.877930f, 0.888184f, 0.896484f, 0.904785f, 0.912109f, - 0.918945f, 0.925293f, 0.930176f, 0.935547f, 0.940918f, 0.944336f, 0.948730f, 0.952637f, - 0.956055f, 0.959473f, 0.962402f, 0.965332f, 0.967773f, 0.970703f, 0.972656f, 0.975098f, - 0.977051f, 0.979004f, 0.981445f, 0.982910f, 0.984375f, 0.985840f, 0.987793f, 0.989258f, - 0.990234f, 0.991211f, 0.996094f, 0.996094f, 0.996094f, 0.996094f, 0.995605f, 0.995117f, - 0.004505f, 0.014908f, 0.027634f, 0.043274f, 0.061707f, 0.084045f, 0.111694f, 0.143921f, - 0.180542f, 0.223877f, 0.270996f, 0.320557f, 0.373291f, 0.425781f, 0.478027f, 0.526855f, - 0.573242f, 0.615723f, 0.654785f, 0.688965f, 0.720215f, 0.747559f, 0.771973f, 0.793457f, - 0.812500f, 0.829102f, 0.844238f, 0.858398f, 0.870117f, 0.881348f, 0.890625f, 0.898926f, - 0.906738f, 0.914062f, 0.921387f, 0.926758f, 0.932617f, 0.937500f, 0.942383f, 0.945801f, - 0.950684f, 0.954102f, 0.958008f, 0.960938f, 0.964355f, 0.966797f, 0.969727f, 0.972656f, - 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.981934f, 0.984375f, 0.985840f, 0.987793f, - 0.988281f, 0.990234f, 0.995605f, 0.995605f, 0.995605f, 0.995605f, 0.995117f, 0.994629f, - 0.003691f, 0.011925f, 0.021622f, 0.033203f, 0.047241f, 0.065247f, 0.085266f, 0.109558f, - 0.138550f, 0.172363f, 0.210205f, 0.253418f, 0.299805f, 0.348877f, 0.400146f, 0.450195f, - 0.499512f, 0.546387f, 0.589844f, 0.629883f, 0.666016f, 0.700195f, 0.728516f, 0.755371f, - 0.778320f, 0.798828f, 0.817383f, 0.833984f, 0.848145f, 0.861816f, 0.874023f, 0.883789f, - 0.893555f, 0.902344f, 0.910645f, 0.916992f, 0.922852f, 0.929688f, 0.934570f, 0.938965f, - 0.944336f, 0.948730f, 0.951660f, 0.956543f, 0.959473f, 0.962891f, 0.965820f, 0.968262f, - 0.970703f, 0.974121f, 0.976074f, 0.978516f, 0.979980f, 0.981934f, 0.983887f, 0.985840f, - 0.987305f, 0.988281f, 0.994629f, 0.995117f, 0.995117f, 0.994629f, 0.994629f, 0.994141f, - 0.002726f, 0.009560f, 0.017136f, 0.026871f, 0.037415f, 0.050079f, 0.066406f, 0.084717f, - 0.107849f, 0.133423f, 0.164062f, 0.198853f, 0.238281f, 0.281250f, 0.327148f, 0.375977f, - 0.424805f, 0.473877f, 0.521973f, 0.564941f, 0.606934f, 0.644531f, 0.679199f, 0.710449f, - 0.738770f, 0.764160f, 0.786133f, 0.805664f, 0.824219f, 0.838867f, 0.853516f, 0.866211f, - 0.876953f, 0.887695f, 0.896484f, 0.905762f, 0.912598f, 0.919922f, 0.925781f, 0.932129f, - 0.937500f, 0.942383f, 0.946777f, 0.951660f, 0.955078f, 0.958984f, 0.961426f, 0.965332f, - 0.967773f, 0.970703f, 0.972656f, 0.975586f, 0.978027f, 0.979492f, 0.981934f, 0.983887f, - 0.984863f, 0.986816f, 0.994629f, 0.994629f, 0.994629f, 0.994141f, 0.994141f, 0.993652f, - 0.002487f, 0.007553f, 0.013863f, 0.021439f, 0.029755f, 0.040771f, 0.052643f, 0.067444f, - 0.084473f, 0.104980f, 0.128784f, 0.157227f, 0.189087f, 0.224609f, 0.265381f, 0.308838f, - 0.354004f, 0.401611f, 0.450439f, 0.496582f, 0.541992f, 0.583984f, 0.623047f, 0.660645f, - 0.693359f, 0.722168f, 0.749512f, 0.772949f, 0.793457f, 0.812988f, 0.830078f, 0.845215f, - 0.859375f, 0.871094f, 0.882812f, 0.892090f, 0.900879f, 0.908691f, 0.916504f, 0.922852f, - 0.930176f, 0.935547f, 0.940430f, 0.944824f, 0.949219f, 0.952637f, 0.956543f, 0.960449f, - 0.963867f, 0.967285f, 0.970215f, 0.972656f, 0.974609f, 0.977539f, 0.979492f, 0.981934f, - 0.983887f, 0.985352f, 0.993652f, 0.994141f, 0.994141f, 0.993652f, 0.993652f, 0.993164f, - 0.001893f, 0.006641f, 0.011551f, 0.017319f, 0.024612f, 0.032959f, 0.042023f, 0.053772f, - 0.067444f, 0.083435f, 0.102356f, 0.123840f, 0.150024f, 0.179688f, 0.213501f, 0.250488f, - 0.291992f, 0.335938f, 0.381592f, 0.427246f, 0.473877f, 0.518555f, 0.563477f, 0.603027f, - 0.640625f, 0.676270f, 0.707031f, 0.735352f, 0.760254f, 0.782715f, 0.802734f, 0.821777f, - 0.838379f, 0.851562f, 0.865234f, 0.876953f, 0.886719f, 0.896484f, 0.905273f, 0.913086f, - 0.921387f, 0.927734f, 0.933105f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955566f, - 0.959961f, 0.963867f, 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.977539f, 0.979492f, - 0.981934f, 0.983887f, 0.993164f, 0.993652f, 0.993164f, 0.993164f, 0.993164f, 0.992676f, - 0.001740f, 0.005634f, 0.009407f, 0.014992f, 0.020157f, 0.026840f, 0.035156f, 0.043793f, - 0.054718f, 0.067505f, 0.082092f, 0.099731f, 0.120239f, 0.143921f, 0.171265f, 0.202393f, - 0.237915f, 0.276367f, 0.318848f, 0.362793f, 0.407959f, 0.454346f, 0.499023f, 0.542480f, - 0.583984f, 0.623535f, 0.659180f, 0.691895f, 0.721680f, 0.748047f, 0.772461f, 0.793457f, - 0.812988f, 0.829102f, 0.845215f, 0.859863f, 0.872559f, 0.883789f, 0.893555f, 0.902344f, - 0.911133f, 0.918457f, 0.924805f, 0.930664f, 0.937012f, 0.941895f, 0.947266f, 0.951172f, - 0.956055f, 0.959473f, 0.962402f, 0.966309f, 0.968750f, 0.972168f, 0.974609f, 0.977051f, - 0.979492f, 0.981934f, 0.992188f, 0.992676f, 0.992676f, 0.992676f, 0.992188f, 0.992676f, - 0.001502f, 0.004482f, 0.008278f, 0.012276f, 0.016800f, 0.022644f, 0.029129f, 0.036194f, - 0.045197f, 0.055298f, 0.067017f, 0.080750f, 0.096863f, 0.115906f, 0.138184f, 0.163940f, - 0.192993f, 0.225952f, 0.262695f, 0.302490f, 0.344971f, 0.389648f, 0.434814f, 0.480469f, - 0.523926f, 0.566406f, 0.605957f, 0.643066f, 0.677246f, 0.708496f, 0.736816f, 0.761719f, - 0.784668f, 0.804688f, 0.823242f, 0.840332f, 0.854004f, 0.867188f, 0.878906f, 0.890137f, - 0.898438f, 0.907715f, 0.916016f, 0.922852f, 0.930176f, 0.935547f, 0.940918f, 0.946289f, - 0.950684f, 0.955078f, 0.959473f, 0.961914f, 0.966309f, 0.969238f, 0.972168f, 0.974609f, - 0.977539f, 0.979492f, 0.991211f, 0.992188f, 0.991699f, 0.992188f, 0.991699f, 0.991211f, - 0.001411f, 0.003645f, 0.007160f, 0.010414f, 0.014397f, 0.018677f, 0.024338f, 0.030426f, - 0.037384f, 0.045654f, 0.055054f, 0.066101f, 0.079529f, 0.094543f, 0.112793f, 0.133057f, - 0.157227f, 0.183960f, 0.215210f, 0.250488f, 0.288086f, 0.329102f, 0.372314f, 0.416992f, - 0.461914f, 0.505859f, 0.549316f, 0.589355f, 0.627930f, 0.664062f, 0.695801f, 0.725098f, - 0.752441f, 0.775879f, 0.797363f, 0.815918f, 0.833984f, 0.849121f, 0.863281f, 0.875488f, - 0.886230f, 0.895996f, 0.904785f, 0.914062f, 0.920898f, 0.928223f, 0.935059f, 0.940918f, - 0.945312f, 0.950195f, 0.954102f, 0.958984f, 0.962402f, 0.966309f, 0.969238f, 0.972656f, - 0.974609f, 0.977539f, 0.990234f, 0.992188f, 0.991211f, 0.991211f, 0.990723f, 0.991211f, - 0.000926f, 0.003523f, 0.006207f, 0.008949f, 0.012718f, 0.016312f, 0.020447f, 0.025467f, - 0.031128f, 0.037994f, 0.045532f, 0.054901f, 0.065430f, 0.077576f, 0.091797f, 0.109131f, - 0.128418f, 0.151245f, 0.176636f, 0.206055f, 0.238525f, 0.275146f, 0.314697f, 0.357178f, - 0.400391f, 0.445312f, 0.489746f, 0.531738f, 0.574219f, 0.613281f, 0.650391f, 0.683594f, - 0.714355f, 0.742188f, 0.768066f, 0.790039f, 0.810059f, 0.828125f, 0.843262f, 0.858398f, - 0.871582f, 0.883789f, 0.893555f, 0.903809f, 0.912598f, 0.919434f, 0.926758f, 0.933594f, - 0.939453f, 0.944336f, 0.950195f, 0.954590f, 0.958008f, 0.962402f, 0.966309f, 0.969727f, - 0.972656f, 0.975586f, 0.989746f, 0.990723f, 0.990723f, 0.990234f, 0.990234f, 0.990234f, - 0.001140f, 0.003021f, 0.005527f, 0.008102f, 0.010445f, 0.013977f, 0.017349f, 0.021637f, - 0.026535f, 0.031677f, 0.038330f, 0.045776f, 0.054382f, 0.064392f, 0.076233f, 0.089844f, - 0.105713f, 0.123840f, 0.145020f, 0.169556f, 0.196899f, 0.229248f, 0.263672f, 0.302002f, - 0.342529f, 0.385986f, 0.429932f, 0.473877f, 0.517578f, 0.560547f, 0.600586f, 0.638184f, - 0.672852f, 0.704590f, 0.733398f, 0.759277f, 0.782715f, 0.803711f, 0.823242f, 0.840820f, - 0.854980f, 0.869141f, 0.881348f, 0.892090f, 0.902344f, 0.910645f, 0.919922f, 0.927246f, - 0.933105f, 0.938965f, 0.944824f, 0.949707f, 0.954102f, 0.959473f, 0.962891f, 0.966309f, - 0.969727f, 0.972168f, 0.988770f, 0.990234f, 0.989746f, 0.989746f, 0.989746f, 0.989258f, - 0.000870f, 0.002666f, 0.004578f, 0.006737f, 0.009430f, 0.012077f, 0.015381f, 0.018463f, - 0.022293f, 0.027313f, 0.032654f, 0.038727f, 0.045746f, 0.053619f, 0.063232f, 0.074524f, - 0.087219f, 0.102356f, 0.119324f, 0.139648f, 0.162842f, 0.189941f, 0.219482f, 0.253174f, - 0.289795f, 0.329346f, 0.372070f, 0.415039f, 0.459717f, 0.503418f, 0.546387f, 0.587402f, - 0.625977f, 0.661621f, 0.694336f, 0.725586f, 0.752441f, 0.776855f, 0.798828f, 0.818359f, - 0.837402f, 0.852539f, 0.866699f, 0.878906f, 0.891113f, 0.900879f, 0.910156f, 0.918457f, - 0.926270f, 0.932617f, 0.938965f, 0.944824f, 0.950195f, 0.955078f, 0.958984f, 0.962891f, - 0.966797f, 0.970703f, 0.987793f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.988770f, - 0.000835f, 0.002302f, 0.004078f, 0.005802f, 0.008026f, 0.010490f, 0.013153f, 0.016235f, - 0.019485f, 0.023636f, 0.027847f, 0.033081f, 0.038849f, 0.045441f, 0.053253f, 0.062500f, - 0.072571f, 0.085205f, 0.098999f, 0.115662f, 0.135254f, 0.156860f, 0.182373f, 0.211060f, - 0.243042f, 0.279053f, 0.318115f, 0.359619f, 0.402832f, 0.447021f, 0.490234f, 0.533691f, - 0.575195f, 0.615234f, 0.651855f, 0.686035f, 0.717285f, 0.746094f, 0.771484f, 0.793945f, - 0.813965f, 0.833496f, 0.848633f, 0.864258f, 0.877930f, 0.889648f, 0.900391f, 0.909180f, - 0.918945f, 0.926270f, 0.932129f, 0.939453f, 0.945312f, 0.950684f, 0.955566f, 0.959473f, - 0.963867f, 0.967773f, 0.987305f, 0.988281f, 0.988281f, 0.988281f, 0.988281f, 0.987793f, - 0.000815f, 0.001984f, 0.003475f, 0.005302f, 0.007103f, 0.009354f, 0.011528f, 0.013977f, - 0.017197f, 0.020111f, 0.023788f, 0.027771f, 0.033447f, 0.038452f, 0.045013f, 0.052704f, - 0.061066f, 0.071228f, 0.082886f, 0.096313f, 0.112488f, 0.130737f, 0.151245f, 0.175659f, - 0.203125f, 0.234619f, 0.269043f, 0.306885f, 0.347656f, 0.390381f, 0.434570f, 0.478760f, - 0.522461f, 0.564453f, 0.605957f, 0.644043f, 0.678223f, 0.710449f, 0.739746f, 0.766602f, - 0.791016f, 0.811035f, 0.831055f, 0.847168f, 0.862793f, 0.875977f, 0.888672f, 0.899414f, - 0.909180f, 0.917480f, 0.926270f, 0.933105f, 0.939941f, 0.945801f, 0.950684f, 0.955566f, - 0.960938f, 0.964844f, 0.985840f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.987305f, - 0.000587f, 0.002005f, 0.003122f, 0.004707f, 0.006283f, 0.007778f, 0.009972f, 0.012581f, - 0.014435f, 0.017426f, 0.020691f, 0.024475f, 0.028519f, 0.033203f, 0.038513f, 0.044708f, - 0.051727f, 0.060028f, 0.069763f, 0.080627f, 0.093506f, 0.109009f, 0.125977f, 0.146362f, - 0.169678f, 0.196533f, 0.226685f, 0.259766f, 0.297119f, 0.337646f, 0.380127f, 0.424072f, - 0.468018f, 0.512207f, 0.555176f, 0.596680f, 0.635254f, 0.671387f, 0.704590f, 0.734863f, - 0.762207f, 0.787109f, 0.809082f, 0.828613f, 0.846191f, 0.860840f, 0.875977f, 0.888184f, - 0.899902f, 0.908691f, 0.918457f, 0.926270f, 0.934082f, 0.940430f, 0.947266f, 0.951660f, - 0.958008f, 0.961914f, 0.984863f, 0.986328f, 0.986816f, 0.986816f, 0.986328f, 0.986328f, - 0.000475f, 0.001671f, 0.003019f, 0.004379f, 0.005592f, 0.006882f, 0.008682f, 0.010757f, - 0.012856f, 0.015343f, 0.018112f, 0.021164f, 0.024353f, 0.028595f, 0.033020f, 0.038086f, - 0.044006f, 0.050812f, 0.058594f, 0.067993f, 0.078735f, 0.091248f, 0.105530f, 0.122009f, - 0.142212f, 0.164062f, 0.189697f, 0.219238f, 0.251953f, 0.288330f, 0.328125f, 0.369629f, - 0.413818f, 0.458008f, 0.503418f, 0.547363f, 0.588867f, 0.628418f, 0.665039f, 0.699707f, - 0.730469f, 0.758301f, 0.784668f, 0.807129f, 0.826660f, 0.844727f, 0.862305f, 0.875977f, - 0.888672f, 0.900879f, 0.910156f, 0.919434f, 0.927734f, 0.935059f, 0.941406f, 0.947754f, - 0.953125f, 0.958496f, 0.983887f, 0.985352f, 0.985352f, 0.985352f, 0.984863f, 0.985352f, - 0.000325f, 0.001517f, 0.002554f, 0.003811f, 0.004990f, 0.006638f, 0.007706f, 0.009399f, - 0.011177f, 0.013580f, 0.015671f, 0.018478f, 0.021393f, 0.024612f, 0.028442f, 0.032990f, - 0.037750f, 0.043427f, 0.050354f, 0.057861f, 0.066101f, 0.076294f, 0.088684f, 0.102417f, - 0.119080f, 0.137451f, 0.159058f, 0.183838f, 0.212524f, 0.244385f, 0.280273f, 0.319336f, - 0.361084f, 0.405029f, 0.449707f, 0.494873f, 0.539551f, 0.582031f, 0.622559f, 0.660156f, - 0.695801f, 0.727539f, 0.756348f, 0.782715f, 0.805664f, 0.826172f, 0.845215f, 0.861328f, - 0.875977f, 0.889648f, 0.901367f, 0.910645f, 0.920410f, 0.928711f, 0.937012f, 0.942871f, - 0.949219f, 0.955078f, 0.982422f, 0.983887f, 0.984375f, 0.984375f, 0.983887f, 0.983887f, - 0.000349f, 0.001533f, 0.002413f, 0.003326f, 0.004463f, 0.005524f, 0.006954f, 0.008202f, - 0.010025f, 0.011864f, 0.013924f, 0.015884f, 0.018478f, 0.021484f, 0.024658f, 0.028671f, - 0.032562f, 0.037170f, 0.042969f, 0.049194f, 0.056641f, 0.065063f, 0.074951f, 0.086182f, - 0.099731f, 0.115662f, 0.133789f, 0.154175f, 0.178589f, 0.206421f, 0.237671f, 0.272949f, - 0.312012f, 0.352783f, 0.396973f, 0.442627f, 0.487793f, 0.532227f, 0.576660f, 0.617188f, - 0.657227f, 0.692383f, 0.725586f, 0.754395f, 0.780762f, 0.805664f, 0.826172f, 0.845215f, - 0.861816f, 0.876465f, 0.890137f, 0.902344f, 0.912598f, 0.921875f, 0.930176f, 0.937988f, - 0.945312f, 0.952148f, 0.981445f, 0.982910f, 0.982910f, 0.983398f, 0.983398f, 0.983398f, - 0.000475f, 0.001141f, 0.002058f, 0.002846f, 0.004120f, 0.005013f, 0.006207f, 0.007664f, - 0.009193f, 0.010368f, 0.012222f, 0.014404f, 0.016403f, 0.018799f, 0.021439f, 0.024567f, - 0.028076f, 0.032379f, 0.036652f, 0.042145f, 0.048157f, 0.055389f, 0.063660f, 0.073059f, - 0.083740f, 0.097046f, 0.112366f, 0.129517f, 0.149780f, 0.173584f, 0.200684f, 0.231812f, - 0.266357f, 0.304688f, 0.346680f, 0.390137f, 0.435547f, 0.481445f, 0.526367f, 0.572266f, - 0.613770f, 0.653320f, 0.690430f, 0.723633f, 0.754395f, 0.781250f, 0.806152f, 0.826172f, - 0.847168f, 0.862793f, 0.878906f, 0.892090f, 0.904297f, 0.914551f, 0.924316f, 0.933105f, - 0.940430f, 0.947754f, 0.979492f, 0.981934f, 0.981934f, 0.981934f, 0.981445f, 0.981445f, - 0.000239f, 0.000882f, 0.001744f, 0.002878f, 0.003819f, 0.004532f, 0.005550f, 0.006653f, - 0.007942f, 0.009277f, 0.010628f, 0.012421f, 0.014397f, 0.016312f, 0.018845f, 0.021576f, - 0.024536f, 0.027817f, 0.031860f, 0.036346f, 0.041595f, 0.047333f, 0.054138f, 0.062317f, - 0.071350f, 0.081970f, 0.094299f, 0.109070f, 0.126221f, 0.146118f, 0.169067f, 0.195801f, - 0.226196f, 0.260742f, 0.298584f, 0.340088f, 0.384277f, 0.429688f, 0.476807f, 0.522461f, - 0.568359f, 0.611328f, 0.651855f, 0.689453f, 0.723633f, 0.754395f, 0.782715f, 0.807617f, - 0.829590f, 0.848145f, 0.865723f, 0.880859f, 0.894531f, 0.906738f, 0.917969f, 0.927246f, - 0.936035f, 0.943359f, 0.978027f, 0.979980f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, - 0.000240f, 0.000948f, 0.001495f, 0.002592f, 0.003241f, 0.004055f, 0.004856f, 0.006111f, - 0.007133f, 0.008125f, 0.009445f, 0.011108f, 0.012474f, 0.014374f, 0.016586f, 0.018784f, - 0.021286f, 0.024475f, 0.027481f, 0.031403f, 0.035828f, 0.040710f, 0.046204f, 0.052704f, - 0.060577f, 0.069519f, 0.079651f, 0.092224f, 0.106506f, 0.122986f, 0.142456f, 0.165161f, - 0.191284f, 0.221924f, 0.255615f, 0.293457f, 0.335205f, 0.379395f, 0.425537f, 0.472900f, - 0.519531f, 0.566406f, 0.610840f, 0.652344f, 0.689941f, 0.724609f, 0.755371f, 0.784180f, - 0.808594f, 0.831055f, 0.851562f, 0.869141f, 0.884277f, 0.897461f, 0.909668f, 0.920410f, - 0.930176f, 0.937988f, 0.976562f, 0.979004f, 0.979492f, 0.979492f, 0.979492f, 0.979492f, - 0.000302f, 0.000863f, 0.001315f, 0.002195f, 0.002905f, 0.003592f, 0.004784f, 0.005478f, - 0.006199f, 0.007389f, 0.008545f, 0.009811f, 0.011185f, 0.012787f, 0.014603f, 0.016342f, - 0.018784f, 0.021347f, 0.024033f, 0.027496f, 0.031006f, 0.034790f, 0.039856f, 0.045288f, - 0.051636f, 0.059052f, 0.067566f, 0.078003f, 0.089905f, 0.103760f, 0.119934f, 0.139282f, - 0.161865f, 0.187622f, 0.217407f, 0.251221f, 0.288818f, 0.330811f, 0.375244f, 0.422607f, - 0.470703f, 0.518066f, 0.565430f, 0.609863f, 0.651855f, 0.691406f, 0.726562f, 0.758301f, - 0.787109f, 0.812500f, 0.835449f, 0.855957f, 0.872559f, 0.887695f, 0.901367f, 0.913574f, - 0.923828f, 0.933105f, 0.975098f, 0.977539f, 0.977539f, 0.977539f, 0.978027f, 0.977051f, - 0.000240f, 0.000808f, 0.001537f, 0.002106f, 0.002493f, 0.003729f, 0.004036f, 0.004982f, - 0.005539f, 0.006454f, 0.007526f, 0.008690f, 0.009987f, 0.011421f, 0.012894f, 0.014618f, - 0.016464f, 0.018539f, 0.021118f, 0.023865f, 0.026794f, 0.030487f, 0.034241f, 0.038879f, - 0.044067f, 0.050690f, 0.057678f, 0.066040f, 0.076111f, 0.087524f, 0.101379f, 0.117737f, - 0.136353f, 0.158325f, 0.183594f, 0.213501f, 0.247192f, 0.284912f, 0.327393f, 0.372803f, - 0.420410f, 0.468750f, 0.518066f, 0.565430f, 0.611328f, 0.654297f, 0.694336f, 0.729980f, - 0.762207f, 0.791504f, 0.817383f, 0.839844f, 0.859863f, 0.876953f, 0.891602f, 0.905762f, - 0.917480f, 0.928711f, 0.973633f, 0.975098f, 0.976562f, 0.975586f, 0.976562f, 0.976562f, - 0.000240f, 0.000587f, 0.001223f, 0.001691f, 0.002499f, 0.003008f, 0.003643f, 0.004295f, - 0.004795f, 0.005726f, 0.006649f, 0.007671f, 0.008766f, 0.010002f, 0.011307f, 0.012764f, - 0.014465f, 0.016388f, 0.018387f, 0.020599f, 0.023453f, 0.026291f, 0.029572f, 0.033417f, - 0.037964f, 0.043427f, 0.049316f, 0.056519f, 0.064819f, 0.074219f, 0.085693f, 0.099121f, - 0.115112f, 0.133301f, 0.155273f, 0.180420f, 0.210205f, 0.244751f, 0.282715f, 0.324951f, - 0.371338f, 0.419434f, 0.468994f, 0.518555f, 0.566895f, 0.613770f, 0.658203f, 0.698242f, - 0.735352f, 0.766602f, 0.796875f, 0.821289f, 0.844238f, 0.863770f, 0.881836f, 0.896973f, - 0.910156f, 0.922363f, 0.971191f, 0.974121f, 0.974609f, 0.974121f, 0.974609f, 0.974609f, - 0.000228f, 0.000671f, 0.001122f, 0.001607f, 0.002291f, 0.002836f, 0.003319f, 0.003817f, - 0.004509f, 0.005253f, 0.005894f, 0.006840f, 0.007820f, 0.008972f, 0.010086f, 0.011391f, - 0.012848f, 0.014328f, 0.016266f, 0.018158f, 0.020447f, 0.022720f, 0.026031f, 0.029053f, - 0.032593f, 0.037109f, 0.042236f, 0.048340f, 0.055115f, 0.063049f, 0.072632f, 0.083801f, - 0.097351f, 0.112488f, 0.130493f, 0.152222f, 0.178101f, 0.208008f, 0.241943f, 0.280762f, - 0.323730f, 0.370117f, 0.419434f, 0.470459f, 0.520996f, 0.570801f, 0.617676f, 0.663086f, - 0.704102f, 0.740234f, 0.773438f, 0.802246f, 0.829102f, 0.850098f, 0.870117f, 0.887695f, - 0.902832f, 0.916016f, 0.969238f, 0.972168f, 0.972168f, 0.972656f, 0.972656f, 0.972168f, - 0.000121f, 0.000526f, 0.001092f, 0.001670f, 0.001744f, 0.002420f, 0.002945f, 0.003237f, - 0.004013f, 0.004894f, 0.005421f, 0.005932f, 0.006996f, 0.007904f, 0.008873f, 0.009995f, - 0.011391f, 0.012756f, 0.014053f, 0.015884f, 0.017715f, 0.019775f, 0.022324f, 0.025406f, - 0.028290f, 0.032349f, 0.036560f, 0.041412f, 0.047058f, 0.053772f, 0.061493f, 0.070862f, - 0.081848f, 0.094666f, 0.110229f, 0.128662f, 0.150024f, 0.175903f, 0.205566f, 0.239990f, - 0.279785f, 0.323486f, 0.370850f, 0.421143f, 0.473633f, 0.524902f, 0.576172f, 0.625000f, - 0.668457f, 0.710938f, 0.748535f, 0.781250f, 0.810059f, 0.835449f, 0.857910f, 0.877441f, - 0.894531f, 0.908691f, 0.966797f, 0.970215f, 0.970703f, 0.970703f, 0.970703f, 0.970215f, - 0.000127f, 0.000521f, 0.001083f, 0.001460f, 0.001684f, 0.002111f, 0.002563f, 0.003048f, - 0.003618f, 0.004124f, 0.004936f, 0.005543f, 0.006340f, 0.007111f, 0.008049f, 0.008774f, - 0.009865f, 0.011162f, 0.012360f, 0.013840f, 0.015465f, 0.017181f, 0.019531f, 0.021973f, - 0.024582f, 0.027847f, 0.031342f, 0.035706f, 0.040100f, 0.045990f, 0.052521f, 0.060089f, - 0.069214f, 0.080017f, 0.093079f, 0.108521f, 0.126709f, 0.148071f, 0.174072f, 0.204224f, - 0.239502f, 0.279541f, 0.324219f, 0.373047f, 0.424805f, 0.477295f, 0.530762f, 0.583008f, - 0.632324f, 0.677246f, 0.719727f, 0.756348f, 0.789551f, 0.819336f, 0.842773f, 0.866211f, - 0.885742f, 0.901855f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.968750f, 0.968262f, - 0.000244f, 0.000397f, 0.001001f, 0.001181f, 0.001642f, 0.001872f, 0.002460f, 0.002712f, - 0.003061f, 0.003723f, 0.004520f, 0.005043f, 0.005547f, 0.006451f, 0.007057f, 0.007828f, - 0.008942f, 0.009872f, 0.010857f, 0.012131f, 0.013557f, 0.015198f, 0.017059f, 0.019241f, - 0.021454f, 0.024048f, 0.027069f, 0.030594f, 0.034332f, 0.039001f, 0.044952f, 0.050873f, - 0.058716f, 0.067505f, 0.078369f, 0.091309f, 0.106506f, 0.124695f, 0.146484f, 0.172852f, - 0.203369f, 0.239014f, 0.280273f, 0.326172f, 0.376465f, 0.429443f, 0.483643f, 0.538574f, - 0.591309f, 0.641602f, 0.687500f, 0.729492f, 0.766602f, 0.800293f, 0.828613f, 0.854004f, - 0.874512f, 0.893555f, 0.961914f, 0.965332f, 0.965820f, 0.966309f, 0.966309f, 0.965820f, - 0.000243f, 0.000453f, 0.000888f, 0.001245f, 0.001342f, 0.001847f, 0.002060f, 0.002541f, - 0.002991f, 0.003355f, 0.003679f, 0.004379f, 0.005177f, 0.005413f, 0.006283f, 0.007038f, - 0.007896f, 0.008507f, 0.009552f, 0.010628f, 0.011909f, 0.013306f, 0.015038f, 0.016388f, - 0.018433f, 0.020752f, 0.023254f, 0.026413f, 0.029617f, 0.033447f, 0.037842f, 0.043701f, - 0.049896f, 0.057190f, 0.066101f, 0.076660f, 0.089600f, 0.104553f, 0.123230f, 0.145386f, - 0.171387f, 0.202637f, 0.239624f, 0.281982f, 0.329346f, 0.380859f, 0.436035f, 0.491943f, - 0.547852f, 0.602539f, 0.653809f, 0.699707f, 0.741699f, 0.778320f, 0.811035f, 0.838867f, - 0.862793f, 0.884766f, 0.959961f, 0.963379f, 0.963379f, 0.963379f, 0.964355f, 0.963379f, - 0.000241f, 0.000452f, 0.000798f, 0.001119f, 0.001220f, 0.001430f, 0.001902f, 0.002277f, - 0.002737f, 0.002893f, 0.003624f, 0.003937f, 0.004436f, 0.005089f, 0.005669f, 0.006226f, - 0.006680f, 0.007519f, 0.008568f, 0.009384f, 0.010422f, 0.011795f, 0.012840f, 0.014526f, - 0.016235f, 0.017929f, 0.020218f, 0.022736f, 0.025146f, 0.028580f, 0.032684f, 0.036896f, - 0.042511f, 0.048431f, 0.055634f, 0.064453f, 0.075317f, 0.088196f, 0.103333f, 0.121948f, - 0.144287f, 0.171143f, 0.203491f, 0.241577f, 0.285156f, 0.334229f, 0.387939f, 0.444580f, - 0.501953f, 0.559570f, 0.614746f, 0.666504f, 0.712402f, 0.755371f, 0.791504f, 0.823242f, - 0.851074f, 0.875000f, 0.956543f, 0.959961f, 0.960938f, 0.960449f, 0.960449f, 0.960449f, - 0.000000f, 0.000263f, 0.000693f, 0.000873f, 0.001183f, 0.001447f, 0.001476f, 0.002068f, - 0.002171f, 0.002857f, 0.003164f, 0.003542f, 0.003778f, 0.004326f, 0.004906f, 0.005436f, - 0.006126f, 0.006687f, 0.007229f, 0.008377f, 0.009232f, 0.010223f, 0.011436f, 0.012527f, - 0.013832f, 0.015747f, 0.017365f, 0.019363f, 0.021667f, 0.024231f, 0.027695f, 0.031769f, - 0.035889f, 0.041016f, 0.047028f, 0.054504f, 0.063110f, 0.073975f, 0.086487f, 0.101807f, - 0.120972f, 0.143555f, 0.171753f, 0.204956f, 0.244263f, 0.289551f, 0.340576f, 0.396484f, - 0.455078f, 0.514648f, 0.573730f, 0.630371f, 0.681152f, 0.729004f, 0.770020f, 0.806641f, - 0.837402f, 0.863770f, 0.953613f, 0.956543f, 0.957520f, 0.957031f, 0.957031f, 0.958008f, - 0.000000f, 0.000356f, 0.000641f, 0.000870f, 0.000998f, 0.001134f, 0.001495f, 0.001724f, - 0.002436f, 0.002478f, 0.002775f, 0.003113f, 0.003435f, 0.003864f, 0.004314f, 0.004704f, - 0.005276f, 0.005886f, 0.006599f, 0.007309f, 0.008003f, 0.008987f, 0.009987f, 0.010941f, - 0.012192f, 0.013466f, 0.015030f, 0.016708f, 0.018906f, 0.021103f, 0.023788f, 0.026886f, - 0.030457f, 0.034943f, 0.040009f, 0.045959f, 0.053162f, 0.061920f, 0.072144f, 0.085205f, - 0.101257f, 0.120422f, 0.143555f, 0.172363f, 0.206909f, 0.248047f, 0.295410f, 0.349121f, - 0.407715f, 0.468750f, 0.530762f, 0.589844f, 0.647949f, 0.699707f, 0.746094f, 0.786621f, - 0.823242f, 0.852051f, 0.950195f, 0.953125f, 0.954102f, 0.954102f, 0.954102f, 0.954102f, - 0.000231f, 0.000449f, 0.000516f, 0.000760f, 0.000868f, 0.001152f, 0.001403f, 0.001773f, - 0.002165f, 0.002245f, 0.002550f, 0.002783f, 0.003277f, 0.003660f, 0.003782f, 0.004120f, - 0.004631f, 0.005268f, 0.005795f, 0.006344f, 0.007053f, 0.007835f, 0.008598f, 0.009460f, - 0.010689f, 0.011551f, 0.012726f, 0.014359f, 0.016052f, 0.017975f, 0.020218f, 0.022812f, - 0.025803f, 0.029251f, 0.033386f, 0.038574f, 0.044556f, 0.051941f, 0.060577f, 0.071045f, - 0.084106f, 0.100342f, 0.119751f, 0.144043f, 0.174194f, 0.209961f, 0.253418f, 0.303467f, - 0.359619f, 0.420898f, 0.483887f, 0.547852f, 0.609375f, 0.667480f, 0.719727f, 0.765625f, - 0.804688f, 0.839844f, 0.946289f, 0.949707f, 0.950195f, 0.950684f, 0.950684f, 0.950195f, - 0.000201f, 0.000336f, 0.000452f, 0.000627f, 0.000793f, 0.000966f, 0.001134f, 0.001578f, - 0.001790f, 0.001896f, 0.002254f, 0.002464f, 0.002825f, 0.003012f, 0.003414f, 0.003626f, - 0.004131f, 0.004608f, 0.005058f, 0.005642f, 0.006191f, 0.006771f, 0.007378f, 0.008057f, - 0.009132f, 0.009918f, 0.010826f, 0.012314f, 0.013794f, 0.015381f, 0.017197f, 0.019257f, - 0.021912f, 0.024841f, 0.028259f, 0.032318f, 0.037262f, 0.043427f, 0.050537f, 0.059021f, - 0.070007f, 0.083191f, 0.099609f, 0.120239f, 0.145508f, 0.176636f, 0.214600f, 0.260254f, - 0.313232f, 0.372803f, 0.437012f, 0.503418f, 0.568359f, 0.631836f, 0.688965f, 0.741211f, - 0.786621f, 0.825195f, 0.941406f, 0.946289f, 0.946289f, 0.946777f, 0.946289f, 0.947266f, - 0.000000f, 0.000317f, 0.000445f, 0.000453f, 0.000781f, 0.000794f, 0.001183f, 0.001289f, - 0.001479f, 0.001832f, 0.001874f, 0.002256f, 0.002270f, 0.002716f, 0.002960f, 0.003273f, - 0.003630f, 0.003948f, 0.004467f, 0.004833f, 0.005451f, 0.005962f, 0.006367f, 0.007088f, - 0.007717f, 0.008400f, 0.009506f, 0.010445f, 0.011658f, 0.012993f, 0.014618f, 0.016357f, - 0.018524f, 0.021210f, 0.023712f, 0.027252f, 0.031219f, 0.036041f, 0.041962f, 0.049194f, - 0.057892f, 0.068604f, 0.082642f, 0.099304f, 0.120728f, 0.147217f, 0.180054f, 0.221191f, - 0.269287f, 0.325928f, 0.388916f, 0.457275f, 0.525391f, 0.593262f, 0.657715f, 0.714355f, - 0.766113f, 0.809082f, 0.937500f, 0.940918f, 0.941895f, 0.941895f, 0.941895f, 0.942383f, - 0.000243f, 0.000238f, 0.000411f, 0.000532f, 0.000530f, 0.000764f, 0.000853f, 0.001171f, - 0.001417f, 0.001545f, 0.001799f, 0.001900f, 0.002094f, 0.002354f, 0.002577f, 0.002703f, - 0.003155f, 0.003428f, 0.003809f, 0.004227f, 0.004677f, 0.004997f, 0.005386f, 0.005913f, - 0.006741f, 0.007225f, 0.008057f, 0.008873f, 0.009819f, 0.011101f, 0.012253f, 0.013725f, - 0.015488f, 0.017410f, 0.019791f, 0.022598f, 0.025635f, 0.030014f, 0.034973f, 0.040527f, - 0.047729f, 0.056702f, 0.067505f, 0.081848f, 0.099609f, 0.121521f, 0.149902f, 0.185181f, - 0.228516f, 0.280762f, 0.341553f, 0.408936f, 0.480225f, 0.552246f, 0.622070f, 0.686035f, - 0.742188f, 0.792480f, 0.932129f, 0.935547f, 0.937012f, 0.937012f, 0.936523f, 0.937500f, - 0.000000f, 0.000232f, 0.000330f, 0.000512f, 0.000523f, 0.000907f, 0.000953f, 0.001018f, - 0.001234f, 0.001344f, 0.001610f, 0.001612f, 0.001845f, 0.002054f, 0.002218f, 0.002453f, - 0.002829f, 0.003105f, 0.003300f, 0.003712f, 0.003853f, 0.004280f, 0.004631f, 0.005112f, - 0.005665f, 0.006279f, 0.006779f, 0.007481f, 0.008362f, 0.009270f, 0.010338f, 0.011505f, - 0.012848f, 0.014549f, 0.016403f, 0.018936f, 0.021622f, 0.024750f, 0.028900f, 0.033447f, - 0.039185f, 0.046448f, 0.055603f, 0.067078f, 0.081238f, 0.100037f, 0.123230f, 0.153564f, - 0.191284f, 0.238525f, 0.295166f, 0.361084f, 0.432861f, 0.507812f, 0.582520f, 0.653320f, - 0.717285f, 0.772461f, 0.926270f, 0.931152f, 0.931152f, 0.932129f, 0.932129f, 0.932129f, - 0.000118f, 0.000219f, 0.000227f, 0.000405f, 0.000689f, 0.000726f, 0.000910f, 0.000847f, - 0.001072f, 0.001114f, 0.001388f, 0.001447f, 0.001656f, 0.001811f, 0.001897f, 0.002253f, - 0.002373f, 0.002617f, 0.002796f, 0.003054f, 0.003414f, 0.003681f, 0.003929f, 0.004353f, - 0.004902f, 0.005322f, 0.005863f, 0.006424f, 0.007000f, 0.007755f, 0.008675f, 0.009506f, - 0.010704f, 0.012215f, 0.013557f, 0.015686f, 0.017807f, 0.020630f, 0.023376f, 0.027328f, - 0.032013f, 0.038177f, 0.045288f, 0.054626f, 0.066284f, 0.081543f, 0.100891f, 0.125977f, - 0.158447f, 0.199951f, 0.251465f, 0.313965f, 0.384521f, 0.461670f, 0.540527f, 0.617188f, - 0.688965f, 0.750977f, 0.920410f, 0.924805f, 0.925781f, 0.926270f, 0.926758f, 0.925781f, - 0.000230f, 0.000198f, 0.000217f, 0.000338f, 0.000584f, 0.000786f, 0.000699f, 0.000893f, - 0.000954f, 0.000959f, 0.001153f, 0.001165f, 0.001375f, 0.001545f, 0.001752f, 0.001752f, - 0.002062f, 0.002235f, 0.002399f, 0.002699f, 0.002853f, 0.002995f, 0.003372f, 0.003603f, - 0.003944f, 0.004513f, 0.004704f, 0.005226f, 0.005878f, 0.006527f, 0.006992f, 0.007889f, - 0.008919f, 0.010002f, 0.011124f, 0.012604f, 0.014526f, 0.016510f, 0.019104f, 0.022308f, - 0.026077f, 0.030701f, 0.036774f, 0.044098f, 0.053558f, 0.065735f, 0.081299f, 0.101990f, - 0.129517f, 0.164917f, 0.210938f, 0.268066f, 0.336914f, 0.413818f, 0.496094f, 0.579102f, - 0.657227f, 0.727539f, 0.913574f, 0.917969f, 0.918945f, 0.919434f, 0.919922f, 0.919922f, - 0.000000f, 0.000101f, 0.000214f, 0.000208f, 0.000339f, 0.000461f, 0.000577f, 0.000780f, - 0.000777f, 0.000840f, 0.000853f, 0.001064f, 0.001198f, 0.001327f, 0.001489f, 0.001687f, - 0.001809f, 0.001884f, 0.002008f, 0.002129f, 0.002434f, 0.002514f, 0.002949f, 0.003000f, - 0.003351f, 0.003674f, 0.003918f, 0.004356f, 0.004875f, 0.005310f, 0.005768f, 0.006458f, - 0.007244f, 0.008255f, 0.008949f, 0.010361f, 0.011589f, 0.013290f, 0.015335f, 0.017776f, - 0.020828f, 0.024521f, 0.029236f, 0.035431f, 0.042694f, 0.052490f, 0.065369f, 0.082336f, - 0.104492f, 0.134277f, 0.173828f, 0.225464f, 0.290039f, 0.365234f, 0.449707f, 0.536133f, - 0.623047f, 0.702637f, 0.905273f, 0.911133f, 0.912598f, 0.913086f, 0.913086f, 0.913086f, - 0.000000f, 0.000167f, 0.000167f, 0.000316f, 0.000432f, 0.000444f, 0.000608f, 0.000611f, - 0.000678f, 0.000750f, 0.000899f, 0.000925f, 0.001043f, 0.001125f, 0.001222f, 0.001343f, - 0.001470f, 0.001608f, 0.001679f, 0.001804f, 0.001976f, 0.002234f, 0.002361f, 0.002710f, - 0.002748f, 0.003035f, 0.003290f, 0.003647f, 0.003990f, 0.004295f, 0.004745f, 0.005318f, - 0.005920f, 0.006618f, 0.007347f, 0.008270f, 0.009361f, 0.010719f, 0.012291f, 0.014221f, - 0.016693f, 0.019592f, 0.023239f, 0.027969f, 0.033752f, 0.041534f, 0.051666f, 0.065369f, - 0.083618f, 0.108276f, 0.141357f, 0.186035f, 0.244141f, 0.316650f, 0.400635f, 0.491699f, - 0.585938f, 0.672852f, 0.897461f, 0.903320f, 0.904297f, 0.903809f, 0.903809f, 0.904297f, - 0.000000f, 0.000098f, 0.000145f, 0.000289f, 0.000399f, 0.000424f, 0.000429f, 0.000382f, - 0.000529f, 0.000613f, 0.000660f, 0.000836f, 0.000907f, 0.000940f, 0.001005f, 0.001188f, - 0.001306f, 0.001451f, 0.001420f, 0.001554f, 0.001667f, 0.001783f, 0.001955f, 0.002125f, - 0.002357f, 0.002493f, 0.002760f, 0.002867f, 0.003298f, 0.003626f, 0.003878f, 0.004341f, - 0.004704f, 0.005356f, 0.005905f, 0.006512f, 0.007435f, 0.008377f, 0.009598f, 0.011055f, - 0.012978f, 0.015388f, 0.018036f, 0.021698f, 0.026337f, 0.032532f, 0.040192f, 0.050995f, - 0.065125f, 0.085510f, 0.113037f, 0.150513f, 0.201538f, 0.268799f, 0.351318f, 0.444824f, - 0.543457f, 0.641602f, 0.888672f, 0.894043f, 0.894531f, 0.895508f, 0.895020f, 0.895508f, - 0.000000f, 0.000000f, 0.000032f, 0.000169f, 0.000338f, 0.000372f, 0.000468f, 0.000471f, - 0.000460f, 0.000493f, 0.000588f, 0.000715f, 0.000762f, 0.000912f, 0.000831f, 0.001001f, - 0.001043f, 0.001133f, 0.001242f, 0.001312f, 0.001446f, 0.001529f, 0.001647f, 0.001829f, - 0.001982f, 0.002121f, 0.002165f, 0.002438f, 0.002628f, 0.002865f, 0.003113f, 0.003424f, - 0.003622f, 0.004131f, 0.004639f, 0.005222f, 0.005875f, 0.006622f, 0.007496f, 0.008575f, - 0.009987f, 0.011665f, 0.013985f, 0.016617f, 0.019913f, 0.024704f, 0.030960f, 0.039185f, - 0.050323f, 0.066284f, 0.088196f, 0.119568f, 0.163208f, 0.223511f, 0.302002f, 0.395752f, - 0.499756f, 0.605957f, 0.878418f, 0.883301f, 0.884766f, 0.884766f, 0.885254f, 0.885254f, - 0.000000f, 0.000000f, 0.000000f, 0.000216f, 0.000237f, 0.000338f, 0.000387f, 0.000341f, - 0.000435f, 0.000441f, 0.000461f, 0.000577f, 0.000544f, 0.000720f, 0.000813f, 0.000823f, - 0.000912f, 0.000936f, 0.000994f, 0.001026f, 0.001240f, 0.001268f, 0.001365f, 0.001415f, - 0.001590f, 0.001565f, 0.001870f, 0.001929f, 0.002123f, 0.002377f, 0.002430f, 0.002565f, - 0.002947f, 0.003384f, 0.003662f, 0.004105f, 0.004513f, 0.005047f, 0.005741f, 0.006550f, - 0.007549f, 0.008865f, 0.010612f, 0.012466f, 0.015350f, 0.018677f, 0.023270f, 0.029800f, - 0.038361f, 0.050323f, 0.067932f, 0.092590f, 0.129395f, 0.181274f, 0.253418f, 0.345459f, - 0.452637f, 0.567383f, 0.866699f, 0.872559f, 0.873047f, 0.873535f, 0.873047f, 0.873535f, - 0.000000f, 0.000000f, 0.000121f, 0.000182f, 0.000187f, 0.000237f, 0.000264f, 0.000360f, - 0.000360f, 0.000397f, 0.000398f, 0.000412f, 0.000432f, 0.000546f, 0.000575f, 0.000690f, - 0.000731f, 0.000727f, 0.000807f, 0.000843f, 0.000924f, 0.001034f, 0.001093f, 0.001111f, - 0.001251f, 0.001249f, 0.001334f, 0.001612f, 0.001717f, 0.001820f, 0.002090f, 0.002161f, - 0.002354f, 0.002600f, 0.002787f, 0.003119f, 0.003586f, 0.003878f, 0.004452f, 0.004913f, - 0.005772f, 0.006508f, 0.007679f, 0.009285f, 0.011086f, 0.013840f, 0.016968f, 0.021820f, - 0.028259f, 0.037628f, 0.050812f, 0.070129f, 0.099670f, 0.143433f, 0.207031f, 0.294922f, - 0.403076f, 0.525879f, 0.853516f, 0.859375f, 0.860840f, 0.860352f, 0.862305f, 0.861328f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000181f, 0.000198f, 0.000181f, 0.000240f, - 0.000275f, 0.000311f, 0.000427f, 0.000447f, 0.000395f, 0.000472f, 0.000456f, 0.000557f, - 0.000518f, 0.000562f, 0.000635f, 0.000664f, 0.000868f, 0.000887f, 0.000865f, 0.001025f, - 0.001014f, 0.001164f, 0.001096f, 0.001317f, 0.001382f, 0.001432f, 0.001445f, 0.001765f, - 0.001744f, 0.002100f, 0.002144f, 0.002350f, 0.002655f, 0.002947f, 0.003294f, 0.003780f, - 0.004265f, 0.004971f, 0.005699f, 0.006786f, 0.007957f, 0.009636f, 0.011932f, 0.015823f, - 0.020142f, 0.026749f, 0.036530f, 0.051392f, 0.073792f, 0.109375f, 0.164185f, 0.244629f, - 0.351562f, 0.479980f, 0.839355f, 0.844727f, 0.846680f, 0.847656f, 0.847168f, 0.846680f, - 0.000000f, 0.000121f, 0.000120f, 0.000119f, 0.000162f, 0.000133f, 0.000170f, 0.000201f, - 0.000204f, 0.000222f, 0.000258f, 0.000285f, 0.000324f, 0.000327f, 0.000422f, 0.000395f, - 0.000431f, 0.000517f, 0.000632f, 0.000529f, 0.000589f, 0.000592f, 0.000735f, 0.000714f, - 0.000795f, 0.000778f, 0.000823f, 0.001063f, 0.001080f, 0.001141f, 0.001154f, 0.001308f, - 0.001439f, 0.001546f, 0.001689f, 0.001886f, 0.001978f, 0.002174f, 0.002377f, 0.002798f, - 0.003277f, 0.003519f, 0.004181f, 0.004780f, 0.005768f, 0.006863f, 0.008644f, 0.010750f, - 0.014030f, 0.018448f, 0.025635f, 0.036194f, 0.053223f, 0.080811f, 0.125610f, 0.196533f, - 0.299316f, 0.430176f, 0.822754f, 0.830078f, 0.831055f, 0.831543f, 0.832031f, 0.831543f, - 0.000000f, 0.000121f, 0.000120f, 0.000118f, 0.000117f, 0.000120f, 0.000123f, 0.000151f, - 0.000154f, 0.000175f, 0.000254f, 0.000190f, 0.000211f, 0.000306f, 0.000335f, 0.000358f, - 0.000394f, 0.000417f, 0.000443f, 0.000410f, 0.000565f, 0.000565f, 0.000491f, 0.000623f, - 0.000616f, 0.000631f, 0.000738f, 0.000676f, 0.000759f, 0.000924f, 0.000895f, 0.001030f, - 0.001064f, 0.001176f, 0.001267f, 0.001438f, 0.001518f, 0.001704f, 0.001742f, 0.002028f, - 0.002384f, 0.002703f, 0.002972f, 0.003393f, 0.004051f, 0.004959f, 0.005993f, 0.007271f, - 0.009277f, 0.012390f, 0.016968f, 0.024368f, 0.036560f, 0.056610f, 0.091797f, 0.151245f, - 0.246460f, 0.379639f, 0.805664f, 0.812500f, 0.813477f, 0.813965f, 0.813965f, 0.813965f, - 0.000000f, 0.000000f, 0.000118f, 0.000117f, 0.000116f, 0.000114f, 0.000113f, 0.000108f, - 0.000127f, 0.000153f, 0.000133f, 0.000202f, 0.000217f, 0.000223f, 0.000242f, 0.000186f, - 0.000280f, 0.000304f, 0.000318f, 0.000342f, 0.000338f, 0.000473f, 0.000360f, 0.000484f, - 0.000422f, 0.000514f, 0.000527f, 0.000571f, 0.000633f, 0.000568f, 0.000639f, 0.000816f, - 0.000789f, 0.000889f, 0.000891f, 0.000966f, 0.001125f, 0.001276f, 0.001316f, 0.001496f, - 0.001658f, 0.001818f, 0.002047f, 0.002502f, 0.002781f, 0.003201f, 0.003914f, 0.004795f, - 0.006096f, 0.007996f, 0.010918f, 0.015617f, 0.023697f, 0.037567f, 0.063477f, 0.111084f, - 0.194824f, 0.324951f, 0.786133f, 0.792969f, 0.794434f, 0.793945f, 0.794922f, 0.794434f, - 0.000000f, 0.000119f, 0.000117f, 0.000115f, 0.000113f, 0.000112f, 0.000110f, 0.000109f, - 0.000104f, 0.000098f, 0.000099f, 0.000136f, 0.000112f, 0.000126f, 0.000175f, 0.000189f, - 0.000196f, 0.000220f, 0.000216f, 0.000247f, 0.000258f, 0.000274f, 0.000285f, 0.000309f, - 0.000308f, 0.000321f, 0.000381f, 0.000390f, 0.000475f, 0.000511f, 0.000485f, 0.000501f, - 0.000641f, 0.000588f, 0.000652f, 0.000764f, 0.000808f, 0.000952f, 0.000906f, 0.001037f, - 0.001110f, 0.001249f, 0.001411f, 0.001647f, 0.001894f, 0.002159f, 0.002687f, 0.003223f, - 0.004036f, 0.005150f, 0.006989f, 0.009644f, 0.014420f, 0.023361f, 0.040802f, 0.076050f, - 0.146362f, 0.269287f, 0.763184f, 0.770996f, 0.771973f, 0.771973f, 0.772461f, 0.772461f, - 0.000121f, 0.000116f, 0.000114f, 0.000112f, 0.000109f, 0.000108f, 0.000106f, 0.000105f, - 0.000104f, 0.000101f, 0.000095f, 0.000090f, 0.000085f, 0.000083f, 0.000104f, 0.000097f, - 0.000094f, 0.000154f, 0.000127f, 0.000178f, 0.000197f, 0.000194f, 0.000233f, 0.000213f, - 0.000279f, 0.000294f, 0.000293f, 0.000258f, 0.000319f, 0.000394f, 0.000344f, 0.000369f, - 0.000394f, 0.000410f, 0.000438f, 0.000509f, 0.000514f, 0.000580f, 0.000617f, 0.000684f, - 0.000807f, 0.000812f, 0.000914f, 0.001094f, 0.001183f, 0.001436f, 0.001639f, 0.002033f, - 0.002523f, 0.003073f, 0.004063f, 0.005680f, 0.008560f, 0.013466f, 0.024109f, 0.047791f, - 0.102051f, 0.213867f, 0.740234f, 0.746582f, 0.748047f, 0.748535f, 0.749023f, 0.749023f, - 0.000000f, 0.000113f, 0.000108f, 0.000107f, 0.000104f, 0.000102f, 0.000099f, 0.000099f, - 0.000097f, 0.000096f, 0.000095f, 0.000091f, 0.000086f, 0.000081f, 0.000077f, 0.000073f, - 0.000085f, 0.000091f, 0.000070f, 0.000102f, 0.000117f, 0.000131f, 0.000145f, 0.000148f, - 0.000171f, 0.000178f, 0.000178f, 0.000207f, 0.000225f, 0.000209f, 0.000285f, 0.000238f, - 0.000260f, 0.000298f, 0.000331f, 0.000360f, 0.000371f, 0.000346f, 0.000407f, 0.000443f, - 0.000494f, 0.000516f, 0.000578f, 0.000662f, 0.000767f, 0.000847f, 0.001004f, 0.001149f, - 0.001451f, 0.001783f, 0.002310f, 0.003262f, 0.004593f, 0.007309f, 0.012985f, 0.026703f, - 0.064026f, 0.158813f, 0.712891f, 0.719238f, 0.722168f, 0.721680f, 0.722168f, 0.722656f, - 0.000000f, 0.000105f, 0.000102f, 0.000098f, 0.000094f, 0.000092f, 0.000091f, 0.000089f, - 0.000088f, 0.000086f, 0.000085f, 0.000084f, 0.000083f, 0.000080f, 0.000076f, 0.000073f, - 0.000069f, 0.000065f, 0.000062f, 0.000059f, 0.000068f, 0.000063f, 0.000069f, 0.000074f, - 0.000087f, 0.000102f, 0.000112f, 0.000130f, 0.000137f, 0.000129f, 0.000143f, 0.000168f, - 0.000180f, 0.000178f, 0.000189f, 0.000198f, 0.000222f, 0.000240f, 0.000262f, 0.000285f, - 0.000304f, 0.000317f, 0.000339f, 0.000399f, 0.000439f, 0.000490f, 0.000570f, 0.000658f, - 0.000781f, 0.000988f, 0.001235f, 0.001674f, 0.002407f, 0.003725f, 0.006485f, 0.013199f, - 0.034546f, 0.107605f, 0.682129f, 0.691406f, 0.692871f, 0.691406f, 0.692871f, 0.692871f, - 0.000105f, 0.000089f, 0.000085f, 0.000080f, 0.000078f, 0.000078f, 0.000075f, 0.000074f, - 0.000072f, 0.000072f, 0.000070f, 0.000071f, 0.000069f, 0.000069f, 0.000069f, 0.000068f, - 0.000066f, 0.000063f, 0.000060f, 0.000057f, 0.000054f, 0.000052f, 0.000049f, 0.000047f, - 0.000046f, 0.000045f, 0.000048f, 0.000055f, 0.000060f, 0.000068f, 0.000083f, 0.000087f, - 0.000092f, 0.000103f, 0.000109f, 0.000117f, 0.000130f, 0.000150f, 0.000148f, 0.000142f, - 0.000167f, 0.000186f, 0.000210f, 0.000213f, 0.000232f, 0.000280f, 0.000292f, 0.000329f, - 0.000391f, 0.000456f, 0.000596f, 0.000764f, 0.001065f, 0.001633f, 0.002806f, 0.005909f, - 0.015488f, 0.062378f, 0.651367f, 0.659668f, 0.661133f, 0.661133f, 0.660645f, 0.661621f, - 0.000034f, 0.000037f, 0.000048f, 0.000051f, 0.000047f, 0.000049f, 0.000047f, 0.000051f, - 0.000049f, 0.000051f, 0.000049f, 0.000050f, 0.000051f, 0.000050f, 0.000050f, 0.000049f, - 0.000051f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000047f, 0.000045f, 0.000043f, - 0.000041f, 0.000039f, 0.000037f, 0.000035f, 0.000033f, 0.000032f, 0.000030f, 0.000029f, - 0.000034f, 0.000041f, 0.000046f, 0.000057f, 0.000063f, 0.000067f, 0.000065f, 0.000072f, - 0.000083f, 0.000093f, 0.000096f, 0.000102f, 0.000102f, 0.000135f, 0.000134f, 0.000151f, - 0.000184f, 0.000198f, 0.000245f, 0.000306f, 0.000425f, 0.000607f, 0.001032f, 0.002081f, - 0.005886f, 0.027924f, 0.617188f, 0.625977f, 0.627441f, 0.627930f, 0.626953f, 0.628418f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000006f, 0.000010f, 0.000014f, - 0.000016f, 0.000014f, 0.000019f, 0.000022f, 0.000022f, 0.000022f, 0.000025f, 0.000026f, - 0.000027f, 0.000028f, 0.000029f, 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000031f, - 0.000032f, 0.000032f, 0.000031f, 0.000030f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, - 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000022f, 0.000024f, - 0.000027f, 0.000035f, 0.000041f, 0.000034f, 0.000041f, 0.000052f, 0.000051f, 0.000051f, - 0.000058f, 0.000070f, 0.000074f, 0.000103f, 0.000119f, 0.000169f, 0.000277f, 0.000510f, - 0.001495f, 0.008766f, 0.583008f, 0.590332f, 0.591797f, 0.591797f, 0.592285f, 0.592285f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000005f, 0.000006f, - 0.000008f, 0.000009f, 0.000010f, 0.000010f, 0.000012f, 0.000012f, 0.000013f, 0.000014f, - 0.000015f, 0.000015f, 0.000015f, 0.000015f, 0.000014f, 0.000013f, 0.000013f, 0.000012f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000014f, 0.000011f, 0.000015f, - 0.000017f, 0.000017f, 0.000021f, 0.000020f, 0.000026f, 0.000026f, 0.000042f, 0.000069f, - 0.000178f, 0.001302f, 0.544434f, 0.553711f, 0.554688f, 0.554688f, 0.556152f, 0.556641f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000002f, 0.000003f, 0.000003f, - 0.000003f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000001f, 0.000003f, 0.000003f, - 0.000004f, 0.000014f, 0.506836f, 0.515137f, 0.516113f, 0.516602f, 0.517090f, 0.517578f, - }, - { - 0.089539f, 0.244873f, 0.368164f, 0.464355f, 0.539551f, 0.599121f, 0.648438f, 0.688477f, - 0.721680f, 0.749512f, 0.772461f, 0.793945f, 0.811523f, 0.826172f, 0.841309f, 0.854004f, - 0.863770f, 0.874512f, 0.883301f, 0.891602f, 0.898438f, 0.906250f, 0.912109f, 0.917969f, - 0.922852f, 0.928223f, 0.932617f, 0.937012f, 0.940918f, 0.944336f, 0.948242f, 0.951660f, - 0.954590f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.967773f, 0.970215f, 0.972656f, - 0.974609f, 0.976074f, 0.978516f, 0.979492f, 0.981934f, 0.983398f, 0.984863f, 0.986328f, - 0.987793f, 0.988770f, 0.990234f, 0.991699f, 0.993164f, 0.994141f, 0.995117f, 0.996582f, - 0.997559f, 0.998535f, 0.999023f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.995605f, - 0.045563f, 0.143921f, 0.242798f, 0.334717f, 0.417969f, 0.489258f, 0.550293f, 0.602051f, - 0.646484f, 0.683594f, 0.715820f, 0.743652f, 0.767090f, 0.788086f, 0.805664f, 0.822266f, - 0.836426f, 0.849609f, 0.861328f, 0.870117f, 0.879883f, 0.889160f, 0.896973f, 0.903320f, - 0.909668f, 0.916016f, 0.921875f, 0.926758f, 0.931641f, 0.936523f, 0.940430f, 0.943848f, - 0.947266f, 0.951172f, 0.954102f, 0.957520f, 0.960449f, 0.962891f, 0.965820f, 0.968262f, - 0.970215f, 0.973145f, 0.974121f, 0.976074f, 0.979004f, 0.980469f, 0.982422f, 0.983887f, - 0.985352f, 0.986816f, 0.988281f, 0.989746f, 0.991211f, 0.992188f, 0.994141f, 0.995117f, - 0.996094f, 0.997070f, 0.998535f, 0.997559f, 0.997070f, 0.996582f, 0.996094f, 0.995117f, - 0.026855f, 0.089233f, 0.159790f, 0.234619f, 0.308838f, 0.381348f, 0.447754f, 0.507812f, - 0.561035f, 0.606934f, 0.646484f, 0.683105f, 0.712402f, 0.740234f, 0.763184f, 0.784668f, - 0.802246f, 0.819336f, 0.833984f, 0.846680f, 0.857910f, 0.868652f, 0.878418f, 0.886719f, - 0.895508f, 0.903320f, 0.909668f, 0.915527f, 0.920410f, 0.926270f, 0.931152f, 0.935547f, - 0.940430f, 0.943848f, 0.947754f, 0.951172f, 0.954590f, 0.958008f, 0.960449f, 0.963379f, - 0.966309f, 0.968750f, 0.971191f, 0.973145f, 0.975586f, 0.977051f, 0.979004f, 0.981445f, - 0.982910f, 0.983887f, 0.985840f, 0.987305f, 0.988770f, 0.990723f, 0.992188f, 0.993164f, - 0.994629f, 0.996094f, 0.998047f, 0.997070f, 0.996582f, 0.996094f, 0.995605f, 0.995117f, - 0.017746f, 0.058746f, 0.108276f, 0.163818f, 0.224365f, 0.288086f, 0.351562f, 0.413086f, - 0.470947f, 0.522949f, 0.569824f, 0.612793f, 0.650879f, 0.684570f, 0.713867f, 0.739258f, - 0.762695f, 0.783203f, 0.800781f, 0.817871f, 0.833008f, 0.845215f, 0.857422f, 0.868164f, - 0.877441f, 0.886230f, 0.894043f, 0.902832f, 0.908691f, 0.915039f, 0.921387f, 0.925781f, - 0.930664f, 0.936035f, 0.939941f, 0.944336f, 0.948242f, 0.951660f, 0.955078f, 0.957520f, - 0.961426f, 0.964355f, 0.967285f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.978027f, - 0.979980f, 0.981934f, 0.983887f, 0.985352f, 0.987305f, 0.988770f, 0.989746f, 0.991211f, - 0.992676f, 0.993652f, 0.997070f, 0.996582f, 0.996582f, 0.996094f, 0.995117f, 0.994629f, - 0.012337f, 0.041229f, 0.075928f, 0.117065f, 0.163208f, 0.214478f, 0.270020f, 0.327148f, - 0.383301f, 0.437500f, 0.490234f, 0.536621f, 0.581543f, 0.621094f, 0.656250f, 0.688477f, - 0.716797f, 0.741699f, 0.763672f, 0.784668f, 0.802246f, 0.818359f, 0.832520f, 0.845703f, - 0.857422f, 0.868164f, 0.877930f, 0.886230f, 0.895020f, 0.902344f, 0.909668f, 0.915039f, - 0.921875f, 0.926758f, 0.931641f, 0.937012f, 0.940430f, 0.946289f, 0.949219f, 0.952637f, - 0.956055f, 0.958984f, 0.961914f, 0.964844f, 0.967773f, 0.970215f, 0.972656f, 0.974609f, - 0.976562f, 0.979004f, 0.980957f, 0.982910f, 0.984863f, 0.986816f, 0.987793f, 0.989746f, - 0.990723f, 0.992676f, 0.996582f, 0.996094f, 0.995605f, 0.995117f, 0.994629f, 0.994141f, - 0.009315f, 0.030411f, 0.055756f, 0.085632f, 0.121094f, 0.160889f, 0.206055f, 0.254150f, - 0.305664f, 0.357422f, 0.408447f, 0.459717f, 0.506836f, 0.551270f, 0.592773f, 0.629395f, - 0.662598f, 0.692871f, 0.719727f, 0.745117f, 0.767090f, 0.786133f, 0.804688f, 0.819336f, - 0.834473f, 0.847168f, 0.858398f, 0.869629f, 0.879395f, 0.888672f, 0.895020f, 0.903320f, - 0.910156f, 0.916016f, 0.922363f, 0.928223f, 0.933105f, 0.937012f, 0.941406f, 0.946289f, - 0.950195f, 0.954102f, 0.957031f, 0.960449f, 0.963379f, 0.965820f, 0.969238f, 0.971191f, - 0.974121f, 0.976074f, 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f, - 0.989258f, 0.990723f, 0.995605f, 0.995605f, 0.995117f, 0.994629f, 0.994629f, 0.993652f, - 0.006634f, 0.022736f, 0.041962f, 0.064026f, 0.090759f, 0.122192f, 0.157593f, 0.197510f, - 0.240356f, 0.287354f, 0.335693f, 0.384766f, 0.432373f, 0.479736f, 0.523438f, 0.565430f, - 0.604004f, 0.639160f, 0.670898f, 0.699219f, 0.726562f, 0.749023f, 0.770508f, 0.790527f, - 0.806641f, 0.822754f, 0.836426f, 0.848633f, 0.859863f, 0.871582f, 0.881348f, 0.889160f, - 0.897949f, 0.905273f, 0.912598f, 0.918945f, 0.924316f, 0.929199f, 0.935059f, 0.938965f, - 0.943848f, 0.947266f, 0.951660f, 0.955078f, 0.958496f, 0.961914f, 0.964844f, 0.967773f, - 0.970703f, 0.973145f, 0.975098f, 0.977539f, 0.979492f, 0.981445f, 0.983887f, 0.985352f, - 0.987305f, 0.989258f, 0.995117f, 0.994629f, 0.994141f, 0.994141f, 0.993652f, 0.993164f, - 0.005428f, 0.017807f, 0.032166f, 0.049652f, 0.070007f, 0.093811f, 0.121765f, 0.153564f, - 0.189087f, 0.228516f, 0.270752f, 0.316162f, 0.362061f, 0.408936f, 0.453857f, 0.498779f, - 0.540527f, 0.579590f, 0.615723f, 0.649902f, 0.679688f, 0.707520f, 0.732422f, 0.755371f, - 0.775391f, 0.794922f, 0.811035f, 0.826172f, 0.839844f, 0.852051f, 0.864258f, 0.875000f, - 0.883301f, 0.892578f, 0.899902f, 0.907715f, 0.914062f, 0.920410f, 0.926270f, 0.931641f, - 0.936035f, 0.940918f, 0.945312f, 0.949219f, 0.954102f, 0.957031f, 0.960938f, 0.963379f, - 0.966797f, 0.969238f, 0.972168f, 0.974609f, 0.977051f, 0.979492f, 0.980957f, 0.983398f, - 0.985352f, 0.987305f, 0.994141f, 0.994141f, 0.994141f, 0.993652f, 0.993164f, 0.992676f, - 0.004223f, 0.014046f, 0.025452f, 0.039062f, 0.055115f, 0.073608f, 0.095642f, 0.120239f, - 0.149292f, 0.182251f, 0.217529f, 0.257080f, 0.298828f, 0.342773f, 0.387207f, 0.431152f, - 0.474609f, 0.516602f, 0.556641f, 0.593750f, 0.628418f, 0.660156f, 0.689453f, 0.715820f, - 0.740723f, 0.762207f, 0.782227f, 0.799805f, 0.816406f, 0.830566f, 0.844727f, 0.855469f, - 0.867188f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.910645f, 0.917480f, 0.923340f, - 0.928711f, 0.934570f, 0.939453f, 0.943848f, 0.948242f, 0.952148f, 0.956055f, 0.959473f, - 0.961914f, 0.965820f, 0.968750f, 0.971680f, 0.974121f, 0.975586f, 0.979004f, 0.980957f, - 0.983398f, 0.985352f, 0.993652f, 0.993652f, 0.993164f, 0.993164f, 0.992676f, 0.991699f, - 0.003532f, 0.011536f, 0.020645f, 0.031342f, 0.044098f, 0.058624f, 0.075989f, 0.096252f, - 0.119141f, 0.145386f, 0.175049f, 0.208130f, 0.244385f, 0.283203f, 0.324463f, 0.367432f, - 0.410400f, 0.453369f, 0.495361f, 0.534668f, 0.572266f, 0.607910f, 0.641602f, 0.672852f, - 0.700195f, 0.725098f, 0.748047f, 0.769531f, 0.789062f, 0.806152f, 0.821777f, 0.835938f, - 0.848633f, 0.860352f, 0.872070f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.913086f, - 0.919922f, 0.925781f, 0.931641f, 0.936523f, 0.941406f, 0.946289f, 0.950684f, 0.954590f, - 0.958008f, 0.961426f, 0.964844f, 0.968262f, 0.970703f, 0.973633f, 0.976074f, 0.978516f, - 0.980469f, 0.982910f, 0.992676f, 0.992676f, 0.992188f, 0.992188f, 0.991699f, 0.990723f, - 0.002850f, 0.009483f, 0.016647f, 0.025833f, 0.035889f, 0.047424f, 0.061646f, 0.076660f, - 0.095642f, 0.117065f, 0.141113f, 0.168457f, 0.198975f, 0.233032f, 0.269775f, 0.308838f, - 0.349854f, 0.391357f, 0.432861f, 0.474121f, 0.515625f, 0.552734f, 0.589355f, 0.622559f, - 0.654785f, 0.683594f, 0.710938f, 0.735352f, 0.757812f, 0.777344f, 0.795898f, 0.812988f, - 0.827637f, 0.842285f, 0.854492f, 0.866211f, 0.876953f, 0.886719f, 0.895508f, 0.902832f, - 0.911133f, 0.917969f, 0.924316f, 0.929688f, 0.935059f, 0.940430f, 0.945312f, 0.949219f, - 0.953125f, 0.958008f, 0.961426f, 0.964844f, 0.967285f, 0.970703f, 0.973633f, 0.975586f, - 0.978516f, 0.981445f, 0.991699f, 0.992188f, 0.991699f, 0.991211f, 0.991211f, 0.990723f, - 0.002628f, 0.007713f, 0.014069f, 0.021484f, 0.029709f, 0.038910f, 0.050201f, 0.063171f, - 0.078186f, 0.094849f, 0.114563f, 0.137329f, 0.162720f, 0.190918f, 0.222656f, 0.257568f, - 0.293945f, 0.332764f, 0.372803f, 0.414551f, 0.455078f, 0.495361f, 0.533691f, 0.571289f, - 0.606445f, 0.639160f, 0.668457f, 0.697754f, 0.723633f, 0.746094f, 0.767090f, 0.787598f, - 0.804199f, 0.820801f, 0.834473f, 0.848633f, 0.860352f, 0.872559f, 0.882324f, 0.891602f, - 0.899902f, 0.907715f, 0.915039f, 0.921387f, 0.927734f, 0.934082f, 0.938965f, 0.944824f, - 0.948730f, 0.953125f, 0.956543f, 0.960938f, 0.963867f, 0.967285f, 0.970215f, 0.973145f, - 0.976074f, 0.978516f, 0.990234f, 0.990723f, 0.990723f, 0.991211f, 0.990234f, 0.990234f, - 0.002131f, 0.006535f, 0.012016f, 0.017670f, 0.024780f, 0.032837f, 0.041199f, 0.051819f, - 0.063904f, 0.077759f, 0.093689f, 0.112610f, 0.133057f, 0.156860f, 0.183472f, 0.213257f, - 0.245605f, 0.281006f, 0.318115f, 0.357422f, 0.397217f, 0.437500f, 0.478271f, 0.516602f, - 0.554688f, 0.589844f, 0.623535f, 0.654785f, 0.684082f, 0.710938f, 0.734375f, 0.757812f, - 0.777832f, 0.795898f, 0.813477f, 0.828613f, 0.843262f, 0.855957f, 0.867676f, 0.878906f, - 0.888184f, 0.897461f, 0.905273f, 0.912598f, 0.919922f, 0.926758f, 0.932129f, 0.937988f, - 0.942871f, 0.947754f, 0.951660f, 0.955566f, 0.960449f, 0.964355f, 0.967285f, 0.970215f, - 0.973145f, 0.976074f, 0.989746f, 0.990234f, 0.990234f, 0.990234f, 0.989746f, 0.988770f, - 0.001566f, 0.005798f, 0.010231f, 0.015259f, 0.020920f, 0.027176f, 0.034607f, 0.043335f, - 0.052887f, 0.064392f, 0.077576f, 0.092712f, 0.109802f, 0.129639f, 0.151611f, 0.176758f, - 0.204346f, 0.235474f, 0.269043f, 0.304688f, 0.342529f, 0.381836f, 0.421143f, 0.460449f, - 0.500488f, 0.538086f, 0.574219f, 0.608887f, 0.640625f, 0.670898f, 0.699219f, 0.725098f, - 0.748535f, 0.769043f, 0.788574f, 0.807129f, 0.823242f, 0.837402f, 0.850586f, 0.863281f, - 0.874512f, 0.885254f, 0.894043f, 0.902832f, 0.910645f, 0.917969f, 0.924805f, 0.931152f, - 0.936523f, 0.941895f, 0.947266f, 0.951172f, 0.955566f, 0.960449f, 0.963867f, 0.966797f, - 0.970703f, 0.973145f, 0.988281f, 0.989258f, 0.989258f, 0.989258f, 0.988770f, 0.988281f, - 0.001427f, 0.004749f, 0.008934f, 0.012833f, 0.017670f, 0.023483f, 0.029114f, 0.036438f, - 0.044556f, 0.054047f, 0.064453f, 0.077148f, 0.091309f, 0.107544f, 0.125854f, 0.146729f, - 0.170776f, 0.197266f, 0.226440f, 0.257568f, 0.292236f, 0.329346f, 0.367188f, 0.405762f, - 0.445557f, 0.484619f, 0.522949f, 0.559570f, 0.595215f, 0.627441f, 0.659180f, 0.687012f, - 0.714355f, 0.739258f, 0.761719f, 0.781738f, 0.800781f, 0.817383f, 0.833984f, 0.847168f, - 0.859375f, 0.872070f, 0.882324f, 0.891602f, 0.900879f, 0.909668f, 0.916504f, 0.923828f, - 0.930176f, 0.936523f, 0.941895f, 0.946777f, 0.951172f, 0.956055f, 0.960449f, 0.963867f, - 0.967285f, 0.970703f, 0.987305f, 0.988770f, 0.988281f, 0.987793f, 0.987793f, 0.987793f, - 0.001357f, 0.004501f, 0.007557f, 0.011284f, 0.015236f, 0.019791f, 0.025101f, 0.030838f, - 0.037628f, 0.045532f, 0.054596f, 0.064636f, 0.076355f, 0.089905f, 0.105042f, 0.122498f, - 0.142334f, 0.164307f, 0.189697f, 0.217896f, 0.248413f, 0.281494f, 0.316406f, 0.354004f, - 0.391846f, 0.430664f, 0.469971f, 0.508301f, 0.545898f, 0.582031f, 0.615723f, 0.647461f, - 0.677734f, 0.704590f, 0.731445f, 0.754395f, 0.775391f, 0.794922f, 0.811523f, 0.829102f, - 0.842773f, 0.856934f, 0.868652f, 0.880371f, 0.891113f, 0.899414f, 0.908203f, 0.915527f, - 0.922852f, 0.930176f, 0.936035f, 0.941406f, 0.947266f, 0.951660f, 0.957031f, 0.960449f, - 0.963867f, 0.968262f, 0.986328f, 0.987305f, 0.987793f, 0.987305f, 0.987305f, 0.986816f, - 0.001239f, 0.003864f, 0.006699f, 0.009621f, 0.013008f, 0.017059f, 0.021805f, 0.026703f, - 0.032562f, 0.039185f, 0.045807f, 0.054352f, 0.064514f, 0.075439f, 0.088257f, 0.102478f, - 0.119263f, 0.138306f, 0.159546f, 0.183228f, 0.209961f, 0.239258f, 0.271484f, 0.305176f, - 0.341797f, 0.379639f, 0.417480f, 0.456787f, 0.495605f, 0.532227f, 0.570801f, 0.604980f, - 0.637207f, 0.666992f, 0.696289f, 0.722656f, 0.746582f, 0.768555f, 0.789062f, 0.808105f, - 0.824219f, 0.839844f, 0.854492f, 0.865723f, 0.878418f, 0.888672f, 0.897461f, 0.906738f, - 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941895f, 0.946289f, 0.952148f, 0.956543f, - 0.960449f, 0.964844f, 0.985352f, 0.986816f, 0.986816f, 0.986328f, 0.986328f, 0.985840f, - 0.001151f, 0.003429f, 0.005753f, 0.008400f, 0.011391f, 0.014877f, 0.018494f, 0.022858f, - 0.028046f, 0.033112f, 0.039642f, 0.046661f, 0.054565f, 0.064026f, 0.074280f, 0.086243f, - 0.100403f, 0.116150f, 0.133789f, 0.154053f, 0.176636f, 0.202393f, 0.230957f, 0.261719f, - 0.295166f, 0.330322f, 0.367432f, 0.405518f, 0.445312f, 0.483398f, 0.520996f, 0.558105f, - 0.594238f, 0.626465f, 0.659668f, 0.688477f, 0.714844f, 0.740723f, 0.763672f, 0.784180f, - 0.804199f, 0.821289f, 0.837402f, 0.852051f, 0.864258f, 0.876465f, 0.886719f, 0.897949f, - 0.906250f, 0.915039f, 0.922363f, 0.929199f, 0.935547f, 0.941406f, 0.946777f, 0.952637f, - 0.958008f, 0.961914f, 0.983887f, 0.985840f, 0.985352f, 0.985352f, 0.984863f, 0.984863f, - 0.001000f, 0.002768f, 0.005127f, 0.007515f, 0.010155f, 0.013283f, 0.016205f, 0.019714f, - 0.023987f, 0.028854f, 0.033905f, 0.040161f, 0.046814f, 0.054199f, 0.063110f, 0.073303f, - 0.084839f, 0.098145f, 0.112854f, 0.129883f, 0.149292f, 0.171387f, 0.195435f, 0.222778f, - 0.252686f, 0.285400f, 0.320312f, 0.356689f, 0.394531f, 0.433105f, 0.471924f, 0.510742f, - 0.547852f, 0.584473f, 0.617676f, 0.650879f, 0.680664f, 0.708984f, 0.734375f, 0.759277f, - 0.780762f, 0.799805f, 0.817383f, 0.834473f, 0.849121f, 0.862793f, 0.875488f, 0.886719f, - 0.896484f, 0.906250f, 0.915039f, 0.923828f, 0.930176f, 0.936035f, 0.942871f, 0.948242f, - 0.953613f, 0.958008f, 0.982910f, 0.983887f, 0.984375f, 0.983887f, 0.984375f, 0.983398f, - 0.000799f, 0.002705f, 0.004459f, 0.006573f, 0.008842f, 0.011375f, 0.014099f, 0.017487f, - 0.020798f, 0.024963f, 0.029465f, 0.034637f, 0.039703f, 0.046478f, 0.054047f, 0.062256f, - 0.072388f, 0.082947f, 0.095764f, 0.110229f, 0.126099f, 0.144775f, 0.165771f, 0.189697f, - 0.216187f, 0.244995f, 0.276123f, 0.310303f, 0.346191f, 0.384521f, 0.422607f, 0.461670f, - 0.500000f, 0.538574f, 0.575195f, 0.609863f, 0.643555f, 0.673828f, 0.702637f, 0.730469f, - 0.754395f, 0.777344f, 0.797363f, 0.815430f, 0.833008f, 0.848633f, 0.861328f, 0.875000f, - 0.886719f, 0.896973f, 0.906738f, 0.915039f, 0.923340f, 0.930176f, 0.936523f, 0.943848f, - 0.948730f, 0.954102f, 0.981445f, 0.983398f, 0.982910f, 0.983398f, 0.982910f, 0.982910f, - 0.000774f, 0.002554f, 0.003899f, 0.005875f, 0.007759f, 0.009949f, 0.012733f, 0.015060f, - 0.018280f, 0.021667f, 0.025574f, 0.029678f, 0.034698f, 0.040405f, 0.046570f, 0.053650f, - 0.061462f, 0.071106f, 0.081360f, 0.093323f, 0.107300f, 0.122864f, 0.140747f, 0.160522f, - 0.183960f, 0.209229f, 0.237305f, 0.268799f, 0.302002f, 0.337402f, 0.374023f, 0.413330f, - 0.451904f, 0.490967f, 0.529785f, 0.567383f, 0.603027f, 0.636719f, 0.668457f, 0.698242f, - 0.725586f, 0.750977f, 0.773926f, 0.793945f, 0.813965f, 0.831543f, 0.847656f, 0.861816f, - 0.874512f, 0.886719f, 0.897461f, 0.906738f, 0.915527f, 0.923828f, 0.931641f, 0.937988f, - 0.944824f, 0.949707f, 0.979980f, 0.981934f, 0.981934f, 0.981934f, 0.981934f, 0.981445f, - 0.000657f, 0.001934f, 0.003330f, 0.005280f, 0.006748f, 0.009079f, 0.010994f, 0.013763f, - 0.015945f, 0.019150f, 0.022003f, 0.026001f, 0.030350f, 0.034790f, 0.040253f, 0.045898f, - 0.052795f, 0.060852f, 0.069641f, 0.079346f, 0.091187f, 0.104492f, 0.119751f, 0.136963f, - 0.156372f, 0.178345f, 0.203247f, 0.230957f, 0.260742f, 0.294189f, 0.328613f, 0.365723f, - 0.403564f, 0.443115f, 0.482910f, 0.521484f, 0.559570f, 0.596680f, 0.630859f, 0.664062f, - 0.694336f, 0.722168f, 0.747559f, 0.771484f, 0.793457f, 0.813477f, 0.830078f, 0.846191f, - 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.908691f, 0.916992f, 0.925293f, 0.933594f, - 0.939941f, 0.946777f, 0.978516f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, 0.980469f, - 0.000818f, 0.001935f, 0.003246f, 0.004658f, 0.006229f, 0.007912f, 0.010017f, 0.012093f, - 0.014259f, 0.016586f, 0.019653f, 0.022659f, 0.026413f, 0.030289f, 0.034790f, 0.039917f, - 0.045441f, 0.052338f, 0.059479f, 0.068115f, 0.077759f, 0.089050f, 0.102051f, 0.116272f, - 0.133179f, 0.152344f, 0.173340f, 0.197876f, 0.224243f, 0.254150f, 0.286621f, 0.321533f, - 0.357666f, 0.396729f, 0.436279f, 0.475830f, 0.514648f, 0.553711f, 0.590332f, 0.626465f, - 0.659180f, 0.689941f, 0.719238f, 0.746094f, 0.770020f, 0.792480f, 0.812500f, 0.830566f, - 0.846680f, 0.862305f, 0.875977f, 0.888184f, 0.899414f, 0.910156f, 0.918945f, 0.927246f, - 0.935059f, 0.941895f, 0.977051f, 0.979004f, 0.979492f, 0.979004f, 0.979492f, 0.979004f, - 0.000583f, 0.001696f, 0.003044f, 0.004276f, 0.005394f, 0.007111f, 0.009048f, 0.010727f, - 0.012802f, 0.014549f, 0.017319f, 0.019943f, 0.023132f, 0.026459f, 0.030212f, 0.034576f, - 0.039612f, 0.045105f, 0.051422f, 0.058594f, 0.066833f, 0.076416f, 0.087341f, 0.099792f, - 0.113647f, 0.130005f, 0.147827f, 0.168945f, 0.192261f, 0.218750f, 0.247803f, 0.280029f, - 0.314209f, 0.351074f, 0.389404f, 0.429199f, 0.468750f, 0.508301f, 0.547852f, 0.585938f, - 0.622070f, 0.655762f, 0.687988f, 0.718262f, 0.744629f, 0.769531f, 0.792480f, 0.812500f, - 0.832520f, 0.848633f, 0.863770f, 0.877441f, 0.890137f, 0.901367f, 0.912109f, 0.921387f, - 0.929199f, 0.937500f, 0.975586f, 0.978027f, 0.978027f, 0.977539f, 0.977539f, 0.977051f, - 0.000463f, 0.001634f, 0.002899f, 0.003574f, 0.004932f, 0.006233f, 0.007866f, 0.009644f, - 0.011055f, 0.012894f, 0.015518f, 0.017792f, 0.020279f, 0.023178f, 0.026657f, 0.030136f, - 0.034271f, 0.039062f, 0.044586f, 0.050446f, 0.057739f, 0.065613f, 0.074646f, 0.084900f, - 0.097107f, 0.111023f, 0.126099f, 0.143921f, 0.164673f, 0.187500f, 0.213257f, 0.242065f, - 0.273926f, 0.308594f, 0.344971f, 0.383301f, 0.423340f, 0.463623f, 0.503906f, 0.543945f, - 0.582520f, 0.619629f, 0.653809f, 0.686523f, 0.717285f, 0.744629f, 0.770020f, 0.792969f, - 0.814453f, 0.833496f, 0.850098f, 0.866211f, 0.879395f, 0.893066f, 0.904297f, 0.914551f, - 0.923828f, 0.932129f, 0.973145f, 0.976074f, 0.976562f, 0.976074f, 0.976074f, 0.976074f, - 0.000472f, 0.001289f, 0.002508f, 0.003481f, 0.004459f, 0.005894f, 0.007042f, 0.008232f, - 0.009972f, 0.011719f, 0.013435f, 0.015884f, 0.017899f, 0.020386f, 0.023422f, 0.026428f, - 0.030411f, 0.034180f, 0.038757f, 0.043854f, 0.049652f, 0.056549f, 0.064270f, 0.073303f, - 0.083252f, 0.095093f, 0.107910f, 0.123169f, 0.141113f, 0.160645f, 0.183472f, 0.208618f, - 0.237305f, 0.268799f, 0.302734f, 0.339600f, 0.377930f, 0.418457f, 0.459473f, 0.500000f, - 0.540527f, 0.579102f, 0.617188f, 0.652832f, 0.685547f, 0.716309f, 0.745117f, 0.771484f, - 0.794922f, 0.815918f, 0.834961f, 0.853027f, 0.868652f, 0.882324f, 0.895996f, 0.907227f, - 0.916992f, 0.927246f, 0.972168f, 0.974121f, 0.975098f, 0.973633f, 0.974609f, 0.973633f, - 0.000238f, 0.001453f, 0.002047f, 0.002985f, 0.004227f, 0.005272f, 0.006096f, 0.007309f, - 0.008957f, 0.010437f, 0.012184f, 0.014214f, 0.015793f, 0.018082f, 0.020538f, 0.023270f, - 0.026505f, 0.029648f, 0.033813f, 0.038300f, 0.043457f, 0.049042f, 0.055298f, 0.062744f, - 0.070984f, 0.081299f, 0.092590f, 0.105591f, 0.120361f, 0.137695f, 0.156982f, 0.179443f, - 0.204346f, 0.232788f, 0.263672f, 0.297363f, 0.334229f, 0.373047f, 0.414307f, 0.455322f, - 0.497314f, 0.538086f, 0.578613f, 0.616211f, 0.653320f, 0.686523f, 0.718262f, 0.747559f, - 0.773438f, 0.797363f, 0.818848f, 0.838867f, 0.856934f, 0.871582f, 0.885742f, 0.898926f, - 0.910645f, 0.920410f, 0.970215f, 0.971680f, 0.972656f, 0.972656f, 0.972168f, 0.972168f, - 0.000376f, 0.001075f, 0.002052f, 0.002823f, 0.003603f, 0.004509f, 0.005619f, 0.007008f, - 0.008064f, 0.009132f, 0.010849f, 0.012314f, 0.013817f, 0.015945f, 0.018188f, 0.020676f, - 0.022995f, 0.026230f, 0.029587f, 0.033234f, 0.037598f, 0.042328f, 0.048004f, 0.054230f, - 0.061188f, 0.069824f, 0.079468f, 0.090454f, 0.103271f, 0.117493f, 0.134644f, 0.153931f, - 0.175293f, 0.200806f, 0.228149f, 0.259277f, 0.293945f, 0.330566f, 0.370117f, 0.410889f, - 0.453369f, 0.495605f, 0.537109f, 0.578125f, 0.616699f, 0.653809f, 0.689453f, 0.721191f, - 0.750000f, 0.776855f, 0.800293f, 0.822754f, 0.841309f, 0.859863f, 0.876465f, 0.890137f, - 0.902832f, 0.914062f, 0.967773f, 0.970703f, 0.970703f, 0.970703f, 0.970703f, 0.970703f, - 0.000237f, 0.000972f, 0.001674f, 0.002413f, 0.003336f, 0.003956f, 0.005093f, 0.006039f, - 0.007069f, 0.008202f, 0.009613f, 0.011017f, 0.012520f, 0.014282f, 0.016068f, 0.017853f, - 0.020508f, 0.023117f, 0.025986f, 0.029160f, 0.032898f, 0.036865f, 0.041565f, 0.046997f, - 0.052887f, 0.060089f, 0.068176f, 0.077515f, 0.088257f, 0.100586f, 0.114929f, 0.131592f, - 0.150635f, 0.172241f, 0.196411f, 0.224731f, 0.255859f, 0.290039f, 0.327393f, 0.367188f, - 0.409180f, 0.451172f, 0.493896f, 0.536621f, 0.578613f, 0.618164f, 0.655762f, 0.691406f, - 0.724121f, 0.753906f, 0.781738f, 0.805176f, 0.827637f, 0.847656f, 0.864746f, 0.880859f, - 0.895508f, 0.907715f, 0.965332f, 0.968262f, 0.968750f, 0.969238f, 0.967773f, 0.967773f, - 0.000450f, 0.001033f, 0.001554f, 0.002131f, 0.002939f, 0.003662f, 0.004551f, 0.005722f, - 0.006405f, 0.007542f, 0.008484f, 0.009750f, 0.011017f, 0.012596f, 0.014046f, 0.015854f, - 0.017975f, 0.020264f, 0.022736f, 0.025497f, 0.028671f, 0.031952f, 0.036011f, 0.040741f, - 0.045746f, 0.051910f, 0.058868f, 0.066772f, 0.075867f, 0.086304f, 0.098328f, 0.112244f, - 0.128784f, 0.147217f, 0.168945f, 0.193848f, 0.221558f, 0.252441f, 0.287109f, 0.324951f, - 0.365234f, 0.407715f, 0.450684f, 0.494629f, 0.539062f, 0.580566f, 0.621094f, 0.659668f, - 0.695801f, 0.729004f, 0.758789f, 0.786133f, 0.810547f, 0.833008f, 0.852539f, 0.870117f, - 0.886719f, 0.900879f, 0.962891f, 0.966309f, 0.966309f, 0.966797f, 0.966797f, 0.966309f, - 0.000304f, 0.001050f, 0.001257f, 0.002295f, 0.002689f, 0.003885f, 0.004284f, 0.004726f, - 0.005547f, 0.006721f, 0.007595f, 0.008667f, 0.009811f, 0.011330f, 0.012642f, 0.014130f, - 0.016098f, 0.017975f, 0.019867f, 0.022247f, 0.024811f, 0.028030f, 0.031403f, 0.035461f, - 0.039642f, 0.044800f, 0.050720f, 0.057495f, 0.065002f, 0.073914f, 0.084290f, 0.095947f, - 0.109985f, 0.126343f, 0.144409f, 0.166138f, 0.190918f, 0.218750f, 0.250244f, 0.285400f, - 0.323730f, 0.364258f, 0.407471f, 0.452148f, 0.496338f, 0.540527f, 0.584473f, 0.625977f, - 0.665039f, 0.701172f, 0.735352f, 0.765137f, 0.792480f, 0.817383f, 0.840332f, 0.859863f, - 0.876953f, 0.893066f, 0.959961f, 0.963379f, 0.963867f, 0.964355f, 0.963867f, 0.963867f, - 0.000228f, 0.000682f, 0.001293f, 0.001717f, 0.002352f, 0.003160f, 0.003626f, 0.004360f, - 0.005348f, 0.005871f, 0.006870f, 0.007660f, 0.008957f, 0.010002f, 0.011299f, 0.012375f, - 0.014099f, 0.015900f, 0.017670f, 0.019363f, 0.022034f, 0.024216f, 0.027420f, 0.030930f, - 0.034454f, 0.038910f, 0.044006f, 0.049530f, 0.055878f, 0.063477f, 0.072083f, 0.082275f, - 0.094177f, 0.107666f, 0.123840f, 0.142090f, 0.163452f, 0.188477f, 0.216919f, 0.248047f, - 0.283447f, 0.322754f, 0.364990f, 0.408447f, 0.453613f, 0.500000f, 0.544922f, 0.589355f, - 0.631348f, 0.671387f, 0.708008f, 0.742188f, 0.773438f, 0.800781f, 0.824219f, 0.846680f, - 0.866699f, 0.884277f, 0.958008f, 0.960938f, 0.961426f, 0.962402f, 0.961914f, 0.960938f, - 0.000239f, 0.000731f, 0.001204f, 0.001637f, 0.002144f, 0.002913f, 0.003521f, 0.003828f, - 0.004517f, 0.005291f, 0.006203f, 0.006954f, 0.007740f, 0.008911f, 0.010239f, 0.011017f, - 0.012413f, 0.013863f, 0.015396f, 0.017181f, 0.019196f, 0.021439f, 0.024078f, 0.026993f, - 0.030182f, 0.033752f, 0.038055f, 0.042664f, 0.048004f, 0.054657f, 0.061920f, 0.070312f, - 0.080688f, 0.092041f, 0.105774f, 0.121094f, 0.140015f, 0.161255f, 0.186523f, 0.214966f, - 0.246948f, 0.283203f, 0.322998f, 0.365967f, 0.410400f, 0.457275f, 0.503906f, 0.550781f, - 0.596191f, 0.638672f, 0.678711f, 0.716797f, 0.750488f, 0.781738f, 0.809082f, 0.833496f, - 0.855469f, 0.874512f, 0.954590f, 0.958008f, 0.958984f, 0.958984f, 0.958984f, 0.958984f, - 0.000226f, 0.000663f, 0.001073f, 0.001420f, 0.002163f, 0.002567f, 0.003052f, 0.003433f, - 0.004181f, 0.004734f, 0.005516f, 0.006424f, 0.007050f, 0.008003f, 0.008659f, 0.009827f, - 0.011086f, 0.012398f, 0.013649f, 0.015266f, 0.016891f, 0.018921f, 0.021118f, 0.023560f, - 0.026505f, 0.029556f, 0.032715f, 0.036865f, 0.041077f, 0.046570f, 0.053314f, 0.060150f, - 0.068787f, 0.078552f, 0.090027f, 0.103638f, 0.119690f, 0.138184f, 0.159546f, 0.184692f, - 0.213745f, 0.245972f, 0.283203f, 0.324219f, 0.367920f, 0.414062f, 0.461914f, 0.509766f, - 0.557129f, 0.604492f, 0.647461f, 0.688965f, 0.727051f, 0.761230f, 0.791504f, 0.819824f, - 0.844238f, 0.865234f, 0.951660f, 0.955566f, 0.955566f, 0.956055f, 0.955078f, 0.956543f, - 0.000156f, 0.000587f, 0.001056f, 0.001499f, 0.001647f, 0.002380f, 0.002594f, 0.003469f, - 0.003777f, 0.004112f, 0.004925f, 0.005699f, 0.006180f, 0.007019f, 0.007957f, 0.008942f, - 0.009560f, 0.010727f, 0.011963f, 0.013123f, 0.014885f, 0.016556f, 0.018494f, 0.020355f, - 0.022766f, 0.025330f, 0.028320f, 0.031830f, 0.035736f, 0.040161f, 0.045532f, 0.052032f, - 0.059113f, 0.066833f, 0.076782f, 0.088501f, 0.101868f, 0.117310f, 0.136108f, 0.157959f, - 0.183105f, 0.212769f, 0.247070f, 0.284424f, 0.326660f, 0.371338f, 0.419189f, 0.468994f, - 0.518066f, 0.567383f, 0.613770f, 0.658691f, 0.700684f, 0.738770f, 0.771973f, 0.803223f, - 0.829590f, 0.854492f, 0.947266f, 0.952637f, 0.952637f, 0.952637f, 0.953125f, 0.952637f, - 0.000155f, 0.000358f, 0.000859f, 0.001402f, 0.001830f, 0.002092f, 0.002499f, 0.002672f, - 0.003410f, 0.003763f, 0.004375f, 0.005077f, 0.005535f, 0.006554f, 0.007004f, 0.007874f, - 0.008537f, 0.009529f, 0.010742f, 0.011749f, 0.013016f, 0.014427f, 0.015945f, 0.017929f, - 0.019775f, 0.022018f, 0.024460f, 0.027618f, 0.030640f, 0.034668f, 0.039154f, 0.044250f, - 0.050293f, 0.057068f, 0.065491f, 0.074951f, 0.086487f, 0.099670f, 0.115906f, 0.134277f, - 0.156860f, 0.182495f, 0.213135f, 0.248047f, 0.286621f, 0.329834f, 0.376709f, 0.426025f, - 0.476562f, 0.527832f, 0.577637f, 0.626465f, 0.671387f, 0.713379f, 0.752441f, 0.784668f, - 0.815430f, 0.841797f, 0.944336f, 0.948242f, 0.949219f, 0.949219f, 0.949219f, 0.949707f, - 0.000233f, 0.000639f, 0.000930f, 0.001277f, 0.001579f, 0.001916f, 0.002041f, 0.002625f, - 0.003035f, 0.003571f, 0.004124f, 0.004375f, 0.004978f, 0.005379f, 0.006348f, 0.006886f, - 0.007526f, 0.008430f, 0.009216f, 0.010262f, 0.011436f, 0.012779f, 0.014160f, 0.015549f, - 0.017120f, 0.019089f, 0.021164f, 0.023621f, 0.026352f, 0.029724f, 0.033447f, 0.037842f, - 0.042603f, 0.048737f, 0.055573f, 0.063721f, 0.073364f, 0.084778f, 0.098206f, 0.114197f, - 0.133423f, 0.155762f, 0.182739f, 0.213623f, 0.249512f, 0.289795f, 0.335205f, 0.383789f, - 0.434814f, 0.487305f, 0.540039f, 0.591797f, 0.640137f, 0.686035f, 0.727539f, 0.765137f, - 0.800293f, 0.830078f, 0.940430f, 0.944336f, 0.945312f, 0.946289f, 0.945801f, 0.945312f, - 0.000217f, 0.000519f, 0.000848f, 0.001180f, 0.001366f, 0.001589f, 0.001986f, 0.002354f, - 0.002987f, 0.003170f, 0.003576f, 0.003901f, 0.004440f, 0.004738f, 0.005543f, 0.006058f, - 0.006508f, 0.007511f, 0.008163f, 0.009132f, 0.010078f, 0.011246f, 0.012390f, 0.013412f, - 0.014938f, 0.016632f, 0.018433f, 0.020676f, 0.022995f, 0.025726f, 0.028702f, 0.032227f, - 0.036377f, 0.041992f, 0.047394f, 0.053986f, 0.062195f, 0.071716f, 0.082825f, 0.096802f, - 0.112732f, 0.132202f, 0.155273f, 0.182861f, 0.215210f, 0.252441f, 0.294678f, 0.341553f, - 0.392090f, 0.445557f, 0.499512f, 0.553711f, 0.606445f, 0.656250f, 0.703125f, 0.745605f, - 0.782715f, 0.816895f, 0.935547f, 0.939941f, 0.941406f, 0.941406f, 0.941406f, 0.940918f, - 0.000242f, 0.000678f, 0.000781f, 0.000928f, 0.001200f, 0.001592f, 0.001694f, 0.002096f, - 0.002703f, 0.002903f, 0.003170f, 0.003531f, 0.003918f, 0.004433f, 0.004955f, 0.005390f, - 0.005939f, 0.006454f, 0.007298f, 0.007782f, 0.008759f, 0.009567f, 0.010559f, 0.011650f, - 0.013046f, 0.014420f, 0.015793f, 0.017715f, 0.019699f, 0.021774f, 0.024460f, 0.027481f, - 0.031082f, 0.035065f, 0.039917f, 0.045715f, 0.052246f, 0.060486f, 0.070129f, 0.081482f, - 0.095093f, 0.111755f, 0.131714f, 0.155273f, 0.183838f, 0.217285f, 0.256348f, 0.300781f, - 0.350342f, 0.403076f, 0.458252f, 0.514160f, 0.570312f, 0.624512f, 0.675781f, 0.722168f, - 0.763672f, 0.800293f, 0.930664f, 0.935547f, 0.937500f, 0.937012f, 0.937500f, 0.937012f, - 0.000239f, 0.000297f, 0.000667f, 0.000785f, 0.001044f, 0.001269f, 0.001569f, 0.001950f, - 0.002224f, 0.002419f, 0.002810f, 0.003063f, 0.003626f, 0.003895f, 0.004261f, 0.004749f, - 0.005066f, 0.005726f, 0.006260f, 0.007019f, 0.007771f, 0.008369f, 0.008919f, 0.009941f, - 0.011101f, 0.012375f, 0.013519f, 0.015190f, 0.016891f, 0.018631f, 0.021011f, 0.023590f, - 0.026581f, 0.029892f, 0.033875f, 0.038757f, 0.044281f, 0.051147f, 0.058746f, 0.068481f, - 0.079834f, 0.094116f, 0.110779f, 0.131348f, 0.155884f, 0.185669f, 0.220825f, 0.261963f, - 0.308594f, 0.360352f, 0.416260f, 0.473877f, 0.532715f, 0.589844f, 0.645508f, 0.696289f, - 0.743652f, 0.784668f, 0.925781f, 0.930664f, 0.932129f, 0.932129f, 0.932129f, 0.932129f, - 0.000226f, 0.000351f, 0.000434f, 0.000624f, 0.000887f, 0.001040f, 0.001246f, 0.001665f, - 0.001856f, 0.002384f, 0.002420f, 0.002842f, 0.002874f, 0.003471f, 0.003735f, 0.004078f, - 0.004639f, 0.004910f, 0.005531f, 0.006065f, 0.006664f, 0.007370f, 0.007690f, 0.008690f, - 0.009544f, 0.010536f, 0.011795f, 0.012833f, 0.014183f, 0.015900f, 0.017899f, 0.019684f, - 0.022430f, 0.025253f, 0.028412f, 0.032410f, 0.037201f, 0.042633f, 0.049316f, 0.057159f, - 0.066772f, 0.078186f, 0.092590f, 0.110107f, 0.131348f, 0.156982f, 0.188232f, 0.225342f, - 0.269043f, 0.318604f, 0.373535f, 0.431641f, 0.492188f, 0.554199f, 0.613281f, 0.668945f, - 0.720703f, 0.766602f, 0.919922f, 0.925781f, 0.926758f, 0.926758f, 0.927246f, 0.926758f, - 0.000000f, 0.000340f, 0.000458f, 0.000715f, 0.000823f, 0.000895f, 0.001165f, 0.001518f, - 0.001636f, 0.001876f, 0.002190f, 0.002472f, 0.002640f, 0.002964f, 0.003340f, 0.003527f, - 0.004005f, 0.004227f, 0.004803f, 0.005260f, 0.005878f, 0.006042f, 0.006805f, 0.007500f, - 0.008469f, 0.009132f, 0.009949f, 0.011009f, 0.012077f, 0.013687f, 0.014938f, 0.016785f, - 0.018997f, 0.021194f, 0.023895f, 0.027283f, 0.030945f, 0.035583f, 0.040955f, 0.047760f, - 0.055573f, 0.065247f, 0.077209f, 0.091736f, 0.109619f, 0.131470f, 0.159058f, 0.192017f, - 0.231812f, 0.278076f, 0.331543f, 0.389404f, 0.450928f, 0.513672f, 0.577637f, 0.638672f, - 0.695801f, 0.746582f, 0.914062f, 0.919922f, 0.920898f, 0.921387f, 0.921387f, 0.921387f, - 0.000146f, 0.000319f, 0.000443f, 0.000458f, 0.000704f, 0.000894f, 0.001199f, 0.001324f, - 0.001549f, 0.001592f, 0.002081f, 0.002092f, 0.002237f, 0.002604f, 0.002815f, 0.003159f, - 0.003510f, 0.003937f, 0.004147f, 0.004425f, 0.004814f, 0.005318f, 0.005878f, 0.006413f, - 0.006924f, 0.007782f, 0.008408f, 0.009239f, 0.010414f, 0.011505f, 0.012642f, 0.014015f, - 0.015884f, 0.017563f, 0.019852f, 0.022598f, 0.025650f, 0.029663f, 0.033875f, 0.039307f, - 0.045898f, 0.053955f, 0.063782f, 0.075928f, 0.090820f, 0.109497f, 0.132690f, 0.161621f, - 0.196777f, 0.239624f, 0.290039f, 0.346436f, 0.408203f, 0.473633f, 0.540527f, 0.605957f, - 0.667969f, 0.725586f, 0.907715f, 0.914062f, 0.914062f, 0.915039f, 0.915039f, 0.915039f, - 0.000121f, 0.000251f, 0.000506f, 0.000532f, 0.000665f, 0.000830f, 0.001190f, 0.001164f, - 0.001290f, 0.001413f, 0.001755f, 0.001900f, 0.002157f, 0.002319f, 0.002422f, 0.002853f, - 0.003042f, 0.003254f, 0.003529f, 0.003725f, 0.004288f, 0.004585f, 0.005043f, 0.005539f, - 0.005970f, 0.006386f, 0.007126f, 0.007812f, 0.008652f, 0.009598f, 0.010651f, 0.011803f, - 0.013130f, 0.014702f, 0.016510f, 0.018814f, 0.021011f, 0.024368f, 0.028122f, 0.032379f, - 0.037506f, 0.044128f, 0.052277f, 0.062042f, 0.075073f, 0.090088f, 0.110107f, 0.134766f, - 0.165405f, 0.203613f, 0.249268f, 0.303955f, 0.365234f, 0.431396f, 0.501465f, 0.571777f, - 0.638672f, 0.702148f, 0.900879f, 0.906738f, 0.907227f, 0.908203f, 0.907227f, 0.908203f, - 0.000241f, 0.000122f, 0.000417f, 0.000505f, 0.000741f, 0.000782f, 0.000916f, 0.001145f, - 0.001189f, 0.001289f, 0.001331f, 0.001565f, 0.001779f, 0.002020f, 0.002171f, 0.002228f, - 0.002623f, 0.002752f, 0.002949f, 0.003157f, 0.003515f, 0.003847f, 0.004082f, 0.004429f, - 0.004990f, 0.005405f, 0.006008f, 0.006603f, 0.007103f, 0.007889f, 0.008789f, 0.009766f, - 0.010605f, 0.012177f, 0.013672f, 0.015305f, 0.017487f, 0.019913f, 0.022781f, 0.026245f, - 0.030670f, 0.035980f, 0.042389f, 0.050812f, 0.060883f, 0.073792f, 0.090088f, 0.111145f, - 0.138062f, 0.171143f, 0.212524f, 0.262695f, 0.322266f, 0.388184f, 0.460205f, 0.533203f, - 0.606445f, 0.676758f, 0.893066f, 0.898926f, 0.899414f, 0.899414f, 0.900879f, 0.900391f, - 0.000000f, 0.000114f, 0.000227f, 0.000407f, 0.000532f, 0.000732f, 0.000714f, 0.000922f, - 0.000993f, 0.001072f, 0.001190f, 0.001412f, 0.001569f, 0.001726f, 0.001959f, 0.002071f, - 0.002159f, 0.002350f, 0.002565f, 0.002729f, 0.003090f, 0.003248f, 0.003702f, 0.003761f, - 0.004192f, 0.004585f, 0.004925f, 0.005272f, 0.005966f, 0.006405f, 0.007275f, 0.007965f, - 0.008850f, 0.009872f, 0.011017f, 0.012383f, 0.014275f, 0.015900f, 0.018463f, 0.021194f, - 0.024673f, 0.028870f, 0.034271f, 0.040955f, 0.048981f, 0.059723f, 0.073059f, 0.090149f, - 0.112549f, 0.141357f, 0.178467f, 0.223755f, 0.280029f, 0.345215f, 0.417969f, 0.494385f, - 0.572266f, 0.648438f, 0.884277f, 0.890137f, 0.891602f, 0.891602f, 0.893066f, 0.892090f, - 0.000000f, 0.000219f, 0.000211f, 0.000333f, 0.000559f, 0.000609f, 0.000788f, 0.000805f, - 0.000869f, 0.000903f, 0.001101f, 0.001166f, 0.001302f, 0.001399f, 0.001456f, 0.001668f, - 0.001853f, 0.001999f, 0.002102f, 0.002256f, 0.002447f, 0.002728f, 0.002943f, 0.003178f, - 0.003515f, 0.003836f, 0.004074f, 0.004475f, 0.004745f, 0.005325f, 0.005970f, 0.006569f, - 0.007248f, 0.008102f, 0.008888f, 0.010132f, 0.011169f, 0.012947f, 0.014763f, 0.016891f, - 0.019760f, 0.023087f, 0.027176f, 0.032562f, 0.038940f, 0.047516f, 0.058167f, 0.072754f, - 0.090698f, 0.114929f, 0.146851f, 0.187744f, 0.239258f, 0.301514f, 0.373291f, 0.452637f, - 0.535645f, 0.617676f, 0.874512f, 0.880859f, 0.882324f, 0.883301f, 0.883301f, 0.882324f, - 0.000204f, 0.000207f, 0.000204f, 0.000322f, 0.000435f, 0.000480f, 0.000556f, 0.000615f, - 0.000747f, 0.000782f, 0.000844f, 0.001006f, 0.001159f, 0.001191f, 0.001231f, 0.001450f, - 0.001585f, 0.001633f, 0.001790f, 0.001919f, 0.002117f, 0.002298f, 0.002432f, 0.002651f, - 0.002939f, 0.003172f, 0.003399f, 0.003614f, 0.003944f, 0.004421f, 0.004704f, 0.005203f, - 0.005886f, 0.006454f, 0.007160f, 0.008049f, 0.009041f, 0.010201f, 0.011627f, 0.013237f, - 0.015404f, 0.018097f, 0.021469f, 0.025284f, 0.030884f, 0.036987f, 0.045990f, 0.056915f, - 0.072083f, 0.092163f, 0.119141f, 0.154419f, 0.200928f, 0.259277f, 0.328857f, 0.409424f, - 0.495605f, 0.584473f, 0.864258f, 0.871094f, 0.872070f, 0.873047f, 0.872559f, 0.873047f, - 0.000000f, 0.000044f, 0.000176f, 0.000290f, 0.000410f, 0.000390f, 0.000513f, 0.000546f, - 0.000647f, 0.000680f, 0.000827f, 0.000858f, 0.000958f, 0.001131f, 0.001102f, 0.001223f, - 0.001367f, 0.001401f, 0.001525f, 0.001610f, 0.001826f, 0.001821f, 0.002039f, 0.002253f, - 0.002459f, 0.002617f, 0.002708f, 0.003036f, 0.003279f, 0.003431f, 0.003805f, 0.004219f, - 0.004471f, 0.004929f, 0.005569f, 0.006310f, 0.007107f, 0.007988f, 0.009003f, 0.010384f, - 0.011856f, 0.014015f, 0.016418f, 0.019669f, 0.023666f, 0.028809f, 0.035583f, 0.044159f, - 0.056458f, 0.072571f, 0.094604f, 0.124329f, 0.164917f, 0.218018f, 0.284912f, 0.364746f, - 0.454102f, 0.549316f, 0.853027f, 0.859863f, 0.861328f, 0.861816f, 0.861816f, 0.861816f, - 0.000000f, 0.000069f, 0.000120f, 0.000345f, 0.000371f, 0.000398f, 0.000452f, 0.000396f, - 0.000498f, 0.000530f, 0.000596f, 0.000648f, 0.000781f, 0.000921f, 0.000995f, 0.001007f, - 0.001101f, 0.001146f, 0.001282f, 0.001278f, 0.001471f, 0.001554f, 0.001710f, 0.001811f, - 0.001995f, 0.001986f, 0.002314f, 0.002399f, 0.002499f, 0.002903f, 0.002975f, 0.003305f, - 0.003605f, 0.004086f, 0.004425f, 0.005081f, 0.005402f, 0.006035f, 0.006889f, 0.007755f, - 0.009041f, 0.010422f, 0.012672f, 0.014885f, 0.017746f, 0.021530f, 0.026733f, 0.033691f, - 0.043060f, 0.055847f, 0.073181f, 0.097473f, 0.132324f, 0.179077f, 0.241821f, 0.320068f, - 0.410400f, 0.510742f, 0.839844f, 0.847656f, 0.849121f, 0.849609f, 0.849121f, 0.849609f, - 0.000000f, 0.000000f, 0.000121f, 0.000243f, 0.000321f, 0.000354f, 0.000341f, 0.000431f, - 0.000423f, 0.000444f, 0.000473f, 0.000508f, 0.000595f, 0.000706f, 0.000737f, 0.000861f, - 0.000869f, 0.000926f, 0.001055f, 0.001104f, 0.001199f, 0.001306f, 0.001360f, 0.001433f, - 0.001530f, 0.001555f, 0.001673f, 0.001942f, 0.002138f, 0.002247f, 0.002562f, 0.002609f, - 0.002911f, 0.003204f, 0.003466f, 0.003757f, 0.004192f, 0.004845f, 0.005482f, 0.006008f, - 0.006874f, 0.007904f, 0.009171f, 0.011124f, 0.013260f, 0.015839f, 0.019821f, 0.024872f, - 0.031982f, 0.041534f, 0.055054f, 0.075012f, 0.103516f, 0.143677f, 0.199951f, 0.273438f, - 0.364502f, 0.469482f, 0.825684f, 0.834473f, 0.834961f, 0.835938f, 0.835938f, 0.835938f, - 0.000000f, 0.000000f, 0.000000f, 0.000120f, 0.000199f, 0.000272f, 0.000265f, 0.000363f, - 0.000379f, 0.000388f, 0.000489f, 0.000500f, 0.000488f, 0.000569f, 0.000604f, 0.000700f, - 0.000683f, 0.000720f, 0.000784f, 0.000844f, 0.001009f, 0.001047f, 0.001108f, 0.001258f, - 0.001276f, 0.001388f, 0.001410f, 0.001565f, 0.001592f, 0.001814f, 0.001800f, 0.002167f, - 0.002192f, 0.002556f, 0.002665f, 0.002905f, 0.003195f, 0.003574f, 0.004028f, 0.004513f, - 0.005127f, 0.005859f, 0.006847f, 0.008018f, 0.009491f, 0.011452f, 0.014099f, 0.017792f, - 0.022995f, 0.030258f, 0.040588f, 0.055878f, 0.078308f, 0.111450f, 0.160278f, 0.229248f, - 0.318359f, 0.425781f, 0.810547f, 0.818359f, 0.820312f, 0.821777f, 0.821777f, 0.820801f, - 0.000000f, 0.000121f, 0.000120f, 0.000172f, 0.000195f, 0.000171f, 0.000208f, 0.000272f, - 0.000316f, 0.000333f, 0.000348f, 0.000355f, 0.000412f, 0.000410f, 0.000515f, 0.000485f, - 0.000545f, 0.000656f, 0.000777f, 0.000659f, 0.000705f, 0.000762f, 0.000874f, 0.000927f, - 0.000959f, 0.000978f, 0.001045f, 0.001228f, 0.001294f, 0.001398f, 0.001443f, 0.001637f, - 0.001752f, 0.001925f, 0.002005f, 0.002230f, 0.002407f, 0.002670f, 0.002895f, 0.003267f, - 0.003933f, 0.004280f, 0.005051f, 0.005772f, 0.006718f, 0.008141f, 0.010117f, 0.012383f, - 0.015930f, 0.020920f, 0.028671f, 0.039673f, 0.056702f, 0.083313f, 0.124695f, 0.185791f, - 0.270996f, 0.379639f, 0.793457f, 0.801270f, 0.803711f, 0.803711f, 0.804688f, 0.804688f, - 0.000000f, 0.000121f, 0.000119f, 0.000144f, 0.000149f, 0.000166f, 0.000173f, 0.000167f, - 0.000214f, 0.000245f, 0.000334f, 0.000287f, 0.000303f, 0.000391f, 0.000401f, 0.000440f, - 0.000469f, 0.000493f, 0.000534f, 0.000513f, 0.000690f, 0.000682f, 0.000645f, 0.000712f, - 0.000715f, 0.000747f, 0.000842f, 0.000849f, 0.000967f, 0.000995f, 0.001178f, 0.001167f, - 0.001273f, 0.001395f, 0.001586f, 0.001748f, 0.001796f, 0.001986f, 0.002132f, 0.002476f, - 0.002893f, 0.003294f, 0.003653f, 0.004086f, 0.004890f, 0.005821f, 0.006927f, 0.008553f, - 0.010857f, 0.014137f, 0.019211f, 0.027084f, 0.039642f, 0.059448f, 0.092468f, 0.144775f, - 0.224487f, 0.332764f, 0.775391f, 0.784668f, 0.786133f, 0.786133f, 0.787109f, 0.786621f, - 0.000000f, 0.000000f, 0.000118f, 0.000116f, 0.000115f, 0.000113f, 0.000140f, 0.000140f, - 0.000149f, 0.000220f, 0.000171f, 0.000255f, 0.000274f, 0.000292f, 0.000318f, 0.000295f, - 0.000346f, 0.000352f, 0.000380f, 0.000406f, 0.000401f, 0.000533f, 0.000490f, 0.000551f, - 0.000558f, 0.000648f, 0.000628f, 0.000723f, 0.000788f, 0.000749f, 0.000836f, 0.000941f, - 0.000997f, 0.001065f, 0.001112f, 0.001207f, 0.001328f, 0.001535f, 0.001621f, 0.001840f, - 0.002022f, 0.002163f, 0.002522f, 0.002825f, 0.003391f, 0.003830f, 0.004616f, 0.005665f, - 0.007172f, 0.009247f, 0.012482f, 0.017532f, 0.025970f, 0.040161f, 0.064941f, 0.107422f, - 0.178833f, 0.283447f, 0.754883f, 0.764648f, 0.766113f, 0.767090f, 0.767578f, 0.767090f, - 0.000000f, 0.000119f, 0.000116f, 0.000114f, 0.000112f, 0.000110f, 0.000109f, 0.000117f, - 0.000114f, 0.000117f, 0.000125f, 0.000193f, 0.000141f, 0.000196f, 0.000221f, 0.000235f, - 0.000259f, 0.000278f, 0.000308f, 0.000316f, 0.000323f, 0.000315f, 0.000329f, 0.000351f, - 0.000388f, 0.000422f, 0.000465f, 0.000512f, 0.000571f, 0.000568f, 0.000588f, 0.000633f, - 0.000747f, 0.000751f, 0.000829f, 0.000958f, 0.000914f, 0.001104f, 0.001145f, 0.001255f, - 0.001337f, 0.001499f, 0.001701f, 0.001966f, 0.002275f, 0.002609f, 0.003119f, 0.003773f, - 0.004658f, 0.005920f, 0.007935f, 0.010948f, 0.015900f, 0.025284f, 0.042511f, 0.075012f, - 0.135010f, 0.234619f, 0.733398f, 0.743164f, 0.744629f, 0.745117f, 0.745605f, 0.745605f, - 0.000000f, 0.000116f, 0.000113f, 0.000111f, 0.000108f, 0.000106f, 0.000104f, 0.000103f, - 0.000098f, 0.000092f, 0.000099f, 0.000085f, 0.000098f, 0.000105f, 0.000163f, 0.000162f, - 0.000128f, 0.000193f, 0.000203f, 0.000214f, 0.000284f, 0.000239f, 0.000303f, 0.000268f, - 0.000327f, 0.000326f, 0.000329f, 0.000330f, 0.000407f, 0.000486f, 0.000406f, 0.000454f, - 0.000465f, 0.000495f, 0.000535f, 0.000592f, 0.000648f, 0.000727f, 0.000753f, 0.000807f, - 0.000956f, 0.000992f, 0.001108f, 0.001294f, 0.001418f, 0.001703f, 0.001978f, 0.002390f, - 0.002930f, 0.003643f, 0.004753f, 0.006519f, 0.009499f, 0.014824f, 0.025497f, 0.048065f, - 0.095154f, 0.185425f, 0.709961f, 0.719727f, 0.721191f, 0.721191f, 0.721680f, 0.721680f, - 0.000000f, 0.000113f, 0.000107f, 0.000106f, 0.000102f, 0.000100f, 0.000097f, 0.000096f, - 0.000095f, 0.000092f, 0.000087f, 0.000083f, 0.000078f, 0.000098f, 0.000077f, 0.000091f, - 0.000114f, 0.000128f, 0.000114f, 0.000147f, 0.000154f, 0.000162f, 0.000186f, 0.000174f, - 0.000220f, 0.000233f, 0.000235f, 0.000245f, 0.000250f, 0.000253f, 0.000321f, 0.000296f, - 0.000311f, 0.000354f, 0.000417f, 0.000419f, 0.000438f, 0.000443f, 0.000495f, 0.000513f, - 0.000585f, 0.000634f, 0.000705f, 0.000778f, 0.000912f, 0.001002f, 0.001163f, 0.001379f, - 0.001745f, 0.002092f, 0.002697f, 0.003721f, 0.005230f, 0.008194f, 0.013870f, 0.027359f, - 0.061066f, 0.138062f, 0.685547f, 0.694336f, 0.696777f, 0.696289f, 0.697754f, 0.697754f, - 0.000000f, 0.000106f, 0.000102f, 0.000097f, 0.000093f, 0.000091f, 0.000089f, 0.000087f, - 0.000085f, 0.000084f, 0.000082f, 0.000080f, 0.000076f, 0.000072f, 0.000069f, 0.000074f, - 0.000076f, 0.000059f, 0.000075f, 0.000062f, 0.000085f, 0.000091f, 0.000103f, 0.000111f, - 0.000121f, 0.000135f, 0.000128f, 0.000159f, 0.000171f, 0.000160f, 0.000178f, 0.000193f, - 0.000196f, 0.000202f, 0.000220f, 0.000230f, 0.000273f, 0.000289f, 0.000312f, 0.000330f, - 0.000335f, 0.000397f, 0.000408f, 0.000463f, 0.000517f, 0.000577f, 0.000691f, 0.000771f, - 0.000919f, 0.001150f, 0.001436f, 0.001955f, 0.002737f, 0.004185f, 0.007103f, 0.013863f, - 0.033661f, 0.093628f, 0.657227f, 0.667480f, 0.668945f, 0.669434f, 0.670898f, 0.669922f, - 0.000108f, 0.000093f, 0.000087f, 0.000082f, 0.000079f, 0.000078f, 0.000075f, 0.000073f, - 0.000071f, 0.000070f, 0.000069f, 0.000069f, 0.000067f, 0.000066f, 0.000064f, 0.000061f, - 0.000059f, 0.000056f, 0.000053f, 0.000051f, 0.000053f, 0.000049f, 0.000044f, 0.000047f, - 0.000055f, 0.000058f, 0.000071f, 0.000077f, 0.000093f, 0.000094f, 0.000103f, 0.000102f, - 0.000110f, 0.000126f, 0.000130f, 0.000138f, 0.000143f, 0.000166f, 0.000166f, 0.000178f, - 0.000194f, 0.000217f, 0.000228f, 0.000231f, 0.000265f, 0.000330f, 0.000341f, 0.000411f, - 0.000459f, 0.000549f, 0.000705f, 0.000867f, 0.001228f, 0.001863f, 0.003143f, 0.006283f, - 0.015594f, 0.054993f, 0.628418f, 0.638184f, 0.640137f, 0.640137f, 0.641602f, 0.641602f, - 0.000071f, 0.000058f, 0.000059f, 0.000058f, 0.000054f, 0.000054f, 0.000051f, 0.000053f, - 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000051f, 0.000050f, 0.000049f, 0.000049f, - 0.000049f, 0.000049f, 0.000047f, 0.000045f, 0.000043f, 0.000041f, 0.000039f, 0.000038f, - 0.000036f, 0.000034f, 0.000035f, 0.000037f, 0.000033f, 0.000034f, 0.000038f, 0.000047f, - 0.000054f, 0.000061f, 0.000064f, 0.000068f, 0.000069f, 0.000076f, 0.000083f, 0.000092f, - 0.000098f, 0.000103f, 0.000112f, 0.000129f, 0.000113f, 0.000139f, 0.000152f, 0.000185f, - 0.000204f, 0.000238f, 0.000282f, 0.000365f, 0.000503f, 0.000685f, 0.001178f, 0.002274f, - 0.006100f, 0.025162f, 0.597656f, 0.607910f, 0.610840f, 0.611816f, 0.610352f, 0.611328f, - 0.000000f, 0.000000f, 0.000004f, 0.000012f, 0.000014f, 0.000020f, 0.000022f, 0.000023f, - 0.000024f, 0.000022f, 0.000025f, 0.000027f, 0.000027f, 0.000026f, 0.000028f, 0.000029f, - 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, 0.000030f, - 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, - 0.000020f, 0.000019f, 0.000018f, 0.000019f, 0.000023f, 0.000024f, 0.000027f, 0.000032f, - 0.000038f, 0.000040f, 0.000041f, 0.000045f, 0.000054f, 0.000052f, 0.000055f, 0.000060f, - 0.000068f, 0.000089f, 0.000089f, 0.000115f, 0.000146f, 0.000198f, 0.000318f, 0.000586f, - 0.001614f, 0.008278f, 0.565918f, 0.576660f, 0.578125f, 0.579102f, 0.579590f, 0.580078f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000003f, 0.000003f, 0.000005f, 0.000005f, 0.000006f, 0.000007f, 0.000009f, 0.000009f, - 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000013f, 0.000014f, 0.000014f, 0.000015f, - 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, - 0.000009f, 0.000009f, 0.000008f, 0.000010f, 0.000013f, 0.000013f, 0.000013f, 0.000017f, - 0.000017f, 0.000022f, 0.000021f, 0.000023f, 0.000031f, 0.000032f, 0.000049f, 0.000079f, - 0.000204f, 0.001328f, 0.533203f, 0.543945f, 0.545410f, 0.546387f, 0.546875f, 0.546875f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, - 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000004f, 0.000016f, 0.499756f, 0.510254f, 0.513184f, 0.513672f, 0.514160f, 0.514160f, - }, - { - 0.076172f, 0.209839f, 0.320312f, 0.408691f, 0.481689f, 0.541016f, 0.591309f, 0.633789f, - 0.668945f, 0.699707f, 0.727051f, 0.749512f, 0.770020f, 0.788086f, 0.803711f, 0.817871f, - 0.832520f, 0.843750f, 0.854492f, 0.864258f, 0.873535f, 0.881836f, 0.889160f, 0.895996f, - 0.903320f, 0.909180f, 0.914551f, 0.920410f, 0.925781f, 0.929199f, 0.933594f, 0.938965f, - 0.942383f, 0.946289f, 0.949219f, 0.953125f, 0.955566f, 0.959473f, 0.961914f, 0.964355f, - 0.967285f, 0.970215f, 0.971680f, 0.974609f, 0.976562f, 0.978516f, 0.980469f, 0.982422f, - 0.984375f, 0.986328f, 0.987793f, 0.989746f, 0.990723f, 0.992676f, 0.993652f, 0.995117f, - 0.996582f, 0.998047f, 0.999023f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f, - 0.043396f, 0.133301f, 0.221313f, 0.303223f, 0.377441f, 0.442871f, 0.500000f, 0.550781f, - 0.595215f, 0.632812f, 0.666992f, 0.696777f, 0.723145f, 0.745605f, 0.765137f, 0.783691f, - 0.799805f, 0.815430f, 0.828613f, 0.839844f, 0.851562f, 0.861328f, 0.871582f, 0.879395f, - 0.887207f, 0.894531f, 0.901855f, 0.907227f, 0.914062f, 0.919434f, 0.924316f, 0.928711f, - 0.933594f, 0.937988f, 0.942383f, 0.945801f, 0.949219f, 0.953125f, 0.956055f, 0.959473f, - 0.962402f, 0.964355f, 0.967773f, 0.970215f, 0.972656f, 0.975098f, 0.977051f, 0.979492f, - 0.980957f, 0.983398f, 0.985352f, 0.986816f, 0.988281f, 0.990234f, 0.991699f, 0.993652f, - 0.995117f, 0.996094f, 0.998047f, 0.997070f, 0.996094f, 0.995117f, 0.994141f, 0.993164f, - 0.027832f, 0.088440f, 0.153198f, 0.221313f, 0.288086f, 0.352051f, 0.411621f, 0.466797f, - 0.515625f, 0.561523f, 0.601074f, 0.637207f, 0.667969f, 0.695312f, 0.721680f, 0.743652f, - 0.763184f, 0.781738f, 0.797852f, 0.812500f, 0.826172f, 0.838867f, 0.850098f, 0.859863f, - 0.869141f, 0.877930f, 0.886230f, 0.893555f, 0.900879f, 0.907227f, 0.912598f, 0.918457f, - 0.922852f, 0.928711f, 0.934082f, 0.938477f, 0.942383f, 0.946289f, 0.950195f, 0.953125f, - 0.956543f, 0.959961f, 0.962402f, 0.965820f, 0.968262f, 0.970703f, 0.973145f, 0.975586f, - 0.978027f, 0.979980f, 0.982422f, 0.984375f, 0.985840f, 0.987793f, 0.989746f, 0.991211f, - 0.993164f, 0.994141f, 0.997559f, 0.996582f, 0.995605f, 0.994629f, 0.993652f, 0.993164f, - 0.018921f, 0.061493f, 0.109497f, 0.161987f, 0.217041f, 0.273438f, 0.330811f, 0.384521f, - 0.437500f, 0.486084f, 0.530273f, 0.570312f, 0.607910f, 0.640137f, 0.670410f, 0.697266f, - 0.722656f, 0.743652f, 0.763672f, 0.781250f, 0.797363f, 0.812012f, 0.825684f, 0.837891f, - 0.848633f, 0.859863f, 0.869141f, 0.878418f, 0.886719f, 0.893066f, 0.900879f, 0.906738f, - 0.913574f, 0.919434f, 0.924316f, 0.930176f, 0.934082f, 0.939453f, 0.942871f, 0.946777f, - 0.950684f, 0.954590f, 0.958008f, 0.960449f, 0.963379f, 0.966797f, 0.969238f, 0.971680f, - 0.974121f, 0.977051f, 0.978516f, 0.980957f, 0.983398f, 0.985352f, 0.987305f, 0.989258f, - 0.991211f, 0.992676f, 0.996094f, 0.995605f, 0.994629f, 0.993652f, 0.993164f, 0.992188f, - 0.013596f, 0.044495f, 0.080017f, 0.119873f, 0.164307f, 0.211670f, 0.261475f, 0.311523f, - 0.362793f, 0.410645f, 0.458008f, 0.501953f, 0.542969f, 0.580078f, 0.614746f, 0.645996f, - 0.674805f, 0.701172f, 0.723633f, 0.745117f, 0.765625f, 0.782227f, 0.798828f, 0.812988f, - 0.826172f, 0.838867f, 0.849609f, 0.861328f, 0.870605f, 0.878906f, 0.887695f, 0.895020f, - 0.901855f, 0.907715f, 0.914551f, 0.920898f, 0.925781f, 0.930664f, 0.934570f, 0.940918f, - 0.943848f, 0.947754f, 0.951660f, 0.955566f, 0.958984f, 0.961914f, 0.964844f, 0.967773f, - 0.970703f, 0.973145f, 0.975586f, 0.978027f, 0.979980f, 0.982422f, 0.984863f, 0.986328f, - 0.988770f, 0.990234f, 0.995117f, 0.995117f, 0.994141f, 0.993652f, 0.992676f, 0.991699f, - 0.010414f, 0.033203f, 0.060364f, 0.090942f, 0.125610f, 0.163818f, 0.206421f, 0.250488f, - 0.295898f, 0.341797f, 0.388428f, 0.433350f, 0.475830f, 0.517090f, 0.555176f, 0.589844f, - 0.622559f, 0.652344f, 0.680176f, 0.704590f, 0.729004f, 0.748535f, 0.767578f, 0.784668f, - 0.800293f, 0.814941f, 0.828125f, 0.839844f, 0.852051f, 0.861816f, 0.871582f, 0.879883f, - 0.888672f, 0.895996f, 0.903320f, 0.909180f, 0.916016f, 0.921387f, 0.927246f, 0.931641f, - 0.937012f, 0.940918f, 0.946289f, 0.950195f, 0.953125f, 0.957520f, 0.960449f, 0.963867f, - 0.966309f, 0.969238f, 0.972168f, 0.975098f, 0.976562f, 0.979492f, 0.981934f, 0.983887f, - 0.985840f, 0.988281f, 0.994629f, 0.994141f, 0.993652f, 0.992676f, 0.991699f, 0.990723f, - 0.007889f, 0.025772f, 0.046539f, 0.070312f, 0.097168f, 0.128540f, 0.162354f, 0.200195f, - 0.239868f, 0.281738f, 0.325195f, 0.368896f, 0.411621f, 0.453125f, 0.493652f, 0.531738f, - 0.566406f, 0.601074f, 0.631836f, 0.659668f, 0.687988f, 0.709961f, 0.732422f, 0.753418f, - 0.770996f, 0.788086f, 0.804199f, 0.818359f, 0.831543f, 0.843750f, 0.854492f, 0.864746f, - 0.873535f, 0.882812f, 0.890137f, 0.898438f, 0.905273f, 0.912598f, 0.917969f, 0.923828f, - 0.929199f, 0.934570f, 0.938477f, 0.942871f, 0.948242f, 0.951660f, 0.955078f, 0.958496f, - 0.961914f, 0.965332f, 0.968262f, 0.971680f, 0.973633f, 0.976562f, 0.979492f, 0.981445f, - 0.983398f, 0.985352f, 0.993164f, 0.993164f, 0.992676f, 0.991699f, 0.991211f, 0.990234f, - 0.006332f, 0.020325f, 0.036438f, 0.055573f, 0.077026f, 0.101562f, 0.129028f, 0.160278f, - 0.194458f, 0.230347f, 0.268555f, 0.309326f, 0.350830f, 0.391846f, 0.432373f, 0.472412f, - 0.509277f, 0.545410f, 0.579102f, 0.611816f, 0.640625f, 0.668945f, 0.693848f, 0.716797f, - 0.739258f, 0.758789f, 0.775879f, 0.793945f, 0.807617f, 0.821777f, 0.834961f, 0.846680f, - 0.857422f, 0.867676f, 0.877441f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.915039f, - 0.920898f, 0.926270f, 0.931152f, 0.937012f, 0.940918f, 0.946289f, 0.949219f, 0.954102f, - 0.958008f, 0.960938f, 0.964355f, 0.967773f, 0.970703f, 0.973145f, 0.975586f, 0.978516f, - 0.981445f, 0.983398f, 0.992188f, 0.992188f, 0.991699f, 0.990723f, 0.990723f, 0.989746f, - 0.005226f, 0.016647f, 0.029556f, 0.044434f, 0.061523f, 0.081543f, 0.103760f, 0.129150f, - 0.157837f, 0.188477f, 0.221924f, 0.257812f, 0.295654f, 0.334473f, 0.374023f, 0.412842f, - 0.451904f, 0.489990f, 0.525391f, 0.560059f, 0.593262f, 0.623047f, 0.651855f, 0.678223f, - 0.702148f, 0.725098f, 0.745605f, 0.764160f, 0.781738f, 0.799316f, 0.812500f, 0.827148f, - 0.838867f, 0.851074f, 0.861328f, 0.871582f, 0.880371f, 0.889648f, 0.896973f, 0.904297f, - 0.911621f, 0.917480f, 0.923340f, 0.929688f, 0.934570f, 0.939941f, 0.943848f, 0.948242f, - 0.951660f, 0.957031f, 0.959473f, 0.963379f, 0.966797f, 0.969727f, 0.972656f, 0.976074f, - 0.979004f, 0.980957f, 0.991699f, 0.991211f, 0.990723f, 0.990234f, 0.989746f, 0.988770f, - 0.004108f, 0.013542f, 0.023819f, 0.036194f, 0.050262f, 0.066223f, 0.084717f, 0.104797f, - 0.128174f, 0.153809f, 0.182861f, 0.213989f, 0.247437f, 0.282471f, 0.319580f, 0.357422f, - 0.395508f, 0.433350f, 0.470947f, 0.506348f, 0.542480f, 0.575684f, 0.605957f, 0.635254f, - 0.662109f, 0.687988f, 0.711426f, 0.732910f, 0.753418f, 0.771973f, 0.789062f, 0.804688f, - 0.819336f, 0.831543f, 0.843750f, 0.855469f, 0.866211f, 0.875488f, 0.884766f, 0.893066f, - 0.901367f, 0.907715f, 0.914062f, 0.921387f, 0.927246f, 0.932129f, 0.937012f, 0.942383f, - 0.946777f, 0.951660f, 0.956055f, 0.959473f, 0.962891f, 0.966309f, 0.969238f, 0.972168f, - 0.975098f, 0.978027f, 0.989746f, 0.990234f, 0.990234f, 0.989258f, 0.989258f, 0.988281f, - 0.003597f, 0.011330f, 0.020065f, 0.029938f, 0.041412f, 0.054504f, 0.068970f, 0.086182f, - 0.105469f, 0.126709f, 0.151123f, 0.177612f, 0.206909f, 0.237915f, 0.271484f, 0.305664f, - 0.342529f, 0.378906f, 0.416748f, 0.453125f, 0.489502f, 0.524414f, 0.558105f, 0.589844f, - 0.619629f, 0.646973f, 0.673828f, 0.698242f, 0.721191f, 0.742676f, 0.761230f, 0.778809f, - 0.796387f, 0.810547f, 0.824707f, 0.837891f, 0.850098f, 0.861328f, 0.871094f, 0.881348f, - 0.889648f, 0.896973f, 0.904785f, 0.912109f, 0.919434f, 0.924316f, 0.931152f, 0.936523f, - 0.941895f, 0.946289f, 0.951172f, 0.955078f, 0.959473f, 0.962402f, 0.965820f, 0.969238f, - 0.972656f, 0.975586f, 0.988770f, 0.989258f, 0.989258f, 0.988770f, 0.987793f, 0.987305f, - 0.002836f, 0.009857f, 0.016693f, 0.025208f, 0.034668f, 0.045288f, 0.057617f, 0.071106f, - 0.087463f, 0.104858f, 0.125000f, 0.147461f, 0.172119f, 0.199829f, 0.229248f, 0.260742f, - 0.294434f, 0.329102f, 0.365479f, 0.400879f, 0.437012f, 0.472656f, 0.508301f, 0.541992f, - 0.574219f, 0.604980f, 0.634766f, 0.660645f, 0.686523f, 0.709473f, 0.731445f, 0.751953f, - 0.770996f, 0.789062f, 0.804199f, 0.817871f, 0.832520f, 0.844727f, 0.856445f, 0.867188f, - 0.876953f, 0.886719f, 0.895020f, 0.902832f, 0.909668f, 0.916504f, 0.923340f, 0.929688f, - 0.935547f, 0.939941f, 0.944824f, 0.949707f, 0.954102f, 0.958496f, 0.961914f, 0.965820f, - 0.969238f, 0.972656f, 0.987793f, 0.988281f, 0.988281f, 0.987793f, 0.986816f, 0.986328f, - 0.002541f, 0.008118f, 0.014244f, 0.021194f, 0.029480f, 0.037811f, 0.048584f, 0.060028f, - 0.073242f, 0.088196f, 0.104370f, 0.123047f, 0.144531f, 0.167114f, 0.193237f, 0.220947f, - 0.250977f, 0.282227f, 0.316162f, 0.351074f, 0.386719f, 0.422119f, 0.457520f, 0.492432f, - 0.526367f, 0.559082f, 0.590332f, 0.621094f, 0.648438f, 0.674316f, 0.698730f, 0.721191f, - 0.742188f, 0.762207f, 0.780762f, 0.797363f, 0.812500f, 0.826172f, 0.840332f, 0.852051f, - 0.863770f, 0.873535f, 0.883301f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.922363f, - 0.928711f, 0.933594f, 0.939453f, 0.944824f, 0.950195f, 0.953125f, 0.958008f, 0.962402f, - 0.965332f, 0.969238f, 0.986816f, 0.987305f, 0.986816f, 0.986328f, 0.985840f, 0.984863f, - 0.002115f, 0.007030f, 0.012138f, 0.017944f, 0.024521f, 0.032318f, 0.040955f, 0.050476f, - 0.061676f, 0.073914f, 0.087769f, 0.103271f, 0.121033f, 0.140747f, 0.162598f, 0.187256f, - 0.213379f, 0.242065f, 0.272705f, 0.305176f, 0.338623f, 0.373047f, 0.408691f, 0.443848f, - 0.478760f, 0.512695f, 0.545898f, 0.577637f, 0.607910f, 0.636719f, 0.663086f, 0.688965f, - 0.712402f, 0.734863f, 0.754395f, 0.774414f, 0.791016f, 0.806641f, 0.822266f, 0.835449f, - 0.848145f, 0.859863f, 0.870605f, 0.880371f, 0.890137f, 0.898438f, 0.906250f, 0.914551f, - 0.921387f, 0.926758f, 0.933594f, 0.938965f, 0.944336f, 0.949219f, 0.954102f, 0.958984f, - 0.961914f, 0.965820f, 0.985840f, 0.986328f, 0.985840f, 0.985352f, 0.985352f, 0.984375f, - 0.001999f, 0.006226f, 0.010384f, 0.015594f, 0.021027f, 0.027435f, 0.034637f, 0.042969f, - 0.052124f, 0.062469f, 0.074097f, 0.087646f, 0.102173f, 0.119141f, 0.137695f, 0.158203f, - 0.181396f, 0.206543f, 0.233643f, 0.263184f, 0.295166f, 0.327148f, 0.360596f, 0.395264f, - 0.430420f, 0.464600f, 0.499023f, 0.532227f, 0.564941f, 0.595703f, 0.625000f, 0.651855f, - 0.679199f, 0.703613f, 0.726074f, 0.747559f, 0.766602f, 0.784668f, 0.801758f, 0.816895f, - 0.831055f, 0.843750f, 0.856934f, 0.867188f, 0.878418f, 0.887207f, 0.896484f, 0.904785f, - 0.913086f, 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944336f, 0.949707f, 0.953613f, - 0.958496f, 0.962891f, 0.983887f, 0.984863f, 0.984863f, 0.984375f, 0.983887f, 0.983398f, - 0.001891f, 0.004959f, 0.009300f, 0.013786f, 0.018433f, 0.023560f, 0.029892f, 0.037018f, - 0.044586f, 0.053284f, 0.062805f, 0.074341f, 0.086975f, 0.100586f, 0.116760f, 0.133789f, - 0.154175f, 0.176025f, 0.200317f, 0.226318f, 0.254395f, 0.284424f, 0.316650f, 0.349365f, - 0.383301f, 0.418213f, 0.452393f, 0.487061f, 0.520508f, 0.553223f, 0.584473f, 0.613770f, - 0.643066f, 0.668945f, 0.695312f, 0.718262f, 0.740234f, 0.761230f, 0.778809f, 0.797363f, - 0.812988f, 0.827148f, 0.840332f, 0.854004f, 0.865723f, 0.875977f, 0.886230f, 0.895020f, - 0.904297f, 0.912598f, 0.919922f, 0.926270f, 0.932617f, 0.938965f, 0.943359f, 0.949219f, - 0.955078f, 0.958984f, 0.982422f, 0.983887f, 0.983398f, 0.982910f, 0.982910f, 0.981934f, - 0.001368f, 0.004715f, 0.008041f, 0.011948f, 0.016235f, 0.020889f, 0.025848f, 0.031921f, - 0.038391f, 0.045563f, 0.054108f, 0.063477f, 0.074036f, 0.085815f, 0.099304f, 0.114563f, - 0.131104f, 0.150146f, 0.170654f, 0.193970f, 0.219360f, 0.246338f, 0.275146f, 0.306396f, - 0.338867f, 0.372559f, 0.406494f, 0.440918f, 0.474609f, 0.508789f, 0.541992f, 0.574219f, - 0.604492f, 0.634277f, 0.661133f, 0.687500f, 0.710938f, 0.733887f, 0.754883f, 0.774414f, - 0.792480f, 0.809570f, 0.824707f, 0.838379f, 0.852051f, 0.862793f, 0.874023f, 0.885254f, - 0.895020f, 0.903320f, 0.912109f, 0.919434f, 0.926758f, 0.932617f, 0.939941f, 0.945312f, - 0.951172f, 0.955078f, 0.980957f, 0.982910f, 0.982422f, 0.982422f, 0.981445f, 0.981445f, - 0.001393f, 0.004227f, 0.007011f, 0.010323f, 0.014107f, 0.018234f, 0.022766f, 0.027649f, - 0.032898f, 0.039581f, 0.046539f, 0.054230f, 0.063293f, 0.073608f, 0.085144f, 0.097961f, - 0.112305f, 0.127930f, 0.146362f, 0.166260f, 0.188599f, 0.212524f, 0.238647f, 0.266846f, - 0.297363f, 0.328369f, 0.361816f, 0.395752f, 0.429932f, 0.464844f, 0.498535f, 0.531250f, - 0.564453f, 0.596191f, 0.625488f, 0.653320f, 0.680176f, 0.704590f, 0.728027f, 0.750977f, - 0.770020f, 0.788574f, 0.805176f, 0.821289f, 0.835449f, 0.849609f, 0.862793f, 0.874023f, - 0.884277f, 0.894043f, 0.903320f, 0.911621f, 0.919434f, 0.926758f, 0.933594f, 0.939453f, - 0.945312f, 0.951172f, 0.979492f, 0.980957f, 0.980957f, 0.980957f, 0.980469f, 0.979980f, - 0.001163f, 0.003527f, 0.006229f, 0.009323f, 0.012199f, 0.015808f, 0.019928f, 0.024200f, - 0.028870f, 0.033997f, 0.040161f, 0.046967f, 0.054871f, 0.063477f, 0.073181f, 0.083618f, - 0.096252f, 0.109863f, 0.125122f, 0.142334f, 0.161743f, 0.182739f, 0.206421f, 0.232300f, - 0.259277f, 0.288086f, 0.320068f, 0.352783f, 0.386475f, 0.420410f, 0.454590f, 0.489258f, - 0.521973f, 0.555176f, 0.586914f, 0.617188f, 0.646484f, 0.673828f, 0.699707f, 0.723633f, - 0.746094f, 0.766113f, 0.785645f, 0.803223f, 0.819336f, 0.834961f, 0.848633f, 0.861328f, - 0.873535f, 0.884766f, 0.893555f, 0.903809f, 0.911621f, 0.920410f, 0.928223f, 0.934082f, - 0.939941f, 0.946777f, 0.978027f, 0.979492f, 0.979492f, 0.979004f, 0.979004f, 0.978516f, - 0.000981f, 0.002987f, 0.005329f, 0.008186f, 0.010895f, 0.013832f, 0.017532f, 0.021149f, - 0.025253f, 0.029999f, 0.035034f, 0.040985f, 0.047485f, 0.054993f, 0.063049f, 0.072510f, - 0.082581f, 0.094421f, 0.107727f, 0.122498f, 0.138794f, 0.157471f, 0.178467f, 0.200562f, - 0.225586f, 0.251953f, 0.281250f, 0.311279f, 0.343750f, 0.377197f, 0.411621f, 0.445557f, - 0.479736f, 0.513672f, 0.546875f, 0.579590f, 0.610352f, 0.640625f, 0.668457f, 0.694336f, - 0.718750f, 0.742188f, 0.762695f, 0.782715f, 0.801270f, 0.817871f, 0.833496f, 0.847168f, - 0.860840f, 0.872559f, 0.884277f, 0.894531f, 0.904297f, 0.912598f, 0.920898f, 0.928711f, - 0.935547f, 0.942383f, 0.976074f, 0.978027f, 0.978516f, 0.978027f, 0.977539f, 0.977051f, - 0.000880f, 0.002707f, 0.005089f, 0.007305f, 0.010147f, 0.012596f, 0.015160f, 0.018616f, - 0.022507f, 0.026230f, 0.030777f, 0.035767f, 0.041351f, 0.047455f, 0.054565f, 0.062256f, - 0.071289f, 0.081299f, 0.092346f, 0.105408f, 0.119812f, 0.135620f, 0.153320f, 0.173462f, - 0.195068f, 0.219482f, 0.245361f, 0.273682f, 0.303711f, 0.335938f, 0.368896f, 0.402588f, - 0.437500f, 0.472168f, 0.505859f, 0.539551f, 0.573242f, 0.604492f, 0.634766f, 0.663086f, - 0.689453f, 0.714844f, 0.738770f, 0.760254f, 0.780762f, 0.799316f, 0.817383f, 0.833496f, - 0.847168f, 0.860840f, 0.873535f, 0.884766f, 0.895508f, 0.905273f, 0.914062f, 0.922363f, - 0.930176f, 0.937012f, 0.974609f, 0.976074f, 0.976074f, 0.976562f, 0.976074f, 0.975586f, - 0.000851f, 0.002659f, 0.004692f, 0.006466f, 0.008545f, 0.011055f, 0.013649f, 0.016403f, - 0.019714f, 0.023056f, 0.026962f, 0.031235f, 0.035828f, 0.041656f, 0.047699f, 0.054077f, - 0.061859f, 0.070496f, 0.080200f, 0.091125f, 0.103088f, 0.116882f, 0.132446f, 0.149780f, - 0.168701f, 0.190430f, 0.213379f, 0.239258f, 0.267334f, 0.296631f, 0.328369f, 0.360840f, - 0.395020f, 0.429932f, 0.464355f, 0.499512f, 0.533203f, 0.566406f, 0.599121f, 0.629883f, - 0.658203f, 0.687012f, 0.712402f, 0.735840f, 0.758789f, 0.779297f, 0.798828f, 0.816406f, - 0.832520f, 0.847168f, 0.861328f, 0.874023f, 0.886230f, 0.896973f, 0.907227f, 0.915527f, - 0.924805f, 0.931641f, 0.972168f, 0.975586f, 0.975586f, 0.974609f, 0.974121f, 0.973633f, - 0.000762f, 0.002214f, 0.004040f, 0.005859f, 0.007790f, 0.009689f, 0.012161f, 0.014786f, - 0.017441f, 0.020493f, 0.023956f, 0.027618f, 0.031860f, 0.036255f, 0.041595f, 0.047394f, - 0.053894f, 0.061188f, 0.069214f, 0.078735f, 0.089050f, 0.101135f, 0.114441f, 0.129150f, - 0.145874f, 0.164673f, 0.185303f, 0.208862f, 0.233765f, 0.260742f, 0.290283f, 0.321045f, - 0.354248f, 0.388184f, 0.422607f, 0.457764f, 0.493652f, 0.526855f, 0.561523f, 0.594238f, - 0.625977f, 0.655273f, 0.683594f, 0.710449f, 0.734863f, 0.758301f, 0.779297f, 0.798828f, - 0.817383f, 0.833984f, 0.848145f, 0.862793f, 0.875488f, 0.887207f, 0.899414f, 0.908691f, - 0.917969f, 0.926270f, 0.970215f, 0.972656f, 0.974121f, 0.973145f, 0.972656f, 0.972168f, - 0.000732f, 0.001928f, 0.003513f, 0.005234f, 0.007042f, 0.008629f, 0.010620f, 0.012985f, - 0.015244f, 0.018158f, 0.020935f, 0.024475f, 0.027908f, 0.032013f, 0.036316f, 0.041290f, - 0.046661f, 0.053040f, 0.060089f, 0.068115f, 0.077087f, 0.087463f, 0.099121f, 0.111633f, - 0.126221f, 0.142578f, 0.160767f, 0.181396f, 0.203003f, 0.228149f, 0.255127f, 0.284180f, - 0.315186f, 0.347900f, 0.381836f, 0.416748f, 0.451904f, 0.487549f, 0.522949f, 0.556641f, - 0.590332f, 0.623047f, 0.652832f, 0.682129f, 0.708984f, 0.733887f, 0.757324f, 0.779785f, - 0.799316f, 0.818359f, 0.835449f, 0.850586f, 0.865234f, 0.877441f, 0.890137f, 0.901367f, - 0.912109f, 0.920410f, 0.968262f, 0.970703f, 0.971191f, 0.970703f, 0.971191f, 0.971191f, - 0.000524f, 0.001758f, 0.003185f, 0.004864f, 0.006081f, 0.007820f, 0.009705f, 0.011467f, - 0.013634f, 0.016068f, 0.018707f, 0.021378f, 0.024597f, 0.028030f, 0.032135f, 0.036224f, - 0.041016f, 0.046692f, 0.052399f, 0.059265f, 0.067505f, 0.076050f, 0.085510f, 0.096558f, - 0.109253f, 0.123657f, 0.138794f, 0.157227f, 0.176880f, 0.198730f, 0.223267f, 0.250000f, - 0.278809f, 0.309326f, 0.342041f, 0.375977f, 0.410889f, 0.447021f, 0.483154f, 0.518555f, - 0.554199f, 0.586914f, 0.620117f, 0.650879f, 0.681641f, 0.708496f, 0.734375f, 0.757324f, - 0.780762f, 0.801270f, 0.819336f, 0.837891f, 0.852539f, 0.867188f, 0.880371f, 0.893066f, - 0.903809f, 0.914551f, 0.966309f, 0.968750f, 0.969238f, 0.969727f, 0.968750f, 0.968750f, - 0.000503f, 0.001896f, 0.002653f, 0.004128f, 0.005627f, 0.007004f, 0.008797f, 0.010361f, - 0.012230f, 0.014175f, 0.016647f, 0.019348f, 0.021454f, 0.024872f, 0.028290f, 0.031830f, - 0.036163f, 0.040649f, 0.045715f, 0.051941f, 0.058319f, 0.065979f, 0.074402f, 0.083618f, - 0.094360f, 0.106812f, 0.120239f, 0.135742f, 0.153320f, 0.172974f, 0.194824f, 0.218506f, - 0.245117f, 0.273926f, 0.304688f, 0.336426f, 0.371094f, 0.406982f, 0.442627f, 0.479492f, - 0.514648f, 0.550781f, 0.584961f, 0.618652f, 0.650879f, 0.681152f, 0.709473f, 0.735352f, - 0.760742f, 0.782715f, 0.803711f, 0.821777f, 0.838867f, 0.855957f, 0.870605f, 0.884277f, - 0.895996f, 0.906738f, 0.964355f, 0.966309f, 0.967285f, 0.966797f, 0.966309f, 0.966309f, - 0.000636f, 0.001421f, 0.002768f, 0.003761f, 0.004944f, 0.006462f, 0.007889f, 0.009262f, - 0.010780f, 0.013000f, 0.014946f, 0.017029f, 0.019516f, 0.022049f, 0.024933f, 0.028091f, - 0.031616f, 0.035553f, 0.040161f, 0.045380f, 0.051239f, 0.057281f, 0.064270f, 0.072693f, - 0.081970f, 0.092468f, 0.104736f, 0.117859f, 0.132690f, 0.150391f, 0.169189f, 0.190796f, - 0.214233f, 0.240601f, 0.268555f, 0.299561f, 0.332520f, 0.367188f, 0.402344f, 0.438965f, - 0.476074f, 0.512695f, 0.549805f, 0.584473f, 0.619141f, 0.651367f, 0.681152f, 0.709961f, - 0.737305f, 0.762695f, 0.785156f, 0.806641f, 0.826172f, 0.843262f, 0.859375f, 0.874023f, - 0.888184f, 0.900391f, 0.961426f, 0.964355f, 0.965332f, 0.964844f, 0.964355f, 0.964844f, - 0.000295f, 0.001419f, 0.002342f, 0.003471f, 0.004539f, 0.005821f, 0.006882f, 0.008354f, - 0.010155f, 0.011574f, 0.013283f, 0.015129f, 0.017090f, 0.019333f, 0.022125f, 0.024643f, - 0.028122f, 0.031586f, 0.035522f, 0.039825f, 0.044586f, 0.050110f, 0.056091f, 0.063354f, - 0.071045f, 0.080078f, 0.090637f, 0.102112f, 0.115479f, 0.130127f, 0.147217f, 0.165649f, - 0.186768f, 0.210571f, 0.236694f, 0.265137f, 0.295654f, 0.328857f, 0.363770f, 0.399902f, - 0.436523f, 0.474365f, 0.511230f, 0.548828f, 0.584961f, 0.619141f, 0.652344f, 0.684082f, - 0.712891f, 0.741211f, 0.766113f, 0.789062f, 0.810547f, 0.830078f, 0.848633f, 0.864258f, - 0.879395f, 0.892578f, 0.958496f, 0.962402f, 0.962402f, 0.962402f, 0.961914f, 0.962402f, - 0.000464f, 0.001313f, 0.002159f, 0.003134f, 0.004463f, 0.005001f, 0.006466f, 0.007595f, - 0.008842f, 0.010277f, 0.011971f, 0.013550f, 0.015434f, 0.017242f, 0.019348f, 0.021805f, - 0.024734f, 0.027817f, 0.031174f, 0.034821f, 0.039124f, 0.043823f, 0.049164f, 0.055237f, - 0.062164f, 0.069336f, 0.078430f, 0.088501f, 0.099976f, 0.112854f, 0.127319f, 0.143555f, - 0.162354f, 0.183350f, 0.207031f, 0.233032f, 0.260986f, 0.291992f, 0.325195f, 0.361084f, - 0.397217f, 0.435059f, 0.473389f, 0.510742f, 0.549316f, 0.586426f, 0.620605f, 0.654785f, - 0.686523f, 0.716797f, 0.744629f, 0.769043f, 0.793945f, 0.815918f, 0.834961f, 0.852539f, - 0.869141f, 0.884277f, 0.955078f, 0.959473f, 0.959473f, 0.959473f, 0.959961f, 0.959961f, - 0.000541f, 0.001223f, 0.002172f, 0.002886f, 0.003679f, 0.004681f, 0.005512f, 0.006683f, - 0.008049f, 0.009346f, 0.010704f, 0.012024f, 0.013626f, 0.015213f, 0.017227f, 0.019516f, - 0.022079f, 0.024612f, 0.027313f, 0.030731f, 0.034180f, 0.038239f, 0.042969f, 0.048187f, - 0.053864f, 0.060516f, 0.068298f, 0.076843f, 0.086670f, 0.097473f, 0.110107f, 0.124268f, - 0.140869f, 0.159302f, 0.180420f, 0.203613f, 0.229614f, 0.258057f, 0.289062f, 0.323486f, - 0.358398f, 0.395996f, 0.434082f, 0.472900f, 0.511719f, 0.550293f, 0.587402f, 0.624023f, - 0.658203f, 0.690918f, 0.721191f, 0.749512f, 0.774902f, 0.799316f, 0.821289f, 0.840820f, - 0.859375f, 0.875488f, 0.952637f, 0.956543f, 0.957520f, 0.957520f, 0.957520f, 0.957031f, - 0.000252f, 0.001056f, 0.001923f, 0.002523f, 0.003414f, 0.003960f, 0.005146f, 0.006172f, - 0.007130f, 0.008179f, 0.009567f, 0.010735f, 0.012077f, 0.013878f, 0.015640f, 0.017456f, - 0.019638f, 0.021622f, 0.024170f, 0.026978f, 0.030121f, 0.033630f, 0.037445f, 0.042053f, - 0.047119f, 0.052826f, 0.059174f, 0.066711f, 0.075012f, 0.084473f, 0.095276f, 0.107727f, - 0.122070f, 0.138184f, 0.156250f, 0.177246f, 0.200928f, 0.226929f, 0.255371f, 0.286865f, - 0.321289f, 0.356934f, 0.395264f, 0.434326f, 0.473877f, 0.514160f, 0.553711f, 0.591797f, - 0.628418f, 0.663574f, 0.696777f, 0.728027f, 0.755859f, 0.782715f, 0.806152f, 0.829102f, - 0.847656f, 0.867188f, 0.949707f, 0.954102f, 0.954590f, 0.954590f, 0.954102f, 0.954590f, - 0.000365f, 0.000963f, 0.001581f, 0.002337f, 0.002996f, 0.003952f, 0.004608f, 0.005459f, - 0.006489f, 0.007351f, 0.008484f, 0.009544f, 0.011108f, 0.012413f, 0.013901f, 0.015388f, - 0.017181f, 0.019012f, 0.021439f, 0.023727f, 0.026520f, 0.029449f, 0.032898f, 0.036835f, - 0.041046f, 0.045868f, 0.051575f, 0.058075f, 0.064758f, 0.073120f, 0.082520f, 0.093079f, - 0.105652f, 0.119385f, 0.135620f, 0.153687f, 0.174683f, 0.198364f, 0.224365f, 0.253662f, - 0.285400f, 0.320557f, 0.357178f, 0.395752f, 0.435791f, 0.476318f, 0.516602f, 0.557129f, - 0.596191f, 0.633789f, 0.669434f, 0.703613f, 0.734375f, 0.763672f, 0.790039f, 0.812988f, - 0.836914f, 0.855957f, 0.946289f, 0.949707f, 0.951172f, 0.951172f, 0.951172f, 0.951172f, - 0.000404f, 0.001028f, 0.001410f, 0.002098f, 0.002657f, 0.003445f, 0.004391f, 0.005039f, - 0.005665f, 0.006569f, 0.007549f, 0.008614f, 0.009743f, 0.011108f, 0.012390f, 0.013611f, - 0.015396f, 0.017044f, 0.018921f, 0.020874f, 0.023453f, 0.025833f, 0.028809f, 0.032501f, - 0.036011f, 0.040161f, 0.044952f, 0.050018f, 0.056091f, 0.063477f, 0.071533f, 0.080200f, - 0.091064f, 0.103027f, 0.117065f, 0.133057f, 0.151489f, 0.171997f, 0.196045f, 0.222290f, - 0.251709f, 0.284424f, 0.319824f, 0.357422f, 0.397217f, 0.438232f, 0.479492f, 0.521484f, - 0.562500f, 0.602051f, 0.641113f, 0.677734f, 0.711914f, 0.743164f, 0.772461f, 0.799316f, - 0.822754f, 0.845215f, 0.942383f, 0.946777f, 0.947754f, 0.947754f, 0.948242f, 0.948242f, - 0.000406f, 0.000992f, 0.001447f, 0.001986f, 0.002499f, 0.003149f, 0.003769f, 0.004272f, - 0.005016f, 0.005981f, 0.006924f, 0.007675f, 0.008766f, 0.009727f, 0.010765f, 0.011986f, - 0.013588f, 0.014915f, 0.016724f, 0.018478f, 0.020508f, 0.022873f, 0.025497f, 0.028336f, - 0.031525f, 0.034882f, 0.038818f, 0.043243f, 0.048615f, 0.054626f, 0.061707f, 0.069214f, - 0.078430f, 0.089111f, 0.101013f, 0.115112f, 0.130859f, 0.148926f, 0.170166f, 0.193604f, - 0.220947f, 0.250732f, 0.283936f, 0.320068f, 0.358887f, 0.400391f, 0.442139f, 0.483887f, - 0.527344f, 0.569824f, 0.610352f, 0.649414f, 0.686523f, 0.722168f, 0.753906f, 0.782227f, - 0.809570f, 0.833496f, 0.938477f, 0.942871f, 0.944824f, 0.944336f, 0.943848f, 0.943848f, - 0.000235f, 0.000984f, 0.001204f, 0.001706f, 0.002239f, 0.002998f, 0.003462f, 0.004093f, - 0.004372f, 0.005371f, 0.006149f, 0.006962f, 0.007736f, 0.008766f, 0.009804f, 0.010780f, - 0.011887f, 0.013336f, 0.014618f, 0.016159f, 0.018158f, 0.020050f, 0.022232f, 0.024597f, - 0.027313f, 0.030334f, 0.033752f, 0.037872f, 0.042389f, 0.047516f, 0.053192f, 0.059937f, - 0.067749f, 0.076599f, 0.086975f, 0.098755f, 0.112610f, 0.128662f, 0.146973f, 0.168091f, - 0.192383f, 0.220215f, 0.250732f, 0.284668f, 0.322021f, 0.361572f, 0.403564f, 0.446777f, - 0.490723f, 0.534668f, 0.577637f, 0.619629f, 0.660156f, 0.697754f, 0.731934f, 0.764648f, - 0.794922f, 0.820312f, 0.934082f, 0.939453f, 0.939941f, 0.941406f, 0.940430f, 0.940918f, - 0.000237f, 0.000591f, 0.001098f, 0.001619f, 0.002241f, 0.002636f, 0.003176f, 0.003521f, - 0.004101f, 0.004631f, 0.005398f, 0.006378f, 0.007000f, 0.007767f, 0.008713f, 0.009758f, - 0.010475f, 0.011734f, 0.013016f, 0.014404f, 0.015762f, 0.017517f, 0.019440f, 0.021469f, - 0.023651f, 0.026199f, 0.029495f, 0.033112f, 0.036499f, 0.040955f, 0.045959f, 0.051849f, - 0.058197f, 0.065552f, 0.074585f, 0.085022f, 0.096680f, 0.110535f, 0.126709f, 0.145264f, - 0.166626f, 0.191406f, 0.219482f, 0.250488f, 0.286133f, 0.323975f, 0.365723f, 0.408447f, - 0.453125f, 0.498779f, 0.542969f, 0.588379f, 0.631836f, 0.671387f, 0.709473f, 0.745117f, - 0.777344f, 0.807617f, 0.930176f, 0.935059f, 0.936523f, 0.936523f, 0.936523f, 0.936035f, - 0.000242f, 0.000761f, 0.000943f, 0.001624f, 0.001858f, 0.002390f, 0.002638f, 0.003054f, - 0.003805f, 0.004559f, 0.005035f, 0.005493f, 0.006157f, 0.006878f, 0.007687f, 0.008530f, - 0.009178f, 0.010406f, 0.011406f, 0.012520f, 0.014053f, 0.015579f, 0.017105f, 0.018661f, - 0.020737f, 0.022903f, 0.025650f, 0.028259f, 0.031433f, 0.035065f, 0.039581f, 0.044342f, - 0.049988f, 0.056366f, 0.064026f, 0.072632f, 0.082825f, 0.094666f, 0.108582f, 0.124634f, - 0.143799f, 0.165405f, 0.190796f, 0.219360f, 0.251953f, 0.287842f, 0.328125f, 0.370605f, - 0.415283f, 0.461670f, 0.507812f, 0.555176f, 0.600586f, 0.645020f, 0.685547f, 0.724121f, - 0.759277f, 0.792969f, 0.924805f, 0.931152f, 0.931641f, 0.932129f, 0.932129f, 0.931641f, - 0.000240f, 0.000685f, 0.000955f, 0.001395f, 0.001768f, 0.002157f, 0.002533f, 0.002970f, - 0.003223f, 0.003813f, 0.004601f, 0.004993f, 0.005428f, 0.005981f, 0.006878f, 0.007484f, - 0.008110f, 0.009132f, 0.009964f, 0.011208f, 0.012138f, 0.013374f, 0.015099f, 0.016190f, - 0.018112f, 0.020187f, 0.022202f, 0.024780f, 0.027573f, 0.030411f, 0.034119f, 0.037964f, - 0.042755f, 0.048553f, 0.054474f, 0.061890f, 0.070984f, 0.080688f, 0.092590f, 0.106812f, - 0.123291f, 0.142456f, 0.164551f, 0.190430f, 0.220459f, 0.253418f, 0.291504f, 0.332520f, - 0.376709f, 0.423340f, 0.471436f, 0.520508f, 0.567383f, 0.614746f, 0.660156f, 0.702148f, - 0.741211f, 0.776367f, 0.920410f, 0.925293f, 0.926270f, 0.926758f, 0.927246f, 0.926758f, - 0.000244f, 0.000431f, 0.000799f, 0.001309f, 0.001587f, 0.001945f, 0.002317f, 0.002514f, - 0.003290f, 0.003548f, 0.004082f, 0.004349f, 0.004707f, 0.005348f, 0.006027f, 0.006565f, - 0.007141f, 0.008011f, 0.008850f, 0.009552f, 0.010757f, 0.011650f, 0.012794f, 0.014145f, - 0.015778f, 0.017303f, 0.019028f, 0.021088f, 0.023575f, 0.026169f, 0.029175f, 0.032562f, - 0.036713f, 0.041382f, 0.046448f, 0.052948f, 0.060303f, 0.068787f, 0.079041f, 0.090942f, - 0.105103f, 0.121643f, 0.141113f, 0.164185f, 0.190308f, 0.221191f, 0.256836f, 0.295898f, - 0.339355f, 0.385010f, 0.433838f, 0.484619f, 0.534668f, 0.583496f, 0.631348f, 0.678223f, - 0.719727f, 0.759766f, 0.913574f, 0.920410f, 0.921387f, 0.921875f, 0.921875f, 0.921387f, - 0.000243f, 0.000496f, 0.000847f, 0.001157f, 0.001426f, 0.001634f, 0.002020f, 0.002338f, - 0.002607f, 0.003035f, 0.003502f, 0.003872f, 0.004459f, 0.004726f, 0.005402f, 0.005779f, - 0.006325f, 0.007095f, 0.007767f, 0.008568f, 0.009331f, 0.010086f, 0.011009f, 0.012314f, - 0.013611f, 0.015060f, 0.016312f, 0.018158f, 0.020401f, 0.022476f, 0.024979f, 0.027863f, - 0.031036f, 0.034943f, 0.039581f, 0.044830f, 0.050903f, 0.058289f, 0.066895f, 0.076782f, - 0.088989f, 0.103210f, 0.120422f, 0.140259f, 0.164185f, 0.191772f, 0.223877f, 0.260742f, - 0.301758f, 0.347168f, 0.395508f, 0.446533f, 0.497803f, 0.551270f, 0.601562f, 0.651855f, - 0.697754f, 0.741211f, 0.908203f, 0.915039f, 0.916016f, 0.916016f, 0.916504f, 0.915527f, - 0.000239f, 0.000345f, 0.000690f, 0.000913f, 0.001250f, 0.001343f, 0.001579f, 0.002050f, - 0.002331f, 0.002861f, 0.003048f, 0.003616f, 0.003696f, 0.004211f, 0.004723f, 0.005074f, - 0.005657f, 0.006100f, 0.006893f, 0.007290f, 0.008118f, 0.008659f, 0.009552f, 0.010704f, - 0.011681f, 0.012764f, 0.014114f, 0.015533f, 0.017227f, 0.018982f, 0.021286f, 0.023560f, - 0.026489f, 0.029861f, 0.033417f, 0.037933f, 0.043121f, 0.049286f, 0.056519f, 0.065002f, - 0.075073f, 0.087158f, 0.101624f, 0.118835f, 0.139648f, 0.164185f, 0.193481f, 0.226929f, - 0.265625f, 0.309570f, 0.356934f, 0.408203f, 0.461426f, 0.516113f, 0.569824f, 0.623047f, - 0.674316f, 0.720703f, 0.902344f, 0.908203f, 0.909668f, 0.910645f, 0.910645f, 0.911133f, - 0.000000f, 0.000281f, 0.000560f, 0.000977f, 0.001063f, 0.001171f, 0.001569f, 0.001903f, - 0.002075f, 0.002413f, 0.002695f, 0.003004f, 0.003399f, 0.003553f, 0.003998f, 0.004333f, - 0.004971f, 0.005314f, 0.005806f, 0.006340f, 0.007015f, 0.007492f, 0.008377f, 0.009186f, - 0.010094f, 0.010910f, 0.012199f, 0.013351f, 0.014618f, 0.016266f, 0.018082f, 0.019852f, - 0.022491f, 0.025085f, 0.028168f, 0.031799f, 0.036041f, 0.041107f, 0.047394f, 0.054321f, - 0.062866f, 0.073181f, 0.085327f, 0.100525f, 0.118408f, 0.139648f, 0.165527f, 0.196411f, - 0.231812f, 0.273193f, 0.318848f, 0.369629f, 0.423828f, 0.480225f, 0.536621f, 0.592773f, - 0.647949f, 0.699707f, 0.894043f, 0.900879f, 0.903809f, 0.903320f, 0.903320f, 0.902832f, - 0.000232f, 0.000227f, 0.000555f, 0.000656f, 0.000937f, 0.000985f, 0.001351f, 0.001723f, - 0.001925f, 0.002010f, 0.002445f, 0.002625f, 0.002760f, 0.003220f, 0.003551f, 0.003870f, - 0.004303f, 0.004826f, 0.005028f, 0.005451f, 0.005985f, 0.006523f, 0.007000f, 0.007744f, - 0.008499f, 0.009361f, 0.010109f, 0.011185f, 0.012413f, 0.013603f, 0.015121f, 0.016891f, - 0.018753f, 0.020920f, 0.023407f, 0.026764f, 0.030197f, 0.034302f, 0.039429f, 0.044891f, - 0.052368f, 0.060822f, 0.071167f, 0.083557f, 0.098877f, 0.117493f, 0.139893f, 0.167725f, - 0.200195f, 0.238037f, 0.281982f, 0.331543f, 0.385010f, 0.442627f, 0.501465f, 0.561523f, - 0.620605f, 0.675781f, 0.887207f, 0.894531f, 0.895020f, 0.896484f, 0.896484f, 0.895996f, - 0.000000f, 0.000332f, 0.000577f, 0.000723f, 0.000720f, 0.001210f, 0.001469f, 0.001456f, - 0.001546f, 0.001775f, 0.002159f, 0.002291f, 0.002659f, 0.002916f, 0.003046f, 0.003439f, - 0.003752f, 0.003883f, 0.004375f, 0.004635f, 0.005241f, 0.005638f, 0.006054f, 0.006630f, - 0.007191f, 0.007744f, 0.008545f, 0.009178f, 0.010498f, 0.011536f, 0.012802f, 0.013931f, - 0.015808f, 0.017548f, 0.019379f, 0.022110f, 0.025040f, 0.028473f, 0.032471f, 0.037323f, - 0.043152f, 0.050476f, 0.058807f, 0.069214f, 0.082520f, 0.098145f, 0.116821f, 0.141602f, - 0.170044f, 0.204834f, 0.245728f, 0.293213f, 0.346436f, 0.403564f, 0.464111f, 0.527832f, - 0.589844f, 0.650879f, 0.878418f, 0.886719f, 0.888184f, 0.887695f, 0.888672f, 0.888672f, - 0.000243f, 0.000307f, 0.000526f, 0.000561f, 0.000923f, 0.000980f, 0.001143f, 0.001386f, - 0.001414f, 0.001683f, 0.001735f, 0.001972f, 0.002232f, 0.002481f, 0.002657f, 0.002754f, - 0.003193f, 0.003359f, 0.003603f, 0.003956f, 0.004368f, 0.004692f, 0.005119f, 0.005596f, - 0.005955f, 0.006634f, 0.007256f, 0.007881f, 0.008652f, 0.009552f, 0.010376f, 0.011719f, - 0.012634f, 0.014595f, 0.016113f, 0.018219f, 0.020554f, 0.023254f, 0.026520f, 0.030502f, - 0.035553f, 0.041168f, 0.048065f, 0.057190f, 0.067261f, 0.080811f, 0.097107f, 0.117737f, - 0.143066f, 0.173950f, 0.211182f, 0.256592f, 0.307129f, 0.364502f, 0.427002f, 0.491943f, - 0.557617f, 0.624023f, 0.869629f, 0.877930f, 0.879883f, 0.879883f, 0.879883f, 0.880371f, - 0.000000f, 0.000270f, 0.000342f, 0.000509f, 0.000668f, 0.000989f, 0.000945f, 0.001105f, - 0.001230f, 0.001335f, 0.001492f, 0.001757f, 0.001917f, 0.002140f, 0.002386f, 0.002501f, - 0.002644f, 0.002884f, 0.003199f, 0.003441f, 0.003620f, 0.003891f, 0.004337f, 0.004631f, - 0.005119f, 0.005520f, 0.006100f, 0.006504f, 0.007301f, 0.007771f, 0.008751f, 0.009521f, - 0.010658f, 0.011765f, 0.013145f, 0.014641f, 0.016785f, 0.018829f, 0.021545f, 0.024719f, - 0.028381f, 0.033203f, 0.038849f, 0.046112f, 0.055084f, 0.065552f, 0.079529f, 0.096985f, - 0.118530f, 0.145630f, 0.179321f, 0.220337f, 0.269287f, 0.325439f, 0.387207f, 0.454102f, - 0.524414f, 0.595215f, 0.859863f, 0.868652f, 0.870605f, 0.869629f, 0.870117f, 0.870605f, - 0.000000f, 0.000230f, 0.000334f, 0.000416f, 0.000700f, 0.000726f, 0.000921f, 0.001008f, - 0.001065f, 0.001186f, 0.001365f, 0.001471f, 0.001627f, 0.001796f, 0.001843f, 0.002069f, - 0.002266f, 0.002438f, 0.002596f, 0.002831f, 0.003000f, 0.003298f, 0.003597f, 0.003887f, - 0.004265f, 0.004581f, 0.004986f, 0.005505f, 0.005947f, 0.006454f, 0.007069f, 0.007801f, - 0.008621f, 0.009575f, 0.010612f, 0.011848f, 0.013321f, 0.015259f, 0.017410f, 0.019775f, - 0.022934f, 0.026550f, 0.031464f, 0.036713f, 0.043945f, 0.052887f, 0.064209f, 0.078735f, - 0.096924f, 0.120361f, 0.149536f, 0.186768f, 0.232422f, 0.285889f, 0.347656f, 0.415527f, - 0.488281f, 0.563965f, 0.849121f, 0.857910f, 0.859375f, 0.860840f, 0.860840f, 0.860352f, - 0.000233f, 0.000225f, 0.000219f, 0.000431f, 0.000579f, 0.000648f, 0.000671f, 0.000744f, - 0.000946f, 0.000994f, 0.001091f, 0.001307f, 0.001364f, 0.001490f, 0.001561f, 0.001712f, - 0.001892f, 0.001999f, 0.002190f, 0.002369f, 0.002512f, 0.002733f, 0.003014f, 0.003145f, - 0.003553f, 0.003822f, 0.004135f, 0.004326f, 0.004799f, 0.005344f, 0.005718f, 0.006378f, - 0.007008f, 0.007721f, 0.008400f, 0.009537f, 0.010597f, 0.011917f, 0.013542f, 0.015579f, - 0.018051f, 0.020889f, 0.024765f, 0.029236f, 0.034668f, 0.041779f, 0.051056f, 0.062439f, - 0.077576f, 0.097595f, 0.122864f, 0.155273f, 0.196655f, 0.247437f, 0.307617f, 0.375977f, - 0.450684f, 0.531250f, 0.837891f, 0.847168f, 0.848633f, 0.849609f, 0.849121f, 0.849609f, - 0.000202f, 0.000180f, 0.000206f, 0.000339f, 0.000479f, 0.000536f, 0.000687f, 0.000739f, - 0.000771f, 0.000849f, 0.001051f, 0.001060f, 0.001154f, 0.001219f, 0.001389f, 0.001505f, - 0.001469f, 0.001729f, 0.001858f, 0.001980f, 0.002209f, 0.002243f, 0.002483f, 0.002695f, - 0.002951f, 0.003149f, 0.003374f, 0.003654f, 0.004002f, 0.004154f, 0.004539f, 0.005032f, - 0.005428f, 0.005989f, 0.006760f, 0.007549f, 0.008423f, 0.009499f, 0.010620f, 0.012016f, - 0.013992f, 0.016434f, 0.019135f, 0.022583f, 0.026840f, 0.032501f, 0.039551f, 0.048828f, - 0.061066f, 0.077393f, 0.098755f, 0.127075f, 0.163208f, 0.209717f, 0.267578f, 0.334961f, - 0.411133f, 0.494629f, 0.825684f, 0.834473f, 0.836426f, 0.837402f, 0.837402f, 0.837402f, - 0.000000f, 0.000185f, 0.000184f, 0.000404f, 0.000408f, 0.000454f, 0.000480f, 0.000506f, - 0.000660f, 0.000694f, 0.000742f, 0.000801f, 0.000989f, 0.001111f, 0.001167f, 0.001250f, - 0.001311f, 0.001424f, 0.001541f, 0.001574f, 0.001712f, 0.001930f, 0.001982f, 0.002201f, - 0.002375f, 0.002439f, 0.002792f, 0.002905f, 0.003065f, 0.003412f, 0.003653f, 0.003952f, - 0.004463f, 0.004723f, 0.005230f, 0.005936f, 0.006386f, 0.007092f, 0.008240f, 0.009247f, - 0.010765f, 0.012344f, 0.014420f, 0.017090f, 0.020493f, 0.024551f, 0.030014f, 0.037689f, - 0.047302f, 0.060028f, 0.077820f, 0.100830f, 0.132812f, 0.174561f, 0.228516f, 0.294434f, - 0.371582f, 0.457031f, 0.812012f, 0.820801f, 0.823730f, 0.824219f, 0.824707f, 0.824219f, - 0.000000f, 0.000053f, 0.000206f, 0.000360f, 0.000379f, 0.000391f, 0.000379f, 0.000478f, - 0.000549f, 0.000589f, 0.000626f, 0.000674f, 0.000762f, 0.000832f, 0.000894f, 0.001050f, - 0.001111f, 0.001155f, 0.001286f, 0.001345f, 0.001449f, 0.001564f, 0.001666f, 0.001750f, - 0.001856f, 0.001925f, 0.002056f, 0.002359f, 0.002542f, 0.002728f, 0.003042f, 0.003164f, - 0.003460f, 0.003786f, 0.004116f, 0.004578f, 0.005116f, 0.005688f, 0.006508f, 0.007229f, - 0.008125f, 0.009232f, 0.010796f, 0.012741f, 0.015137f, 0.018158f, 0.022186f, 0.028030f, - 0.035248f, 0.045593f, 0.059052f, 0.078308f, 0.105042f, 0.141602f, 0.190308f, 0.252930f, - 0.329102f, 0.417969f, 0.797852f, 0.807129f, 0.810059f, 0.810547f, 0.811035f, 0.810547f, - 0.000000f, 0.000000f, 0.000082f, 0.000195f, 0.000309f, 0.000336f, 0.000324f, 0.000414f, - 0.000439f, 0.000460f, 0.000599f, 0.000643f, 0.000637f, 0.000690f, 0.000733f, 0.000834f, - 0.000821f, 0.000922f, 0.000989f, 0.001067f, 0.001207f, 0.001293f, 0.001327f, 0.001476f, - 0.001581f, 0.001663f, 0.001725f, 0.001906f, 0.001934f, 0.002180f, 0.002258f, 0.002602f, - 0.002701f, 0.003019f, 0.003229f, 0.003502f, 0.003847f, 0.004261f, 0.004795f, 0.005318f, - 0.006130f, 0.007008f, 0.008118f, 0.009277f, 0.011024f, 0.013229f, 0.016205f, 0.020203f, - 0.025620f, 0.033020f, 0.043854f, 0.059021f, 0.080383f, 0.111206f, 0.154419f, 0.212646f, - 0.287354f, 0.378418f, 0.781250f, 0.792480f, 0.793457f, 0.795410f, 0.795898f, 0.794922f, - 0.000000f, 0.000121f, 0.000120f, 0.000198f, 0.000275f, 0.000249f, 0.000290f, 0.000360f, - 0.000375f, 0.000379f, 0.000391f, 0.000438f, 0.000505f, 0.000534f, 0.000669f, 0.000629f, - 0.000659f, 0.000754f, 0.000890f, 0.000833f, 0.000849f, 0.000975f, 0.001029f, 0.001117f, - 0.001193f, 0.001203f, 0.001269f, 0.001424f, 0.001594f, 0.001675f, 0.001737f, 0.001957f, - 0.002094f, 0.002319f, 0.002342f, 0.002609f, 0.002928f, 0.003248f, 0.003523f, 0.003967f, - 0.004547f, 0.005138f, 0.005871f, 0.006760f, 0.007912f, 0.009430f, 0.011528f, 0.014236f, - 0.017899f, 0.023346f, 0.031235f, 0.042694f, 0.059235f, 0.084229f, 0.120972f, 0.173950f, - 0.245239f, 0.334473f, 0.764160f, 0.775391f, 0.777344f, 0.778809f, 0.777832f, 0.778809f, - 0.000000f, 0.000121f, 0.000119f, 0.000182f, 0.000177f, 0.000179f, 0.000262f, 0.000239f, - 0.000309f, 0.000322f, 0.000404f, 0.000370f, 0.000361f, 0.000430f, 0.000458f, 0.000540f, - 0.000589f, 0.000615f, 0.000648f, 0.000632f, 0.000777f, 0.000782f, 0.000798f, 0.000871f, - 0.000857f, 0.000925f, 0.001000f, 0.001045f, 0.001191f, 0.001223f, 0.001426f, 0.001419f, - 0.001512f, 0.001635f, 0.001884f, 0.002092f, 0.002100f, 0.002293f, 0.002577f, 0.003012f, - 0.003258f, 0.003761f, 0.004253f, 0.004814f, 0.005619f, 0.006676f, 0.008064f, 0.009750f, - 0.012268f, 0.015854f, 0.021255f, 0.029282f, 0.041687f, 0.061005f, 0.091370f, 0.136230f, - 0.202759f, 0.291504f, 0.746582f, 0.757324f, 0.759277f, 0.760254f, 0.760254f, 0.760254f, - 0.000000f, 0.000000f, 0.000117f, 0.000126f, 0.000113f, 0.000146f, 0.000158f, 0.000155f, - 0.000189f, 0.000288f, 0.000254f, 0.000336f, 0.000347f, 0.000353f, 0.000370f, 0.000355f, - 0.000390f, 0.000417f, 0.000456f, 0.000480f, 0.000525f, 0.000587f, 0.000596f, 0.000620f, - 0.000676f, 0.000740f, 0.000758f, 0.000852f, 0.000907f, 0.000947f, 0.001057f, 0.001122f, - 0.001170f, 0.001293f, 0.001316f, 0.001437f, 0.001531f, 0.001813f, 0.001952f, 0.002090f, - 0.002346f, 0.002560f, 0.002974f, 0.003334f, 0.003899f, 0.004547f, 0.005360f, 0.006516f, - 0.008179f, 0.010468f, 0.013947f, 0.019241f, 0.027832f, 0.041443f, 0.064941f, 0.102600f, - 0.162231f, 0.247437f, 0.726074f, 0.737793f, 0.739258f, 0.740723f, 0.741211f, 0.741211f, - 0.000000f, 0.000118f, 0.000115f, 0.000113f, 0.000110f, 0.000126f, 0.000121f, 0.000139f, - 0.000147f, 0.000160f, 0.000161f, 0.000233f, 0.000199f, 0.000266f, 0.000286f, 0.000297f, - 0.000329f, 0.000313f, 0.000347f, 0.000358f, 0.000364f, 0.000394f, 0.000435f, 0.000446f, - 0.000489f, 0.000506f, 0.000546f, 0.000625f, 0.000648f, 0.000674f, 0.000723f, 0.000782f, - 0.000865f, 0.000918f, 0.000979f, 0.001104f, 0.001100f, 0.001196f, 0.001352f, 0.001488f, - 0.001586f, 0.001749f, 0.001955f, 0.002275f, 0.002644f, 0.003054f, 0.003563f, 0.004322f, - 0.005314f, 0.006786f, 0.008980f, 0.012115f, 0.017319f, 0.026520f, 0.043121f, 0.072693f, - 0.123535f, 0.203613f, 0.705566f, 0.716797f, 0.719238f, 0.719727f, 0.720703f, 0.721191f, - 0.000000f, 0.000000f, 0.000112f, 0.000109f, 0.000106f, 0.000104f, 0.000102f, 0.000096f, - 0.000091f, 0.000113f, 0.000147f, 0.000129f, 0.000155f, 0.000134f, 0.000196f, 0.000205f, - 0.000181f, 0.000239f, 0.000297f, 0.000255f, 0.000317f, 0.000273f, 0.000335f, 0.000299f, - 0.000379f, 0.000385f, 0.000398f, 0.000402f, 0.000473f, 0.000552f, 0.000489f, 0.000543f, - 0.000557f, 0.000606f, 0.000662f, 0.000698f, 0.000747f, 0.000810f, 0.000902f, 0.000961f, - 0.001063f, 0.001166f, 0.001312f, 0.001523f, 0.001662f, 0.001908f, 0.002298f, 0.002758f, - 0.003365f, 0.004135f, 0.005394f, 0.007290f, 0.010490f, 0.015991f, 0.026215f, 0.047180f, - 0.087646f, 0.160645f, 0.682617f, 0.695801f, 0.697266f, 0.697266f, 0.697266f, 0.698730f, - 0.000000f, 0.000112f, 0.000106f, 0.000104f, 0.000100f, 0.000098f, 0.000095f, 0.000094f, - 0.000090f, 0.000085f, 0.000080f, 0.000081f, 0.000085f, 0.000123f, 0.000123f, 0.000138f, - 0.000151f, 0.000158f, 0.000147f, 0.000171f, 0.000183f, 0.000192f, 0.000242f, 0.000215f, - 0.000253f, 0.000256f, 0.000269f, 0.000278f, 0.000293f, 0.000315f, 0.000377f, 0.000357f, - 0.000357f, 0.000423f, 0.000479f, 0.000493f, 0.000489f, 0.000535f, 0.000579f, 0.000628f, - 0.000683f, 0.000731f, 0.000833f, 0.000935f, 0.001068f, 0.001200f, 0.001347f, 0.001581f, - 0.001995f, 0.002419f, 0.003109f, 0.004147f, 0.005829f, 0.008919f, 0.014641f, 0.027405f, - 0.056885f, 0.119385f, 0.658691f, 0.669922f, 0.673828f, 0.673828f, 0.675293f, 0.675293f, - 0.000000f, 0.000105f, 0.000101f, 0.000096f, 0.000092f, 0.000089f, 0.000087f, 0.000085f, - 0.000083f, 0.000081f, 0.000077f, 0.000073f, 0.000070f, 0.000066f, 0.000080f, 0.000084f, - 0.000089f, 0.000068f, 0.000101f, 0.000094f, 0.000116f, 0.000118f, 0.000125f, 0.000129f, - 0.000150f, 0.000168f, 0.000153f, 0.000192f, 0.000195f, 0.000185f, 0.000200f, 0.000217f, - 0.000226f, 0.000247f, 0.000257f, 0.000262f, 0.000319f, 0.000334f, 0.000347f, 0.000376f, - 0.000395f, 0.000447f, 0.000504f, 0.000544f, 0.000590f, 0.000670f, 0.000789f, 0.000887f, - 0.001069f, 0.001345f, 0.001670f, 0.002167f, 0.003065f, 0.004562f, 0.007660f, 0.014290f, - 0.032135f, 0.081299f, 0.632812f, 0.645996f, 0.648926f, 0.649414f, 0.648926f, 0.649902f, - 0.000109f, 0.000094f, 0.000087f, 0.000082f, 0.000078f, 0.000076f, 0.000074f, 0.000071f, - 0.000069f, 0.000068f, 0.000067f, 0.000066f, 0.000064f, 0.000061f, 0.000058f, 0.000055f, - 0.000053f, 0.000050f, 0.000051f, 0.000046f, 0.000059f, 0.000056f, 0.000057f, 0.000068f, - 0.000078f, 0.000088f, 0.000096f, 0.000096f, 0.000105f, 0.000107f, 0.000128f, 0.000121f, - 0.000133f, 0.000141f, 0.000156f, 0.000151f, 0.000160f, 0.000200f, 0.000209f, 0.000198f, - 0.000222f, 0.000242f, 0.000258f, 0.000275f, 0.000314f, 0.000352f, 0.000410f, 0.000468f, - 0.000537f, 0.000639f, 0.000799f, 0.001002f, 0.001390f, 0.002092f, 0.003466f, 0.006653f, - 0.015305f, 0.048004f, 0.606934f, 0.618652f, 0.622559f, 0.623047f, 0.623535f, 0.624023f, - 0.000084f, 0.000067f, 0.000064f, 0.000062f, 0.000057f, 0.000056f, 0.000053f, 0.000054f, - 0.000051f, 0.000052f, 0.000050f, 0.000050f, 0.000050f, 0.000049f, 0.000048f, 0.000047f, - 0.000046f, 0.000044f, 0.000042f, 0.000040f, 0.000039f, 0.000037f, 0.000035f, 0.000036f, - 0.000037f, 0.000031f, 0.000040f, 0.000041f, 0.000042f, 0.000051f, 0.000058f, 0.000063f, - 0.000067f, 0.000069f, 0.000072f, 0.000079f, 0.000085f, 0.000092f, 0.000093f, 0.000101f, - 0.000107f, 0.000123f, 0.000125f, 0.000139f, 0.000147f, 0.000154f, 0.000181f, 0.000204f, - 0.000229f, 0.000270f, 0.000327f, 0.000425f, 0.000559f, 0.000772f, 0.001265f, 0.002462f, - 0.006191f, 0.022415f, 0.578613f, 0.592285f, 0.595215f, 0.596191f, 0.596191f, 0.597656f, - 0.000008f, 0.000022f, 0.000022f, 0.000024f, 0.000024f, 0.000027f, 0.000028f, 0.000028f, - 0.000028f, 0.000026f, 0.000028f, 0.000029f, 0.000029f, 0.000028f, 0.000029f, 0.000029f, - 0.000029f, 0.000029f, 0.000030f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, - 0.000021f, 0.000020f, 0.000022f, 0.000026f, 0.000028f, 0.000033f, 0.000037f, 0.000036f, - 0.000039f, 0.000045f, 0.000051f, 0.000046f, 0.000056f, 0.000059f, 0.000061f, 0.000071f, - 0.000084f, 0.000098f, 0.000110f, 0.000133f, 0.000169f, 0.000223f, 0.000356f, 0.000648f, - 0.001702f, 0.007713f, 0.550293f, 0.564453f, 0.566895f, 0.567871f, 0.568359f, 0.568848f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000006f, - 0.000007f, 0.000007f, 0.000008f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000011f, - 0.000012f, 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000014f, 0.000014f, 0.000013f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000009f, 0.000011f, 0.000014f, 0.000017f, 0.000015f, 0.000018f, - 0.000021f, 0.000022f, 0.000023f, 0.000026f, 0.000035f, 0.000040f, 0.000056f, 0.000089f, - 0.000225f, 0.001332f, 0.520996f, 0.535156f, 0.538086f, 0.540039f, 0.540039f, 0.540039f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000003f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000002f, 0.000003f, 0.000003f, - 0.000004f, 0.000017f, 0.491211f, 0.506348f, 0.508789f, 0.510254f, 0.510254f, 0.510742f, - }, - { - 0.064758f, 0.179688f, 0.277344f, 0.358398f, 0.427002f, 0.485107f, 0.535156f, 0.578613f, - 0.615234f, 0.647949f, 0.677734f, 0.703125f, 0.725586f, 0.745605f, 0.763672f, 0.780273f, - 0.795410f, 0.810059f, 0.821777f, 0.833496f, 0.843750f, 0.854004f, 0.862793f, 0.871582f, - 0.879883f, 0.886719f, 0.894043f, 0.900879f, 0.906250f, 0.912109f, 0.917969f, 0.922852f, - 0.927246f, 0.932129f, 0.936523f, 0.940918f, 0.944824f, 0.948242f, 0.951660f, 0.955078f, - 0.958496f, 0.961426f, 0.964844f, 0.967773f, 0.970215f, 0.973145f, 0.975586f, 0.977539f, - 0.979980f, 0.982422f, 0.984863f, 0.986328f, 0.988770f, 0.990234f, 0.992676f, 0.993652f, - 0.995605f, 0.997559f, 0.998535f, 0.996582f, 0.995117f, 0.993652f, 0.992188f, 0.990723f, - 0.040344f, 0.121460f, 0.199341f, 0.272949f, 0.339600f, 0.401123f, 0.455078f, 0.501953f, - 0.546875f, 0.583984f, 0.618164f, 0.648926f, 0.676270f, 0.700195f, 0.723145f, 0.743164f, - 0.761230f, 0.776855f, 0.793457f, 0.806641f, 0.819336f, 0.831543f, 0.842285f, 0.852051f, - 0.861328f, 0.869629f, 0.877930f, 0.886230f, 0.892578f, 0.899902f, 0.905273f, 0.911621f, - 0.917480f, 0.922852f, 0.927246f, 0.932129f, 0.936035f, 0.940430f, 0.945312f, 0.949219f, - 0.952148f, 0.956055f, 0.958984f, 0.961914f, 0.965332f, 0.967773f, 0.970703f, 0.973633f, - 0.976074f, 0.978516f, 0.980957f, 0.983398f, 0.985840f, 0.987305f, 0.989258f, 0.991699f, - 0.993652f, 0.995117f, 0.997070f, 0.995605f, 0.994141f, 0.993164f, 0.991699f, 0.990234f, - 0.027191f, 0.084961f, 0.145630f, 0.206177f, 0.266113f, 0.323242f, 0.377930f, 0.428711f, - 0.474609f, 0.517090f, 0.554688f, 0.591309f, 0.621582f, 0.650391f, 0.676758f, 0.700684f, - 0.723145f, 0.741699f, 0.760254f, 0.776855f, 0.791504f, 0.805664f, 0.818359f, 0.830566f, - 0.841309f, 0.851074f, 0.861816f, 0.870117f, 0.878418f, 0.885254f, 0.892090f, 0.899414f, - 0.906250f, 0.912598f, 0.916992f, 0.922363f, 0.928223f, 0.932617f, 0.937500f, 0.941895f, - 0.945801f, 0.949219f, 0.953613f, 0.957031f, 0.960449f, 0.963379f, 0.966797f, 0.969727f, - 0.971680f, 0.974609f, 0.977539f, 0.979980f, 0.981934f, 0.984375f, 0.986328f, 0.989258f, - 0.991211f, 0.992676f, 0.996094f, 0.994629f, 0.993652f, 0.992188f, 0.990723f, 0.989746f, - 0.019577f, 0.061340f, 0.108337f, 0.156860f, 0.207153f, 0.258789f, 0.310059f, 0.358887f, - 0.405762f, 0.450928f, 0.491211f, 0.530273f, 0.565430f, 0.597656f, 0.627441f, 0.654297f, - 0.680176f, 0.702637f, 0.724121f, 0.743164f, 0.760742f, 0.776855f, 0.791992f, 0.806152f, - 0.817871f, 0.830078f, 0.841797f, 0.852539f, 0.861816f, 0.870117f, 0.878906f, 0.886230f, - 0.893066f, 0.900391f, 0.906738f, 0.912598f, 0.918457f, 0.923340f, 0.928223f, 0.933594f, - 0.938477f, 0.942871f, 0.946777f, 0.950684f, 0.954590f, 0.958496f, 0.960938f, 0.964844f, - 0.967773f, 0.970703f, 0.973633f, 0.976074f, 0.979004f, 0.981445f, 0.983398f, 0.985840f, - 0.987793f, 0.990234f, 0.995117f, 0.993652f, 0.992676f, 0.991699f, 0.990234f, 0.989258f, - 0.014397f, 0.046295f, 0.081543f, 0.120728f, 0.162842f, 0.206177f, 0.250977f, 0.296143f, - 0.342041f, 0.385986f, 0.427979f, 0.468262f, 0.506348f, 0.542480f, 0.575195f, 0.605469f, - 0.633789f, 0.660156f, 0.684570f, 0.706543f, 0.727539f, 0.745117f, 0.763184f, 0.778809f, - 0.793945f, 0.807617f, 0.820312f, 0.833008f, 0.842773f, 0.852539f, 0.862305f, 0.872070f, - 0.879395f, 0.887207f, 0.894531f, 0.900879f, 0.907227f, 0.914551f, 0.919922f, 0.925293f, - 0.930176f, 0.935547f, 0.938965f, 0.943359f, 0.948730f, 0.952637f, 0.956055f, 0.959473f, - 0.962891f, 0.966309f, 0.969238f, 0.972656f, 0.975098f, 0.977539f, 0.980957f, 0.982910f, - 0.984863f, 0.987793f, 0.994141f, 0.993164f, 0.991699f, 0.990723f, 0.989746f, 0.988281f, - 0.010925f, 0.035828f, 0.063660f, 0.094360f, 0.128174f, 0.164551f, 0.203247f, 0.244385f, - 0.285645f, 0.326416f, 0.367432f, 0.409424f, 0.447998f, 0.484131f, 0.520508f, 0.553711f, - 0.584473f, 0.614258f, 0.641113f, 0.666016f, 0.689453f, 0.710938f, 0.730469f, 0.750488f, - 0.766602f, 0.781250f, 0.796387f, 0.809570f, 0.822266f, 0.833496f, 0.844727f, 0.854980f, - 0.864258f, 0.873047f, 0.881348f, 0.889648f, 0.895996f, 0.903809f, 0.910156f, 0.916504f, - 0.921387f, 0.926758f, 0.932129f, 0.937500f, 0.941895f, 0.946777f, 0.950684f, 0.954102f, - 0.958008f, 0.960938f, 0.965332f, 0.968262f, 0.971680f, 0.975098f, 0.977539f, 0.979492f, - 0.982422f, 0.984863f, 0.992676f, 0.991699f, 0.990723f, 0.989746f, 0.988770f, 0.987793f, - 0.008698f, 0.028244f, 0.049866f, 0.074463f, 0.102295f, 0.132935f, 0.165161f, 0.200073f, - 0.236206f, 0.275391f, 0.313477f, 0.352051f, 0.391113f, 0.428955f, 0.465088f, 0.500977f, - 0.534180f, 0.565430f, 0.593750f, 0.622559f, 0.648438f, 0.671875f, 0.694824f, 0.715820f, - 0.734863f, 0.753906f, 0.771484f, 0.784668f, 0.799805f, 0.813477f, 0.825195f, 0.836914f, - 0.847656f, 0.857910f, 0.866699f, 0.875488f, 0.884766f, 0.892090f, 0.898438f, 0.906250f, - 0.913086f, 0.918457f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.944336f, 0.948730f, - 0.952637f, 0.956055f, 0.959961f, 0.963379f, 0.967285f, 0.970703f, 0.973633f, 0.976074f, - 0.979492f, 0.982422f, 0.991211f, 0.990723f, 0.990234f, 0.988770f, 0.987793f, 0.986328f, - 0.007210f, 0.022797f, 0.040039f, 0.060181f, 0.082153f, 0.107300f, 0.134155f, 0.164673f, - 0.196167f, 0.229492f, 0.265381f, 0.301025f, 0.338379f, 0.374756f, 0.411133f, 0.446533f, - 0.481201f, 0.515625f, 0.546387f, 0.576660f, 0.605957f, 0.631348f, 0.656738f, 0.681152f, - 0.702148f, 0.722168f, 0.741699f, 0.758789f, 0.775391f, 0.791016f, 0.803711f, 0.817383f, - 0.829102f, 0.840820f, 0.851562f, 0.860840f, 0.871094f, 0.879395f, 0.887695f, 0.895020f, - 0.901855f, 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.932129f, 0.937500f, 0.941895f, - 0.947266f, 0.950684f, 0.955078f, 0.958984f, 0.962891f, 0.966797f, 0.969727f, 0.973145f, - 0.976562f, 0.979004f, 0.990234f, 0.989746f, 0.988770f, 0.987793f, 0.986816f, 0.985840f, - 0.005863f, 0.018936f, 0.032898f, 0.049377f, 0.067261f, 0.088257f, 0.110535f, 0.135254f, - 0.162231f, 0.191895f, 0.223389f, 0.255371f, 0.290039f, 0.324707f, 0.359863f, 0.395996f, - 0.429932f, 0.464355f, 0.497314f, 0.529297f, 0.559570f, 0.587891f, 0.616699f, 0.642090f, - 0.665527f, 0.688965f, 0.709961f, 0.729492f, 0.747559f, 0.765625f, 0.780762f, 0.794922f, - 0.809082f, 0.822754f, 0.833984f, 0.844727f, 0.855957f, 0.864746f, 0.875000f, 0.883789f, - 0.891113f, 0.898926f, 0.906250f, 0.912598f, 0.918457f, 0.925293f, 0.930664f, 0.935059f, - 0.940918f, 0.945312f, 0.950195f, 0.954590f, 0.958496f, 0.962402f, 0.965820f, 0.969238f, - 0.972656f, 0.976074f, 0.988770f, 0.988770f, 0.987793f, 0.986816f, 0.985840f, 0.984863f, - 0.004925f, 0.015518f, 0.027451f, 0.041199f, 0.055786f, 0.072998f, 0.091492f, 0.112427f, - 0.135254f, 0.160767f, 0.187500f, 0.216919f, 0.247314f, 0.280273f, 0.313477f, 0.346680f, - 0.381592f, 0.415283f, 0.448730f, 0.481201f, 0.513184f, 0.543945f, 0.573242f, 0.601562f, - 0.627441f, 0.652344f, 0.675293f, 0.697754f, 0.718262f, 0.737793f, 0.754883f, 0.771973f, - 0.787109f, 0.800781f, 0.815430f, 0.828125f, 0.839844f, 0.851074f, 0.860840f, 0.870117f, - 0.879883f, 0.887695f, 0.896484f, 0.902832f, 0.911133f, 0.916992f, 0.922852f, 0.928711f, - 0.934082f, 0.939941f, 0.944336f, 0.948730f, 0.954102f, 0.958008f, 0.961426f, 0.965332f, - 0.969238f, 0.972168f, 0.987305f, 0.987305f, 0.986816f, 0.985840f, 0.984863f, 0.983887f, - 0.004139f, 0.012955f, 0.022781f, 0.034088f, 0.046997f, 0.061005f, 0.076538f, 0.094360f, - 0.113464f, 0.134888f, 0.158203f, 0.183716f, 0.210693f, 0.239990f, 0.270264f, 0.302734f, - 0.334961f, 0.367676f, 0.400635f, 0.434082f, 0.467041f, 0.497803f, 0.528809f, 0.558105f, - 0.586426f, 0.614258f, 0.638672f, 0.663574f, 0.686035f, 0.707520f, 0.728027f, 0.745605f, - 0.762695f, 0.779297f, 0.794434f, 0.808594f, 0.821777f, 0.834473f, 0.845215f, 0.855957f, - 0.866699f, 0.876465f, 0.884766f, 0.892090f, 0.900391f, 0.908203f, 0.915039f, 0.920898f, - 0.927246f, 0.932617f, 0.937988f, 0.943848f, 0.948730f, 0.952637f, 0.957520f, 0.961426f, - 0.965820f, 0.968750f, 0.985840f, 0.985840f, 0.985840f, 0.984375f, 0.983887f, 0.982910f, - 0.003492f, 0.011307f, 0.019608f, 0.028793f, 0.039246f, 0.051544f, 0.064392f, 0.078796f, - 0.095337f, 0.113953f, 0.134033f, 0.155396f, 0.179688f, 0.205200f, 0.232300f, 0.261475f, - 0.291748f, 0.323730f, 0.355225f, 0.387939f, 0.420410f, 0.452637f, 0.483887f, 0.514648f, - 0.544922f, 0.573730f, 0.601074f, 0.626953f, 0.651367f, 0.675293f, 0.697266f, 0.717285f, - 0.736816f, 0.755371f, 0.771973f, 0.786621f, 0.803223f, 0.815430f, 0.828613f, 0.840820f, - 0.851562f, 0.863281f, 0.873047f, 0.880859f, 0.890625f, 0.898438f, 0.905762f, 0.913086f, - 0.919434f, 0.925781f, 0.931641f, 0.937500f, 0.942871f, 0.947754f, 0.952637f, 0.957520f, - 0.960938f, 0.965820f, 0.984375f, 0.984863f, 0.984375f, 0.983398f, 0.982422f, 0.981445f, - 0.002977f, 0.009415f, 0.016708f, 0.024811f, 0.033356f, 0.043457f, 0.054535f, 0.067017f, - 0.080322f, 0.096130f, 0.113708f, 0.132080f, 0.152710f, 0.175415f, 0.199829f, 0.226440f, - 0.253662f, 0.282959f, 0.313232f, 0.343750f, 0.375000f, 0.406982f, 0.439453f, 0.471191f, - 0.501465f, 0.531738f, 0.560547f, 0.587891f, 0.615234f, 0.640625f, 0.664062f, 0.687500f, - 0.708496f, 0.728516f, 0.747559f, 0.765137f, 0.781738f, 0.795898f, 0.811523f, 0.824707f, - 0.836426f, 0.847656f, 0.858887f, 0.869141f, 0.878906f, 0.887695f, 0.895996f, 0.904297f, - 0.911133f, 0.917969f, 0.925293f, 0.931152f, 0.937012f, 0.942383f, 0.947266f, 0.953125f, - 0.957031f, 0.961426f, 0.982910f, 0.983398f, 0.982910f, 0.982422f, 0.981445f, 0.980957f, - 0.002743f, 0.008568f, 0.014305f, 0.021378f, 0.028732f, 0.037201f, 0.046387f, 0.057068f, - 0.068848f, 0.082336f, 0.096924f, 0.113159f, 0.130859f, 0.150146f, 0.171509f, 0.194824f, - 0.219482f, 0.246338f, 0.273926f, 0.302734f, 0.333496f, 0.364502f, 0.395752f, 0.426758f, - 0.458252f, 0.489990f, 0.519531f, 0.548340f, 0.576660f, 0.604004f, 0.630859f, 0.654297f, - 0.678223f, 0.700684f, 0.720215f, 0.740234f, 0.758301f, 0.775391f, 0.790527f, 0.805176f, - 0.818848f, 0.833008f, 0.844238f, 0.855469f, 0.866699f, 0.876953f, 0.886230f, 0.894043f, - 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930664f, 0.937012f, 0.941895f, 0.947266f, - 0.952148f, 0.957031f, 0.981445f, 0.982422f, 0.981445f, 0.980957f, 0.980469f, 0.979004f, - 0.002504f, 0.007004f, 0.012634f, 0.018555f, 0.024933f, 0.032654f, 0.040283f, 0.048920f, - 0.059357f, 0.070007f, 0.082642f, 0.096741f, 0.112122f, 0.128906f, 0.147339f, 0.167603f, - 0.189697f, 0.213257f, 0.238770f, 0.265869f, 0.293701f, 0.323242f, 0.354004f, 0.384766f, - 0.415283f, 0.447021f, 0.478516f, 0.507812f, 0.536621f, 0.565918f, 0.593750f, 0.620605f, - 0.645508f, 0.668945f, 0.692383f, 0.712891f, 0.733398f, 0.751465f, 0.769531f, 0.785156f, - 0.801270f, 0.814941f, 0.828125f, 0.841797f, 0.853516f, 0.864746f, 0.874512f, 0.883789f, - 0.893555f, 0.900879f, 0.910156f, 0.917480f, 0.923340f, 0.930664f, 0.936523f, 0.942383f, - 0.947754f, 0.952637f, 0.979492f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.978027f, - 0.002039f, 0.006287f, 0.010864f, 0.016129f, 0.021637f, 0.027786f, 0.034485f, 0.042450f, - 0.051331f, 0.060760f, 0.071594f, 0.082886f, 0.096313f, 0.110840f, 0.126587f, 0.145020f, - 0.164185f, 0.185181f, 0.207520f, 0.232300f, 0.258301f, 0.285889f, 0.314941f, 0.344238f, - 0.374268f, 0.405029f, 0.436035f, 0.466797f, 0.498291f, 0.527344f, 0.555664f, 0.583984f, - 0.611328f, 0.636230f, 0.661133f, 0.684082f, 0.705566f, 0.726562f, 0.745605f, 0.764648f, - 0.781250f, 0.797852f, 0.812500f, 0.825195f, 0.838867f, 0.851074f, 0.862305f, 0.873535f, - 0.883301f, 0.892578f, 0.901367f, 0.908203f, 0.916992f, 0.923828f, 0.931152f, 0.937012f, - 0.942383f, 0.947266f, 0.978027f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.977051f, - 0.001762f, 0.005489f, 0.009804f, 0.013931f, 0.019028f, 0.024445f, 0.030518f, 0.036865f, - 0.044189f, 0.052460f, 0.061432f, 0.071960f, 0.083008f, 0.095642f, 0.109558f, 0.124756f, - 0.141602f, 0.160156f, 0.180664f, 0.202148f, 0.225952f, 0.250977f, 0.278076f, 0.305664f, - 0.334961f, 0.364990f, 0.394775f, 0.425537f, 0.456543f, 0.487061f, 0.517090f, 0.546387f, - 0.575195f, 0.602539f, 0.627930f, 0.653809f, 0.676758f, 0.699707f, 0.721191f, 0.740723f, - 0.759766f, 0.777832f, 0.793945f, 0.809082f, 0.823242f, 0.836426f, 0.849609f, 0.861328f, - 0.872070f, 0.881836f, 0.892578f, 0.900391f, 0.908691f, 0.916992f, 0.924316f, 0.931152f, - 0.937500f, 0.943359f, 0.976074f, 0.977051f, 0.977051f, 0.976562f, 0.976074f, 0.975098f, - 0.001675f, 0.005020f, 0.008400f, 0.012253f, 0.016724f, 0.021469f, 0.026428f, 0.032104f, - 0.039062f, 0.045563f, 0.053741f, 0.062103f, 0.072205f, 0.082947f, 0.094666f, 0.107727f, - 0.122681f, 0.139038f, 0.156250f, 0.176514f, 0.197388f, 0.220581f, 0.244629f, 0.270752f, - 0.297607f, 0.326172f, 0.355957f, 0.386475f, 0.416748f, 0.447754f, 0.478027f, 0.507812f, - 0.538086f, 0.566406f, 0.594727f, 0.621582f, 0.647461f, 0.671387f, 0.694336f, 0.716797f, - 0.737305f, 0.755859f, 0.773438f, 0.791016f, 0.807129f, 0.820801f, 0.834961f, 0.848145f, - 0.860352f, 0.871582f, 0.881836f, 0.891602f, 0.901367f, 0.909180f, 0.917480f, 0.925293f, - 0.932129f, 0.938965f, 0.974609f, 0.975586f, 0.976074f, 0.974609f, 0.974121f, 0.973633f, - 0.001437f, 0.004513f, 0.007427f, 0.010994f, 0.014526f, 0.018829f, 0.023331f, 0.028229f, - 0.034058f, 0.040192f, 0.046844f, 0.054321f, 0.062683f, 0.071716f, 0.082397f, 0.093933f, - 0.106567f, 0.120728f, 0.136230f, 0.153320f, 0.172485f, 0.192627f, 0.214233f, 0.237915f, - 0.263672f, 0.290527f, 0.318115f, 0.347412f, 0.377197f, 0.408203f, 0.438477f, 0.469482f, - 0.499512f, 0.529785f, 0.558594f, 0.586914f, 0.614258f, 0.641602f, 0.665527f, 0.689941f, - 0.711914f, 0.732422f, 0.752930f, 0.771484f, 0.789062f, 0.805664f, 0.819824f, 0.833984f, - 0.847656f, 0.860840f, 0.871094f, 0.881836f, 0.891602f, 0.902344f, 0.910156f, 0.918457f, - 0.926270f, 0.932617f, 0.972168f, 0.973633f, 0.973633f, 0.973145f, 0.973145f, 0.971680f, - 0.001390f, 0.003952f, 0.006779f, 0.009941f, 0.013062f, 0.017029f, 0.020905f, 0.024994f, - 0.029877f, 0.035187f, 0.041077f, 0.047119f, 0.055145f, 0.062500f, 0.071594f, 0.081543f, - 0.092712f, 0.104736f, 0.118530f, 0.133179f, 0.150024f, 0.168091f, 0.187378f, 0.209717f, - 0.232178f, 0.256836f, 0.283447f, 0.311279f, 0.339844f, 0.369873f, 0.399658f, 0.429932f, - 0.461426f, 0.492188f, 0.521973f, 0.551758f, 0.580566f, 0.608887f, 0.635254f, 0.660645f, - 0.685059f, 0.708008f, 0.729492f, 0.750488f, 0.769043f, 0.786621f, 0.802734f, 0.818848f, - 0.832520f, 0.846680f, 0.860352f, 0.871582f, 0.882324f, 0.892578f, 0.902832f, 0.911133f, - 0.919922f, 0.926758f, 0.970703f, 0.971680f, 0.971680f, 0.971680f, 0.971680f, 0.969238f, - 0.001328f, 0.003641f, 0.006138f, 0.008690f, 0.011444f, 0.014786f, 0.018311f, 0.022125f, - 0.026337f, 0.031403f, 0.036011f, 0.041809f, 0.047943f, 0.054901f, 0.062622f, 0.071106f, - 0.081299f, 0.091614f, 0.103455f, 0.116333f, 0.130493f, 0.146484f, 0.164307f, 0.183228f, - 0.204224f, 0.226685f, 0.251221f, 0.277100f, 0.303711f, 0.332764f, 0.361572f, 0.391846f, - 0.422852f, 0.454102f, 0.485352f, 0.515625f, 0.545410f, 0.574707f, 0.603027f, 0.630371f, - 0.656250f, 0.681641f, 0.705078f, 0.726562f, 0.747070f, 0.767578f, 0.784668f, 0.803223f, - 0.818848f, 0.833008f, 0.847656f, 0.860352f, 0.872559f, 0.883301f, 0.894043f, 0.903809f, - 0.913574f, 0.921387f, 0.967773f, 0.970215f, 0.970215f, 0.968750f, 0.969238f, 0.968750f, - 0.001053f, 0.002905f, 0.005432f, 0.007912f, 0.010658f, 0.012901f, 0.016464f, 0.019363f, - 0.023376f, 0.027237f, 0.031799f, 0.036346f, 0.042145f, 0.048248f, 0.054871f, 0.062256f, - 0.070618f, 0.079834f, 0.089844f, 0.101440f, 0.113831f, 0.128174f, 0.143433f, 0.160156f, - 0.179077f, 0.199707f, 0.222046f, 0.245483f, 0.271240f, 0.297363f, 0.325684f, 0.355469f, - 0.385254f, 0.416016f, 0.447754f, 0.479004f, 0.508789f, 0.539551f, 0.570312f, 0.598145f, - 0.626465f, 0.652344f, 0.678223f, 0.702148f, 0.725098f, 0.746094f, 0.765625f, 0.785645f, - 0.803223f, 0.819336f, 0.834961f, 0.848145f, 0.861328f, 0.873535f, 0.884766f, 0.895508f, - 0.905762f, 0.915527f, 0.965332f, 0.967773f, 0.968262f, 0.967773f, 0.967285f, 0.966309f, - 0.001106f, 0.002684f, 0.004913f, 0.006733f, 0.009300f, 0.011955f, 0.014435f, 0.017700f, - 0.020477f, 0.024124f, 0.028091f, 0.032532f, 0.037231f, 0.042511f, 0.048309f, 0.054596f, - 0.061798f, 0.069885f, 0.078857f, 0.089050f, 0.099915f, 0.112183f, 0.125488f, 0.140503f, - 0.157104f, 0.175293f, 0.195068f, 0.216309f, 0.240356f, 0.265381f, 0.291748f, 0.319580f, - 0.348633f, 0.379150f, 0.410156f, 0.441406f, 0.472900f, 0.503418f, 0.534668f, 0.565430f, - 0.594727f, 0.622070f, 0.649902f, 0.676270f, 0.700195f, 0.723633f, 0.746094f, 0.766602f, - 0.786133f, 0.802734f, 0.819824f, 0.835449f, 0.849609f, 0.863281f, 0.875977f, 0.887695f, - 0.898438f, 0.908203f, 0.962891f, 0.965820f, 0.966309f, 0.965332f, 0.964844f, 0.964355f, - 0.000782f, 0.002707f, 0.004574f, 0.006184f, 0.008286f, 0.010681f, 0.012878f, 0.015640f, - 0.018478f, 0.021912f, 0.025208f, 0.028976f, 0.032867f, 0.037598f, 0.042938f, 0.048370f, - 0.054443f, 0.061432f, 0.069214f, 0.077515f, 0.087402f, 0.098145f, 0.109497f, 0.122803f, - 0.137329f, 0.153564f, 0.171509f, 0.190918f, 0.212158f, 0.235352f, 0.259766f, 0.286133f, - 0.314209f, 0.343262f, 0.373535f, 0.404297f, 0.436279f, 0.467773f, 0.499512f, 0.530273f, - 0.561523f, 0.590820f, 0.620117f, 0.647461f, 0.674316f, 0.699219f, 0.722656f, 0.745605f, - 0.766602f, 0.785645f, 0.804688f, 0.821777f, 0.836426f, 0.852051f, 0.865234f, 0.878418f, - 0.890625f, 0.901855f, 0.959961f, 0.962891f, 0.963867f, 0.963379f, 0.962402f, 0.962402f, - 0.000787f, 0.002195f, 0.004250f, 0.005775f, 0.007774f, 0.009445f, 0.011795f, 0.013725f, - 0.016678f, 0.019531f, 0.022018f, 0.025665f, 0.029495f, 0.033142f, 0.037598f, 0.042664f, - 0.048248f, 0.053772f, 0.060699f, 0.067993f, 0.076416f, 0.085815f, 0.095764f, 0.107422f, - 0.120239f, 0.134277f, 0.150269f, 0.167358f, 0.186646f, 0.207764f, 0.230347f, 0.255127f, - 0.281250f, 0.308838f, 0.337891f, 0.368408f, 0.399414f, 0.431396f, 0.463135f, 0.495605f, - 0.526855f, 0.558594f, 0.588379f, 0.618652f, 0.646973f, 0.673828f, 0.699707f, 0.723633f, - 0.746094f, 0.767090f, 0.788086f, 0.806641f, 0.823730f, 0.840332f, 0.854980f, 0.869141f, - 0.881836f, 0.893555f, 0.957520f, 0.960938f, 0.960938f, 0.961426f, 0.960449f, 0.959961f, - 0.000765f, 0.002207f, 0.003666f, 0.005177f, 0.006973f, 0.008301f, 0.010704f, 0.012794f, - 0.015015f, 0.017303f, 0.020309f, 0.022568f, 0.026123f, 0.029587f, 0.033325f, 0.037659f, - 0.042206f, 0.047516f, 0.053223f, 0.059814f, 0.067017f, 0.075195f, 0.083801f, 0.094055f, - 0.105042f, 0.117737f, 0.131470f, 0.146851f, 0.163940f, 0.182739f, 0.203369f, 0.225952f, - 0.250244f, 0.276367f, 0.304199f, 0.333008f, 0.364258f, 0.395264f, 0.427002f, 0.459961f, - 0.491699f, 0.524414f, 0.555664f, 0.586914f, 0.617676f, 0.645996f, 0.673340f, 0.699707f, - 0.724121f, 0.748047f, 0.770020f, 0.790039f, 0.809082f, 0.827148f, 0.842773f, 0.858398f, - 0.873047f, 0.885742f, 0.954102f, 0.958008f, 0.958496f, 0.958496f, 0.958496f, 0.957520f, - 0.000586f, 0.001937f, 0.003107f, 0.004745f, 0.006168f, 0.007610f, 0.009590f, 0.011345f, - 0.013321f, 0.015587f, 0.017593f, 0.020294f, 0.023346f, 0.026154f, 0.029205f, 0.033234f, - 0.037415f, 0.041962f, 0.046906f, 0.052673f, 0.058533f, 0.065796f, 0.073669f, 0.082642f, - 0.092346f, 0.103027f, 0.115234f, 0.128784f, 0.143799f, 0.160889f, 0.179199f, 0.199585f, - 0.221802f, 0.246094f, 0.271973f, 0.299805f, 0.329102f, 0.359863f, 0.391357f, 0.423340f, - 0.456299f, 0.490234f, 0.522949f, 0.555176f, 0.586426f, 0.617188f, 0.645996f, 0.675293f, - 0.701660f, 0.726074f, 0.750488f, 0.773926f, 0.793945f, 0.812988f, 0.831543f, 0.847656f, - 0.862793f, 0.877441f, 0.951660f, 0.955078f, 0.955566f, 0.955566f, 0.955078f, 0.954590f, - 0.000678f, 0.001864f, 0.003138f, 0.004333f, 0.005707f, 0.006893f, 0.008224f, 0.009850f, - 0.012215f, 0.013954f, 0.015747f, 0.018219f, 0.020584f, 0.023148f, 0.026047f, 0.029434f, - 0.033020f, 0.037018f, 0.041626f, 0.046509f, 0.051910f, 0.058105f, 0.064636f, 0.072510f, - 0.080750f, 0.090149f, 0.100891f, 0.112549f, 0.126343f, 0.141113f, 0.157593f, 0.175537f, - 0.195801f, 0.218018f, 0.242554f, 0.268311f, 0.295898f, 0.325195f, 0.355713f, 0.388184f, - 0.421143f, 0.454834f, 0.488281f, 0.522949f, 0.554199f, 0.587402f, 0.618164f, 0.648438f, - 0.676758f, 0.704102f, 0.730957f, 0.754395f, 0.776855f, 0.798340f, 0.817871f, 0.836426f, - 0.852051f, 0.868164f, 0.948242f, 0.952637f, 0.953125f, 0.952637f, 0.952148f, 0.951660f, - 0.000470f, 0.001578f, 0.002934f, 0.003838f, 0.005032f, 0.006310f, 0.007725f, 0.008972f, - 0.010826f, 0.012657f, 0.014359f, 0.015991f, 0.018402f, 0.020721f, 0.023102f, 0.026230f, - 0.029495f, 0.032867f, 0.036743f, 0.040680f, 0.045654f, 0.050812f, 0.056763f, 0.063477f, - 0.071045f, 0.078918f, 0.088440f, 0.098938f, 0.110657f, 0.123535f, 0.138062f, 0.154175f, - 0.172363f, 0.192627f, 0.214478f, 0.238770f, 0.264404f, 0.292236f, 0.322266f, 0.353271f, - 0.385742f, 0.419189f, 0.453857f, 0.487549f, 0.521484f, 0.555664f, 0.588867f, 0.621094f, - 0.651367f, 0.680176f, 0.708008f, 0.733887f, 0.759766f, 0.780762f, 0.802734f, 0.821289f, - 0.840820f, 0.858398f, 0.943848f, 0.949219f, 0.949707f, 0.949707f, 0.949707f, 0.949219f, - 0.000485f, 0.001689f, 0.002386f, 0.003698f, 0.004547f, 0.005936f, 0.006851f, 0.008217f, - 0.009834f, 0.011055f, 0.012810f, 0.014473f, 0.016449f, 0.018509f, 0.020950f, 0.023209f, - 0.025940f, 0.029114f, 0.032410f, 0.036133f, 0.040161f, 0.044861f, 0.050018f, 0.055664f, - 0.061859f, 0.069153f, 0.077515f, 0.086365f, 0.096680f, 0.108093f, 0.120605f, 0.135132f, - 0.151489f, 0.169556f, 0.189209f, 0.211426f, 0.235352f, 0.261475f, 0.289307f, 0.319580f, - 0.351074f, 0.384521f, 0.418701f, 0.452881f, 0.487549f, 0.522461f, 0.556641f, 0.591309f, - 0.623535f, 0.653809f, 0.684570f, 0.712891f, 0.739258f, 0.764160f, 0.787109f, 0.809570f, - 0.829102f, 0.847168f, 0.940918f, 0.945801f, 0.946289f, 0.946777f, 0.946777f, 0.945312f, - 0.000620f, 0.001351f, 0.002413f, 0.003273f, 0.004307f, 0.004971f, 0.006138f, 0.007542f, - 0.008835f, 0.009972f, 0.011581f, 0.013069f, 0.014717f, 0.016495f, 0.018738f, 0.020691f, - 0.023315f, 0.025879f, 0.028793f, 0.031860f, 0.035309f, 0.039246f, 0.043762f, 0.048950f, - 0.054474f, 0.060669f, 0.067932f, 0.075378f, 0.084351f, 0.094055f, 0.105774f, 0.118469f, - 0.132690f, 0.148315f, 0.166504f, 0.186401f, 0.208130f, 0.232544f, 0.258789f, 0.287109f, - 0.317627f, 0.349854f, 0.383057f, 0.417725f, 0.453125f, 0.488770f, 0.523926f, 0.559082f, - 0.594238f, 0.627441f, 0.659180f, 0.689941f, 0.719238f, 0.745117f, 0.770508f, 0.794434f, - 0.815430f, 0.836914f, 0.936523f, 0.941895f, 0.942871f, 0.942871f, 0.942871f, 0.942383f, - 0.000404f, 0.001095f, 0.002087f, 0.002983f, 0.003986f, 0.004673f, 0.005844f, 0.006878f, - 0.007740f, 0.008873f, 0.010323f, 0.011757f, 0.013176f, 0.014915f, 0.016586f, 0.018585f, - 0.020523f, 0.022720f, 0.025391f, 0.028244f, 0.031219f, 0.034821f, 0.038788f, 0.042908f, - 0.047943f, 0.053040f, 0.058960f, 0.066162f, 0.073547f, 0.082397f, 0.092285f, 0.102844f, - 0.115234f, 0.129883f, 0.146118f, 0.163452f, 0.183350f, 0.205688f, 0.229614f, 0.256592f, - 0.285156f, 0.316162f, 0.348633f, 0.383057f, 0.418457f, 0.454590f, 0.490967f, 0.526855f, - 0.563477f, 0.598633f, 0.632812f, 0.665527f, 0.696777f, 0.726074f, 0.752930f, 0.779297f, - 0.803223f, 0.825684f, 0.933105f, 0.938477f, 0.938477f, 0.938965f, 0.938477f, 0.938477f, - 0.000415f, 0.000864f, 0.001907f, 0.002775f, 0.003519f, 0.004204f, 0.005352f, 0.006237f, - 0.007019f, 0.008064f, 0.009239f, 0.010483f, 0.011742f, 0.013130f, 0.014877f, 0.016571f, - 0.018494f, 0.020126f, 0.022537f, 0.024826f, 0.027649f, 0.030701f, 0.033875f, 0.037964f, - 0.042114f, 0.046356f, 0.051605f, 0.057587f, 0.064209f, 0.071777f, 0.080261f, 0.089722f, - 0.100952f, 0.113220f, 0.127075f, 0.143066f, 0.160767f, 0.180664f, 0.202759f, 0.227417f, - 0.254395f, 0.284180f, 0.315674f, 0.348633f, 0.383789f, 0.420166f, 0.457275f, 0.494385f, - 0.531250f, 0.569336f, 0.605469f, 0.639160f, 0.672363f, 0.705078f, 0.735352f, 0.762207f, - 0.788574f, 0.811523f, 0.928711f, 0.934082f, 0.934570f, 0.935059f, 0.935059f, 0.935059f, - 0.000236f, 0.001136f, 0.001664f, 0.002502f, 0.003187f, 0.004082f, 0.004631f, 0.005386f, - 0.006275f, 0.007385f, 0.008217f, 0.009453f, 0.010567f, 0.011787f, 0.013115f, 0.014420f, - 0.016083f, 0.017944f, 0.019867f, 0.022079f, 0.024414f, 0.026962f, 0.029755f, 0.033112f, - 0.036926f, 0.040771f, 0.045258f, 0.050232f, 0.056183f, 0.062500f, 0.069946f, 0.078430f, - 0.087708f, 0.098389f, 0.110779f, 0.124634f, 0.140259f, 0.158203f, 0.178223f, 0.200928f, - 0.225708f, 0.253174f, 0.282715f, 0.315430f, 0.349365f, 0.385254f, 0.422363f, 0.460938f, - 0.499023f, 0.537109f, 0.574707f, 0.612305f, 0.646484f, 0.682129f, 0.713867f, 0.745117f, - 0.772461f, 0.799316f, 0.923828f, 0.930176f, 0.930664f, 0.931152f, 0.930664f, 0.930664f, - 0.000229f, 0.000964f, 0.001582f, 0.002182f, 0.002838f, 0.003653f, 0.004341f, 0.004921f, - 0.005615f, 0.006626f, 0.007423f, 0.008545f, 0.009483f, 0.010666f, 0.011612f, 0.013000f, - 0.014275f, 0.015900f, 0.017487f, 0.019333f, 0.021484f, 0.023773f, 0.026276f, 0.028992f, - 0.032135f, 0.035492f, 0.039398f, 0.044037f, 0.049072f, 0.054443f, 0.061035f, 0.067871f, - 0.076111f, 0.085632f, 0.096252f, 0.108154f, 0.122253f, 0.138306f, 0.156006f, 0.175903f, - 0.199219f, 0.224243f, 0.251953f, 0.282715f, 0.315918f, 0.350830f, 0.387451f, 0.425781f, - 0.465332f, 0.504395f, 0.544434f, 0.583008f, 0.620117f, 0.657715f, 0.692383f, 0.725098f, - 0.755371f, 0.783691f, 0.919434f, 0.925781f, 0.926270f, 0.926758f, 0.926758f, 0.925781f, - 0.000410f, 0.000856f, 0.001542f, 0.001844f, 0.002565f, 0.003380f, 0.003971f, 0.004246f, - 0.005047f, 0.005863f, 0.006653f, 0.007744f, 0.008568f, 0.009407f, 0.010529f, 0.011482f, - 0.012657f, 0.013924f, 0.015602f, 0.017105f, 0.018997f, 0.020859f, 0.022980f, 0.025192f, - 0.028030f, 0.031036f, 0.034515f, 0.038300f, 0.042236f, 0.047180f, 0.052795f, 0.059113f, - 0.065857f, 0.074097f, 0.083374f, 0.094360f, 0.105896f, 0.119873f, 0.135620f, 0.154175f, - 0.174072f, 0.197632f, 0.223267f, 0.251465f, 0.283447f, 0.317139f, 0.353760f, 0.391113f, - 0.431152f, 0.470703f, 0.512207f, 0.552734f, 0.592285f, 0.631348f, 0.669434f, 0.704590f, - 0.737793f, 0.768555f, 0.913574f, 0.919922f, 0.920898f, 0.920898f, 0.921387f, 0.921387f, - 0.000214f, 0.000619f, 0.001172f, 0.001941f, 0.002228f, 0.002960f, 0.003490f, 0.003994f, - 0.004761f, 0.005180f, 0.005806f, 0.006622f, 0.007565f, 0.008301f, 0.009262f, 0.010170f, - 0.011208f, 0.012482f, 0.013855f, 0.015060f, 0.016739f, 0.018311f, 0.020248f, 0.022034f, - 0.024597f, 0.027084f, 0.030045f, 0.033051f, 0.036743f, 0.041016f, 0.045807f, 0.050964f, - 0.056946f, 0.063904f, 0.071899f, 0.080994f, 0.091675f, 0.103699f, 0.117920f, 0.133667f, - 0.151978f, 0.172729f, 0.196533f, 0.222534f, 0.252197f, 0.284424f, 0.319580f, 0.356689f, - 0.396973f, 0.437500f, 0.479492f, 0.521484f, 0.562500f, 0.604004f, 0.644043f, 0.682129f, - 0.718262f, 0.751465f, 0.907715f, 0.915039f, 0.916016f, 0.916504f, 0.916504f, 0.916504f, - 0.000405f, 0.000760f, 0.001116f, 0.001688f, 0.002180f, 0.002670f, 0.003313f, 0.003569f, - 0.003979f, 0.004543f, 0.005466f, 0.005985f, 0.006699f, 0.007359f, 0.008102f, 0.009094f, - 0.009949f, 0.011055f, 0.012047f, 0.013412f, 0.014488f, 0.016068f, 0.017532f, 0.019348f, - 0.021210f, 0.023834f, 0.025986f, 0.028854f, 0.031891f, 0.035339f, 0.039490f, 0.043976f, - 0.049347f, 0.055084f, 0.061951f, 0.069763f, 0.078918f, 0.089478f, 0.101379f, 0.115479f, - 0.131592f, 0.150024f, 0.171387f, 0.195068f, 0.222900f, 0.252686f, 0.286621f, 0.323242f, - 0.362061f, 0.402588f, 0.445312f, 0.488770f, 0.532715f, 0.575684f, 0.618652f, 0.659180f, - 0.698242f, 0.734375f, 0.901367f, 0.909180f, 0.911133f, 0.910645f, 0.911133f, 0.910645f, - 0.000218f, 0.000539f, 0.001187f, 0.001617f, 0.001987f, 0.002316f, 0.002666f, 0.003176f, - 0.003841f, 0.004425f, 0.004917f, 0.005402f, 0.005768f, 0.006462f, 0.007233f, 0.008018f, - 0.008575f, 0.009758f, 0.010582f, 0.011520f, 0.012756f, 0.013832f, 0.015312f, 0.016968f, - 0.018509f, 0.020279f, 0.022644f, 0.024857f, 0.027740f, 0.030472f, 0.033783f, 0.037567f, - 0.042175f, 0.047150f, 0.052979f, 0.059601f, 0.067505f, 0.076538f, 0.087158f, 0.099243f, - 0.113281f, 0.129272f, 0.148315f, 0.170532f, 0.194702f, 0.223267f, 0.254639f, 0.289795f, - 0.327393f, 0.368408f, 0.410889f, 0.455322f, 0.499756f, 0.544434f, 0.590332f, 0.633789f, - 0.676270f, 0.716309f, 0.895508f, 0.902344f, 0.903809f, 0.905762f, 0.903809f, 0.904297f, - 0.000184f, 0.000612f, 0.001122f, 0.001464f, 0.001848f, 0.002150f, 0.002514f, 0.002651f, - 0.003391f, 0.003666f, 0.004368f, 0.004677f, 0.005219f, 0.005882f, 0.006531f, 0.007019f, - 0.007675f, 0.008530f, 0.009224f, 0.010269f, 0.011017f, 0.012146f, 0.013321f, 0.014626f, - 0.016098f, 0.017639f, 0.019440f, 0.021317f, 0.023773f, 0.026123f, 0.029144f, 0.032410f, - 0.036072f, 0.040314f, 0.045013f, 0.051086f, 0.057587f, 0.065308f, 0.074402f, 0.084961f, - 0.097107f, 0.111267f, 0.127930f, 0.147217f, 0.169556f, 0.195312f, 0.224365f, 0.257568f, - 0.294189f, 0.333496f, 0.375977f, 0.420166f, 0.467041f, 0.514160f, 0.561035f, 0.607422f, - 0.652344f, 0.695312f, 0.888672f, 0.896484f, 0.897461f, 0.897461f, 0.897949f, 0.897949f, - 0.000159f, 0.000537f, 0.000830f, 0.001206f, 0.001578f, 0.001760f, 0.002050f, 0.002504f, - 0.002951f, 0.003397f, 0.003674f, 0.004238f, 0.004520f, 0.005245f, 0.005692f, 0.006138f, - 0.006748f, 0.007240f, 0.008087f, 0.008728f, 0.009636f, 0.010437f, 0.011543f, 0.012611f, - 0.013763f, 0.015266f, 0.016617f, 0.018433f, 0.020248f, 0.022354f, 0.024887f, 0.027390f, - 0.030716f, 0.034454f, 0.038422f, 0.043365f, 0.048950f, 0.055511f, 0.062988f, 0.072021f, - 0.082336f, 0.094727f, 0.109375f, 0.125977f, 0.145874f, 0.169556f, 0.195679f, 0.226929f, - 0.260986f, 0.299805f, 0.341309f, 0.385498f, 0.432129f, 0.480957f, 0.529297f, 0.579102f, - 0.627441f, 0.673828f, 0.881348f, 0.889160f, 0.890625f, 0.891113f, 0.891602f, 0.891113f, - 0.000204f, 0.000566f, 0.000741f, 0.001033f, 0.001378f, 0.001599f, 0.001961f, 0.002354f, - 0.002609f, 0.002974f, 0.003300f, 0.003609f, 0.004101f, 0.004463f, 0.004906f, 0.005337f, - 0.006020f, 0.006290f, 0.007023f, 0.007656f, 0.008301f, 0.009140f, 0.009918f, 0.010933f, - 0.011940f, 0.013107f, 0.014252f, 0.015656f, 0.017136f, 0.019058f, 0.021057f, 0.023209f, - 0.025940f, 0.029190f, 0.032715f, 0.036591f, 0.041138f, 0.046661f, 0.053253f, 0.060944f, - 0.069702f, 0.080444f, 0.092651f, 0.107788f, 0.124695f, 0.145630f, 0.169189f, 0.197632f, - 0.229736f, 0.266113f, 0.306396f, 0.350586f, 0.397217f, 0.447021f, 0.497803f, 0.549805f, - 0.600586f, 0.650391f, 0.872559f, 0.881836f, 0.882812f, 0.883301f, 0.884277f, 0.884277f, - 0.000240f, 0.000349f, 0.000795f, 0.000892f, 0.001151f, 0.001377f, 0.001773f, 0.001984f, - 0.002415f, 0.002602f, 0.002932f, 0.003168f, 0.003483f, 0.003906f, 0.004257f, 0.004681f, - 0.005173f, 0.005596f, 0.006119f, 0.006550f, 0.007126f, 0.007759f, 0.008522f, 0.009270f, - 0.010086f, 0.011108f, 0.012138f, 0.013199f, 0.014549f, 0.015884f, 0.017776f, 0.019623f, - 0.022003f, 0.024384f, 0.027237f, 0.030624f, 0.034515f, 0.039215f, 0.044342f, 0.050873f, - 0.058411f, 0.067017f, 0.078003f, 0.090332f, 0.105530f, 0.123718f, 0.144775f, 0.170410f, - 0.200195f, 0.234131f, 0.272461f, 0.315674f, 0.362305f, 0.412354f, 0.465332f, 0.518555f, - 0.572754f, 0.626465f, 0.863770f, 0.873047f, 0.875488f, 0.875488f, 0.875977f, 0.875977f, - 0.000102f, 0.000298f, 0.000604f, 0.000950f, 0.001089f, 0.001472f, 0.001760f, 0.001823f, - 0.001903f, 0.002325f, 0.002611f, 0.002775f, 0.003185f, 0.003405f, 0.003674f, 0.004005f, - 0.004406f, 0.004814f, 0.005203f, 0.005665f, 0.006062f, 0.006702f, 0.007317f, 0.007881f, - 0.008560f, 0.009239f, 0.010193f, 0.010994f, 0.012161f, 0.013588f, 0.015068f, 0.016479f, - 0.018250f, 0.020386f, 0.022781f, 0.025665f, 0.028809f, 0.032501f, 0.037048f, 0.042297f, - 0.048553f, 0.055908f, 0.065491f, 0.075378f, 0.088501f, 0.104248f, 0.122742f, 0.145874f, - 0.171997f, 0.203247f, 0.239990f, 0.281250f, 0.326904f, 0.376953f, 0.430176f, 0.486328f, - 0.542480f, 0.600586f, 0.855469f, 0.864746f, 0.866211f, 0.867188f, 0.867188f, 0.867188f, - 0.000000f, 0.000357f, 0.000576f, 0.000692f, 0.001013f, 0.001069f, 0.001383f, 0.001702f, - 0.001789f, 0.002102f, 0.002182f, 0.002377f, 0.002686f, 0.002985f, 0.003347f, 0.003359f, - 0.003782f, 0.004036f, 0.004436f, 0.004749f, 0.005169f, 0.005672f, 0.006145f, 0.006649f, - 0.007187f, 0.007828f, 0.008644f, 0.009529f, 0.010269f, 0.011200f, 0.012337f, 0.013596f, - 0.015038f, 0.017044f, 0.018784f, 0.021011f, 0.023727f, 0.026871f, 0.030457f, 0.034637f, - 0.039978f, 0.046478f, 0.053436f, 0.062622f, 0.073730f, 0.086792f, 0.102661f, 0.122437f, - 0.146240f, 0.174561f, 0.208252f, 0.247437f, 0.291748f, 0.341064f, 0.395020f, 0.451904f, - 0.511230f, 0.571777f, 0.844238f, 0.854980f, 0.857422f, 0.858887f, 0.857910f, 0.857910f, - 0.000101f, 0.000326f, 0.000535f, 0.000683f, 0.000848f, 0.001161f, 0.001184f, 0.001284f, - 0.001576f, 0.001701f, 0.001839f, 0.002167f, 0.002321f, 0.002584f, 0.002645f, 0.002941f, - 0.003141f, 0.003538f, 0.003817f, 0.004112f, 0.004395f, 0.004646f, 0.005165f, 0.005531f, - 0.006096f, 0.006496f, 0.007217f, 0.007767f, 0.008629f, 0.009163f, 0.010239f, 0.011276f, - 0.012611f, 0.013779f, 0.015213f, 0.017120f, 0.019379f, 0.021606f, 0.024994f, 0.028351f, - 0.032379f, 0.037201f, 0.043640f, 0.050903f, 0.060120f, 0.071045f, 0.084900f, 0.101868f, - 0.122559f, 0.147827f, 0.178223f, 0.214722f, 0.257080f, 0.305664f, 0.358887f, 0.416992f, - 0.478027f, 0.542969f, 0.834473f, 0.845215f, 0.847656f, 0.847656f, 0.847656f, 0.848633f, - 0.000092f, 0.000316f, 0.000410f, 0.000556f, 0.000808f, 0.000918f, 0.001094f, 0.001287f, - 0.001309f, 0.001411f, 0.001671f, 0.001780f, 0.001909f, 0.002092f, 0.002274f, 0.002523f, - 0.002733f, 0.002974f, 0.003101f, 0.003401f, 0.003677f, 0.003956f, 0.004311f, 0.004551f, - 0.004940f, 0.005444f, 0.005768f, 0.006451f, 0.006977f, 0.007568f, 0.008270f, 0.009201f, - 0.010170f, 0.011230f, 0.012566f, 0.013939f, 0.015503f, 0.017761f, 0.020111f, 0.022873f, - 0.025940f, 0.029938f, 0.035217f, 0.040985f, 0.048431f, 0.057770f, 0.069092f, 0.083618f, - 0.100891f, 0.123047f, 0.150146f, 0.183838f, 0.223633f, 0.269531f, 0.322510f, 0.381348f, - 0.444824f, 0.511719f, 0.823730f, 0.834473f, 0.835938f, 0.836914f, 0.836914f, 0.837402f, - 0.000240f, 0.000273f, 0.000326f, 0.000564f, 0.000682f, 0.000807f, 0.000854f, 0.000949f, - 0.001139f, 0.001238f, 0.001404f, 0.001548f, 0.001637f, 0.001840f, 0.001893f, 0.002077f, - 0.002321f, 0.002434f, 0.002642f, 0.002821f, 0.003044f, 0.003271f, 0.003649f, 0.003763f, - 0.004208f, 0.004448f, 0.004986f, 0.005169f, 0.005657f, 0.006279f, 0.006680f, 0.007442f, - 0.008194f, 0.008881f, 0.009895f, 0.010918f, 0.012138f, 0.013924f, 0.015915f, 0.018112f, - 0.020645f, 0.023743f, 0.027817f, 0.032745f, 0.038361f, 0.045990f, 0.055481f, 0.066895f, - 0.082031f, 0.100769f, 0.124573f, 0.154541f, 0.190796f, 0.235107f, 0.286133f, 0.344238f, - 0.408936f, 0.478271f, 0.810547f, 0.822266f, 0.824707f, 0.825195f, 0.825684f, 0.825684f, - 0.000115f, 0.000222f, 0.000252f, 0.000524f, 0.000574f, 0.000673f, 0.000869f, 0.000928f, - 0.000963f, 0.001022f, 0.001246f, 0.001292f, 0.001404f, 0.001477f, 0.001652f, 0.001811f, - 0.001822f, 0.002058f, 0.002237f, 0.002371f, 0.002588f, 0.002645f, 0.003019f, 0.003080f, - 0.003506f, 0.003689f, 0.003904f, 0.004383f, 0.004707f, 0.005020f, 0.005386f, 0.006023f, - 0.006451f, 0.007038f, 0.007809f, 0.008911f, 0.009949f, 0.011200f, 0.012222f, 0.014137f, - 0.016068f, 0.018692f, 0.021683f, 0.025314f, 0.029861f, 0.035889f, 0.043335f, 0.052582f, - 0.065186f, 0.080627f, 0.101501f, 0.127441f, 0.159912f, 0.200806f, 0.250000f, 0.307129f, - 0.371582f, 0.444580f, 0.798340f, 0.809570f, 0.811523f, 0.812988f, 0.812988f, 0.812988f, - 0.000000f, 0.000211f, 0.000204f, 0.000474f, 0.000555f, 0.000583f, 0.000600f, 0.000593f, - 0.000812f, 0.000865f, 0.000941f, 0.001013f, 0.001162f, 0.001348f, 0.001418f, 0.001465f, - 0.001616f, 0.001722f, 0.001856f, 0.001888f, 0.002048f, 0.002321f, 0.002396f, 0.002632f, - 0.002821f, 0.002974f, 0.003265f, 0.003477f, 0.003632f, 0.004051f, 0.004299f, 0.004700f, - 0.005238f, 0.005592f, 0.006199f, 0.006756f, 0.007614f, 0.008324f, 0.009727f, 0.010811f, - 0.012337f, 0.014168f, 0.016434f, 0.019257f, 0.022858f, 0.027451f, 0.033295f, 0.040619f, - 0.050690f, 0.063416f, 0.080261f, 0.102295f, 0.131104f, 0.168335f, 0.214355f, 0.270508f, - 0.334717f, 0.408936f, 0.783691f, 0.795898f, 0.798340f, 0.799316f, 0.800293f, 0.800293f, - 0.000174f, 0.000090f, 0.000281f, 0.000397f, 0.000401f, 0.000450f, 0.000488f, 0.000640f, - 0.000674f, 0.000713f, 0.000753f, 0.000845f, 0.000872f, 0.001020f, 0.001115f, 0.001264f, - 0.001327f, 0.001373f, 0.001520f, 0.001616f, 0.001767f, 0.001875f, 0.001968f, 0.002090f, - 0.002232f, 0.002333f, 0.002472f, 0.002802f, 0.002926f, 0.003189f, 0.003569f, 0.003752f, - 0.004009f, 0.004513f, 0.004860f, 0.005375f, 0.005997f, 0.006561f, 0.007378f, 0.008347f, - 0.009384f, 0.010612f, 0.012466f, 0.014526f, 0.017075f, 0.020447f, 0.024887f, 0.030533f, - 0.038300f, 0.048584f, 0.062042f, 0.080383f, 0.104736f, 0.137329f, 0.180176f, 0.232544f, - 0.296875f, 0.371338f, 0.769043f, 0.781250f, 0.784180f, 0.784668f, 0.786133f, 0.786133f, - 0.000025f, 0.000135f, 0.000154f, 0.000260f, 0.000353f, 0.000364f, 0.000380f, 0.000520f, - 0.000548f, 0.000587f, 0.000712f, 0.000735f, 0.000772f, 0.000822f, 0.000886f, 0.001004f, - 0.000946f, 0.001115f, 0.001177f, 0.001266f, 0.001454f, 0.001527f, 0.001575f, 0.001680f, - 0.001883f, 0.001961f, 0.002043f, 0.002193f, 0.002281f, 0.002520f, 0.002712f, 0.003021f, - 0.003147f, 0.003561f, 0.003786f, 0.004116f, 0.004570f, 0.005058f, 0.005634f, 0.006165f, - 0.007095f, 0.008049f, 0.009201f, 0.010674f, 0.012550f, 0.014854f, 0.018051f, 0.022385f, - 0.027908f, 0.035522f, 0.046295f, 0.061035f, 0.081238f, 0.109131f, 0.146729f, 0.197021f, - 0.258301f, 0.333008f, 0.752441f, 0.766113f, 0.768555f, 0.769531f, 0.770020f, 0.769531f, - 0.000000f, 0.000121f, 0.000209f, 0.000291f, 0.000337f, 0.000307f, 0.000324f, 0.000415f, - 0.000426f, 0.000453f, 0.000491f, 0.000573f, 0.000644f, 0.000650f, 0.000781f, 0.000746f, - 0.000830f, 0.000803f, 0.000997f, 0.001017f, 0.001020f, 0.001158f, 0.001241f, 0.001317f, - 0.001375f, 0.001432f, 0.001524f, 0.001656f, 0.001858f, 0.001955f, 0.002050f, 0.002274f, - 0.002460f, 0.002724f, 0.002831f, 0.003050f, 0.003441f, 0.003790f, 0.004162f, 0.004623f, - 0.005219f, 0.005951f, 0.006721f, 0.007729f, 0.008926f, 0.010620f, 0.013000f, 0.015686f, - 0.019852f, 0.025436f, 0.033295f, 0.044617f, 0.060608f, 0.083313f, 0.116211f, 0.161499f, - 0.220093f, 0.293945f, 0.734863f, 0.749512f, 0.752441f, 0.752930f, 0.753906f, 0.753906f, - 0.000000f, 0.000121f, 0.000118f, 0.000246f, 0.000233f, 0.000252f, 0.000338f, 0.000282f, - 0.000353f, 0.000355f, 0.000448f, 0.000435f, 0.000464f, 0.000530f, 0.000578f, 0.000649f, - 0.000677f, 0.000710f, 0.000749f, 0.000792f, 0.000881f, 0.000903f, 0.000967f, 0.001049f, - 0.001041f, 0.001100f, 0.001176f, 0.001254f, 0.001402f, 0.001451f, 0.001697f, 0.001674f, - 0.001804f, 0.001914f, 0.002195f, 0.002451f, 0.002474f, 0.002758f, 0.003029f, 0.003483f, - 0.003824f, 0.004272f, 0.004833f, 0.005573f, 0.006477f, 0.007629f, 0.009041f, 0.010918f, - 0.013573f, 0.017319f, 0.022842f, 0.031036f, 0.043030f, 0.061096f, 0.088440f, 0.127563f, - 0.182861f, 0.254395f, 0.717285f, 0.731934f, 0.734863f, 0.735352f, 0.735840f, 0.736328f, - 0.000000f, 0.000000f, 0.000117f, 0.000163f, 0.000109f, 0.000208f, 0.000212f, 0.000208f, - 0.000270f, 0.000356f, 0.000324f, 0.000377f, 0.000391f, 0.000420f, 0.000449f, 0.000440f, - 0.000484f, 0.000504f, 0.000534f, 0.000561f, 0.000639f, 0.000667f, 0.000715f, 0.000722f, - 0.000799f, 0.000845f, 0.000939f, 0.000945f, 0.001053f, 0.001149f, 0.001252f, 0.001310f, - 0.001392f, 0.001507f, 0.001526f, 0.001710f, 0.001773f, 0.002111f, 0.002300f, 0.002443f, - 0.002661f, 0.002996f, 0.003376f, 0.003880f, 0.004482f, 0.005150f, 0.006115f, 0.007401f, - 0.009132f, 0.011696f, 0.015076f, 0.020416f, 0.029236f, 0.042389f, 0.063782f, 0.096802f, - 0.146362f, 0.215576f, 0.698242f, 0.712891f, 0.715332f, 0.716797f, 0.717285f, 0.717285f, - 0.000000f, 0.000118f, 0.000115f, 0.000133f, 0.000144f, 0.000147f, 0.000162f, 0.000150f, - 0.000194f, 0.000215f, 0.000228f, 0.000299f, 0.000271f, 0.000313f, 0.000328f, 0.000358f, - 0.000378f, 0.000360f, 0.000407f, 0.000438f, 0.000441f, 0.000488f, 0.000515f, 0.000544f, - 0.000576f, 0.000617f, 0.000659f, 0.000715f, 0.000741f, 0.000773f, 0.000850f, 0.000921f, - 0.000979f, 0.001066f, 0.001128f, 0.001292f, 0.001279f, 0.001400f, 0.001572f, 0.001668f, - 0.001869f, 0.002029f, 0.002295f, 0.002607f, 0.002985f, 0.003464f, 0.004066f, 0.004913f, - 0.006023f, 0.007519f, 0.009827f, 0.013016f, 0.018524f, 0.027481f, 0.042847f, 0.068970f, - 0.111938f, 0.176392f, 0.675781f, 0.692871f, 0.695801f, 0.696777f, 0.698242f, 0.697754f, - 0.000000f, 0.000000f, 0.000111f, 0.000108f, 0.000104f, 0.000102f, 0.000118f, 0.000120f, - 0.000134f, 0.000128f, 0.000188f, 0.000154f, 0.000197f, 0.000188f, 0.000245f, 0.000256f, - 0.000233f, 0.000266f, 0.000345f, 0.000281f, 0.000355f, 0.000322f, 0.000392f, 0.000358f, - 0.000437f, 0.000425f, 0.000458f, 0.000477f, 0.000564f, 0.000636f, 0.000578f, 0.000607f, - 0.000668f, 0.000719f, 0.000769f, 0.000832f, 0.000880f, 0.000953f, 0.001060f, 0.001116f, - 0.001226f, 0.001363f, 0.001486f, 0.001760f, 0.001944f, 0.002216f, 0.002605f, 0.003107f, - 0.003778f, 0.004715f, 0.005989f, 0.007942f, 0.011292f, 0.016632f, 0.026550f, 0.045532f, - 0.079956f, 0.138550f, 0.655762f, 0.671875f, 0.674805f, 0.675293f, 0.675781f, 0.678223f, - 0.000000f, 0.000112f, 0.000105f, 0.000102f, 0.000098f, 0.000095f, 0.000093f, 0.000088f, - 0.000089f, 0.000085f, 0.000095f, 0.000126f, 0.000109f, 0.000154f, 0.000153f, 0.000162f, - 0.000176f, 0.000190f, 0.000202f, 0.000204f, 0.000212f, 0.000214f, 0.000266f, 0.000239f, - 0.000279f, 0.000293f, 0.000329f, 0.000329f, 0.000339f, 0.000365f, 0.000437f, 0.000424f, - 0.000429f, 0.000474f, 0.000525f, 0.000596f, 0.000572f, 0.000612f, 0.000666f, 0.000723f, - 0.000791f, 0.000850f, 0.000977f, 0.001066f, 0.001225f, 0.001351f, 0.001555f, 0.001837f, - 0.002279f, 0.002760f, 0.003445f, 0.004612f, 0.006386f, 0.009438f, 0.015221f, 0.027008f, - 0.052551f, 0.102966f, 0.633789f, 0.649414f, 0.652832f, 0.653809f, 0.655273f, 0.655273f, - 0.000000f, 0.000105f, 0.000099f, 0.000094f, 0.000090f, 0.000087f, 0.000084f, 0.000082f, - 0.000079f, 0.000075f, 0.000071f, 0.000068f, 0.000064f, 0.000072f, 0.000096f, 0.000105f, - 0.000112f, 0.000088f, 0.000123f, 0.000129f, 0.000132f, 0.000140f, 0.000147f, 0.000170f, - 0.000188f, 0.000192f, 0.000171f, 0.000210f, 0.000217f, 0.000223f, 0.000237f, 0.000251f, - 0.000258f, 0.000294f, 0.000298f, 0.000316f, 0.000350f, 0.000382f, 0.000400f, 0.000437f, - 0.000479f, 0.000514f, 0.000576f, 0.000620f, 0.000688f, 0.000782f, 0.000916f, 0.001026f, - 0.001219f, 0.001502f, 0.001892f, 0.002424f, 0.003359f, 0.004974f, 0.008118f, 0.014343f, - 0.030075f, 0.070068f, 0.610352f, 0.626953f, 0.629883f, 0.631348f, 0.632324f, 0.632324f, - 0.000110f, 0.000094f, 0.000087f, 0.000081f, 0.000077f, 0.000075f, 0.000072f, 0.000069f, - 0.000067f, 0.000066f, 0.000064f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000051f, - 0.000054f, 0.000047f, 0.000057f, 0.000055f, 0.000075f, 0.000078f, 0.000086f, 0.000093f, - 0.000093f, 0.000102f, 0.000112f, 0.000113f, 0.000130f, 0.000128f, 0.000142f, 0.000145f, - 0.000156f, 0.000153f, 0.000180f, 0.000178f, 0.000183f, 0.000223f, 0.000230f, 0.000240f, - 0.000265f, 0.000276f, 0.000300f, 0.000332f, 0.000357f, 0.000411f, 0.000449f, 0.000540f, - 0.000615f, 0.000741f, 0.000916f, 0.001144f, 0.001566f, 0.002310f, 0.003731f, 0.006905f, - 0.014793f, 0.041779f, 0.585938f, 0.603027f, 0.605957f, 0.608398f, 0.608398f, 0.609375f, - 0.000090f, 0.000071f, 0.000066f, 0.000062f, 0.000058f, 0.000056f, 0.000053f, 0.000053f, - 0.000051f, 0.000051f, 0.000049f, 0.000048f, 0.000048f, 0.000047f, 0.000045f, 0.000043f, - 0.000042f, 0.000040f, 0.000038f, 0.000036f, 0.000036f, 0.000033f, 0.000034f, 0.000040f, - 0.000040f, 0.000040f, 0.000048f, 0.000053f, 0.000060f, 0.000064f, 0.000067f, 0.000070f, - 0.000075f, 0.000081f, 0.000085f, 0.000090f, 0.000091f, 0.000103f, 0.000106f, 0.000120f, - 0.000134f, 0.000138f, 0.000142f, 0.000156f, 0.000174f, 0.000180f, 0.000212f, 0.000239f, - 0.000253f, 0.000310f, 0.000377f, 0.000479f, 0.000627f, 0.000875f, 0.001396f, 0.002623f, - 0.006184f, 0.019897f, 0.560547f, 0.578125f, 0.581543f, 0.583008f, 0.583984f, 0.583984f, - 0.000038f, 0.000035f, 0.000031f, 0.000031f, 0.000030f, 0.000031f, 0.000031f, 0.000030f, - 0.000030f, 0.000028f, 0.000029f, 0.000030f, 0.000029f, 0.000028f, 0.000029f, 0.000029f, - 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f, - 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, 0.000019f, 0.000022f, - 0.000023f, 0.000027f, 0.000031f, 0.000035f, 0.000037f, 0.000039f, 0.000039f, 0.000043f, - 0.000049f, 0.000052f, 0.000056f, 0.000050f, 0.000068f, 0.000062f, 0.000070f, 0.000087f, - 0.000094f, 0.000107f, 0.000122f, 0.000140f, 0.000191f, 0.000247f, 0.000388f, 0.000710f, - 0.001781f, 0.007076f, 0.535156f, 0.553223f, 0.556152f, 0.558105f, 0.559082f, 0.559082f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000003f, 0.000003f, 0.000005f, 0.000006f, 0.000007f, 0.000007f, 0.000009f, - 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, - 0.000012f, 0.000013f, 0.000013f, 0.000013f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000009f, - 0.000009f, 0.000010f, 0.000011f, 0.000015f, 0.000017f, 0.000016f, 0.000018f, 0.000021f, - 0.000020f, 0.000024f, 0.000024f, 0.000032f, 0.000035f, 0.000045f, 0.000065f, 0.000105f, - 0.000246f, 0.001313f, 0.508789f, 0.527344f, 0.530762f, 0.531738f, 0.532715f, 0.533691f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, - 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000005f, 0.000018f, 0.481934f, 0.500977f, 0.504883f, 0.505859f, 0.507324f, 0.507812f, - }, - { - 0.053833f, 0.152832f, 0.239014f, 0.313477f, 0.377686f, 0.433838f, 0.481689f, 0.524414f, - 0.562988f, 0.596680f, 0.626953f, 0.654785f, 0.678711f, 0.700684f, 0.720703f, 0.739746f, - 0.755859f, 0.771973f, 0.787109f, 0.798828f, 0.812012f, 0.823730f, 0.833984f, 0.844238f, - 0.853027f, 0.862793f, 0.870605f, 0.878418f, 0.885254f, 0.892090f, 0.898926f, 0.904297f, - 0.910645f, 0.916504f, 0.921875f, 0.926270f, 0.931641f, 0.936035f, 0.939941f, 0.944336f, - 0.948242f, 0.952148f, 0.955566f, 0.959961f, 0.962402f, 0.966309f, 0.969238f, 0.972168f, - 0.975098f, 0.978027f, 0.980957f, 0.983398f, 0.985840f, 0.988281f, 0.990723f, 0.992676f, - 0.995117f, 0.996582f, 0.998047f, 0.995117f, 0.993164f, 0.990723f, 0.988770f, 0.986816f, - 0.036804f, 0.109497f, 0.178589f, 0.244751f, 0.305908f, 0.361084f, 0.411621f, 0.457275f, - 0.498535f, 0.536133f, 0.569824f, 0.601562f, 0.629883f, 0.655273f, 0.679688f, 0.700195f, - 0.720215f, 0.737793f, 0.755859f, 0.770508f, 0.785645f, 0.798340f, 0.811035f, 0.822754f, - 0.833008f, 0.843750f, 0.852539f, 0.861328f, 0.869629f, 0.877441f, 0.885742f, 0.892578f, - 0.898926f, 0.905273f, 0.911133f, 0.916504f, 0.921875f, 0.926758f, 0.931641f, 0.936523f, - 0.940430f, 0.945312f, 0.949219f, 0.953613f, 0.956543f, 0.960449f, 0.963867f, 0.967285f, - 0.970703f, 0.973633f, 0.976562f, 0.979004f, 0.981934f, 0.984375f, 0.986816f, 0.989746f, - 0.992188f, 0.994141f, 0.996582f, 0.994141f, 0.992188f, 0.990234f, 0.988281f, 0.986328f, - 0.025787f, 0.080383f, 0.136230f, 0.191650f, 0.245239f, 0.297119f, 0.345947f, 0.392822f, - 0.436035f, 0.476807f, 0.513184f, 0.547363f, 0.578125f, 0.607910f, 0.634766f, 0.658203f, - 0.681152f, 0.702637f, 0.721191f, 0.738770f, 0.755371f, 0.770508f, 0.784668f, 0.798828f, - 0.810547f, 0.821777f, 0.833984f, 0.843262f, 0.852539f, 0.861816f, 0.869629f, 0.877930f, - 0.885254f, 0.893555f, 0.898926f, 0.906250f, 0.911621f, 0.917969f, 0.923340f, 0.928223f, - 0.933105f, 0.937500f, 0.941406f, 0.946289f, 0.950195f, 0.954102f, 0.958496f, 0.961914f, - 0.965820f, 0.968750f, 0.971680f, 0.975098f, 0.978027f, 0.980469f, 0.983887f, 0.985840f, - 0.988770f, 0.991211f, 0.995117f, 0.993164f, 0.991211f, 0.989258f, 0.987305f, 0.985352f, - 0.019455f, 0.060944f, 0.104553f, 0.150513f, 0.196411f, 0.243164f, 0.289062f, 0.333740f, - 0.376709f, 0.417725f, 0.454346f, 0.491211f, 0.524414f, 0.556641f, 0.585938f, 0.613770f, - 0.639160f, 0.662598f, 0.682617f, 0.703613f, 0.723633f, 0.740723f, 0.756836f, 0.771973f, - 0.787109f, 0.798828f, 0.812012f, 0.823242f, 0.833984f, 0.844238f, 0.853516f, 0.863281f, - 0.871094f, 0.879395f, 0.886719f, 0.893555f, 0.899902f, 0.907227f, 0.913086f, 0.918945f, - 0.924805f, 0.928711f, 0.934082f, 0.938965f, 0.943848f, 0.947754f, 0.952637f, 0.955566f, - 0.959961f, 0.963867f, 0.966797f, 0.970215f, 0.973633f, 0.977051f, 0.979004f, 0.982422f, - 0.985840f, 0.987793f, 0.993652f, 0.991699f, 0.989746f, 0.988281f, 0.986328f, 0.984375f, - 0.015221f, 0.047363f, 0.082092f, 0.119202f, 0.159058f, 0.199219f, 0.239380f, 0.280762f, - 0.321533f, 0.362061f, 0.400146f, 0.436768f, 0.472900f, 0.504883f, 0.536621f, 0.566406f, - 0.594238f, 0.621094f, 0.645508f, 0.667969f, 0.688477f, 0.707520f, 0.726562f, 0.742676f, - 0.759277f, 0.773926f, 0.787598f, 0.800781f, 0.812988f, 0.825195f, 0.835938f, 0.846191f, - 0.856445f, 0.865234f, 0.872559f, 0.880859f, 0.888672f, 0.895020f, 0.902832f, 0.908203f, - 0.914551f, 0.919922f, 0.926758f, 0.931152f, 0.937012f, 0.941406f, 0.945312f, 0.949707f, - 0.954102f, 0.958496f, 0.962402f, 0.965820f, 0.969238f, 0.972168f, 0.976074f, 0.978516f, - 0.981934f, 0.984863f, 0.992188f, 0.990723f, 0.988770f, 0.987305f, 0.985352f, 0.983887f, - 0.011658f, 0.037170f, 0.065430f, 0.096008f, 0.128784f, 0.162842f, 0.198975f, 0.235596f, - 0.273926f, 0.310791f, 0.348145f, 0.385010f, 0.420410f, 0.454834f, 0.488037f, 0.519043f, - 0.548828f, 0.577148f, 0.603516f, 0.627441f, 0.650879f, 0.672363f, 0.693848f, 0.712402f, - 0.729980f, 0.748535f, 0.762207f, 0.778809f, 0.791504f, 0.804199f, 0.815918f, 0.827637f, - 0.838867f, 0.848145f, 0.857910f, 0.866211f, 0.875977f, 0.883301f, 0.891602f, 0.898438f, - 0.905273f, 0.911133f, 0.917480f, 0.923340f, 0.928711f, 0.933594f, 0.938477f, 0.942871f, - 0.948242f, 0.952637f, 0.956543f, 0.960449f, 0.964355f, 0.968262f, 0.971191f, 0.974609f, - 0.978027f, 0.980957f, 0.990723f, 0.989258f, 0.987793f, 0.985840f, 0.984375f, 0.983398f, - 0.009758f, 0.030121f, 0.052490f, 0.077576f, 0.104309f, 0.134277f, 0.164917f, 0.197510f, - 0.231812f, 0.266113f, 0.301025f, 0.336426f, 0.372070f, 0.405762f, 0.438721f, 0.471436f, - 0.502441f, 0.531738f, 0.560059f, 0.587402f, 0.612793f, 0.634766f, 0.658691f, 0.679199f, - 0.699219f, 0.718262f, 0.735352f, 0.751953f, 0.767090f, 0.780762f, 0.794922f, 0.808105f, - 0.820801f, 0.831055f, 0.842285f, 0.851562f, 0.861328f, 0.870117f, 0.878906f, 0.886719f, - 0.893555f, 0.900879f, 0.907715f, 0.913574f, 0.919434f, 0.926270f, 0.932129f, 0.936523f, - 0.941895f, 0.945801f, 0.951172f, 0.955078f, 0.959473f, 0.963867f, 0.966797f, 0.970703f, - 0.974121f, 0.977539f, 0.989746f, 0.988281f, 0.986328f, 0.984863f, 0.983398f, 0.982422f, - 0.007744f, 0.024567f, 0.043365f, 0.063782f, 0.086487f, 0.111389f, 0.137451f, 0.166260f, - 0.195435f, 0.226929f, 0.259033f, 0.291748f, 0.324951f, 0.358398f, 0.391113f, 0.424316f, - 0.456299f, 0.486328f, 0.516113f, 0.543945f, 0.571289f, 0.597656f, 0.621094f, 0.644531f, - 0.666504f, 0.686523f, 0.705078f, 0.724121f, 0.741211f, 0.757324f, 0.773438f, 0.786621f, - 0.801270f, 0.812988f, 0.823730f, 0.835938f, 0.846191f, 0.855957f, 0.865723f, 0.873047f, - 0.882324f, 0.889648f, 0.897949f, 0.905762f, 0.911133f, 0.917969f, 0.923828f, 0.929199f, - 0.934082f, 0.940430f, 0.944824f, 0.949707f, 0.954102f, 0.958008f, 0.962891f, 0.966309f, - 0.970215f, 0.974121f, 0.987793f, 0.986816f, 0.985352f, 0.983887f, 0.981934f, 0.980469f, - 0.006672f, 0.020828f, 0.035950f, 0.053345f, 0.071594f, 0.092834f, 0.114624f, 0.139282f, - 0.165649f, 0.192627f, 0.222290f, 0.252197f, 0.283203f, 0.314941f, 0.346680f, 0.377930f, - 0.409668f, 0.441650f, 0.471680f, 0.500977f, 0.529297f, 0.557129f, 0.583008f, 0.607422f, - 0.630859f, 0.654297f, 0.674805f, 0.694824f, 0.713867f, 0.731445f, 0.748535f, 0.763672f, - 0.778320f, 0.791992f, 0.805664f, 0.817871f, 0.829590f, 0.840332f, 0.850098f, 0.860352f, - 0.869141f, 0.878906f, 0.886719f, 0.894043f, 0.901855f, 0.909180f, 0.915527f, 0.920898f, - 0.927246f, 0.933105f, 0.938477f, 0.943848f, 0.948730f, 0.953125f, 0.957520f, 0.961914f, - 0.965820f, 0.970215f, 0.985840f, 0.985352f, 0.983887f, 0.981934f, 0.980957f, 0.979492f, - 0.005592f, 0.017181f, 0.030457f, 0.044739f, 0.060638f, 0.077454f, 0.097046f, 0.117981f, - 0.140625f, 0.164673f, 0.190552f, 0.217896f, 0.246582f, 0.275635f, 0.305176f, 0.336426f, - 0.366943f, 0.397949f, 0.428711f, 0.457764f, 0.487061f, 0.515137f, 0.542480f, 0.568848f, - 0.593750f, 0.619141f, 0.641602f, 0.662598f, 0.683594f, 0.703613f, 0.721191f, 0.738281f, - 0.755859f, 0.770996f, 0.784180f, 0.799316f, 0.811035f, 0.823730f, 0.833984f, 0.845703f, - 0.855957f, 0.865234f, 0.875000f, 0.883301f, 0.891602f, 0.898926f, 0.906738f, 0.912598f, - 0.919922f, 0.926270f, 0.931152f, 0.937988f, 0.942871f, 0.948242f, 0.952148f, 0.957520f, - 0.961914f, 0.966309f, 0.984375f, 0.983398f, 0.982422f, 0.981445f, 0.979492f, 0.978027f, - 0.004829f, 0.014816f, 0.025711f, 0.037964f, 0.051300f, 0.065796f, 0.082458f, 0.100037f, - 0.120178f, 0.141357f, 0.163330f, 0.187622f, 0.213013f, 0.240601f, 0.268311f, 0.296387f, - 0.325928f, 0.356445f, 0.385742f, 0.415771f, 0.445557f, 0.474121f, 0.501465f, 0.530762f, - 0.556152f, 0.581543f, 0.606445f, 0.630859f, 0.651855f, 0.672852f, 0.693359f, 0.712402f, - 0.730469f, 0.746582f, 0.762695f, 0.777832f, 0.791992f, 0.806152f, 0.818359f, 0.830566f, - 0.840820f, 0.852051f, 0.862305f, 0.871094f, 0.880371f, 0.888184f, 0.896484f, 0.904297f, - 0.910645f, 0.917969f, 0.924316f, 0.931152f, 0.936035f, 0.942383f, 0.947266f, 0.951660f, - 0.957031f, 0.960938f, 0.982422f, 0.982422f, 0.981445f, 0.979492f, 0.978516f, 0.977051f, - 0.004040f, 0.012436f, 0.022064f, 0.032440f, 0.044006f, 0.056549f, 0.070068f, 0.085999f, - 0.102539f, 0.120239f, 0.140625f, 0.161621f, 0.184448f, 0.208496f, 0.234253f, 0.260742f, - 0.288086f, 0.316406f, 0.345215f, 0.374512f, 0.404297f, 0.433350f, 0.462402f, 0.490234f, - 0.518066f, 0.543945f, 0.570312f, 0.594727f, 0.618652f, 0.642090f, 0.663086f, 0.683594f, - 0.703613f, 0.721680f, 0.739258f, 0.755859f, 0.772461f, 0.786621f, 0.798828f, 0.812500f, - 0.825195f, 0.836914f, 0.848633f, 0.858887f, 0.869141f, 0.877441f, 0.886230f, 0.894531f, - 0.902832f, 0.909668f, 0.916992f, 0.923340f, 0.929688f, 0.935547f, 0.941406f, 0.947266f, - 0.951660f, 0.957031f, 0.980469f, 0.980469f, 0.979492f, 0.978516f, 0.977051f, 0.976074f, - 0.003536f, 0.010872f, 0.018829f, 0.027893f, 0.037872f, 0.048492f, 0.060883f, 0.073425f, - 0.088074f, 0.103638f, 0.120789f, 0.139038f, 0.159912f, 0.181274f, 0.204102f, 0.227905f, - 0.253906f, 0.280518f, 0.307861f, 0.335938f, 0.364746f, 0.393311f, 0.421631f, 0.451416f, - 0.479004f, 0.505859f, 0.533203f, 0.560059f, 0.584473f, 0.608398f, 0.631836f, 0.653320f, - 0.674805f, 0.695801f, 0.714355f, 0.731934f, 0.749512f, 0.765137f, 0.781250f, 0.794434f, - 0.808594f, 0.821289f, 0.833496f, 0.844238f, 0.855469f, 0.866211f, 0.875000f, 0.883789f, - 0.892578f, 0.901855f, 0.908691f, 0.915527f, 0.922852f, 0.929199f, 0.935059f, 0.941406f, - 0.947266f, 0.951172f, 0.978516f, 0.979004f, 0.978027f, 0.977051f, 0.975586f, 0.974121f, - 0.002989f, 0.009476f, 0.016785f, 0.024246f, 0.032745f, 0.041809f, 0.052246f, 0.063782f, - 0.076111f, 0.089722f, 0.104675f, 0.120605f, 0.138306f, 0.157959f, 0.178101f, 0.200073f, - 0.223145f, 0.247192f, 0.273193f, 0.300293f, 0.327148f, 0.354736f, 0.383545f, 0.411621f, - 0.439941f, 0.468018f, 0.495605f, 0.522949f, 0.548828f, 0.574219f, 0.598145f, 0.622559f, - 0.645508f, 0.666016f, 0.687500f, 0.706543f, 0.725586f, 0.743164f, 0.759766f, 0.775391f, - 0.791016f, 0.803711f, 0.817871f, 0.829590f, 0.841797f, 0.852539f, 0.863281f, 0.873047f, - 0.882812f, 0.891113f, 0.900391f, 0.906738f, 0.915039f, 0.922852f, 0.929688f, 0.936035f, - 0.941895f, 0.946777f, 0.976074f, 0.977051f, 0.976074f, 0.975586f, 0.974121f, 0.972656f, - 0.002846f, 0.008568f, 0.014557f, 0.021484f, 0.028442f, 0.036377f, 0.045074f, 0.055054f, - 0.066101f, 0.077759f, 0.090759f, 0.104797f, 0.120483f, 0.136719f, 0.155029f, 0.175171f, - 0.196045f, 0.218262f, 0.241943f, 0.266357f, 0.292480f, 0.319336f, 0.345703f, 0.373535f, - 0.402100f, 0.429932f, 0.457764f, 0.484863f, 0.512207f, 0.539062f, 0.564941f, 0.589844f, - 0.613281f, 0.636719f, 0.659180f, 0.680664f, 0.700684f, 0.718750f, 0.736816f, 0.754883f, - 0.770508f, 0.785645f, 0.799805f, 0.813965f, 0.826172f, 0.838867f, 0.850586f, 0.861328f, - 0.871582f, 0.881836f, 0.890625f, 0.898926f, 0.906738f, 0.915039f, 0.922363f, 0.928711f, - 0.936035f, 0.941895f, 0.974609f, 0.975098f, 0.974609f, 0.973633f, 0.972656f, 0.971191f, - 0.002285f, 0.007290f, 0.012634f, 0.018280f, 0.024918f, 0.032074f, 0.039673f, 0.048157f, - 0.057220f, 0.067810f, 0.078735f, 0.091248f, 0.104370f, 0.119873f, 0.135742f, 0.152344f, - 0.171631f, 0.191650f, 0.213501f, 0.236206f, 0.260010f, 0.285156f, 0.310547f, 0.338135f, - 0.364746f, 0.392578f, 0.420410f, 0.448242f, 0.476562f, 0.502441f, 0.529785f, 0.555664f, - 0.581543f, 0.605469f, 0.629395f, 0.652344f, 0.673340f, 0.693848f, 0.713867f, 0.732910f, - 0.750000f, 0.767090f, 0.782715f, 0.797852f, 0.811035f, 0.825195f, 0.836914f, 0.848633f, - 0.860840f, 0.870605f, 0.880371f, 0.890137f, 0.898926f, 0.907227f, 0.915527f, 0.923340f, - 0.929688f, 0.936523f, 0.972168f, 0.973145f, 0.972656f, 0.972168f, 0.970703f, 0.969727f, - 0.002064f, 0.006584f, 0.011154f, 0.016266f, 0.022263f, 0.028397f, 0.034973f, 0.042145f, - 0.050232f, 0.059235f, 0.069031f, 0.079346f, 0.091736f, 0.104553f, 0.118652f, 0.133789f, - 0.150635f, 0.168457f, 0.188110f, 0.208984f, 0.230225f, 0.253906f, 0.278076f, 0.303955f, - 0.329346f, 0.356689f, 0.384033f, 0.411865f, 0.439941f, 0.467285f, 0.493896f, 0.520996f, - 0.547363f, 0.573730f, 0.597168f, 0.622559f, 0.645508f, 0.667969f, 0.688965f, 0.709473f, - 0.728027f, 0.746094f, 0.762695f, 0.778809f, 0.794922f, 0.809082f, 0.822754f, 0.834961f, - 0.847168f, 0.858887f, 0.870117f, 0.880371f, 0.889648f, 0.898926f, 0.907227f, 0.915039f, - 0.923828f, 0.930176f, 0.970215f, 0.971680f, 0.970215f, 0.970215f, 0.968750f, 0.968262f, - 0.001935f, 0.005634f, 0.010078f, 0.014389f, 0.019669f, 0.024658f, 0.030716f, 0.037201f, - 0.044098f, 0.051941f, 0.060333f, 0.070129f, 0.080383f, 0.091370f, 0.103638f, 0.116943f, - 0.131714f, 0.148193f, 0.165161f, 0.183838f, 0.203979f, 0.225220f, 0.247803f, 0.271240f, - 0.296631f, 0.322510f, 0.349121f, 0.376221f, 0.403076f, 0.431152f, 0.458984f, 0.485596f, - 0.513672f, 0.540039f, 0.564941f, 0.590820f, 0.616211f, 0.638672f, 0.662109f, 0.683105f, - 0.704102f, 0.723633f, 0.741699f, 0.759766f, 0.776855f, 0.792480f, 0.807617f, 0.821777f, - 0.833496f, 0.847168f, 0.858887f, 0.870117f, 0.880859f, 0.889648f, 0.899414f, 0.908203f, - 0.916992f, 0.924316f, 0.967285f, 0.968262f, 0.968750f, 0.968262f, 0.967285f, 0.966309f, - 0.001805f, 0.005119f, 0.009079f, 0.013023f, 0.017487f, 0.022278f, 0.027130f, 0.032684f, - 0.038666f, 0.045959f, 0.052826f, 0.061401f, 0.070801f, 0.080139f, 0.090698f, 0.102844f, - 0.115845f, 0.130005f, 0.145264f, 0.162476f, 0.180176f, 0.199951f, 0.220459f, 0.242188f, - 0.265869f, 0.290283f, 0.315430f, 0.341309f, 0.368652f, 0.395752f, 0.423584f, 0.451416f, - 0.479248f, 0.505859f, 0.532227f, 0.559082f, 0.584961f, 0.609863f, 0.634277f, 0.656738f, - 0.678711f, 0.700195f, 0.720703f, 0.738281f, 0.757324f, 0.774414f, 0.790527f, 0.805664f, - 0.820312f, 0.834473f, 0.846680f, 0.858887f, 0.869629f, 0.880859f, 0.890625f, 0.899902f, - 0.909668f, 0.917969f, 0.964844f, 0.966797f, 0.967285f, 0.965820f, 0.964844f, 0.963867f, - 0.001437f, 0.004662f, 0.007919f, 0.011681f, 0.015404f, 0.019272f, 0.024261f, 0.029205f, - 0.034515f, 0.040619f, 0.046967f, 0.054138f, 0.061737f, 0.070496f, 0.080200f, 0.090271f, - 0.101807f, 0.114136f, 0.127686f, 0.143188f, 0.159058f, 0.176514f, 0.195190f, 0.215454f, - 0.237305f, 0.260010f, 0.283936f, 0.309326f, 0.334717f, 0.361328f, 0.389160f, 0.416260f, - 0.444336f, 0.471436f, 0.499512f, 0.525879f, 0.552734f, 0.579590f, 0.604004f, 0.628906f, - 0.651855f, 0.674805f, 0.696777f, 0.717773f, 0.737305f, 0.755859f, 0.772949f, 0.789551f, - 0.805664f, 0.819336f, 0.833984f, 0.847168f, 0.859375f, 0.871094f, 0.881836f, 0.892090f, - 0.902344f, 0.910156f, 0.962402f, 0.964355f, 0.964355f, 0.963867f, 0.962891f, 0.961914f, - 0.001264f, 0.004036f, 0.007088f, 0.010170f, 0.013672f, 0.017365f, 0.021423f, 0.025955f, - 0.030533f, 0.035614f, 0.041321f, 0.047791f, 0.054626f, 0.062195f, 0.070679f, 0.080017f, - 0.089600f, 0.100769f, 0.112854f, 0.125977f, 0.139893f, 0.156128f, 0.172852f, 0.191650f, - 0.211060f, 0.232056f, 0.254883f, 0.278076f, 0.302979f, 0.328125f, 0.355225f, 0.381836f, - 0.409912f, 0.437256f, 0.464844f, 0.492676f, 0.520508f, 0.547852f, 0.573242f, 0.599609f, - 0.625000f, 0.649414f, 0.672363f, 0.694336f, 0.714844f, 0.734863f, 0.753418f, 0.771484f, - 0.788574f, 0.804688f, 0.820312f, 0.833496f, 0.847656f, 0.859863f, 0.873047f, 0.883301f, - 0.894043f, 0.903809f, 0.959961f, 0.961914f, 0.962402f, 0.960938f, 0.960449f, 0.959961f, - 0.001297f, 0.003721f, 0.006397f, 0.009308f, 0.012260f, 0.015808f, 0.019302f, 0.023010f, - 0.027267f, 0.032013f, 0.037109f, 0.042419f, 0.048523f, 0.054962f, 0.061920f, 0.070435f, - 0.079407f, 0.088318f, 0.099121f, 0.111084f, 0.124023f, 0.137695f, 0.152832f, 0.169434f, - 0.187378f, 0.206421f, 0.227783f, 0.249268f, 0.272461f, 0.297363f, 0.322754f, 0.348389f, - 0.376221f, 0.403809f, 0.431396f, 0.459229f, 0.487305f, 0.515137f, 0.542480f, 0.569336f, - 0.595215f, 0.621094f, 0.645996f, 0.669434f, 0.691406f, 0.712891f, 0.733887f, 0.753418f, - 0.770996f, 0.789062f, 0.805176f, 0.820801f, 0.835449f, 0.849121f, 0.861328f, 0.874512f, - 0.885742f, 0.895508f, 0.956543f, 0.959473f, 0.958984f, 0.958984f, 0.958008f, 0.957031f, - 0.001267f, 0.003481f, 0.005955f, 0.008568f, 0.011185f, 0.014030f, 0.017151f, 0.020294f, - 0.024246f, 0.028427f, 0.032654f, 0.037476f, 0.042603f, 0.048523f, 0.054871f, 0.062408f, - 0.070129f, 0.078552f, 0.087769f, 0.097534f, 0.109192f, 0.121399f, 0.135010f, 0.150513f, - 0.165894f, 0.183960f, 0.202881f, 0.222656f, 0.244385f, 0.267334f, 0.291260f, 0.317139f, - 0.343506f, 0.370605f, 0.397949f, 0.426025f, 0.454346f, 0.482666f, 0.511230f, 0.538086f, - 0.565918f, 0.592285f, 0.618164f, 0.642578f, 0.667480f, 0.690918f, 0.711914f, 0.732910f, - 0.752930f, 0.771484f, 0.790039f, 0.806641f, 0.821777f, 0.837402f, 0.850586f, 0.864746f, - 0.875977f, 0.887695f, 0.953613f, 0.956543f, 0.957031f, 0.956055f, 0.956055f, 0.955078f, - 0.001068f, 0.003025f, 0.005283f, 0.007442f, 0.009857f, 0.012665f, 0.015930f, 0.018570f, - 0.021820f, 0.025314f, 0.028931f, 0.033325f, 0.038147f, 0.042908f, 0.049011f, 0.055176f, - 0.061859f, 0.069397f, 0.077637f, 0.086792f, 0.096252f, 0.107117f, 0.119385f, 0.132690f, - 0.147095f, 0.162720f, 0.180054f, 0.198486f, 0.218384f, 0.239990f, 0.262207f, 0.287109f, - 0.311523f, 0.337891f, 0.364990f, 0.392822f, 0.420654f, 0.449219f, 0.478027f, 0.505859f, - 0.535156f, 0.562012f, 0.588867f, 0.615723f, 0.641602f, 0.666016f, 0.688965f, 0.711914f, - 0.732910f, 0.753906f, 0.773438f, 0.791016f, 0.808594f, 0.823730f, 0.839355f, 0.854004f, - 0.867188f, 0.879883f, 0.950195f, 0.954102f, 0.954102f, 0.953125f, 0.952637f, 0.952148f, - 0.000884f, 0.003082f, 0.004631f, 0.006931f, 0.008942f, 0.011513f, 0.013779f, 0.016663f, - 0.019806f, 0.022934f, 0.026215f, 0.029999f, 0.033813f, 0.038544f, 0.043365f, 0.048615f, - 0.054352f, 0.061005f, 0.068420f, 0.076477f, 0.085022f, 0.095032f, 0.105469f, 0.117432f, - 0.130127f, 0.143799f, 0.159790f, 0.176270f, 0.194580f, 0.214478f, 0.235229f, 0.257568f, - 0.281982f, 0.306641f, 0.332764f, 0.359863f, 0.388184f, 0.416016f, 0.445557f, 0.474854f, - 0.502441f, 0.531738f, 0.559570f, 0.586914f, 0.614258f, 0.640625f, 0.665039f, 0.689453f, - 0.712891f, 0.734863f, 0.755371f, 0.774902f, 0.793945f, 0.810547f, 0.827637f, 0.842773f, - 0.857910f, 0.871094f, 0.946777f, 0.950684f, 0.951172f, 0.950684f, 0.949707f, 0.949707f, - 0.000848f, 0.002630f, 0.004330f, 0.006386f, 0.008148f, 0.010437f, 0.012436f, 0.014977f, - 0.017731f, 0.020645f, 0.023529f, 0.026413f, 0.030289f, 0.034302f, 0.038391f, 0.043365f, - 0.048737f, 0.054413f, 0.060455f, 0.067383f, 0.075134f, 0.083801f, 0.093262f, 0.103821f, - 0.114746f, 0.127441f, 0.140991f, 0.156372f, 0.172729f, 0.190918f, 0.210449f, 0.231201f, - 0.253662f, 0.277344f, 0.302734f, 0.328857f, 0.355225f, 0.384033f, 0.413086f, 0.440918f, - 0.471191f, 0.500488f, 0.529785f, 0.558594f, 0.586426f, 0.613770f, 0.640137f, 0.666016f, - 0.689453f, 0.714355f, 0.736328f, 0.757812f, 0.777832f, 0.796875f, 0.813965f, 0.831543f, - 0.847168f, 0.860840f, 0.943848f, 0.948242f, 0.947754f, 0.948242f, 0.946777f, 0.946777f, - 0.000747f, 0.002462f, 0.004192f, 0.005573f, 0.007454f, 0.009430f, 0.011253f, 0.013588f, - 0.015762f, 0.018112f, 0.020859f, 0.023758f, 0.027084f, 0.030426f, 0.034332f, 0.038635f, - 0.042999f, 0.048340f, 0.053772f, 0.060028f, 0.066589f, 0.074402f, 0.082764f, 0.091553f, - 0.101685f, 0.112854f, 0.125122f, 0.138184f, 0.153320f, 0.169556f, 0.187500f, 0.206543f, - 0.227539f, 0.249512f, 0.273193f, 0.298340f, 0.324463f, 0.351562f, 0.379883f, 0.409424f, - 0.438477f, 0.468750f, 0.498047f, 0.527832f, 0.556641f, 0.585449f, 0.614258f, 0.641113f, - 0.666992f, 0.692383f, 0.716309f, 0.738281f, 0.760742f, 0.780273f, 0.799805f, 0.818848f, - 0.834473f, 0.851074f, 0.939941f, 0.944824f, 0.944336f, 0.944336f, 0.944336f, 0.943359f, - 0.000670f, 0.002079f, 0.003538f, 0.005146f, 0.006508f, 0.008247f, 0.010223f, 0.012260f, - 0.014153f, 0.016479f, 0.018677f, 0.021515f, 0.024323f, 0.027313f, 0.030518f, 0.034302f, - 0.038422f, 0.042725f, 0.047760f, 0.053101f, 0.059113f, 0.065613f, 0.072937f, 0.080444f, - 0.089722f, 0.099426f, 0.110596f, 0.122314f, 0.135742f, 0.150513f, 0.166260f, 0.183716f, - 0.202759f, 0.223633f, 0.245728f, 0.269287f, 0.294189f, 0.320557f, 0.348633f, 0.376709f, - 0.406494f, 0.436523f, 0.467285f, 0.497070f, 0.528320f, 0.557129f, 0.586426f, 0.614746f, - 0.642090f, 0.668945f, 0.694824f, 0.718750f, 0.742676f, 0.764648f, 0.786133f, 0.805176f, - 0.823242f, 0.840820f, 0.936035f, 0.940918f, 0.941406f, 0.941406f, 0.940430f, 0.939941f, - 0.000645f, 0.001963f, 0.003384f, 0.004719f, 0.006042f, 0.007614f, 0.009384f, 0.011192f, - 0.012665f, 0.015083f, 0.016861f, 0.019165f, 0.021393f, 0.024445f, 0.027451f, 0.030716f, - 0.034149f, 0.038116f, 0.042389f, 0.047028f, 0.052277f, 0.058014f, 0.064270f, 0.071289f, - 0.079041f, 0.087830f, 0.097351f, 0.108337f, 0.119995f, 0.132812f, 0.147217f, 0.163452f, - 0.180420f, 0.199585f, 0.219849f, 0.242065f, 0.265625f, 0.291260f, 0.318115f, 0.345703f, - 0.375000f, 0.404541f, 0.434326f, 0.465820f, 0.496582f, 0.526855f, 0.557617f, 0.587402f, - 0.616699f, 0.645508f, 0.672363f, 0.698242f, 0.723145f, 0.747559f, 0.770020f, 0.791504f, - 0.810059f, 0.828613f, 0.931641f, 0.937012f, 0.937500f, 0.937500f, 0.937012f, 0.936523f, - 0.000692f, 0.001705f, 0.003000f, 0.004238f, 0.005798f, 0.006805f, 0.008659f, 0.009933f, - 0.011681f, 0.013191f, 0.015259f, 0.017166f, 0.019379f, 0.021729f, 0.024796f, 0.027328f, - 0.030380f, 0.033661f, 0.037598f, 0.041718f, 0.046539f, 0.051270f, 0.056946f, 0.062988f, - 0.069885f, 0.077271f, 0.085999f, 0.095398f, 0.105652f, 0.117859f, 0.129883f, 0.144409f, - 0.159912f, 0.177002f, 0.196045f, 0.216553f, 0.239014f, 0.262451f, 0.288086f, 0.314941f, - 0.343262f, 0.372314f, 0.403076f, 0.433594f, 0.465332f, 0.496826f, 0.527832f, 0.559082f, - 0.589355f, 0.619629f, 0.648926f, 0.676758f, 0.703125f, 0.728516f, 0.752930f, 0.775391f, - 0.797363f, 0.817871f, 0.927246f, 0.933105f, 0.934082f, 0.933594f, 0.933594f, 0.933105f, - 0.000460f, 0.001622f, 0.002705f, 0.003983f, 0.004925f, 0.006363f, 0.007652f, 0.008965f, - 0.010521f, 0.011963f, 0.013664f, 0.015480f, 0.017258f, 0.019440f, 0.021912f, 0.024338f, - 0.027084f, 0.030212f, 0.033356f, 0.037018f, 0.040833f, 0.045380f, 0.050110f, 0.055573f, - 0.061829f, 0.068359f, 0.075928f, 0.083984f, 0.093140f, 0.103333f, 0.115112f, 0.127441f, - 0.141602f, 0.156982f, 0.174316f, 0.192871f, 0.213257f, 0.235596f, 0.259766f, 0.285400f, - 0.312256f, 0.341797f, 0.371094f, 0.402100f, 0.434082f, 0.465332f, 0.497314f, 0.529297f, - 0.562012f, 0.592773f, 0.623535f, 0.652832f, 0.681641f, 0.709473f, 0.735352f, 0.759766f, - 0.783203f, 0.803711f, 0.922363f, 0.929199f, 0.929688f, 0.929199f, 0.929688f, 0.928711f, - 0.000341f, 0.001686f, 0.002537f, 0.003769f, 0.004745f, 0.005764f, 0.007034f, 0.008286f, - 0.009369f, 0.010742f, 0.012161f, 0.013931f, 0.015671f, 0.017563f, 0.019440f, 0.021851f, - 0.024231f, 0.026672f, 0.029556f, 0.032776f, 0.036255f, 0.040283f, 0.044464f, 0.049194f, - 0.054413f, 0.060059f, 0.066589f, 0.074036f, 0.081909f, 0.091187f, 0.100769f, 0.112000f, - 0.124512f, 0.139038f, 0.154297f, 0.171265f, 0.189819f, 0.210571f, 0.232788f, 0.257324f, - 0.283203f, 0.311035f, 0.339844f, 0.370850f, 0.402100f, 0.433838f, 0.466797f, 0.499268f, - 0.532227f, 0.565430f, 0.598145f, 0.628418f, 0.659180f, 0.687988f, 0.715820f, 0.742188f, - 0.767090f, 0.791504f, 0.917969f, 0.924805f, 0.925293f, 0.925293f, 0.924805f, 0.924805f, - 0.000405f, 0.001282f, 0.002298f, 0.003269f, 0.004448f, 0.005043f, 0.006294f, 0.007233f, - 0.008606f, 0.009727f, 0.010849f, 0.012421f, 0.013885f, 0.015465f, 0.017426f, 0.019394f, - 0.021667f, 0.023819f, 0.026154f, 0.029175f, 0.032227f, 0.035706f, 0.039062f, 0.043427f, - 0.047913f, 0.052856f, 0.058502f, 0.064880f, 0.071960f, 0.079895f, 0.088867f, 0.098633f, - 0.109619f, 0.122192f, 0.135742f, 0.151489f, 0.168457f, 0.187134f, 0.207764f, 0.230835f, - 0.254883f, 0.281494f, 0.310059f, 0.339355f, 0.370361f, 0.402588f, 0.435547f, 0.468994f, - 0.502930f, 0.537109f, 0.569824f, 0.602051f, 0.634766f, 0.665527f, 0.695801f, 0.724121f, - 0.750488f, 0.776855f, 0.912598f, 0.919434f, 0.920410f, 0.920410f, 0.919922f, 0.920410f, - 0.000529f, 0.001217f, 0.002171f, 0.003035f, 0.003790f, 0.004784f, 0.005711f, 0.006756f, - 0.007782f, 0.008987f, 0.009773f, 0.011185f, 0.012650f, 0.013771f, 0.015656f, 0.017181f, - 0.018890f, 0.021057f, 0.023239f, 0.025848f, 0.028488f, 0.031525f, 0.034607f, 0.038147f, - 0.042023f, 0.046539f, 0.051605f, 0.056793f, 0.063049f, 0.069946f, 0.078064f, 0.086548f, - 0.096313f, 0.107117f, 0.119446f, 0.133301f, 0.148560f, 0.165405f, 0.184570f, 0.205811f, - 0.228394f, 0.253174f, 0.280029f, 0.308594f, 0.339111f, 0.370605f, 0.404053f, 0.437988f, - 0.471680f, 0.506348f, 0.541504f, 0.576172f, 0.609375f, 0.642578f, 0.674316f, 0.705078f, - 0.734375f, 0.761719f, 0.907227f, 0.914062f, 0.915527f, 0.915527f, 0.916016f, 0.915039f, - 0.000402f, 0.001247f, 0.001841f, 0.002651f, 0.003414f, 0.004200f, 0.005337f, 0.005821f, - 0.006733f, 0.008041f, 0.008942f, 0.010201f, 0.011261f, 0.012749f, 0.013893f, 0.015472f, - 0.016663f, 0.018829f, 0.020615f, 0.022873f, 0.025299f, 0.027893f, 0.030533f, 0.033600f, - 0.037140f, 0.040924f, 0.044983f, 0.049927f, 0.055359f, 0.061340f, 0.068176f, 0.075500f, - 0.084106f, 0.093933f, 0.104370f, 0.116638f, 0.130249f, 0.145996f, 0.162842f, 0.181885f, - 0.203735f, 0.226562f, 0.251465f, 0.279297f, 0.308594f, 0.339355f, 0.373047f, 0.406982f, - 0.440918f, 0.477051f, 0.511719f, 0.548340f, 0.583496f, 0.618164f, 0.652344f, 0.684570f, - 0.715332f, 0.745605f, 0.901855f, 0.909180f, 0.910156f, 0.910645f, 0.910156f, 0.910156f, - 0.000371f, 0.001090f, 0.001752f, 0.002409f, 0.003042f, 0.003963f, 0.004898f, 0.005295f, - 0.006077f, 0.006992f, 0.008102f, 0.009338f, 0.010101f, 0.011078f, 0.012375f, 0.013718f, - 0.015099f, 0.016403f, 0.018402f, 0.020203f, 0.022354f, 0.024475f, 0.026825f, 0.029388f, - 0.032623f, 0.035522f, 0.039429f, 0.043762f, 0.048462f, 0.053558f, 0.059265f, 0.065552f, - 0.073120f, 0.081787f, 0.091431f, 0.102112f, 0.114136f, 0.127930f, 0.143066f, 0.160767f, - 0.179810f, 0.200928f, 0.224854f, 0.250732f, 0.279053f, 0.308838f, 0.340820f, 0.374756f, - 0.410156f, 0.446045f, 0.482666f, 0.520020f, 0.556152f, 0.593262f, 0.628906f, 0.663574f, - 0.695801f, 0.728027f, 0.895508f, 0.903809f, 0.904297f, 0.904297f, 0.904297f, 0.904785f, - 0.000425f, 0.000937f, 0.001529f, 0.002129f, 0.002674f, 0.003696f, 0.004257f, 0.004990f, - 0.005726f, 0.006161f, 0.007118f, 0.007919f, 0.009109f, 0.009941f, 0.011055f, 0.011993f, - 0.013191f, 0.014832f, 0.016281f, 0.017868f, 0.019562f, 0.021362f, 0.023514f, 0.025909f, - 0.028549f, 0.031189f, 0.034637f, 0.037994f, 0.042145f, 0.046570f, 0.051453f, 0.057129f, - 0.063965f, 0.070984f, 0.079285f, 0.088806f, 0.099426f, 0.111267f, 0.125366f, 0.140747f, - 0.158203f, 0.178101f, 0.199585f, 0.223755f, 0.250732f, 0.279297f, 0.310059f, 0.343994f, - 0.377686f, 0.414307f, 0.451904f, 0.489258f, 0.527832f, 0.565918f, 0.603027f, 0.640137f, - 0.675781f, 0.710449f, 0.888672f, 0.897461f, 0.899902f, 0.900391f, 0.899414f, 0.899414f, - 0.000317f, 0.000823f, 0.001386f, 0.002108f, 0.002684f, 0.003239f, 0.003883f, 0.004303f, - 0.004730f, 0.005569f, 0.006626f, 0.007214f, 0.008003f, 0.008865f, 0.009590f, 0.010948f, - 0.011856f, 0.012871f, 0.014381f, 0.015640f, 0.017075f, 0.018799f, 0.020569f, 0.022537f, - 0.024704f, 0.027405f, 0.030090f, 0.033142f, 0.036346f, 0.040436f, 0.044830f, 0.049835f, - 0.055450f, 0.061584f, 0.068665f, 0.076904f, 0.086060f, 0.096741f, 0.109192f, 0.122559f, - 0.138428f, 0.155762f, 0.176270f, 0.198242f, 0.223145f, 0.250244f, 0.280518f, 0.312500f, - 0.346680f, 0.382324f, 0.420410f, 0.458740f, 0.498779f, 0.538086f, 0.577637f, 0.616211f, - 0.654297f, 0.690918f, 0.881348f, 0.890625f, 0.892578f, 0.893066f, 0.893066f, 0.892578f, - 0.000385f, 0.000766f, 0.001544f, 0.001925f, 0.002359f, 0.002947f, 0.003176f, 0.003691f, - 0.004288f, 0.005215f, 0.005917f, 0.006214f, 0.007019f, 0.007843f, 0.008469f, 0.009598f, - 0.010345f, 0.011559f, 0.012497f, 0.013634f, 0.014992f, 0.016373f, 0.017853f, 0.019608f, - 0.021515f, 0.023788f, 0.026260f, 0.028931f, 0.031860f, 0.034912f, 0.038635f, 0.042633f, - 0.047638f, 0.053070f, 0.059540f, 0.066284f, 0.074524f, 0.083679f, 0.094177f, 0.106445f, - 0.120361f, 0.135620f, 0.154053f, 0.174072f, 0.197144f, 0.222900f, 0.251221f, 0.281982f, - 0.315430f, 0.351318f, 0.388672f, 0.427734f, 0.468506f, 0.508301f, 0.549805f, 0.591309f, - 0.631348f, 0.670410f, 0.874512f, 0.884766f, 0.885742f, 0.886230f, 0.886230f, 0.886230f, - 0.000230f, 0.000832f, 0.001281f, 0.001865f, 0.002207f, 0.002605f, 0.003212f, 0.003284f, - 0.004124f, 0.004597f, 0.005222f, 0.005703f, 0.006260f, 0.007095f, 0.007790f, 0.008377f, - 0.009010f, 0.010078f, 0.011009f, 0.011925f, 0.013153f, 0.014282f, 0.015610f, 0.017151f, - 0.018951f, 0.020416f, 0.022583f, 0.024826f, 0.027328f, 0.030136f, 0.033508f, 0.036835f, - 0.040985f, 0.045410f, 0.050812f, 0.056854f, 0.063965f, 0.071777f, 0.081177f, 0.091858f, - 0.103699f, 0.117615f, 0.133423f, 0.152588f, 0.172974f, 0.196777f, 0.222900f, 0.252686f, - 0.284912f, 0.319824f, 0.356934f, 0.395996f, 0.436768f, 0.478516f, 0.521484f, 0.564453f, - 0.607422f, 0.649414f, 0.866699f, 0.876953f, 0.877930f, 0.879395f, 0.879883f, 0.878418f, - 0.000228f, 0.000734f, 0.000993f, 0.001416f, 0.001935f, 0.002293f, 0.002541f, 0.003174f, - 0.003508f, 0.004040f, 0.004337f, 0.005039f, 0.005505f, 0.006054f, 0.006840f, 0.007366f, - 0.008041f, 0.008644f, 0.009544f, 0.010460f, 0.011238f, 0.012329f, 0.013542f, 0.014755f, - 0.016083f, 0.017624f, 0.019424f, 0.021408f, 0.023422f, 0.025803f, 0.028366f, 0.031311f, - 0.034912f, 0.039124f, 0.043304f, 0.048492f, 0.054291f, 0.061188f, 0.069397f, 0.078552f, - 0.089233f, 0.101074f, 0.115540f, 0.131226f, 0.150757f, 0.172119f, 0.196533f, 0.224243f, - 0.254883f, 0.288574f, 0.324707f, 0.364014f, 0.405029f, 0.447510f, 0.491699f, 0.536133f, - 0.581543f, 0.627441f, 0.858398f, 0.869141f, 0.870605f, 0.871582f, 0.871094f, 0.871582f, - 0.000118f, 0.000713f, 0.000985f, 0.001328f, 0.001612f, 0.001999f, 0.002399f, 0.002913f, - 0.003139f, 0.003567f, 0.004055f, 0.004406f, 0.004986f, 0.005226f, 0.005856f, 0.006332f, - 0.007042f, 0.007553f, 0.008286f, 0.009064f, 0.009834f, 0.010696f, 0.011658f, 0.012726f, - 0.013817f, 0.015289f, 0.016693f, 0.018265f, 0.019699f, 0.021835f, 0.024307f, 0.026642f, - 0.029770f, 0.033234f, 0.037048f, 0.041351f, 0.046478f, 0.052032f, 0.058960f, 0.066589f, - 0.075745f, 0.086182f, 0.099121f, 0.113037f, 0.129517f, 0.149048f, 0.171387f, 0.196899f, - 0.225464f, 0.257812f, 0.293457f, 0.331787f, 0.373291f, 0.416748f, 0.460938f, 0.507812f, - 0.554688f, 0.602051f, 0.849609f, 0.859863f, 0.862793f, 0.863281f, 0.862793f, 0.862793f, - 0.000211f, 0.000522f, 0.000877f, 0.001204f, 0.001507f, 0.001724f, 0.002062f, 0.002426f, - 0.002867f, 0.003157f, 0.003443f, 0.003752f, 0.004192f, 0.004753f, 0.005154f, 0.005428f, - 0.006065f, 0.006546f, 0.007210f, 0.007725f, 0.008530f, 0.009247f, 0.010025f, 0.010887f, - 0.011909f, 0.012970f, 0.014069f, 0.015335f, 0.017105f, 0.018433f, 0.020554f, 0.022552f, - 0.025116f, 0.027802f, 0.031158f, 0.034485f, 0.038971f, 0.044037f, 0.049469f, 0.055847f, - 0.063843f, 0.072815f, 0.083618f, 0.095947f, 0.110840f, 0.128174f, 0.147949f, 0.171387f, - 0.198242f, 0.228271f, 0.262207f, 0.299805f, 0.340332f, 0.384277f, 0.430176f, 0.477295f, - 0.527344f, 0.577637f, 0.839844f, 0.851074f, 0.853516f, 0.854492f, 0.854980f, 0.854980f, - 0.000218f, 0.000479f, 0.000706f, 0.001109f, 0.001245f, 0.001763f, 0.001800f, 0.002211f, - 0.002377f, 0.002783f, 0.003103f, 0.003223f, 0.003782f, 0.004089f, 0.004326f, 0.004711f, - 0.005306f, 0.005569f, 0.006199f, 0.006653f, 0.007168f, 0.007919f, 0.008560f, 0.009254f, - 0.009979f, 0.010872f, 0.012054f, 0.012810f, 0.014221f, 0.015793f, 0.017181f, 0.018967f, - 0.021088f, 0.023361f, 0.026001f, 0.028915f, 0.032257f, 0.036469f, 0.040924f, 0.046875f, - 0.053375f, 0.061218f, 0.070435f, 0.080811f, 0.093628f, 0.108704f, 0.126709f, 0.147461f, - 0.172241f, 0.199951f, 0.232788f, 0.268799f, 0.308594f, 0.351562f, 0.397705f, 0.447266f, - 0.498291f, 0.550293f, 0.830078f, 0.841797f, 0.843750f, 0.845215f, 0.845215f, 0.845703f, - 0.000139f, 0.000379f, 0.000704f, 0.000896f, 0.001095f, 0.001392f, 0.001649f, 0.002058f, - 0.002235f, 0.002483f, 0.002621f, 0.002878f, 0.003214f, 0.003580f, 0.003820f, 0.004055f, - 0.004498f, 0.004791f, 0.005173f, 0.005692f, 0.006145f, 0.006691f, 0.007175f, 0.007874f, - 0.008499f, 0.009239f, 0.010117f, 0.011032f, 0.011864f, 0.012901f, 0.014282f, 0.015701f, - 0.017242f, 0.019516f, 0.021469f, 0.024002f, 0.026749f, 0.029953f, 0.034027f, 0.038727f, - 0.044250f, 0.050568f, 0.058136f, 0.067139f, 0.078247f, 0.091614f, 0.106689f, 0.125366f, - 0.147339f, 0.172974f, 0.202881f, 0.237671f, 0.275879f, 0.318359f, 0.365234f, 0.415283f, - 0.468018f, 0.521973f, 0.819336f, 0.832031f, 0.834473f, 0.834961f, 0.835449f, 0.835938f, - 0.000115f, 0.000396f, 0.000688f, 0.000885f, 0.000917f, 0.001393f, 0.001478f, 0.001590f, - 0.001944f, 0.002123f, 0.002291f, 0.002644f, 0.002666f, 0.003023f, 0.003197f, 0.003546f, - 0.003714f, 0.004246f, 0.004551f, 0.004837f, 0.005108f, 0.005577f, 0.006054f, 0.006504f, - 0.007023f, 0.007633f, 0.008362f, 0.009148f, 0.009926f, 0.010742f, 0.011917f, 0.013062f, - 0.014351f, 0.015991f, 0.017639f, 0.019455f, 0.021729f, 0.024689f, 0.027740f, 0.031708f, - 0.036102f, 0.041260f, 0.047882f, 0.055450f, 0.064392f, 0.075500f, 0.088928f, 0.104797f, - 0.124756f, 0.147949f, 0.175415f, 0.207275f, 0.244507f, 0.286133f, 0.332520f, 0.381836f, - 0.436279f, 0.492432f, 0.808105f, 0.821289f, 0.822754f, 0.824707f, 0.825195f, 0.824219f, - 0.000209f, 0.000435f, 0.000493f, 0.000669f, 0.001040f, 0.001076f, 0.001254f, 0.001398f, - 0.001603f, 0.001697f, 0.001987f, 0.002140f, 0.002268f, 0.002472f, 0.002769f, 0.002991f, - 0.003302f, 0.003572f, 0.003685f, 0.004002f, 0.004337f, 0.004654f, 0.005062f, 0.005379f, - 0.005871f, 0.006363f, 0.006733f, 0.007416f, 0.008102f, 0.008812f, 0.009727f, 0.010689f, - 0.011566f, 0.013145f, 0.014053f, 0.015762f, 0.017899f, 0.020096f, 0.022552f, 0.025528f, - 0.028992f, 0.033325f, 0.038635f, 0.044952f, 0.052582f, 0.061554f, 0.072998f, 0.086670f, - 0.103577f, 0.124329f, 0.148804f, 0.178467f, 0.213501f, 0.253174f, 0.298828f, 0.348877f, - 0.403076f, 0.461914f, 0.795898f, 0.809570f, 0.812012f, 0.813477f, 0.813477f, 0.814453f, - 0.000243f, 0.000322f, 0.000466f, 0.000710f, 0.000863f, 0.000942f, 0.001051f, 0.001182f, - 0.001369f, 0.001451f, 0.001716f, 0.001851f, 0.001968f, 0.002192f, 0.002323f, 0.002470f, - 0.002773f, 0.002850f, 0.003056f, 0.003399f, 0.003624f, 0.003832f, 0.004192f, 0.004467f, - 0.004955f, 0.005276f, 0.005772f, 0.006084f, 0.006672f, 0.007191f, 0.007828f, 0.008720f, - 0.009575f, 0.010292f, 0.011505f, 0.012535f, 0.014114f, 0.016006f, 0.017838f, 0.020462f, - 0.023193f, 0.026489f, 0.030807f, 0.035858f, 0.041840f, 0.049652f, 0.059174f, 0.070435f, - 0.084839f, 0.102783f, 0.124146f, 0.151489f, 0.183472f, 0.221802f, 0.265137f, 0.315186f, - 0.369629f, 0.430664f, 0.782715f, 0.796875f, 0.799805f, 0.800293f, 0.801758f, 0.801758f, - 0.000119f, 0.000369f, 0.000340f, 0.000595f, 0.000667f, 0.000841f, 0.001010f, 0.001086f, - 0.001179f, 0.001225f, 0.001494f, 0.001555f, 0.001654f, 0.001754f, 0.001965f, 0.002142f, - 0.002197f, 0.002432f, 0.002619f, 0.002811f, 0.003021f, 0.003139f, 0.003567f, 0.003708f, - 0.004066f, 0.004360f, 0.004612f, 0.005123f, 0.005489f, 0.005878f, 0.006306f, 0.006824f, - 0.007576f, 0.008286f, 0.008949f, 0.010155f, 0.011322f, 0.012756f, 0.014046f, 0.015976f, - 0.018250f, 0.020874f, 0.024094f, 0.027878f, 0.032867f, 0.039154f, 0.046509f, 0.055908f, - 0.068054f, 0.082886f, 0.102356f, 0.125732f, 0.155029f, 0.190674f, 0.232422f, 0.281006f, - 0.335693f, 0.397949f, 0.770020f, 0.783691f, 0.786621f, 0.787598f, 0.788086f, 0.789551f, - 0.000000f, 0.000220f, 0.000275f, 0.000562f, 0.000618f, 0.000683f, 0.000733f, 0.000761f, - 0.000966f, 0.001022f, 0.001184f, 0.001237f, 0.001382f, 0.001552f, 0.001688f, 0.001724f, - 0.001918f, 0.002024f, 0.002115f, 0.002243f, 0.002403f, 0.002718f, 0.002840f, 0.003052f, - 0.003330f, 0.003508f, 0.003860f, 0.004097f, 0.004314f, 0.004719f, 0.005074f, 0.005535f, - 0.006058f, 0.006584f, 0.007168f, 0.007874f, 0.008759f, 0.009651f, 0.011086f, 0.012459f, - 0.013992f, 0.015945f, 0.018433f, 0.021408f, 0.025192f, 0.029861f, 0.035950f, 0.043396f, - 0.053406f, 0.065735f, 0.082031f, 0.102234f, 0.128052f, 0.160645f, 0.200073f, 0.247192f, - 0.301025f, 0.363281f, 0.755371f, 0.770996f, 0.772949f, 0.773926f, 0.775879f, 0.775879f, - 0.000216f, 0.000102f, 0.000381f, 0.000487f, 0.000429f, 0.000552f, 0.000579f, 0.000788f, - 0.000804f, 0.000854f, 0.000937f, 0.000996f, 0.001078f, 0.001218f, 0.001315f, 0.001499f, - 0.001532f, 0.001642f, 0.001805f, 0.001825f, 0.002077f, 0.002178f, 0.002312f, 0.002396f, - 0.002575f, 0.002735f, 0.002947f, 0.003317f, 0.003428f, 0.003721f, 0.004185f, 0.004379f, - 0.004704f, 0.005253f, 0.005650f, 0.006145f, 0.006870f, 0.007515f, 0.008415f, 0.009430f, - 0.010612f, 0.012093f, 0.013954f, 0.016052f, 0.018967f, 0.022476f, 0.027115f, 0.032898f, - 0.040649f, 0.050690f, 0.063599f, 0.080811f, 0.103210f, 0.132202f, 0.168823f, 0.213501f, - 0.266602f, 0.329102f, 0.740234f, 0.756348f, 0.758789f, 0.760254f, 0.761230f, 0.761230f, - 0.000179f, 0.000181f, 0.000180f, 0.000289f, 0.000413f, 0.000458f, 0.000497f, 0.000620f, - 0.000646f, 0.000688f, 0.000830f, 0.000868f, 0.000904f, 0.000981f, 0.001024f, 0.001178f, - 0.001146f, 0.001302f, 0.001382f, 0.001523f, 0.001679f, 0.001737f, 0.001824f, 0.001959f, - 0.002195f, 0.002283f, 0.002438f, 0.002579f, 0.002703f, 0.002939f, 0.003181f, 0.003454f, - 0.003677f, 0.004051f, 0.004395f, 0.004738f, 0.005283f, 0.005783f, 0.006420f, 0.007095f, - 0.007988f, 0.009094f, 0.010384f, 0.011955f, 0.013939f, 0.016434f, 0.019836f, 0.024292f, - 0.030029f, 0.037659f, 0.048065f, 0.061890f, 0.080811f, 0.105774f, 0.138672f, 0.180542f, - 0.231934f, 0.293213f, 0.724121f, 0.740234f, 0.744141f, 0.745117f, 0.745605f, 0.746094f, - 0.000000f, 0.000056f, 0.000263f, 0.000339f, 0.000369f, 0.000357f, 0.000376f, 0.000508f, - 0.000519f, 0.000558f, 0.000581f, 0.000678f, 0.000767f, 0.000775f, 0.000905f, 0.000849f, - 0.000992f, 0.000942f, 0.001192f, 0.001169f, 0.001204f, 0.001375f, 0.001439f, 0.001532f, - 0.001634f, 0.001676f, 0.001799f, 0.001904f, 0.002165f, 0.002262f, 0.002377f, 0.002611f, - 0.002836f, 0.003103f, 0.003321f, 0.003550f, 0.004005f, 0.004356f, 0.004772f, 0.005295f, - 0.005962f, 0.006756f, 0.007690f, 0.008690f, 0.010078f, 0.011871f, 0.014252f, 0.017242f, - 0.021393f, 0.027100f, 0.034851f, 0.046051f, 0.060455f, 0.081848f, 0.110474f, 0.148682f, - 0.197632f, 0.257568f, 0.706543f, 0.724121f, 0.727539f, 0.729492f, 0.729980f, 0.729492f, - 0.000000f, 0.000130f, 0.000174f, 0.000312f, 0.000290f, 0.000293f, 0.000372f, 0.000319f, - 0.000397f, 0.000433f, 0.000550f, 0.000552f, 0.000564f, 0.000593f, 0.000638f, 0.000758f, - 0.000784f, 0.000797f, 0.000842f, 0.000937f, 0.001011f, 0.001068f, 0.001125f, 0.001231f, - 0.001228f, 0.001288f, 0.001409f, 0.001465f, 0.001644f, 0.001697f, 0.001965f, 0.001924f, - 0.002136f, 0.002270f, 0.002436f, 0.002697f, 0.002916f, 0.003202f, 0.003492f, 0.003929f, - 0.004391f, 0.004887f, 0.005516f, 0.006233f, 0.007240f, 0.008461f, 0.010094f, 0.012070f, - 0.014854f, 0.018585f, 0.024338f, 0.032379f, 0.043884f, 0.060516f, 0.084656f, 0.118469f, - 0.164185f, 0.222168f, 0.689941f, 0.708008f, 0.710449f, 0.711914f, 0.712891f, 0.712402f, - 0.000000f, 0.000000f, 0.000122f, 0.000226f, 0.000145f, 0.000282f, 0.000255f, 0.000247f, - 0.000323f, 0.000389f, 0.000379f, 0.000435f, 0.000461f, 0.000509f, 0.000535f, 0.000517f, - 0.000557f, 0.000604f, 0.000649f, 0.000690f, 0.000757f, 0.000773f, 0.000836f, 0.000865f, - 0.000924f, 0.000957f, 0.001095f, 0.001104f, 0.001243f, 0.001361f, 0.001458f, 0.001486f, - 0.001619f, 0.001745f, 0.001791f, 0.001993f, 0.002100f, 0.002321f, 0.002539f, 0.002771f, - 0.003084f, 0.003412f, 0.003866f, 0.004368f, 0.005062f, 0.005821f, 0.006882f, 0.008278f, - 0.010071f, 0.012756f, 0.016327f, 0.021774f, 0.029785f, 0.042206f, 0.061462f, 0.090149f, - 0.131348f, 0.187378f, 0.669434f, 0.688965f, 0.692383f, 0.694824f, 0.695801f, 0.695312f, - 0.000000f, 0.000118f, 0.000113f, 0.000158f, 0.000158f, 0.000176f, 0.000224f, 0.000202f, - 0.000251f, 0.000260f, 0.000280f, 0.000332f, 0.000316f, 0.000365f, 0.000389f, 0.000419f, - 0.000454f, 0.000435f, 0.000476f, 0.000494f, 0.000516f, 0.000576f, 0.000609f, 0.000656f, - 0.000678f, 0.000712f, 0.000792f, 0.000800f, 0.000852f, 0.000919f, 0.000961f, 0.001070f, - 0.001120f, 0.001238f, 0.001300f, 0.001480f, 0.001459f, 0.001634f, 0.001798f, 0.001947f, - 0.002111f, 0.002377f, 0.002615f, 0.002966f, 0.003410f, 0.003933f, 0.004585f, 0.005489f, - 0.006706f, 0.008148f, 0.010757f, 0.013962f, 0.019257f, 0.027771f, 0.041931f, 0.065125f, - 0.101135f, 0.152832f, 0.650391f, 0.670898f, 0.674316f, 0.675293f, 0.675781f, 0.677246f, - 0.000000f, 0.000000f, 0.000109f, 0.000106f, 0.000121f, 0.000117f, 0.000130f, 0.000151f, - 0.000161f, 0.000174f, 0.000234f, 0.000197f, 0.000205f, 0.000236f, 0.000272f, 0.000296f, - 0.000267f, 0.000296f, 0.000397f, 0.000344f, 0.000413f, 0.000395f, 0.000433f, 0.000434f, - 0.000504f, 0.000488f, 0.000532f, 0.000550f, 0.000602f, 0.000711f, 0.000675f, 0.000704f, - 0.000752f, 0.000817f, 0.000896f, 0.000955f, 0.001009f, 0.001091f, 0.001223f, 0.001271f, - 0.001415f, 0.001560f, 0.001721f, 0.001989f, 0.002214f, 0.002508f, 0.002930f, 0.003504f, - 0.004208f, 0.005169f, 0.006603f, 0.008606f, 0.011864f, 0.017090f, 0.026367f, 0.043396f, - 0.072571f, 0.119751f, 0.630859f, 0.650879f, 0.653809f, 0.656250f, 0.657227f, 0.657227f, - 0.000000f, 0.000111f, 0.000104f, 0.000100f, 0.000096f, 0.000094f, 0.000105f, 0.000096f, - 0.000101f, 0.000115f, 0.000119f, 0.000155f, 0.000129f, 0.000180f, 0.000186f, 0.000199f, - 0.000208f, 0.000214f, 0.000232f, 0.000230f, 0.000237f, 0.000247f, 0.000303f, 0.000276f, - 0.000324f, 0.000332f, 0.000381f, 0.000371f, 0.000393f, 0.000428f, 0.000490f, 0.000468f, - 0.000512f, 0.000540f, 0.000598f, 0.000670f, 0.000673f, 0.000711f, 0.000767f, 0.000842f, - 0.000894f, 0.000985f, 0.001120f, 0.001200f, 0.001416f, 0.001544f, 0.001768f, 0.002052f, - 0.002510f, 0.003044f, 0.003796f, 0.005016f, 0.006870f, 0.009918f, 0.015335f, 0.026077f, - 0.048004f, 0.088745f, 0.610352f, 0.630859f, 0.634277f, 0.636230f, 0.637207f, 0.638184f, - 0.000000f, 0.000104f, 0.000098f, 0.000092f, 0.000087f, 0.000084f, 0.000081f, 0.000078f, - 0.000074f, 0.000070f, 0.000073f, 0.000075f, 0.000081f, 0.000081f, 0.000119f, 0.000124f, - 0.000129f, 0.000115f, 0.000142f, 0.000169f, 0.000155f, 0.000169f, 0.000172f, 0.000196f, - 0.000209f, 0.000211f, 0.000203f, 0.000238f, 0.000245f, 0.000260f, 0.000282f, 0.000281f, - 0.000297f, 0.000333f, 0.000343f, 0.000374f, 0.000398f, 0.000428f, 0.000473f, 0.000494f, - 0.000534f, 0.000591f, 0.000643f, 0.000708f, 0.000790f, 0.000893f, 0.001040f, 0.001169f, - 0.001381f, 0.001676f, 0.002123f, 0.002686f, 0.003658f, 0.005329f, 0.008347f, 0.014244f, - 0.027954f, 0.060638f, 0.587891f, 0.609375f, 0.613281f, 0.614746f, 0.616699f, 0.616211f, - 0.000110f, 0.000094f, 0.000085f, 0.000079f, 0.000075f, 0.000072f, 0.000069f, 0.000067f, - 0.000065f, 0.000063f, 0.000059f, 0.000059f, 0.000054f, 0.000051f, 0.000055f, 0.000051f, - 0.000066f, 0.000066f, 0.000078f, 0.000074f, 0.000089f, 0.000091f, 0.000102f, 0.000109f, - 0.000114f, 0.000126f, 0.000133f, 0.000130f, 0.000141f, 0.000141f, 0.000156f, 0.000172f, - 0.000180f, 0.000179f, 0.000206f, 0.000199f, 0.000214f, 0.000254f, 0.000247f, 0.000282f, - 0.000300f, 0.000324f, 0.000349f, 0.000374f, 0.000413f, 0.000459f, 0.000513f, 0.000619f, - 0.000711f, 0.000823f, 0.001030f, 0.001269f, 0.001724f, 0.002487f, 0.003948f, 0.007015f, - 0.014122f, 0.036346f, 0.565430f, 0.586426f, 0.592285f, 0.592773f, 0.594238f, 0.594727f, - 0.000092f, 0.000073f, 0.000067f, 0.000062f, 0.000057f, 0.000055f, 0.000052f, 0.000052f, - 0.000049f, 0.000049f, 0.000047f, 0.000046f, 0.000046f, 0.000043f, 0.000041f, 0.000039f, - 0.000038f, 0.000036f, 0.000039f, 0.000036f, 0.000039f, 0.000037f, 0.000039f, 0.000047f, - 0.000051f, 0.000057f, 0.000059f, 0.000060f, 0.000067f, 0.000071f, 0.000078f, 0.000085f, - 0.000087f, 0.000091f, 0.000098f, 0.000095f, 0.000102f, 0.000122f, 0.000122f, 0.000137f, - 0.000143f, 0.000145f, 0.000168f, 0.000171f, 0.000197f, 0.000209f, 0.000234f, 0.000264f, - 0.000295f, 0.000349f, 0.000418f, 0.000520f, 0.000678f, 0.000958f, 0.001512f, 0.002745f, - 0.006092f, 0.017456f, 0.542969f, 0.565430f, 0.568848f, 0.569824f, 0.572266f, 0.572266f, - 0.000052f, 0.000042f, 0.000037f, 0.000035f, 0.000033f, 0.000033f, 0.000032f, 0.000031f, - 0.000031f, 0.000029f, 0.000030f, 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000028f, - 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000024f, 0.000023f, 0.000022f, 0.000022f, - 0.000021f, 0.000020f, 0.000019f, 0.000022f, 0.000020f, 0.000023f, 0.000024f, 0.000026f, - 0.000028f, 0.000035f, 0.000037f, 0.000038f, 0.000039f, 0.000043f, 0.000048f, 0.000050f, - 0.000053f, 0.000055f, 0.000062f, 0.000059f, 0.000072f, 0.000070f, 0.000087f, 0.000099f, - 0.000100f, 0.000119f, 0.000142f, 0.000162f, 0.000217f, 0.000283f, 0.000425f, 0.000760f, - 0.001818f, 0.006405f, 0.519043f, 0.541504f, 0.546387f, 0.548828f, 0.549316f, 0.550781f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, - 0.000004f, 0.000006f, 0.000006f, 0.000008f, 0.000009f, 0.000009f, 0.000009f, 0.000010f, - 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000008f, 0.000011f, - 0.000011f, 0.000012f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000018f, 0.000020f, - 0.000022f, 0.000024f, 0.000028f, 0.000035f, 0.000036f, 0.000052f, 0.000071f, 0.000117f, - 0.000260f, 0.001269f, 0.495605f, 0.518555f, 0.523926f, 0.525879f, 0.526855f, 0.527344f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, - 0.000005f, 0.000021f, 0.473145f, 0.495605f, 0.500000f, 0.502441f, 0.503418f, 0.503906f, - }, - { - 0.045868f, 0.130493f, 0.205322f, 0.272705f, 0.331787f, 0.384521f, 0.431885f, 0.473389f, - 0.511719f, 0.545898f, 0.576660f, 0.605469f, 0.631348f, 0.654785f, 0.676758f, 0.696289f, - 0.714355f, 0.732422f, 0.749023f, 0.763184f, 0.777832f, 0.790527f, 0.802734f, 0.813477f, - 0.824219f, 0.834961f, 0.844238f, 0.853027f, 0.862305f, 0.869629f, 0.877441f, 0.884277f, - 0.892090f, 0.898926f, 0.904297f, 0.910645f, 0.916992f, 0.921875f, 0.926758f, 0.931641f, - 0.937012f, 0.941406f, 0.945801f, 0.950195f, 0.954102f, 0.958496f, 0.962402f, 0.966309f, - 0.969238f, 0.973145f, 0.976074f, 0.979492f, 0.982422f, 0.985352f, 0.988281f, 0.991211f, - 0.993652f, 0.996094f, 0.997070f, 0.993164f, 0.990234f, 0.987305f, 0.984375f, 0.981445f, - 0.033447f, 0.097717f, 0.160400f, 0.219238f, 0.273438f, 0.323486f, 0.371582f, 0.414062f, - 0.454834f, 0.491211f, 0.524414f, 0.555176f, 0.583984f, 0.610840f, 0.635254f, 0.658203f, - 0.678223f, 0.697754f, 0.716309f, 0.732422f, 0.749023f, 0.763184f, 0.776855f, 0.790527f, - 0.802734f, 0.812988f, 0.824707f, 0.834473f, 0.844238f, 0.853516f, 0.862305f, 0.870117f, - 0.877930f, 0.884766f, 0.892090f, 0.897949f, 0.905762f, 0.910645f, 0.917480f, 0.923340f, - 0.927734f, 0.933105f, 0.937988f, 0.942871f, 0.947266f, 0.951172f, 0.955566f, 0.960449f, - 0.963379f, 0.967285f, 0.970703f, 0.974609f, 0.978027f, 0.981445f, 0.984863f, 0.986816f, - 0.989746f, 0.993164f, 0.995605f, 0.992188f, 0.988770f, 0.986328f, 0.983398f, 0.980957f, - 0.024796f, 0.075195f, 0.126221f, 0.176025f, 0.224976f, 0.271729f, 0.317383f, 0.359375f, - 0.399902f, 0.437744f, 0.472656f, 0.505371f, 0.536133f, 0.565430f, 0.591797f, 0.615723f, - 0.639648f, 0.660156f, 0.681152f, 0.699219f, 0.718262f, 0.734375f, 0.749512f, 0.764648f, - 0.777832f, 0.791016f, 0.802734f, 0.813965f, 0.825195f, 0.835449f, 0.844727f, 0.854004f, - 0.862305f, 0.871094f, 0.878418f, 0.886230f, 0.893555f, 0.900391f, 0.906738f, 0.912598f, - 0.917969f, 0.923828f, 0.929688f, 0.935059f, 0.939941f, 0.943848f, 0.949219f, 0.953613f, - 0.958008f, 0.961914f, 0.965332f, 0.969238f, 0.972656f, 0.976074f, 0.979492f, 0.982910f, - 0.986328f, 0.989258f, 0.993652f, 0.990723f, 0.987793f, 0.985352f, 0.982910f, 0.979980f, - 0.019119f, 0.058624f, 0.100220f, 0.142578f, 0.185303f, 0.227417f, 0.269287f, 0.310059f, - 0.348877f, 0.385254f, 0.421875f, 0.455566f, 0.489014f, 0.518555f, 0.546875f, 0.574707f, - 0.598633f, 0.624023f, 0.645508f, 0.666016f, 0.684082f, 0.702637f, 0.720703f, 0.736816f, - 0.751465f, 0.766113f, 0.779785f, 0.792969f, 0.804199f, 0.815918f, 0.826660f, 0.836426f, - 0.846191f, 0.855957f, 0.864746f, 0.872559f, 0.880371f, 0.888184f, 0.895508f, 0.902344f, - 0.908691f, 0.914062f, 0.919922f, 0.925293f, 0.932129f, 0.936035f, 0.941895f, 0.946289f, - 0.951172f, 0.955566f, 0.959473f, 0.963867f, 0.967773f, 0.970703f, 0.975586f, 0.978516f, - 0.981934f, 0.985352f, 0.991699f, 0.988770f, 0.986328f, 0.983887f, 0.981445f, 0.979004f, - 0.015175f, 0.046997f, 0.080688f, 0.116028f, 0.152466f, 0.189819f, 0.227417f, 0.264404f, - 0.301758f, 0.338623f, 0.374268f, 0.407471f, 0.439941f, 0.471924f, 0.501465f, 0.529785f, - 0.556641f, 0.582031f, 0.606445f, 0.629395f, 0.649902f, 0.670898f, 0.688965f, 0.708496f, - 0.725098f, 0.740723f, 0.755371f, 0.769531f, 0.782715f, 0.795410f, 0.807129f, 0.818848f, - 0.829590f, 0.839844f, 0.849121f, 0.857910f, 0.866699f, 0.875488f, 0.882812f, 0.890625f, - 0.897461f, 0.904297f, 0.910645f, 0.916992f, 0.922363f, 0.928223f, 0.933594f, 0.938477f, - 0.944824f, 0.949707f, 0.953613f, 0.958008f, 0.962402f, 0.966309f, 0.970703f, 0.974121f, - 0.977539f, 0.981934f, 0.990234f, 0.987793f, 0.984863f, 0.982910f, 0.980469f, 0.978516f, - 0.012215f, 0.038452f, 0.066101f, 0.095825f, 0.126831f, 0.159180f, 0.192749f, 0.226685f, - 0.260986f, 0.294922f, 0.328857f, 0.363037f, 0.394531f, 0.426270f, 0.457520f, 0.486572f, - 0.514648f, 0.541016f, 0.567871f, 0.590820f, 0.614746f, 0.636230f, 0.657227f, 0.676270f, - 0.694336f, 0.711914f, 0.729492f, 0.744141f, 0.759277f, 0.773438f, 0.786621f, 0.798340f, - 0.811523f, 0.822266f, 0.833496f, 0.842773f, 0.851562f, 0.861816f, 0.869629f, 0.878418f, - 0.885742f, 0.893066f, 0.900879f, 0.907715f, 0.913574f, 0.919922f, 0.925781f, 0.932129f, - 0.937012f, 0.942871f, 0.946777f, 0.951660f, 0.957031f, 0.960938f, 0.965332f, 0.969727f, - 0.973633f, 0.977051f, 0.988281f, 0.986328f, 0.983887f, 0.981445f, 0.979492f, 0.976562f, - 0.009903f, 0.031525f, 0.054626f, 0.078979f, 0.105408f, 0.133789f, 0.162720f, 0.192993f, - 0.224976f, 0.256592f, 0.288330f, 0.320312f, 0.352295f, 0.383545f, 0.414062f, 0.443848f, - 0.473389f, 0.500488f, 0.526367f, 0.553223f, 0.577637f, 0.600586f, 0.622070f, 0.644043f, - 0.664551f, 0.683105f, 0.701660f, 0.718262f, 0.734375f, 0.750000f, 0.764648f, 0.778320f, - 0.791016f, 0.802734f, 0.815430f, 0.826172f, 0.836426f, 0.845703f, 0.855957f, 0.864258f, - 0.874023f, 0.881348f, 0.889648f, 0.896973f, 0.904297f, 0.911621f, 0.917480f, 0.922852f, - 0.929199f, 0.935059f, 0.939941f, 0.944824f, 0.950195f, 0.954590f, 0.959961f, 0.964355f, - 0.968262f, 0.972656f, 0.986328f, 0.984375f, 0.981934f, 0.979980f, 0.978027f, 0.975586f, - 0.008385f, 0.026154f, 0.045319f, 0.066467f, 0.089111f, 0.113220f, 0.138916f, 0.165405f, - 0.192871f, 0.222290f, 0.252197f, 0.281494f, 0.311279f, 0.342285f, 0.372314f, 0.402832f, - 0.431641f, 0.459473f, 0.486572f, 0.513672f, 0.539062f, 0.562988f, 0.587402f, 0.609863f, - 0.631348f, 0.652344f, 0.671875f, 0.689941f, 0.708008f, 0.724609f, 0.740234f, 0.755371f, - 0.768066f, 0.783203f, 0.795410f, 0.808105f, 0.819336f, 0.830078f, 0.840332f, 0.851074f, - 0.860352f, 0.869141f, 0.877930f, 0.885742f, 0.893555f, 0.900879f, 0.907715f, 0.915039f, - 0.920410f, 0.926758f, 0.933105f, 0.938965f, 0.944336f, 0.949707f, 0.953613f, 0.958984f, - 0.962891f, 0.967285f, 0.984375f, 0.982910f, 0.980957f, 0.978516f, 0.976562f, 0.974609f, - 0.006992f, 0.022324f, 0.038544f, 0.056396f, 0.075317f, 0.095947f, 0.117981f, 0.141968f, - 0.166504f, 0.192627f, 0.219238f, 0.246704f, 0.275879f, 0.304443f, 0.333252f, 0.362305f, - 0.390869f, 0.419678f, 0.447266f, 0.474121f, 0.500977f, 0.525879f, 0.551270f, 0.574219f, - 0.597656f, 0.620117f, 0.641602f, 0.661133f, 0.680664f, 0.698242f, 0.715332f, 0.731934f, - 0.746582f, 0.761230f, 0.775391f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.835938f, - 0.846191f, 0.855957f, 0.865723f, 0.873535f, 0.882324f, 0.890625f, 0.898438f, 0.905762f, - 0.912598f, 0.918945f, 0.925781f, 0.931641f, 0.937012f, 0.943848f, 0.948730f, 0.954102f, - 0.957520f, 0.963379f, 0.981934f, 0.980957f, 0.979004f, 0.977051f, 0.975098f, 0.973145f, - 0.006260f, 0.018387f, 0.032684f, 0.047821f, 0.064636f, 0.082153f, 0.101318f, 0.122009f, - 0.143921f, 0.166870f, 0.191406f, 0.216187f, 0.243164f, 0.269287f, 0.297119f, 0.324951f, - 0.352783f, 0.380859f, 0.408691f, 0.435547f, 0.462402f, 0.489258f, 0.514160f, 0.540039f, - 0.563965f, 0.585938f, 0.608398f, 0.629395f, 0.649414f, 0.669434f, 0.689453f, 0.705566f, - 0.722656f, 0.739258f, 0.753418f, 0.769043f, 0.783203f, 0.795898f, 0.807617f, 0.819824f, - 0.830566f, 0.842285f, 0.852051f, 0.862305f, 0.871094f, 0.878906f, 0.888184f, 0.895996f, - 0.902832f, 0.910645f, 0.917480f, 0.924316f, 0.930176f, 0.936523f, 0.942383f, 0.946777f, - 0.953613f, 0.958496f, 0.979980f, 0.979004f, 0.977539f, 0.975586f, 0.973633f, 0.972168f, - 0.005268f, 0.016418f, 0.028091f, 0.041107f, 0.055420f, 0.070435f, 0.087341f, 0.105347f, - 0.124512f, 0.144531f, 0.166260f, 0.189453f, 0.213989f, 0.238037f, 0.263184f, 0.290039f, - 0.317139f, 0.344238f, 0.370850f, 0.398438f, 0.425293f, 0.451660f, 0.477539f, 0.503418f, - 0.528320f, 0.551270f, 0.576172f, 0.598145f, 0.619629f, 0.640137f, 0.659668f, 0.680176f, - 0.697754f, 0.714844f, 0.731934f, 0.748047f, 0.762695f, 0.776367f, 0.790039f, 0.803223f, - 0.814453f, 0.827148f, 0.837891f, 0.847656f, 0.858398f, 0.868164f, 0.876953f, 0.885742f, - 0.893066f, 0.901855f, 0.908691f, 0.916504f, 0.922852f, 0.929199f, 0.935059f, 0.941895f, - 0.947754f, 0.953125f, 0.978027f, 0.977539f, 0.975586f, 0.973633f, 0.971680f, 0.969727f, - 0.004372f, 0.013802f, 0.024185f, 0.036011f, 0.047729f, 0.060944f, 0.075684f, 0.090820f, - 0.107788f, 0.125488f, 0.144653f, 0.165771f, 0.187012f, 0.210205f, 0.233643f, 0.258545f, - 0.283447f, 0.309326f, 0.335449f, 0.362305f, 0.388672f, 0.415771f, 0.441650f, 0.468018f, - 0.492920f, 0.518066f, 0.542480f, 0.564941f, 0.587891f, 0.609863f, 0.630859f, 0.651855f, - 0.670898f, 0.689453f, 0.707520f, 0.724609f, 0.740723f, 0.755859f, 0.770996f, 0.785156f, - 0.799316f, 0.809570f, 0.822754f, 0.834473f, 0.845215f, 0.855469f, 0.865723f, 0.874023f, - 0.883301f, 0.892090f, 0.899902f, 0.907715f, 0.915039f, 0.922363f, 0.928711f, 0.935059f, - 0.941406f, 0.947266f, 0.975586f, 0.975098f, 0.973633f, 0.971680f, 0.969727f, 0.968262f, - 0.003809f, 0.012253f, 0.021240f, 0.030884f, 0.041473f, 0.052887f, 0.065308f, 0.079224f, - 0.094177f, 0.109558f, 0.126709f, 0.145142f, 0.163940f, 0.184814f, 0.207397f, 0.229736f, - 0.252686f, 0.276855f, 0.302246f, 0.327881f, 0.353271f, 0.380127f, 0.405762f, 0.432129f, - 0.457520f, 0.482422f, 0.507324f, 0.531250f, 0.556152f, 0.578125f, 0.600586f, 0.622559f, - 0.642578f, 0.662109f, 0.681641f, 0.700195f, 0.716797f, 0.734375f, 0.750000f, 0.766113f, - 0.779297f, 0.793457f, 0.807129f, 0.819336f, 0.830078f, 0.842285f, 0.853027f, 0.862793f, - 0.872559f, 0.881348f, 0.890625f, 0.899414f, 0.907227f, 0.914551f, 0.920898f, 0.928223f, - 0.935059f, 0.941406f, 0.973633f, 0.973145f, 0.971680f, 0.970215f, 0.968262f, 0.966797f, - 0.003462f, 0.010796f, 0.018646f, 0.026962f, 0.036377f, 0.046173f, 0.057190f, 0.068665f, - 0.081726f, 0.095520f, 0.110962f, 0.127563f, 0.144897f, 0.162476f, 0.182373f, 0.202881f, - 0.225342f, 0.248291f, 0.271729f, 0.294922f, 0.320312f, 0.345459f, 0.370850f, 0.397217f, - 0.422607f, 0.447998f, 0.473145f, 0.498291f, 0.522461f, 0.546875f, 0.569824f, 0.591797f, - 0.614258f, 0.635742f, 0.655273f, 0.674805f, 0.693359f, 0.711426f, 0.729492f, 0.745605f, - 0.760742f, 0.775391f, 0.789551f, 0.803223f, 0.816406f, 0.828125f, 0.839844f, 0.850586f, - 0.861328f, 0.871094f, 0.880371f, 0.889648f, 0.898438f, 0.906250f, 0.915039f, 0.921875f, - 0.928223f, 0.935547f, 0.970703f, 0.970215f, 0.970215f, 0.967773f, 0.966309f, 0.965332f, - 0.002872f, 0.009338f, 0.016174f, 0.024231f, 0.031525f, 0.040558f, 0.050140f, 0.060455f, - 0.071472f, 0.084167f, 0.097168f, 0.111450f, 0.127197f, 0.143433f, 0.160889f, 0.179565f, - 0.199463f, 0.220825f, 0.242554f, 0.265625f, 0.288818f, 0.312744f, 0.338135f, 0.362793f, - 0.387939f, 0.414307f, 0.439453f, 0.464355f, 0.489014f, 0.514648f, 0.537598f, 0.561523f, - 0.583984f, 0.606445f, 0.627930f, 0.648926f, 0.667480f, 0.687988f, 0.705566f, 0.723633f, - 0.740234f, 0.756348f, 0.771484f, 0.786621f, 0.799805f, 0.812012f, 0.825195f, 0.836426f, - 0.849121f, 0.859375f, 0.870605f, 0.879883f, 0.888672f, 0.897461f, 0.905762f, 0.915039f, - 0.921387f, 0.928711f, 0.967773f, 0.969238f, 0.966797f, 0.966797f, 0.964355f, 0.963379f, - 0.002750f, 0.008202f, 0.014519f, 0.021301f, 0.028183f, 0.035828f, 0.044342f, 0.053375f, - 0.063354f, 0.074219f, 0.085876f, 0.098083f, 0.111938f, 0.126343f, 0.142212f, 0.158936f, - 0.177124f, 0.196411f, 0.216553f, 0.237427f, 0.260010f, 0.282715f, 0.306641f, 0.330811f, - 0.355957f, 0.381104f, 0.405518f, 0.431152f, 0.456543f, 0.480957f, 0.504883f, 0.529785f, - 0.553223f, 0.577148f, 0.599121f, 0.620605f, 0.642090f, 0.662598f, 0.682617f, 0.701172f, - 0.718750f, 0.735352f, 0.751953f, 0.768066f, 0.783691f, 0.796875f, 0.810547f, 0.822754f, - 0.835938f, 0.847656f, 0.858398f, 0.869141f, 0.879395f, 0.888672f, 0.897949f, 0.906250f, - 0.914551f, 0.922363f, 0.965820f, 0.966797f, 0.965820f, 0.963867f, 0.963379f, 0.961426f, - 0.002264f, 0.007446f, 0.012741f, 0.018494f, 0.024536f, 0.031769f, 0.039154f, 0.047424f, - 0.056122f, 0.065308f, 0.075623f, 0.087219f, 0.098755f, 0.111328f, 0.125854f, 0.140869f, - 0.157349f, 0.174805f, 0.193115f, 0.212402f, 0.233643f, 0.254883f, 0.276855f, 0.300293f, - 0.324463f, 0.348389f, 0.374023f, 0.398193f, 0.423340f, 0.448242f, 0.473877f, 0.498291f, - 0.521973f, 0.545898f, 0.569824f, 0.592773f, 0.614258f, 0.635742f, 0.657227f, 0.676270f, - 0.695801f, 0.714844f, 0.731445f, 0.749512f, 0.765137f, 0.779785f, 0.793945f, 0.808594f, - 0.821777f, 0.833496f, 0.846191f, 0.858398f, 0.868652f, 0.879395f, 0.888672f, 0.897949f, - 0.906738f, 0.916016f, 0.962402f, 0.963867f, 0.962891f, 0.961914f, 0.960938f, 0.958984f, - 0.002377f, 0.006668f, 0.011467f, 0.016693f, 0.021820f, 0.028091f, 0.034485f, 0.041748f, - 0.049347f, 0.057678f, 0.066589f, 0.076538f, 0.086975f, 0.098816f, 0.111816f, 0.125366f, - 0.139404f, 0.155151f, 0.171875f, 0.190186f, 0.208496f, 0.228760f, 0.250244f, 0.271973f, - 0.294189f, 0.317871f, 0.341797f, 0.365479f, 0.391357f, 0.415771f, 0.440430f, 0.466797f, - 0.491699f, 0.515625f, 0.539551f, 0.563477f, 0.585938f, 0.608887f, 0.630371f, 0.651855f, - 0.672363f, 0.692383f, 0.710449f, 0.729492f, 0.745605f, 0.762695f, 0.778320f, 0.792480f, - 0.807129f, 0.820801f, 0.833984f, 0.846680f, 0.857910f, 0.869141f, 0.879395f, 0.889648f, - 0.899414f, 0.907715f, 0.959473f, 0.961426f, 0.960449f, 0.959961f, 0.958496f, 0.957031f, - 0.002062f, 0.006180f, 0.010201f, 0.015053f, 0.019531f, 0.025116f, 0.030960f, 0.037292f, - 0.043915f, 0.051117f, 0.059570f, 0.067749f, 0.076843f, 0.087708f, 0.099060f, 0.110352f, - 0.123413f, 0.138062f, 0.153198f, 0.169067f, 0.186768f, 0.204956f, 0.224487f, 0.244873f, - 0.265625f, 0.288330f, 0.311768f, 0.335205f, 0.359863f, 0.384521f, 0.409668f, 0.434082f, - 0.459717f, 0.483887f, 0.508789f, 0.533203f, 0.557617f, 0.580566f, 0.603516f, 0.626465f, - 0.646484f, 0.667969f, 0.687500f, 0.708008f, 0.726074f, 0.744141f, 0.760742f, 0.776367f, - 0.791504f, 0.806641f, 0.820312f, 0.833496f, 0.846191f, 0.858398f, 0.869629f, 0.879883f, - 0.890625f, 0.900879f, 0.956543f, 0.958496f, 0.958008f, 0.956543f, 0.955566f, 0.954102f, - 0.001774f, 0.005459f, 0.009155f, 0.013290f, 0.017807f, 0.022537f, 0.027527f, 0.033081f, - 0.038818f, 0.045380f, 0.052643f, 0.060516f, 0.068420f, 0.077942f, 0.087952f, 0.098572f, - 0.109863f, 0.122925f, 0.136230f, 0.150146f, 0.166382f, 0.183105f, 0.201172f, 0.219482f, - 0.240112f, 0.261230f, 0.283203f, 0.305664f, 0.329590f, 0.353027f, 0.377930f, 0.402344f, - 0.427490f, 0.453369f, 0.478516f, 0.502930f, 0.527832f, 0.552246f, 0.575684f, 0.598145f, - 0.621094f, 0.643555f, 0.664551f, 0.685547f, 0.704590f, 0.723633f, 0.742188f, 0.759277f, - 0.775879f, 0.791016f, 0.806152f, 0.820801f, 0.833496f, 0.847168f, 0.859375f, 0.870605f, - 0.881348f, 0.893066f, 0.953125f, 0.956055f, 0.955566f, 0.954102f, 0.953125f, 0.951660f, - 0.001655f, 0.004757f, 0.008308f, 0.011993f, 0.015808f, 0.020187f, 0.024780f, 0.029434f, - 0.034851f, 0.040741f, 0.046997f, 0.053650f, 0.061096f, 0.069397f, 0.078064f, 0.087280f, - 0.097351f, 0.108887f, 0.121033f, 0.134277f, 0.148560f, 0.163330f, 0.180054f, 0.197144f, - 0.215332f, 0.235718f, 0.255859f, 0.277588f, 0.300049f, 0.323730f, 0.347656f, 0.371826f, - 0.396729f, 0.422607f, 0.447021f, 0.472168f, 0.497803f, 0.521973f, 0.547363f, 0.571289f, - 0.594238f, 0.618164f, 0.640137f, 0.662109f, 0.682617f, 0.702637f, 0.722168f, 0.739746f, - 0.758301f, 0.774902f, 0.790527f, 0.806641f, 0.820801f, 0.834961f, 0.848633f, 0.860352f, - 0.872559f, 0.883789f, 0.949707f, 0.953125f, 0.952148f, 0.951172f, 0.950684f, 0.948730f, - 0.001418f, 0.004456f, 0.007584f, 0.010803f, 0.014450f, 0.018005f, 0.022186f, 0.026398f, - 0.031342f, 0.036224f, 0.041687f, 0.048126f, 0.054382f, 0.061676f, 0.069641f, 0.077759f, - 0.086914f, 0.097168f, 0.107910f, 0.119263f, 0.132446f, 0.145752f, 0.161011f, 0.176758f, - 0.193726f, 0.211914f, 0.231201f, 0.251709f, 0.272705f, 0.294922f, 0.318604f, 0.342041f, - 0.366455f, 0.390869f, 0.416992f, 0.441895f, 0.467285f, 0.493164f, 0.517578f, 0.541992f, - 0.566895f, 0.590820f, 0.614746f, 0.637207f, 0.660156f, 0.681152f, 0.701172f, 0.720703f, - 0.739746f, 0.758301f, 0.775391f, 0.791992f, 0.807617f, 0.821289f, 0.836426f, 0.850586f, - 0.863281f, 0.874512f, 0.946777f, 0.949707f, 0.949707f, 0.948730f, 0.947266f, 0.946289f, - 0.001213f, 0.003864f, 0.006721f, 0.009796f, 0.012932f, 0.016037f, 0.020218f, 0.024231f, - 0.028275f, 0.032379f, 0.037567f, 0.042603f, 0.048584f, 0.054993f, 0.061798f, 0.069519f, - 0.077637f, 0.086182f, 0.095703f, 0.106323f, 0.117676f, 0.130127f, 0.143555f, 0.158203f, - 0.173462f, 0.189941f, 0.207886f, 0.226807f, 0.247192f, 0.267822f, 0.290527f, 0.312500f, - 0.336670f, 0.360352f, 0.385742f, 0.410889f, 0.437256f, 0.462646f, 0.488281f, 0.513184f, - 0.539062f, 0.563477f, 0.588379f, 0.612305f, 0.636230f, 0.657715f, 0.679199f, 0.700195f, - 0.720703f, 0.740234f, 0.758301f, 0.775879f, 0.793945f, 0.809082f, 0.824219f, 0.838867f, - 0.852539f, 0.865234f, 0.942871f, 0.946777f, 0.946777f, 0.945312f, 0.944824f, 0.943359f, - 0.001063f, 0.003754f, 0.005909f, 0.008789f, 0.011780f, 0.014671f, 0.017792f, 0.021378f, - 0.025238f, 0.029221f, 0.033417f, 0.038300f, 0.043488f, 0.048828f, 0.054779f, 0.061554f, - 0.068604f, 0.076721f, 0.085388f, 0.094482f, 0.104614f, 0.115845f, 0.128296f, 0.141113f, - 0.155029f, 0.170044f, 0.186401f, 0.204224f, 0.222778f, 0.242188f, 0.263916f, 0.285156f, - 0.308350f, 0.331787f, 0.355957f, 0.381348f, 0.407227f, 0.432617f, 0.459229f, 0.484619f, - 0.509277f, 0.536133f, 0.560547f, 0.585938f, 0.609863f, 0.633301f, 0.657715f, 0.678711f, - 0.699707f, 0.721191f, 0.740723f, 0.759277f, 0.777344f, 0.794922f, 0.811035f, 0.826660f, - 0.841797f, 0.855469f, 0.939453f, 0.943359f, 0.943359f, 0.942871f, 0.941895f, 0.940918f, - 0.001175f, 0.003069f, 0.005558f, 0.007912f, 0.010712f, 0.013199f, 0.016235f, 0.019547f, - 0.022659f, 0.026138f, 0.030151f, 0.034424f, 0.038940f, 0.044067f, 0.049255f, 0.054993f, - 0.061493f, 0.068359f, 0.075928f, 0.084290f, 0.093262f, 0.103760f, 0.114319f, 0.126099f, - 0.138550f, 0.152466f, 0.167114f, 0.183472f, 0.200439f, 0.219238f, 0.239014f, 0.259277f, - 0.281250f, 0.303711f, 0.327148f, 0.351807f, 0.376709f, 0.402344f, 0.428955f, 0.453857f, - 0.480713f, 0.507324f, 0.533203f, 0.558594f, 0.583984f, 0.609375f, 0.633301f, 0.656738f, - 0.678711f, 0.700195f, 0.722168f, 0.742188f, 0.761719f, 0.780273f, 0.797852f, 0.813477f, - 0.830078f, 0.845703f, 0.935547f, 0.939453f, 0.939453f, 0.938965f, 0.937988f, 0.937012f, - 0.001089f, 0.002945f, 0.005066f, 0.007225f, 0.009575f, 0.012016f, 0.014656f, 0.017288f, - 0.020142f, 0.023712f, 0.026764f, 0.030640f, 0.034637f, 0.039490f, 0.043854f, 0.048706f, - 0.054688f, 0.060913f, 0.067871f, 0.075256f, 0.083191f, 0.092163f, 0.101868f, 0.111938f, - 0.123657f, 0.136108f, 0.149658f, 0.164185f, 0.179932f, 0.196777f, 0.215454f, 0.234375f, - 0.255371f, 0.276611f, 0.299805f, 0.323486f, 0.347656f, 0.373047f, 0.398682f, 0.425293f, - 0.451172f, 0.477783f, 0.504883f, 0.530762f, 0.557617f, 0.583008f, 0.607910f, 0.632812f, - 0.657227f, 0.680664f, 0.702637f, 0.724121f, 0.743652f, 0.764160f, 0.783691f, 0.800781f, - 0.818848f, 0.833984f, 0.930664f, 0.936035f, 0.936035f, 0.935547f, 0.934570f, 0.933594f, - 0.000847f, 0.002800f, 0.004562f, 0.006786f, 0.008804f, 0.011017f, 0.013145f, 0.015640f, - 0.018509f, 0.021255f, 0.024277f, 0.027603f, 0.030991f, 0.035248f, 0.039642f, 0.043854f, - 0.048798f, 0.054504f, 0.060516f, 0.067017f, 0.073914f, 0.082092f, 0.090515f, 0.099854f, - 0.109863f, 0.121521f, 0.133545f, 0.146851f, 0.161133f, 0.176514f, 0.192993f, 0.211426f, - 0.230957f, 0.251465f, 0.272705f, 0.295410f, 0.319092f, 0.343994f, 0.369385f, 0.395020f, - 0.421631f, 0.448242f, 0.475342f, 0.501953f, 0.529785f, 0.556152f, 0.582031f, 0.608887f, - 0.633789f, 0.658203f, 0.681152f, 0.704590f, 0.726074f, 0.748535f, 0.768555f, 0.787109f, - 0.804199f, 0.822754f, 0.926758f, 0.931641f, 0.932129f, 0.931641f, 0.931152f, 0.930176f, - 0.001035f, 0.002598f, 0.004147f, 0.006062f, 0.007942f, 0.009933f, 0.012405f, 0.014565f, - 0.016174f, 0.019135f, 0.021988f, 0.024811f, 0.028259f, 0.031616f, 0.035065f, 0.039429f, - 0.043884f, 0.048615f, 0.053833f, 0.059723f, 0.065796f, 0.072693f, 0.080383f, 0.088745f, - 0.098206f, 0.107727f, 0.119080f, 0.130981f, 0.143677f, 0.157959f, 0.173218f, 0.189941f, - 0.207642f, 0.226929f, 0.247437f, 0.269043f, 0.291748f, 0.315674f, 0.340576f, 0.366211f, - 0.392578f, 0.419434f, 0.446533f, 0.473877f, 0.502441f, 0.528320f, 0.556152f, 0.583008f, - 0.609375f, 0.635254f, 0.660156f, 0.684082f, 0.706543f, 0.729980f, 0.751953f, 0.771973f, - 0.792480f, 0.810547f, 0.922363f, 0.927734f, 0.928223f, 0.928223f, 0.927246f, 0.926758f, - 0.000775f, 0.002325f, 0.003843f, 0.005573f, 0.007397f, 0.009163f, 0.010857f, 0.012939f, - 0.015312f, 0.017273f, 0.019684f, 0.022537f, 0.025070f, 0.028183f, 0.031616f, 0.035461f, - 0.038940f, 0.043671f, 0.048096f, 0.053131f, 0.058411f, 0.064941f, 0.071777f, 0.078857f, - 0.086731f, 0.096130f, 0.105835f, 0.116760f, 0.128296f, 0.140747f, 0.154907f, 0.170410f, - 0.186646f, 0.204834f, 0.223633f, 0.243896f, 0.265625f, 0.288330f, 0.312012f, 0.337402f, - 0.363037f, 0.389648f, 0.417480f, 0.444824f, 0.473633f, 0.500000f, 0.529297f, 0.556641f, - 0.583984f, 0.610840f, 0.638184f, 0.662598f, 0.687988f, 0.711914f, 0.734375f, 0.755859f, - 0.777832f, 0.798828f, 0.916992f, 0.922852f, 0.923828f, 0.923828f, 0.923340f, 0.922363f, - 0.000617f, 0.002234f, 0.003510f, 0.005035f, 0.006397f, 0.008156f, 0.010033f, 0.011665f, - 0.013481f, 0.015717f, 0.017700f, 0.020004f, 0.022766f, 0.025391f, 0.028214f, 0.031586f, - 0.035217f, 0.038757f, 0.042999f, 0.047668f, 0.052368f, 0.057434f, 0.063538f, 0.070190f, - 0.077698f, 0.085449f, 0.094299f, 0.103394f, 0.113953f, 0.125610f, 0.137817f, 0.151855f, - 0.167236f, 0.183228f, 0.200806f, 0.219971f, 0.240479f, 0.262451f, 0.285645f, 0.309570f, - 0.334961f, 0.360596f, 0.387939f, 0.416016f, 0.444092f, 0.473145f, 0.501465f, 0.529785f, - 0.558105f, 0.585938f, 0.614258f, 0.640137f, 0.666992f, 0.692383f, 0.716797f, 0.739746f, - 0.763184f, 0.784180f, 0.912109f, 0.918457f, 0.919434f, 0.919434f, 0.918457f, 0.917969f, - 0.000665f, 0.002039f, 0.003386f, 0.004520f, 0.005989f, 0.007511f, 0.009262f, 0.010902f, - 0.012314f, 0.014320f, 0.015869f, 0.018127f, 0.020248f, 0.022476f, 0.025284f, 0.028122f, - 0.030991f, 0.034668f, 0.038239f, 0.042206f, 0.046539f, 0.051361f, 0.056610f, 0.062347f, - 0.068604f, 0.075623f, 0.083313f, 0.092041f, 0.101379f, 0.111572f, 0.122986f, 0.135132f, - 0.148926f, 0.164062f, 0.180054f, 0.197510f, 0.216797f, 0.237183f, 0.259521f, 0.282227f, - 0.307129f, 0.332764f, 0.358887f, 0.386475f, 0.415527f, 0.443604f, 0.473389f, 0.501465f, - 0.530762f, 0.560059f, 0.588867f, 0.617676f, 0.645020f, 0.671387f, 0.698242f, 0.722656f, - 0.746094f, 0.770020f, 0.906738f, 0.913574f, 0.915039f, 0.914551f, 0.914062f, 0.914062f, - 0.000661f, 0.001754f, 0.002831f, 0.004066f, 0.005333f, 0.006668f, 0.008286f, 0.009773f, - 0.011124f, 0.012794f, 0.014320f, 0.016357f, 0.018036f, 0.020386f, 0.022766f, 0.025192f, - 0.027924f, 0.030807f, 0.034027f, 0.037628f, 0.041321f, 0.045349f, 0.050262f, 0.055328f, - 0.060699f, 0.066833f, 0.073669f, 0.081360f, 0.089600f, 0.099060f, 0.108826f, 0.119995f, - 0.132324f, 0.145874f, 0.160889f, 0.176880f, 0.194702f, 0.213379f, 0.234497f, 0.256104f, - 0.280029f, 0.304688f, 0.330811f, 0.358154f, 0.385986f, 0.415039f, 0.444092f, 0.474609f, - 0.503418f, 0.534180f, 0.563965f, 0.592773f, 0.621094f, 0.650391f, 0.678223f, 0.704590f, - 0.730469f, 0.754883f, 0.901855f, 0.908691f, 0.910156f, 0.909668f, 0.909668f, 0.908691f, - 0.000653f, 0.001667f, 0.002666f, 0.003887f, 0.004986f, 0.006359f, 0.007202f, 0.008751f, - 0.010300f, 0.011757f, 0.012939f, 0.014595f, 0.016281f, 0.018234f, 0.020142f, 0.022415f, - 0.025101f, 0.027466f, 0.030182f, 0.033539f, 0.036865f, 0.040680f, 0.044342f, 0.048798f, - 0.053619f, 0.059479f, 0.065491f, 0.071716f, 0.079285f, 0.087341f, 0.096497f, 0.106445f, - 0.117615f, 0.129395f, 0.142822f, 0.157959f, 0.174194f, 0.192139f, 0.210938f, 0.231567f, - 0.253906f, 0.277832f, 0.302979f, 0.329590f, 0.357422f, 0.385986f, 0.415283f, 0.446045f, - 0.475830f, 0.506348f, 0.537109f, 0.567871f, 0.599121f, 0.628418f, 0.657227f, 0.685547f, - 0.712891f, 0.739746f, 0.895508f, 0.902344f, 0.904297f, 0.904785f, 0.904297f, 0.904297f, - 0.000372f, 0.001397f, 0.002384f, 0.003529f, 0.004509f, 0.005505f, 0.007015f, 0.008026f, - 0.009201f, 0.010292f, 0.011536f, 0.013130f, 0.014915f, 0.016266f, 0.018387f, 0.020218f, - 0.022034f, 0.024399f, 0.026901f, 0.029617f, 0.032623f, 0.035950f, 0.039032f, 0.043030f, - 0.047577f, 0.052612f, 0.057556f, 0.063477f, 0.070007f, 0.077209f, 0.085083f, 0.094177f, - 0.103821f, 0.114563f, 0.126709f, 0.140015f, 0.154785f, 0.171143f, 0.188477f, 0.208252f, - 0.229004f, 0.251709f, 0.275879f, 0.302002f, 0.328613f, 0.356445f, 0.385986f, 0.416504f, - 0.447510f, 0.478760f, 0.510254f, 0.542480f, 0.573730f, 0.604980f, 0.635742f, 0.665527f, - 0.694336f, 0.722656f, 0.887695f, 0.897949f, 0.898926f, 0.899414f, 0.897949f, 0.898438f, - 0.000661f, 0.001222f, 0.002275f, 0.003313f, 0.004181f, 0.005119f, 0.006275f, 0.007126f, - 0.007988f, 0.009354f, 0.010300f, 0.012062f, 0.013313f, 0.014786f, 0.016251f, 0.018021f, - 0.019516f, 0.021896f, 0.024017f, 0.026428f, 0.029022f, 0.031799f, 0.034698f, 0.038422f, - 0.042236f, 0.046265f, 0.050598f, 0.055786f, 0.061493f, 0.067871f, 0.074951f, 0.082458f, - 0.091187f, 0.101135f, 0.111694f, 0.123779f, 0.137207f, 0.151978f, 0.167969f, 0.186157f, - 0.205688f, 0.226929f, 0.249756f, 0.274658f, 0.301025f, 0.328613f, 0.357178f, 0.387207f, - 0.418457f, 0.450195f, 0.482422f, 0.516113f, 0.548340f, 0.580566f, 0.612305f, 0.644043f, - 0.674805f, 0.705566f, 0.882812f, 0.890625f, 0.892578f, 0.893066f, 0.892578f, 0.893066f, - 0.000379f, 0.001211f, 0.002066f, 0.003040f, 0.003834f, 0.004616f, 0.005608f, 0.006550f, - 0.007347f, 0.008408f, 0.009529f, 0.010452f, 0.011940f, 0.013039f, 0.014313f, 0.015961f, - 0.017746f, 0.019180f, 0.021210f, 0.023239f, 0.025482f, 0.028030f, 0.030640f, 0.033661f, - 0.036987f, 0.040466f, 0.044617f, 0.048828f, 0.053894f, 0.059235f, 0.065674f, 0.072632f, - 0.079956f, 0.089050f, 0.098267f, 0.109009f, 0.120789f, 0.134521f, 0.148926f, 0.165405f, - 0.183228f, 0.202881f, 0.224731f, 0.248779f, 0.273193f, 0.300049f, 0.329346f, 0.358887f, - 0.390381f, 0.421387f, 0.454590f, 0.488770f, 0.521484f, 0.555176f, 0.588379f, 0.621582f, - 0.654785f, 0.686523f, 0.875488f, 0.885254f, 0.886719f, 0.886230f, 0.886719f, 0.886230f, - 0.000282f, 0.001126f, 0.002010f, 0.002661f, 0.003340f, 0.004269f, 0.005192f, 0.005711f, - 0.006638f, 0.007278f, 0.008377f, 0.009483f, 0.010567f, 0.011742f, 0.012871f, 0.014061f, - 0.015480f, 0.017242f, 0.018799f, 0.020584f, 0.022461f, 0.024490f, 0.027100f, 0.029434f, - 0.032532f, 0.035706f, 0.038971f, 0.042969f, 0.047241f, 0.052094f, 0.057373f, 0.063232f, - 0.070007f, 0.077637f, 0.086243f, 0.095764f, 0.106323f, 0.118164f, 0.131470f, 0.146118f, - 0.162720f, 0.181030f, 0.200928f, 0.223022f, 0.247070f, 0.272705f, 0.300537f, 0.330322f, - 0.360107f, 0.393066f, 0.426270f, 0.459473f, 0.494629f, 0.529297f, 0.564453f, 0.598633f, - 0.633789f, 0.666504f, 0.868652f, 0.878418f, 0.879395f, 0.880371f, 0.879883f, 0.879395f, - 0.000340f, 0.000963f, 0.001826f, 0.002459f, 0.003307f, 0.003847f, 0.004719f, 0.004936f, - 0.005802f, 0.006695f, 0.007748f, 0.008522f, 0.009506f, 0.010376f, 0.011383f, 0.012787f, - 0.013901f, 0.015182f, 0.016663f, 0.018051f, 0.019821f, 0.021759f, 0.023590f, 0.025818f, - 0.028519f, 0.030975f, 0.034210f, 0.037811f, 0.040802f, 0.045349f, 0.050201f, 0.055298f, - 0.061310f, 0.067688f, 0.074768f, 0.083557f, 0.092590f, 0.103149f, 0.115479f, 0.128906f, - 0.142944f, 0.160278f, 0.178345f, 0.198975f, 0.221802f, 0.246094f, 0.272949f, 0.301514f, - 0.331543f, 0.363525f, 0.396729f, 0.430908f, 0.466553f, 0.501953f, 0.538086f, 0.574707f, - 0.610840f, 0.646973f, 0.860352f, 0.870605f, 0.873047f, 0.873047f, 0.873535f, 0.872559f, - 0.000225f, 0.001021f, 0.001653f, 0.002302f, 0.002827f, 0.003448f, 0.003937f, 0.004486f, - 0.004986f, 0.006252f, 0.007000f, 0.007416f, 0.008224f, 0.009300f, 0.009972f, 0.011322f, - 0.012115f, 0.013428f, 0.014557f, 0.015991f, 0.017532f, 0.018982f, 0.020706f, 0.022781f, - 0.024567f, 0.027161f, 0.029770f, 0.032623f, 0.035828f, 0.039551f, 0.043030f, 0.047852f, - 0.052795f, 0.058716f, 0.065125f, 0.072266f, 0.080566f, 0.089661f, 0.100403f, 0.112854f, - 0.125732f, 0.140991f, 0.157349f, 0.176514f, 0.197510f, 0.220581f, 0.245850f, 0.273438f, - 0.302979f, 0.334717f, 0.367676f, 0.401855f, 0.437256f, 0.474609f, 0.512695f, 0.549316f, - 0.588379f, 0.625000f, 0.853027f, 0.863281f, 0.866211f, 0.866211f, 0.866699f, 0.866211f, - 0.000324f, 0.000845f, 0.001534f, 0.002172f, 0.002474f, 0.003115f, 0.003824f, 0.003937f, - 0.004848f, 0.005417f, 0.006222f, 0.006760f, 0.007446f, 0.008186f, 0.009102f, 0.009888f, - 0.010620f, 0.011551f, 0.012878f, 0.013954f, 0.015106f, 0.016495f, 0.018143f, 0.019669f, - 0.021713f, 0.023468f, 0.025818f, 0.028183f, 0.031021f, 0.033783f, 0.037445f, 0.041534f, - 0.045532f, 0.050598f, 0.056152f, 0.062500f, 0.069580f, 0.077698f, 0.086914f, 0.097717f, - 0.108948f, 0.123047f, 0.138184f, 0.155273f, 0.174438f, 0.196167f, 0.219604f, 0.246094f, - 0.274902f, 0.305420f, 0.338379f, 0.372314f, 0.408936f, 0.445801f, 0.484131f, 0.523438f, - 0.562988f, 0.604492f, 0.843262f, 0.856445f, 0.857422f, 0.857910f, 0.858398f, 0.858398f, - 0.000331f, 0.000944f, 0.001288f, 0.001833f, 0.002388f, 0.002769f, 0.003216f, 0.003664f, - 0.004276f, 0.004822f, 0.005173f, 0.005951f, 0.006531f, 0.007156f, 0.007896f, 0.008438f, - 0.009430f, 0.010117f, 0.011208f, 0.012253f, 0.012970f, 0.014297f, 0.015572f, 0.017059f, - 0.018692f, 0.020264f, 0.022125f, 0.024323f, 0.026474f, 0.029343f, 0.032288f, 0.035461f, - 0.039062f, 0.043335f, 0.047821f, 0.053558f, 0.059509f, 0.067078f, 0.074341f, 0.083862f, - 0.094360f, 0.106323f, 0.120117f, 0.135254f, 0.153442f, 0.172852f, 0.195190f, 0.220337f, - 0.246948f, 0.276611f, 0.308594f, 0.343262f, 0.379150f, 0.416992f, 0.455811f, 0.496582f, - 0.537598f, 0.579590f, 0.834473f, 0.847656f, 0.850098f, 0.850098f, 0.849609f, 0.850098f, - 0.000316f, 0.000824f, 0.001088f, 0.001693f, 0.002062f, 0.002403f, 0.003027f, 0.003460f, - 0.003712f, 0.004166f, 0.004765f, 0.005138f, 0.005871f, 0.006218f, 0.006924f, 0.007431f, - 0.008255f, 0.008850f, 0.009781f, 0.010590f, 0.011391f, 0.012367f, 0.013474f, 0.014709f, - 0.015823f, 0.017685f, 0.018982f, 0.020844f, 0.022629f, 0.025070f, 0.027496f, 0.030380f, - 0.033447f, 0.037140f, 0.041168f, 0.045654f, 0.050720f, 0.057251f, 0.063965f, 0.071777f, - 0.080811f, 0.091248f, 0.103638f, 0.117126f, 0.133179f, 0.151001f, 0.171631f, 0.194580f, - 0.220337f, 0.248413f, 0.279785f, 0.313965f, 0.349365f, 0.386963f, 0.426514f, 0.468262f, - 0.510742f, 0.555176f, 0.825684f, 0.838379f, 0.839844f, 0.841309f, 0.841309f, 0.841309f, - 0.000210f, 0.000717f, 0.001084f, 0.001454f, 0.001882f, 0.002096f, 0.002468f, 0.002996f, - 0.003395f, 0.003632f, 0.004066f, 0.004467f, 0.005020f, 0.005569f, 0.005917f, 0.006474f, - 0.006958f, 0.007576f, 0.008453f, 0.009140f, 0.010002f, 0.010689f, 0.011520f, 0.012596f, - 0.013695f, 0.014938f, 0.016220f, 0.017593f, 0.019424f, 0.020996f, 0.023331f, 0.025696f, - 0.028427f, 0.031067f, 0.034668f, 0.038422f, 0.042908f, 0.048096f, 0.054016f, 0.060699f, - 0.068909f, 0.077515f, 0.088501f, 0.100464f, 0.114624f, 0.130615f, 0.149048f, 0.170654f, - 0.194214f, 0.222046f, 0.251465f, 0.283936f, 0.319580f, 0.357422f, 0.397461f, 0.440186f, - 0.484375f, 0.528320f, 0.814941f, 0.828613f, 0.830078f, 0.832031f, 0.831543f, 0.833008f, - 0.000234f, 0.000576f, 0.000939f, 0.001362f, 0.001481f, 0.001999f, 0.002228f, 0.002714f, - 0.002846f, 0.003218f, 0.003555f, 0.003933f, 0.004356f, 0.004787f, 0.005169f, 0.005604f, - 0.006145f, 0.006554f, 0.007275f, 0.007675f, 0.008293f, 0.009201f, 0.009979f, 0.010651f, - 0.011497f, 0.012527f, 0.013893f, 0.014771f, 0.016373f, 0.017975f, 0.019455f, 0.021683f, - 0.023895f, 0.026077f, 0.029114f, 0.032257f, 0.036072f, 0.040405f, 0.045197f, 0.050903f, - 0.057770f, 0.065613f, 0.074524f, 0.085388f, 0.097656f, 0.111694f, 0.128540f, 0.147949f, - 0.170166f, 0.195435f, 0.223389f, 0.255127f, 0.289551f, 0.327393f, 0.367432f, 0.410400f, - 0.455078f, 0.502441f, 0.804199f, 0.818848f, 0.821289f, 0.822266f, 0.822754f, 0.822266f, - 0.000213f, 0.000506f, 0.000756f, 0.001184f, 0.001396f, 0.001697f, 0.002010f, 0.002474f, - 0.002569f, 0.002918f, 0.003090f, 0.003496f, 0.003855f, 0.004139f, 0.004478f, 0.004852f, - 0.005253f, 0.005665f, 0.006100f, 0.006638f, 0.007080f, 0.007744f, 0.008293f, 0.009132f, - 0.009750f, 0.010658f, 0.011536f, 0.012413f, 0.013779f, 0.014908f, 0.016510f, 0.017990f, - 0.019623f, 0.021637f, 0.024109f, 0.026718f, 0.029922f, 0.033539f, 0.037567f, 0.042572f, - 0.048279f, 0.054413f, 0.062042f, 0.071472f, 0.081909f, 0.094604f, 0.109436f, 0.127075f, - 0.146484f, 0.170044f, 0.196533f, 0.226929f, 0.260254f, 0.296875f, 0.337402f, 0.380615f, - 0.426025f, 0.475342f, 0.792969f, 0.807617f, 0.811035f, 0.811523f, 0.812012f, 0.813477f, - 0.000119f, 0.000422f, 0.000883f, 0.001027f, 0.001189f, 0.001604f, 0.001783f, 0.001913f, - 0.002228f, 0.002522f, 0.002645f, 0.003086f, 0.003199f, 0.003534f, 0.003790f, 0.004105f, - 0.004421f, 0.004902f, 0.005283f, 0.005589f, 0.006039f, 0.006401f, 0.007088f, 0.007519f, - 0.008217f, 0.008812f, 0.009712f, 0.010460f, 0.011337f, 0.012413f, 0.013596f, 0.014687f, - 0.016159f, 0.018051f, 0.019913f, 0.022018f, 0.024551f, 0.027359f, 0.030792f, 0.035065f, - 0.039703f, 0.044983f, 0.051392f, 0.059204f, 0.068176f, 0.079102f, 0.092041f, 0.106873f, - 0.125000f, 0.145874f, 0.170532f, 0.198975f, 0.230835f, 0.267090f, 0.306641f, 0.349854f, - 0.395508f, 0.445801f, 0.780762f, 0.796875f, 0.799805f, 0.801270f, 0.801270f, 0.801270f, - 0.000227f, 0.000521f, 0.000698f, 0.000817f, 0.001236f, 0.001359f, 0.001540f, 0.001619f, - 0.001940f, 0.002089f, 0.002430f, 0.002552f, 0.002655f, 0.002932f, 0.003241f, 0.003532f, - 0.003841f, 0.004120f, 0.004292f, 0.004761f, 0.005051f, 0.005459f, 0.005886f, 0.006290f, - 0.006821f, 0.007320f, 0.007889f, 0.008652f, 0.009399f, 0.010063f, 0.010887f, 0.012215f, - 0.013206f, 0.014648f, 0.016037f, 0.017853f, 0.019958f, 0.022491f, 0.024994f, 0.028091f, - 0.032135f, 0.036530f, 0.041809f, 0.048096f, 0.055908f, 0.064941f, 0.076050f, 0.089050f, - 0.104980f, 0.123596f, 0.146118f, 0.172363f, 0.203003f, 0.237183f, 0.276123f, 0.318359f, - 0.365479f, 0.416504f, 0.768555f, 0.784668f, 0.788086f, 0.789551f, 0.790039f, 0.790039f, - 0.000000f, 0.000448f, 0.000566f, 0.000688f, 0.000985f, 0.001144f, 0.001305f, 0.001437f, - 0.001622f, 0.001731f, 0.001989f, 0.002174f, 0.002338f, 0.002552f, 0.002739f, 0.002924f, - 0.003239f, 0.003405f, 0.003628f, 0.003933f, 0.004200f, 0.004463f, 0.004948f, 0.005245f, - 0.005615f, 0.006138f, 0.006699f, 0.006989f, 0.007793f, 0.008247f, 0.008980f, 0.009918f, - 0.010857f, 0.011795f, 0.013016f, 0.014244f, 0.015930f, 0.017868f, 0.019882f, 0.022659f, - 0.025543f, 0.029160f, 0.033417f, 0.038635f, 0.044983f, 0.052338f, 0.061859f, 0.072693f, - 0.086487f, 0.102966f, 0.122864f, 0.146973f, 0.175049f, 0.207764f, 0.245605f, 0.287842f, - 0.334229f, 0.385986f, 0.755371f, 0.771973f, 0.775879f, 0.777344f, 0.777832f, 0.778809f, - 0.000000f, 0.000303f, 0.000512f, 0.000752f, 0.000828f, 0.001036f, 0.001184f, 0.001292f, - 0.001281f, 0.001460f, 0.001717f, 0.001843f, 0.001955f, 0.002060f, 0.002317f, 0.002476f, - 0.002542f, 0.002869f, 0.003088f, 0.003313f, 0.003559f, 0.003693f, 0.004082f, 0.004318f, - 0.004696f, 0.005070f, 0.005245f, 0.005741f, 0.006126f, 0.006771f, 0.007298f, 0.007828f, - 0.008583f, 0.009338f, 0.010246f, 0.011528f, 0.012794f, 0.014160f, 0.015717f, 0.017853f, - 0.019958f, 0.022995f, 0.026291f, 0.030533f, 0.035553f, 0.041565f, 0.048981f, 0.058350f, - 0.069824f, 0.083801f, 0.101685f, 0.122437f, 0.148438f, 0.178833f, 0.215454f, 0.256104f, - 0.302490f, 0.354736f, 0.741699f, 0.758789f, 0.762695f, 0.763672f, 0.764648f, 0.765625f, - 0.000097f, 0.000306f, 0.000370f, 0.000618f, 0.000713f, 0.000810f, 0.000953f, 0.000920f, - 0.001167f, 0.001238f, 0.001406f, 0.001483f, 0.001540f, 0.001794f, 0.001970f, 0.002028f, - 0.002264f, 0.002354f, 0.002459f, 0.002636f, 0.002827f, 0.003096f, 0.003342f, 0.003544f, - 0.003881f, 0.003948f, 0.004459f, 0.004742f, 0.005005f, 0.005394f, 0.005867f, 0.006374f, - 0.006901f, 0.007507f, 0.008202f, 0.008881f, 0.010017f, 0.010986f, 0.012451f, 0.013809f, - 0.015511f, 0.017776f, 0.020325f, 0.023453f, 0.027390f, 0.032349f, 0.038330f, 0.045624f, - 0.055359f, 0.067078f, 0.082275f, 0.101013f, 0.123657f, 0.151611f, 0.185791f, 0.225342f, - 0.270752f, 0.322754f, 0.727051f, 0.746094f, 0.749512f, 0.750977f, 0.751953f, 0.751953f, - 0.000228f, 0.000211f, 0.000504f, 0.000443f, 0.000523f, 0.000672f, 0.000703f, 0.000902f, - 0.000975f, 0.001010f, 0.001122f, 0.001178f, 0.001257f, 0.001424f, 0.001575f, 0.001631f, - 0.001789f, 0.001910f, 0.002090f, 0.002144f, 0.002411f, 0.002520f, 0.002703f, 0.002827f, - 0.003010f, 0.003195f, 0.003403f, 0.003750f, 0.003960f, 0.004276f, 0.004780f, 0.005005f, - 0.005432f, 0.005981f, 0.006428f, 0.007015f, 0.007812f, 0.008537f, 0.009415f, 0.010658f, - 0.011963f, 0.013443f, 0.015396f, 0.017731f, 0.020782f, 0.024414f, 0.029083f, 0.034912f, - 0.042572f, 0.052216f, 0.064392f, 0.080017f, 0.100220f, 0.126099f, 0.157227f, 0.194946f, - 0.239136f, 0.290283f, 0.712402f, 0.731445f, 0.734863f, 0.736816f, 0.737305f, 0.737793f, - 0.000211f, 0.000198f, 0.000195f, 0.000413f, 0.000517f, 0.000531f, 0.000586f, 0.000736f, - 0.000769f, 0.000809f, 0.000970f, 0.001007f, 0.001067f, 0.001134f, 0.001211f, 0.001348f, - 0.001341f, 0.001534f, 0.001617f, 0.001734f, 0.001942f, 0.002010f, 0.002110f, 0.002268f, - 0.002523f, 0.002607f, 0.002829f, 0.003004f, 0.003113f, 0.003403f, 0.003681f, 0.003990f, - 0.004257f, 0.004601f, 0.005039f, 0.005444f, 0.005993f, 0.006561f, 0.007278f, 0.008026f, - 0.009041f, 0.010124f, 0.011513f, 0.013222f, 0.015320f, 0.017914f, 0.021408f, 0.025833f, - 0.031433f, 0.039429f, 0.049255f, 0.062286f, 0.079102f, 0.101135f, 0.130005f, 0.164917f, - 0.207764f, 0.258057f, 0.696289f, 0.716309f, 0.720215f, 0.722168f, 0.722656f, 0.723145f, - 0.000000f, 0.000080f, 0.000286f, 0.000374f, 0.000434f, 0.000457f, 0.000460f, 0.000568f, - 0.000610f, 0.000669f, 0.000715f, 0.000773f, 0.000877f, 0.000918f, 0.001030f, 0.000998f, - 0.001148f, 0.001134f, 0.001305f, 0.001369f, 0.001410f, 0.001534f, 0.001688f, 0.001780f, - 0.001899f, 0.001963f, 0.002081f, 0.002199f, 0.002470f, 0.002563f, 0.002758f, 0.003006f, - 0.003273f, 0.003531f, 0.003817f, 0.004093f, 0.004532f, 0.004993f, 0.005463f, 0.006027f, - 0.006657f, 0.007492f, 0.008537f, 0.009689f, 0.011246f, 0.012985f, 0.015518f, 0.018539f, - 0.022827f, 0.028534f, 0.036072f, 0.046234f, 0.060028f, 0.078918f, 0.103943f, 0.136353f, - 0.176514f, 0.225952f, 0.679199f, 0.699707f, 0.703613f, 0.706055f, 0.706543f, 0.708008f, - 0.000089f, 0.000176f, 0.000232f, 0.000342f, 0.000317f, 0.000319f, 0.000420f, 0.000382f, - 0.000494f, 0.000515f, 0.000612f, 0.000650f, 0.000671f, 0.000701f, 0.000732f, 0.000859f, - 0.000888f, 0.000923f, 0.001002f, 0.001048f, 0.001170f, 0.001234f, 0.001292f, 0.001426f, - 0.001414f, 0.001476f, 0.001622f, 0.001723f, 0.001892f, 0.001976f, 0.002237f, 0.002239f, - 0.002476f, 0.002645f, 0.002817f, 0.003092f, 0.003355f, 0.003626f, 0.003979f, 0.004459f, - 0.004948f, 0.005527f, 0.006256f, 0.007027f, 0.008026f, 0.009270f, 0.010918f, 0.013184f, - 0.016098f, 0.019913f, 0.025253f, 0.033112f, 0.043762f, 0.059113f, 0.079956f, 0.109009f, - 0.146729f, 0.193726f, 0.660645f, 0.682129f, 0.688477f, 0.690430f, 0.689941f, 0.690918f, - 0.000000f, 0.000063f, 0.000194f, 0.000281f, 0.000187f, 0.000325f, 0.000278f, 0.000272f, - 0.000386f, 0.000466f, 0.000462f, 0.000510f, 0.000519f, 0.000587f, 0.000613f, 0.000603f, - 0.000671f, 0.000709f, 0.000744f, 0.000808f, 0.000858f, 0.000913f, 0.000963f, 0.000999f, - 0.001062f, 0.001106f, 0.001262f, 0.001266f, 0.001431f, 0.001562f, 0.001672f, 0.001693f, - 0.001810f, 0.001976f, 0.002090f, 0.002289f, 0.002422f, 0.002666f, 0.002916f, 0.003166f, - 0.003513f, 0.003862f, 0.004318f, 0.004936f, 0.005646f, 0.006493f, 0.007626f, 0.009048f, - 0.010826f, 0.013519f, 0.017166f, 0.022476f, 0.030258f, 0.041687f, 0.058807f, 0.083435f, - 0.117737f, 0.162598f, 0.644043f, 0.666504f, 0.670410f, 0.673340f, 0.674316f, 0.675293f, - 0.000000f, 0.000117f, 0.000112f, 0.000178f, 0.000216f, 0.000222f, 0.000271f, 0.000229f, - 0.000280f, 0.000283f, 0.000326f, 0.000376f, 0.000376f, 0.000443f, 0.000456f, 0.000470f, - 0.000499f, 0.000507f, 0.000547f, 0.000566f, 0.000613f, 0.000667f, 0.000692f, 0.000749f, - 0.000773f, 0.000803f, 0.000917f, 0.000924f, 0.000997f, 0.001055f, 0.001096f, 0.001236f, - 0.001261f, 0.001376f, 0.001466f, 0.001693f, 0.001695f, 0.001826f, 0.002077f, 0.002226f, - 0.002411f, 0.002686f, 0.002985f, 0.003368f, 0.003801f, 0.004353f, 0.005131f, 0.005974f, - 0.007370f, 0.008842f, 0.011345f, 0.014717f, 0.019699f, 0.027893f, 0.040619f, 0.060730f, - 0.090454f, 0.132080f, 0.625488f, 0.649414f, 0.653809f, 0.655273f, 0.656250f, 0.658203f, - 0.000000f, 0.000000f, 0.000108f, 0.000121f, 0.000136f, 0.000154f, 0.000158f, 0.000191f, - 0.000203f, 0.000213f, 0.000270f, 0.000223f, 0.000232f, 0.000270f, 0.000296f, 0.000342f, - 0.000324f, 0.000352f, 0.000453f, 0.000407f, 0.000450f, 0.000459f, 0.000486f, 0.000524f, - 0.000545f, 0.000565f, 0.000630f, 0.000620f, 0.000678f, 0.000803f, 0.000763f, 0.000813f, - 0.000860f, 0.000937f, 0.001035f, 0.001101f, 0.001141f, 0.001254f, 0.001399f, 0.001449f, - 0.001616f, 0.001779f, 0.001942f, 0.002220f, 0.002493f, 0.002808f, 0.003258f, 0.003895f, - 0.004623f, 0.005714f, 0.007111f, 0.009178f, 0.012367f, 0.017319f, 0.025879f, 0.040741f, - 0.065552f, 0.103577f, 0.606934f, 0.630371f, 0.635254f, 0.637695f, 0.638672f, 0.639648f, - 0.000000f, 0.000109f, 0.000102f, 0.000098f, 0.000105f, 0.000110f, 0.000113f, 0.000122f, - 0.000117f, 0.000132f, 0.000147f, 0.000189f, 0.000163f, 0.000212f, 0.000213f, 0.000222f, - 0.000224f, 0.000233f, 0.000258f, 0.000262f, 0.000274f, 0.000305f, 0.000340f, 0.000329f, - 0.000358f, 0.000376f, 0.000445f, 0.000418f, 0.000447f, 0.000478f, 0.000546f, 0.000530f, - 0.000594f, 0.000626f, 0.000679f, 0.000745f, 0.000763f, 0.000804f, 0.000869f, 0.000952f, - 0.001025f, 0.001119f, 0.001254f, 0.001359f, 0.001584f, 0.001728f, 0.001993f, 0.002295f, - 0.002790f, 0.003298f, 0.004135f, 0.005363f, 0.007267f, 0.010277f, 0.015350f, 0.024994f, - 0.043518f, 0.076599f, 0.585938f, 0.611816f, 0.616211f, 0.619141f, 0.619629f, 0.620605f, - 0.000000f, 0.000102f, 0.000095f, 0.000090f, 0.000085f, 0.000081f, 0.000078f, 0.000073f, - 0.000075f, 0.000079f, 0.000087f, 0.000092f, 0.000095f, 0.000094f, 0.000133f, 0.000143f, - 0.000152f, 0.000155f, 0.000161f, 0.000195f, 0.000174f, 0.000183f, 0.000188f, 0.000216f, - 0.000233f, 0.000241f, 0.000241f, 0.000257f, 0.000269f, 0.000302f, 0.000325f, 0.000321f, - 0.000350f, 0.000363f, 0.000405f, 0.000426f, 0.000456f, 0.000486f, 0.000539f, 0.000560f, - 0.000614f, 0.000671f, 0.000722f, 0.000811f, 0.000891f, 0.000989f, 0.001162f, 0.001312f, - 0.001545f, 0.001863f, 0.002340f, 0.002920f, 0.003963f, 0.005615f, 0.008499f, 0.013931f, - 0.025833f, 0.052094f, 0.566406f, 0.591797f, 0.597168f, 0.599609f, 0.601074f, 0.601562f, - 0.000110f, 0.000092f, 0.000084f, 0.000077f, 0.000073f, 0.000070f, 0.000067f, 0.000064f, - 0.000061f, 0.000058f, 0.000055f, 0.000064f, 0.000051f, 0.000054f, 0.000071f, 0.000059f, - 0.000082f, 0.000081f, 0.000090f, 0.000087f, 0.000099f, 0.000103f, 0.000127f, 0.000131f, - 0.000135f, 0.000139f, 0.000142f, 0.000143f, 0.000156f, 0.000162f, 0.000173f, 0.000194f, - 0.000206f, 0.000201f, 0.000233f, 0.000225f, 0.000246f, 0.000294f, 0.000279f, 0.000313f, - 0.000333f, 0.000356f, 0.000395f, 0.000432f, 0.000459f, 0.000511f, 0.000577f, 0.000664f, - 0.000770f, 0.000916f, 0.001114f, 0.001400f, 0.001881f, 0.002665f, 0.004093f, 0.006966f, - 0.013290f, 0.031525f, 0.545410f, 0.571777f, 0.577637f, 0.579102f, 0.580566f, 0.581055f, - 0.000093f, 0.000073f, 0.000066f, 0.000061f, 0.000056f, 0.000054f, 0.000051f, 0.000050f, - 0.000048f, 0.000047f, 0.000045f, 0.000044f, 0.000042f, 0.000040f, 0.000038f, 0.000036f, - 0.000039f, 0.000033f, 0.000041f, 0.000040f, 0.000046f, 0.000048f, 0.000051f, 0.000057f, - 0.000060f, 0.000066f, 0.000062f, 0.000067f, 0.000080f, 0.000085f, 0.000088f, 0.000092f, - 0.000092f, 0.000097f, 0.000109f, 0.000109f, 0.000117f, 0.000132f, 0.000134f, 0.000147f, - 0.000154f, 0.000156f, 0.000188f, 0.000197f, 0.000219f, 0.000234f, 0.000266f, 0.000286f, - 0.000335f, 0.000397f, 0.000472f, 0.000566f, 0.000751f, 0.001039f, 0.001626f, 0.002834f, - 0.005909f, 0.015411f, 0.524414f, 0.551270f, 0.557129f, 0.559570f, 0.561035f, 0.561523f, - 0.000060f, 0.000046f, 0.000039f, 0.000037f, 0.000034f, 0.000034f, 0.000032f, 0.000032f, - 0.000031f, 0.000029f, 0.000029f, 0.000029f, 0.000028f, 0.000028f, 0.000028f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000021f, - 0.000020f, 0.000018f, 0.000018f, 0.000023f, 0.000024f, 0.000028f, 0.000032f, 0.000033f, - 0.000032f, 0.000038f, 0.000039f, 0.000043f, 0.000046f, 0.000050f, 0.000052f, 0.000053f, - 0.000057f, 0.000067f, 0.000073f, 0.000068f, 0.000076f, 0.000083f, 0.000097f, 0.000110f, - 0.000116f, 0.000127f, 0.000157f, 0.000185f, 0.000246f, 0.000319f, 0.000466f, 0.000810f, - 0.001841f, 0.005795f, 0.503418f, 0.531250f, 0.536621f, 0.539062f, 0.540039f, 0.540527f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000004f, 0.000005f, 0.000005f, 0.000008f, - 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000010f, 0.000010f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000012f, - 0.000013f, 0.000014f, 0.000015f, 0.000017f, 0.000020f, 0.000021f, 0.000018f, 0.000023f, - 0.000023f, 0.000025f, 0.000030f, 0.000038f, 0.000043f, 0.000059f, 0.000079f, 0.000131f, - 0.000279f, 0.001210f, 0.481934f, 0.510254f, 0.516113f, 0.518555f, 0.520020f, 0.520508f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, - 0.000006f, 0.000022f, 0.460449f, 0.489258f, 0.495850f, 0.498291f, 0.499512f, 0.500000f, - }, - { - 0.038544f, 0.111450f, 0.177368f, 0.237061f, 0.290771f, 0.339600f, 0.384277f, 0.425293f, - 0.462402f, 0.497070f, 0.527344f, 0.556152f, 0.583496f, 0.607910f, 0.630859f, 0.652344f, - 0.672852f, 0.690918f, 0.708496f, 0.724609f, 0.740723f, 0.754883f, 0.768066f, 0.780273f, - 0.792480f, 0.803711f, 0.815430f, 0.825684f, 0.835449f, 0.844727f, 0.853516f, 0.861816f, - 0.870117f, 0.877930f, 0.885254f, 0.892578f, 0.899414f, 0.905762f, 0.912109f, 0.918945f, - 0.923828f, 0.928711f, 0.934082f, 0.939941f, 0.944824f, 0.949707f, 0.953613f, 0.958496f, - 0.962402f, 0.967285f, 0.971191f, 0.974609f, 0.979004f, 0.982422f, 0.985352f, 0.989258f, - 0.992188f, 0.996094f, 0.996094f, 0.990723f, 0.986328f, 0.982422f, 0.978516f, 0.975098f, - 0.029068f, 0.087219f, 0.142578f, 0.195190f, 0.244629f, 0.291016f, 0.334717f, 0.375000f, - 0.412842f, 0.446533f, 0.481201f, 0.511230f, 0.539062f, 0.565918f, 0.590820f, 0.614258f, - 0.636719f, 0.656250f, 0.675293f, 0.693359f, 0.710449f, 0.726562f, 0.741699f, 0.755371f, - 0.769043f, 0.781738f, 0.793457f, 0.805176f, 0.815918f, 0.826660f, 0.835938f, 0.845703f, - 0.854980f, 0.862793f, 0.871582f, 0.879395f, 0.885742f, 0.894531f, 0.900879f, 0.907227f, - 0.913086f, 0.919434f, 0.925293f, 0.931152f, 0.936523f, 0.941406f, 0.946777f, 0.951172f, - 0.956055f, 0.960449f, 0.964355f, 0.968750f, 0.972656f, 0.976562f, 0.980469f, 0.984375f, - 0.987793f, 0.991211f, 0.994141f, 0.989258f, 0.984863f, 0.981445f, 0.977539f, 0.974121f, - 0.023346f, 0.069641f, 0.115601f, 0.160767f, 0.205078f, 0.248047f, 0.289062f, 0.328125f, - 0.365723f, 0.401367f, 0.435059f, 0.466309f, 0.495361f, 0.523926f, 0.550781f, 0.574707f, - 0.597168f, 0.620117f, 0.641113f, 0.660156f, 0.679688f, 0.696777f, 0.713379f, 0.728516f, - 0.743652f, 0.757324f, 0.770996f, 0.784180f, 0.795410f, 0.806641f, 0.817383f, 0.828125f, - 0.837891f, 0.847168f, 0.855957f, 0.864258f, 0.873047f, 0.880859f, 0.888672f, 0.895996f, - 0.902832f, 0.909668f, 0.915039f, 0.921875f, 0.927246f, 0.934082f, 0.937988f, 0.943848f, - 0.948242f, 0.953613f, 0.958496f, 0.962402f, 0.967285f, 0.971191f, 0.975098f, 0.979492f, - 0.983398f, 0.985840f, 0.992188f, 0.987305f, 0.983398f, 0.979980f, 0.977051f, 0.973633f, - 0.018600f, 0.056366f, 0.094299f, 0.133545f, 0.172729f, 0.211670f, 0.249756f, 0.285889f, - 0.322021f, 0.356934f, 0.390869f, 0.421875f, 0.452148f, 0.481201f, 0.509277f, 0.535156f, - 0.560059f, 0.583496f, 0.605957f, 0.626465f, 0.647949f, 0.665527f, 0.684570f, 0.700684f, - 0.717285f, 0.731934f, 0.746582f, 0.760254f, 0.773926f, 0.786621f, 0.799316f, 0.809082f, - 0.820312f, 0.830566f, 0.840332f, 0.850098f, 0.858887f, 0.867188f, 0.875000f, 0.883789f, - 0.890625f, 0.898926f, 0.904297f, 0.912109f, 0.916992f, 0.924316f, 0.930176f, 0.935547f, - 0.941406f, 0.945801f, 0.951172f, 0.956055f, 0.960938f, 0.964844f, 0.969727f, 0.974609f, - 0.978516f, 0.981934f, 0.989746f, 0.985840f, 0.981934f, 0.978516f, 0.975586f, 0.972168f, - 0.015068f, 0.046143f, 0.077881f, 0.111816f, 0.145264f, 0.179688f, 0.214600f, 0.249023f, - 0.282715f, 0.316406f, 0.348389f, 0.380615f, 0.411133f, 0.440430f, 0.468018f, 0.494873f, - 0.520508f, 0.546387f, 0.568848f, 0.591309f, 0.613281f, 0.634277f, 0.653809f, 0.670898f, - 0.688477f, 0.706055f, 0.721191f, 0.736328f, 0.751465f, 0.764648f, 0.776855f, 0.789551f, - 0.801270f, 0.812500f, 0.823730f, 0.833496f, 0.843262f, 0.853027f, 0.861328f, 0.869629f, - 0.878418f, 0.885742f, 0.893555f, 0.900391f, 0.908203f, 0.914551f, 0.921387f, 0.927246f, - 0.932617f, 0.938965f, 0.943848f, 0.949219f, 0.953613f, 0.959473f, 0.963867f, 0.968262f, - 0.972656f, 0.977051f, 0.987305f, 0.983887f, 0.980957f, 0.977051f, 0.974121f, 0.970703f, - 0.012444f, 0.037933f, 0.065613f, 0.093811f, 0.123474f, 0.153809f, 0.185059f, 0.215820f, - 0.247559f, 0.279297f, 0.310547f, 0.341309f, 0.370361f, 0.399658f, 0.428467f, 0.457031f, - 0.482910f, 0.507812f, 0.533203f, 0.556152f, 0.579590f, 0.600098f, 0.621094f, 0.641113f, - 0.659668f, 0.676270f, 0.695312f, 0.710449f, 0.726074f, 0.740723f, 0.756348f, 0.769043f, - 0.780762f, 0.794434f, 0.805176f, 0.816895f, 0.827637f, 0.837891f, 0.847168f, 0.855957f, - 0.865723f, 0.873535f, 0.882324f, 0.889648f, 0.897949f, 0.904297f, 0.911133f, 0.917480f, - 0.924316f, 0.930176f, 0.936523f, 0.941895f, 0.947266f, 0.952637f, 0.958008f, 0.962891f, - 0.967285f, 0.971680f, 0.984863f, 0.981934f, 0.978516f, 0.975586f, 0.972656f, 0.969238f, - 0.010353f, 0.032043f, 0.055359f, 0.079529f, 0.104980f, 0.131836f, 0.159424f, 0.187866f, - 0.216431f, 0.245239f, 0.275146f, 0.304199f, 0.333496f, 0.362061f, 0.390869f, 0.417969f, - 0.445068f, 0.471191f, 0.496582f, 0.520508f, 0.543457f, 0.566895f, 0.588867f, 0.608398f, - 0.628906f, 0.648438f, 0.666992f, 0.684570f, 0.701660f, 0.716797f, 0.732422f, 0.746582f, - 0.760254f, 0.773438f, 0.786133f, 0.798340f, 0.810547f, 0.821777f, 0.832520f, 0.842773f, - 0.851074f, 0.860352f, 0.869629f, 0.878906f, 0.886230f, 0.894043f, 0.901855f, 0.908691f, - 0.915527f, 0.922363f, 0.928223f, 0.935059f, 0.939941f, 0.945312f, 0.950684f, 0.956055f, - 0.962402f, 0.966797f, 0.982910f, 0.979980f, 0.977051f, 0.973633f, 0.970703f, 0.968262f, - 0.008598f, 0.027328f, 0.046417f, 0.067871f, 0.089905f, 0.113220f, 0.137695f, 0.163330f, - 0.189087f, 0.216064f, 0.243164f, 0.270752f, 0.298340f, 0.326416f, 0.354004f, 0.381348f, - 0.407715f, 0.434082f, 0.460205f, 0.484863f, 0.508789f, 0.532227f, 0.555176f, 0.577637f, - 0.598145f, 0.618652f, 0.637695f, 0.657227f, 0.674805f, 0.691406f, 0.708008f, 0.723633f, - 0.738770f, 0.751953f, 0.766113f, 0.779785f, 0.791992f, 0.804199f, 0.815918f, 0.825684f, - 0.836914f, 0.846680f, 0.856934f, 0.866211f, 0.874512f, 0.882324f, 0.890625f, 0.898438f, - 0.905273f, 0.913086f, 0.919922f, 0.926758f, 0.933105f, 0.938477f, 0.944824f, 0.951172f, - 0.955566f, 0.960938f, 0.980469f, 0.978027f, 0.974609f, 0.972168f, 0.969238f, 0.966797f, - 0.007561f, 0.023315f, 0.040344f, 0.058228f, 0.077148f, 0.097534f, 0.119995f, 0.142212f, - 0.165649f, 0.190063f, 0.214722f, 0.240601f, 0.266846f, 0.293457f, 0.319824f, 0.346924f, - 0.372314f, 0.398438f, 0.424561f, 0.449463f, 0.474609f, 0.498535f, 0.521973f, 0.544434f, - 0.566895f, 0.587402f, 0.608398f, 0.628418f, 0.645996f, 0.665039f, 0.683105f, 0.699219f, - 0.716309f, 0.731445f, 0.745117f, 0.760254f, 0.772949f, 0.786133f, 0.799316f, 0.809570f, - 0.820801f, 0.832031f, 0.843262f, 0.852051f, 0.861816f, 0.871094f, 0.880371f, 0.887695f, - 0.895996f, 0.904297f, 0.911133f, 0.917969f, 0.924805f, 0.931641f, 0.937012f, 0.943848f, - 0.949707f, 0.954590f, 0.978027f, 0.976074f, 0.973145f, 0.970215f, 0.967773f, 0.965332f, - 0.006416f, 0.020065f, 0.034943f, 0.050537f, 0.067078f, 0.084900f, 0.104065f, 0.123962f, - 0.145264f, 0.166748f, 0.189575f, 0.213501f, 0.237305f, 0.262451f, 0.288574f, 0.313477f, - 0.338623f, 0.364502f, 0.389893f, 0.414551f, 0.440186f, 0.464600f, 0.487549f, 0.510742f, - 0.534668f, 0.556641f, 0.578613f, 0.598145f, 0.618652f, 0.637207f, 0.655273f, 0.674805f, - 0.690430f, 0.707031f, 0.724121f, 0.739258f, 0.752930f, 0.767090f, 0.779785f, 0.792969f, - 0.805176f, 0.816895f, 0.827637f, 0.838379f, 0.849121f, 0.858398f, 0.868652f, 0.876465f, - 0.885742f, 0.894043f, 0.901855f, 0.909180f, 0.916992f, 0.923828f, 0.930176f, 0.937012f, - 0.943359f, 0.949707f, 0.975586f, 0.973633f, 0.971191f, 0.968262f, 0.965820f, 0.963379f, - 0.005802f, 0.017502f, 0.030045f, 0.043823f, 0.058014f, 0.074280f, 0.090759f, 0.108459f, - 0.127197f, 0.146484f, 0.167725f, 0.189087f, 0.211304f, 0.234497f, 0.258301f, 0.282471f, - 0.307373f, 0.331299f, 0.356689f, 0.381104f, 0.405762f, 0.430420f, 0.455078f, 0.478516f, - 0.502441f, 0.524414f, 0.545898f, 0.568359f, 0.588867f, 0.608887f, 0.628906f, 0.646973f, - 0.665527f, 0.684082f, 0.701172f, 0.715820f, 0.731934f, 0.746582f, 0.760742f, 0.774414f, - 0.787598f, 0.800781f, 0.812500f, 0.823730f, 0.834961f, 0.845703f, 0.855469f, 0.865234f, - 0.874512f, 0.883789f, 0.892090f, 0.899902f, 0.908203f, 0.916016f, 0.922852f, 0.930176f, - 0.936523f, 0.942871f, 0.972656f, 0.971191f, 0.968750f, 0.966309f, 0.963867f, 0.961426f, - 0.004734f, 0.014984f, 0.026169f, 0.038177f, 0.051208f, 0.065186f, 0.079468f, 0.095276f, - 0.111633f, 0.129639f, 0.148071f, 0.167969f, 0.188599f, 0.208984f, 0.231689f, 0.254639f, - 0.277832f, 0.301025f, 0.325439f, 0.349854f, 0.373779f, 0.397705f, 0.422607f, 0.446045f, - 0.469727f, 0.492676f, 0.514648f, 0.537598f, 0.559570f, 0.580078f, 0.600586f, 0.620117f, - 0.639648f, 0.658203f, 0.676758f, 0.692871f, 0.708984f, 0.725586f, 0.740723f, 0.755859f, - 0.769531f, 0.783691f, 0.796875f, 0.808594f, 0.820801f, 0.832520f, 0.842285f, 0.852539f, - 0.862793f, 0.872070f, 0.881836f, 0.890137f, 0.898926f, 0.906738f, 0.915039f, 0.922363f, - 0.929199f, 0.936523f, 0.969727f, 0.968750f, 0.966797f, 0.964355f, 0.961914f, 0.959473f, - 0.004055f, 0.013588f, 0.023132f, 0.033722f, 0.044891f, 0.057343f, 0.069763f, 0.083923f, - 0.098389f, 0.114441f, 0.131226f, 0.148682f, 0.167603f, 0.186768f, 0.207031f, 0.228516f, - 0.250732f, 0.272949f, 0.295410f, 0.318604f, 0.342285f, 0.365967f, 0.390381f, 0.413574f, - 0.437744f, 0.460938f, 0.484131f, 0.506348f, 0.528320f, 0.550781f, 0.572266f, 0.592773f, - 0.613281f, 0.632812f, 0.651367f, 0.669922f, 0.687500f, 0.704102f, 0.720215f, 0.735840f, - 0.751465f, 0.764160f, 0.778809f, 0.792480f, 0.803711f, 0.816895f, 0.829102f, 0.840332f, - 0.850586f, 0.860352f, 0.870605f, 0.880371f, 0.889648f, 0.897949f, 0.905762f, 0.914551f, - 0.922363f, 0.929199f, 0.967285f, 0.966797f, 0.964844f, 0.961426f, 0.959473f, 0.958008f, - 0.003611f, 0.011971f, 0.020401f, 0.030029f, 0.039185f, 0.050415f, 0.061737f, 0.074341f, - 0.086975f, 0.101074f, 0.115845f, 0.131958f, 0.148682f, 0.166626f, 0.185059f, 0.205200f, - 0.224854f, 0.245483f, 0.267334f, 0.290771f, 0.312988f, 0.335449f, 0.359619f, 0.382080f, - 0.406250f, 0.429443f, 0.452881f, 0.475830f, 0.498779f, 0.520996f, 0.542480f, 0.563477f, - 0.584473f, 0.604980f, 0.625977f, 0.643555f, 0.663086f, 0.681152f, 0.698242f, 0.714355f, - 0.729980f, 0.746582f, 0.760742f, 0.774902f, 0.788086f, 0.801758f, 0.814941f, 0.826660f, - 0.838867f, 0.848633f, 0.859863f, 0.869141f, 0.879395f, 0.889160f, 0.897949f, 0.906250f, - 0.914551f, 0.922363f, 0.963867f, 0.964355f, 0.961914f, 0.959961f, 0.957520f, 0.955078f, - 0.003393f, 0.010361f, 0.018494f, 0.026337f, 0.035187f, 0.044556f, 0.054596f, 0.065186f, - 0.077515f, 0.089783f, 0.102783f, 0.117249f, 0.132446f, 0.148071f, 0.165649f, 0.183838f, - 0.202026f, 0.221313f, 0.241943f, 0.262939f, 0.285156f, 0.307129f, 0.329102f, 0.352539f, - 0.375977f, 0.398438f, 0.421875f, 0.445312f, 0.468750f, 0.490723f, 0.512695f, 0.534668f, - 0.556641f, 0.577637f, 0.598633f, 0.619141f, 0.637695f, 0.656738f, 0.674805f, 0.692383f, - 0.709473f, 0.726074f, 0.742188f, 0.756836f, 0.771973f, 0.786133f, 0.799316f, 0.812012f, - 0.824707f, 0.835938f, 0.848145f, 0.858887f, 0.868164f, 0.878906f, 0.888184f, 0.897949f, - 0.906250f, 0.914551f, 0.960938f, 0.960938f, 0.959473f, 0.957520f, 0.955078f, 0.953125f, - 0.003084f, 0.009521f, 0.016144f, 0.023346f, 0.031204f, 0.039520f, 0.048523f, 0.057953f, - 0.068359f, 0.079895f, 0.091309f, 0.104126f, 0.117920f, 0.132324f, 0.147949f, 0.164062f, - 0.181396f, 0.199219f, 0.218872f, 0.238403f, 0.258545f, 0.279541f, 0.301758f, 0.323486f, - 0.346191f, 0.368408f, 0.391846f, 0.414795f, 0.437256f, 0.460693f, 0.483643f, 0.505371f, - 0.527832f, 0.550293f, 0.571289f, 0.591797f, 0.612305f, 0.632324f, 0.651855f, 0.670898f, - 0.687500f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768555f, 0.783691f, 0.796875f, - 0.811035f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868652f, 0.878418f, 0.887695f, - 0.897949f, 0.906250f, 0.958008f, 0.958008f, 0.957031f, 0.954590f, 0.952637f, 0.950684f, - 0.002666f, 0.008293f, 0.014297f, 0.021225f, 0.027847f, 0.035156f, 0.043274f, 0.051666f, - 0.060791f, 0.070801f, 0.081543f, 0.092407f, 0.104858f, 0.118530f, 0.131836f, 0.146606f, - 0.162598f, 0.179443f, 0.196777f, 0.215210f, 0.234375f, 0.254150f, 0.274414f, 0.295898f, - 0.317871f, 0.340088f, 0.362549f, 0.385010f, 0.407959f, 0.430664f, 0.454590f, 0.476562f, - 0.499268f, 0.521484f, 0.543945f, 0.564941f, 0.585938f, 0.606934f, 0.626465f, 0.646484f, - 0.665527f, 0.683594f, 0.701660f, 0.717773f, 0.735352f, 0.751465f, 0.766113f, 0.781738f, - 0.794922f, 0.808105f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.868164f, 0.878906f, - 0.889160f, 0.899414f, 0.954102f, 0.955566f, 0.953613f, 0.952148f, 0.950195f, 0.948730f, - 0.002396f, 0.007427f, 0.012978f, 0.018646f, 0.025024f, 0.031403f, 0.038788f, 0.046112f, - 0.054260f, 0.063354f, 0.072693f, 0.082886f, 0.093689f, 0.105469f, 0.118164f, 0.130859f, - 0.145996f, 0.161011f, 0.177124f, 0.193359f, 0.211670f, 0.230225f, 0.249634f, 0.270020f, - 0.290771f, 0.311768f, 0.333740f, 0.356201f, 0.378906f, 0.401855f, 0.424561f, 0.447754f, - 0.470215f, 0.493408f, 0.515137f, 0.537109f, 0.559570f, 0.580078f, 0.601074f, 0.621582f, - 0.642090f, 0.661621f, 0.679688f, 0.697754f, 0.715820f, 0.732422f, 0.749512f, 0.765137f, - 0.779785f, 0.794434f, 0.808594f, 0.821289f, 0.833496f, 0.846191f, 0.857910f, 0.869141f, - 0.879883f, 0.889648f, 0.950195f, 0.952637f, 0.950684f, 0.948730f, 0.947266f, 0.945801f, - 0.002029f, 0.006672f, 0.011658f, 0.016937f, 0.022476f, 0.028305f, 0.034332f, 0.041351f, - 0.048584f, 0.056671f, 0.064697f, 0.073853f, 0.083923f, 0.094482f, 0.105225f, 0.117798f, - 0.130615f, 0.144287f, 0.159302f, 0.174683f, 0.190430f, 0.208740f, 0.226318f, 0.245483f, - 0.264893f, 0.285400f, 0.307129f, 0.328369f, 0.350342f, 0.372803f, 0.395264f, 0.418701f, - 0.441650f, 0.462891f, 0.486816f, 0.509277f, 0.532227f, 0.553711f, 0.575684f, 0.596680f, - 0.617676f, 0.638672f, 0.657715f, 0.676758f, 0.695312f, 0.712402f, 0.729492f, 0.746582f, - 0.762695f, 0.778320f, 0.793457f, 0.807129f, 0.820801f, 0.833984f, 0.846191f, 0.858887f, - 0.869629f, 0.881836f, 0.947266f, 0.949219f, 0.947754f, 0.946289f, 0.944824f, 0.942871f, - 0.002142f, 0.006401f, 0.010841f, 0.015251f, 0.019760f, 0.025055f, 0.031113f, 0.037201f, - 0.043671f, 0.050598f, 0.057892f, 0.066101f, 0.075012f, 0.084351f, 0.093994f, 0.105164f, - 0.117432f, 0.129517f, 0.142822f, 0.157104f, 0.172119f, 0.188110f, 0.204956f, 0.223145f, - 0.241577f, 0.260498f, 0.280762f, 0.301758f, 0.322998f, 0.345215f, 0.366943f, 0.389893f, - 0.412842f, 0.435791f, 0.458008f, 0.482178f, 0.504395f, 0.526855f, 0.548828f, 0.571289f, - 0.592285f, 0.612793f, 0.634277f, 0.654297f, 0.673340f, 0.692383f, 0.710938f, 0.729004f, - 0.745117f, 0.762207f, 0.777832f, 0.792480f, 0.807129f, 0.821289f, 0.834961f, 0.847168f, - 0.859863f, 0.871582f, 0.943359f, 0.946289f, 0.944824f, 0.943359f, 0.941895f, 0.940430f, - 0.001760f, 0.005562f, 0.009621f, 0.013710f, 0.018417f, 0.022736f, 0.027939f, 0.033264f, - 0.039185f, 0.045166f, 0.052460f, 0.059143f, 0.067261f, 0.075745f, 0.084106f, 0.094177f, - 0.104980f, 0.116455f, 0.128174f, 0.141113f, 0.155151f, 0.169922f, 0.184937f, 0.201660f, - 0.219238f, 0.237549f, 0.256348f, 0.276367f, 0.296875f, 0.317871f, 0.339844f, 0.361572f, - 0.383789f, 0.407227f, 0.430908f, 0.453857f, 0.476807f, 0.498779f, 0.521973f, 0.543945f, - 0.567383f, 0.589355f, 0.609863f, 0.631348f, 0.651855f, 0.671875f, 0.690918f, 0.709961f, - 0.727539f, 0.744141f, 0.761719f, 0.777344f, 0.793457f, 0.808594f, 0.823242f, 0.835449f, - 0.848633f, 0.861328f, 0.938965f, 0.941895f, 0.941406f, 0.940430f, 0.938477f, 0.937012f, - 0.001594f, 0.005283f, 0.008789f, 0.012383f, 0.016342f, 0.020523f, 0.025284f, 0.029968f, - 0.035217f, 0.040741f, 0.046417f, 0.052948f, 0.060120f, 0.067566f, 0.076294f, 0.084534f, - 0.093750f, 0.104614f, 0.115173f, 0.126831f, 0.139160f, 0.152832f, 0.166748f, 0.181885f, - 0.198853f, 0.215698f, 0.233521f, 0.252197f, 0.271973f, 0.291992f, 0.313477f, 0.334717f, - 0.357178f, 0.379395f, 0.401855f, 0.425537f, 0.448242f, 0.471924f, 0.495361f, 0.517578f, - 0.541016f, 0.562988f, 0.585938f, 0.607422f, 0.627930f, 0.649414f, 0.670410f, 0.688965f, - 0.708496f, 0.727539f, 0.744629f, 0.761719f, 0.778809f, 0.794922f, 0.809082f, 0.824219f, - 0.838379f, 0.851074f, 0.935059f, 0.938965f, 0.937988f, 0.937012f, 0.936035f, 0.933594f, - 0.001564f, 0.004665f, 0.007973f, 0.011276f, 0.014908f, 0.018600f, 0.022675f, 0.027176f, - 0.031464f, 0.036621f, 0.042023f, 0.047974f, 0.054108f, 0.060822f, 0.068237f, 0.075684f, - 0.084229f, 0.093567f, 0.103210f, 0.113892f, 0.125000f, 0.137329f, 0.150269f, 0.164307f, - 0.179810f, 0.194946f, 0.212158f, 0.229248f, 0.247925f, 0.267578f, 0.287842f, 0.308350f, - 0.330322f, 0.352051f, 0.374756f, 0.397461f, 0.420654f, 0.444092f, 0.466797f, 0.490723f, - 0.514160f, 0.537109f, 0.560059f, 0.582031f, 0.604980f, 0.626953f, 0.648926f, 0.668457f, - 0.688477f, 0.708008f, 0.727539f, 0.745117f, 0.763672f, 0.779297f, 0.795410f, 0.811523f, - 0.826660f, 0.840332f, 0.930664f, 0.934570f, 0.934082f, 0.933594f, 0.932129f, 0.930664f, - 0.001424f, 0.004261f, 0.007122f, 0.010239f, 0.013374f, 0.016693f, 0.020401f, 0.024368f, - 0.028595f, 0.033325f, 0.037964f, 0.043152f, 0.048340f, 0.054962f, 0.060730f, 0.067749f, - 0.075684f, 0.083862f, 0.092041f, 0.102051f, 0.112305f, 0.123657f, 0.135376f, 0.148071f, - 0.161987f, 0.176270f, 0.192139f, 0.208252f, 0.226196f, 0.244141f, 0.263672f, 0.283447f, - 0.304199f, 0.325195f, 0.346924f, 0.370605f, 0.392822f, 0.416260f, 0.439209f, 0.463623f, - 0.486084f, 0.511230f, 0.534180f, 0.558105f, 0.580566f, 0.603516f, 0.625000f, 0.647461f, - 0.668457f, 0.688965f, 0.708496f, 0.727539f, 0.746582f, 0.764160f, 0.781738f, 0.798340f, - 0.813477f, 0.829590f, 0.926758f, 0.931152f, 0.930664f, 0.929199f, 0.928223f, 0.927246f, - 0.001294f, 0.004196f, 0.006538f, 0.009346f, 0.012306f, 0.015335f, 0.018845f, 0.022003f, - 0.025558f, 0.029816f, 0.034149f, 0.038605f, 0.043915f, 0.049042f, 0.054810f, 0.061188f, - 0.067993f, 0.075256f, 0.083130f, 0.091553f, 0.100769f, 0.110779f, 0.121643f, 0.133057f, - 0.145630f, 0.159058f, 0.173218f, 0.188721f, 0.204590f, 0.222290f, 0.240234f, 0.259277f, - 0.279053f, 0.299561f, 0.321533f, 0.343506f, 0.365723f, 0.389404f, 0.412354f, 0.436035f, - 0.459961f, 0.484131f, 0.508301f, 0.532227f, 0.555176f, 0.579102f, 0.601562f, 0.624512f, - 0.646484f, 0.668457f, 0.688965f, 0.709473f, 0.729004f, 0.748047f, 0.766602f, 0.784668f, - 0.800293f, 0.817383f, 0.921875f, 0.926270f, 0.926270f, 0.925781f, 0.924316f, 0.923340f, - 0.001081f, 0.003603f, 0.006027f, 0.008575f, 0.010979f, 0.013847f, 0.016937f, 0.020020f, - 0.023315f, 0.026917f, 0.030930f, 0.035156f, 0.039429f, 0.044098f, 0.049622f, 0.054779f, - 0.060791f, 0.067566f, 0.074341f, 0.082336f, 0.090515f, 0.099548f, 0.109070f, 0.119263f, - 0.130981f, 0.143188f, 0.156250f, 0.170288f, 0.185303f, 0.201294f, 0.218262f, 0.236450f, - 0.255615f, 0.275391f, 0.295654f, 0.316895f, 0.339111f, 0.362061f, 0.385498f, 0.408936f, - 0.432861f, 0.457275f, 0.481689f, 0.505371f, 0.529785f, 0.553711f, 0.577637f, 0.601074f, - 0.624023f, 0.646484f, 0.669434f, 0.689941f, 0.711426f, 0.731445f, 0.750977f, 0.770020f, - 0.787598f, 0.804688f, 0.916992f, 0.922363f, 0.922363f, 0.921875f, 0.920898f, 0.918945f, - 0.001064f, 0.003231f, 0.005322f, 0.007710f, 0.010323f, 0.012489f, 0.015244f, 0.018051f, - 0.020798f, 0.024338f, 0.027893f, 0.031738f, 0.035553f, 0.039795f, 0.044495f, 0.049133f, - 0.054657f, 0.060608f, 0.066895f, 0.073792f, 0.081421f, 0.089050f, 0.097717f, 0.106934f, - 0.117554f, 0.128540f, 0.140503f, 0.153442f, 0.167236f, 0.182129f, 0.197998f, 0.214966f, - 0.232422f, 0.251465f, 0.271240f, 0.291992f, 0.313232f, 0.335693f, 0.358643f, 0.382080f, - 0.406006f, 0.430176f, 0.454590f, 0.479004f, 0.503906f, 0.528320f, 0.552734f, 0.577637f, - 0.601562f, 0.625000f, 0.648438f, 0.670898f, 0.691895f, 0.713867f, 0.733887f, 0.754883f, - 0.774414f, 0.791992f, 0.912109f, 0.917969f, 0.918457f, 0.916992f, 0.916016f, 0.915039f, - 0.000998f, 0.003012f, 0.005123f, 0.007114f, 0.009438f, 0.011360f, 0.013763f, 0.016510f, - 0.018951f, 0.022171f, 0.025101f, 0.028305f, 0.031830f, 0.035736f, 0.039795f, 0.044067f, - 0.048950f, 0.053864f, 0.059601f, 0.066345f, 0.072815f, 0.079956f, 0.087402f, 0.096375f, - 0.105835f, 0.115479f, 0.126343f, 0.138184f, 0.150635f, 0.164062f, 0.178711f, 0.194214f, - 0.210815f, 0.229004f, 0.247314f, 0.267090f, 0.288330f, 0.309570f, 0.332275f, 0.355469f, - 0.378418f, 0.402832f, 0.427490f, 0.452637f, 0.477783f, 0.501953f, 0.527832f, 0.552734f, - 0.577637f, 0.602051f, 0.626465f, 0.649902f, 0.672852f, 0.695312f, 0.717773f, 0.737793f, - 0.758789f, 0.778809f, 0.906250f, 0.913086f, 0.913574f, 0.912598f, 0.911621f, 0.910645f, - 0.001059f, 0.002985f, 0.004475f, 0.006496f, 0.008545f, 0.010300f, 0.012581f, 0.014969f, - 0.017471f, 0.019852f, 0.022507f, 0.025864f, 0.028824f, 0.032135f, 0.036041f, 0.039795f, - 0.043884f, 0.048706f, 0.053680f, 0.059113f, 0.064819f, 0.071472f, 0.078491f, 0.086365f, - 0.094360f, 0.103577f, 0.113403f, 0.124023f, 0.135620f, 0.147705f, 0.160889f, 0.175537f, - 0.191284f, 0.207764f, 0.225464f, 0.244263f, 0.264160f, 0.284912f, 0.306641f, 0.329102f, - 0.352295f, 0.376465f, 0.400635f, 0.426025f, 0.451416f, 0.476562f, 0.502930f, 0.527344f, - 0.553711f, 0.579102f, 0.603027f, 0.627930f, 0.652344f, 0.675781f, 0.700195f, 0.722168f, - 0.742676f, 0.764648f, 0.901367f, 0.907715f, 0.908691f, 0.908203f, 0.907227f, 0.906250f, - 0.000988f, 0.002577f, 0.004124f, 0.006042f, 0.007603f, 0.009506f, 0.011299f, 0.013680f, - 0.015778f, 0.017883f, 0.020554f, 0.023102f, 0.025940f, 0.028946f, 0.031891f, 0.035431f, - 0.039825f, 0.043671f, 0.048157f, 0.053009f, 0.058075f, 0.063782f, 0.069885f, 0.077087f, - 0.084839f, 0.092712f, 0.101379f, 0.110779f, 0.121155f, 0.132446f, 0.144775f, 0.157837f, - 0.172363f, 0.187744f, 0.204590f, 0.222290f, 0.240601f, 0.260254f, 0.281494f, 0.303223f, - 0.325439f, 0.349609f, 0.373535f, 0.399170f, 0.424561f, 0.450439f, 0.475586f, 0.501953f, - 0.528320f, 0.554688f, 0.580566f, 0.605957f, 0.630859f, 0.656250f, 0.680176f, 0.704102f, - 0.727051f, 0.749512f, 0.895508f, 0.902344f, 0.903320f, 0.902832f, 0.901855f, 0.901855f, - 0.000842f, 0.002253f, 0.003597f, 0.005352f, 0.007195f, 0.008804f, 0.010460f, 0.012100f, - 0.014130f, 0.016281f, 0.018341f, 0.021057f, 0.023193f, 0.025742f, 0.029022f, 0.031830f, - 0.035278f, 0.039246f, 0.042999f, 0.047211f, 0.052032f, 0.056946f, 0.062744f, 0.068848f, - 0.075195f, 0.082642f, 0.090332f, 0.099060f, 0.108215f, 0.118469f, 0.129517f, 0.141724f, - 0.154907f, 0.169434f, 0.184448f, 0.201172f, 0.218506f, 0.237427f, 0.257324f, 0.278320f, - 0.300293f, 0.323242f, 0.347412f, 0.372070f, 0.397217f, 0.423340f, 0.449707f, 0.476807f, - 0.502930f, 0.529785f, 0.556641f, 0.582520f, 0.609863f, 0.635254f, 0.660645f, 0.686035f, - 0.710938f, 0.733887f, 0.889648f, 0.897461f, 0.898926f, 0.896973f, 0.896973f, 0.896484f, - 0.000660f, 0.002014f, 0.003531f, 0.004951f, 0.006424f, 0.007935f, 0.009392f, 0.011322f, - 0.012924f, 0.014824f, 0.016754f, 0.018906f, 0.020935f, 0.023376f, 0.026245f, 0.028809f, - 0.031860f, 0.034821f, 0.038330f, 0.042236f, 0.046387f, 0.050812f, 0.056061f, 0.061279f, - 0.066956f, 0.073547f, 0.080566f, 0.088074f, 0.096802f, 0.106079f, 0.116089f, 0.127075f, - 0.138672f, 0.151855f, 0.165649f, 0.180908f, 0.197754f, 0.215332f, 0.234375f, 0.254150f, - 0.275391f, 0.298096f, 0.321533f, 0.344971f, 0.370361f, 0.396973f, 0.422852f, 0.449219f, - 0.477295f, 0.504395f, 0.532227f, 0.558594f, 0.586914f, 0.614258f, 0.640625f, 0.666016f, - 0.692871f, 0.718262f, 0.882812f, 0.891602f, 0.892578f, 0.892090f, 0.892090f, 0.890625f, - 0.000623f, 0.002073f, 0.003298f, 0.004292f, 0.005589f, 0.007401f, 0.008377f, 0.010315f, - 0.011871f, 0.013596f, 0.015213f, 0.016632f, 0.018829f, 0.020920f, 0.023239f, 0.025726f, - 0.028381f, 0.031250f, 0.034241f, 0.037781f, 0.041473f, 0.045349f, 0.049469f, 0.054199f, - 0.059448f, 0.065186f, 0.071716f, 0.078613f, 0.085999f, 0.093872f, 0.103516f, 0.112976f, - 0.123840f, 0.135620f, 0.148804f, 0.162720f, 0.178223f, 0.194824f, 0.212280f, 0.231079f, - 0.251953f, 0.273193f, 0.295410f, 0.319580f, 0.343994f, 0.370117f, 0.396729f, 0.422852f, - 0.450684f, 0.478516f, 0.507324f, 0.534668f, 0.562988f, 0.591797f, 0.619629f, 0.646484f, - 0.674316f, 0.700195f, 0.875488f, 0.885254f, 0.886719f, 0.886719f, 0.885742f, 0.885254f, - 0.000583f, 0.001746f, 0.002840f, 0.004143f, 0.005234f, 0.006516f, 0.007835f, 0.009460f, - 0.010788f, 0.012062f, 0.013428f, 0.015053f, 0.017349f, 0.018753f, 0.021271f, 0.023163f, - 0.025284f, 0.027924f, 0.030655f, 0.033478f, 0.036957f, 0.040527f, 0.044037f, 0.048309f, - 0.053223f, 0.058319f, 0.063660f, 0.069763f, 0.076172f, 0.083679f, 0.091431f, 0.100647f, - 0.110229f, 0.120667f, 0.132690f, 0.145386f, 0.159668f, 0.174805f, 0.191284f, 0.208984f, - 0.228516f, 0.248535f, 0.270996f, 0.293701f, 0.317383f, 0.342529f, 0.369629f, 0.396240f, - 0.424072f, 0.452148f, 0.480957f, 0.509277f, 0.539551f, 0.567871f, 0.596680f, 0.625977f, - 0.654785f, 0.682129f, 0.868652f, 0.878906f, 0.880371f, 0.879883f, 0.879883f, 0.879395f, - 0.000535f, 0.001538f, 0.002930f, 0.003725f, 0.004986f, 0.005920f, 0.006973f, 0.008247f, - 0.009575f, 0.010841f, 0.012115f, 0.013550f, 0.015343f, 0.016983f, 0.018814f, 0.020523f, - 0.022568f, 0.024887f, 0.027206f, 0.029907f, 0.032959f, 0.035828f, 0.039185f, 0.042877f, - 0.046967f, 0.051605f, 0.056213f, 0.061432f, 0.067749f, 0.073730f, 0.081238f, 0.089111f, - 0.097656f, 0.107300f, 0.118042f, 0.129883f, 0.142334f, 0.156250f, 0.171875f, 0.187866f, - 0.206665f, 0.225708f, 0.246704f, 0.268799f, 0.291992f, 0.316650f, 0.342529f, 0.369629f, - 0.397217f, 0.425537f, 0.454590f, 0.484131f, 0.513672f, 0.544434f, 0.574219f, 0.604492f, - 0.633789f, 0.664062f, 0.861328f, 0.871582f, 0.873535f, 0.874512f, 0.873047f, 0.872559f, - 0.000581f, 0.001668f, 0.002563f, 0.003471f, 0.004494f, 0.005562f, 0.006580f, 0.007782f, - 0.008690f, 0.009766f, 0.011261f, 0.012314f, 0.013901f, 0.014969f, 0.016479f, 0.018265f, - 0.020294f, 0.022156f, 0.024353f, 0.026505f, 0.029053f, 0.031799f, 0.034607f, 0.037964f, - 0.041382f, 0.045471f, 0.049591f, 0.054047f, 0.059326f, 0.065186f, 0.071411f, 0.078735f, - 0.086304f, 0.094971f, 0.104126f, 0.114807f, 0.126587f, 0.138916f, 0.153564f, 0.169067f, - 0.185669f, 0.203613f, 0.223389f, 0.244629f, 0.266602f, 0.291260f, 0.316406f, 0.342773f, - 0.370361f, 0.398926f, 0.427734f, 0.458008f, 0.488770f, 0.520020f, 0.550293f, 0.582031f, - 0.613281f, 0.645020f, 0.854004f, 0.865234f, 0.866699f, 0.867188f, 0.866699f, 0.866699f, - 0.000571f, 0.001365f, 0.002483f, 0.003033f, 0.004120f, 0.005054f, 0.005981f, 0.006737f, - 0.007603f, 0.008675f, 0.009789f, 0.011078f, 0.012413f, 0.013626f, 0.014908f, 0.016174f, - 0.017792f, 0.019699f, 0.021591f, 0.023499f, 0.025635f, 0.028000f, 0.030533f, 0.033417f, - 0.036499f, 0.039948f, 0.043762f, 0.047943f, 0.052460f, 0.057465f, 0.062622f, 0.068848f, - 0.076111f, 0.083557f, 0.092102f, 0.101562f, 0.111816f, 0.123230f, 0.135864f, 0.150024f, - 0.165771f, 0.182373f, 0.200806f, 0.221191f, 0.242920f, 0.265869f, 0.290283f, 0.316406f, - 0.343262f, 0.371582f, 0.400879f, 0.431396f, 0.463623f, 0.494629f, 0.526367f, 0.558105f, - 0.591309f, 0.624023f, 0.845215f, 0.856934f, 0.859375f, 0.859375f, 0.859863f, 0.860352f, - 0.000411f, 0.001296f, 0.002012f, 0.002808f, 0.003754f, 0.004543f, 0.005215f, 0.006012f, - 0.006725f, 0.007851f, 0.008888f, 0.009979f, 0.010994f, 0.012009f, 0.013062f, 0.014549f, - 0.016113f, 0.017441f, 0.019073f, 0.020767f, 0.022598f, 0.024689f, 0.026764f, 0.029358f, - 0.032043f, 0.034760f, 0.038391f, 0.041779f, 0.045380f, 0.050110f, 0.055054f, 0.060394f, - 0.066650f, 0.073120f, 0.080688f, 0.089233f, 0.098450f, 0.108582f, 0.120178f, 0.133057f, - 0.146973f, 0.162354f, 0.179565f, 0.198364f, 0.218750f, 0.240967f, 0.264648f, 0.290039f, - 0.316650f, 0.344971f, 0.374023f, 0.404541f, 0.435791f, 0.467773f, 0.500977f, 0.535156f, - 0.569336f, 0.601562f, 0.836914f, 0.850098f, 0.852051f, 0.852539f, 0.852539f, 0.852051f, - 0.000408f, 0.001071f, 0.001857f, 0.002573f, 0.003338f, 0.004078f, 0.004692f, 0.005379f, - 0.006046f, 0.007275f, 0.007957f, 0.008606f, 0.009598f, 0.010864f, 0.011658f, 0.013084f, - 0.013977f, 0.015366f, 0.016724f, 0.018402f, 0.019669f, 0.021759f, 0.023697f, 0.025726f, - 0.027954f, 0.030640f, 0.033356f, 0.036530f, 0.039948f, 0.043701f, 0.047791f, 0.052704f, - 0.057770f, 0.063782f, 0.070129f, 0.077881f, 0.085999f, 0.095337f, 0.105591f, 0.116882f, - 0.130005f, 0.143921f, 0.159302f, 0.177246f, 0.196411f, 0.217163f, 0.239746f, 0.263916f, - 0.290039f, 0.317871f, 0.346924f, 0.377441f, 0.408936f, 0.442139f, 0.476074f, 0.509766f, - 0.545410f, 0.580078f, 0.828613f, 0.841309f, 0.843262f, 0.844238f, 0.843750f, 0.844238f, - 0.000322f, 0.001009f, 0.001674f, 0.002262f, 0.002949f, 0.003633f, 0.004250f, 0.004780f, - 0.005478f, 0.006256f, 0.007248f, 0.007919f, 0.008720f, 0.009552f, 0.010277f, 0.011391f, - 0.012291f, 0.013466f, 0.014786f, 0.015976f, 0.017288f, 0.019043f, 0.020477f, 0.022385f, - 0.024292f, 0.026276f, 0.029175f, 0.031769f, 0.034546f, 0.037842f, 0.041626f, 0.045868f, - 0.050293f, 0.055084f, 0.060669f, 0.067688f, 0.074585f, 0.083008f, 0.092102f, 0.102234f, - 0.113525f, 0.126587f, 0.140869f, 0.156860f, 0.174805f, 0.194214f, 0.215698f, 0.239014f, - 0.264404f, 0.291016f, 0.320068f, 0.350098f, 0.382080f, 0.414551f, 0.449463f, 0.485107f, - 0.520996f, 0.557617f, 0.818848f, 0.833496f, 0.836426f, 0.836914f, 0.836426f, 0.835938f, - 0.000483f, 0.000841f, 0.001632f, 0.002142f, 0.002678f, 0.003359f, 0.003830f, 0.004333f, - 0.005077f, 0.005527f, 0.006104f, 0.006908f, 0.007675f, 0.008392f, 0.009216f, 0.009789f, - 0.010880f, 0.011719f, 0.012817f, 0.013809f, 0.015068f, 0.016357f, 0.017883f, 0.019485f, - 0.021271f, 0.022995f, 0.025162f, 0.027359f, 0.029755f, 0.032806f, 0.036133f, 0.039459f, - 0.043091f, 0.047821f, 0.052368f, 0.058258f, 0.064514f, 0.071472f, 0.079224f, 0.088623f, - 0.098694f, 0.109924f, 0.123230f, 0.137817f, 0.154053f, 0.172363f, 0.192261f, 0.214478f, - 0.238647f, 0.265137f, 0.292725f, 0.322998f, 0.354492f, 0.387695f, 0.422363f, 0.458740f, - 0.495605f, 0.533691f, 0.809570f, 0.824219f, 0.826660f, 0.827148f, 0.828125f, 0.827148f, - 0.000240f, 0.000906f, 0.001379f, 0.001807f, 0.002495f, 0.002916f, 0.003490f, 0.004139f, - 0.004471f, 0.004898f, 0.005638f, 0.005978f, 0.006874f, 0.007313f, 0.007957f, 0.008698f, - 0.009560f, 0.010178f, 0.011345f, 0.012177f, 0.012985f, 0.014214f, 0.015274f, 0.016708f, - 0.017929f, 0.019882f, 0.021393f, 0.023560f, 0.025406f, 0.028137f, 0.030472f, 0.033752f, - 0.036896f, 0.040619f, 0.044952f, 0.049622f, 0.055298f, 0.061249f, 0.068420f, 0.075928f, - 0.084900f, 0.095398f, 0.107300f, 0.119934f, 0.134766f, 0.151733f, 0.170410f, 0.191284f, - 0.213867f, 0.238647f, 0.265869f, 0.295654f, 0.326660f, 0.359863f, 0.394775f, 0.432129f, - 0.469482f, 0.508789f, 0.798340f, 0.814941f, 0.817871f, 0.818359f, 0.818848f, 0.818848f, - 0.000376f, 0.000870f, 0.001291f, 0.001619f, 0.002251f, 0.002520f, 0.003016f, 0.003502f, - 0.004036f, 0.004299f, 0.004723f, 0.005234f, 0.005840f, 0.006512f, 0.006908f, 0.007595f, - 0.008003f, 0.008797f, 0.009773f, 0.010536f, 0.011284f, 0.012161f, 0.013237f, 0.014465f, - 0.015579f, 0.016968f, 0.018402f, 0.019882f, 0.021759f, 0.023621f, 0.026138f, 0.028488f, - 0.031738f, 0.034668f, 0.038239f, 0.042389f, 0.046783f, 0.052094f, 0.058319f, 0.064941f, - 0.072815f, 0.081726f, 0.092102f, 0.103516f, 0.117188f, 0.132202f, 0.149048f, 0.168091f, - 0.189941f, 0.213745f, 0.239990f, 0.268311f, 0.299316f, 0.332275f, 0.367188f, 0.403076f, - 0.442871f, 0.483398f, 0.788086f, 0.805176f, 0.808105f, 0.808594f, 0.809082f, 0.809082f, - 0.000386f, 0.000765f, 0.000998f, 0.001537f, 0.001833f, 0.002407f, 0.002529f, 0.003113f, - 0.003334f, 0.003841f, 0.004192f, 0.004585f, 0.005096f, 0.005543f, 0.006073f, 0.006405f, - 0.007118f, 0.007641f, 0.008278f, 0.008957f, 0.009651f, 0.010498f, 0.011307f, 0.012184f, - 0.013199f, 0.014343f, 0.015671f, 0.016678f, 0.018585f, 0.019852f, 0.021881f, 0.023987f, - 0.026398f, 0.029099f, 0.032227f, 0.035339f, 0.039246f, 0.043915f, 0.048859f, 0.054688f, - 0.061554f, 0.069519f, 0.078247f, 0.088379f, 0.100037f, 0.113770f, 0.129272f, 0.146606f, - 0.166626f, 0.189575f, 0.214111f, 0.241577f, 0.271973f, 0.304199f, 0.339844f, 0.375977f, - 0.415527f, 0.457275f, 0.776855f, 0.794434f, 0.797363f, 0.797852f, 0.798828f, 0.799316f, - 0.000232f, 0.000636f, 0.000996f, 0.001201f, 0.001721f, 0.002029f, 0.002340f, 0.002802f, - 0.003012f, 0.003462f, 0.003693f, 0.004059f, 0.004295f, 0.004822f, 0.005077f, 0.005623f, - 0.006126f, 0.006653f, 0.007027f, 0.007561f, 0.008049f, 0.008904f, 0.009399f, 0.010300f, - 0.011200f, 0.012115f, 0.013092f, 0.014221f, 0.015671f, 0.016891f, 0.018433f, 0.020294f, - 0.022064f, 0.024277f, 0.026688f, 0.029678f, 0.032654f, 0.036499f, 0.040955f, 0.045715f, - 0.051514f, 0.058014f, 0.065674f, 0.074707f, 0.084717f, 0.096802f, 0.111023f, 0.126709f, - 0.144775f, 0.165771f, 0.189209f, 0.215820f, 0.244385f, 0.275879f, 0.310547f, 0.348145f, - 0.387695f, 0.429932f, 0.765137f, 0.783203f, 0.787109f, 0.788574f, 0.788574f, 0.789551f, - 0.000171f, 0.000518f, 0.001106f, 0.001242f, 0.001475f, 0.001939f, 0.002092f, 0.002254f, - 0.002607f, 0.002930f, 0.003084f, 0.003382f, 0.003674f, 0.004040f, 0.004395f, 0.004780f, - 0.005157f, 0.005653f, 0.006088f, 0.006355f, 0.006870f, 0.007420f, 0.008057f, 0.008667f, - 0.009361f, 0.010040f, 0.011101f, 0.011803f, 0.012711f, 0.013962f, 0.015343f, 0.016586f, - 0.018036f, 0.020142f, 0.022079f, 0.024399f, 0.027023f, 0.030075f, 0.033569f, 0.037750f, - 0.042603f, 0.048096f, 0.054718f, 0.062134f, 0.071045f, 0.081299f, 0.093445f, 0.107605f, - 0.124268f, 0.142944f, 0.165405f, 0.189941f, 0.218262f, 0.249268f, 0.282227f, 0.319336f, - 0.359375f, 0.402832f, 0.752930f, 0.771973f, 0.775879f, 0.776855f, 0.777832f, 0.777832f, - 0.000204f, 0.000608f, 0.000865f, 0.001011f, 0.001362f, 0.001632f, 0.001817f, 0.001930f, - 0.002274f, 0.002491f, 0.002796f, 0.002932f, 0.003139f, 0.003429f, 0.003736f, 0.004055f, - 0.004448f, 0.004829f, 0.004971f, 0.005497f, 0.005859f, 0.006298f, 0.006741f, 0.007080f, - 0.007687f, 0.008308f, 0.009087f, 0.009880f, 0.010735f, 0.011528f, 0.012375f, 0.013664f, - 0.014862f, 0.016464f, 0.017868f, 0.019852f, 0.022156f, 0.024490f, 0.027435f, 0.030853f, - 0.034637f, 0.039154f, 0.044495f, 0.050964f, 0.058441f, 0.067383f, 0.077759f, 0.090332f, - 0.104797f, 0.121826f, 0.142334f, 0.164795f, 0.191528f, 0.221313f, 0.254150f, 0.290771f, - 0.330078f, 0.374268f, 0.740234f, 0.759277f, 0.763672f, 0.766113f, 0.766602f, 0.766113f, - 0.000150f, 0.000514f, 0.000666f, 0.000865f, 0.001163f, 0.001389f, 0.001540f, 0.001672f, - 0.001940f, 0.002110f, 0.002302f, 0.002419f, 0.002745f, 0.002974f, 0.003120f, 0.003366f, - 0.003695f, 0.003815f, 0.004173f, 0.004574f, 0.004879f, 0.005165f, 0.005646f, 0.006058f, - 0.006481f, 0.006969f, 0.007626f, 0.007881f, 0.008751f, 0.009445f, 0.010231f, 0.011246f, - 0.012222f, 0.013268f, 0.014641f, 0.015976f, 0.017792f, 0.019867f, 0.021912f, 0.024704f, - 0.027786f, 0.031494f, 0.036011f, 0.041229f, 0.047363f, 0.054962f, 0.063904f, 0.074463f, - 0.087036f, 0.102295f, 0.120483f, 0.141113f, 0.166260f, 0.194214f, 0.226196f, 0.261719f, - 0.301514f, 0.345459f, 0.727051f, 0.747070f, 0.751953f, 0.753418f, 0.754395f, 0.754883f, - 0.000103f, 0.000251f, 0.000628f, 0.000912f, 0.000978f, 0.001191f, 0.001365f, 0.001507f, - 0.001513f, 0.001757f, 0.001980f, 0.002121f, 0.002316f, 0.002373f, 0.002645f, 0.002909f, - 0.003012f, 0.003305f, 0.003538f, 0.003775f, 0.004070f, 0.004246f, 0.004642f, 0.004986f, - 0.005394f, 0.005802f, 0.006031f, 0.006565f, 0.006969f, 0.007618f, 0.008293f, 0.008980f, - 0.009766f, 0.010612f, 0.011528f, 0.012802f, 0.014198f, 0.015671f, 0.017517f, 0.019592f, - 0.021957f, 0.024918f, 0.028442f, 0.032562f, 0.037567f, 0.043762f, 0.051025f, 0.059753f, - 0.071045f, 0.084412f, 0.099792f, 0.119385f, 0.141846f, 0.167969f, 0.199341f, 0.233521f, - 0.272461f, 0.315674f, 0.712891f, 0.733887f, 0.738770f, 0.740234f, 0.741211f, 0.741699f, - 0.000185f, 0.000434f, 0.000489f, 0.000732f, 0.000874f, 0.000968f, 0.001122f, 0.001124f, - 0.001371f, 0.001423f, 0.001639f, 0.001693f, 0.001805f, 0.002094f, 0.002241f, 0.002356f, - 0.002567f, 0.002691f, 0.002871f, 0.003063f, 0.003195f, 0.003582f, 0.003790f, 0.004089f, - 0.004372f, 0.004536f, 0.005085f, 0.005314f, 0.005699f, 0.006153f, 0.006672f, 0.007202f, - 0.007805f, 0.008522f, 0.009216f, 0.010071f, 0.011086f, 0.012184f, 0.013596f, 0.015297f, - 0.017014f, 0.019363f, 0.021988f, 0.025299f, 0.029282f, 0.033936f, 0.040070f, 0.047028f, - 0.056519f, 0.067932f, 0.080872f, 0.098083f, 0.118469f, 0.143188f, 0.171753f, 0.205200f, - 0.243286f, 0.286133f, 0.698730f, 0.721680f, 0.725098f, 0.727051f, 0.728027f, 0.728516f, - 0.000116f, 0.000267f, 0.000565f, 0.000505f, 0.000648f, 0.000772f, 0.000813f, 0.001031f, - 0.001107f, 0.001184f, 0.001335f, 0.001391f, 0.001451f, 0.001633f, 0.001798f, 0.001874f, - 0.002090f, 0.002192f, 0.002392f, 0.002464f, 0.002707f, 0.002895f, 0.003044f, 0.003206f, - 0.003468f, 0.003666f, 0.003887f, 0.004261f, 0.004524f, 0.004898f, 0.005379f, 0.005711f, - 0.006130f, 0.006721f, 0.007267f, 0.007912f, 0.008659f, 0.009575f, 0.010475f, 0.011749f, - 0.013252f, 0.014717f, 0.016815f, 0.019302f, 0.022369f, 0.025955f, 0.030502f, 0.036285f, - 0.043579f, 0.052795f, 0.064453f, 0.078735f, 0.096497f, 0.118591f, 0.145508f, 0.177368f, - 0.213989f, 0.256592f, 0.683105f, 0.707031f, 0.710938f, 0.713379f, 0.714844f, 0.714844f, - 0.000223f, 0.000239f, 0.000286f, 0.000476f, 0.000580f, 0.000647f, 0.000715f, 0.000843f, - 0.000914f, 0.000950f, 0.001090f, 0.001163f, 0.001259f, 0.001328f, 0.001392f, 0.001560f, - 0.001549f, 0.001775f, 0.001868f, 0.001999f, 0.002199f, 0.002235f, 0.002436f, 0.002575f, - 0.002842f, 0.002892f, 0.003111f, 0.003401f, 0.003563f, 0.003887f, 0.004196f, 0.004505f, - 0.004791f, 0.005142f, 0.005684f, 0.006153f, 0.006710f, 0.007378f, 0.008064f, 0.008881f, - 0.009979f, 0.011177f, 0.012779f, 0.014435f, 0.016647f, 0.019150f, 0.022583f, 0.027252f, - 0.033051f, 0.040039f, 0.049561f, 0.061340f, 0.076843f, 0.096313f, 0.120544f, 0.150513f, - 0.185547f, 0.227173f, 0.668457f, 0.692383f, 0.696289f, 0.698242f, 0.699219f, 0.701172f, - 0.000000f, 0.000109f, 0.000315f, 0.000449f, 0.000511f, 0.000507f, 0.000538f, 0.000653f, - 0.000724f, 0.000749f, 0.000830f, 0.000893f, 0.001007f, 0.001079f, 0.001189f, 0.001163f, - 0.001335f, 0.001307f, 0.001502f, 0.001575f, 0.001627f, 0.001778f, 0.001933f, 0.002029f, - 0.002155f, 0.002254f, 0.002401f, 0.002535f, 0.002829f, 0.002943f, 0.003143f, 0.003422f, - 0.003710f, 0.003990f, 0.004318f, 0.004627f, 0.005108f, 0.005585f, 0.006142f, 0.006641f, - 0.007378f, 0.008354f, 0.009430f, 0.010628f, 0.012123f, 0.014015f, 0.016541f, 0.019836f, - 0.023849f, 0.029312f, 0.036774f, 0.046356f, 0.058868f, 0.075562f, 0.097107f, 0.124634f, - 0.157837f, 0.197754f, 0.653320f, 0.677734f, 0.682129f, 0.684082f, 0.685547f, 0.684570f, - 0.000166f, 0.000195f, 0.000256f, 0.000372f, 0.000386f, 0.000415f, 0.000515f, 0.000432f, - 0.000579f, 0.000606f, 0.000706f, 0.000745f, 0.000764f, 0.000837f, 0.000853f, 0.000993f, - 0.001034f, 0.001066f, 0.001156f, 0.001203f, 0.001339f, 0.001418f, 0.001470f, 0.001612f, - 0.001614f, 0.001707f, 0.001850f, 0.001986f, 0.002151f, 0.002254f, 0.002499f, 0.002560f, - 0.002794f, 0.003000f, 0.003212f, 0.003510f, 0.003761f, 0.004086f, 0.004475f, 0.004967f, - 0.005428f, 0.006134f, 0.006840f, 0.007786f, 0.008858f, 0.010033f, 0.011909f, 0.014137f, - 0.016907f, 0.020767f, 0.025894f, 0.033386f, 0.043274f, 0.056854f, 0.075439f, 0.099548f, - 0.130737f, 0.169434f, 0.634277f, 0.661133f, 0.667480f, 0.668945f, 0.669922f, 0.670898f, - 0.000115f, 0.000119f, 0.000230f, 0.000304f, 0.000221f, 0.000380f, 0.000322f, 0.000351f, - 0.000453f, 0.000527f, 0.000535f, 0.000558f, 0.000595f, 0.000675f, 0.000707f, 0.000670f, - 0.000776f, 0.000812f, 0.000839f, 0.000911f, 0.000974f, 0.001033f, 0.001082f, 0.001154f, - 0.001209f, 0.001268f, 0.001416f, 0.001432f, 0.001607f, 0.001775f, 0.001877f, 0.001911f, - 0.002041f, 0.002207f, 0.002380f, 0.002563f, 0.002741f, 0.002956f, 0.003281f, 0.003513f, - 0.003902f, 0.004353f, 0.004803f, 0.005405f, 0.006256f, 0.007072f, 0.008263f, 0.009659f, - 0.011627f, 0.014221f, 0.017792f, 0.022919f, 0.030075f, 0.040497f, 0.055878f, 0.076721f, - 0.104980f, 0.141357f, 0.618652f, 0.644531f, 0.650391f, 0.652832f, 0.653320f, 0.654785f, - 0.000000f, 0.000122f, 0.000142f, 0.000227f, 0.000248f, 0.000246f, 0.000296f, 0.000254f, - 0.000308f, 0.000329f, 0.000387f, 0.000437f, 0.000443f, 0.000504f, 0.000515f, 0.000535f, - 0.000566f, 0.000592f, 0.000618f, 0.000641f, 0.000706f, 0.000746f, 0.000787f, 0.000839f, - 0.000878f, 0.000920f, 0.001043f, 0.001041f, 0.001136f, 0.001199f, 0.001258f, 0.001393f, - 0.001428f, 0.001549f, 0.001632f, 0.001856f, 0.001945f, 0.002079f, 0.002310f, 0.002489f, - 0.002708f, 0.002996f, 0.003315f, 0.003759f, 0.004177f, 0.004803f, 0.005619f, 0.006527f, - 0.007793f, 0.009468f, 0.011917f, 0.015152f, 0.019897f, 0.027298f, 0.038910f, 0.055908f, - 0.080811f, 0.114563f, 0.600586f, 0.628906f, 0.634277f, 0.636719f, 0.637207f, 0.638672f, - 0.000000f, 0.000000f, 0.000106f, 0.000137f, 0.000172f, 0.000211f, 0.000189f, 0.000226f, - 0.000230f, 0.000248f, 0.000293f, 0.000251f, 0.000264f, 0.000321f, 0.000343f, 0.000399f, - 0.000368f, 0.000401f, 0.000499f, 0.000479f, 0.000498f, 0.000526f, 0.000550f, 0.000595f, - 0.000631f, 0.000645f, 0.000726f, 0.000717f, 0.000786f, 0.000902f, 0.000865f, 0.000916f, - 0.000989f, 0.001059f, 0.001165f, 0.001246f, 0.001279f, 0.001408f, 0.001566f, 0.001628f, - 0.001808f, 0.001991f, 0.002165f, 0.002466f, 0.002766f, 0.003084f, 0.003534f, 0.004250f, - 0.005016f, 0.006130f, 0.007584f, 0.009605f, 0.012718f, 0.017395f, 0.025131f, 0.038269f, - 0.058899f, 0.089661f, 0.582031f, 0.611328f, 0.616699f, 0.620117f, 0.621094f, 0.622559f, - 0.000000f, 0.000108f, 0.000104f, 0.000095f, 0.000117f, 0.000117f, 0.000122f, 0.000143f, - 0.000147f, 0.000164f, 0.000174f, 0.000216f, 0.000191f, 0.000227f, 0.000241f, 0.000250f, - 0.000257f, 0.000271f, 0.000301f, 0.000298f, 0.000317f, 0.000344f, 0.000370f, 0.000392f, - 0.000404f, 0.000427f, 0.000491f, 0.000491f, 0.000519f, 0.000535f, 0.000611f, 0.000601f, - 0.000668f, 0.000698f, 0.000767f, 0.000838f, 0.000865f, 0.000895f, 0.000993f, 0.001066f, - 0.001161f, 0.001242f, 0.001415f, 0.001521f, 0.001743f, 0.001901f, 0.002209f, 0.002523f, - 0.003038f, 0.003601f, 0.004478f, 0.005699f, 0.007545f, 0.010437f, 0.015175f, 0.023682f, - 0.039429f, 0.066406f, 0.563477f, 0.593262f, 0.598633f, 0.602051f, 0.602539f, 0.603516f, - 0.000000f, 0.000101f, 0.000093f, 0.000087f, 0.000082f, 0.000078f, 0.000084f, 0.000087f, - 0.000093f, 0.000094f, 0.000099f, 0.000104f, 0.000114f, 0.000123f, 0.000158f, 0.000163f, - 0.000166f, 0.000178f, 0.000177f, 0.000214f, 0.000191f, 0.000208f, 0.000212f, 0.000247f, - 0.000268f, 0.000263f, 0.000272f, 0.000287f, 0.000310f, 0.000336f, 0.000353f, 0.000368f, - 0.000396f, 0.000408f, 0.000453f, 0.000476f, 0.000511f, 0.000540f, 0.000615f, 0.000635f, - 0.000682f, 0.000751f, 0.000812f, 0.000908f, 0.000987f, 0.001116f, 0.001278f, 0.001431f, - 0.001702f, 0.002047f, 0.002512f, 0.003126f, 0.004181f, 0.005817f, 0.008553f, 0.013489f, - 0.023697f, 0.045288f, 0.544922f, 0.575684f, 0.581543f, 0.584473f, 0.585938f, 0.587402f, - 0.000109f, 0.000091f, 0.000081f, 0.000075f, 0.000070f, 0.000067f, 0.000064f, 0.000061f, - 0.000057f, 0.000054f, 0.000058f, 0.000075f, 0.000062f, 0.000064f, 0.000085f, 0.000068f, - 0.000092f, 0.000094f, 0.000103f, 0.000110f, 0.000113f, 0.000119f, 0.000141f, 0.000141f, - 0.000148f, 0.000152f, 0.000159f, 0.000164f, 0.000175f, 0.000188f, 0.000184f, 0.000218f, - 0.000233f, 0.000223f, 0.000253f, 0.000265f, 0.000282f, 0.000321f, 0.000322f, 0.000351f, - 0.000371f, 0.000405f, 0.000443f, 0.000478f, 0.000515f, 0.000571f, 0.000652f, 0.000733f, - 0.000856f, 0.001011f, 0.001227f, 0.001531f, 0.002029f, 0.002817f, 0.004215f, 0.006874f, - 0.012390f, 0.027405f, 0.525879f, 0.557129f, 0.563477f, 0.566895f, 0.568848f, 0.569824f, - 0.000094f, 0.000073f, 0.000065f, 0.000060f, 0.000055f, 0.000052f, 0.000049f, 0.000048f, - 0.000046f, 0.000045f, 0.000042f, 0.000040f, 0.000040f, 0.000037f, 0.000035f, 0.000035f, - 0.000042f, 0.000036f, 0.000049f, 0.000051f, 0.000055f, 0.000056f, 0.000059f, 0.000062f, - 0.000064f, 0.000078f, 0.000071f, 0.000079f, 0.000088f, 0.000091f, 0.000093f, 0.000099f, - 0.000103f, 0.000110f, 0.000125f, 0.000123f, 0.000127f, 0.000151f, 0.000151f, 0.000161f, - 0.000169f, 0.000179f, 0.000204f, 0.000219f, 0.000240f, 0.000267f, 0.000294f, 0.000321f, - 0.000378f, 0.000438f, 0.000524f, 0.000628f, 0.000818f, 0.001125f, 0.001693f, 0.002888f, - 0.005638f, 0.013580f, 0.505859f, 0.539062f, 0.544922f, 0.548340f, 0.550293f, 0.550781f, - 0.000064f, 0.000048f, 0.000041f, 0.000037f, 0.000035f, 0.000034f, 0.000032f, 0.000031f, - 0.000030f, 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f, - 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, 0.000019f, 0.000019f, 0.000023f, - 0.000021f, 0.000022f, 0.000026f, 0.000029f, 0.000032f, 0.000031f, 0.000036f, 0.000037f, - 0.000036f, 0.000044f, 0.000046f, 0.000048f, 0.000052f, 0.000054f, 0.000056f, 0.000061f, - 0.000070f, 0.000073f, 0.000076f, 0.000081f, 0.000082f, 0.000095f, 0.000105f, 0.000120f, - 0.000126f, 0.000143f, 0.000173f, 0.000203f, 0.000267f, 0.000346f, 0.000505f, 0.000853f, - 0.001829f, 0.005222f, 0.487061f, 0.519531f, 0.527344f, 0.529785f, 0.531738f, 0.532715f, - 0.000000f, 0.000002f, 0.000003f, 0.000004f, 0.000008f, 0.000008f, 0.000008f, 0.000010f, - 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, - 0.000012f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, - 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000010f, 0.000012f, 0.000012f, 0.000015f, - 0.000013f, 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000022f, 0.000024f, - 0.000026f, 0.000027f, 0.000034f, 0.000043f, 0.000049f, 0.000065f, 0.000089f, 0.000138f, - 0.000293f, 0.001143f, 0.466553f, 0.500488f, 0.508301f, 0.510742f, 0.512207f, 0.513672f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, - 0.000006f, 0.000023f, 0.446777f, 0.482178f, 0.489746f, 0.492676f, 0.494629f, 0.496094f, - }, - { - 0.032318f, 0.095032f, 0.152344f, 0.205322f, 0.254883f, 0.299316f, 0.342041f, 0.380859f, - 0.416504f, 0.449707f, 0.481201f, 0.508789f, 0.537109f, 0.562012f, 0.584961f, 0.608398f, - 0.628418f, 0.648926f, 0.666504f, 0.684570f, 0.701172f, 0.716797f, 0.731934f, 0.746094f, - 0.759766f, 0.770996f, 0.784668f, 0.795898f, 0.806641f, 0.817871f, 0.827637f, 0.837402f, - 0.846680f, 0.855469f, 0.863770f, 0.872559f, 0.879883f, 0.887695f, 0.895508f, 0.901367f, - 0.909180f, 0.915527f, 0.921387f, 0.927734f, 0.934082f, 0.939453f, 0.944824f, 0.950684f, - 0.955566f, 0.960449f, 0.965332f, 0.969238f, 0.974121f, 0.978516f, 0.982910f, 0.986816f, - 0.990723f, 0.994629f, 0.994629f, 0.987793f, 0.981934f, 0.976562f, 0.971680f, 0.966797f, - 0.025833f, 0.076965f, 0.125854f, 0.173096f, 0.217896f, 0.259766f, 0.299561f, 0.338135f, - 0.372559f, 0.407471f, 0.437500f, 0.468262f, 0.496582f, 0.522949f, 0.547852f, 0.571289f, - 0.593750f, 0.614746f, 0.633789f, 0.652832f, 0.671387f, 0.687988f, 0.705078f, 0.719727f, - 0.734863f, 0.749023f, 0.761719f, 0.774414f, 0.786621f, 0.797363f, 0.808594f, 0.818848f, - 0.829590f, 0.838867f, 0.848633f, 0.858398f, 0.865723f, 0.874512f, 0.881836f, 0.890137f, - 0.897949f, 0.904297f, 0.910645f, 0.917480f, 0.923828f, 0.929688f, 0.935547f, 0.941895f, - 0.947266f, 0.952637f, 0.957520f, 0.962402f, 0.967285f, 0.971680f, 0.976562f, 0.980957f, - 0.984863f, 0.989258f, 0.992676f, 0.985840f, 0.979980f, 0.975098f, 0.970703f, 0.966309f, - 0.020828f, 0.063049f, 0.104797f, 0.146606f, 0.187134f, 0.225464f, 0.263916f, 0.299072f, - 0.333252f, 0.366943f, 0.398438f, 0.429199f, 0.457031f, 0.484131f, 0.509766f, 0.534668f, - 0.559082f, 0.579590f, 0.600586f, 0.622070f, 0.640625f, 0.659180f, 0.676758f, 0.692383f, - 0.708984f, 0.722656f, 0.737793f, 0.751465f, 0.764648f, 0.776367f, 0.789062f, 0.801270f, - 0.811523f, 0.821289f, 0.832031f, 0.841309f, 0.850586f, 0.860352f, 0.868652f, 0.876953f, - 0.884766f, 0.892090f, 0.899902f, 0.906738f, 0.913086f, 0.920410f, 0.927246f, 0.933105f, - 0.938477f, 0.944336f, 0.950195f, 0.955078f, 0.959961f, 0.965332f, 0.970215f, 0.975098f, - 0.979492f, 0.983887f, 0.989746f, 0.983398f, 0.978516f, 0.973633f, 0.969238f, 0.964844f, - 0.017273f, 0.052429f, 0.088745f, 0.124207f, 0.160034f, 0.195068f, 0.230103f, 0.263916f, - 0.297119f, 0.329102f, 0.360596f, 0.390625f, 0.418945f, 0.446289f, 0.472656f, 0.498535f, - 0.521973f, 0.545898f, 0.567871f, 0.588867f, 0.609375f, 0.629395f, 0.646973f, 0.664551f, - 0.681641f, 0.698242f, 0.712402f, 0.727539f, 0.741699f, 0.755371f, 0.768555f, 0.780762f, - 0.792480f, 0.803711f, 0.814941f, 0.825195f, 0.834961f, 0.844727f, 0.854004f, 0.863281f, - 0.871094f, 0.879883f, 0.887695f, 0.895508f, 0.902832f, 0.909668f, 0.916504f, 0.923828f, - 0.929688f, 0.936035f, 0.941895f, 0.947754f, 0.952637f, 0.958496f, 0.963379f, 0.968750f, - 0.973633f, 0.978027f, 0.986816f, 0.980957f, 0.976562f, 0.972168f, 0.967285f, 0.963379f, - 0.014076f, 0.043915f, 0.074951f, 0.106140f, 0.137573f, 0.169189f, 0.201416f, 0.233154f, - 0.264648f, 0.295166f, 0.324707f, 0.354248f, 0.381836f, 0.410156f, 0.436279f, 0.462891f, - 0.487793f, 0.510742f, 0.534180f, 0.556152f, 0.576660f, 0.598145f, 0.616211f, 0.636719f, - 0.653320f, 0.670410f, 0.687500f, 0.703125f, 0.718262f, 0.733398f, 0.746582f, 0.760742f, - 0.772949f, 0.785156f, 0.796875f, 0.808105f, 0.818848f, 0.829590f, 0.838867f, 0.848145f, - 0.857910f, 0.867188f, 0.875977f, 0.883301f, 0.891602f, 0.899414f, 0.906738f, 0.913086f, - 0.919922f, 0.926270f, 0.932617f, 0.938477f, 0.944824f, 0.951660f, 0.957520f, 0.961914f, - 0.967285f, 0.972168f, 0.984863f, 0.979004f, 0.974609f, 0.970215f, 0.966309f, 0.961914f, - 0.012077f, 0.037445f, 0.063660f, 0.090881f, 0.118774f, 0.147827f, 0.176636f, 0.206055f, - 0.234253f, 0.262939f, 0.291504f, 0.320312f, 0.347168f, 0.374756f, 0.401367f, 0.427734f, - 0.451904f, 0.477051f, 0.500488f, 0.523438f, 0.545898f, 0.566406f, 0.587402f, 0.605957f, - 0.624512f, 0.643555f, 0.662109f, 0.676758f, 0.693848f, 0.708984f, 0.724609f, 0.738770f, - 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.800781f, 0.812500f, 0.823242f, 0.833984f, - 0.842773f, 0.853027f, 0.861816f, 0.871094f, 0.879395f, 0.887695f, 0.895508f, 0.903320f, - 0.910156f, 0.917969f, 0.924316f, 0.931152f, 0.937988f, 0.943848f, 0.949219f, 0.955566f, - 0.960449f, 0.966309f, 0.981445f, 0.977051f, 0.972168f, 0.968262f, 0.964355f, 0.960938f, - 0.010445f, 0.032562f, 0.054657f, 0.078613f, 0.103333f, 0.128540f, 0.153564f, 0.181274f, - 0.207520f, 0.234619f, 0.261475f, 0.288818f, 0.315674f, 0.342041f, 0.368408f, 0.394287f, - 0.418945f, 0.443604f, 0.467773f, 0.490479f, 0.512695f, 0.534180f, 0.555664f, 0.575684f, - 0.596191f, 0.616211f, 0.633301f, 0.651855f, 0.668457f, 0.685547f, 0.701172f, 0.714844f, - 0.729492f, 0.743652f, 0.758301f, 0.770996f, 0.783203f, 0.794922f, 0.806641f, 0.817383f, - 0.827637f, 0.838867f, 0.847656f, 0.857422f, 0.866699f, 0.875000f, 0.884277f, 0.892578f, - 0.900391f, 0.907227f, 0.914551f, 0.922363f, 0.929199f, 0.935059f, 0.941895f, 0.948242f, - 0.953125f, 0.959473f, 0.978516f, 0.974609f, 0.970215f, 0.966309f, 0.962402f, 0.958984f, - 0.009117f, 0.027466f, 0.047424f, 0.067871f, 0.089783f, 0.112244f, 0.135376f, 0.159668f, - 0.184082f, 0.209106f, 0.233887f, 0.259277f, 0.285400f, 0.311523f, 0.336182f, 0.360840f, - 0.385986f, 0.410889f, 0.435059f, 0.458252f, 0.480713f, 0.503418f, 0.524902f, 0.546387f, - 0.566895f, 0.586426f, 0.605469f, 0.624512f, 0.642578f, 0.659668f, 0.676758f, 0.692383f, - 0.708008f, 0.722168f, 0.736816f, 0.749512f, 0.763184f, 0.776855f, 0.789062f, 0.800781f, - 0.812012f, 0.823730f, 0.833496f, 0.843750f, 0.854004f, 0.863281f, 0.872559f, 0.880371f, - 0.889648f, 0.896973f, 0.905762f, 0.912598f, 0.919922f, 0.927734f, 0.934082f, 0.940918f, - 0.946289f, 0.952637f, 0.976074f, 0.972168f, 0.967773f, 0.963867f, 0.960938f, 0.957031f, - 0.007561f, 0.024231f, 0.041077f, 0.059631f, 0.078369f, 0.098145f, 0.119507f, 0.140747f, - 0.163208f, 0.185913f, 0.209839f, 0.233154f, 0.257324f, 0.281494f, 0.305908f, 0.330566f, - 0.354736f, 0.378906f, 0.402588f, 0.425781f, 0.449219f, 0.471924f, 0.494385f, 0.516602f, - 0.536621f, 0.557617f, 0.576660f, 0.596680f, 0.616211f, 0.632812f, 0.650879f, 0.668457f, - 0.684082f, 0.700684f, 0.715332f, 0.729492f, 0.744141f, 0.757812f, 0.771973f, 0.783691f, - 0.796387f, 0.807129f, 0.818359f, 0.829590f, 0.840820f, 0.850098f, 0.859375f, 0.868652f, - 0.877930f, 0.886719f, 0.894531f, 0.903320f, 0.910645f, 0.918945f, 0.925781f, 0.932617f, - 0.939453f, 0.945801f, 0.972656f, 0.969727f, 0.965820f, 0.961914f, 0.958496f, 0.955078f, - 0.006832f, 0.020676f, 0.036224f, 0.051758f, 0.069214f, 0.086609f, 0.105225f, 0.124146f, - 0.144653f, 0.165527f, 0.186646f, 0.209106f, 0.232178f, 0.254883f, 0.277588f, 0.301758f, - 0.325195f, 0.348633f, 0.371826f, 0.395264f, 0.418213f, 0.440674f, 0.463135f, 0.485596f, - 0.506348f, 0.527832f, 0.548340f, 0.567871f, 0.587891f, 0.606934f, 0.625977f, 0.642578f, - 0.660645f, 0.677734f, 0.692871f, 0.708008f, 0.723633f, 0.737793f, 0.752441f, 0.765137f, - 0.778320f, 0.791504f, 0.802734f, 0.814453f, 0.825684f, 0.835449f, 0.847168f, 0.856934f, - 0.866699f, 0.875488f, 0.884766f, 0.893066f, 0.901367f, 0.910156f, 0.917480f, 0.924805f, - 0.932129f, 0.938965f, 0.970215f, 0.966797f, 0.963379f, 0.959961f, 0.956543f, 0.953125f, - 0.006050f, 0.018585f, 0.031860f, 0.045807f, 0.060883f, 0.076538f, 0.093323f, 0.109985f, - 0.128174f, 0.147949f, 0.167480f, 0.186768f, 0.208496f, 0.230591f, 0.252441f, 0.274170f, - 0.297363f, 0.319824f, 0.342773f, 0.365723f, 0.388672f, 0.411133f, 0.433350f, 0.455811f, - 0.477295f, 0.498291f, 0.519531f, 0.539551f, 0.560059f, 0.580566f, 0.599121f, 0.617676f, - 0.635254f, 0.653320f, 0.669434f, 0.686523f, 0.702148f, 0.717773f, 0.732422f, 0.747070f, - 0.760742f, 0.773926f, 0.786621f, 0.798340f, 0.811035f, 0.822754f, 0.833008f, 0.843750f, - 0.854004f, 0.863770f, 0.873047f, 0.882812f, 0.891602f, 0.900879f, 0.908691f, 0.916504f, - 0.924316f, 0.931152f, 0.966309f, 0.964355f, 0.961426f, 0.957520f, 0.954102f, 0.951172f, - 0.005352f, 0.016388f, 0.027985f, 0.040222f, 0.053436f, 0.067261f, 0.082520f, 0.098022f, - 0.114319f, 0.131836f, 0.150146f, 0.167969f, 0.187744f, 0.208008f, 0.228271f, 0.249634f, - 0.270996f, 0.292969f, 0.314697f, 0.337158f, 0.359375f, 0.380859f, 0.403809f, 0.426025f, - 0.447510f, 0.469482f, 0.490967f, 0.511719f, 0.532227f, 0.552734f, 0.571777f, 0.591309f, - 0.609375f, 0.628418f, 0.645508f, 0.663086f, 0.680664f, 0.696289f, 0.711426f, 0.727051f, - 0.741699f, 0.755859f, 0.768555f, 0.782227f, 0.795410f, 0.807617f, 0.818359f, 0.830078f, - 0.841309f, 0.851074f, 0.861816f, 0.871582f, 0.880859f, 0.890625f, 0.898438f, 0.907715f, - 0.915527f, 0.923828f, 0.962402f, 0.961914f, 0.958496f, 0.955078f, 0.951172f, 0.948730f, - 0.004700f, 0.014397f, 0.025208f, 0.035675f, 0.047485f, 0.060120f, 0.073242f, 0.087097f, - 0.102173f, 0.117249f, 0.133789f, 0.150513f, 0.168823f, 0.186890f, 0.206665f, 0.225830f, - 0.246216f, 0.267334f, 0.288574f, 0.309814f, 0.331299f, 0.353271f, 0.375244f, 0.396729f, - 0.418701f, 0.440674f, 0.461182f, 0.483398f, 0.504883f, 0.524902f, 0.544434f, 0.564941f, - 0.584473f, 0.603027f, 0.621582f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.705566f, - 0.721680f, 0.736816f, 0.750977f, 0.764648f, 0.778809f, 0.791016f, 0.804688f, 0.815918f, - 0.826660f, 0.838867f, 0.850098f, 0.860840f, 0.870605f, 0.879883f, 0.889648f, 0.898438f, - 0.907227f, 0.915527f, 0.959961f, 0.958496f, 0.955078f, 0.952148f, 0.949219f, 0.946777f, - 0.004238f, 0.013138f, 0.022202f, 0.031769f, 0.042358f, 0.053040f, 0.065613f, 0.077637f, - 0.090759f, 0.104980f, 0.119995f, 0.135498f, 0.151855f, 0.167725f, 0.186646f, 0.205078f, - 0.224121f, 0.243042f, 0.263672f, 0.283936f, 0.305176f, 0.326416f, 0.347168f, 0.369629f, - 0.390625f, 0.411865f, 0.433350f, 0.454590f, 0.475830f, 0.497314f, 0.517578f, 0.537109f, - 0.557617f, 0.577637f, 0.596191f, 0.615723f, 0.632812f, 0.651367f, 0.668945f, 0.685059f, - 0.701172f, 0.716797f, 0.732422f, 0.747559f, 0.761230f, 0.775391f, 0.788574f, 0.800781f, - 0.813965f, 0.824707f, 0.837402f, 0.848145f, 0.859375f, 0.869141f, 0.879395f, 0.889160f, - 0.897949f, 0.906250f, 0.956055f, 0.955566f, 0.952148f, 0.950195f, 0.947266f, 0.943848f, - 0.003944f, 0.011490f, 0.019943f, 0.028748f, 0.037964f, 0.047485f, 0.058014f, 0.069702f, - 0.081360f, 0.093994f, 0.107361f, 0.121277f, 0.136353f, 0.151978f, 0.167480f, 0.185669f, - 0.202637f, 0.222168f, 0.240601f, 0.259766f, 0.279541f, 0.300293f, 0.321533f, 0.342285f, - 0.362549f, 0.384033f, 0.405762f, 0.427002f, 0.447998f, 0.469238f, 0.490479f, 0.510742f, - 0.532227f, 0.551758f, 0.570312f, 0.589844f, 0.609375f, 0.628418f, 0.645508f, 0.662598f, - 0.680664f, 0.696777f, 0.712402f, 0.728516f, 0.744141f, 0.757812f, 0.771973f, 0.785156f, - 0.798828f, 0.811523f, 0.824707f, 0.835449f, 0.847168f, 0.858887f, 0.869141f, 0.878906f, - 0.888672f, 0.897949f, 0.952148f, 0.952148f, 0.949219f, 0.946777f, 0.944336f, 0.941406f, - 0.003448f, 0.010574f, 0.017807f, 0.025558f, 0.033875f, 0.042633f, 0.052307f, 0.062134f, - 0.073059f, 0.084045f, 0.096375f, 0.109192f, 0.122803f, 0.136475f, 0.151367f, 0.167603f, - 0.183960f, 0.201416f, 0.218506f, 0.237427f, 0.256104f, 0.275635f, 0.295410f, 0.315918f, - 0.336426f, 0.357178f, 0.378906f, 0.399414f, 0.421143f, 0.442139f, 0.462891f, 0.484375f, - 0.504883f, 0.524902f, 0.544922f, 0.564941f, 0.583984f, 0.603516f, 0.622070f, 0.640625f, - 0.658691f, 0.675781f, 0.692871f, 0.709473f, 0.725098f, 0.740234f, 0.754883f, 0.769531f, - 0.783203f, 0.796875f, 0.809570f, 0.823242f, 0.834473f, 0.846191f, 0.857422f, 0.868164f, - 0.878906f, 0.889160f, 0.948730f, 0.948242f, 0.946289f, 0.944336f, 0.940918f, 0.938477f, - 0.003017f, 0.009422f, 0.015900f, 0.023041f, 0.030380f, 0.038574f, 0.047150f, 0.055969f, - 0.065735f, 0.075684f, 0.086426f, 0.098267f, 0.110535f, 0.123047f, 0.136841f, 0.151489f, - 0.166138f, 0.182495f, 0.198975f, 0.216553f, 0.233765f, 0.252930f, 0.271484f, 0.291016f, - 0.310547f, 0.331299f, 0.351562f, 0.372559f, 0.393555f, 0.415039f, 0.435059f, 0.457275f, - 0.477539f, 0.498047f, 0.519043f, 0.538574f, 0.559570f, 0.579102f, 0.598633f, 0.617188f, - 0.635742f, 0.654297f, 0.672363f, 0.688965f, 0.706055f, 0.721191f, 0.737793f, 0.752930f, - 0.768066f, 0.782227f, 0.795898f, 0.809082f, 0.821289f, 0.833496f, 0.846191f, 0.857422f, - 0.869141f, 0.879883f, 0.944824f, 0.945312f, 0.942871f, 0.940918f, 0.938477f, 0.936035f, - 0.002802f, 0.008575f, 0.014763f, 0.020844f, 0.027557f, 0.034576f, 0.042084f, 0.050476f, - 0.058990f, 0.067993f, 0.077942f, 0.087952f, 0.098999f, 0.111267f, 0.122803f, 0.136719f, - 0.150269f, 0.165527f, 0.180542f, 0.196533f, 0.213257f, 0.230591f, 0.248779f, 0.267334f, - 0.286865f, 0.306152f, 0.325928f, 0.346436f, 0.367188f, 0.387695f, 0.409424f, 0.429199f, - 0.450195f, 0.471680f, 0.492920f, 0.513184f, 0.534180f, 0.553711f, 0.573730f, 0.593750f, - 0.612793f, 0.631836f, 0.649414f, 0.668457f, 0.685059f, 0.703125f, 0.719238f, 0.735352f, - 0.750000f, 0.766113f, 0.781738f, 0.794434f, 0.808105f, 0.821777f, 0.833984f, 0.846191f, - 0.858398f, 0.870117f, 0.940918f, 0.941895f, 0.939941f, 0.937500f, 0.935059f, 0.932617f, - 0.002573f, 0.007603f, 0.013100f, 0.018799f, 0.024719f, 0.031372f, 0.038147f, 0.045105f, - 0.052795f, 0.061127f, 0.069519f, 0.079529f, 0.089355f, 0.099976f, 0.111084f, 0.123718f, - 0.136353f, 0.148926f, 0.163574f, 0.178345f, 0.194214f, 0.210083f, 0.227783f, 0.245361f, - 0.263672f, 0.282471f, 0.301758f, 0.321533f, 0.341797f, 0.361816f, 0.383057f, 0.403320f, - 0.424316f, 0.445557f, 0.466797f, 0.487061f, 0.507812f, 0.528809f, 0.549805f, 0.569336f, - 0.589844f, 0.608887f, 0.627930f, 0.646973f, 0.665527f, 0.682129f, 0.700195f, 0.717773f, - 0.732910f, 0.749512f, 0.765137f, 0.779785f, 0.794434f, 0.808105f, 0.821777f, 0.834473f, - 0.847168f, 0.859375f, 0.936523f, 0.937988f, 0.936035f, 0.933594f, 0.932129f, 0.929688f, - 0.002409f, 0.007107f, 0.011833f, 0.017075f, 0.022278f, 0.028351f, 0.034088f, 0.040558f, - 0.047943f, 0.055389f, 0.063232f, 0.072021f, 0.080322f, 0.090454f, 0.100220f, 0.111389f, - 0.122986f, 0.135010f, 0.148438f, 0.162109f, 0.176270f, 0.191772f, 0.207642f, 0.224121f, - 0.241699f, 0.259277f, 0.278076f, 0.297363f, 0.316650f, 0.336670f, 0.356934f, 0.377686f, - 0.397949f, 0.418701f, 0.439941f, 0.461914f, 0.482178f, 0.502930f, 0.524414f, 0.544922f, - 0.565918f, 0.585938f, 0.605957f, 0.625000f, 0.643066f, 0.662109f, 0.680176f, 0.698730f, - 0.715820f, 0.731934f, 0.748047f, 0.764648f, 0.780273f, 0.794434f, 0.808594f, 0.821777f, - 0.836914f, 0.848145f, 0.932129f, 0.934082f, 0.932617f, 0.930176f, 0.928711f, 0.926270f, - 0.002066f, 0.006329f, 0.010986f, 0.015541f, 0.020294f, 0.025452f, 0.030975f, 0.037201f, - 0.043152f, 0.049835f, 0.056824f, 0.064331f, 0.072998f, 0.081177f, 0.090637f, 0.100525f, - 0.110718f, 0.122131f, 0.134033f, 0.146851f, 0.159912f, 0.173584f, 0.189331f, 0.204468f, - 0.221191f, 0.237671f, 0.255615f, 0.273682f, 0.292969f, 0.312012f, 0.331543f, 0.352295f, - 0.372314f, 0.393311f, 0.413818f, 0.435547f, 0.456055f, 0.477539f, 0.499023f, 0.520508f, - 0.540039f, 0.561523f, 0.581543f, 0.602051f, 0.622070f, 0.641113f, 0.659668f, 0.678223f, - 0.697266f, 0.714844f, 0.731445f, 0.748535f, 0.765137f, 0.778809f, 0.794922f, 0.810059f, - 0.824219f, 0.837402f, 0.926758f, 0.930176f, 0.928711f, 0.926758f, 0.924805f, 0.922852f, - 0.001840f, 0.005703f, 0.009918f, 0.014099f, 0.018311f, 0.023026f, 0.028000f, 0.033508f, - 0.038971f, 0.045044f, 0.051880f, 0.058289f, 0.065796f, 0.073425f, 0.081482f, 0.090698f, - 0.100464f, 0.110413f, 0.121216f, 0.132812f, 0.145142f, 0.158203f, 0.171997f, 0.186401f, - 0.201538f, 0.217651f, 0.234497f, 0.251465f, 0.269287f, 0.288330f, 0.307129f, 0.327148f, - 0.346924f, 0.367920f, 0.388428f, 0.409668f, 0.430420f, 0.451416f, 0.474121f, 0.494873f, - 0.516113f, 0.537598f, 0.558105f, 0.579102f, 0.598633f, 0.619629f, 0.639160f, 0.657715f, - 0.677734f, 0.695801f, 0.713867f, 0.731934f, 0.748047f, 0.764160f, 0.781738f, 0.796875f, - 0.810547f, 0.826172f, 0.922363f, 0.925781f, 0.924805f, 0.922852f, 0.921387f, 0.919434f, - 0.001621f, 0.005188f, 0.008888f, 0.012939f, 0.016724f, 0.021271f, 0.025772f, 0.029984f, - 0.035553f, 0.040741f, 0.046417f, 0.052490f, 0.059265f, 0.066528f, 0.074097f, 0.081482f, - 0.090271f, 0.100220f, 0.109741f, 0.120178f, 0.131226f, 0.143188f, 0.156006f, 0.169189f, - 0.183716f, 0.198486f, 0.214233f, 0.230713f, 0.247925f, 0.265381f, 0.284424f, 0.303711f, - 0.322754f, 0.342773f, 0.363525f, 0.384277f, 0.405518f, 0.427002f, 0.447754f, 0.469727f, - 0.491455f, 0.512207f, 0.534180f, 0.554688f, 0.576172f, 0.597168f, 0.617188f, 0.636719f, - 0.657227f, 0.677734f, 0.695312f, 0.713379f, 0.731934f, 0.749512f, 0.766113f, 0.782715f, - 0.798340f, 0.813477f, 0.917480f, 0.920898f, 0.920410f, 0.919922f, 0.916992f, 0.915039f, - 0.001581f, 0.004616f, 0.008049f, 0.011917f, 0.015556f, 0.019547f, 0.023270f, 0.027908f, - 0.031860f, 0.036652f, 0.041992f, 0.047577f, 0.053528f, 0.060150f, 0.066772f, 0.073914f, - 0.082153f, 0.090088f, 0.099304f, 0.108887f, 0.118835f, 0.129517f, 0.141357f, 0.154297f, - 0.166992f, 0.180908f, 0.195557f, 0.210815f, 0.227173f, 0.244141f, 0.261963f, 0.279785f, - 0.299072f, 0.318359f, 0.338379f, 0.358887f, 0.380127f, 0.401123f, 0.422607f, 0.443848f, - 0.466309f, 0.487793f, 0.509277f, 0.530762f, 0.553223f, 0.573730f, 0.594727f, 0.616699f, - 0.636719f, 0.656250f, 0.676270f, 0.695801f, 0.713867f, 0.733398f, 0.750488f, 0.767090f, - 0.784180f, 0.801270f, 0.912598f, 0.916992f, 0.916504f, 0.914551f, 0.913086f, 0.911133f, - 0.001476f, 0.004410f, 0.007374f, 0.010620f, 0.013931f, 0.017258f, 0.021057f, 0.024979f, - 0.029144f, 0.033478f, 0.037872f, 0.042969f, 0.048737f, 0.053986f, 0.060150f, 0.066895f, - 0.074036f, 0.081665f, 0.089417f, 0.098083f, 0.107361f, 0.117371f, 0.127930f, 0.139648f, - 0.151489f, 0.164062f, 0.178589f, 0.192627f, 0.208130f, 0.223755f, 0.240601f, 0.258057f, - 0.275879f, 0.295654f, 0.314697f, 0.334961f, 0.354980f, 0.375977f, 0.396729f, 0.418945f, - 0.440430f, 0.462402f, 0.484619f, 0.506348f, 0.528809f, 0.550781f, 0.572266f, 0.593750f, - 0.615234f, 0.637207f, 0.656738f, 0.676758f, 0.696289f, 0.716309f, 0.734863f, 0.752930f, - 0.770508f, 0.788574f, 0.906738f, 0.911621f, 0.912109f, 0.910156f, 0.908691f, 0.907227f, - 0.001204f, 0.003998f, 0.006786f, 0.009850f, 0.012642f, 0.015762f, 0.019226f, 0.022751f, - 0.026749f, 0.030502f, 0.034698f, 0.038940f, 0.044006f, 0.048615f, 0.054352f, 0.060608f, - 0.066711f, 0.073059f, 0.080505f, 0.088318f, 0.097290f, 0.105835f, 0.115845f, 0.126343f, - 0.137085f, 0.148804f, 0.161377f, 0.175049f, 0.189331f, 0.204346f, 0.219604f, 0.236816f, - 0.253662f, 0.272217f, 0.291260f, 0.310547f, 0.330811f, 0.350830f, 0.372314f, 0.393799f, - 0.415771f, 0.437500f, 0.459717f, 0.481934f, 0.504883f, 0.527344f, 0.549316f, 0.571777f, - 0.593750f, 0.615723f, 0.636230f, 0.657715f, 0.678223f, 0.697754f, 0.718262f, 0.737793f, - 0.756348f, 0.774902f, 0.900879f, 0.907227f, 0.906738f, 0.905762f, 0.904297f, 0.902832f, - 0.001290f, 0.003807f, 0.006207f, 0.008652f, 0.011368f, 0.014618f, 0.017792f, 0.020813f, - 0.023849f, 0.027588f, 0.031036f, 0.035400f, 0.039917f, 0.044250f, 0.049408f, 0.054321f, - 0.059937f, 0.065918f, 0.072937f, 0.079773f, 0.087463f, 0.095703f, 0.104553f, 0.113892f, - 0.124146f, 0.134888f, 0.146606f, 0.159058f, 0.171753f, 0.185913f, 0.201416f, 0.216309f, - 0.232910f, 0.250000f, 0.268555f, 0.287354f, 0.306885f, 0.326904f, 0.347412f, 0.369141f, - 0.390381f, 0.412842f, 0.434570f, 0.457764f, 0.479736f, 0.502930f, 0.525879f, 0.547852f, - 0.570801f, 0.592773f, 0.615723f, 0.637207f, 0.659180f, 0.680176f, 0.700684f, 0.720703f, - 0.740234f, 0.759766f, 0.895996f, 0.901855f, 0.901855f, 0.900879f, 0.899414f, 0.897949f, - 0.001030f, 0.003561f, 0.005718f, 0.008301f, 0.010582f, 0.013283f, 0.015839f, 0.018753f, - 0.022156f, 0.025314f, 0.028427f, 0.032318f, 0.035889f, 0.040039f, 0.044434f, 0.048737f, - 0.054077f, 0.059723f, 0.065613f, 0.072083f, 0.079224f, 0.086426f, 0.094238f, 0.102966f, - 0.111938f, 0.122253f, 0.132568f, 0.143555f, 0.155884f, 0.168945f, 0.182861f, 0.197510f, - 0.213379f, 0.229492f, 0.246948f, 0.264648f, 0.283203f, 0.303467f, 0.322998f, 0.343994f, - 0.365479f, 0.387451f, 0.409912f, 0.432129f, 0.455078f, 0.478760f, 0.501465f, 0.523926f, - 0.547852f, 0.570801f, 0.593750f, 0.616211f, 0.639160f, 0.661133f, 0.682617f, 0.703613f, - 0.725098f, 0.745117f, 0.888672f, 0.896484f, 0.896973f, 0.895020f, 0.895508f, 0.893555f, - 0.001051f, 0.002956f, 0.005398f, 0.007523f, 0.009613f, 0.012024f, 0.014725f, 0.017059f, - 0.019714f, 0.022537f, 0.025681f, 0.029236f, 0.032715f, 0.036102f, 0.040100f, 0.043945f, - 0.048859f, 0.053772f, 0.058838f, 0.064880f, 0.070862f, 0.077576f, 0.084839f, 0.092712f, - 0.101013f, 0.110229f, 0.119446f, 0.130005f, 0.141113f, 0.153198f, 0.166016f, 0.179565f, - 0.193970f, 0.209351f, 0.225830f, 0.242920f, 0.261230f, 0.280273f, 0.299316f, 0.320068f, - 0.341309f, 0.363037f, 0.384521f, 0.407227f, 0.429443f, 0.453369f, 0.477051f, 0.500977f, - 0.524414f, 0.547852f, 0.571777f, 0.595215f, 0.619141f, 0.641602f, 0.664062f, 0.686035f, - 0.707520f, 0.729004f, 0.882812f, 0.891602f, 0.891113f, 0.890625f, 0.889160f, 0.888184f, - 0.000934f, 0.002998f, 0.004883f, 0.006859f, 0.009102f, 0.010925f, 0.012871f, 0.015656f, - 0.017853f, 0.020767f, 0.023422f, 0.026413f, 0.029251f, 0.032593f, 0.036011f, 0.039825f, - 0.044495f, 0.048645f, 0.053284f, 0.058258f, 0.063782f, 0.069885f, 0.076111f, 0.083313f, - 0.090881f, 0.099060f, 0.107788f, 0.117126f, 0.127075f, 0.138428f, 0.150391f, 0.162720f, - 0.176270f, 0.190796f, 0.206177f, 0.222290f, 0.239624f, 0.257568f, 0.276367f, 0.296387f, - 0.316895f, 0.338623f, 0.360352f, 0.382812f, 0.404785f, 0.428467f, 0.452148f, 0.476562f, - 0.500488f, 0.524902f, 0.548828f, 0.572754f, 0.597168f, 0.621094f, 0.644531f, 0.667480f, - 0.689941f, 0.712402f, 0.875977f, 0.883789f, 0.884766f, 0.884766f, 0.883301f, 0.883789f, - 0.001108f, 0.002474f, 0.004707f, 0.006248f, 0.007744f, 0.009888f, 0.011787f, 0.014244f, - 0.016205f, 0.018631f, 0.021286f, 0.023758f, 0.026535f, 0.029510f, 0.032654f, 0.035919f, - 0.039825f, 0.043762f, 0.047852f, 0.052368f, 0.057373f, 0.062561f, 0.068604f, 0.074707f, - 0.081360f, 0.088623f, 0.096802f, 0.105103f, 0.114624f, 0.124573f, 0.135498f, 0.147217f, - 0.159424f, 0.172729f, 0.187378f, 0.202881f, 0.219116f, 0.235962f, 0.254639f, 0.273438f, - 0.293945f, 0.314453f, 0.335449f, 0.358154f, 0.380371f, 0.403564f, 0.428223f, 0.452148f, - 0.476074f, 0.500977f, 0.525879f, 0.550293f, 0.575195f, 0.599609f, 0.625000f, 0.649414f, - 0.672852f, 0.695801f, 0.870117f, 0.879395f, 0.879883f, 0.879395f, 0.878906f, 0.877441f, - 0.000877f, 0.002495f, 0.003918f, 0.005669f, 0.007484f, 0.009148f, 0.010895f, 0.012634f, - 0.014717f, 0.017014f, 0.019302f, 0.021347f, 0.023849f, 0.026443f, 0.029388f, 0.032532f, - 0.035492f, 0.039185f, 0.042816f, 0.046906f, 0.051453f, 0.056122f, 0.061310f, 0.066895f, - 0.072937f, 0.079590f, 0.086548f, 0.094360f, 0.103027f, 0.111938f, 0.121643f, 0.132568f, - 0.144043f, 0.156006f, 0.169434f, 0.184204f, 0.199341f, 0.215698f, 0.233032f, 0.251221f, - 0.269531f, 0.290039f, 0.311768f, 0.333740f, 0.355957f, 0.379395f, 0.402344f, 0.426758f, - 0.451172f, 0.476562f, 0.501465f, 0.526855f, 0.552246f, 0.578613f, 0.603516f, 0.629395f, - 0.653809f, 0.679199f, 0.863281f, 0.872559f, 0.874023f, 0.873535f, 0.872559f, 0.871094f, - 0.000779f, 0.002241f, 0.003813f, 0.005371f, 0.006763f, 0.008186f, 0.009827f, 0.011574f, - 0.013260f, 0.015274f, 0.017303f, 0.019119f, 0.021362f, 0.023972f, 0.026505f, 0.029144f, - 0.031860f, 0.035126f, 0.038422f, 0.041809f, 0.045929f, 0.050323f, 0.054840f, 0.059631f, - 0.065002f, 0.070984f, 0.077759f, 0.084656f, 0.091736f, 0.100037f, 0.109436f, 0.118835f, - 0.129272f, 0.140625f, 0.152832f, 0.166138f, 0.180786f, 0.195679f, 0.211914f, 0.229736f, - 0.247803f, 0.267822f, 0.287598f, 0.309326f, 0.331055f, 0.354492f, 0.377686f, 0.401855f, - 0.426270f, 0.451660f, 0.477051f, 0.503418f, 0.529785f, 0.555664f, 0.583008f, 0.608887f, - 0.635254f, 0.661133f, 0.855957f, 0.865234f, 0.866699f, 0.867188f, 0.866211f, 0.865723f, - 0.000778f, 0.002155f, 0.003584f, 0.004871f, 0.006149f, 0.007519f, 0.008858f, 0.010498f, - 0.012100f, 0.013977f, 0.015511f, 0.017303f, 0.019363f, 0.021515f, 0.023880f, 0.026230f, - 0.028564f, 0.031555f, 0.034241f, 0.037476f, 0.041138f, 0.044983f, 0.048859f, 0.053436f, - 0.058014f, 0.063232f, 0.069214f, 0.075195f, 0.081848f, 0.089417f, 0.097168f, 0.106201f, - 0.115479f, 0.126343f, 0.137695f, 0.149658f, 0.162476f, 0.177002f, 0.192993f, 0.209473f, - 0.226440f, 0.245239f, 0.264404f, 0.285156f, 0.306885f, 0.330078f, 0.353271f, 0.376465f, - 0.402100f, 0.426758f, 0.453857f, 0.479492f, 0.505859f, 0.532715f, 0.560547f, 0.587402f, - 0.614258f, 0.640137f, 0.847168f, 0.858398f, 0.860352f, 0.859863f, 0.859863f, 0.858887f, - 0.000673f, 0.002026f, 0.003120f, 0.004242f, 0.005390f, 0.006874f, 0.008087f, 0.009346f, - 0.011192f, 0.012642f, 0.013855f, 0.015511f, 0.017502f, 0.019394f, 0.021301f, 0.023331f, - 0.025681f, 0.028137f, 0.030792f, 0.033295f, 0.036804f, 0.039917f, 0.043488f, 0.047363f, - 0.051880f, 0.056580f, 0.061646f, 0.066956f, 0.072998f, 0.079407f, 0.086609f, 0.094971f, - 0.103027f, 0.112793f, 0.122742f, 0.134399f, 0.146118f, 0.159058f, 0.173828f, 0.188599f, - 0.205444f, 0.223633f, 0.241943f, 0.262451f, 0.283203f, 0.304932f, 0.328369f, 0.352051f, - 0.376953f, 0.402100f, 0.428467f, 0.454834f, 0.481934f, 0.509766f, 0.537598f, 0.566406f, - 0.594238f, 0.622559f, 0.838867f, 0.852051f, 0.853516f, 0.853027f, 0.853027f, 0.852051f, - 0.000419f, 0.001721f, 0.003044f, 0.003881f, 0.005161f, 0.006329f, 0.007500f, 0.009117f, - 0.009941f, 0.011147f, 0.013023f, 0.014053f, 0.015869f, 0.017181f, 0.018906f, 0.020889f, - 0.023026f, 0.025085f, 0.027435f, 0.029724f, 0.032440f, 0.035492f, 0.038605f, 0.042175f, - 0.045898f, 0.049988f, 0.054504f, 0.059143f, 0.064697f, 0.070435f, 0.076721f, 0.083984f, - 0.091675f, 0.100037f, 0.109009f, 0.119629f, 0.130737f, 0.143066f, 0.156250f, 0.170654f, - 0.186157f, 0.202393f, 0.220825f, 0.239990f, 0.259521f, 0.281250f, 0.303467f, 0.327148f, - 0.351318f, 0.376953f, 0.402832f, 0.430664f, 0.458252f, 0.485596f, 0.514648f, 0.543457f, - 0.572754f, 0.602051f, 0.830566f, 0.844238f, 0.845703f, 0.845703f, 0.845703f, 0.845215f, - 0.000503f, 0.001644f, 0.002455f, 0.003765f, 0.004906f, 0.005901f, 0.006805f, 0.007744f, - 0.008789f, 0.009972f, 0.011314f, 0.012688f, 0.014160f, 0.015480f, 0.016953f, 0.018555f, - 0.020325f, 0.022232f, 0.024338f, 0.026535f, 0.028717f, 0.031403f, 0.034119f, 0.037384f, - 0.040680f, 0.044128f, 0.047943f, 0.052551f, 0.057098f, 0.062134f, 0.067871f, 0.074158f, - 0.081543f, 0.088684f, 0.097107f, 0.106262f, 0.116028f, 0.127563f, 0.139404f, 0.152344f, - 0.167358f, 0.182739f, 0.199951f, 0.217773f, 0.237427f, 0.257812f, 0.279541f, 0.303223f, - 0.327148f, 0.351807f, 0.377441f, 0.405518f, 0.433105f, 0.460449f, 0.491211f, 0.520020f, - 0.550293f, 0.581543f, 0.821777f, 0.835938f, 0.837891f, 0.838867f, 0.838867f, 0.837891f, - 0.000649f, 0.001432f, 0.002455f, 0.003469f, 0.004162f, 0.005192f, 0.006046f, 0.007053f, - 0.007919f, 0.009148f, 0.010185f, 0.011490f, 0.012558f, 0.013748f, 0.015083f, 0.016663f, - 0.018341f, 0.019897f, 0.021561f, 0.023376f, 0.025513f, 0.027725f, 0.030075f, 0.032745f, - 0.035583f, 0.038544f, 0.041901f, 0.045898f, 0.049896f, 0.054443f, 0.059784f, 0.065186f, - 0.071228f, 0.078247f, 0.085632f, 0.093872f, 0.103088f, 0.113098f, 0.123840f, 0.135986f, - 0.148682f, 0.163696f, 0.179321f, 0.196533f, 0.214722f, 0.234985f, 0.256104f, 0.278320f, - 0.302246f, 0.326660f, 0.352783f, 0.379395f, 0.406738f, 0.436279f, 0.465820f, 0.496338f, - 0.527344f, 0.559082f, 0.813477f, 0.827148f, 0.829590f, 0.830566f, 0.830566f, 0.829590f, - 0.000427f, 0.001431f, 0.002077f, 0.002947f, 0.004009f, 0.004860f, 0.005501f, 0.006416f, - 0.007008f, 0.008171f, 0.009155f, 0.010063f, 0.011154f, 0.012474f, 0.013336f, 0.014793f, - 0.016006f, 0.017471f, 0.019119f, 0.020630f, 0.022079f, 0.024078f, 0.026505f, 0.028687f, - 0.031128f, 0.033813f, 0.036804f, 0.040283f, 0.043732f, 0.047882f, 0.052094f, 0.057281f, - 0.062500f, 0.068726f, 0.075012f, 0.082581f, 0.090393f, 0.099487f, 0.109375f, 0.120728f, - 0.131958f, 0.145508f, 0.160278f, 0.176025f, 0.193848f, 0.212891f, 0.232788f, 0.253906f, - 0.277344f, 0.302002f, 0.327637f, 0.354248f, 0.382080f, 0.411621f, 0.441162f, 0.472656f, - 0.504395f, 0.536621f, 0.803223f, 0.818359f, 0.821777f, 0.821777f, 0.822266f, 0.821777f, - 0.000574f, 0.001416f, 0.001961f, 0.002621f, 0.003527f, 0.004250f, 0.004894f, 0.005653f, - 0.006340f, 0.007263f, 0.008255f, 0.008965f, 0.009819f, 0.010857f, 0.011864f, 0.012917f, - 0.014114f, 0.015358f, 0.016678f, 0.018005f, 0.019669f, 0.021347f, 0.023239f, 0.025070f, - 0.027267f, 0.029434f, 0.032318f, 0.035156f, 0.038269f, 0.041534f, 0.045624f, 0.049469f, - 0.054321f, 0.059479f, 0.065369f, 0.071655f, 0.078857f, 0.086853f, 0.095886f, 0.105652f, - 0.116943f, 0.128662f, 0.142090f, 0.156860f, 0.173096f, 0.190918f, 0.210327f, 0.231201f, - 0.253418f, 0.277100f, 0.302490f, 0.328369f, 0.356445f, 0.385254f, 0.415771f, 0.446533f, - 0.479736f, 0.513184f, 0.794434f, 0.810547f, 0.812500f, 0.813477f, 0.812988f, 0.813477f, - 0.000417f, 0.001152f, 0.002066f, 0.002480f, 0.003115f, 0.003778f, 0.004543f, 0.005001f, - 0.005936f, 0.006420f, 0.007130f, 0.007881f, 0.008789f, 0.009666f, 0.010605f, 0.011276f, - 0.012352f, 0.013367f, 0.014626f, 0.015732f, 0.017090f, 0.018509f, 0.020096f, 0.021759f, - 0.023895f, 0.025681f, 0.027740f, 0.030121f, 0.032776f, 0.036011f, 0.039276f, 0.042694f, - 0.046906f, 0.051575f, 0.056488f, 0.061951f, 0.068481f, 0.075684f, 0.083191f, 0.092102f, - 0.101990f, 0.112915f, 0.125122f, 0.138672f, 0.153564f, 0.170410f, 0.188477f, 0.208008f, - 0.229980f, 0.252441f, 0.276855f, 0.303711f, 0.331055f, 0.360596f, 0.391357f, 0.422607f, - 0.456299f, 0.490234f, 0.783203f, 0.799805f, 0.803223f, 0.804688f, 0.804199f, 0.805176f, - 0.000422f, 0.000885f, 0.001743f, 0.002075f, 0.002930f, 0.003460f, 0.004105f, 0.004696f, - 0.005257f, 0.005753f, 0.006550f, 0.006916f, 0.007805f, 0.008308f, 0.009109f, 0.010056f, - 0.010918f, 0.011627f, 0.012787f, 0.013725f, 0.014732f, 0.016113f, 0.017319f, 0.018906f, - 0.020264f, 0.022324f, 0.023911f, 0.026230f, 0.028183f, 0.030884f, 0.033661f, 0.036865f, - 0.040314f, 0.044189f, 0.048615f, 0.053284f, 0.058838f, 0.065491f, 0.072205f, 0.079651f, - 0.088379f, 0.098389f, 0.109314f, 0.121765f, 0.135010f, 0.150513f, 0.167358f, 0.186035f, - 0.206543f, 0.228516f, 0.252197f, 0.278320f, 0.305176f, 0.333496f, 0.364746f, 0.396973f, - 0.430176f, 0.465820f, 0.772949f, 0.790527f, 0.794434f, 0.794922f, 0.795410f, 0.794922f, - 0.000211f, 0.000970f, 0.001484f, 0.002035f, 0.002586f, 0.003040f, 0.003540f, 0.004086f, - 0.004696f, 0.005016f, 0.005508f, 0.006100f, 0.006763f, 0.007401f, 0.008011f, 0.008675f, - 0.009247f, 0.010071f, 0.011009f, 0.011940f, 0.012802f, 0.013870f, 0.014771f, 0.016281f, - 0.017487f, 0.018890f, 0.020584f, 0.022171f, 0.024200f, 0.026505f, 0.028870f, 0.031372f, - 0.034363f, 0.037659f, 0.041412f, 0.045685f, 0.050262f, 0.055664f, 0.061768f, 0.068359f, - 0.076172f, 0.084717f, 0.094666f, 0.105835f, 0.117798f, 0.131958f, 0.147095f, 0.164795f, - 0.184326f, 0.204956f, 0.228271f, 0.253174f, 0.279785f, 0.307861f, 0.338379f, 0.370361f, - 0.404785f, 0.440430f, 0.761230f, 0.780273f, 0.783691f, 0.785645f, 0.786133f, 0.785156f, - 0.000281f, 0.000954f, 0.001275f, 0.001745f, 0.002159f, 0.002810f, 0.003002f, 0.003622f, - 0.003918f, 0.004471f, 0.004776f, 0.005352f, 0.005852f, 0.006298f, 0.006989f, 0.007339f, - 0.008087f, 0.008698f, 0.009499f, 0.010208f, 0.010986f, 0.011871f, 0.012802f, 0.013809f, - 0.014923f, 0.016129f, 0.017624f, 0.018753f, 0.020645f, 0.022156f, 0.024399f, 0.026382f, - 0.029037f, 0.031769f, 0.034851f, 0.038513f, 0.042542f, 0.047180f, 0.052063f, 0.058136f, - 0.064819f, 0.072205f, 0.080933f, 0.090698f, 0.101685f, 0.114441f, 0.128784f, 0.144287f, - 0.162476f, 0.182617f, 0.203979f, 0.228149f, 0.253906f, 0.282227f, 0.312744f, 0.344482f, - 0.378418f, 0.415039f, 0.749023f, 0.770020f, 0.773438f, 0.774902f, 0.775391f, 0.776367f, - 0.000200f, 0.000790f, 0.001209f, 0.001475f, 0.002022f, 0.002375f, 0.002754f, 0.003136f, - 0.003532f, 0.003851f, 0.004253f, 0.004719f, 0.004864f, 0.005455f, 0.005749f, 0.006435f, - 0.007053f, 0.007557f, 0.007988f, 0.008614f, 0.009216f, 0.010101f, 0.010712f, 0.011604f, - 0.012596f, 0.013588f, 0.014877f, 0.016052f, 0.017334f, 0.018753f, 0.020401f, 0.022415f, - 0.024338f, 0.026642f, 0.029282f, 0.032196f, 0.035461f, 0.039215f, 0.043854f, 0.048706f, - 0.054413f, 0.060913f, 0.068237f, 0.076965f, 0.086792f, 0.097961f, 0.110657f, 0.125488f, - 0.141846f, 0.160278f, 0.180542f, 0.203857f, 0.229004f, 0.256348f, 0.286133f, 0.317627f, - 0.351807f, 0.388184f, 0.737305f, 0.757812f, 0.762695f, 0.763672f, 0.764160f, 0.764648f, - 0.000214f, 0.000700f, 0.001134f, 0.001480f, 0.001724f, 0.002056f, 0.002468f, 0.002672f, - 0.003069f, 0.003412f, 0.003618f, 0.003883f, 0.004265f, 0.004627f, 0.004971f, 0.005508f, - 0.005817f, 0.006397f, 0.006866f, 0.007244f, 0.007812f, 0.008446f, 0.009003f, 0.009872f, - 0.010544f, 0.011345f, 0.012375f, 0.013321f, 0.014275f, 0.015587f, 0.017075f, 0.018372f, - 0.020050f, 0.022186f, 0.024246f, 0.026596f, 0.029388f, 0.032562f, 0.036285f, 0.040344f, - 0.045197f, 0.050568f, 0.056946f, 0.064514f, 0.072876f, 0.082886f, 0.093933f, 0.107056f, - 0.122070f, 0.139404f, 0.158325f, 0.180176f, 0.204590f, 0.231201f, 0.260010f, 0.290771f, - 0.325195f, 0.361816f, 0.726074f, 0.747070f, 0.751465f, 0.753418f, 0.753906f, 0.754395f, - 0.000187f, 0.000637f, 0.001095f, 0.001133f, 0.001488f, 0.001872f, 0.002007f, 0.002253f, - 0.002590f, 0.002880f, 0.003010f, 0.003420f, 0.003593f, 0.003914f, 0.004322f, 0.004650f, - 0.005051f, 0.005424f, 0.005733f, 0.006134f, 0.006683f, 0.007183f, 0.007671f, 0.008072f, - 0.008720f, 0.009483f, 0.010201f, 0.011070f, 0.011871f, 0.012863f, 0.013924f, 0.015167f, - 0.016434f, 0.018143f, 0.019669f, 0.021851f, 0.024109f, 0.026749f, 0.029587f, 0.033020f, - 0.037109f, 0.041718f, 0.047119f, 0.053192f, 0.060516f, 0.068848f, 0.078857f, 0.090149f, - 0.104004f, 0.119202f, 0.136841f, 0.157471f, 0.180420f, 0.205322f, 0.234009f, 0.264648f, - 0.297852f, 0.335449f, 0.711914f, 0.735352f, 0.740234f, 0.741211f, 0.742676f, 0.742676f, - 0.000201f, 0.000676f, 0.000884f, 0.001044f, 0.001369f, 0.001633f, 0.001786f, 0.002001f, - 0.002237f, 0.002460f, 0.002680f, 0.002777f, 0.003117f, 0.003408f, 0.003632f, 0.003910f, - 0.004211f, 0.004375f, 0.004772f, 0.005226f, 0.005520f, 0.005909f, 0.006302f, 0.006882f, - 0.007385f, 0.007858f, 0.008553f, 0.008919f, 0.009827f, 0.010582f, 0.011398f, 0.012520f, - 0.013611f, 0.014725f, 0.016190f, 0.017593f, 0.019424f, 0.021622f, 0.023941f, 0.026703f, - 0.029938f, 0.033539f, 0.038055f, 0.043243f, 0.049408f, 0.056519f, 0.065002f, 0.074951f, - 0.086548f, 0.100403f, 0.116394f, 0.135132f, 0.156860f, 0.181030f, 0.208252f, 0.238281f, - 0.271240f, 0.307861f, 0.698730f, 0.722656f, 0.727539f, 0.729980f, 0.730957f, 0.730469f, - 0.000185f, 0.000371f, 0.000784f, 0.001028f, 0.001153f, 0.001304f, 0.001567f, 0.001792f, - 0.001790f, 0.002028f, 0.002283f, 0.002424f, 0.002640f, 0.002764f, 0.003044f, 0.003313f, - 0.003445f, 0.003748f, 0.004044f, 0.004337f, 0.004677f, 0.004879f, 0.005207f, 0.005661f, - 0.006027f, 0.006481f, 0.006870f, 0.007454f, 0.007874f, 0.008583f, 0.009239f, 0.009880f, - 0.010849f, 0.011871f, 0.012833f, 0.014153f, 0.015656f, 0.017151f, 0.018967f, 0.021118f, - 0.023621f, 0.026703f, 0.030197f, 0.034576f, 0.039368f, 0.045441f, 0.052460f, 0.061157f, - 0.070862f, 0.083069f, 0.097290f, 0.114441f, 0.134155f, 0.157104f, 0.182983f, 0.212158f, - 0.244507f, 0.281250f, 0.684570f, 0.710449f, 0.715332f, 0.717285f, 0.717773f, 0.718750f, - 0.000109f, 0.000455f, 0.000558f, 0.000757f, 0.000986f, 0.001166f, 0.001298f, 0.001310f, - 0.001566f, 0.001614f, 0.001852f, 0.001933f, 0.002062f, 0.002327f, 0.002571f, 0.002699f, - 0.002909f, 0.003057f, 0.003254f, 0.003496f, 0.003643f, 0.004066f, 0.004295f, 0.004665f, - 0.004822f, 0.005161f, 0.005722f, 0.006008f, 0.006424f, 0.006897f, 0.007435f, 0.008049f, - 0.008789f, 0.009529f, 0.010284f, 0.011177f, 0.012321f, 0.013466f, 0.014885f, 0.016586f, - 0.018417f, 0.020844f, 0.023575f, 0.026810f, 0.030655f, 0.035400f, 0.041412f, 0.048462f, - 0.056976f, 0.067322f, 0.079712f, 0.094543f, 0.112610f, 0.133789f, 0.158691f, 0.186279f, - 0.217896f, 0.253418f, 0.670898f, 0.696777f, 0.702148f, 0.704590f, 0.705078f, 0.705566f, - 0.000000f, 0.000317f, 0.000556f, 0.000619f, 0.000759f, 0.000889f, 0.001012f, 0.001163f, - 0.001282f, 0.001353f, 0.001531f, 0.001621f, 0.001681f, 0.001862f, 0.001976f, 0.002140f, - 0.002392f, 0.002502f, 0.002745f, 0.002838f, 0.003019f, 0.003311f, 0.003477f, 0.003639f, - 0.003889f, 0.004166f, 0.004429f, 0.004784f, 0.005119f, 0.005547f, 0.006042f, 0.006317f, - 0.006901f, 0.007442f, 0.008110f, 0.008751f, 0.009583f, 0.010590f, 0.011566f, 0.012894f, - 0.014404f, 0.015930f, 0.018158f, 0.020569f, 0.023697f, 0.027374f, 0.031830f, 0.037567f, - 0.044434f, 0.053009f, 0.063599f, 0.076538f, 0.092346f, 0.111511f, 0.134521f, 0.161133f, - 0.191772f, 0.227173f, 0.654297f, 0.684082f, 0.687988f, 0.690918f, 0.691895f, 0.691895f, - 0.000000f, 0.000275f, 0.000368f, 0.000572f, 0.000683f, 0.000731f, 0.000877f, 0.000979f, - 0.001039f, 0.001091f, 0.001234f, 0.001332f, 0.001447f, 0.001547f, 0.001601f, 0.001760f, - 0.001790f, 0.002007f, 0.002119f, 0.002245f, 0.002493f, 0.002565f, 0.002747f, 0.002920f, - 0.003168f, 0.003235f, 0.003551f, 0.003830f, 0.004040f, 0.004368f, 0.004658f, 0.005001f, - 0.005337f, 0.005798f, 0.006287f, 0.006794f, 0.007488f, 0.008087f, 0.008865f, 0.009773f, - 0.010963f, 0.012199f, 0.013649f, 0.015610f, 0.017822f, 0.020493f, 0.023849f, 0.028320f, - 0.033752f, 0.040466f, 0.049377f, 0.060028f, 0.073853f, 0.090698f, 0.111572f, 0.136841f, - 0.166016f, 0.199341f, 0.640137f, 0.667969f, 0.675781f, 0.676758f, 0.678223f, 0.678223f, - 0.000017f, 0.000193f, 0.000383f, 0.000487f, 0.000586f, 0.000597f, 0.000618f, 0.000733f, - 0.000826f, 0.000863f, 0.000902f, 0.001037f, 0.001121f, 0.001244f, 0.001342f, 0.001329f, - 0.001514f, 0.001506f, 0.001719f, 0.001793f, 0.001851f, 0.002016f, 0.002182f, 0.002281f, - 0.002432f, 0.002554f, 0.002708f, 0.002859f, 0.003168f, 0.003344f, 0.003563f, 0.003845f, - 0.004158f, 0.004478f, 0.004852f, 0.005154f, 0.005714f, 0.006207f, 0.006752f, 0.007370f, - 0.008186f, 0.009155f, 0.010193f, 0.011490f, 0.013016f, 0.015144f, 0.017517f, 0.020752f, - 0.024811f, 0.029922f, 0.036835f, 0.045593f, 0.056946f, 0.071533f, 0.090576f, 0.113159f, - 0.140991f, 0.173340f, 0.624023f, 0.653809f, 0.660156f, 0.663574f, 0.664551f, 0.664062f, - 0.000194f, 0.000227f, 0.000316f, 0.000451f, 0.000449f, 0.000482f, 0.000610f, 0.000511f, - 0.000654f, 0.000673f, 0.000804f, 0.000844f, 0.000880f, 0.000955f, 0.000961f, 0.001127f, - 0.001169f, 0.001210f, 0.001318f, 0.001330f, 0.001507f, 0.001592f, 0.001657f, 0.001771f, - 0.001839f, 0.001953f, 0.002083f, 0.002214f, 0.002399f, 0.002518f, 0.002815f, 0.002882f, - 0.003132f, 0.003361f, 0.003605f, 0.003925f, 0.004177f, 0.004528f, 0.004963f, 0.005527f, - 0.006027f, 0.006783f, 0.007381f, 0.008469f, 0.009644f, 0.010849f, 0.012772f, 0.014748f, - 0.017578f, 0.021332f, 0.026367f, 0.033142f, 0.042389f, 0.054413f, 0.070129f, 0.091064f, - 0.116943f, 0.147339f, 0.608887f, 0.640137f, 0.645996f, 0.647461f, 0.650391f, 0.651367f, - 0.000166f, 0.000146f, 0.000248f, 0.000320f, 0.000288f, 0.000446f, 0.000375f, 0.000407f, - 0.000468f, 0.000514f, 0.000629f, 0.000638f, 0.000681f, 0.000773f, 0.000806f, 0.000766f, - 0.000883f, 0.000927f, 0.000959f, 0.001036f, 0.001097f, 0.001172f, 0.001224f, 0.001297f, - 0.001392f, 0.001425f, 0.001592f, 0.001631f, 0.001793f, 0.001965f, 0.002089f, 0.002157f, - 0.002321f, 0.002495f, 0.002680f, 0.002874f, 0.003054f, 0.003305f, 0.003632f, 0.003902f, - 0.004314f, 0.004753f, 0.005306f, 0.005901f, 0.006828f, 0.007645f, 0.008896f, 0.010323f, - 0.012283f, 0.014816f, 0.018234f, 0.023010f, 0.029678f, 0.039276f, 0.052307f, 0.070190f, - 0.093811f, 0.123474f, 0.591797f, 0.623535f, 0.631348f, 0.633301f, 0.634766f, 0.635254f, - 0.000000f, 0.000154f, 0.000184f, 0.000257f, 0.000265f, 0.000266f, 0.000323f, 0.000291f, - 0.000369f, 0.000384f, 0.000450f, 0.000472f, 0.000505f, 0.000572f, 0.000577f, 0.000604f, - 0.000636f, 0.000675f, 0.000699f, 0.000736f, 0.000787f, 0.000840f, 0.000890f, 0.000945f, - 0.000988f, 0.001039f, 0.001165f, 0.001165f, 0.001266f, 0.001318f, 0.001410f, 0.001550f, - 0.001618f, 0.001743f, 0.001866f, 0.001997f, 0.002151f, 0.002319f, 0.002562f, 0.002779f, - 0.002975f, 0.003298f, 0.003674f, 0.004131f, 0.004604f, 0.005268f, 0.006065f, 0.007027f, - 0.008316f, 0.009949f, 0.012390f, 0.015526f, 0.019852f, 0.026733f, 0.036682f, 0.051666f, - 0.072449f, 0.099792f, 0.574707f, 0.608398f, 0.614746f, 0.618164f, 0.619629f, 0.621094f, - 0.000000f, 0.000008f, 0.000146f, 0.000181f, 0.000203f, 0.000243f, 0.000206f, 0.000250f, - 0.000257f, 0.000283f, 0.000335f, 0.000293f, 0.000304f, 0.000368f, 0.000373f, 0.000435f, - 0.000418f, 0.000468f, 0.000539f, 0.000540f, 0.000564f, 0.000598f, 0.000628f, 0.000657f, - 0.000716f, 0.000724f, 0.000797f, 0.000807f, 0.000883f, 0.001002f, 0.000974f, 0.001037f, - 0.001104f, 0.001196f, 0.001316f, 0.001394f, 0.001445f, 0.001574f, 0.001746f, 0.001829f, - 0.002005f, 0.002222f, 0.002401f, 0.002699f, 0.003057f, 0.003372f, 0.003874f, 0.004505f, - 0.005360f, 0.006500f, 0.007927f, 0.009972f, 0.012878f, 0.017258f, 0.024155f, 0.035339f, - 0.052795f, 0.077637f, 0.558105f, 0.592285f, 0.600586f, 0.602539f, 0.604004f, 0.605469f, - 0.000000f, 0.000107f, 0.000122f, 0.000093f, 0.000133f, 0.000142f, 0.000149f, 0.000174f, - 0.000174f, 0.000184f, 0.000190f, 0.000234f, 0.000214f, 0.000250f, 0.000273f, 0.000286f, - 0.000292f, 0.000302f, 0.000329f, 0.000336f, 0.000366f, 0.000391f, 0.000408f, 0.000444f, - 0.000452f, 0.000495f, 0.000531f, 0.000559f, 0.000578f, 0.000611f, 0.000659f, 0.000675f, - 0.000757f, 0.000771f, 0.000854f, 0.000906f, 0.000957f, 0.001004f, 0.001102f, 0.001187f, - 0.001267f, 0.001394f, 0.001546f, 0.001683f, 0.001922f, 0.002094f, 0.002420f, 0.002754f, - 0.003254f, 0.003878f, 0.004757f, 0.005997f, 0.007812f, 0.010544f, 0.014786f, 0.022324f, - 0.035522f, 0.057465f, 0.541504f, 0.576172f, 0.583984f, 0.585938f, 0.588379f, 0.590332f, - 0.000000f, 0.000099f, 0.000091f, 0.000084f, 0.000084f, 0.000086f, 0.000089f, 0.000101f, - 0.000105f, 0.000109f, 0.000122f, 0.000124f, 0.000132f, 0.000146f, 0.000171f, 0.000172f, - 0.000176f, 0.000198f, 0.000197f, 0.000239f, 0.000218f, 0.000235f, 0.000240f, 0.000281f, - 0.000309f, 0.000301f, 0.000312f, 0.000321f, 0.000347f, 0.000370f, 0.000387f, 0.000419f, - 0.000444f, 0.000458f, 0.000513f, 0.000536f, 0.000570f, 0.000607f, 0.000688f, 0.000703f, - 0.000754f, 0.000834f, 0.000890f, 0.000997f, 0.001100f, 0.001238f, 0.001410f, 0.001584f, - 0.001859f, 0.002207f, 0.002665f, 0.003323f, 0.004353f, 0.005947f, 0.008492f, 0.012909f, - 0.021606f, 0.039368f, 0.522461f, 0.559082f, 0.566406f, 0.569824f, 0.572266f, 0.572754f, - 0.000108f, 0.000089f, 0.000079f, 0.000072f, 0.000068f, 0.000065f, 0.000061f, 0.000057f, - 0.000061f, 0.000062f, 0.000063f, 0.000086f, 0.000070f, 0.000071f, 0.000095f, 0.000080f, - 0.000107f, 0.000113f, 0.000115f, 0.000124f, 0.000121f, 0.000130f, 0.000151f, 0.000154f, - 0.000164f, 0.000170f, 0.000176f, 0.000189f, 0.000193f, 0.000215f, 0.000211f, 0.000242f, - 0.000252f, 0.000260f, 0.000280f, 0.000293f, 0.000312f, 0.000350f, 0.000359f, 0.000389f, - 0.000410f, 0.000452f, 0.000481f, 0.000535f, 0.000578f, 0.000643f, 0.000718f, 0.000812f, - 0.000939f, 0.001107f, 0.001329f, 0.001644f, 0.002155f, 0.002930f, 0.004284f, 0.006706f, - 0.011452f, 0.023895f, 0.504395f, 0.542480f, 0.550293f, 0.553711f, 0.555664f, 0.557129f, - 0.000093f, 0.000072f, 0.000063f, 0.000058f, 0.000053f, 0.000050f, 0.000047f, 0.000046f, - 0.000044f, 0.000042f, 0.000039f, 0.000037f, 0.000042f, 0.000035f, 0.000036f, 0.000037f, - 0.000051f, 0.000046f, 0.000057f, 0.000058f, 0.000061f, 0.000062f, 0.000066f, 0.000069f, - 0.000072f, 0.000087f, 0.000077f, 0.000088f, 0.000093f, 0.000099f, 0.000103f, 0.000109f, - 0.000115f, 0.000122f, 0.000139f, 0.000134f, 0.000142f, 0.000170f, 0.000175f, 0.000179f, - 0.000192f, 0.000203f, 0.000228f, 0.000245f, 0.000265f, 0.000291f, 0.000326f, 0.000360f, - 0.000420f, 0.000481f, 0.000574f, 0.000686f, 0.000887f, 0.001203f, 0.001759f, 0.002892f, - 0.005318f, 0.011955f, 0.487305f, 0.524902f, 0.534180f, 0.538086f, 0.539551f, 0.540527f, - 0.000066f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000033f, 0.000032f, 0.000030f, - 0.000029f, 0.000028f, 0.000028f, 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f, - 0.000022f, 0.000021f, 0.000022f, 0.000023f, 0.000019f, 0.000018f, 0.000019f, 0.000024f, - 0.000026f, 0.000029f, 0.000032f, 0.000032f, 0.000036f, 0.000034f, 0.000040f, 0.000041f, - 0.000043f, 0.000049f, 0.000049f, 0.000050f, 0.000056f, 0.000059f, 0.000067f, 0.000067f, - 0.000074f, 0.000078f, 0.000082f, 0.000092f, 0.000094f, 0.000103f, 0.000120f, 0.000130f, - 0.000141f, 0.000163f, 0.000191f, 0.000230f, 0.000286f, 0.000374f, 0.000543f, 0.000890f, - 0.001802f, 0.004650f, 0.468994f, 0.507812f, 0.516602f, 0.520508f, 0.522461f, 0.523926f, - 0.000007f, 0.000008f, 0.000008f, 0.000008f, 0.000011f, 0.000010f, 0.000010f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000012f, - 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, - 0.000009f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000014f, 0.000013f, 0.000016f, - 0.000015f, 0.000018f, 0.000020f, 0.000021f, 0.000022f, 0.000025f, 0.000024f, 0.000025f, - 0.000030f, 0.000031f, 0.000040f, 0.000046f, 0.000052f, 0.000071f, 0.000099f, 0.000147f, - 0.000306f, 0.001072f, 0.450439f, 0.491211f, 0.499756f, 0.503418f, 0.505859f, 0.507324f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, - 0.000007f, 0.000024f, 0.432129f, 0.474121f, 0.482666f, 0.486572f, 0.489014f, 0.490234f, - }, - { - 0.027573f, 0.080750f, 0.130981f, 0.177734f, 0.222290f, 0.263672f, 0.302002f, 0.338623f, - 0.373291f, 0.405029f, 0.435791f, 0.464111f, 0.490967f, 0.516602f, 0.540039f, 0.563477f, - 0.584961f, 0.605469f, 0.625000f, 0.644043f, 0.660645f, 0.677246f, 0.693848f, 0.708496f, - 0.724121f, 0.738281f, 0.751465f, 0.764648f, 0.776855f, 0.789062f, 0.799805f, 0.810547f, - 0.821289f, 0.831055f, 0.840820f, 0.850098f, 0.859863f, 0.867676f, 0.876953f, 0.884277f, - 0.892578f, 0.900391f, 0.907227f, 0.914551f, 0.921875f, 0.928223f, 0.934082f, 0.940430f, - 0.946777f, 0.952637f, 0.957520f, 0.964355f, 0.968262f, 0.974121f, 0.979004f, 0.983887f, - 0.989258f, 0.994141f, 0.993164f, 0.983398f, 0.976074f, 0.969238f, 0.962891f, 0.957031f, - 0.022873f, 0.067871f, 0.111511f, 0.153809f, 0.193359f, 0.232788f, 0.268799f, 0.303223f, - 0.337402f, 0.368652f, 0.399414f, 0.427734f, 0.455078f, 0.481201f, 0.506348f, 0.529785f, - 0.552246f, 0.573242f, 0.593750f, 0.613281f, 0.632324f, 0.650391f, 0.667480f, 0.683105f, - 0.698730f, 0.713867f, 0.728516f, 0.741211f, 0.755371f, 0.767578f, 0.779785f, 0.791504f, - 0.803223f, 0.813477f, 0.823242f, 0.834473f, 0.843750f, 0.853027f, 0.861816f, 0.870605f, - 0.878906f, 0.887695f, 0.895996f, 0.901855f, 0.910645f, 0.917480f, 0.923828f, 0.930176f, - 0.937012f, 0.943359f, 0.949707f, 0.955078f, 0.960938f, 0.966797f, 0.972656f, 0.977051f, - 0.982422f, 0.987305f, 0.989746f, 0.981445f, 0.973633f, 0.967773f, 0.961426f, 0.956055f, - 0.019089f, 0.057007f, 0.095215f, 0.132202f, 0.168823f, 0.204712f, 0.238281f, 0.272217f, - 0.304688f, 0.334717f, 0.364502f, 0.392822f, 0.420898f, 0.446533f, 0.471924f, 0.495850f, - 0.518555f, 0.541992f, 0.562988f, 0.582520f, 0.602539f, 0.621094f, 0.639160f, 0.655762f, - 0.672852f, 0.687988f, 0.703613f, 0.718262f, 0.732422f, 0.746094f, 0.758789f, 0.771484f, - 0.783203f, 0.795898f, 0.807129f, 0.817383f, 0.827637f, 0.837402f, 0.846680f, 0.856445f, - 0.865234f, 0.874023f, 0.882324f, 0.890137f, 0.898438f, 0.905273f, 0.913574f, 0.920410f, - 0.927246f, 0.934082f, 0.940918f, 0.946777f, 0.953125f, 0.958496f, 0.964844f, 0.969727f, - 0.975586f, 0.980957f, 0.986816f, 0.979004f, 0.971680f, 0.965332f, 0.959961f, 0.954590f, - 0.016327f, 0.048676f, 0.081787f, 0.114807f, 0.147705f, 0.180176f, 0.211426f, 0.243652f, - 0.273438f, 0.303223f, 0.332031f, 0.360107f, 0.386963f, 0.412598f, 0.438477f, 0.462891f, - 0.487305f, 0.510254f, 0.530762f, 0.552246f, 0.572754f, 0.590820f, 0.610352f, 0.629883f, - 0.647461f, 0.662598f, 0.679688f, 0.693848f, 0.709961f, 0.723633f, 0.737305f, 0.750977f, - 0.763672f, 0.776367f, 0.788086f, 0.799316f, 0.810059f, 0.820801f, 0.832031f, 0.841309f, - 0.851074f, 0.860352f, 0.868652f, 0.877930f, 0.886230f, 0.894531f, 0.902832f, 0.910156f, - 0.916504f, 0.924316f, 0.930664f, 0.937500f, 0.943848f, 0.950684f, 0.957031f, 0.962891f, - 0.968262f, 0.974121f, 0.983887f, 0.976074f, 0.969727f, 0.963867f, 0.958496f, 0.953125f, - 0.013573f, 0.041901f, 0.070801f, 0.100098f, 0.129517f, 0.159058f, 0.187866f, 0.217041f, - 0.246216f, 0.274414f, 0.302002f, 0.328857f, 0.354980f, 0.381592f, 0.406738f, 0.431641f, - 0.455322f, 0.478271f, 0.500000f, 0.521484f, 0.541992f, 0.563477f, 0.583008f, 0.600098f, - 0.619141f, 0.636719f, 0.653320f, 0.671387f, 0.684570f, 0.699707f, 0.715332f, 0.729492f, - 0.743164f, 0.755371f, 0.768555f, 0.780762f, 0.792480f, 0.804199f, 0.814453f, 0.824707f, - 0.835449f, 0.845215f, 0.854980f, 0.864746f, 0.874023f, 0.882812f, 0.890137f, 0.898438f, - 0.905762f, 0.914062f, 0.921387f, 0.928223f, 0.935059f, 0.941406f, 0.948242f, 0.955078f, - 0.961426f, 0.966797f, 0.980957f, 0.973633f, 0.967773f, 0.961914f, 0.956543f, 0.951660f, - 0.011681f, 0.036316f, 0.061584f, 0.087524f, 0.113342f, 0.140259f, 0.167358f, 0.194214f, - 0.220947f, 0.247437f, 0.273926f, 0.300537f, 0.325684f, 0.351074f, 0.375732f, 0.400146f, - 0.423828f, 0.446533f, 0.469482f, 0.491943f, 0.512695f, 0.532715f, 0.553223f, 0.573242f, - 0.592285f, 0.609863f, 0.627930f, 0.644531f, 0.660156f, 0.676758f, 0.691406f, 0.706055f, - 0.720215f, 0.734863f, 0.749023f, 0.762207f, 0.774414f, 0.786133f, 0.797852f, 0.809082f, - 0.820801f, 0.831055f, 0.840332f, 0.850098f, 0.859863f, 0.869629f, 0.878418f, 0.886719f, - 0.895508f, 0.903809f, 0.910645f, 0.918945f, 0.925781f, 0.932617f, 0.939453f, 0.947754f, - 0.953613f, 0.958984f, 0.977539f, 0.970703f, 0.964844f, 0.959473f, 0.954102f, 0.949707f, - 0.010330f, 0.031525f, 0.053406f, 0.076538f, 0.100159f, 0.124084f, 0.148193f, 0.173096f, - 0.197998f, 0.223267f, 0.247681f, 0.273193f, 0.297607f, 0.322021f, 0.346924f, 0.370117f, - 0.394043f, 0.417236f, 0.439697f, 0.462158f, 0.483887f, 0.504883f, 0.524902f, 0.545410f, - 0.563477f, 0.583008f, 0.602539f, 0.618652f, 0.636230f, 0.652344f, 0.669922f, 0.685059f, - 0.699219f, 0.714355f, 0.729004f, 0.741211f, 0.755371f, 0.767578f, 0.780762f, 0.792480f, - 0.803711f, 0.815918f, 0.825195f, 0.836914f, 0.846191f, 0.855957f, 0.864746f, 0.874512f, - 0.883301f, 0.891602f, 0.900391f, 0.908203f, 0.916016f, 0.923828f, 0.931152f, 0.937988f, - 0.945801f, 0.952148f, 0.974121f, 0.967773f, 0.962891f, 0.957520f, 0.952637f, 0.947754f, - 0.009186f, 0.027359f, 0.047302f, 0.067505f, 0.088806f, 0.109924f, 0.132202f, 0.154907f, - 0.177246f, 0.201050f, 0.224121f, 0.247925f, 0.271240f, 0.295410f, 0.318359f, 0.341797f, - 0.365234f, 0.387939f, 0.410156f, 0.432861f, 0.454590f, 0.475586f, 0.495850f, 0.517090f, - 0.536621f, 0.556152f, 0.575195f, 0.592773f, 0.609863f, 0.628418f, 0.645020f, 0.661133f, - 0.677246f, 0.692383f, 0.707520f, 0.721191f, 0.735352f, 0.748047f, 0.762207f, 0.774414f, - 0.786621f, 0.798828f, 0.810547f, 0.820801f, 0.831543f, 0.842285f, 0.852539f, 0.862305f, - 0.871094f, 0.880859f, 0.889648f, 0.898438f, 0.906738f, 0.914551f, 0.921875f, 0.929199f, - 0.936035f, 0.944824f, 0.971191f, 0.965332f, 0.959473f, 0.955078f, 0.950195f, 0.945801f, - 0.008041f, 0.024384f, 0.041321f, 0.059631f, 0.078003f, 0.097656f, 0.117554f, 0.138428f, - 0.159912f, 0.181152f, 0.203003f, 0.224976f, 0.247070f, 0.269531f, 0.292480f, 0.314697f, - 0.337891f, 0.360352f, 0.382324f, 0.403809f, 0.426025f, 0.447998f, 0.468018f, 0.488770f, - 0.508301f, 0.528320f, 0.547852f, 0.567383f, 0.585449f, 0.603516f, 0.620605f, 0.637695f, - 0.654297f, 0.670410f, 0.686523f, 0.700195f, 0.715820f, 0.729980f, 0.743164f, 0.756836f, - 0.769531f, 0.782715f, 0.794434f, 0.805664f, 0.816895f, 0.827637f, 0.838379f, 0.848633f, - 0.859375f, 0.868164f, 0.877930f, 0.887695f, 0.895996f, 0.905273f, 0.912598f, 0.920898f, - 0.928711f, 0.936035f, 0.966797f, 0.962402f, 0.957031f, 0.952637f, 0.947754f, 0.943848f, - 0.007095f, 0.021515f, 0.036926f, 0.052704f, 0.069641f, 0.087463f, 0.105347f, 0.123413f, - 0.143188f, 0.163452f, 0.183105f, 0.204102f, 0.225220f, 0.246704f, 0.268066f, 0.290283f, - 0.311768f, 0.333740f, 0.355225f, 0.376465f, 0.397949f, 0.419434f, 0.440430f, 0.461670f, - 0.481445f, 0.500977f, 0.520020f, 0.540527f, 0.559570f, 0.578125f, 0.595703f, 0.613770f, - 0.630371f, 0.646973f, 0.663086f, 0.678223f, 0.694336f, 0.709473f, 0.723145f, 0.736328f, - 0.750000f, 0.764648f, 0.777344f, 0.790039f, 0.801270f, 0.812988f, 0.824707f, 0.834961f, - 0.846191f, 0.856934f, 0.865723f, 0.875977f, 0.884766f, 0.894531f, 0.903320f, 0.911621f, - 0.919922f, 0.927734f, 0.962891f, 0.959473f, 0.954102f, 0.949219f, 0.945312f, 0.941406f, - 0.006138f, 0.019150f, 0.033051f, 0.047089f, 0.061829f, 0.077515f, 0.094299f, 0.111084f, - 0.128174f, 0.146729f, 0.165771f, 0.185059f, 0.205200f, 0.224731f, 0.245361f, 0.265625f, - 0.286865f, 0.307861f, 0.328857f, 0.350098f, 0.370605f, 0.392090f, 0.413086f, 0.433594f, - 0.454346f, 0.474609f, 0.493896f, 0.513672f, 0.532227f, 0.552734f, 0.569824f, 0.588867f, - 0.605957f, 0.623047f, 0.640625f, 0.656738f, 0.672852f, 0.688477f, 0.703613f, 0.717773f, - 0.732910f, 0.746582f, 0.759766f, 0.772461f, 0.786621f, 0.798340f, 0.810059f, 0.820312f, - 0.832520f, 0.842773f, 0.853516f, 0.863770f, 0.873535f, 0.883789f, 0.892578f, 0.901367f, - 0.910645f, 0.919434f, 0.958984f, 0.955566f, 0.951172f, 0.946777f, 0.942871f, 0.938965f, - 0.005424f, 0.017059f, 0.029541f, 0.042023f, 0.055389f, 0.069397f, 0.083984f, 0.099670f, - 0.115601f, 0.132324f, 0.149292f, 0.167114f, 0.185547f, 0.204468f, 0.224121f, 0.243896f, - 0.262939f, 0.283691f, 0.304443f, 0.323486f, 0.345459f, 0.365479f, 0.386230f, 0.407471f, - 0.426758f, 0.448486f, 0.467529f, 0.487061f, 0.506348f, 0.526367f, 0.545410f, 0.563965f, - 0.581543f, 0.600098f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.682617f, 0.697754f, - 0.712891f, 0.727539f, 0.741211f, 0.755859f, 0.769043f, 0.782227f, 0.793945f, 0.806152f, - 0.818848f, 0.830566f, 0.840332f, 0.851074f, 0.861328f, 0.872070f, 0.881836f, 0.892090f, - 0.900879f, 0.910645f, 0.955566f, 0.952637f, 0.948730f, 0.943359f, 0.939941f, 0.935547f, - 0.004833f, 0.015442f, 0.026169f, 0.037689f, 0.049683f, 0.062164f, 0.075806f, 0.089539f, - 0.103760f, 0.119263f, 0.134888f, 0.151978f, 0.168335f, 0.186646f, 0.204102f, 0.223022f, - 0.242065f, 0.260986f, 0.280518f, 0.300537f, 0.320801f, 0.340820f, 0.360107f, 0.381104f, - 0.401367f, 0.421387f, 0.441650f, 0.460449f, 0.480957f, 0.500000f, 0.519531f, 0.538574f, - 0.557129f, 0.575684f, 0.593262f, 0.610840f, 0.628906f, 0.645508f, 0.662109f, 0.677246f, - 0.692871f, 0.708008f, 0.723145f, 0.738281f, 0.751465f, 0.766113f, 0.778320f, 0.791504f, - 0.802246f, 0.816406f, 0.827637f, 0.838867f, 0.850098f, 0.860352f, 0.871582f, 0.881348f, - 0.890137f, 0.899902f, 0.951660f, 0.948730f, 0.944824f, 0.940918f, 0.937012f, 0.933594f, - 0.004269f, 0.013809f, 0.023911f, 0.033569f, 0.044342f, 0.056213f, 0.068054f, 0.080811f, - 0.093933f, 0.107910f, 0.122131f, 0.137451f, 0.152710f, 0.169434f, 0.185791f, 0.203979f, - 0.221436f, 0.239990f, 0.257812f, 0.277344f, 0.296631f, 0.316162f, 0.335693f, 0.355713f, - 0.375244f, 0.395996f, 0.416016f, 0.436035f, 0.455078f, 0.474365f, 0.494629f, 0.513184f, - 0.532715f, 0.550781f, 0.569336f, 0.586914f, 0.604980f, 0.622559f, 0.639648f, 0.655762f, - 0.672363f, 0.688477f, 0.704102f, 0.718750f, 0.733887f, 0.747559f, 0.761230f, 0.775391f, - 0.788574f, 0.800781f, 0.814453f, 0.825684f, 0.837402f, 0.848633f, 0.859375f, 0.870605f, - 0.880371f, 0.891113f, 0.947754f, 0.945312f, 0.941895f, 0.937988f, 0.934082f, 0.931152f, - 0.004028f, 0.012581f, 0.021133f, 0.030396f, 0.039948f, 0.050323f, 0.061523f, 0.072815f, - 0.084961f, 0.096985f, 0.110535f, 0.124756f, 0.138916f, 0.153687f, 0.169800f, 0.185669f, - 0.202881f, 0.219116f, 0.237305f, 0.255615f, 0.273926f, 0.293213f, 0.311768f, 0.331055f, - 0.351074f, 0.370605f, 0.390381f, 0.409668f, 0.429688f, 0.449707f, 0.468994f, 0.487549f, - 0.506836f, 0.526367f, 0.545898f, 0.562988f, 0.581543f, 0.599121f, 0.616699f, 0.634766f, - 0.651367f, 0.667480f, 0.683594f, 0.699707f, 0.714844f, 0.730957f, 0.744141f, 0.758789f, - 0.772949f, 0.785645f, 0.799316f, 0.812500f, 0.823730f, 0.836914f, 0.847168f, 0.859375f, - 0.869629f, 0.880371f, 0.942383f, 0.941406f, 0.937500f, 0.934570f, 0.931152f, 0.927734f, - 0.003613f, 0.011391f, 0.018875f, 0.027679f, 0.036133f, 0.045624f, 0.055420f, 0.065491f, - 0.076416f, 0.088135f, 0.099487f, 0.112427f, 0.126099f, 0.139771f, 0.154419f, 0.169556f, - 0.184814f, 0.201050f, 0.218262f, 0.234985f, 0.252441f, 0.271484f, 0.289062f, 0.308594f, - 0.326660f, 0.346924f, 0.365234f, 0.384521f, 0.404541f, 0.424072f, 0.443359f, 0.463135f, - 0.482422f, 0.501953f, 0.521484f, 0.539551f, 0.558594f, 0.576660f, 0.595215f, 0.612793f, - 0.629883f, 0.647949f, 0.663574f, 0.679688f, 0.695801f, 0.711426f, 0.727539f, 0.741699f, - 0.757324f, 0.770996f, 0.785156f, 0.798828f, 0.811035f, 0.823730f, 0.835449f, 0.848145f, - 0.858887f, 0.870605f, 0.937988f, 0.937988f, 0.934570f, 0.931152f, 0.927734f, 0.924805f, - 0.003248f, 0.010185f, 0.017395f, 0.025055f, 0.032928f, 0.041321f, 0.049957f, 0.059265f, - 0.069092f, 0.079407f, 0.090820f, 0.101746f, 0.113770f, 0.126953f, 0.140381f, 0.154053f, - 0.168701f, 0.184082f, 0.199951f, 0.216431f, 0.232788f, 0.250000f, 0.267578f, 0.285645f, - 0.303955f, 0.322998f, 0.341553f, 0.361084f, 0.379150f, 0.399414f, 0.418701f, 0.437988f, - 0.457275f, 0.477051f, 0.496094f, 0.515137f, 0.534180f, 0.553223f, 0.571289f, 0.589844f, - 0.606934f, 0.625488f, 0.643066f, 0.659668f, 0.676758f, 0.692871f, 0.708984f, 0.725098f, - 0.740234f, 0.753906f, 0.769043f, 0.782227f, 0.796387f, 0.810059f, 0.822266f, 0.834961f, - 0.847168f, 0.859375f, 0.933594f, 0.933594f, 0.931152f, 0.927246f, 0.923828f, 0.921387f, - 0.002914f, 0.009361f, 0.015793f, 0.022659f, 0.029938f, 0.037354f, 0.045593f, 0.053406f, - 0.062988f, 0.072083f, 0.081665f, 0.092712f, 0.103943f, 0.114990f, 0.128174f, 0.140503f, - 0.153809f, 0.167725f, 0.182251f, 0.198242f, 0.213623f, 0.230225f, 0.246826f, 0.263672f, - 0.281494f, 0.300049f, 0.318604f, 0.337158f, 0.356201f, 0.374756f, 0.394531f, 0.413574f, - 0.433105f, 0.451904f, 0.471680f, 0.491211f, 0.509766f, 0.529297f, 0.547852f, 0.566895f, - 0.584961f, 0.603516f, 0.621094f, 0.638672f, 0.656738f, 0.673340f, 0.689453f, 0.706543f, - 0.722656f, 0.737793f, 0.752930f, 0.767578f, 0.781250f, 0.796875f, 0.809082f, 0.823242f, - 0.835449f, 0.847656f, 0.929199f, 0.929199f, 0.927246f, 0.923828f, 0.920898f, 0.917969f, - 0.002766f, 0.008736f, 0.014442f, 0.020691f, 0.027054f, 0.033905f, 0.040924f, 0.048645f, - 0.056976f, 0.065674f, 0.074951f, 0.084229f, 0.094116f, 0.105225f, 0.116333f, 0.127563f, - 0.139771f, 0.153564f, 0.166626f, 0.181030f, 0.196411f, 0.211182f, 0.227417f, 0.243896f, - 0.260742f, 0.277588f, 0.295898f, 0.314209f, 0.332031f, 0.351562f, 0.370117f, 0.389404f, - 0.408203f, 0.428223f, 0.447266f, 0.467041f, 0.486084f, 0.505859f, 0.524414f, 0.543945f, - 0.562012f, 0.581543f, 0.600098f, 0.617676f, 0.636230f, 0.654297f, 0.670898f, 0.687500f, - 0.704102f, 0.720703f, 0.736816f, 0.751465f, 0.766113f, 0.781738f, 0.796387f, 0.809082f, - 0.823242f, 0.835938f, 0.923828f, 0.925781f, 0.922852f, 0.920410f, 0.916992f, 0.914551f, - 0.002483f, 0.007599f, 0.013161f, 0.018555f, 0.024551f, 0.030670f, 0.037476f, 0.044464f, - 0.051636f, 0.059174f, 0.067688f, 0.075928f, 0.085693f, 0.095093f, 0.105591f, 0.116394f, - 0.127441f, 0.139648f, 0.152344f, 0.165527f, 0.179565f, 0.193970f, 0.208862f, 0.224487f, - 0.240356f, 0.256836f, 0.274658f, 0.291748f, 0.310059f, 0.328369f, 0.346680f, 0.365234f, - 0.384521f, 0.404297f, 0.423340f, 0.442139f, 0.462646f, 0.481445f, 0.500977f, 0.520020f, - 0.540039f, 0.559082f, 0.577148f, 0.596191f, 0.614746f, 0.632812f, 0.651367f, 0.669434f, - 0.685059f, 0.702637f, 0.718750f, 0.734375f, 0.750488f, 0.766113f, 0.780762f, 0.795410f, - 0.811035f, 0.823730f, 0.919434f, 0.920898f, 0.918457f, 0.916016f, 0.913086f, 0.910645f, - 0.002457f, 0.007114f, 0.011757f, 0.016708f, 0.022125f, 0.027786f, 0.033752f, 0.040375f, - 0.046661f, 0.053864f, 0.061584f, 0.069336f, 0.077515f, 0.086365f, 0.095947f, 0.105896f, - 0.116638f, 0.127075f, 0.138916f, 0.151245f, 0.164062f, 0.177490f, 0.191528f, 0.206177f, - 0.221802f, 0.237427f, 0.253906f, 0.270508f, 0.287842f, 0.305664f, 0.323730f, 0.342285f, - 0.361572f, 0.379639f, 0.399170f, 0.418457f, 0.438965f, 0.458252f, 0.477295f, 0.497559f, - 0.516113f, 0.536133f, 0.554688f, 0.574707f, 0.593750f, 0.612305f, 0.630859f, 0.648926f, - 0.666504f, 0.684082f, 0.701660f, 0.717773f, 0.734863f, 0.751465f, 0.766602f, 0.781738f, - 0.797852f, 0.812012f, 0.913086f, 0.916016f, 0.913574f, 0.911621f, 0.909180f, 0.906250f, - 0.002132f, 0.006493f, 0.010750f, 0.015717f, 0.020569f, 0.025604f, 0.030823f, 0.036682f, - 0.043060f, 0.049286f, 0.055786f, 0.062988f, 0.070557f, 0.078918f, 0.086914f, 0.096191f, - 0.105530f, 0.116028f, 0.126953f, 0.138306f, 0.149902f, 0.162231f, 0.175537f, 0.189453f, - 0.203491f, 0.218628f, 0.234131f, 0.250000f, 0.266602f, 0.284180f, 0.301514f, 0.319580f, - 0.338135f, 0.356689f, 0.375977f, 0.395020f, 0.413818f, 0.434082f, 0.452881f, 0.473145f, - 0.492920f, 0.512207f, 0.532227f, 0.552246f, 0.570801f, 0.591309f, 0.609375f, 0.629395f, - 0.646973f, 0.665527f, 0.683105f, 0.700684f, 0.717773f, 0.734863f, 0.751465f, 0.767578f, - 0.782715f, 0.799316f, 0.908203f, 0.911133f, 0.909180f, 0.907227f, 0.904785f, 0.902832f, - 0.001891f, 0.006008f, 0.010025f, 0.014122f, 0.018616f, 0.023239f, 0.028442f, 0.033691f, - 0.038757f, 0.044556f, 0.050964f, 0.057465f, 0.064087f, 0.071167f, 0.079224f, 0.087463f, - 0.096008f, 0.105591f, 0.115356f, 0.125488f, 0.136597f, 0.148193f, 0.160278f, 0.173218f, - 0.186768f, 0.200684f, 0.215332f, 0.231323f, 0.246338f, 0.262939f, 0.279785f, 0.297607f, - 0.314941f, 0.333984f, 0.353271f, 0.371094f, 0.391357f, 0.409668f, 0.430420f, 0.448975f, - 0.469482f, 0.489746f, 0.509277f, 0.528809f, 0.549316f, 0.568848f, 0.588379f, 0.607910f, - 0.626953f, 0.645996f, 0.664062f, 0.683105f, 0.700684f, 0.718262f, 0.735840f, 0.751953f, - 0.768555f, 0.785645f, 0.902344f, 0.906250f, 0.904785f, 0.902832f, 0.900391f, 0.898438f, - 0.001732f, 0.005573f, 0.009193f, 0.012932f, 0.017075f, 0.021286f, 0.025406f, 0.030289f, - 0.035675f, 0.040344f, 0.046326f, 0.052032f, 0.058411f, 0.064575f, 0.072205f, 0.079834f, - 0.087708f, 0.095947f, 0.104797f, 0.114380f, 0.124451f, 0.134888f, 0.146606f, 0.158691f, - 0.170776f, 0.184082f, 0.197510f, 0.212524f, 0.227417f, 0.243164f, 0.259521f, 0.276367f, - 0.293457f, 0.311768f, 0.329590f, 0.348633f, 0.367188f, 0.386230f, 0.406006f, 0.425781f, - 0.446533f, 0.465332f, 0.486084f, 0.505859f, 0.526367f, 0.545898f, 0.567383f, 0.585938f, - 0.605957f, 0.625977f, 0.645508f, 0.664551f, 0.683105f, 0.701172f, 0.718750f, 0.736816f, - 0.754395f, 0.770508f, 0.896484f, 0.900879f, 0.900391f, 0.897949f, 0.895996f, 0.894043f, - 0.001713f, 0.004684f, 0.008339f, 0.011818f, 0.015450f, 0.019409f, 0.023605f, 0.027832f, - 0.032349f, 0.036865f, 0.041809f, 0.047302f, 0.052673f, 0.058838f, 0.065613f, 0.072083f, - 0.079407f, 0.087280f, 0.095337f, 0.104126f, 0.113037f, 0.122986f, 0.133667f, 0.144897f, - 0.156250f, 0.168579f, 0.181396f, 0.195068f, 0.208984f, 0.224243f, 0.239624f, 0.255859f, - 0.272461f, 0.289551f, 0.307617f, 0.326172f, 0.344482f, 0.363770f, 0.383301f, 0.402588f, - 0.422607f, 0.443115f, 0.463135f, 0.483154f, 0.503418f, 0.523926f, 0.544434f, 0.564941f, - 0.584473f, 0.604980f, 0.624512f, 0.645508f, 0.664551f, 0.683594f, 0.701660f, 0.721191f, - 0.738281f, 0.755859f, 0.889648f, 0.895996f, 0.895020f, 0.893066f, 0.891602f, 0.889160f, - 0.001545f, 0.004745f, 0.007710f, 0.010979f, 0.014450f, 0.017807f, 0.021469f, 0.025238f, - 0.029282f, 0.033661f, 0.038177f, 0.043182f, 0.048157f, 0.053436f, 0.059326f, 0.065674f, - 0.072205f, 0.078857f, 0.086548f, 0.094604f, 0.102905f, 0.111816f, 0.121521f, 0.131592f, - 0.142334f, 0.153442f, 0.165894f, 0.178345f, 0.192139f, 0.205933f, 0.220703f, 0.236084f, - 0.251709f, 0.268555f, 0.285645f, 0.303467f, 0.321777f, 0.340332f, 0.359619f, 0.379150f, - 0.398682f, 0.419189f, 0.440430f, 0.460449f, 0.480957f, 0.501465f, 0.521973f, 0.543457f, - 0.563477f, 0.584961f, 0.604492f, 0.625488f, 0.645508f, 0.665039f, 0.684082f, 0.704102f, - 0.723145f, 0.741211f, 0.885254f, 0.890137f, 0.889160f, 0.887695f, 0.886719f, 0.884277f, - 0.001487f, 0.004356f, 0.006828f, 0.010162f, 0.012993f, 0.016022f, 0.019333f, 0.023087f, - 0.026886f, 0.030518f, 0.034668f, 0.039062f, 0.043671f, 0.048370f, 0.053741f, 0.059326f, - 0.065308f, 0.071655f, 0.078125f, 0.085693f, 0.093323f, 0.101807f, 0.110657f, 0.119507f, - 0.129517f, 0.140137f, 0.151367f, 0.163330f, 0.175781f, 0.188843f, 0.202759f, 0.217163f, - 0.232666f, 0.248413f, 0.264893f, 0.282227f, 0.299805f, 0.318115f, 0.336914f, 0.356445f, - 0.375488f, 0.395996f, 0.416504f, 0.436279f, 0.457520f, 0.479004f, 0.499023f, 0.520508f, - 0.541504f, 0.562988f, 0.583984f, 0.604492f, 0.625488f, 0.646973f, 0.666504f, 0.687012f, - 0.706055f, 0.725098f, 0.877441f, 0.885254f, 0.884766f, 0.882324f, 0.881836f, 0.880371f, - 0.001443f, 0.003807f, 0.006336f, 0.009171f, 0.011909f, 0.015007f, 0.018097f, 0.020905f, - 0.024384f, 0.027893f, 0.031555f, 0.035370f, 0.039581f, 0.044128f, 0.048889f, 0.053894f, - 0.059174f, 0.065125f, 0.070984f, 0.077698f, 0.084656f, 0.091919f, 0.100037f, 0.108093f, - 0.117493f, 0.127563f, 0.137817f, 0.148438f, 0.159912f, 0.172485f, 0.185547f, 0.199585f, - 0.213867f, 0.229248f, 0.244995f, 0.261230f, 0.278564f, 0.296387f, 0.314697f, 0.333252f, - 0.353271f, 0.372314f, 0.393311f, 0.413330f, 0.433594f, 0.455078f, 0.476318f, 0.497314f, - 0.519531f, 0.540527f, 0.562500f, 0.583496f, 0.605469f, 0.626953f, 0.648438f, 0.669434f, - 0.689941f, 0.709961f, 0.870605f, 0.878906f, 0.878418f, 0.877441f, 0.875488f, 0.873535f, - 0.001302f, 0.003712f, 0.005859f, 0.008286f, 0.010910f, 0.013779f, 0.016235f, 0.019135f, - 0.021912f, 0.025345f, 0.029022f, 0.032166f, 0.036011f, 0.040131f, 0.044128f, 0.048492f, - 0.053528f, 0.058533f, 0.064209f, 0.070129f, 0.076355f, 0.083191f, 0.090149f, 0.098328f, - 0.106628f, 0.115662f, 0.124817f, 0.134766f, 0.145630f, 0.157104f, 0.169678f, 0.182495f, - 0.195801f, 0.210205f, 0.225342f, 0.241455f, 0.257812f, 0.274902f, 0.292725f, 0.311035f, - 0.330322f, 0.349365f, 0.369873f, 0.390137f, 0.411133f, 0.432373f, 0.453369f, 0.474609f, - 0.496826f, 0.519043f, 0.541504f, 0.563477f, 0.585449f, 0.606445f, 0.629395f, 0.650391f, - 0.672363f, 0.693848f, 0.863281f, 0.872070f, 0.872070f, 0.871582f, 0.869629f, 0.868164f, - 0.001170f, 0.003151f, 0.005295f, 0.007812f, 0.010132f, 0.012466f, 0.015076f, 0.017517f, - 0.019943f, 0.023178f, 0.026443f, 0.029312f, 0.032471f, 0.036041f, 0.039978f, 0.044037f, - 0.048828f, 0.053070f, 0.057983f, 0.063232f, 0.068909f, 0.075378f, 0.081909f, 0.088745f, - 0.096375f, 0.104309f, 0.113281f, 0.122437f, 0.132202f, 0.142944f, 0.154419f, 0.166138f, - 0.178955f, 0.192505f, 0.206421f, 0.221558f, 0.237183f, 0.253906f, 0.270996f, 0.289062f, - 0.308105f, 0.326904f, 0.346924f, 0.366455f, 0.387695f, 0.408936f, 0.430176f, 0.451416f, - 0.474365f, 0.496582f, 0.518066f, 0.541016f, 0.563965f, 0.585938f, 0.608887f, 0.630859f, - 0.654297f, 0.675781f, 0.856934f, 0.865234f, 0.866211f, 0.864746f, 0.863281f, 0.862793f, - 0.001049f, 0.003254f, 0.005234f, 0.007263f, 0.009270f, 0.011307f, 0.013596f, 0.015869f, - 0.018555f, 0.020844f, 0.023972f, 0.026566f, 0.029739f, 0.033020f, 0.036316f, 0.039856f, - 0.044159f, 0.048096f, 0.052277f, 0.057281f, 0.062439f, 0.067871f, 0.073792f, 0.079956f, - 0.087158f, 0.094055f, 0.102234f, 0.110535f, 0.119934f, 0.129517f, 0.140259f, 0.151245f, - 0.162842f, 0.175537f, 0.189209f, 0.203369f, 0.218262f, 0.233643f, 0.250488f, 0.268066f, - 0.285645f, 0.304443f, 0.324219f, 0.343750f, 0.364014f, 0.385254f, 0.406494f, 0.428223f, - 0.450928f, 0.472656f, 0.495605f, 0.519043f, 0.541504f, 0.565918f, 0.588379f, 0.612305f, - 0.635742f, 0.659180f, 0.850098f, 0.859863f, 0.859863f, 0.858398f, 0.857910f, 0.856934f, - 0.000914f, 0.002861f, 0.004742f, 0.006569f, 0.008415f, 0.010521f, 0.012596f, 0.014648f, - 0.016708f, 0.019089f, 0.021515f, 0.023865f, 0.026688f, 0.029572f, 0.032928f, 0.036377f, - 0.039337f, 0.043365f, 0.047333f, 0.051544f, 0.056305f, 0.061066f, 0.066406f, 0.071960f, - 0.078247f, 0.084961f, 0.092163f, 0.099426f, 0.108215f, 0.116943f, 0.126831f, 0.136719f, - 0.148193f, 0.159302f, 0.171875f, 0.185669f, 0.199585f, 0.214478f, 0.230469f, 0.247070f, - 0.264160f, 0.282471f, 0.301270f, 0.321045f, 0.341553f, 0.362061f, 0.383545f, 0.404785f, - 0.427734f, 0.449951f, 0.473389f, 0.496582f, 0.520020f, 0.543457f, 0.568359f, 0.592285f, - 0.615723f, 0.639648f, 0.840820f, 0.851074f, 0.853027f, 0.853027f, 0.852051f, 0.850586f, - 0.000679f, 0.002518f, 0.004173f, 0.006149f, 0.008064f, 0.009369f, 0.011551f, 0.013222f, - 0.015175f, 0.017212f, 0.019592f, 0.021835f, 0.024048f, 0.026932f, 0.029846f, 0.032623f, - 0.035675f, 0.038940f, 0.042542f, 0.046295f, 0.050354f, 0.055054f, 0.059601f, 0.064880f, - 0.070190f, 0.076233f, 0.082703f, 0.089661f, 0.097229f, 0.105103f, 0.113831f, 0.123474f, - 0.133423f, 0.144409f, 0.156006f, 0.168335f, 0.182495f, 0.196411f, 0.211304f, 0.227295f, - 0.243530f, 0.260986f, 0.279053f, 0.298828f, 0.318359f, 0.339111f, 0.360107f, 0.381348f, - 0.403809f, 0.427490f, 0.449463f, 0.473633f, 0.497803f, 0.521484f, 0.546875f, 0.570801f, - 0.595703f, 0.620605f, 0.833008f, 0.845215f, 0.845703f, 0.845703f, 0.845215f, 0.843750f, - 0.000719f, 0.002470f, 0.003975f, 0.005337f, 0.007275f, 0.008713f, 0.010376f, 0.012032f, - 0.013580f, 0.015793f, 0.017609f, 0.019501f, 0.021530f, 0.024277f, 0.026657f, 0.029312f, - 0.031982f, 0.035187f, 0.038086f, 0.041565f, 0.045288f, 0.049103f, 0.053436f, 0.058136f, - 0.062927f, 0.068054f, 0.073853f, 0.080383f, 0.087341f, 0.094666f, 0.102173f, 0.111084f, - 0.120300f, 0.130859f, 0.141235f, 0.152954f, 0.164429f, 0.178223f, 0.192749f, 0.207642f, - 0.223145f, 0.239868f, 0.258301f, 0.276611f, 0.295654f, 0.316162f, 0.337402f, 0.358643f, - 0.380859f, 0.403320f, 0.427002f, 0.450684f, 0.474609f, 0.499756f, 0.523926f, 0.550781f, - 0.575195f, 0.600586f, 0.824707f, 0.836914f, 0.838379f, 0.838867f, 0.837402f, 0.837402f, - 0.000683f, 0.002361f, 0.003649f, 0.005116f, 0.006416f, 0.008202f, 0.009460f, 0.010941f, - 0.012817f, 0.014099f, 0.015839f, 0.017593f, 0.019867f, 0.021988f, 0.023926f, 0.026276f, - 0.028824f, 0.031311f, 0.034363f, 0.036957f, 0.040375f, 0.043823f, 0.047546f, 0.051758f, - 0.056183f, 0.061249f, 0.066162f, 0.071777f, 0.077942f, 0.084534f, 0.091553f, 0.099487f, - 0.107910f, 0.116882f, 0.127075f, 0.137451f, 0.148804f, 0.161499f, 0.174805f, 0.188721f, - 0.203735f, 0.220093f, 0.237427f, 0.254639f, 0.273926f, 0.293457f, 0.313965f, 0.334961f, - 0.357666f, 0.379883f, 0.403076f, 0.427002f, 0.451660f, 0.476807f, 0.501953f, 0.527344f, - 0.553711f, 0.581055f, 0.815918f, 0.829102f, 0.831055f, 0.831055f, 0.831055f, 0.830566f, - 0.000607f, 0.001863f, 0.003416f, 0.004528f, 0.005943f, 0.007191f, 0.008781f, 0.009964f, - 0.011337f, 0.012939f, 0.014458f, 0.015808f, 0.018051f, 0.019394f, 0.021332f, 0.023529f, - 0.025803f, 0.028168f, 0.030502f, 0.033020f, 0.036072f, 0.039032f, 0.042419f, 0.046082f, - 0.049927f, 0.054321f, 0.058411f, 0.063538f, 0.069336f, 0.075684f, 0.081787f, 0.088562f, - 0.096436f, 0.104553f, 0.113281f, 0.123596f, 0.133667f, 0.145386f, 0.157471f, 0.171021f, - 0.185547f, 0.200562f, 0.216553f, 0.234619f, 0.251709f, 0.271240f, 0.291504f, 0.312012f, - 0.333496f, 0.355957f, 0.379395f, 0.403076f, 0.428223f, 0.453857f, 0.479492f, 0.506348f, - 0.532715f, 0.560059f, 0.805664f, 0.820801f, 0.823730f, 0.822754f, 0.822754f, 0.822266f, - 0.000593f, 0.001862f, 0.002966f, 0.004341f, 0.005600f, 0.006516f, 0.007626f, 0.008995f, - 0.010223f, 0.011292f, 0.012848f, 0.014427f, 0.016098f, 0.017532f, 0.019165f, 0.021027f, - 0.022842f, 0.024918f, 0.027115f, 0.029739f, 0.032013f, 0.034637f, 0.037506f, 0.040955f, - 0.044220f, 0.048065f, 0.051941f, 0.056305f, 0.061768f, 0.066528f, 0.072327f, 0.078979f, - 0.085571f, 0.092834f, 0.101135f, 0.110229f, 0.119690f, 0.130127f, 0.141602f, 0.153564f, - 0.167114f, 0.181763f, 0.196899f, 0.213623f, 0.230957f, 0.249268f, 0.268555f, 0.289062f, - 0.310059f, 0.333252f, 0.355957f, 0.379883f, 0.404541f, 0.430176f, 0.456055f, 0.483887f, - 0.510254f, 0.539062f, 0.797852f, 0.812988f, 0.814941f, 0.815430f, 0.815918f, 0.814453f, - 0.000556f, 0.001811f, 0.002998f, 0.003815f, 0.004658f, 0.005905f, 0.007099f, 0.008232f, - 0.009239f, 0.010483f, 0.011559f, 0.013016f, 0.014305f, 0.015671f, 0.017090f, 0.018646f, - 0.020370f, 0.022369f, 0.024124f, 0.026062f, 0.028458f, 0.030624f, 0.033264f, 0.036041f, - 0.039307f, 0.042053f, 0.045807f, 0.049530f, 0.054016f, 0.058441f, 0.063904f, 0.069641f, - 0.075745f, 0.082520f, 0.089539f, 0.097717f, 0.106750f, 0.116150f, 0.126587f, 0.137817f, - 0.150024f, 0.163452f, 0.177490f, 0.193359f, 0.209717f, 0.227539f, 0.246704f, 0.266602f, - 0.287598f, 0.309326f, 0.332520f, 0.355713f, 0.380371f, 0.406494f, 0.432861f, 0.459961f, - 0.488525f, 0.517090f, 0.787598f, 0.804199f, 0.806641f, 0.807617f, 0.807617f, 0.807129f, - 0.000507f, 0.001697f, 0.002468f, 0.003351f, 0.004425f, 0.005486f, 0.006325f, 0.007412f, - 0.008156f, 0.009270f, 0.010239f, 0.011497f, 0.012520f, 0.013954f, 0.015182f, 0.016617f, - 0.018036f, 0.019714f, 0.021362f, 0.022934f, 0.024704f, 0.026886f, 0.029419f, 0.031525f, - 0.034302f, 0.037292f, 0.040558f, 0.043701f, 0.047577f, 0.051849f, 0.056183f, 0.061249f, - 0.066467f, 0.072876f, 0.078918f, 0.086548f, 0.094116f, 0.102844f, 0.112427f, 0.122620f, - 0.133667f, 0.146362f, 0.159668f, 0.174438f, 0.190063f, 0.207153f, 0.225098f, 0.244263f, - 0.264648f, 0.286377f, 0.308350f, 0.332275f, 0.357178f, 0.382080f, 0.408936f, 0.436035f, - 0.465820f, 0.495361f, 0.776855f, 0.794922f, 0.797852f, 0.799316f, 0.798828f, 0.798340f, - 0.000366f, 0.001644f, 0.002289f, 0.003046f, 0.004082f, 0.005032f, 0.005550f, 0.006599f, - 0.007389f, 0.008369f, 0.009201f, 0.010315f, 0.011276f, 0.012405f, 0.013466f, 0.014587f, - 0.015991f, 0.017303f, 0.018692f, 0.020081f, 0.021851f, 0.023865f, 0.025726f, 0.027771f, - 0.030136f, 0.032532f, 0.035309f, 0.038422f, 0.041626f, 0.045044f, 0.048767f, 0.053375f, - 0.057861f, 0.063477f, 0.069031f, 0.075684f, 0.082336f, 0.090515f, 0.099182f, 0.107849f, - 0.118958f, 0.130005f, 0.142212f, 0.156128f, 0.170898f, 0.186890f, 0.203857f, 0.222534f, - 0.241821f, 0.263428f, 0.285156f, 0.308105f, 0.332275f, 0.359131f, 0.385010f, 0.413086f, - 0.441895f, 0.472168f, 0.767090f, 0.785645f, 0.789062f, 0.789551f, 0.790527f, 0.789551f, - 0.000340f, 0.001434f, 0.002129f, 0.002827f, 0.003696f, 0.004463f, 0.005112f, 0.005730f, - 0.006836f, 0.007465f, 0.008217f, 0.008972f, 0.009972f, 0.010887f, 0.011948f, 0.012794f, - 0.013947f, 0.015030f, 0.016266f, 0.017670f, 0.019165f, 0.020813f, 0.022415f, 0.024216f, - 0.026047f, 0.028336f, 0.030594f, 0.033142f, 0.035858f, 0.039154f, 0.042328f, 0.046265f, - 0.050537f, 0.055237f, 0.059998f, 0.065918f, 0.072083f, 0.078918f, 0.086243f, 0.094788f, - 0.104309f, 0.114807f, 0.125854f, 0.138672f, 0.152222f, 0.166992f, 0.183716f, 0.200928f, - 0.220459f, 0.240112f, 0.261719f, 0.284668f, 0.308838f, 0.333740f, 0.360840f, 0.388672f, - 0.418213f, 0.448730f, 0.756348f, 0.775391f, 0.779297f, 0.780273f, 0.781250f, 0.780273f, - 0.000511f, 0.001174f, 0.002163f, 0.002554f, 0.003391f, 0.003990f, 0.004547f, 0.005211f, - 0.005993f, 0.006653f, 0.007462f, 0.007942f, 0.008781f, 0.009476f, 0.010323f, 0.011444f, - 0.012207f, 0.013062f, 0.014336f, 0.015427f, 0.016464f, 0.017929f, 0.019287f, 0.021164f, - 0.022461f, 0.024567f, 0.026474f, 0.028885f, 0.031067f, 0.033630f, 0.036835f, 0.040070f, - 0.043488f, 0.047394f, 0.051910f, 0.056732f, 0.062378f, 0.068481f, 0.075073f, 0.082764f, - 0.090881f, 0.100403f, 0.110779f, 0.122009f, 0.134399f, 0.148560f, 0.163940f, 0.180298f, - 0.198120f, 0.218140f, 0.239014f, 0.260986f, 0.285645f, 0.310059f, 0.336182f, 0.364502f, - 0.393311f, 0.424316f, 0.744629f, 0.765137f, 0.769531f, 0.770508f, 0.771484f, 0.771484f, - 0.000374f, 0.000983f, 0.001696f, 0.002279f, 0.002924f, 0.003571f, 0.004139f, 0.004742f, - 0.005390f, 0.005817f, 0.006371f, 0.006981f, 0.007648f, 0.008354f, 0.009041f, 0.009727f, - 0.010536f, 0.011375f, 0.012398f, 0.013535f, 0.014389f, 0.015541f, 0.016602f, 0.018112f, - 0.019516f, 0.020996f, 0.022644f, 0.024582f, 0.026627f, 0.028748f, 0.031586f, 0.034210f, - 0.037415f, 0.040588f, 0.044464f, 0.048676f, 0.053192f, 0.058472f, 0.064880f, 0.070984f, - 0.078674f, 0.086914f, 0.096191f, 0.106445f, 0.117859f, 0.130859f, 0.144775f, 0.160522f, - 0.177490f, 0.196411f, 0.215942f, 0.237793f, 0.261475f, 0.285645f, 0.312012f, 0.339111f, - 0.368652f, 0.400391f, 0.733887f, 0.755371f, 0.759766f, 0.760742f, 0.761719f, 0.761719f, - 0.000298f, 0.000924f, 0.001542f, 0.002125f, 0.002439f, 0.003153f, 0.003502f, 0.004196f, - 0.004585f, 0.005039f, 0.005531f, 0.006054f, 0.006531f, 0.007217f, 0.007935f, 0.008362f, - 0.009171f, 0.009773f, 0.010704f, 0.011505f, 0.012207f, 0.013321f, 0.014381f, 0.015556f, - 0.016586f, 0.017792f, 0.019608f, 0.020844f, 0.022583f, 0.024536f, 0.026566f, 0.028885f, - 0.031494f, 0.034332f, 0.037689f, 0.041260f, 0.045258f, 0.049927f, 0.054901f, 0.060699f, - 0.067322f, 0.074768f, 0.082764f, 0.091675f, 0.102173f, 0.113831f, 0.126831f, 0.141113f, - 0.157104f, 0.175049f, 0.194580f, 0.215210f, 0.237305f, 0.261475f, 0.287598f, 0.314697f, - 0.344482f, 0.375977f, 0.721680f, 0.744629f, 0.749512f, 0.751465f, 0.751465f, 0.751465f, - 0.000275f, 0.001002f, 0.001335f, 0.001704f, 0.002264f, 0.002790f, 0.003202f, 0.003555f, - 0.004017f, 0.004368f, 0.004894f, 0.005318f, 0.005592f, 0.006241f, 0.006611f, 0.007317f, - 0.007851f, 0.008560f, 0.009071f, 0.009758f, 0.010429f, 0.011375f, 0.011986f, 0.013130f, - 0.013916f, 0.015205f, 0.016403f, 0.017624f, 0.019119f, 0.020660f, 0.022278f, 0.024582f, - 0.026474f, 0.029007f, 0.031738f, 0.034668f, 0.038025f, 0.041962f, 0.046417f, 0.051270f, - 0.056915f, 0.063110f, 0.070312f, 0.078369f, 0.087769f, 0.098145f, 0.109863f, 0.123352f, - 0.137451f, 0.154785f, 0.172363f, 0.192261f, 0.214233f, 0.237793f, 0.262939f, 0.289795f, - 0.319336f, 0.351074f, 0.708984f, 0.733398f, 0.738281f, 0.740234f, 0.741211f, 0.740723f, - 0.000334f, 0.000805f, 0.001231f, 0.001640f, 0.002033f, 0.002277f, 0.002871f, 0.003115f, - 0.003481f, 0.003895f, 0.004147f, 0.004379f, 0.004841f, 0.005306f, 0.005653f, 0.006241f, - 0.006630f, 0.007217f, 0.007721f, 0.008133f, 0.008842f, 0.009529f, 0.010010f, 0.011017f, - 0.011780f, 0.012733f, 0.013626f, 0.014824f, 0.015656f, 0.017212f, 0.018829f, 0.020248f, - 0.021973f, 0.023926f, 0.026306f, 0.028900f, 0.031616f, 0.034973f, 0.038605f, 0.042816f, - 0.047424f, 0.052765f, 0.059021f, 0.066162f, 0.074219f, 0.083435f, 0.093994f, 0.105835f, - 0.119385f, 0.134277f, 0.151611f, 0.170532f, 0.191284f, 0.214233f, 0.239014f, 0.265381f, - 0.293701f, 0.325684f, 0.696289f, 0.722168f, 0.727051f, 0.729004f, 0.729980f, 0.729980f, - 0.000215f, 0.000635f, 0.001184f, 0.001348f, 0.001758f, 0.002171f, 0.002249f, 0.002596f, - 0.003004f, 0.003325f, 0.003487f, 0.003906f, 0.004108f, 0.004494f, 0.004955f, 0.005241f, - 0.005726f, 0.006134f, 0.006485f, 0.006916f, 0.007496f, 0.008072f, 0.008629f, 0.009071f, - 0.009857f, 0.010651f, 0.011375f, 0.012283f, 0.013283f, 0.014320f, 0.015350f, 0.016739f, - 0.017975f, 0.019852f, 0.021454f, 0.023712f, 0.025925f, 0.028717f, 0.031769f, 0.035217f, - 0.038910f, 0.043396f, 0.048767f, 0.054901f, 0.061707f, 0.069824f, 0.078613f, 0.089783f, - 0.101685f, 0.115479f, 0.131104f, 0.149292f, 0.168823f, 0.190674f, 0.214844f, 0.241211f, - 0.269775f, 0.299561f, 0.683594f, 0.709961f, 0.715332f, 0.717773f, 0.718262f, 0.718750f, - 0.000199f, 0.000826f, 0.001047f, 0.001288f, 0.001600f, 0.001857f, 0.002014f, 0.002329f, - 0.002535f, 0.002785f, 0.003027f, 0.003210f, 0.003580f, 0.003788f, 0.004025f, 0.004444f, - 0.004791f, 0.004974f, 0.005417f, 0.005909f, 0.006248f, 0.006672f, 0.007118f, 0.007664f, - 0.008232f, 0.008759f, 0.009598f, 0.009964f, 0.010956f, 0.011650f, 0.012665f, 0.013702f, - 0.014832f, 0.016144f, 0.017654f, 0.019211f, 0.021118f, 0.023102f, 0.025681f, 0.028320f, - 0.031708f, 0.035370f, 0.039673f, 0.044739f, 0.050812f, 0.057800f, 0.065796f, 0.074768f, - 0.085510f, 0.097961f, 0.112000f, 0.128662f, 0.147217f, 0.168213f, 0.190796f, 0.216309f, - 0.244751f, 0.274902f, 0.669922f, 0.698730f, 0.703613f, 0.705566f, 0.707031f, 0.707031f, - 0.000212f, 0.000458f, 0.000959f, 0.001192f, 0.001321f, 0.001500f, 0.001823f, 0.002064f, - 0.002073f, 0.002293f, 0.002512f, 0.002768f, 0.002981f, 0.003138f, 0.003431f, 0.003765f, - 0.003918f, 0.004238f, 0.004482f, 0.004814f, 0.005245f, 0.005531f, 0.005871f, 0.006214f, - 0.006660f, 0.007236f, 0.007664f, 0.008331f, 0.008812f, 0.009628f, 0.010277f, 0.010979f, - 0.012016f, 0.012978f, 0.014084f, 0.015495f, 0.016937f, 0.018494f, 0.020386f, 0.022659f, - 0.025208f, 0.028183f, 0.031860f, 0.036072f, 0.040894f, 0.046326f, 0.053009f, 0.061127f, - 0.070374f, 0.081238f, 0.094238f, 0.109314f, 0.126343f, 0.145874f, 0.167847f, 0.192505f, - 0.219604f, 0.249634f, 0.656738f, 0.686035f, 0.690430f, 0.694336f, 0.694336f, 0.696777f, - 0.000151f, 0.000529f, 0.000692f, 0.000883f, 0.001153f, 0.001337f, 0.001380f, 0.001520f, - 0.001753f, 0.001886f, 0.002077f, 0.002243f, 0.002386f, 0.002556f, 0.002832f, 0.003029f, - 0.003277f, 0.003447f, 0.003683f, 0.003952f, 0.004135f, 0.004578f, 0.004833f, 0.005222f, - 0.005417f, 0.005810f, 0.006355f, 0.006718f, 0.007076f, 0.007652f, 0.008293f, 0.008980f, - 0.009674f, 0.010422f, 0.011276f, 0.012283f, 0.013443f, 0.014664f, 0.016113f, 0.017853f, - 0.019897f, 0.022156f, 0.024826f, 0.028275f, 0.032135f, 0.036865f, 0.042389f, 0.049011f, - 0.056732f, 0.066223f, 0.077576f, 0.090820f, 0.106384f, 0.124512f, 0.145264f, 0.169067f, - 0.195190f, 0.224976f, 0.642578f, 0.671387f, 0.679688f, 0.682617f, 0.682617f, 0.683594f, - 0.000127f, 0.000376f, 0.000600f, 0.000721f, 0.000901f, 0.001066f, 0.001180f, 0.001332f, - 0.001455f, 0.001549f, 0.001709f, 0.001831f, 0.001947f, 0.002150f, 0.002245f, 0.002443f, - 0.002682f, 0.002844f, 0.002989f, 0.003201f, 0.003403f, 0.003683f, 0.003883f, 0.004097f, - 0.004372f, 0.004665f, 0.004963f, 0.005348f, 0.005711f, 0.006165f, 0.006672f, 0.007004f, - 0.007610f, 0.008278f, 0.008873f, 0.009636f, 0.010475f, 0.011475f, 0.012634f, 0.014053f, - 0.015404f, 0.017242f, 0.019104f, 0.021774f, 0.024750f, 0.028458f, 0.032745f, 0.038391f, - 0.044861f, 0.052795f, 0.062103f, 0.073914f, 0.087830f, 0.104553f, 0.123718f, 0.145996f, - 0.171509f, 0.200439f, 0.627930f, 0.658691f, 0.666504f, 0.668945f, 0.671387f, 0.671387f, - 0.000013f, 0.000374f, 0.000443f, 0.000688f, 0.000819f, 0.000844f, 0.001004f, 0.001132f, - 0.001216f, 0.001259f, 0.001405f, 0.001523f, 0.001566f, 0.001753f, 0.001842f, 0.001997f, - 0.002022f, 0.002287f, 0.002377f, 0.002541f, 0.002787f, 0.002878f, 0.003096f, 0.003283f, - 0.003551f, 0.003651f, 0.003971f, 0.004272f, 0.004524f, 0.004887f, 0.005196f, 0.005527f, - 0.005939f, 0.006386f, 0.006977f, 0.007526f, 0.008148f, 0.008835f, 0.009689f, 0.010689f, - 0.011810f, 0.013000f, 0.014641f, 0.016388f, 0.018799f, 0.021469f, 0.024734f, 0.029022f, - 0.034210f, 0.040588f, 0.048401f, 0.058319f, 0.070435f, 0.085205f, 0.102905f, 0.123901f, - 0.147827f, 0.175903f, 0.612793f, 0.645508f, 0.653320f, 0.656250f, 0.657227f, 0.657227f, - 0.000113f, 0.000234f, 0.000465f, 0.000547f, 0.000646f, 0.000684f, 0.000711f, 0.000832f, - 0.000963f, 0.000999f, 0.001042f, 0.001183f, 0.001279f, 0.001402f, 0.001494f, 0.001513f, - 0.001688f, 0.001716f, 0.001919f, 0.001993f, 0.002081f, 0.002253f, 0.002441f, 0.002575f, - 0.002714f, 0.002876f, 0.003050f, 0.003214f, 0.003531f, 0.003714f, 0.003956f, 0.004276f, - 0.004604f, 0.004967f, 0.005386f, 0.005718f, 0.006283f, 0.006790f, 0.007290f, 0.008133f, - 0.008957f, 0.009987f, 0.010956f, 0.012375f, 0.013916f, 0.015991f, 0.018311f, 0.021347f, - 0.025253f, 0.030289f, 0.036560f, 0.044586f, 0.054779f, 0.067749f, 0.083252f, 0.102722f, - 0.125732f, 0.152100f, 0.597168f, 0.631836f, 0.639160f, 0.643555f, 0.643066f, 0.645508f, - 0.000207f, 0.000175f, 0.000364f, 0.000507f, 0.000496f, 0.000569f, 0.000683f, 0.000584f, - 0.000737f, 0.000764f, 0.000885f, 0.000964f, 0.000999f, 0.001076f, 0.001085f, 0.001272f, - 0.001327f, 0.001354f, 0.001491f, 0.001494f, 0.001677f, 0.001781f, 0.001862f, 0.001976f, - 0.002079f, 0.002190f, 0.002338f, 0.002481f, 0.002691f, 0.002811f, 0.003117f, 0.003214f, - 0.003422f, 0.003706f, 0.003990f, 0.004314f, 0.004608f, 0.004982f, 0.005379f, 0.006027f, - 0.006580f, 0.007351f, 0.008049f, 0.009041f, 0.010323f, 0.011551f, 0.013428f, 0.015419f, - 0.018219f, 0.021713f, 0.026550f, 0.032715f, 0.040833f, 0.051605f, 0.065552f, 0.082458f, - 0.104004f, 0.129395f, 0.582031f, 0.618652f, 0.625488f, 0.627930f, 0.630859f, 0.631348f, - 0.000189f, 0.000160f, 0.000272f, 0.000387f, 0.000335f, 0.000486f, 0.000424f, 0.000469f, - 0.000551f, 0.000589f, 0.000700f, 0.000727f, 0.000772f, 0.000859f, 0.000891f, 0.000872f, - 0.001000f, 0.001048f, 0.001076f, 0.001172f, 0.001224f, 0.001311f, 0.001376f, 0.001450f, - 0.001554f, 0.001591f, 0.001760f, 0.001838f, 0.001999f, 0.002180f, 0.002333f, 0.002388f, - 0.002584f, 0.002777f, 0.002907f, 0.003162f, 0.003368f, 0.003677f, 0.003979f, 0.004303f, - 0.004715f, 0.005188f, 0.005787f, 0.006378f, 0.007313f, 0.008194f, 0.009407f, 0.010887f, - 0.012779f, 0.015198f, 0.018494f, 0.022888f, 0.029037f, 0.037659f, 0.048920f, 0.064270f, - 0.083740f, 0.107300f, 0.565918f, 0.603516f, 0.611328f, 0.614746f, 0.617188f, 0.618164f, - 0.000000f, 0.000170f, 0.000207f, 0.000274f, 0.000292f, 0.000309f, 0.000381f, 0.000326f, - 0.000418f, 0.000439f, 0.000519f, 0.000519f, 0.000560f, 0.000574f, 0.000652f, 0.000678f, - 0.000717f, 0.000756f, 0.000782f, 0.000820f, 0.000893f, 0.000937f, 0.000991f, 0.001063f, - 0.001112f, 0.001174f, 0.001284f, 0.001302f, 0.001408f, 0.001460f, 0.001586f, 0.001711f, - 0.001826f, 0.001959f, 0.002058f, 0.002207f, 0.002388f, 0.002565f, 0.002836f, 0.003046f, - 0.003284f, 0.003567f, 0.004009f, 0.004463f, 0.005001f, 0.005661f, 0.006451f, 0.007473f, - 0.008751f, 0.010368f, 0.012611f, 0.015587f, 0.019730f, 0.025787f, 0.034729f, 0.047272f, - 0.064392f, 0.087097f, 0.550293f, 0.587891f, 0.596680f, 0.600586f, 0.602539f, 0.603516f, - 0.000000f, 0.000057f, 0.000175f, 0.000210f, 0.000221f, 0.000261f, 0.000224f, 0.000285f, - 0.000296f, 0.000329f, 0.000374f, 0.000329f, 0.000344f, 0.000416f, 0.000421f, 0.000479f, - 0.000455f, 0.000530f, 0.000552f, 0.000598f, 0.000640f, 0.000670f, 0.000695f, 0.000740f, - 0.000798f, 0.000806f, 0.000883f, 0.000908f, 0.000983f, 0.001094f, 0.001083f, 0.001169f, - 0.001242f, 0.001340f, 0.001440f, 0.001536f, 0.001601f, 0.001752f, 0.001893f, 0.002029f, - 0.002218f, 0.002424f, 0.002651f, 0.002934f, 0.003294f, 0.003681f, 0.004200f, 0.004833f, - 0.005688f, 0.006863f, 0.008202f, 0.010178f, 0.012955f, 0.016846f, 0.023163f, 0.032745f, - 0.047150f, 0.067383f, 0.534180f, 0.574219f, 0.582031f, 0.584961f, 0.586914f, 0.589844f, - 0.000000f, 0.000105f, 0.000145f, 0.000101f, 0.000161f, 0.000163f, 0.000165f, 0.000193f, - 0.000190f, 0.000202f, 0.000205f, 0.000260f, 0.000251f, 0.000281f, 0.000305f, 0.000316f, - 0.000323f, 0.000346f, 0.000364f, 0.000383f, 0.000413f, 0.000436f, 0.000461f, 0.000486f, - 0.000515f, 0.000564f, 0.000594f, 0.000616f, 0.000639f, 0.000677f, 0.000729f, 0.000748f, - 0.000842f, 0.000861f, 0.000943f, 0.000970f, 0.001054f, 0.001120f, 0.001219f, 0.001310f, - 0.001398f, 0.001534f, 0.001709f, 0.001852f, 0.002096f, 0.002291f, 0.002594f, 0.002987f, - 0.003481f, 0.004128f, 0.004997f, 0.006218f, 0.007950f, 0.010445f, 0.014313f, 0.020874f, - 0.032166f, 0.049866f, 0.517578f, 0.558105f, 0.567383f, 0.570801f, 0.573730f, 0.574707f, - 0.000000f, 0.000097f, 0.000089f, 0.000082f, 0.000092f, 0.000096f, 0.000092f, 0.000118f, - 0.000126f, 0.000130f, 0.000138f, 0.000138f, 0.000143f, 0.000163f, 0.000181f, 0.000187f, - 0.000195f, 0.000228f, 0.000221f, 0.000261f, 0.000243f, 0.000254f, 0.000274f, 0.000299f, - 0.000334f, 0.000332f, 0.000345f, 0.000362f, 0.000394f, 0.000410f, 0.000433f, 0.000463f, - 0.000497f, 0.000510f, 0.000562f, 0.000594f, 0.000636f, 0.000670f, 0.000731f, 0.000777f, - 0.000832f, 0.000927f, 0.000991f, 0.001101f, 0.001210f, 0.001350f, 0.001513f, 0.001720f, - 0.001999f, 0.002373f, 0.002815f, 0.003498f, 0.004478f, 0.006001f, 0.008347f, 0.012299f, - 0.019669f, 0.034210f, 0.501465f, 0.542969f, 0.552246f, 0.556641f, 0.559082f, 0.559570f, - 0.000107f, 0.000087f, 0.000077f, 0.000070f, 0.000065f, 0.000066f, 0.000059f, 0.000064f, - 0.000065f, 0.000071f, 0.000070f, 0.000095f, 0.000081f, 0.000085f, 0.000110f, 0.000097f, - 0.000117f, 0.000126f, 0.000127f, 0.000133f, 0.000132f, 0.000141f, 0.000169f, 0.000173f, - 0.000185f, 0.000183f, 0.000192f, 0.000215f, 0.000216f, 0.000235f, 0.000236f, 0.000265f, - 0.000278f, 0.000290f, 0.000313f, 0.000317f, 0.000347f, 0.000365f, 0.000400f, 0.000422f, - 0.000457f, 0.000494f, 0.000535f, 0.000586f, 0.000639f, 0.000700f, 0.000786f, 0.000888f, - 0.001019f, 0.001207f, 0.001435f, 0.001746f, 0.002258f, 0.003019f, 0.004299f, 0.006523f, - 0.010612f, 0.020859f, 0.484619f, 0.527344f, 0.536621f, 0.541504f, 0.542969f, 0.544922f, - 0.000092f, 0.000070f, 0.000062f, 0.000056f, 0.000051f, 0.000048f, 0.000045f, 0.000044f, - 0.000041f, 0.000039f, 0.000038f, 0.000037f, 0.000047f, 0.000039f, 0.000041f, 0.000041f, - 0.000058f, 0.000053f, 0.000062f, 0.000064f, 0.000068f, 0.000072f, 0.000076f, 0.000076f, - 0.000078f, 0.000092f, 0.000085f, 0.000101f, 0.000104f, 0.000110f, 0.000115f, 0.000118f, - 0.000127f, 0.000133f, 0.000152f, 0.000150f, 0.000163f, 0.000190f, 0.000190f, 0.000202f, - 0.000213f, 0.000225f, 0.000249f, 0.000268f, 0.000296f, 0.000321f, 0.000354f, 0.000402f, - 0.000458f, 0.000520f, 0.000618f, 0.000744f, 0.000950f, 0.001263f, 0.001822f, 0.002865f, - 0.005028f, 0.010544f, 0.468018f, 0.511230f, 0.521484f, 0.524902f, 0.529297f, 0.529785f, - 0.000067f, 0.000049f, 0.000041f, 0.000037f, 0.000034f, 0.000032f, 0.000031f, 0.000029f, - 0.000028f, 0.000027f, 0.000027f, 0.000026f, 0.000025f, 0.000023f, 0.000022f, 0.000021f, - 0.000020f, 0.000020f, 0.000023f, 0.000024f, 0.000021f, 0.000022f, 0.000025f, 0.000029f, - 0.000030f, 0.000034f, 0.000036f, 0.000034f, 0.000039f, 0.000038f, 0.000045f, 0.000045f, - 0.000048f, 0.000051f, 0.000053f, 0.000055f, 0.000063f, 0.000070f, 0.000073f, 0.000073f, - 0.000080f, 0.000084f, 0.000089f, 0.000102f, 0.000107f, 0.000115f, 0.000128f, 0.000145f, - 0.000156f, 0.000178f, 0.000213f, 0.000253f, 0.000311f, 0.000400f, 0.000572f, 0.000916f, - 0.001751f, 0.004158f, 0.450439f, 0.496338f, 0.505859f, 0.510742f, 0.513184f, 0.514648f, - 0.000016f, 0.000013f, 0.000011f, 0.000010f, 0.000012f, 0.000012f, 0.000011f, 0.000012f, - 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, - 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000009f, 0.000009f, 0.000009f, - 0.000009f, 0.000011f, 0.000012f, 0.000012f, 0.000015f, 0.000014f, 0.000014f, 0.000017f, - 0.000018f, 0.000020f, 0.000020f, 0.000022f, 0.000026f, 0.000027f, 0.000028f, 0.000027f, - 0.000033f, 0.000036f, 0.000044f, 0.000051f, 0.000057f, 0.000078f, 0.000103f, 0.000159f, - 0.000315f, 0.000997f, 0.433350f, 0.479980f, 0.490234f, 0.495605f, 0.498291f, 0.499512f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, - 0.000007f, 0.000025f, 0.416016f, 0.464111f, 0.474854f, 0.479248f, 0.481934f, 0.484375f, - }, - { - 0.023209f, 0.069336f, 0.113037f, 0.154663f, 0.193726f, 0.231812f, 0.267578f, 0.301758f, - 0.333740f, 0.364258f, 0.393555f, 0.421631f, 0.447510f, 0.473145f, 0.497070f, 0.520020f, - 0.541992f, 0.562988f, 0.583008f, 0.602539f, 0.620605f, 0.638184f, 0.655762f, 0.671387f, - 0.687500f, 0.702637f, 0.716309f, 0.729980f, 0.744141f, 0.757812f, 0.769531f, 0.782227f, - 0.793945f, 0.804688f, 0.815918f, 0.826172f, 0.836426f, 0.846191f, 0.855957f, 0.865234f, - 0.874023f, 0.882812f, 0.891113f, 0.898926f, 0.907227f, 0.915039f, 0.922852f, 0.929688f, - 0.937012f, 0.943848f, 0.950684f, 0.956543f, 0.963379f, 0.969238f, 0.976074f, 0.981445f, - 0.986816f, 0.992676f, 0.991211f, 0.978516f, 0.968750f, 0.960449f, 0.952637f, 0.945312f, - 0.019730f, 0.059631f, 0.098206f, 0.135864f, 0.172119f, 0.206421f, 0.239624f, 0.272461f, - 0.304932f, 0.333984f, 0.362549f, 0.389648f, 0.416016f, 0.441406f, 0.466309f, 0.489502f, - 0.511230f, 0.533203f, 0.554199f, 0.573242f, 0.593262f, 0.611816f, 0.629395f, 0.645508f, - 0.662598f, 0.678711f, 0.693359f, 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762207f, - 0.773926f, 0.786133f, 0.796875f, 0.808594f, 0.818848f, 0.829590f, 0.839355f, 0.850098f, - 0.859863f, 0.868652f, 0.877441f, 0.886230f, 0.895020f, 0.903809f, 0.911133f, 0.918457f, - 0.925781f, 0.933105f, 0.940430f, 0.946777f, 0.954590f, 0.960938f, 0.966797f, 0.973145f, - 0.979004f, 0.984863f, 0.987793f, 0.976074f, 0.966797f, 0.958496f, 0.951172f, 0.943848f, - 0.017151f, 0.051636f, 0.085510f, 0.119202f, 0.152466f, 0.184814f, 0.216187f, 0.246582f, - 0.276855f, 0.305664f, 0.332764f, 0.360107f, 0.385986f, 0.411621f, 0.435791f, 0.459473f, - 0.481445f, 0.502441f, 0.524414f, 0.546387f, 0.565430f, 0.583496f, 0.602051f, 0.619629f, - 0.636719f, 0.653320f, 0.669434f, 0.684082f, 0.699707f, 0.713867f, 0.728027f, 0.741211f, - 0.754883f, 0.767090f, 0.779297f, 0.791016f, 0.802734f, 0.813965f, 0.824219f, 0.833984f, - 0.843750f, 0.854492f, 0.863281f, 0.873535f, 0.882324f, 0.890137f, 0.898926f, 0.906738f, - 0.915039f, 0.922852f, 0.930176f, 0.937012f, 0.944336f, 0.951172f, 0.958008f, 0.964844f, - 0.970703f, 0.977051f, 0.983887f, 0.972656f, 0.964355f, 0.956543f, 0.949219f, 0.942383f, - 0.014885f, 0.044678f, 0.075195f, 0.104919f, 0.135254f, 0.165649f, 0.194702f, 0.223633f, - 0.251221f, 0.279053f, 0.305420f, 0.331543f, 0.357422f, 0.382568f, 0.406982f, 0.430420f, - 0.453369f, 0.475586f, 0.496582f, 0.517090f, 0.536133f, 0.556641f, 0.575684f, 0.592773f, - 0.611328f, 0.628418f, 0.643555f, 0.661621f, 0.676270f, 0.691406f, 0.705566f, 0.720215f, - 0.733887f, 0.746582f, 0.759766f, 0.772949f, 0.784668f, 0.795898f, 0.807129f, 0.818359f, - 0.828125f, 0.838867f, 0.848633f, 0.858887f, 0.867676f, 0.877441f, 0.886230f, 0.894531f, - 0.903320f, 0.911621f, 0.919434f, 0.927734f, 0.934570f, 0.940918f, 0.948730f, 0.956543f, - 0.962402f, 0.969238f, 0.979980f, 0.970215f, 0.961914f, 0.954102f, 0.947266f, 0.940918f, - 0.013046f, 0.038940f, 0.066162f, 0.093323f, 0.120544f, 0.147583f, 0.174683f, 0.201538f, - 0.228516f, 0.254639f, 0.280518f, 0.304932f, 0.330566f, 0.354492f, 0.379395f, 0.402100f, - 0.424561f, 0.446533f, 0.467529f, 0.488525f, 0.509277f, 0.529297f, 0.547852f, 0.566895f, - 0.585449f, 0.602539f, 0.620605f, 0.636230f, 0.653809f, 0.667480f, 0.684570f, 0.698242f, - 0.712891f, 0.726562f, 0.739746f, 0.753418f, 0.765625f, 0.777344f, 0.789551f, 0.801270f, - 0.812500f, 0.823730f, 0.833984f, 0.844238f, 0.854004f, 0.863770f, 0.874023f, 0.882324f, - 0.891113f, 0.899902f, 0.908203f, 0.916504f, 0.924805f, 0.932129f, 0.939453f, 0.947266f, - 0.954102f, 0.960938f, 0.976562f, 0.967285f, 0.958984f, 0.951660f, 0.944824f, 0.938965f, - 0.011696f, 0.034698f, 0.058807f, 0.083130f, 0.107727f, 0.132324f, 0.156982f, 0.182251f, - 0.207153f, 0.232178f, 0.256836f, 0.280762f, 0.304688f, 0.328369f, 0.352295f, 0.375244f, - 0.397461f, 0.419434f, 0.440430f, 0.461914f, 0.482178f, 0.501953f, 0.522461f, 0.540527f, - 0.559570f, 0.577148f, 0.595703f, 0.613281f, 0.628418f, 0.644531f, 0.661621f, 0.676270f, - 0.691406f, 0.705078f, 0.719727f, 0.733887f, 0.746094f, 0.759766f, 0.771973f, 0.784180f, - 0.795898f, 0.807617f, 0.818359f, 0.829102f, 0.839844f, 0.850098f, 0.859375f, 0.869629f, - 0.878906f, 0.887695f, 0.896484f, 0.905273f, 0.914062f, 0.921875f, 0.929688f, 0.937988f, - 0.944824f, 0.952637f, 0.973145f, 0.963379f, 0.956055f, 0.949219f, 0.942871f, 0.937012f, - 0.010094f, 0.030975f, 0.052063f, 0.073975f, 0.096069f, 0.118713f, 0.141479f, 0.164551f, - 0.187866f, 0.211182f, 0.234985f, 0.258057f, 0.280518f, 0.303467f, 0.326172f, 0.348145f, - 0.370117f, 0.392822f, 0.413574f, 0.434814f, 0.455322f, 0.476074f, 0.495361f, 0.515137f, - 0.533203f, 0.551758f, 0.569824f, 0.586426f, 0.604492f, 0.621582f, 0.637695f, 0.654297f, - 0.668945f, 0.683594f, 0.699219f, 0.712402f, 0.728516f, 0.741699f, 0.753906f, 0.767090f, - 0.778320f, 0.790527f, 0.802246f, 0.813965f, 0.824219f, 0.835449f, 0.846680f, 0.855957f, - 0.865723f, 0.875488f, 0.884766f, 0.894043f, 0.902832f, 0.911133f, 0.919434f, 0.927734f, - 0.935547f, 0.943359f, 0.968750f, 0.960449f, 0.953125f, 0.946289f, 0.940430f, 0.934570f, - 0.008797f, 0.027466f, 0.045959f, 0.066223f, 0.086304f, 0.106506f, 0.127441f, 0.149170f, - 0.170532f, 0.192261f, 0.213867f, 0.236206f, 0.258057f, 0.280273f, 0.301758f, 0.323486f, - 0.344727f, 0.367188f, 0.388184f, 0.408447f, 0.429443f, 0.450439f, 0.469727f, 0.489014f, - 0.508301f, 0.526855f, 0.545410f, 0.562500f, 0.581055f, 0.597656f, 0.613770f, 0.630859f, - 0.647461f, 0.663574f, 0.677734f, 0.693359f, 0.707031f, 0.720703f, 0.735352f, 0.748047f, - 0.760254f, 0.772461f, 0.785156f, 0.797363f, 0.810059f, 0.819824f, 0.831543f, 0.842285f, - 0.852051f, 0.862793f, 0.873047f, 0.882324f, 0.891113f, 0.899902f, 0.909180f, 0.917969f, - 0.925781f, 0.934082f, 0.964355f, 0.957031f, 0.949707f, 0.943359f, 0.937988f, 0.932129f, - 0.007927f, 0.024414f, 0.041077f, 0.059204f, 0.077148f, 0.095581f, 0.115479f, 0.134644f, - 0.154785f, 0.175293f, 0.196045f, 0.216553f, 0.236694f, 0.258057f, 0.278809f, 0.300049f, - 0.321289f, 0.342529f, 0.363281f, 0.383545f, 0.403564f, 0.424072f, 0.444092f, 0.463135f, - 0.483154f, 0.501953f, 0.519531f, 0.539062f, 0.555664f, 0.574707f, 0.591309f, 0.608398f, - 0.624512f, 0.640137f, 0.655762f, 0.671875f, 0.686523f, 0.701172f, 0.715820f, 0.729004f, - 0.742676f, 0.755859f, 0.769043f, 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.827637f, - 0.838867f, 0.849121f, 0.859375f, 0.870117f, 0.879395f, 0.889160f, 0.898926f, 0.906738f, - 0.916504f, 0.924805f, 0.960938f, 0.953125f, 0.947266f, 0.940430f, 0.935547f, 0.929688f, - 0.007080f, 0.022247f, 0.037445f, 0.053070f, 0.069336f, 0.086975f, 0.103577f, 0.121948f, - 0.140503f, 0.158936f, 0.178833f, 0.198242f, 0.217651f, 0.237793f, 0.257812f, 0.278076f, - 0.297607f, 0.318604f, 0.338623f, 0.358643f, 0.378662f, 0.399170f, 0.418213f, 0.438721f, - 0.457520f, 0.477051f, 0.495361f, 0.513672f, 0.531250f, 0.549316f, 0.567383f, 0.583984f, - 0.601562f, 0.617676f, 0.634277f, 0.650391f, 0.666016f, 0.680176f, 0.695801f, 0.710449f, - 0.723633f, 0.737305f, 0.750977f, 0.764648f, 0.776367f, 0.789551f, 0.802246f, 0.813477f, - 0.824219f, 0.835938f, 0.846680f, 0.857422f, 0.867188f, 0.876953f, 0.887207f, 0.895996f, - 0.905762f, 0.915527f, 0.955566f, 0.949707f, 0.943359f, 0.937988f, 0.932129f, 0.927246f, - 0.006363f, 0.019516f, 0.033691f, 0.047577f, 0.062469f, 0.078186f, 0.093933f, 0.110657f, - 0.127563f, 0.144653f, 0.162598f, 0.181152f, 0.199707f, 0.218384f, 0.237427f, 0.257324f, - 0.276367f, 0.295166f, 0.315674f, 0.335205f, 0.355225f, 0.374756f, 0.393799f, 0.413574f, - 0.432617f, 0.451904f, 0.470459f, 0.489258f, 0.508301f, 0.525879f, 0.543945f, 0.560059f, - 0.578613f, 0.595703f, 0.612793f, 0.628418f, 0.644531f, 0.659668f, 0.675293f, 0.689941f, - 0.704590f, 0.719238f, 0.732910f, 0.747070f, 0.759766f, 0.773438f, 0.785156f, 0.797852f, - 0.809570f, 0.821289f, 0.833008f, 0.843750f, 0.854980f, 0.865723f, 0.875977f, 0.886230f, - 0.895508f, 0.904785f, 0.951660f, 0.945801f, 0.939941f, 0.934570f, 0.929199f, 0.924805f, - 0.005985f, 0.017776f, 0.030212f, 0.043030f, 0.056488f, 0.070190f, 0.085205f, 0.100342f, - 0.115723f, 0.132446f, 0.148438f, 0.165771f, 0.183228f, 0.200684f, 0.218994f, 0.237183f, - 0.255859f, 0.274170f, 0.292725f, 0.313477f, 0.331299f, 0.351318f, 0.369873f, 0.389160f, - 0.408936f, 0.426758f, 0.446533f, 0.464844f, 0.483154f, 0.501465f, 0.519531f, 0.537598f, - 0.555664f, 0.572754f, 0.589844f, 0.605957f, 0.622070f, 0.639648f, 0.654297f, 0.670898f, - 0.685059f, 0.700195f, 0.714844f, 0.728516f, 0.742188f, 0.754883f, 0.769043f, 0.781738f, - 0.795410f, 0.808105f, 0.818359f, 0.830566f, 0.841797f, 0.853027f, 0.863770f, 0.874023f, - 0.884766f, 0.893555f, 0.947266f, 0.942383f, 0.936523f, 0.930664f, 0.926270f, 0.921387f, - 0.005173f, 0.016083f, 0.027359f, 0.038849f, 0.051056f, 0.063843f, 0.077026f, 0.091064f, - 0.105591f, 0.120422f, 0.135498f, 0.150879f, 0.167480f, 0.184326f, 0.201172f, 0.218384f, - 0.236084f, 0.254395f, 0.272949f, 0.291260f, 0.309570f, 0.328125f, 0.346680f, 0.365967f, - 0.384766f, 0.403320f, 0.422119f, 0.440918f, 0.458984f, 0.477783f, 0.496094f, 0.513672f, - 0.531738f, 0.548828f, 0.566406f, 0.583984f, 0.600098f, 0.617188f, 0.632812f, 0.649902f, - 0.665527f, 0.681152f, 0.694824f, 0.709473f, 0.724121f, 0.738770f, 0.752441f, 0.765137f, - 0.778809f, 0.791992f, 0.803711f, 0.815918f, 0.828125f, 0.839844f, 0.851562f, 0.862793f, - 0.873535f, 0.883789f, 0.941895f, 0.938477f, 0.933105f, 0.927246f, 0.922363f, 0.918457f, - 0.004791f, 0.014610f, 0.024475f, 0.035126f, 0.046478f, 0.057922f, 0.069885f, 0.083008f, - 0.096069f, 0.109253f, 0.123840f, 0.137939f, 0.153076f, 0.168701f, 0.185059f, 0.200928f, - 0.218262f, 0.234985f, 0.252686f, 0.270264f, 0.288086f, 0.306396f, 0.324951f, 0.343018f, - 0.362305f, 0.379883f, 0.398926f, 0.417236f, 0.435547f, 0.454346f, 0.472656f, 0.491211f, - 0.508301f, 0.526855f, 0.543457f, 0.561523f, 0.578125f, 0.595215f, 0.612305f, 0.628418f, - 0.644043f, 0.660645f, 0.675781f, 0.691406f, 0.706055f, 0.720215f, 0.735840f, 0.749023f, - 0.762695f, 0.776855f, 0.789551f, 0.800781f, 0.814941f, 0.826172f, 0.838867f, 0.851074f, - 0.862305f, 0.872070f, 0.937500f, 0.933594f, 0.929199f, 0.923828f, 0.919434f, 0.915527f, - 0.004387f, 0.013268f, 0.022385f, 0.031860f, 0.041962f, 0.052612f, 0.063171f, 0.075073f, - 0.086792f, 0.099854f, 0.113037f, 0.125977f, 0.140381f, 0.154663f, 0.169678f, 0.184814f, - 0.200562f, 0.217773f, 0.234131f, 0.250732f, 0.268066f, 0.284912f, 0.303223f, 0.321289f, - 0.339355f, 0.357666f, 0.375488f, 0.394043f, 0.411865f, 0.430664f, 0.448730f, 0.467041f, - 0.485352f, 0.503418f, 0.520508f, 0.539062f, 0.556152f, 0.573242f, 0.590820f, 0.606934f, - 0.624512f, 0.640625f, 0.655762f, 0.672363f, 0.687500f, 0.702148f, 0.718750f, 0.731934f, - 0.746582f, 0.759766f, 0.772949f, 0.787109f, 0.800781f, 0.813477f, 0.825195f, 0.838379f, - 0.850098f, 0.861816f, 0.932617f, 0.929688f, 0.925293f, 0.919922f, 0.915527f, 0.912109f, - 0.003941f, 0.011986f, 0.020630f, 0.029144f, 0.038544f, 0.048035f, 0.058075f, 0.068542f, - 0.079590f, 0.090942f, 0.102661f, 0.115295f, 0.128296f, 0.141602f, 0.155518f, 0.170654f, - 0.185425f, 0.200684f, 0.216309f, 0.231812f, 0.249146f, 0.265137f, 0.282471f, 0.299072f, - 0.317139f, 0.334717f, 0.352783f, 0.371338f, 0.388916f, 0.406982f, 0.425537f, 0.443848f, - 0.461914f, 0.479980f, 0.498291f, 0.515625f, 0.533203f, 0.550293f, 0.568359f, 0.585449f, - 0.603027f, 0.618652f, 0.635742f, 0.652344f, 0.668457f, 0.684082f, 0.699219f, 0.713867f, - 0.729004f, 0.743652f, 0.757812f, 0.771484f, 0.785645f, 0.798828f, 0.812012f, 0.824219f, - 0.836914f, 0.850098f, 0.927246f, 0.925293f, 0.920410f, 0.916504f, 0.912598f, 0.908203f, - 0.003790f, 0.011009f, 0.018829f, 0.026779f, 0.035339f, 0.043762f, 0.053223f, 0.062408f, - 0.072693f, 0.082947f, 0.093689f, 0.105469f, 0.117554f, 0.130005f, 0.142822f, 0.156494f, - 0.170166f, 0.184448f, 0.198975f, 0.213745f, 0.230469f, 0.246460f, 0.262939f, 0.279541f, - 0.296143f, 0.313721f, 0.331299f, 0.348633f, 0.367188f, 0.384521f, 0.402344f, 0.420410f, - 0.438965f, 0.457275f, 0.475830f, 0.493164f, 0.510742f, 0.528809f, 0.546387f, 0.564453f, - 0.581055f, 0.598145f, 0.615234f, 0.631836f, 0.647461f, 0.665527f, 0.680664f, 0.696289f, - 0.711914f, 0.728027f, 0.741211f, 0.756836f, 0.770508f, 0.783691f, 0.798340f, 0.811523f, - 0.824219f, 0.837402f, 0.921387f, 0.920410f, 0.916504f, 0.913086f, 0.908691f, 0.904785f, - 0.003479f, 0.009949f, 0.016937f, 0.024445f, 0.031708f, 0.039948f, 0.048218f, 0.056793f, - 0.066223f, 0.075928f, 0.085632f, 0.096313f, 0.107178f, 0.118958f, 0.130493f, 0.143311f, - 0.156494f, 0.170044f, 0.183960f, 0.197876f, 0.213501f, 0.228027f, 0.244019f, 0.260010f, - 0.276611f, 0.293213f, 0.309814f, 0.327393f, 0.344482f, 0.363037f, 0.379883f, 0.398438f, - 0.416504f, 0.434082f, 0.451904f, 0.470215f, 0.488525f, 0.505859f, 0.523926f, 0.541504f, - 0.559570f, 0.577637f, 0.594238f, 0.611328f, 0.628418f, 0.645020f, 0.661133f, 0.677246f, - 0.693848f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.769531f, 0.783203f, 0.797852f, - 0.810547f, 0.824707f, 0.916016f, 0.915527f, 0.912109f, 0.908691f, 0.904785f, 0.900879f, - 0.003014f, 0.008842f, 0.015640f, 0.022018f, 0.028885f, 0.036163f, 0.044250f, 0.051819f, - 0.059967f, 0.069031f, 0.078247f, 0.088135f, 0.098267f, 0.108337f, 0.119751f, 0.131470f, - 0.143433f, 0.156006f, 0.169189f, 0.183105f, 0.196655f, 0.211304f, 0.226196f, 0.241211f, - 0.257080f, 0.273438f, 0.289307f, 0.306396f, 0.323975f, 0.340576f, 0.358398f, 0.375732f, - 0.393799f, 0.411133f, 0.429688f, 0.447998f, 0.466064f, 0.483887f, 0.501465f, 0.519531f, - 0.537598f, 0.555664f, 0.573242f, 0.590820f, 0.607910f, 0.625000f, 0.642578f, 0.658203f, - 0.675293f, 0.691406f, 0.707520f, 0.724121f, 0.738770f, 0.753418f, 0.769531f, 0.783203f, - 0.797363f, 0.811523f, 0.910156f, 0.910645f, 0.907715f, 0.904785f, 0.900879f, 0.896973f, - 0.002861f, 0.008591f, 0.014000f, 0.020203f, 0.026962f, 0.033203f, 0.040161f, 0.047485f, - 0.055237f, 0.062988f, 0.071594f, 0.080750f, 0.089905f, 0.099854f, 0.109741f, 0.120056f, - 0.131592f, 0.143311f, 0.155640f, 0.167969f, 0.181763f, 0.195190f, 0.209229f, 0.223877f, - 0.238647f, 0.254150f, 0.269531f, 0.285889f, 0.302979f, 0.319824f, 0.336426f, 0.354004f, - 0.372070f, 0.389893f, 0.406982f, 0.424805f, 0.443359f, 0.461182f, 0.479492f, 0.498047f, - 0.515625f, 0.533691f, 0.551270f, 0.569336f, 0.587402f, 0.604492f, 0.622070f, 0.639160f, - 0.656738f, 0.673828f, 0.689941f, 0.705566f, 0.722168f, 0.737793f, 0.753418f, 0.768066f, - 0.783203f, 0.798340f, 0.904297f, 0.905762f, 0.902832f, 0.899414f, 0.895996f, 0.893066f, - 0.002535f, 0.007812f, 0.013252f, 0.018738f, 0.024384f, 0.030548f, 0.036774f, 0.043427f, - 0.050476f, 0.057556f, 0.065491f, 0.073425f, 0.082458f, 0.091370f, 0.100525f, 0.110413f, - 0.120605f, 0.131592f, 0.142822f, 0.154663f, 0.166870f, 0.180176f, 0.193237f, 0.207031f, - 0.221191f, 0.236084f, 0.250732f, 0.266602f, 0.282959f, 0.299072f, 0.315430f, 0.332520f, - 0.350342f, 0.367676f, 0.385010f, 0.403076f, 0.421631f, 0.439209f, 0.457520f, 0.475342f, - 0.494141f, 0.512695f, 0.530273f, 0.547852f, 0.565918f, 0.584473f, 0.602051f, 0.619629f, - 0.637207f, 0.655273f, 0.671387f, 0.688965f, 0.706055f, 0.721191f, 0.737305f, 0.752930f, - 0.769531f, 0.784668f, 0.898438f, 0.900879f, 0.897949f, 0.894531f, 0.891602f, 0.888672f, - 0.002411f, 0.007103f, 0.012161f, 0.017105f, 0.022385f, 0.027985f, 0.033203f, 0.039581f, - 0.045532f, 0.052521f, 0.059814f, 0.067261f, 0.074768f, 0.083313f, 0.092041f, 0.101013f, - 0.110291f, 0.120361f, 0.130615f, 0.141724f, 0.153076f, 0.165283f, 0.177612f, 0.190918f, - 0.204346f, 0.218506f, 0.233154f, 0.247559f, 0.263428f, 0.279053f, 0.295166f, 0.312256f, - 0.328857f, 0.345947f, 0.363281f, 0.381348f, 0.398926f, 0.417236f, 0.435547f, 0.453369f, - 0.471191f, 0.489502f, 0.508301f, 0.525879f, 0.545410f, 0.563477f, 0.581055f, 0.600098f, - 0.617676f, 0.635254f, 0.653809f, 0.670410f, 0.687500f, 0.705078f, 0.720703f, 0.736816f, - 0.753418f, 0.769531f, 0.892090f, 0.895020f, 0.892578f, 0.889648f, 0.887207f, 0.884277f, - 0.002344f, 0.006565f, 0.011322f, 0.015686f, 0.020630f, 0.025574f, 0.030807f, 0.035980f, - 0.042084f, 0.048279f, 0.054352f, 0.061432f, 0.068848f, 0.076172f, 0.083618f, 0.092590f, - 0.101135f, 0.109619f, 0.120178f, 0.130249f, 0.140991f, 0.151978f, 0.163696f, 0.175781f, - 0.188721f, 0.202026f, 0.215820f, 0.230103f, 0.244873f, 0.259766f, 0.275635f, 0.291504f, - 0.307617f, 0.324219f, 0.342041f, 0.358887f, 0.376709f, 0.394775f, 0.412354f, 0.431152f, - 0.448975f, 0.468018f, 0.486328f, 0.504883f, 0.523438f, 0.541992f, 0.560547f, 0.579102f, - 0.597656f, 0.615234f, 0.633789f, 0.651855f, 0.669434f, 0.687500f, 0.704590f, 0.721680f, - 0.738770f, 0.755859f, 0.886719f, 0.889648f, 0.887695f, 0.884766f, 0.882812f, 0.879883f, - 0.002003f, 0.006268f, 0.009987f, 0.014198f, 0.018875f, 0.023605f, 0.028259f, 0.033203f, - 0.038513f, 0.044495f, 0.049866f, 0.056152f, 0.062500f, 0.069458f, 0.076660f, 0.084473f, - 0.092163f, 0.100586f, 0.109741f, 0.119324f, 0.128662f, 0.139526f, 0.150146f, 0.161499f, - 0.173706f, 0.185791f, 0.199341f, 0.212891f, 0.227051f, 0.241455f, 0.256592f, 0.271729f, - 0.288330f, 0.304199f, 0.321045f, 0.337891f, 0.355469f, 0.373291f, 0.391113f, 0.408936f, - 0.426758f, 0.446289f, 0.464600f, 0.483643f, 0.500977f, 0.520996f, 0.539551f, 0.558594f, - 0.577148f, 0.595703f, 0.614746f, 0.632324f, 0.650879f, 0.669434f, 0.687012f, 0.704590f, - 0.722656f, 0.740234f, 0.880371f, 0.883301f, 0.881836f, 0.879883f, 0.877441f, 0.875000f, - 0.001739f, 0.005779f, 0.009598f, 0.013245f, 0.017334f, 0.021637f, 0.025955f, 0.030121f, - 0.035217f, 0.040131f, 0.045990f, 0.051453f, 0.056915f, 0.063354f, 0.070007f, 0.076965f, - 0.084351f, 0.091980f, 0.100281f, 0.108826f, 0.117981f, 0.127441f, 0.137939f, 0.148315f, - 0.160034f, 0.171753f, 0.183594f, 0.196167f, 0.209961f, 0.223511f, 0.238037f, 0.252930f, - 0.268066f, 0.284180f, 0.300537f, 0.317139f, 0.333740f, 0.351074f, 0.368896f, 0.386719f, - 0.405273f, 0.423584f, 0.442871f, 0.460938f, 0.479736f, 0.499512f, 0.517578f, 0.537109f, - 0.555664f, 0.575195f, 0.594238f, 0.613770f, 0.632324f, 0.650879f, 0.669922f, 0.687988f, - 0.706055f, 0.724121f, 0.873047f, 0.876953f, 0.875488f, 0.874023f, 0.872559f, 0.869141f, - 0.001648f, 0.005039f, 0.008675f, 0.012161f, 0.015823f, 0.019760f, 0.023865f, 0.028015f, - 0.032318f, 0.036865f, 0.041504f, 0.046906f, 0.051758f, 0.057922f, 0.064087f, 0.070435f, - 0.077209f, 0.084290f, 0.091736f, 0.099243f, 0.108215f, 0.117004f, 0.126343f, 0.135620f, - 0.146484f, 0.157349f, 0.168823f, 0.180908f, 0.193848f, 0.206909f, 0.220459f, 0.234619f, - 0.249634f, 0.264404f, 0.280273f, 0.296631f, 0.313232f, 0.329834f, 0.347412f, 0.365479f, - 0.383545f, 0.401855f, 0.420166f, 0.438721f, 0.458252f, 0.477783f, 0.496826f, 0.516602f, - 0.535156f, 0.554199f, 0.574219f, 0.593750f, 0.612305f, 0.631836f, 0.651367f, 0.670410f, - 0.689453f, 0.708984f, 0.865234f, 0.872070f, 0.870605f, 0.868652f, 0.866699f, 0.863770f, - 0.001492f, 0.004704f, 0.007973f, 0.011124f, 0.014603f, 0.017792f, 0.021652f, 0.025314f, - 0.029526f, 0.033722f, 0.038147f, 0.042694f, 0.047668f, 0.052673f, 0.057983f, 0.064209f, - 0.070068f, 0.076233f, 0.083313f, 0.090942f, 0.098572f, 0.106750f, 0.115295f, 0.124512f, - 0.134277f, 0.144287f, 0.154663f, 0.166504f, 0.178345f, 0.190063f, 0.203247f, 0.217041f, - 0.231079f, 0.245850f, 0.260986f, 0.276611f, 0.293213f, 0.309570f, 0.326172f, 0.343994f, - 0.361816f, 0.379395f, 0.397949f, 0.417480f, 0.436523f, 0.455322f, 0.474854f, 0.493896f, - 0.514160f, 0.533691f, 0.553711f, 0.573730f, 0.593262f, 0.612793f, 0.632812f, 0.651855f, - 0.672363f, 0.690918f, 0.857910f, 0.865723f, 0.864746f, 0.863281f, 0.860352f, 0.858887f, - 0.001657f, 0.004684f, 0.007290f, 0.010201f, 0.013657f, 0.016541f, 0.019989f, 0.023636f, - 0.026932f, 0.030548f, 0.034576f, 0.039154f, 0.043793f, 0.048126f, 0.053162f, 0.058319f, - 0.063721f, 0.069885f, 0.076355f, 0.082947f, 0.089844f, 0.097046f, 0.105286f, 0.113281f, - 0.122559f, 0.131348f, 0.141357f, 0.152100f, 0.163330f, 0.175415f, 0.187256f, 0.199951f, - 0.213501f, 0.227051f, 0.241943f, 0.257324f, 0.273193f, 0.288818f, 0.305420f, 0.322754f, - 0.340576f, 0.358643f, 0.375732f, 0.394775f, 0.414307f, 0.433105f, 0.453613f, 0.472168f, - 0.492188f, 0.512695f, 0.532715f, 0.552246f, 0.573242f, 0.593262f, 0.613770f, 0.632812f, - 0.654785f, 0.673828f, 0.851074f, 0.859375f, 0.858398f, 0.856934f, 0.855469f, 0.853027f, - 0.001457f, 0.003944f, 0.006870f, 0.009392f, 0.012543f, 0.015190f, 0.018417f, 0.021576f, - 0.024811f, 0.028122f, 0.031708f, 0.035278f, 0.039398f, 0.043793f, 0.048218f, 0.052887f, - 0.058044f, 0.063477f, 0.069397f, 0.075256f, 0.081360f, 0.088318f, 0.095398f, 0.103210f, - 0.111084f, 0.120361f, 0.129150f, 0.139038f, 0.149292f, 0.160645f, 0.172241f, 0.183716f, - 0.196533f, 0.209595f, 0.224121f, 0.238647f, 0.253174f, 0.268799f, 0.286133f, 0.302490f, - 0.319092f, 0.337158f, 0.355225f, 0.373535f, 0.392090f, 0.411133f, 0.430908f, 0.450928f, - 0.470947f, 0.490967f, 0.511719f, 0.531250f, 0.551758f, 0.573730f, 0.594238f, 0.614746f, - 0.636230f, 0.656738f, 0.842773f, 0.852051f, 0.851562f, 0.851074f, 0.848633f, 0.846680f, - 0.001404f, 0.003891f, 0.006233f, 0.008751f, 0.011353f, 0.014175f, 0.017075f, 0.019592f, - 0.022842f, 0.025772f, 0.028839f, 0.032410f, 0.036011f, 0.039764f, 0.043671f, 0.048126f, - 0.052704f, 0.057373f, 0.062561f, 0.067688f, 0.074158f, 0.080200f, 0.086853f, 0.093445f, - 0.101379f, 0.109192f, 0.117432f, 0.126709f, 0.136353f, 0.146484f, 0.157227f, 0.168823f, - 0.180542f, 0.193115f, 0.206299f, 0.219727f, 0.234375f, 0.249756f, 0.265869f, 0.281738f, - 0.298096f, 0.315674f, 0.333252f, 0.352051f, 0.370850f, 0.389160f, 0.409180f, 0.428955f, - 0.448730f, 0.469971f, 0.489502f, 0.510742f, 0.531738f, 0.552246f, 0.574707f, 0.595215f, - 0.617676f, 0.639160f, 0.835449f, 0.845215f, 0.845215f, 0.844238f, 0.843262f, 0.840332f, - 0.001275f, 0.003536f, 0.005600f, 0.007881f, 0.010628f, 0.012878f, 0.015610f, 0.018097f, - 0.020996f, 0.023376f, 0.026443f, 0.029556f, 0.032867f, 0.036163f, 0.039581f, 0.043915f, - 0.047943f, 0.052216f, 0.056763f, 0.061981f, 0.067322f, 0.072449f, 0.078796f, 0.084717f, - 0.091919f, 0.098999f, 0.106995f, 0.115417f, 0.124084f, 0.133667f, 0.143433f, 0.154297f, - 0.165161f, 0.177124f, 0.189697f, 0.202759f, 0.216309f, 0.230713f, 0.245728f, 0.261719f, - 0.278320f, 0.295410f, 0.312256f, 0.330566f, 0.349365f, 0.367676f, 0.386719f, 0.406494f, - 0.427246f, 0.447266f, 0.468506f, 0.489746f, 0.510742f, 0.532227f, 0.553711f, 0.575684f, - 0.597656f, 0.619141f, 0.826172f, 0.837402f, 0.837891f, 0.837402f, 0.835449f, 0.833984f, - 0.001134f, 0.003105f, 0.005337f, 0.007462f, 0.009628f, 0.011833f, 0.014137f, 0.016113f, - 0.018875f, 0.021484f, 0.024063f, 0.026581f, 0.029709f, 0.032623f, 0.036194f, 0.039703f, - 0.043335f, 0.047058f, 0.051422f, 0.055908f, 0.060608f, 0.065491f, 0.071167f, 0.076843f, - 0.083313f, 0.089661f, 0.097168f, 0.104492f, 0.112122f, 0.121155f, 0.130615f, 0.140137f, - 0.150757f, 0.161499f, 0.173462f, 0.185547f, 0.199341f, 0.212524f, 0.227051f, 0.242310f, - 0.258057f, 0.274414f, 0.291016f, 0.309082f, 0.327148f, 0.345459f, 0.364990f, 0.384521f, - 0.404297f, 0.425781f, 0.445801f, 0.467285f, 0.489258f, 0.510254f, 0.533203f, 0.555664f, - 0.578125f, 0.601074f, 0.817871f, 0.830078f, 0.831055f, 0.830078f, 0.829102f, 0.828125f, - 0.001101f, 0.003019f, 0.004818f, 0.006725f, 0.008781f, 0.010864f, 0.013069f, 0.014801f, - 0.017151f, 0.019531f, 0.021973f, 0.024429f, 0.026917f, 0.030121f, 0.033112f, 0.036041f, - 0.039337f, 0.042542f, 0.046509f, 0.050537f, 0.054596f, 0.058990f, 0.064209f, 0.069519f, - 0.075134f, 0.080994f, 0.087158f, 0.094177f, 0.102051f, 0.109741f, 0.117981f, 0.127319f, - 0.136963f, 0.147095f, 0.158081f, 0.169434f, 0.182251f, 0.195557f, 0.208984f, 0.223267f, - 0.238281f, 0.254639f, 0.270996f, 0.288330f, 0.305908f, 0.324219f, 0.343018f, 0.362549f, - 0.382324f, 0.402832f, 0.424805f, 0.445312f, 0.467529f, 0.489258f, 0.511230f, 0.535645f, - 0.558594f, 0.582031f, 0.809082f, 0.822266f, 0.824219f, 0.823242f, 0.821777f, 0.820801f, - 0.000987f, 0.002644f, 0.004562f, 0.006344f, 0.008133f, 0.009918f, 0.011696f, 0.013527f, - 0.015572f, 0.017746f, 0.019714f, 0.021942f, 0.024155f, 0.027069f, 0.029678f, 0.032288f, - 0.035156f, 0.038574f, 0.041779f, 0.045319f, 0.049225f, 0.053284f, 0.057678f, 0.062225f, - 0.067505f, 0.072571f, 0.078613f, 0.084961f, 0.092041f, 0.098938f, 0.106506f, 0.115112f, - 0.123779f, 0.133667f, 0.143311f, 0.154541f, 0.165894f, 0.178345f, 0.191406f, 0.205200f, - 0.219238f, 0.234985f, 0.250977f, 0.267578f, 0.284912f, 0.302734f, 0.321289f, 0.340332f, - 0.360352f, 0.380615f, 0.401611f, 0.423340f, 0.445312f, 0.467529f, 0.490967f, 0.514160f, - 0.537598f, 0.561035f, 0.800293f, 0.814453f, 0.815918f, 0.815918f, 0.814941f, 0.813965f, - 0.000932f, 0.002567f, 0.004009f, 0.005722f, 0.007538f, 0.008812f, 0.010864f, 0.012413f, - 0.014290f, 0.015991f, 0.018051f, 0.019836f, 0.022247f, 0.024506f, 0.026520f, 0.029175f, - 0.031769f, 0.034332f, 0.037689f, 0.040466f, 0.043945f, 0.047607f, 0.051605f, 0.055817f, - 0.060486f, 0.065125f, 0.070557f, 0.076111f, 0.081909f, 0.088806f, 0.095886f, 0.103210f, - 0.111755f, 0.120422f, 0.130249f, 0.140137f, 0.150513f, 0.162109f, 0.174561f, 0.187256f, - 0.200928f, 0.215698f, 0.231323f, 0.246582f, 0.264160f, 0.281982f, 0.299561f, 0.319092f, - 0.338623f, 0.358643f, 0.379883f, 0.400879f, 0.423096f, 0.445557f, 0.468750f, 0.492188f, - 0.516113f, 0.541504f, 0.791016f, 0.805664f, 0.808105f, 0.808594f, 0.807129f, 0.806641f, - 0.000871f, 0.002337f, 0.003727f, 0.005474f, 0.006641f, 0.008377f, 0.009567f, 0.011154f, - 0.012848f, 0.014610f, 0.016235f, 0.017960f, 0.019958f, 0.021729f, 0.023926f, 0.026154f, - 0.028351f, 0.030975f, 0.033722f, 0.036407f, 0.039459f, 0.042694f, 0.046082f, 0.049896f, - 0.053833f, 0.058167f, 0.062744f, 0.067932f, 0.073608f, 0.079468f, 0.085632f, 0.092651f, - 0.100098f, 0.108521f, 0.116699f, 0.126099f, 0.136108f, 0.146606f, 0.157959f, 0.170410f, - 0.183594f, 0.197510f, 0.212280f, 0.227295f, 0.243652f, 0.260986f, 0.278564f, 0.297607f, - 0.316406f, 0.336426f, 0.357178f, 0.378662f, 0.400146f, 0.422852f, 0.446045f, 0.470215f, - 0.494873f, 0.520020f, 0.781250f, 0.796875f, 0.800293f, 0.800781f, 0.799805f, 0.799316f, - 0.000782f, 0.002131f, 0.003649f, 0.004715f, 0.006054f, 0.007458f, 0.008759f, 0.010269f, - 0.011711f, 0.012970f, 0.014664f, 0.016327f, 0.017914f, 0.019699f, 0.021423f, 0.023499f, - 0.025391f, 0.027374f, 0.029999f, 0.032501f, 0.035156f, 0.037872f, 0.040710f, 0.044403f, - 0.047791f, 0.051880f, 0.055969f, 0.060364f, 0.065247f, 0.070496f, 0.076172f, 0.082825f, - 0.089294f, 0.096497f, 0.104431f, 0.112854f, 0.122375f, 0.132202f, 0.142700f, 0.153931f, - 0.166260f, 0.179565f, 0.193481f, 0.208008f, 0.223877f, 0.240479f, 0.257568f, 0.275879f, - 0.294922f, 0.314453f, 0.334961f, 0.355957f, 0.377686f, 0.400391f, 0.423828f, 0.448730f, - 0.472900f, 0.498535f, 0.771484f, 0.789062f, 0.791504f, 0.792480f, 0.791016f, 0.791016f, - 0.000742f, 0.001822f, 0.003183f, 0.004444f, 0.005600f, 0.006550f, 0.008087f, 0.009247f, - 0.010559f, 0.011650f, 0.013184f, 0.014565f, 0.016083f, 0.017548f, 0.019119f, 0.020737f, - 0.022644f, 0.024597f, 0.026627f, 0.028809f, 0.031281f, 0.033539f, 0.036469f, 0.039429f, - 0.042480f, 0.045654f, 0.049561f, 0.053406f, 0.057739f, 0.062469f, 0.067749f, 0.073364f, - 0.079773f, 0.086121f, 0.093262f, 0.100647f, 0.109253f, 0.118042f, 0.128174f, 0.138550f, - 0.150024f, 0.162231f, 0.175171f, 0.189087f, 0.204468f, 0.220215f, 0.236938f, 0.254639f, - 0.273438f, 0.292236f, 0.312012f, 0.333252f, 0.355957f, 0.377686f, 0.401367f, 0.425781f, - 0.451416f, 0.476318f, 0.761230f, 0.779785f, 0.782227f, 0.782715f, 0.782715f, 0.782715f, - 0.000632f, 0.001970f, 0.003042f, 0.004025f, 0.005173f, 0.006435f, 0.007343f, 0.008522f, - 0.009369f, 0.010475f, 0.011726f, 0.012962f, 0.014145f, 0.015411f, 0.016922f, 0.018478f, - 0.020111f, 0.021835f, 0.023682f, 0.025253f, 0.027466f, 0.029678f, 0.032196f, 0.034607f, - 0.037415f, 0.040497f, 0.043610f, 0.047089f, 0.051178f, 0.055573f, 0.059845f, 0.064758f, - 0.070068f, 0.076111f, 0.082275f, 0.089417f, 0.096863f, 0.105286f, 0.114441f, 0.123535f, - 0.134399f, 0.145508f, 0.157959f, 0.171387f, 0.185425f, 0.200806f, 0.216919f, 0.233521f, - 0.251953f, 0.270508f, 0.290527f, 0.310791f, 0.332275f, 0.355469f, 0.378418f, 0.403564f, - 0.428223f, 0.455322f, 0.750977f, 0.770996f, 0.774414f, 0.774414f, 0.774902f, 0.773926f, - 0.000517f, 0.001554f, 0.002741f, 0.003695f, 0.004669f, 0.005417f, 0.006466f, 0.007545f, - 0.008453f, 0.009499f, 0.010468f, 0.011490f, 0.012718f, 0.013985f, 0.014977f, 0.016235f, - 0.017868f, 0.019211f, 0.020630f, 0.022263f, 0.024078f, 0.026291f, 0.028275f, 0.030380f, - 0.032928f, 0.035675f, 0.038513f, 0.041656f, 0.044769f, 0.048523f, 0.052216f, 0.057007f, - 0.061493f, 0.066711f, 0.072510f, 0.078735f, 0.085327f, 0.093201f, 0.101135f, 0.109619f, - 0.119690f, 0.130371f, 0.141602f, 0.154053f, 0.167480f, 0.181396f, 0.197021f, 0.213623f, - 0.230835f, 0.248901f, 0.268066f, 0.289062f, 0.310303f, 0.332520f, 0.355225f, 0.379639f, - 0.405273f, 0.432373f, 0.740234f, 0.760742f, 0.763672f, 0.765625f, 0.765625f, 0.765625f, - 0.000588f, 0.001405f, 0.002306f, 0.003370f, 0.004375f, 0.005116f, 0.005817f, 0.006630f, - 0.007797f, 0.008507f, 0.009216f, 0.010254f, 0.011246f, 0.012154f, 0.013191f, 0.014366f, - 0.015503f, 0.016785f, 0.018127f, 0.019562f, 0.021072f, 0.022919f, 0.024643f, 0.026749f, - 0.028564f, 0.031006f, 0.033203f, 0.036072f, 0.039032f, 0.042114f, 0.045654f, 0.049561f, - 0.053650f, 0.058380f, 0.063049f, 0.068848f, 0.075256f, 0.081543f, 0.088562f, 0.096924f, - 0.105652f, 0.115173f, 0.125977f, 0.137207f, 0.149902f, 0.163208f, 0.177979f, 0.193726f, - 0.210205f, 0.228027f, 0.247070f, 0.266602f, 0.287842f, 0.309326f, 0.333008f, 0.356934f, - 0.382568f, 0.408691f, 0.729004f, 0.751953f, 0.755371f, 0.756348f, 0.757324f, 0.756348f, - 0.000431f, 0.001562f, 0.002253f, 0.003088f, 0.003944f, 0.004536f, 0.005066f, 0.006020f, - 0.006840f, 0.007542f, 0.008347f, 0.008949f, 0.009827f, 0.010719f, 0.011696f, 0.012756f, - 0.013649f, 0.014679f, 0.015808f, 0.017288f, 0.018356f, 0.019913f, 0.021332f, 0.023148f, - 0.024719f, 0.026840f, 0.029007f, 0.031250f, 0.033661f, 0.036469f, 0.039490f, 0.042969f, - 0.046326f, 0.050293f, 0.054901f, 0.059845f, 0.064941f, 0.071289f, 0.077454f, 0.084656f, - 0.092529f, 0.101562f, 0.111145f, 0.121460f, 0.132935f, 0.145386f, 0.159302f, 0.174438f, - 0.190186f, 0.206909f, 0.225098f, 0.244751f, 0.265381f, 0.287109f, 0.310059f, 0.333984f, - 0.359131f, 0.386230f, 0.716797f, 0.740723f, 0.744629f, 0.746582f, 0.747070f, 0.747070f, - 0.000576f, 0.001266f, 0.002028f, 0.002766f, 0.003317f, 0.004051f, 0.004742f, 0.005459f, - 0.006054f, 0.006641f, 0.007240f, 0.007919f, 0.008644f, 0.009300f, 0.010170f, 0.010925f, - 0.011795f, 0.012733f, 0.013855f, 0.014885f, 0.015900f, 0.017212f, 0.018326f, 0.019684f, - 0.021469f, 0.023178f, 0.024734f, 0.026794f, 0.028946f, 0.031204f, 0.033844f, 0.036682f, - 0.039948f, 0.043335f, 0.047150f, 0.051422f, 0.055969f, 0.061066f, 0.067139f, 0.073242f, - 0.080444f, 0.088440f, 0.096985f, 0.106445f, 0.116943f, 0.128906f, 0.141479f, 0.154907f, - 0.170410f, 0.186523f, 0.204102f, 0.222900f, 0.243774f, 0.264160f, 0.286865f, 0.310791f, - 0.336182f, 0.362793f, 0.705078f, 0.730469f, 0.735352f, 0.736816f, 0.737793f, 0.736816f, - 0.000307f, 0.001126f, 0.001758f, 0.002436f, 0.002911f, 0.003540f, 0.004047f, 0.004711f, - 0.005245f, 0.005749f, 0.006302f, 0.006844f, 0.007355f, 0.008095f, 0.008835f, 0.009438f, - 0.010139f, 0.010941f, 0.011963f, 0.012878f, 0.013519f, 0.014847f, 0.015945f, 0.017029f, - 0.018250f, 0.019669f, 0.021362f, 0.022675f, 0.024750f, 0.026657f, 0.028854f, 0.031219f, - 0.033844f, 0.036804f, 0.040222f, 0.043793f, 0.047791f, 0.052185f, 0.057251f, 0.062866f, - 0.069275f, 0.075867f, 0.083923f, 0.092407f, 0.102295f, 0.112366f, 0.124207f, 0.137085f, - 0.151489f, 0.167114f, 0.183838f, 0.202148f, 0.221558f, 0.242065f, 0.263916f, 0.287842f, - 0.312256f, 0.339111f, 0.693848f, 0.719727f, 0.724609f, 0.726074f, 0.727539f, 0.727051f, - 0.000428f, 0.000939f, 0.001581f, 0.002033f, 0.002665f, 0.003222f, 0.003660f, 0.004059f, - 0.004475f, 0.004997f, 0.005554f, 0.006031f, 0.006371f, 0.007080f, 0.007511f, 0.008263f, - 0.008820f, 0.009552f, 0.010124f, 0.010948f, 0.011665f, 0.012550f, 0.013397f, 0.014526f, - 0.015388f, 0.016754f, 0.017960f, 0.019257f, 0.020844f, 0.022583f, 0.024246f, 0.026642f, - 0.028656f, 0.031128f, 0.033783f, 0.036865f, 0.040253f, 0.044312f, 0.048523f, 0.053314f, - 0.058655f, 0.064880f, 0.071594f, 0.079102f, 0.087891f, 0.097107f, 0.108276f, 0.119751f, - 0.133179f, 0.148071f, 0.163818f, 0.180908f, 0.199951f, 0.219849f, 0.241699f, 0.264160f, - 0.288818f, 0.315918f, 0.680176f, 0.708496f, 0.713867f, 0.716309f, 0.716797f, 0.717285f, - 0.000467f, 0.001054f, 0.001476f, 0.001825f, 0.002386f, 0.002644f, 0.003218f, 0.003553f, - 0.003866f, 0.004433f, 0.004700f, 0.004948f, 0.005505f, 0.006023f, 0.006405f, 0.006920f, - 0.007484f, 0.008057f, 0.008598f, 0.009178f, 0.009857f, 0.010551f, 0.011169f, 0.012199f, - 0.013092f, 0.014084f, 0.015091f, 0.016205f, 0.017303f, 0.018845f, 0.020538f, 0.021957f, - 0.023773f, 0.025833f, 0.028152f, 0.030716f, 0.033661f, 0.036896f, 0.040405f, 0.044708f, - 0.049286f, 0.054321f, 0.060333f, 0.067322f, 0.074890f, 0.083435f, 0.092651f, 0.103516f, - 0.115784f, 0.129028f, 0.144287f, 0.160278f, 0.178345f, 0.197632f, 0.218994f, 0.241089f, - 0.265869f, 0.292725f, 0.667969f, 0.697266f, 0.702637f, 0.704590f, 0.706055f, 0.707031f, - 0.000348f, 0.000841f, 0.001292f, 0.001580f, 0.001961f, 0.002508f, 0.002630f, 0.002993f, - 0.003458f, 0.003738f, 0.003952f, 0.004425f, 0.004639f, 0.005070f, 0.005547f, 0.005840f, - 0.006462f, 0.006844f, 0.007214f, 0.007698f, 0.008339f, 0.008980f, 0.009560f, 0.010094f, - 0.010941f, 0.011711f, 0.012550f, 0.013565f, 0.014404f, 0.015579f, 0.016754f, 0.018082f, - 0.019592f, 0.021439f, 0.023209f, 0.025375f, 0.027863f, 0.030411f, 0.033478f, 0.037018f, - 0.040680f, 0.045105f, 0.050476f, 0.056183f, 0.062805f, 0.070251f, 0.078613f, 0.088196f, - 0.099060f, 0.111450f, 0.125122f, 0.140869f, 0.158203f, 0.176880f, 0.197266f, 0.218506f, - 0.242798f, 0.268555f, 0.655273f, 0.686035f, 0.691406f, 0.694336f, 0.695312f, 0.695801f, - 0.000170f, 0.000976f, 0.001161f, 0.001441f, 0.001846f, 0.002144f, 0.002367f, 0.002632f, - 0.002892f, 0.003178f, 0.003435f, 0.003618f, 0.004021f, 0.004292f, 0.004562f, 0.005028f, - 0.005405f, 0.005623f, 0.006069f, 0.006577f, 0.006973f, 0.007431f, 0.007904f, 0.008484f, - 0.009018f, 0.009659f, 0.010559f, 0.010994f, 0.012009f, 0.012840f, 0.013901f, 0.014915f, - 0.016129f, 0.017502f, 0.019089f, 0.020676f, 0.022568f, 0.024673f, 0.027252f, 0.029984f, - 0.033234f, 0.037079f, 0.041016f, 0.045868f, 0.051758f, 0.058014f, 0.065613f, 0.073853f, - 0.083801f, 0.094727f, 0.107483f, 0.121826f, 0.137573f, 0.156006f, 0.175049f, 0.196167f, - 0.219482f, 0.245850f, 0.641113f, 0.673340f, 0.679688f, 0.681641f, 0.683594f, 0.684082f, - 0.000293f, 0.000601f, 0.001049f, 0.001358f, 0.001532f, 0.001719f, 0.001882f, 0.002298f, - 0.002317f, 0.002628f, 0.002750f, 0.003143f, 0.003363f, 0.003559f, 0.003866f, 0.004204f, - 0.004383f, 0.004753f, 0.005028f, 0.005348f, 0.005863f, 0.006176f, 0.006569f, 0.006954f, - 0.007401f, 0.008057f, 0.008537f, 0.009178f, 0.009735f, 0.010521f, 0.011208f, 0.011978f, - 0.013130f, 0.014099f, 0.015289f, 0.016739f, 0.018219f, 0.019821f, 0.021713f, 0.024200f, - 0.026749f, 0.029785f, 0.033386f, 0.036987f, 0.041840f, 0.047089f, 0.053253f, 0.060760f, - 0.069214f, 0.079224f, 0.090515f, 0.103638f, 0.118652f, 0.135376f, 0.154175f, 0.174561f, - 0.196777f, 0.222534f, 0.628906f, 0.660645f, 0.668457f, 0.670410f, 0.672852f, 0.673340f, - 0.000258f, 0.000656f, 0.000811f, 0.001049f, 0.001288f, 0.001462f, 0.001599f, 0.001740f, - 0.002012f, 0.002171f, 0.002367f, 0.002535f, 0.002705f, 0.002880f, 0.003115f, 0.003429f, - 0.003666f, 0.003897f, 0.004116f, 0.004398f, 0.004635f, 0.005066f, 0.005341f, 0.005779f, - 0.006042f, 0.006454f, 0.006954f, 0.007450f, 0.007835f, 0.008400f, 0.009132f, 0.009819f, - 0.010536f, 0.011307f, 0.012245f, 0.013229f, 0.014580f, 0.015900f, 0.017303f, 0.019119f, - 0.021103f, 0.023468f, 0.026123f, 0.029495f, 0.033112f, 0.037628f, 0.042938f, 0.048859f, - 0.056152f, 0.064941f, 0.074829f, 0.086548f, 0.100281f, 0.115967f, 0.133545f, 0.153198f, - 0.175171f, 0.199341f, 0.613770f, 0.648926f, 0.655273f, 0.658691f, 0.660645f, 0.662598f, - 0.000176f, 0.000474f, 0.000602f, 0.000854f, 0.001030f, 0.001240f, 0.001349f, 0.001505f, - 0.001580f, 0.001738f, 0.001957f, 0.002068f, 0.002230f, 0.002420f, 0.002556f, 0.002705f, - 0.002998f, 0.003178f, 0.003345f, 0.003567f, 0.003811f, 0.004105f, 0.004284f, 0.004593f, - 0.004848f, 0.005173f, 0.005527f, 0.005939f, 0.006306f, 0.006817f, 0.007366f, 0.007729f, - 0.008339f, 0.008995f, 0.009644f, 0.010551f, 0.011360f, 0.012344f, 0.013710f, 0.015030f, - 0.016510f, 0.018143f, 0.020279f, 0.022751f, 0.025650f, 0.029144f, 0.033508f, 0.038452f, - 0.044556f, 0.052032f, 0.060364f, 0.070923f, 0.082642f, 0.097290f, 0.113525f, 0.132446f, - 0.153442f, 0.176880f, 0.600586f, 0.636719f, 0.644531f, 0.647461f, 0.648926f, 0.649414f, - 0.000121f, 0.000426f, 0.000509f, 0.000778f, 0.000931f, 0.000992f, 0.001135f, 0.001303f, - 0.001359f, 0.001410f, 0.001519f, 0.001722f, 0.001751f, 0.001951f, 0.002060f, 0.002218f, - 0.002287f, 0.002487f, 0.002670f, 0.002848f, 0.003061f, 0.003233f, 0.003452f, 0.003664f, - 0.003883f, 0.004078f, 0.004379f, 0.004692f, 0.004982f, 0.005329f, 0.005756f, 0.006081f, - 0.006504f, 0.007019f, 0.007599f, 0.008217f, 0.008850f, 0.009628f, 0.010437f, 0.011597f, - 0.012650f, 0.013931f, 0.015480f, 0.017380f, 0.019577f, 0.022247f, 0.025513f, 0.029617f, - 0.034363f, 0.040314f, 0.047241f, 0.056274f, 0.066711f, 0.079773f, 0.094482f, 0.112488f, - 0.132446f, 0.154907f, 0.585449f, 0.624023f, 0.630371f, 0.634277f, 0.636230f, 0.637207f, - 0.000161f, 0.000263f, 0.000526f, 0.000627f, 0.000723f, 0.000775f, 0.000856f, 0.000960f, - 0.001079f, 0.001158f, 0.001208f, 0.001272f, 0.001441f, 0.001557f, 0.001657f, 0.001702f, - 0.001897f, 0.001918f, 0.002151f, 0.002232f, 0.002337f, 0.002522f, 0.002720f, 0.002865f, - 0.003029f, 0.003193f, 0.003387f, 0.003601f, 0.003887f, 0.004124f, 0.004356f, 0.004639f, - 0.005070f, 0.005466f, 0.005863f, 0.006298f, 0.006874f, 0.007290f, 0.007965f, 0.008774f, - 0.009560f, 0.010666f, 0.011719f, 0.013077f, 0.014679f, 0.016693f, 0.019058f, 0.021881f, - 0.025528f, 0.030121f, 0.036011f, 0.043396f, 0.052460f, 0.063477f, 0.076721f, 0.093079f, - 0.112305f, 0.133667f, 0.572266f, 0.609375f, 0.618164f, 0.622070f, 0.623535f, 0.625488f, - 0.000109f, 0.000212f, 0.000404f, 0.000578f, 0.000567f, 0.000655f, 0.000763f, 0.000676f, - 0.000824f, 0.000869f, 0.000971f, 0.001064f, 0.001132f, 0.001210f, 0.001212f, 0.001398f, - 0.001486f, 0.001525f, 0.001653f, 0.001676f, 0.001867f, 0.001953f, 0.002062f, 0.002199f, - 0.002295f, 0.002443f, 0.002586f, 0.002766f, 0.002979f, 0.003128f, 0.003429f, 0.003551f, - 0.003763f, 0.004074f, 0.004349f, 0.004688f, 0.005032f, 0.005470f, 0.005894f, 0.006519f, - 0.007092f, 0.007896f, 0.008629f, 0.009659f, 0.010910f, 0.012215f, 0.013962f, 0.015991f, - 0.018646f, 0.021881f, 0.026428f, 0.032074f, 0.039276f, 0.048645f, 0.060455f, 0.075256f, - 0.092773f, 0.113220f, 0.554688f, 0.596191f, 0.605957f, 0.608887f, 0.610352f, 0.612305f, - 0.000202f, 0.000186f, 0.000312f, 0.000433f, 0.000382f, 0.000543f, 0.000482f, 0.000546f, - 0.000621f, 0.000666f, 0.000789f, 0.000802f, 0.000859f, 0.000950f, 0.000970f, 0.000975f, - 0.001113f, 0.001162f, 0.001207f, 0.001312f, 0.001362f, 0.001433f, 0.001541f, 0.001618f, - 0.001720f, 0.001791f, 0.001966f, 0.002035f, 0.002199f, 0.002413f, 0.002546f, 0.002626f, - 0.002855f, 0.003063f, 0.003204f, 0.003448f, 0.003693f, 0.003986f, 0.004364f, 0.004684f, - 0.005127f, 0.005619f, 0.006271f, 0.006870f, 0.007748f, 0.008713f, 0.009911f, 0.011368f, - 0.013191f, 0.015518f, 0.018646f, 0.022644f, 0.028107f, 0.035645f, 0.045471f, 0.058502f, - 0.074646f, 0.093994f, 0.541016f, 0.583008f, 0.591797f, 0.596191f, 0.599121f, 0.600098f, - 0.000000f, 0.000179f, 0.000242f, 0.000318f, 0.000341f, 0.000345f, 0.000432f, 0.000364f, - 0.000475f, 0.000483f, 0.000572f, 0.000576f, 0.000619f, 0.000640f, 0.000716f, 0.000737f, - 0.000791f, 0.000845f, 0.000871f, 0.000907f, 0.000998f, 0.001025f, 0.001107f, 0.001181f, - 0.001244f, 0.001303f, 0.001391f, 0.001462f, 0.001549f, 0.001631f, 0.001756f, 0.001906f, - 0.001984f, 0.002161f, 0.002264f, 0.002419f, 0.002613f, 0.002825f, 0.003103f, 0.003321f, - 0.003584f, 0.003893f, 0.004349f, 0.004799f, 0.005383f, 0.006020f, 0.006836f, 0.007858f, - 0.009117f, 0.010674f, 0.012825f, 0.015533f, 0.019363f, 0.024780f, 0.032593f, 0.043274f, - 0.057770f, 0.076111f, 0.525879f, 0.569336f, 0.578613f, 0.583008f, 0.585449f, 0.586426f, - 0.000000f, 0.000088f, 0.000192f, 0.000227f, 0.000230f, 0.000286f, 0.000255f, 0.000317f, - 0.000321f, 0.000371f, 0.000401f, 0.000373f, 0.000391f, 0.000457f, 0.000474f, 0.000530f, - 0.000509f, 0.000585f, 0.000625f, 0.000664f, 0.000707f, 0.000746f, 0.000772f, 0.000817f, - 0.000877f, 0.000887f, 0.000978f, 0.001007f, 0.001069f, 0.001202f, 0.001192f, 0.001290f, - 0.001356f, 0.001464f, 0.001583f, 0.001678f, 0.001771f, 0.001929f, 0.002050f, 0.002230f, - 0.002424f, 0.002651f, 0.002888f, 0.003176f, 0.003534f, 0.003967f, 0.004475f, 0.005154f, - 0.005993f, 0.007118f, 0.008469f, 0.010338f, 0.012794f, 0.016403f, 0.021957f, 0.030090f, - 0.042419f, 0.059052f, 0.510254f, 0.554199f, 0.564453f, 0.570312f, 0.572754f, 0.573242f, - 0.000000f, 0.000126f, 0.000180f, 0.000121f, 0.000178f, 0.000176f, 0.000177f, 0.000212f, - 0.000210f, 0.000228f, 0.000238f, 0.000291f, 0.000280f, 0.000298f, 0.000336f, 0.000350f, - 0.000369f, 0.000387f, 0.000395f, 0.000427f, 0.000460f, 0.000476f, 0.000515f, 0.000536f, - 0.000573f, 0.000619f, 0.000650f, 0.000670f, 0.000703f, 0.000746f, 0.000798f, 0.000836f, - 0.000902f, 0.000949f, 0.001031f, 0.001062f, 0.001162f, 0.001227f, 0.001349f, 0.001442f, - 0.001533f, 0.001690f, 0.001865f, 0.001995f, 0.002228f, 0.002495f, 0.002800f, 0.003191f, - 0.003653f, 0.004349f, 0.005203f, 0.006393f, 0.008026f, 0.010307f, 0.013710f, 0.019379f, - 0.028854f, 0.043457f, 0.494873f, 0.541016f, 0.550781f, 0.555664f, 0.558105f, 0.559570f, - 0.000000f, 0.000095f, 0.000086f, 0.000079f, 0.000105f, 0.000124f, 0.000111f, 0.000137f, - 0.000141f, 0.000142f, 0.000147f, 0.000151f, 0.000160f, 0.000181f, 0.000202f, 0.000207f, - 0.000214f, 0.000248f, 0.000244f, 0.000282f, 0.000273f, 0.000283f, 0.000306f, 0.000334f, - 0.000367f, 0.000378f, 0.000376f, 0.000399f, 0.000437f, 0.000459f, 0.000474f, 0.000516f, - 0.000552f, 0.000567f, 0.000616f, 0.000649f, 0.000693f, 0.000743f, 0.000805f, 0.000851f, - 0.000918f, 0.000999f, 0.001085f, 0.001195f, 0.001309f, 0.001466f, 0.001644f, 0.001850f, - 0.002151f, 0.002487f, 0.002974f, 0.003654f, 0.004574f, 0.006001f, 0.008156f, 0.011452f, - 0.017853f, 0.029739f, 0.478271f, 0.526367f, 0.537109f, 0.541504f, 0.544434f, 0.545898f, - 0.000106f, 0.000085f, 0.000074f, 0.000067f, 0.000066f, 0.000070f, 0.000069f, 0.000073f, - 0.000073f, 0.000080f, 0.000084f, 0.000109f, 0.000093f, 0.000098f, 0.000119f, 0.000108f, - 0.000128f, 0.000135f, 0.000137f, 0.000149f, 0.000150f, 0.000157f, 0.000182f, 0.000185f, - 0.000207f, 0.000206f, 0.000214f, 0.000234f, 0.000237f, 0.000253f, 0.000267f, 0.000289f, - 0.000306f, 0.000313f, 0.000344f, 0.000352f, 0.000384f, 0.000406f, 0.000445f, 0.000467f, - 0.000503f, 0.000543f, 0.000593f, 0.000634f, 0.000697f, 0.000764f, 0.000850f, 0.000963f, - 0.001105f, 0.001298f, 0.001536f, 0.001856f, 0.002333f, 0.003069f, 0.004299f, 0.006271f, - 0.009789f, 0.018234f, 0.462402f, 0.511719f, 0.522949f, 0.527344f, 0.530762f, 0.532715f, - 0.000091f, 0.000069f, 0.000060f, 0.000054f, 0.000049f, 0.000046f, 0.000043f, 0.000041f, - 0.000040f, 0.000044f, 0.000040f, 0.000040f, 0.000054f, 0.000044f, 0.000045f, 0.000044f, - 0.000062f, 0.000062f, 0.000069f, 0.000071f, 0.000074f, 0.000079f, 0.000081f, 0.000081f, - 0.000085f, 0.000099f, 0.000098f, 0.000115f, 0.000115f, 0.000119f, 0.000125f, 0.000130f, - 0.000140f, 0.000144f, 0.000165f, 0.000172f, 0.000178f, 0.000191f, 0.000205f, 0.000222f, - 0.000234f, 0.000251f, 0.000276f, 0.000293f, 0.000327f, 0.000354f, 0.000392f, 0.000437f, - 0.000494f, 0.000562f, 0.000662f, 0.000800f, 0.001005f, 0.001315f, 0.001852f, 0.002825f, - 0.004723f, 0.009285f, 0.446533f, 0.497803f, 0.508301f, 0.514160f, 0.516602f, 0.519043f, - 0.000067f, 0.000048f, 0.000040f, 0.000036f, 0.000033f, 0.000031f, 0.000030f, 0.000028f, - 0.000027f, 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000022f, 0.000021f, 0.000020f, - 0.000019f, 0.000020f, 0.000024f, 0.000026f, 0.000025f, 0.000027f, 0.000031f, 0.000032f, - 0.000032f, 0.000037f, 0.000041f, 0.000038f, 0.000045f, 0.000042f, 0.000048f, 0.000049f, - 0.000053f, 0.000055f, 0.000059f, 0.000062f, 0.000071f, 0.000074f, 0.000077f, 0.000081f, - 0.000086f, 0.000091f, 0.000098f, 0.000109f, 0.000116f, 0.000125f, 0.000137f, 0.000158f, - 0.000173f, 0.000193f, 0.000230f, 0.000273f, 0.000335f, 0.000425f, 0.000603f, 0.000935f, - 0.001694f, 0.003727f, 0.431396f, 0.481934f, 0.493652f, 0.499512f, 0.502930f, 0.504883f, - 0.000021f, 0.000016f, 0.000013f, 0.000012f, 0.000013f, 0.000012f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000009f, 0.000009f, 0.000010f, - 0.000010f, 0.000013f, 0.000014f, 0.000013f, 0.000015f, 0.000016f, 0.000017f, 0.000019f, - 0.000019f, 0.000020f, 0.000023f, 0.000026f, 0.000027f, 0.000027f, 0.000032f, 0.000030f, - 0.000036f, 0.000039f, 0.000050f, 0.000056f, 0.000063f, 0.000082f, 0.000109f, 0.000168f, - 0.000317f, 0.000922f, 0.415283f, 0.467773f, 0.479980f, 0.486328f, 0.489014f, 0.490723f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000005f, - 0.000008f, 0.000026f, 0.398926f, 0.452881f, 0.465576f, 0.471436f, 0.474854f, 0.477051f, - }, - { - 0.019653f, 0.058990f, 0.097473f, 0.134277f, 0.169189f, 0.203491f, 0.236450f, 0.267578f, - 0.297852f, 0.326416f, 0.354004f, 0.380859f, 0.406250f, 0.431641f, 0.455078f, 0.477539f, - 0.500000f, 0.520996f, 0.541504f, 0.560547f, 0.580566f, 0.598633f, 0.615723f, 0.633301f, - 0.649902f, 0.666016f, 0.681641f, 0.695801f, 0.709961f, 0.724609f, 0.738770f, 0.751953f, - 0.765137f, 0.775879f, 0.788574f, 0.799805f, 0.812012f, 0.822754f, 0.833496f, 0.844238f, - 0.854004f, 0.864258f, 0.874023f, 0.883301f, 0.891602f, 0.900391f, 0.909668f, 0.917969f, - 0.925781f, 0.934570f, 0.941895f, 0.949707f, 0.956543f, 0.963379f, 0.970703f, 0.977539f, - 0.984863f, 0.991211f, 0.988770f, 0.972656f, 0.960449f, 0.949707f, 0.940430f, 0.931641f, - 0.017303f, 0.052399f, 0.086548f, 0.119446f, 0.153076f, 0.183594f, 0.214722f, 0.245117f, - 0.273193f, 0.301270f, 0.328613f, 0.354492f, 0.379883f, 0.404541f, 0.427979f, 0.450195f, - 0.472656f, 0.494629f, 0.515137f, 0.534668f, 0.554199f, 0.573242f, 0.591309f, 0.608887f, - 0.625977f, 0.642578f, 0.658203f, 0.672852f, 0.688477f, 0.704102f, 0.717285f, 0.731445f, - 0.744629f, 0.756836f, 0.769531f, 0.782715f, 0.793945f, 0.805664f, 0.816406f, 0.828125f, - 0.838379f, 0.849121f, 0.858887f, 0.868652f, 0.877930f, 0.888184f, 0.896973f, 0.905762f, - 0.915039f, 0.921875f, 0.930176f, 0.937988f, 0.946777f, 0.954102f, 0.960938f, 0.968750f, - 0.975586f, 0.982422f, 0.984375f, 0.969238f, 0.957520f, 0.947754f, 0.938477f, 0.930176f, - 0.015221f, 0.045837f, 0.076843f, 0.107666f, 0.136719f, 0.166504f, 0.196045f, 0.223999f, - 0.250244f, 0.278320f, 0.303711f, 0.329346f, 0.353271f, 0.378906f, 0.401367f, 0.424316f, - 0.447266f, 0.468018f, 0.487793f, 0.508301f, 0.529297f, 0.547363f, 0.566406f, 0.583984f, - 0.601562f, 0.618652f, 0.634766f, 0.650879f, 0.666016f, 0.681641f, 0.695801f, 0.710449f, - 0.724121f, 0.737305f, 0.750488f, 0.762695f, 0.775391f, 0.788086f, 0.799316f, 0.811035f, - 0.821777f, 0.833008f, 0.844238f, 0.854004f, 0.864258f, 0.874023f, 0.882812f, 0.892578f, - 0.901367f, 0.910156f, 0.918457f, 0.926758f, 0.936035f, 0.942871f, 0.950684f, 0.958496f, - 0.965820f, 0.973145f, 0.980469f, 0.965820f, 0.955078f, 0.945312f, 0.936523f, 0.928223f, - 0.013420f, 0.041138f, 0.068359f, 0.096436f, 0.124023f, 0.150879f, 0.177246f, 0.204224f, - 0.230103f, 0.255859f, 0.281494f, 0.305420f, 0.329834f, 0.352783f, 0.376709f, 0.398682f, - 0.420654f, 0.442627f, 0.462646f, 0.483887f, 0.502441f, 0.521484f, 0.540527f, 0.559082f, - 0.576172f, 0.595703f, 0.611328f, 0.627930f, 0.644043f, 0.659668f, 0.674316f, 0.688965f, - 0.703613f, 0.717285f, 0.730957f, 0.744629f, 0.756836f, 0.770020f, 0.781738f, 0.793945f, - 0.805176f, 0.816895f, 0.828125f, 0.838379f, 0.849121f, 0.859375f, 0.869141f, 0.878418f, - 0.888184f, 0.897461f, 0.906738f, 0.915039f, 0.923828f, 0.932129f, 0.940430f, 0.947754f, - 0.956543f, 0.963867f, 0.976074f, 0.962402f, 0.951660f, 0.942383f, 0.934082f, 0.926758f, - 0.012001f, 0.036591f, 0.061737f, 0.086670f, 0.112000f, 0.136719f, 0.161743f, 0.186768f, - 0.211792f, 0.235840f, 0.259521f, 0.283203f, 0.307129f, 0.329590f, 0.352295f, 0.374268f, - 0.395996f, 0.416992f, 0.437744f, 0.457520f, 0.477295f, 0.497314f, 0.515625f, 0.534180f, - 0.553223f, 0.570312f, 0.588379f, 0.604492f, 0.621582f, 0.636719f, 0.653320f, 0.666992f, - 0.683105f, 0.697266f, 0.710449f, 0.724609f, 0.737793f, 0.750977f, 0.764160f, 0.775879f, - 0.788086f, 0.799805f, 0.812012f, 0.823242f, 0.833496f, 0.844238f, 0.854492f, 0.864746f, - 0.875000f, 0.884277f, 0.894043f, 0.902832f, 0.911621f, 0.920898f, 0.929688f, 0.937500f, - 0.945801f, 0.953613f, 0.971191f, 0.958984f, 0.949219f, 0.939941f, 0.932129f, 0.924316f, - 0.010612f, 0.032684f, 0.054810f, 0.077759f, 0.100952f, 0.124023f, 0.146851f, 0.171021f, - 0.193604f, 0.217163f, 0.239380f, 0.261963f, 0.284424f, 0.307129f, 0.328613f, 0.351318f, - 0.371826f, 0.392334f, 0.413574f, 0.432617f, 0.453613f, 0.472656f, 0.491943f, 0.510254f, - 0.528320f, 0.546387f, 0.563965f, 0.580078f, 0.598633f, 0.613770f, 0.629883f, 0.645996f, - 0.661621f, 0.675293f, 0.688965f, 0.705078f, 0.718262f, 0.731934f, 0.745605f, 0.757812f, - 0.770996f, 0.782715f, 0.795410f, 0.807129f, 0.818359f, 0.829102f, 0.839844f, 0.851074f, - 0.860840f, 0.871094f, 0.880859f, 0.891113f, 0.900391f, 0.909668f, 0.917969f, 0.927246f, - 0.935547f, 0.943848f, 0.966797f, 0.955566f, 0.945801f, 0.937012f, 0.929199f, 0.921875f, - 0.009483f, 0.029556f, 0.050140f, 0.070129f, 0.091797f, 0.112549f, 0.134155f, 0.156372f, - 0.177368f, 0.198975f, 0.220825f, 0.243286f, 0.263916f, 0.285645f, 0.306885f, 0.327393f, - 0.348145f, 0.368896f, 0.389404f, 0.409424f, 0.429199f, 0.448730f, 0.467529f, 0.486572f, - 0.505371f, 0.522461f, 0.540039f, 0.558105f, 0.574219f, 0.591309f, 0.607422f, 0.623535f, - 0.639648f, 0.654785f, 0.669922f, 0.685547f, 0.698730f, 0.712891f, 0.726074f, 0.740234f, - 0.752441f, 0.765625f, 0.778320f, 0.789551f, 0.802246f, 0.813477f, 0.825195f, 0.836426f, - 0.847168f, 0.856934f, 0.868164f, 0.877930f, 0.888184f, 0.897461f, 0.906738f, 0.915527f, - 0.925293f, 0.935059f, 0.962402f, 0.951660f, 0.942383f, 0.933594f, 0.926270f, 0.919434f, - 0.008934f, 0.026581f, 0.044708f, 0.063354f, 0.082825f, 0.102844f, 0.122437f, 0.141968f, - 0.162720f, 0.183105f, 0.202515f, 0.224609f, 0.244995f, 0.265381f, 0.285645f, 0.306152f, - 0.326416f, 0.346680f, 0.365967f, 0.385498f, 0.406006f, 0.425293f, 0.444092f, 0.461914f, - 0.480225f, 0.499268f, 0.517090f, 0.535156f, 0.552246f, 0.568359f, 0.585449f, 0.601562f, - 0.616699f, 0.633789f, 0.649414f, 0.663574f, 0.678711f, 0.693848f, 0.706543f, 0.721680f, - 0.734375f, 0.746582f, 0.760742f, 0.773438f, 0.786133f, 0.797852f, 0.809082f, 0.821777f, - 0.832031f, 0.843262f, 0.854492f, 0.864746f, 0.875000f, 0.884766f, 0.895020f, 0.904785f, - 0.914062f, 0.922852f, 0.957520f, 0.947266f, 0.938965f, 0.930664f, 0.923340f, 0.916992f, - 0.007668f, 0.024017f, 0.040405f, 0.057831f, 0.075195f, 0.093079f, 0.111694f, 0.130127f, - 0.148926f, 0.168213f, 0.187500f, 0.206543f, 0.226440f, 0.246460f, 0.265869f, 0.285400f, - 0.305176f, 0.324707f, 0.344238f, 0.363281f, 0.383057f, 0.401123f, 0.420166f, 0.439941f, - 0.457764f, 0.475586f, 0.493164f, 0.511719f, 0.528809f, 0.545898f, 0.562988f, 0.579590f, - 0.596191f, 0.612305f, 0.627441f, 0.643555f, 0.658203f, 0.672363f, 0.687988f, 0.702637f, - 0.715332f, 0.728516f, 0.742676f, 0.756348f, 0.768555f, 0.781250f, 0.794434f, 0.806152f, - 0.818359f, 0.828613f, 0.840332f, 0.851074f, 0.861816f, 0.872559f, 0.882812f, 0.892578f, - 0.903320f, 0.912598f, 0.952637f, 0.943848f, 0.935059f, 0.927246f, 0.920410f, 0.914062f, - 0.007263f, 0.021530f, 0.037048f, 0.052429f, 0.068909f, 0.084961f, 0.102112f, 0.119568f, - 0.136475f, 0.154541f, 0.172852f, 0.191528f, 0.209717f, 0.228638f, 0.246948f, 0.265869f, - 0.284912f, 0.304199f, 0.322510f, 0.341309f, 0.360596f, 0.379639f, 0.397461f, 0.416504f, - 0.434570f, 0.452881f, 0.470947f, 0.489014f, 0.505859f, 0.523438f, 0.541016f, 0.557129f, - 0.574219f, 0.590332f, 0.606445f, 0.622070f, 0.637695f, 0.653809f, 0.667969f, 0.682129f, - 0.697754f, 0.711426f, 0.724609f, 0.737793f, 0.750977f, 0.765625f, 0.777832f, 0.790039f, - 0.801270f, 0.813477f, 0.825684f, 0.837402f, 0.848145f, 0.859375f, 0.870117f, 0.880859f, - 0.891602f, 0.900391f, 0.947754f, 0.938965f, 0.931152f, 0.923828f, 0.917480f, 0.911133f, - 0.006401f, 0.019730f, 0.033813f, 0.047729f, 0.062561f, 0.077515f, 0.093140f, 0.108948f, - 0.125366f, 0.141968f, 0.159058f, 0.175781f, 0.193726f, 0.212036f, 0.229980f, 0.247681f, - 0.265869f, 0.284424f, 0.302734f, 0.320557f, 0.339111f, 0.357910f, 0.376221f, 0.394287f, - 0.412109f, 0.429688f, 0.448486f, 0.466064f, 0.483398f, 0.500977f, 0.517090f, 0.535156f, - 0.552246f, 0.568359f, 0.583984f, 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.662598f, - 0.677246f, 0.692383f, 0.706543f, 0.719727f, 0.734375f, 0.747070f, 0.761230f, 0.773926f, - 0.786621f, 0.797852f, 0.811523f, 0.823242f, 0.834961f, 0.846680f, 0.857422f, 0.868652f, - 0.879395f, 0.890137f, 0.942383f, 0.934082f, 0.927246f, 0.919922f, 0.913574f, 0.908203f, - 0.005836f, 0.018158f, 0.030746f, 0.043335f, 0.057007f, 0.070801f, 0.085754f, 0.099548f, - 0.115112f, 0.130127f, 0.146362f, 0.162354f, 0.178711f, 0.195801f, 0.212769f, 0.230103f, - 0.247925f, 0.264893f, 0.283203f, 0.300293f, 0.318604f, 0.336426f, 0.354492f, 0.372314f, - 0.390137f, 0.408203f, 0.425537f, 0.443848f, 0.461182f, 0.478271f, 0.496094f, 0.513184f, - 0.529297f, 0.546387f, 0.563477f, 0.580566f, 0.595703f, 0.611816f, 0.626465f, 0.642090f, - 0.658691f, 0.671875f, 0.686523f, 0.702148f, 0.716797f, 0.729980f, 0.744629f, 0.757324f, - 0.770020f, 0.783203f, 0.796875f, 0.808105f, 0.820312f, 0.832520f, 0.844727f, 0.855957f, - 0.867188f, 0.877930f, 0.937012f, 0.930176f, 0.922852f, 0.916504f, 0.910645f, 0.904785f, - 0.005486f, 0.016525f, 0.028030f, 0.039612f, 0.052185f, 0.064636f, 0.077576f, 0.091553f, - 0.105347f, 0.119568f, 0.134521f, 0.149536f, 0.164917f, 0.180664f, 0.197388f, 0.213623f, - 0.230347f, 0.246826f, 0.264160f, 0.280518f, 0.298584f, 0.315674f, 0.334229f, 0.350830f, - 0.369141f, 0.386963f, 0.404053f, 0.422119f, 0.438477f, 0.456299f, 0.474121f, 0.491211f, - 0.507812f, 0.524902f, 0.541504f, 0.557617f, 0.574707f, 0.590820f, 0.606934f, 0.622559f, - 0.637207f, 0.652832f, 0.668945f, 0.683105f, 0.698730f, 0.711914f, 0.726074f, 0.740723f, - 0.753906f, 0.766602f, 0.780273f, 0.792969f, 0.805664f, 0.818848f, 0.830566f, 0.842285f, - 0.854492f, 0.866211f, 0.931641f, 0.925781f, 0.918945f, 0.913086f, 0.907227f, 0.900879f, - 0.004810f, 0.014847f, 0.025604f, 0.036621f, 0.047577f, 0.059174f, 0.071472f, 0.084106f, - 0.096985f, 0.109863f, 0.124146f, 0.137939f, 0.152954f, 0.167358f, 0.182495f, 0.197754f, - 0.213745f, 0.230103f, 0.246216f, 0.262939f, 0.279297f, 0.296387f, 0.313477f, 0.329834f, - 0.348145f, 0.365479f, 0.382080f, 0.399658f, 0.417480f, 0.434082f, 0.452148f, 0.469238f, - 0.486084f, 0.502441f, 0.520020f, 0.536621f, 0.552734f, 0.569336f, 0.585938f, 0.601562f, - 0.617676f, 0.632812f, 0.648438f, 0.664062f, 0.679688f, 0.693848f, 0.708008f, 0.722656f, - 0.735840f, 0.750488f, 0.765137f, 0.777832f, 0.791016f, 0.803711f, 0.816895f, 0.829102f, - 0.841309f, 0.853027f, 0.925781f, 0.921387f, 0.914551f, 0.908203f, 0.903320f, 0.897461f, - 0.004494f, 0.013809f, 0.023331f, 0.033264f, 0.043549f, 0.053833f, 0.065369f, 0.076660f, - 0.088684f, 0.100708f, 0.113464f, 0.127075f, 0.140381f, 0.154419f, 0.169067f, 0.183472f, - 0.198975f, 0.213623f, 0.229370f, 0.245117f, 0.261475f, 0.277832f, 0.294678f, 0.311523f, - 0.327148f, 0.344727f, 0.362061f, 0.378418f, 0.395996f, 0.413086f, 0.430176f, 0.447021f, - 0.464111f, 0.481689f, 0.498047f, 0.514648f, 0.531738f, 0.547363f, 0.565430f, 0.582031f, - 0.597656f, 0.612793f, 0.628418f, 0.644043f, 0.660645f, 0.674805f, 0.689941f, 0.705078f, - 0.718750f, 0.734375f, 0.747559f, 0.761719f, 0.775391f, 0.788086f, 0.803223f, 0.814453f, - 0.828125f, 0.840332f, 0.919434f, 0.916504f, 0.909668f, 0.904785f, 0.898926f, 0.894043f, - 0.004120f, 0.012512f, 0.021423f, 0.030655f, 0.039673f, 0.049500f, 0.059845f, 0.070374f, - 0.081543f, 0.093323f, 0.104614f, 0.116577f, 0.129395f, 0.142456f, 0.156250f, 0.169434f, - 0.183594f, 0.198364f, 0.213257f, 0.228638f, 0.244141f, 0.259766f, 0.275635f, 0.291748f, - 0.308105f, 0.324707f, 0.341309f, 0.359131f, 0.375244f, 0.391846f, 0.408447f, 0.426025f, - 0.442871f, 0.459473f, 0.477051f, 0.494141f, 0.510254f, 0.527344f, 0.543457f, 0.560059f, - 0.577148f, 0.592773f, 0.608887f, 0.625977f, 0.640625f, 0.656738f, 0.671875f, 0.686523f, - 0.702637f, 0.716797f, 0.731445f, 0.746582f, 0.759277f, 0.773926f, 0.787598f, 0.800293f, - 0.814453f, 0.827148f, 0.914062f, 0.911133f, 0.905273f, 0.899902f, 0.895508f, 0.890625f, - 0.004120f, 0.011566f, 0.019180f, 0.027969f, 0.036255f, 0.045746f, 0.054901f, 0.064941f, - 0.074707f, 0.085327f, 0.096436f, 0.107239f, 0.119324f, 0.131470f, 0.144165f, 0.157104f, - 0.169922f, 0.183594f, 0.198242f, 0.212769f, 0.227295f, 0.242188f, 0.257568f, 0.273193f, - 0.289307f, 0.305420f, 0.321289f, 0.337891f, 0.354492f, 0.371094f, 0.387451f, 0.405029f, - 0.421143f, 0.438477f, 0.455322f, 0.472656f, 0.488525f, 0.505859f, 0.521973f, 0.539551f, - 0.555664f, 0.572754f, 0.588867f, 0.605469f, 0.621582f, 0.637207f, 0.653320f, 0.668945f, - 0.684570f, 0.698242f, 0.714844f, 0.729492f, 0.745117f, 0.758301f, 0.771973f, 0.787109f, - 0.800781f, 0.813477f, 0.907715f, 0.905762f, 0.900879f, 0.895508f, 0.890625f, 0.886719f, - 0.003464f, 0.010536f, 0.018143f, 0.025604f, 0.033600f, 0.041992f, 0.050659f, 0.059631f, - 0.068481f, 0.078552f, 0.088196f, 0.099060f, 0.110107f, 0.121033f, 0.133057f, 0.145020f, - 0.157349f, 0.170166f, 0.183838f, 0.197632f, 0.210938f, 0.225464f, 0.241089f, 0.255371f, - 0.270508f, 0.286377f, 0.302246f, 0.317871f, 0.334229f, 0.349854f, 0.367188f, 0.383789f, - 0.399414f, 0.417236f, 0.433838f, 0.450928f, 0.468018f, 0.484131f, 0.501465f, 0.519043f, - 0.535156f, 0.551758f, 0.568359f, 0.585449f, 0.601074f, 0.617676f, 0.634277f, 0.649902f, - 0.666016f, 0.681152f, 0.695801f, 0.711914f, 0.727539f, 0.741699f, 0.756836f, 0.770508f, - 0.785645f, 0.800293f, 0.901855f, 0.900391f, 0.895996f, 0.891113f, 0.886230f, 0.881836f, - 0.003197f, 0.009903f, 0.016525f, 0.023849f, 0.030853f, 0.038605f, 0.046265f, 0.054657f, - 0.063232f, 0.072266f, 0.081543f, 0.090881f, 0.100769f, 0.112061f, 0.123047f, 0.134155f, - 0.145752f, 0.157471f, 0.170166f, 0.182861f, 0.196289f, 0.210327f, 0.223755f, 0.238525f, - 0.253418f, 0.268066f, 0.283203f, 0.299316f, 0.314697f, 0.330811f, 0.346680f, 0.363281f, - 0.379639f, 0.396484f, 0.412842f, 0.429443f, 0.446289f, 0.462891f, 0.480225f, 0.497559f, - 0.514648f, 0.531250f, 0.547852f, 0.564453f, 0.581055f, 0.598145f, 0.615234f, 0.631836f, - 0.646484f, 0.663086f, 0.679199f, 0.694824f, 0.710449f, 0.726074f, 0.740234f, 0.755859f, - 0.770508f, 0.784668f, 0.895020f, 0.894531f, 0.890625f, 0.886719f, 0.881836f, 0.877441f, - 0.003071f, 0.009163f, 0.015602f, 0.021729f, 0.028412f, 0.035522f, 0.042755f, 0.050598f, - 0.057983f, 0.066284f, 0.075317f, 0.083862f, 0.092773f, 0.102905f, 0.113342f, 0.123840f, - 0.134399f, 0.145752f, 0.157593f, 0.169556f, 0.182129f, 0.194702f, 0.207886f, 0.222046f, - 0.235840f, 0.250977f, 0.265137f, 0.280273f, 0.295898f, 0.311279f, 0.326660f, 0.342773f, - 0.359375f, 0.375732f, 0.392090f, 0.409180f, 0.425049f, 0.441895f, 0.459473f, 0.476318f, - 0.493652f, 0.510742f, 0.527344f, 0.544434f, 0.561035f, 0.578125f, 0.595215f, 0.611328f, - 0.628418f, 0.645020f, 0.661133f, 0.677246f, 0.693359f, 0.708496f, 0.724609f, 0.740723f, - 0.755859f, 0.771484f, 0.889160f, 0.889160f, 0.885254f, 0.881348f, 0.876953f, 0.873047f, - 0.002748f, 0.008171f, 0.014084f, 0.019638f, 0.026108f, 0.032318f, 0.039154f, 0.045990f, - 0.053619f, 0.061066f, 0.068665f, 0.076477f, 0.085632f, 0.094727f, 0.104187f, 0.113831f, - 0.123535f, 0.134888f, 0.145508f, 0.157104f, 0.168701f, 0.181030f, 0.193481f, 0.206665f, - 0.220093f, 0.233398f, 0.248169f, 0.262695f, 0.277344f, 0.292236f, 0.307617f, 0.322998f, - 0.339355f, 0.355469f, 0.371582f, 0.388184f, 0.404541f, 0.420410f, 0.438477f, 0.455322f, - 0.472656f, 0.489014f, 0.506348f, 0.523926f, 0.541016f, 0.557617f, 0.575195f, 0.591309f, - 0.608887f, 0.625977f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.707520f, 0.724121f, - 0.739746f, 0.755371f, 0.882812f, 0.883789f, 0.879883f, 0.875977f, 0.872559f, 0.868652f, - 0.002491f, 0.007809f, 0.012764f, 0.018448f, 0.024094f, 0.029861f, 0.036102f, 0.042572f, - 0.049500f, 0.056091f, 0.063293f, 0.070984f, 0.079285f, 0.087036f, 0.095825f, 0.104858f, - 0.114441f, 0.124084f, 0.133789f, 0.144653f, 0.156250f, 0.167480f, 0.179199f, 0.191650f, - 0.204102f, 0.217896f, 0.231445f, 0.245239f, 0.259521f, 0.274170f, 0.289307f, 0.304199f, - 0.319580f, 0.334961f, 0.351074f, 0.367676f, 0.384277f, 0.400635f, 0.417480f, 0.434570f, - 0.451660f, 0.468994f, 0.485352f, 0.502441f, 0.520508f, 0.537109f, 0.554688f, 0.571777f, - 0.588867f, 0.605957f, 0.623047f, 0.639648f, 0.656738f, 0.673828f, 0.690430f, 0.708008f, - 0.723633f, 0.739746f, 0.874023f, 0.876953f, 0.874023f, 0.871582f, 0.867188f, 0.862793f, - 0.002279f, 0.007130f, 0.012291f, 0.016922f, 0.022171f, 0.027847f, 0.033325f, 0.039185f, - 0.045349f, 0.051849f, 0.058411f, 0.064880f, 0.072144f, 0.080017f, 0.087891f, 0.096313f, - 0.105103f, 0.114197f, 0.123779f, 0.134155f, 0.144043f, 0.155151f, 0.166016f, 0.177246f, - 0.189697f, 0.202271f, 0.214722f, 0.228271f, 0.242310f, 0.256592f, 0.270752f, 0.285400f, - 0.300537f, 0.315674f, 0.331543f, 0.347656f, 0.363525f, 0.379639f, 0.396729f, 0.414307f, - 0.430908f, 0.447754f, 0.465088f, 0.482178f, 0.499512f, 0.517090f, 0.533203f, 0.552246f, - 0.568848f, 0.586426f, 0.603516f, 0.621582f, 0.639648f, 0.656250f, 0.673828f, 0.690918f, - 0.707520f, 0.724121f, 0.867676f, 0.870605f, 0.868164f, 0.865723f, 0.861328f, 0.857910f, - 0.002220f, 0.006565f, 0.011238f, 0.015961f, 0.020401f, 0.025558f, 0.030853f, 0.036133f, - 0.041199f, 0.047180f, 0.053436f, 0.059723f, 0.066162f, 0.073853f, 0.080688f, 0.088440f, - 0.096436f, 0.105042f, 0.114319f, 0.123047f, 0.132446f, 0.142822f, 0.153198f, 0.164062f, - 0.175659f, 0.187378f, 0.199463f, 0.212402f, 0.225464f, 0.239014f, 0.252686f, 0.266846f, - 0.281494f, 0.296631f, 0.312500f, 0.328369f, 0.343750f, 0.359863f, 0.376221f, 0.393066f, - 0.409668f, 0.426514f, 0.444336f, 0.461670f, 0.478760f, 0.496826f, 0.513672f, 0.532227f, - 0.549316f, 0.567383f, 0.584961f, 0.602051f, 0.620605f, 0.637207f, 0.655273f, 0.672363f, - 0.689941f, 0.708008f, 0.860840f, 0.864746f, 0.862793f, 0.859375f, 0.855957f, 0.853027f, - 0.002190f, 0.005993f, 0.010117f, 0.014420f, 0.018738f, 0.023361f, 0.028015f, 0.033142f, - 0.037781f, 0.043732f, 0.048920f, 0.054840f, 0.061218f, 0.067810f, 0.074219f, 0.081299f, - 0.088562f, 0.096130f, 0.104614f, 0.113098f, 0.122253f, 0.131714f, 0.141113f, 0.151245f, - 0.162109f, 0.173462f, 0.184692f, 0.196899f, 0.209473f, 0.222534f, 0.236206f, 0.249634f, - 0.263672f, 0.277588f, 0.293213f, 0.308350f, 0.323975f, 0.339844f, 0.355957f, 0.372070f, - 0.389404f, 0.405762f, 0.422852f, 0.439941f, 0.458008f, 0.475098f, 0.492920f, 0.510742f, - 0.528320f, 0.546875f, 0.564453f, 0.583496f, 0.601074f, 0.619141f, 0.636719f, 0.654785f, - 0.672852f, 0.691406f, 0.852539f, 0.858398f, 0.856445f, 0.853516f, 0.850586f, 0.847656f, - 0.001787f, 0.005753f, 0.009300f, 0.013611f, 0.017410f, 0.021576f, 0.025665f, 0.030533f, - 0.035126f, 0.040039f, 0.044952f, 0.050446f, 0.055817f, 0.061890f, 0.068054f, 0.074707f, - 0.081482f, 0.088501f, 0.095764f, 0.103943f, 0.112183f, 0.120850f, 0.130249f, 0.139526f, - 0.149658f, 0.160400f, 0.171021f, 0.182007f, 0.194336f, 0.206421f, 0.219360f, 0.232666f, - 0.245850f, 0.260010f, 0.274170f, 0.289307f, 0.304443f, 0.319580f, 0.335693f, 0.352295f, - 0.369141f, 0.385498f, 0.402344f, 0.419189f, 0.437012f, 0.454346f, 0.472412f, 0.490234f, - 0.507812f, 0.525879f, 0.545410f, 0.562500f, 0.581055f, 0.600098f, 0.618164f, 0.636719f, - 0.655273f, 0.674316f, 0.845703f, 0.852051f, 0.849609f, 0.847168f, 0.845215f, 0.841309f, - 0.001766f, 0.005241f, 0.008881f, 0.012024f, 0.016129f, 0.020233f, 0.024124f, 0.027664f, - 0.032135f, 0.036835f, 0.041321f, 0.046173f, 0.051392f, 0.056946f, 0.062225f, 0.068604f, - 0.074524f, 0.080933f, 0.088135f, 0.095398f, 0.103210f, 0.110779f, 0.119263f, 0.128296f, - 0.137695f, 0.147217f, 0.157349f, 0.168091f, 0.179688f, 0.191284f, 0.203613f, 0.215942f, - 0.228882f, 0.242554f, 0.255859f, 0.270508f, 0.285400f, 0.300537f, 0.316406f, 0.331787f, - 0.348877f, 0.364746f, 0.382080f, 0.398682f, 0.415771f, 0.434082f, 0.451416f, 0.469482f, - 0.487793f, 0.505859f, 0.524414f, 0.542969f, 0.562012f, 0.580566f, 0.598145f, 0.618652f, - 0.637695f, 0.657227f, 0.837891f, 0.844727f, 0.843750f, 0.841309f, 0.838379f, 0.836426f, - 0.001598f, 0.004887f, 0.008217f, 0.011497f, 0.014786f, 0.018326f, 0.021652f, 0.025513f, - 0.029541f, 0.033813f, 0.038086f, 0.042236f, 0.046844f, 0.052032f, 0.057251f, 0.062622f, - 0.068237f, 0.074280f, 0.080505f, 0.086975f, 0.094116f, 0.101074f, 0.109314f, 0.117554f, - 0.126587f, 0.135254f, 0.144775f, 0.155029f, 0.165405f, 0.176392f, 0.187744f, 0.199829f, - 0.212646f, 0.224976f, 0.238647f, 0.252441f, 0.267090f, 0.281738f, 0.296631f, 0.312256f, - 0.328369f, 0.344971f, 0.361328f, 0.377686f, 0.395264f, 0.412842f, 0.430908f, 0.448730f, - 0.467041f, 0.485596f, 0.503906f, 0.522461f, 0.541504f, 0.561523f, 0.580078f, 0.599121f, - 0.618164f, 0.639648f, 0.828613f, 0.837891f, 0.836914f, 0.834473f, 0.833008f, 0.830566f, - 0.001709f, 0.004494f, 0.007416f, 0.010628f, 0.013680f, 0.016785f, 0.020203f, 0.023712f, - 0.027435f, 0.031006f, 0.034424f, 0.038635f, 0.043182f, 0.047668f, 0.052307f, 0.057159f, - 0.062042f, 0.067749f, 0.073730f, 0.079956f, 0.086182f, 0.092773f, 0.100159f, 0.107727f, - 0.115479f, 0.123962f, 0.132935f, 0.142578f, 0.151978f, 0.162476f, 0.173340f, 0.184570f, - 0.196411f, 0.208740f, 0.221436f, 0.235229f, 0.248779f, 0.262939f, 0.277832f, 0.293213f, - 0.308105f, 0.324219f, 0.341309f, 0.357178f, 0.374756f, 0.391846f, 0.409424f, 0.427490f, - 0.446533f, 0.464844f, 0.483643f, 0.501953f, 0.521484f, 0.541504f, 0.561035f, 0.579590f, - 0.599609f, 0.620605f, 0.821289f, 0.830566f, 0.830078f, 0.828125f, 0.825684f, 0.823242f, - 0.001367f, 0.004105f, 0.007023f, 0.009552f, 0.012611f, 0.015289f, 0.018341f, 0.021652f, - 0.024857f, 0.027878f, 0.031769f, 0.035614f, 0.039276f, 0.043610f, 0.047333f, 0.052155f, - 0.056549f, 0.061401f, 0.066895f, 0.072449f, 0.078613f, 0.084778f, 0.091309f, 0.098083f, - 0.105774f, 0.113281f, 0.121399f, 0.130371f, 0.139648f, 0.148926f, 0.159546f, 0.169922f, - 0.180908f, 0.192749f, 0.204834f, 0.217651f, 0.231567f, 0.244385f, 0.259277f, 0.273926f, - 0.289307f, 0.304688f, 0.320557f, 0.336914f, 0.354248f, 0.371338f, 0.388184f, 0.406982f, - 0.424316f, 0.443115f, 0.462646f, 0.481445f, 0.501465f, 0.520508f, 0.541016f, 0.559570f, - 0.580078f, 0.601074f, 0.812988f, 0.823242f, 0.823242f, 0.821289f, 0.819824f, 0.817383f, - 0.001398f, 0.003883f, 0.006351f, 0.008911f, 0.011559f, 0.014343f, 0.017212f, 0.020035f, - 0.022797f, 0.026062f, 0.028793f, 0.031891f, 0.035858f, 0.039368f, 0.043213f, 0.047607f, - 0.051483f, 0.056030f, 0.060883f, 0.065979f, 0.071350f, 0.076843f, 0.083130f, 0.089172f, - 0.096069f, 0.103333f, 0.111023f, 0.119019f, 0.127319f, 0.136719f, 0.145996f, 0.156128f, - 0.166138f, 0.177368f, 0.189453f, 0.201416f, 0.213745f, 0.227295f, 0.240601f, 0.255371f, - 0.269287f, 0.285400f, 0.301270f, 0.317139f, 0.333740f, 0.350586f, 0.367920f, 0.385986f, - 0.404297f, 0.422852f, 0.442383f, 0.460938f, 0.479980f, 0.500488f, 0.520508f, 0.541016f, - 0.560547f, 0.582520f, 0.803711f, 0.814941f, 0.815430f, 0.814453f, 0.812500f, 0.810547f, - 0.001259f, 0.003464f, 0.006332f, 0.008286f, 0.010384f, 0.013000f, 0.015587f, 0.018234f, - 0.021027f, 0.023422f, 0.026566f, 0.029480f, 0.032379f, 0.035919f, 0.039215f, 0.043060f, - 0.046997f, 0.050995f, 0.055267f, 0.059998f, 0.065002f, 0.069946f, 0.075317f, 0.081299f, - 0.087280f, 0.094116f, 0.101135f, 0.108276f, 0.116150f, 0.124695f, 0.133545f, 0.142700f, - 0.152222f, 0.162720f, 0.173950f, 0.185303f, 0.197754f, 0.210205f, 0.223022f, 0.237061f, - 0.250732f, 0.265869f, 0.281250f, 0.297119f, 0.313477f, 0.330322f, 0.347656f, 0.364746f, - 0.383301f, 0.401367f, 0.420898f, 0.440186f, 0.459229f, 0.479736f, 0.499512f, 0.520996f, - 0.541016f, 0.562988f, 0.794434f, 0.807129f, 0.807617f, 0.807129f, 0.805176f, 0.803711f, - 0.001070f, 0.003237f, 0.005432f, 0.007359f, 0.009857f, 0.012337f, 0.014191f, 0.016586f, - 0.019257f, 0.021561f, 0.024094f, 0.026901f, 0.029724f, 0.032745f, 0.035675f, 0.039368f, - 0.042572f, 0.045990f, 0.050354f, 0.054535f, 0.058746f, 0.063232f, 0.068420f, 0.073608f, - 0.079529f, 0.085266f, 0.091370f, 0.098083f, 0.105835f, 0.113159f, 0.121094f, 0.129639f, - 0.139038f, 0.148926f, 0.159058f, 0.169678f, 0.181274f, 0.193481f, 0.205811f, 0.219482f, - 0.233032f, 0.247192f, 0.262207f, 0.277100f, 0.293213f, 0.309814f, 0.326660f, 0.344238f, - 0.361816f, 0.380615f, 0.398926f, 0.418945f, 0.438477f, 0.458008f, 0.479004f, 0.499512f, - 0.520996f, 0.543945f, 0.784668f, 0.798828f, 0.800293f, 0.799805f, 0.797852f, 0.796875f, - 0.001074f, 0.002916f, 0.004955f, 0.007149f, 0.009033f, 0.011055f, 0.013268f, 0.015495f, - 0.017365f, 0.019485f, 0.022095f, 0.024002f, 0.026688f, 0.029633f, 0.032593f, 0.035370f, - 0.038361f, 0.041870f, 0.045319f, 0.049225f, 0.052948f, 0.057068f, 0.061676f, 0.066345f, - 0.071167f, 0.076782f, 0.082581f, 0.088867f, 0.095886f, 0.102539f, 0.109802f, 0.118042f, - 0.126709f, 0.135132f, 0.144897f, 0.155151f, 0.165771f, 0.177368f, 0.189209f, 0.201904f, - 0.215210f, 0.229370f, 0.242798f, 0.258057f, 0.274170f, 0.290039f, 0.306885f, 0.323242f, - 0.341309f, 0.359375f, 0.378418f, 0.397461f, 0.416260f, 0.437500f, 0.457031f, 0.479004f, - 0.501465f, 0.522461f, 0.775391f, 0.790527f, 0.791992f, 0.791504f, 0.791016f, 0.789551f, - 0.000837f, 0.002916f, 0.004738f, 0.006477f, 0.008575f, 0.010170f, 0.012161f, 0.014023f, - 0.015808f, 0.017792f, 0.020111f, 0.022064f, 0.024414f, 0.026794f, 0.029251f, 0.032074f, - 0.034698f, 0.037598f, 0.040741f, 0.043915f, 0.047577f, 0.051361f, 0.055389f, 0.059692f, - 0.064209f, 0.068787f, 0.074585f, 0.079712f, 0.085632f, 0.092346f, 0.099487f, 0.106323f, - 0.114929f, 0.122925f, 0.131958f, 0.141235f, 0.151123f, 0.161865f, 0.172974f, 0.184937f, - 0.197632f, 0.210693f, 0.224854f, 0.239136f, 0.254395f, 0.269531f, 0.285889f, 0.302979f, - 0.320557f, 0.338623f, 0.356689f, 0.375977f, 0.395752f, 0.415527f, 0.436523f, 0.458252f, - 0.479248f, 0.501465f, 0.765137f, 0.781738f, 0.783691f, 0.784180f, 0.783203f, 0.781250f, - 0.000854f, 0.002817f, 0.004089f, 0.005684f, 0.007675f, 0.009277f, 0.010864f, 0.012413f, - 0.014427f, 0.016235f, 0.017838f, 0.019913f, 0.021805f, 0.023987f, 0.026276f, 0.028915f, - 0.030960f, 0.033875f, 0.036652f, 0.039551f, 0.042816f, 0.045837f, 0.049591f, 0.053589f, - 0.057526f, 0.061829f, 0.066650f, 0.071655f, 0.077393f, 0.083008f, 0.088989f, 0.096008f, - 0.103210f, 0.110657f, 0.119141f, 0.127930f, 0.137085f, 0.146973f, 0.157593f, 0.169312f, - 0.181274f, 0.193481f, 0.207031f, 0.220581f, 0.235229f, 0.250732f, 0.266357f, 0.282227f, - 0.299805f, 0.317627f, 0.335449f, 0.354736f, 0.374268f, 0.394531f, 0.415527f, 0.436279f, - 0.458252f, 0.481689f, 0.754883f, 0.773438f, 0.775391f, 0.775879f, 0.774902f, 0.773926f, - 0.000852f, 0.002520f, 0.003937f, 0.005527f, 0.006836f, 0.008408f, 0.009773f, 0.011620f, - 0.013039f, 0.014687f, 0.016327f, 0.017944f, 0.019760f, 0.021774f, 0.023697f, 0.025894f, - 0.027969f, 0.030121f, 0.032501f, 0.035370f, 0.038208f, 0.041046f, 0.044098f, 0.047791f, - 0.051453f, 0.055176f, 0.059570f, 0.064026f, 0.068787f, 0.074158f, 0.079834f, 0.085938f, - 0.092590f, 0.099304f, 0.106873f, 0.114990f, 0.124023f, 0.133301f, 0.143066f, 0.153687f, - 0.164551f, 0.176392f, 0.189209f, 0.202637f, 0.216553f, 0.231323f, 0.246704f, 0.262451f, - 0.279297f, 0.296387f, 0.314697f, 0.333496f, 0.353516f, 0.373047f, 0.394775f, 0.415039f, - 0.437500f, 0.460449f, 0.745117f, 0.763672f, 0.766602f, 0.767090f, 0.767090f, 0.765625f, - 0.000762f, 0.002342f, 0.003563f, 0.004787f, 0.006447f, 0.007648f, 0.009193f, 0.010353f, - 0.012016f, 0.013138f, 0.014557f, 0.016312f, 0.017929f, 0.019470f, 0.021103f, 0.023056f, - 0.024918f, 0.026886f, 0.029099f, 0.031586f, 0.034058f, 0.036499f, 0.039307f, 0.042450f, - 0.045685f, 0.049072f, 0.052826f, 0.056915f, 0.061096f, 0.065918f, 0.070984f, 0.076538f, - 0.082520f, 0.088928f, 0.095520f, 0.102905f, 0.111206f, 0.119629f, 0.128662f, 0.138184f, - 0.148682f, 0.160156f, 0.171997f, 0.184937f, 0.198364f, 0.212524f, 0.227173f, 0.243042f, - 0.259277f, 0.276611f, 0.294189f, 0.312500f, 0.331055f, 0.350830f, 0.372070f, 0.392334f, - 0.415771f, 0.438232f, 0.734375f, 0.754395f, 0.758789f, 0.758789f, 0.758789f, 0.757812f, - 0.000848f, 0.002024f, 0.003553f, 0.004646f, 0.005726f, 0.007050f, 0.008362f, 0.009438f, - 0.010536f, 0.011810f, 0.013123f, 0.014481f, 0.015778f, 0.017242f, 0.018753f, 0.020447f, - 0.022278f, 0.023819f, 0.025940f, 0.027771f, 0.029999f, 0.032410f, 0.034851f, 0.037354f, - 0.040375f, 0.043610f, 0.046631f, 0.050354f, 0.054108f, 0.058563f, 0.062805f, 0.067871f, - 0.073242f, 0.078796f, 0.085083f, 0.091797f, 0.098816f, 0.106689f, 0.115540f, 0.124207f, - 0.134155f, 0.144409f, 0.155762f, 0.167725f, 0.180664f, 0.193848f, 0.208618f, 0.223389f, - 0.239746f, 0.256104f, 0.273438f, 0.291260f, 0.310059f, 0.330078f, 0.349854f, 0.370850f, - 0.393555f, 0.416992f, 0.724121f, 0.744629f, 0.748535f, 0.750000f, 0.749512f, 0.749512f, - 0.000736f, 0.001780f, 0.002937f, 0.004314f, 0.005211f, 0.006214f, 0.007423f, 0.008537f, - 0.009392f, 0.010773f, 0.011726f, 0.012970f, 0.014183f, 0.015373f, 0.016724f, 0.017990f, - 0.019730f, 0.021194f, 0.022644f, 0.024368f, 0.026443f, 0.028610f, 0.030685f, 0.032898f, - 0.035583f, 0.038300f, 0.041351f, 0.044556f, 0.047638f, 0.051422f, 0.055359f, 0.059875f, - 0.064392f, 0.069580f, 0.075195f, 0.080872f, 0.087646f, 0.094849f, 0.102173f, 0.110596f, - 0.119690f, 0.129761f, 0.139893f, 0.151367f, 0.163452f, 0.176147f, 0.190063f, 0.204590f, - 0.219238f, 0.235718f, 0.252441f, 0.270264f, 0.289062f, 0.307861f, 0.328613f, 0.350098f, - 0.372314f, 0.395020f, 0.712402f, 0.734863f, 0.739746f, 0.740723f, 0.740723f, 0.740234f, - 0.000589f, 0.001616f, 0.002674f, 0.003841f, 0.004940f, 0.005676f, 0.006554f, 0.007442f, - 0.008812f, 0.009537f, 0.010277f, 0.011528f, 0.012634f, 0.013527f, 0.014671f, 0.016037f, - 0.017136f, 0.018631f, 0.019943f, 0.021530f, 0.023071f, 0.025146f, 0.026825f, 0.029037f, - 0.030853f, 0.033447f, 0.035736f, 0.038849f, 0.041656f, 0.044922f, 0.048462f, 0.052277f, - 0.056519f, 0.061127f, 0.065796f, 0.071411f, 0.077148f, 0.083435f, 0.090393f, 0.097900f, - 0.106079f, 0.115356f, 0.125122f, 0.135132f, 0.146729f, 0.158936f, 0.171509f, 0.185059f, - 0.200439f, 0.215576f, 0.232056f, 0.249756f, 0.267822f, 0.286621f, 0.306885f, 0.328125f, - 0.349854f, 0.373291f, 0.701172f, 0.725586f, 0.729980f, 0.730957f, 0.731934f, 0.730957f, - 0.000547f, 0.001666f, 0.002367f, 0.003559f, 0.004238f, 0.005028f, 0.005852f, 0.006859f, - 0.007755f, 0.008530f, 0.009163f, 0.010056f, 0.010956f, 0.011978f, 0.013062f, 0.014076f, - 0.015053f, 0.016251f, 0.017471f, 0.018921f, 0.020233f, 0.021774f, 0.023315f, 0.025162f, - 0.026871f, 0.029007f, 0.031204f, 0.033661f, 0.036102f, 0.039062f, 0.042053f, 0.045380f, - 0.048859f, 0.053040f, 0.057343f, 0.062225f, 0.067261f, 0.073120f, 0.079407f, 0.086243f, - 0.093567f, 0.101868f, 0.110596f, 0.120239f, 0.130859f, 0.141968f, 0.154053f, 0.167358f, - 0.181274f, 0.196045f, 0.212158f, 0.229248f, 0.247192f, 0.265381f, 0.285400f, 0.305664f, - 0.327637f, 0.350586f, 0.689453f, 0.715820f, 0.720215f, 0.722168f, 0.722168f, 0.722168f, - 0.000492f, 0.001634f, 0.002342f, 0.003111f, 0.003866f, 0.004574f, 0.005417f, 0.005928f, - 0.006588f, 0.007393f, 0.008041f, 0.008873f, 0.009689f, 0.010391f, 0.011375f, 0.012146f, - 0.013100f, 0.014183f, 0.015274f, 0.016479f, 0.017456f, 0.018768f, 0.020157f, 0.021606f, - 0.023300f, 0.024933f, 0.026855f, 0.028885f, 0.031143f, 0.033417f, 0.036133f, 0.039032f, - 0.042236f, 0.045776f, 0.049713f, 0.053680f, 0.058228f, 0.063232f, 0.069092f, 0.074829f, - 0.081482f, 0.089050f, 0.096924f, 0.105591f, 0.115417f, 0.126221f, 0.137329f, 0.149658f, - 0.162964f, 0.176880f, 0.192505f, 0.208740f, 0.226318f, 0.244873f, 0.263428f, 0.283936f, - 0.306396f, 0.329346f, 0.676270f, 0.705078f, 0.709961f, 0.711914f, 0.712891f, 0.711914f, - 0.000506f, 0.001342f, 0.002157f, 0.002813f, 0.003353f, 0.004105f, 0.004658f, 0.005344f, - 0.005871f, 0.006538f, 0.007050f, 0.007751f, 0.008247f, 0.009109f, 0.009865f, 0.010559f, - 0.011269f, 0.012169f, 0.013290f, 0.014191f, 0.015015f, 0.016312f, 0.017395f, 0.018570f, - 0.019989f, 0.021439f, 0.023102f, 0.024536f, 0.026535f, 0.028702f, 0.030899f, 0.033356f, - 0.035980f, 0.039093f, 0.042328f, 0.046051f, 0.049927f, 0.054199f, 0.059052f, 0.064575f, - 0.070496f, 0.076782f, 0.084412f, 0.092285f, 0.100708f, 0.110779f, 0.121399f, 0.132690f, - 0.145508f, 0.158813f, 0.173584f, 0.189453f, 0.205688f, 0.223755f, 0.242554f, 0.263184f, - 0.284180f, 0.306641f, 0.664551f, 0.693848f, 0.699707f, 0.702148f, 0.702637f, 0.703125f, - 0.000500f, 0.001122f, 0.001810f, 0.002363f, 0.002987f, 0.003576f, 0.004158f, 0.004620f, - 0.005032f, 0.005627f, 0.006161f, 0.006721f, 0.007179f, 0.007790f, 0.008385f, 0.009163f, - 0.009758f, 0.010536f, 0.011284f, 0.011986f, 0.012878f, 0.013710f, 0.014725f, 0.015823f, - 0.016937f, 0.018326f, 0.019547f, 0.020874f, 0.022522f, 0.024399f, 0.026077f, 0.028427f, - 0.030609f, 0.032990f, 0.035736f, 0.038788f, 0.042236f, 0.045990f, 0.050354f, 0.054901f, - 0.059967f, 0.065918f, 0.072205f, 0.079468f, 0.087219f, 0.096252f, 0.105713f, 0.116272f, - 0.128174f, 0.140747f, 0.154419f, 0.169556f, 0.186279f, 0.203125f, 0.221313f, 0.240601f, - 0.261719f, 0.284424f, 0.652344f, 0.683105f, 0.688965f, 0.691406f, 0.692383f, 0.693359f, - 0.000482f, 0.001184f, 0.001604f, 0.002171f, 0.002562f, 0.003029f, 0.003656f, 0.003941f, - 0.004410f, 0.004948f, 0.005325f, 0.005577f, 0.006157f, 0.006702f, 0.007172f, 0.007751f, - 0.008331f, 0.008904f, 0.009514f, 0.010063f, 0.010925f, 0.011719f, 0.012306f, 0.013321f, - 0.014275f, 0.015465f, 0.016510f, 0.017593f, 0.018845f, 0.020401f, 0.022095f, 0.023682f, - 0.025513f, 0.027679f, 0.029968f, 0.032593f, 0.035461f, 0.038757f, 0.042175f, 0.046326f, - 0.050873f, 0.055939f, 0.061462f, 0.067444f, 0.074402f, 0.082520f, 0.091125f, 0.100830f, - 0.111572f, 0.123413f, 0.136719f, 0.150513f, 0.165894f, 0.182251f, 0.200684f, 0.219727f, - 0.240234f, 0.261963f, 0.640137f, 0.671387f, 0.679199f, 0.680664f, 0.682617f, 0.683105f, - 0.000501f, 0.000919f, 0.001424f, 0.001853f, 0.002266f, 0.002789f, 0.002998f, 0.003397f, - 0.003902f, 0.004192f, 0.004417f, 0.004974f, 0.005207f, 0.005676f, 0.006134f, 0.006527f, - 0.007179f, 0.007465f, 0.008018f, 0.008537f, 0.009178f, 0.009888f, 0.010544f, 0.011093f, - 0.011986f, 0.012794f, 0.013664f, 0.014717f, 0.015747f, 0.016983f, 0.018127f, 0.019470f, - 0.021103f, 0.022919f, 0.024826f, 0.026962f, 0.029358f, 0.031769f, 0.035065f, 0.038239f, - 0.042297f, 0.046570f, 0.051422f, 0.056671f, 0.062805f, 0.069763f, 0.077698f, 0.086182f, - 0.095825f, 0.106812f, 0.119080f, 0.132568f, 0.147217f, 0.162598f, 0.180176f, 0.198730f, - 0.218628f, 0.241211f, 0.627441f, 0.660156f, 0.668457f, 0.669922f, 0.672363f, 0.671875f, - 0.000235f, 0.001120f, 0.001356f, 0.001651f, 0.002117f, 0.002441f, 0.002678f, 0.002993f, - 0.003244f, 0.003519f, 0.003876f, 0.004086f, 0.004505f, 0.004787f, 0.005085f, 0.005604f, - 0.005985f, 0.006271f, 0.006783f, 0.007145f, 0.007679f, 0.008217f, 0.008728f, 0.009277f, - 0.009956f, 0.010605f, 0.011490f, 0.012062f, 0.013084f, 0.013962f, 0.014984f, 0.016113f, - 0.017395f, 0.018829f, 0.020416f, 0.022125f, 0.023972f, 0.025955f, 0.028625f, 0.031616f, - 0.034515f, 0.038147f, 0.042114f, 0.046783f, 0.052094f, 0.058075f, 0.065002f, 0.072510f, - 0.081604f, 0.091125f, 0.102539f, 0.114807f, 0.128662f, 0.143921f, 0.160034f, 0.178467f, - 0.198364f, 0.218750f, 0.613281f, 0.648926f, 0.657227f, 0.659668f, 0.661621f, 0.661621f, - 0.000382f, 0.000704f, 0.001099f, 0.001557f, 0.001774f, 0.001976f, 0.002132f, 0.002575f, - 0.002634f, 0.002916f, 0.003103f, 0.003494f, 0.003754f, 0.003956f, 0.004269f, 0.004684f, - 0.004902f, 0.005234f, 0.005569f, 0.005890f, 0.006416f, 0.006786f, 0.007160f, 0.007645f, - 0.008118f, 0.008781f, 0.009346f, 0.010025f, 0.010658f, 0.011475f, 0.012230f, 0.013016f, - 0.014122f, 0.015251f, 0.016342f, 0.017807f, 0.019424f, 0.021103f, 0.023026f, 0.025436f, - 0.027817f, 0.030914f, 0.034210f, 0.037750f, 0.042450f, 0.047455f, 0.053101f, 0.059998f, - 0.067688f, 0.076660f, 0.086670f, 0.097961f, 0.110779f, 0.125366f, 0.140747f, 0.158081f, - 0.176880f, 0.197632f, 0.600098f, 0.637207f, 0.644531f, 0.647949f, 0.649414f, 0.651855f, - 0.000182f, 0.000738f, 0.000942f, 0.001220f, 0.001469f, 0.001634f, 0.001820f, 0.002005f, - 0.002291f, 0.002441f, 0.002636f, 0.002832f, 0.003019f, 0.003242f, 0.003502f, 0.003824f, - 0.004017f, 0.004333f, 0.004570f, 0.004883f, 0.005173f, 0.005615f, 0.005909f, 0.006317f, - 0.006649f, 0.007160f, 0.007656f, 0.008156f, 0.008583f, 0.009209f, 0.009857f, 0.010696f, - 0.011322f, 0.012367f, 0.013229f, 0.014259f, 0.015686f, 0.016815f, 0.018402f, 0.020126f, - 0.022095f, 0.024414f, 0.027176f, 0.030273f, 0.033722f, 0.038086f, 0.042969f, 0.048645f, - 0.055237f, 0.063171f, 0.071960f, 0.082031f, 0.093994f, 0.107300f, 0.122131f, 0.138550f, - 0.156494f, 0.177002f, 0.586426f, 0.625488f, 0.633789f, 0.637207f, 0.638672f, 0.639648f, - 0.000199f, 0.000534f, 0.000745f, 0.000995f, 0.001190f, 0.001387f, 0.001516f, 0.001691f, - 0.001790f, 0.001941f, 0.002214f, 0.002346f, 0.002449f, 0.002686f, 0.002832f, 0.003042f, - 0.003304f, 0.003531f, 0.003662f, 0.003952f, 0.004181f, 0.004517f, 0.004704f, 0.005074f, - 0.005352f, 0.005718f, 0.006096f, 0.006481f, 0.006947f, 0.007454f, 0.007988f, 0.008484f, - 0.009140f, 0.009804f, 0.010475f, 0.011307f, 0.012299f, 0.013268f, 0.014511f, 0.015823f, - 0.017410f, 0.018936f, 0.021225f, 0.023621f, 0.026367f, 0.029770f, 0.033661f, 0.038452f, - 0.044067f, 0.050812f, 0.058411f, 0.067444f, 0.077942f, 0.090149f, 0.104187f, 0.119812f, - 0.137085f, 0.156372f, 0.572754f, 0.613770f, 0.621582f, 0.625977f, 0.627441f, 0.628906f, - 0.000165f, 0.000486f, 0.000618f, 0.000880f, 0.001063f, 0.001140f, 0.001258f, 0.001464f, - 0.001498f, 0.001561f, 0.001707f, 0.001899f, 0.001976f, 0.002171f, 0.002285f, 0.002474f, - 0.002571f, 0.002764f, 0.002968f, 0.003170f, 0.003389f, 0.003580f, 0.003822f, 0.004036f, - 0.004269f, 0.004505f, 0.004738f, 0.005157f, 0.005474f, 0.005821f, 0.006279f, 0.006649f, - 0.007107f, 0.007610f, 0.008240f, 0.008835f, 0.009598f, 0.010361f, 0.011276f, 0.012299f, - 0.013466f, 0.014740f, 0.016251f, 0.018021f, 0.020294f, 0.022797f, 0.025833f, 0.029739f, - 0.034058f, 0.039612f, 0.046021f, 0.053833f, 0.063110f, 0.074158f, 0.086914f, 0.101562f, - 0.118164f, 0.136841f, 0.558594f, 0.601074f, 0.608887f, 0.613281f, 0.615234f, 0.617188f, - 0.000096f, 0.000348f, 0.000585f, 0.000707f, 0.000837f, 0.000866f, 0.000972f, 0.001095f, - 0.001198f, 0.001309f, 0.001355f, 0.001417f, 0.001615f, 0.001740f, 0.001863f, 0.001880f, - 0.002048f, 0.002159f, 0.002380f, 0.002487f, 0.002613f, 0.002777f, 0.003000f, 0.003143f, - 0.003353f, 0.003521f, 0.003748f, 0.003963f, 0.004265f, 0.004490f, 0.004776f, 0.005093f, - 0.005577f, 0.005966f, 0.006321f, 0.006828f, 0.007320f, 0.007904f, 0.008575f, 0.009392f, - 0.010231f, 0.011276f, 0.012321f, 0.013832f, 0.015343f, 0.017242f, 0.019501f, 0.022247f, - 0.025696f, 0.029922f, 0.035187f, 0.041779f, 0.049683f, 0.059387f, 0.070801f, 0.084106f, - 0.100037f, 0.117798f, 0.544434f, 0.588867f, 0.597656f, 0.602539f, 0.604492f, 0.605469f, - 0.000123f, 0.000248f, 0.000443f, 0.000625f, 0.000663f, 0.000733f, 0.000843f, 0.000780f, - 0.000921f, 0.000986f, 0.001081f, 0.001178f, 0.001254f, 0.001348f, 0.001364f, 0.001515f, - 0.001565f, 0.001705f, 0.001824f, 0.001870f, 0.002066f, 0.002155f, 0.002274f, 0.002422f, - 0.002525f, 0.002695f, 0.002863f, 0.003038f, 0.003271f, 0.003441f, 0.003736f, 0.003901f, - 0.004112f, 0.004478f, 0.004719f, 0.005093f, 0.005482f, 0.005913f, 0.006413f, 0.007019f, - 0.007626f, 0.008408f, 0.009201f, 0.010201f, 0.011436f, 0.012749f, 0.014389f, 0.016373f, - 0.018906f, 0.022034f, 0.025909f, 0.031082f, 0.037628f, 0.045715f, 0.055939f, 0.068176f, - 0.082764f, 0.099365f, 0.529785f, 0.574707f, 0.584961f, 0.589844f, 0.591797f, 0.593750f, - 0.000210f, 0.000212f, 0.000365f, 0.000494f, 0.000438f, 0.000597f, 0.000538f, 0.000623f, - 0.000638f, 0.000736f, 0.000866f, 0.000882f, 0.000954f, 0.001040f, 0.001070f, 0.001086f, - 0.001220f, 0.001274f, 0.001341f, 0.001457f, 0.001513f, 0.001598f, 0.001697f, 0.001781f, - 0.001898f, 0.001970f, 0.002131f, 0.002241f, 0.002401f, 0.002645f, 0.002783f, 0.002892f, - 0.003120f, 0.003347f, 0.003508f, 0.003757f, 0.004032f, 0.004314f, 0.004688f, 0.005066f, - 0.005520f, 0.006012f, 0.006702f, 0.007332f, 0.008171f, 0.009140f, 0.010399f, 0.011787f, - 0.013496f, 0.015732f, 0.018509f, 0.022278f, 0.027267f, 0.033813f, 0.042328f, 0.053070f, - 0.066406f, 0.082825f, 0.516602f, 0.562500f, 0.573242f, 0.577637f, 0.580078f, 0.581543f, - 0.000000f, 0.000216f, 0.000281f, 0.000346f, 0.000374f, 0.000388f, 0.000491f, 0.000416f, - 0.000516f, 0.000535f, 0.000635f, 0.000625f, 0.000681f, 0.000719f, 0.000790f, 0.000813f, - 0.000879f, 0.000926f, 0.000968f, 0.001004f, 0.001097f, 0.001135f, 0.001229f, 0.001300f, - 0.001361f, 0.001431f, 0.001541f, 0.001610f, 0.001711f, 0.001802f, 0.001922f, 0.002094f, - 0.002169f, 0.002346f, 0.002468f, 0.002644f, 0.002844f, 0.003094f, 0.003368f, 0.003586f, - 0.003883f, 0.004223f, 0.004662f, 0.005093f, 0.005680f, 0.006348f, 0.007206f, 0.008202f, - 0.009392f, 0.010895f, 0.012939f, 0.015465f, 0.018906f, 0.023682f, 0.030502f, 0.039825f, - 0.051331f, 0.066528f, 0.500977f, 0.548828f, 0.560059f, 0.564453f, 0.567871f, 0.569336f, - 0.000000f, 0.000106f, 0.000201f, 0.000252f, 0.000251f, 0.000322f, 0.000281f, 0.000340f, - 0.000359f, 0.000428f, 0.000443f, 0.000419f, 0.000444f, 0.000500f, 0.000524f, 0.000590f, - 0.000574f, 0.000650f, 0.000693f, 0.000732f, 0.000778f, 0.000821f, 0.000848f, 0.000900f, - 0.000965f, 0.000982f, 0.001072f, 0.001109f, 0.001169f, 0.001307f, 0.001301f, 0.001409f, - 0.001483f, 0.001610f, 0.001734f, 0.001835f, 0.001940f, 0.002098f, 0.002241f, 0.002426f, - 0.002634f, 0.002865f, 0.003136f, 0.003431f, 0.003763f, 0.004211f, 0.004742f, 0.005417f, - 0.006229f, 0.007298f, 0.008621f, 0.010330f, 0.012650f, 0.015808f, 0.020569f, 0.027908f, - 0.037994f, 0.051514f, 0.485840f, 0.536133f, 0.547363f, 0.551758f, 0.554688f, 0.557617f, - 0.000026f, 0.000156f, 0.000201f, 0.000136f, 0.000188f, 0.000187f, 0.000192f, 0.000240f, - 0.000245f, 0.000254f, 0.000262f, 0.000311f, 0.000309f, 0.000331f, 0.000374f, 0.000385f, - 0.000411f, 0.000431f, 0.000443f, 0.000461f, 0.000507f, 0.000522f, 0.000562f, 0.000596f, - 0.000634f, 0.000684f, 0.000718f, 0.000735f, 0.000776f, 0.000815f, 0.000875f, 0.000927f, - 0.000982f, 0.001053f, 0.001123f, 0.001162f, 0.001271f, 0.001346f, 0.001473f, 0.001577f, - 0.001670f, 0.001838f, 0.002005f, 0.002161f, 0.002405f, 0.002670f, 0.002993f, 0.003399f, - 0.003860f, 0.004528f, 0.005386f, 0.006523f, 0.008003f, 0.010063f, 0.013206f, 0.017990f, - 0.026031f, 0.038086f, 0.471191f, 0.522949f, 0.534668f, 0.540039f, 0.543457f, 0.544922f, - 0.000000f, 0.000093f, 0.000084f, 0.000085f, 0.000124f, 0.000145f, 0.000122f, 0.000149f, - 0.000152f, 0.000152f, 0.000158f, 0.000167f, 0.000186f, 0.000209f, 0.000217f, 0.000225f, - 0.000231f, 0.000272f, 0.000273f, 0.000301f, 0.000303f, 0.000310f, 0.000338f, 0.000361f, - 0.000387f, 0.000423f, 0.000413f, 0.000436f, 0.000478f, 0.000503f, 0.000525f, 0.000570f, - 0.000608f, 0.000626f, 0.000677f, 0.000706f, 0.000753f, 0.000813f, 0.000884f, 0.000929f, - 0.001000f, 0.001094f, 0.001183f, 0.001302f, 0.001412f, 0.001563f, 0.001769f, 0.001974f, - 0.002277f, 0.002626f, 0.003124f, 0.003761f, 0.004665f, 0.005993f, 0.007935f, 0.010818f, - 0.016205f, 0.026138f, 0.456299f, 0.509277f, 0.520996f, 0.527344f, 0.530762f, 0.532715f, - 0.000105f, 0.000083f, 0.000072f, 0.000065f, 0.000071f, 0.000072f, 0.000077f, 0.000084f, - 0.000088f, 0.000093f, 0.000095f, 0.000120f, 0.000100f, 0.000108f, 0.000126f, 0.000118f, - 0.000139f, 0.000149f, 0.000153f, 0.000165f, 0.000169f, 0.000172f, 0.000194f, 0.000203f, - 0.000233f, 0.000225f, 0.000233f, 0.000253f, 0.000266f, 0.000275f, 0.000299f, 0.000319f, - 0.000338f, 0.000345f, 0.000374f, 0.000384f, 0.000415f, 0.000448f, 0.000483f, 0.000511f, - 0.000543f, 0.000585f, 0.000647f, 0.000692f, 0.000755f, 0.000827f, 0.000924f, 0.001041f, - 0.001186f, 0.001372f, 0.001608f, 0.001953f, 0.002411f, 0.003098f, 0.004238f, 0.005989f, - 0.009003f, 0.016006f, 0.441406f, 0.495361f, 0.508301f, 0.514160f, 0.518066f, 0.520508f, - 0.000090f, 0.000067f, 0.000058f, 0.000052f, 0.000047f, 0.000044f, 0.000044f, 0.000040f, - 0.000042f, 0.000049f, 0.000042f, 0.000045f, 0.000059f, 0.000047f, 0.000050f, 0.000054f, - 0.000071f, 0.000073f, 0.000075f, 0.000078f, 0.000079f, 0.000084f, 0.000087f, 0.000090f, - 0.000097f, 0.000109f, 0.000108f, 0.000124f, 0.000124f, 0.000131f, 0.000138f, 0.000143f, - 0.000155f, 0.000164f, 0.000178f, 0.000182f, 0.000192f, 0.000209f, 0.000225f, 0.000244f, - 0.000259f, 0.000274f, 0.000303f, 0.000321f, 0.000357f, 0.000385f, 0.000429f, 0.000470f, - 0.000537f, 0.000608f, 0.000710f, 0.000852f, 0.001052f, 0.001371f, 0.001877f, 0.002762f, - 0.004406f, 0.008202f, 0.426270f, 0.483154f, 0.495605f, 0.500977f, 0.505371f, 0.507324f, - 0.000067f, 0.000047f, 0.000039f, 0.000035f, 0.000032f, 0.000030f, 0.000029f, 0.000027f, - 0.000026f, 0.000025f, 0.000024f, 0.000023f, 0.000021f, 0.000020f, 0.000019f, 0.000021f, - 0.000020f, 0.000024f, 0.000028f, 0.000030f, 0.000029f, 0.000032f, 0.000035f, 0.000034f, - 0.000036f, 0.000044f, 0.000046f, 0.000040f, 0.000048f, 0.000047f, 0.000051f, 0.000053f, - 0.000059f, 0.000059f, 0.000064f, 0.000066f, 0.000077f, 0.000079f, 0.000081f, 0.000091f, - 0.000094f, 0.000100f, 0.000108f, 0.000119f, 0.000129f, 0.000137f, 0.000148f, 0.000173f, - 0.000191f, 0.000210f, 0.000249f, 0.000292f, 0.000357f, 0.000448f, 0.000629f, 0.000943f, - 0.001630f, 0.003332f, 0.411377f, 0.468506f, 0.482910f, 0.488770f, 0.492188f, 0.495117f, - 0.000025f, 0.000018f, 0.000015f, 0.000013f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, - 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000010f, 0.000010f, 0.000010f, - 0.000012f, 0.000014f, 0.000014f, 0.000014f, 0.000016f, 0.000018f, 0.000019f, 0.000021f, - 0.000020f, 0.000023f, 0.000025f, 0.000027f, 0.000027f, 0.000029f, 0.000035f, 0.000033f, - 0.000040f, 0.000044f, 0.000052f, 0.000061f, 0.000069f, 0.000087f, 0.000117f, 0.000174f, - 0.000319f, 0.000847f, 0.395996f, 0.454834f, 0.468750f, 0.475586f, 0.479004f, 0.481689f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, - 0.000009f, 0.000027f, 0.381348f, 0.441406f, 0.455566f, 0.462891f, 0.466309f, 0.468994f, - }, - { - 0.016769f, 0.050629f, 0.083740f, 0.116638f, 0.148071f, 0.178955f, 0.208374f, 0.236938f, - 0.265137f, 0.291992f, 0.317871f, 0.343994f, 0.368164f, 0.391846f, 0.415527f, 0.437988f, - 0.459717f, 0.480469f, 0.501465f, 0.520996f, 0.540527f, 0.559082f, 0.577637f, 0.594727f, - 0.612305f, 0.628418f, 0.644531f, 0.661133f, 0.676270f, 0.691406f, 0.705566f, 0.719727f, - 0.734375f, 0.747070f, 0.760254f, 0.773438f, 0.786133f, 0.798828f, 0.810059f, 0.821777f, - 0.833008f, 0.843262f, 0.854492f, 0.865234f, 0.875488f, 0.885254f, 0.895508f, 0.904297f, - 0.913574f, 0.923340f, 0.932617f, 0.940918f, 0.949707f, 0.958008f, 0.966309f, 0.974609f, - 0.981934f, 0.990234f, 0.985352f, 0.965332f, 0.950195f, 0.937500f, 0.926270f, 0.915527f, - 0.015083f, 0.045929f, 0.075806f, 0.105408f, 0.135254f, 0.163208f, 0.191772f, 0.219238f, - 0.245239f, 0.271973f, 0.297363f, 0.321045f, 0.345947f, 0.369141f, 0.391846f, 0.414062f, - 0.435791f, 0.456787f, 0.477295f, 0.497314f, 0.516113f, 0.535645f, 0.554199f, 0.571777f, - 0.588867f, 0.606445f, 0.623047f, 0.639160f, 0.654785f, 0.669434f, 0.685059f, 0.699219f, - 0.713379f, 0.728027f, 0.741211f, 0.754883f, 0.767578f, 0.780273f, 0.792480f, 0.804688f, - 0.815918f, 0.826660f, 0.838867f, 0.850098f, 0.859863f, 0.871094f, 0.880859f, 0.891113f, - 0.900879f, 0.909180f, 0.919434f, 0.929688f, 0.937500f, 0.946289f, 0.954590f, 0.963379f, - 0.971191f, 0.979004f, 0.980469f, 0.961426f, 0.947266f, 0.935059f, 0.924316f, 0.914062f, - 0.013573f, 0.040955f, 0.068848f, 0.096313f, 0.123169f, 0.150635f, 0.175537f, 0.202026f, - 0.228271f, 0.251709f, 0.276367f, 0.300781f, 0.323730f, 0.347168f, 0.369385f, 0.390625f, - 0.412354f, 0.433594f, 0.454346f, 0.473145f, 0.491943f, 0.512207f, 0.529785f, 0.549316f, - 0.566406f, 0.583008f, 0.600586f, 0.616211f, 0.633301f, 0.648438f, 0.663574f, 0.679199f, - 0.693359f, 0.708008f, 0.721680f, 0.735840f, 0.748535f, 0.762207f, 0.773926f, 0.786621f, - 0.798340f, 0.811035f, 0.822754f, 0.833984f, 0.845215f, 0.855957f, 0.865723f, 0.876465f, - 0.886719f, 0.895508f, 0.906738f, 0.916016f, 0.925293f, 0.934570f, 0.943848f, 0.952148f, - 0.960449f, 0.969238f, 0.976074f, 0.958008f, 0.944336f, 0.932617f, 0.921875f, 0.912109f, - 0.012329f, 0.037201f, 0.062164f, 0.087646f, 0.112488f, 0.137451f, 0.161865f, 0.187134f, - 0.210938f, 0.234253f, 0.258301f, 0.281006f, 0.303467f, 0.325195f, 0.347656f, 0.368652f, - 0.389648f, 0.410400f, 0.430664f, 0.450928f, 0.470215f, 0.488770f, 0.507812f, 0.525391f, - 0.543457f, 0.560059f, 0.579102f, 0.593750f, 0.611816f, 0.627441f, 0.643066f, 0.658203f, - 0.672363f, 0.687500f, 0.702148f, 0.715820f, 0.729004f, 0.742676f, 0.755371f, 0.768066f, - 0.781738f, 0.792969f, 0.805176f, 0.816895f, 0.829102f, 0.839844f, 0.850586f, 0.861816f, - 0.872559f, 0.882812f, 0.893066f, 0.902832f, 0.912109f, 0.921875f, 0.930664f, 0.940430f, - 0.948242f, 0.958008f, 0.970703f, 0.953613f, 0.940430f, 0.929199f, 0.919434f, 0.910156f, - 0.010979f, 0.033752f, 0.056763f, 0.080139f, 0.103516f, 0.126221f, 0.149414f, 0.172485f, - 0.195435f, 0.218262f, 0.240356f, 0.261719f, 0.284180f, 0.306396f, 0.326416f, 0.347900f, - 0.368408f, 0.389160f, 0.408691f, 0.427979f, 0.447754f, 0.467041f, 0.484863f, 0.502441f, - 0.520996f, 0.538086f, 0.555664f, 0.573242f, 0.589355f, 0.604980f, 0.622559f, 0.637207f, - 0.652832f, 0.666992f, 0.680664f, 0.695801f, 0.710938f, 0.724121f, 0.737305f, 0.750977f, - 0.763672f, 0.776855f, 0.789062f, 0.799805f, 0.812012f, 0.824219f, 0.835449f, 0.846680f, - 0.857910f, 0.868164f, 0.878418f, 0.889160f, 0.898926f, 0.909180f, 0.917969f, 0.928223f, - 0.937012f, 0.946777f, 0.965820f, 0.949707f, 0.937012f, 0.926270f, 0.916504f, 0.907715f, - 0.009941f, 0.030746f, 0.051514f, 0.073181f, 0.094116f, 0.116028f, 0.137817f, 0.158691f, - 0.180664f, 0.202637f, 0.223511f, 0.244873f, 0.265869f, 0.285889f, 0.307129f, 0.327881f, - 0.347412f, 0.367188f, 0.387207f, 0.405762f, 0.425537f, 0.444092f, 0.462646f, 0.481201f, - 0.499756f, 0.516602f, 0.533691f, 0.550781f, 0.567383f, 0.583984f, 0.599609f, 0.616211f, - 0.630859f, 0.647461f, 0.661621f, 0.676758f, 0.689453f, 0.704590f, 0.718750f, 0.731934f, - 0.745117f, 0.757812f, 0.770996f, 0.783691f, 0.796387f, 0.807617f, 0.819824f, 0.831543f, - 0.842773f, 0.854004f, 0.864258f, 0.875488f, 0.885742f, 0.895508f, 0.905762f, 0.915527f, - 0.925781f, 0.934570f, 0.960449f, 0.945312f, 0.933594f, 0.922852f, 0.913574f, 0.905273f, - 0.009003f, 0.027756f, 0.046997f, 0.066711f, 0.085999f, 0.106506f, 0.127075f, 0.146973f, - 0.166992f, 0.187500f, 0.207886f, 0.228149f, 0.248169f, 0.268311f, 0.287842f, 0.307861f, - 0.327393f, 0.347656f, 0.365967f, 0.385010f, 0.404541f, 0.422363f, 0.441162f, 0.458740f, - 0.477783f, 0.495117f, 0.512207f, 0.529297f, 0.546387f, 0.562012f, 0.578613f, 0.595215f, - 0.610840f, 0.625977f, 0.641113f, 0.656738f, 0.670410f, 0.685059f, 0.699707f, 0.714355f, - 0.727051f, 0.741699f, 0.752441f, 0.767090f, 0.778809f, 0.791504f, 0.803711f, 0.815430f, - 0.827148f, 0.838867f, 0.850098f, 0.860840f, 0.872070f, 0.881836f, 0.893066f, 0.903809f, - 0.913574f, 0.923828f, 0.955078f, 0.940918f, 0.929199f, 0.919922f, 0.911133f, 0.902344f, - 0.008469f, 0.025375f, 0.043121f, 0.060944f, 0.079468f, 0.097961f, 0.116394f, 0.135620f, - 0.154541f, 0.174072f, 0.193115f, 0.212280f, 0.231689f, 0.250732f, 0.270264f, 0.289307f, - 0.307861f, 0.327148f, 0.345215f, 0.364990f, 0.382812f, 0.401123f, 0.418945f, 0.437012f, - 0.455811f, 0.472900f, 0.490234f, 0.507812f, 0.524414f, 0.541016f, 0.558105f, 0.573242f, - 0.590332f, 0.605469f, 0.620117f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f, - 0.708496f, 0.722168f, 0.735840f, 0.750000f, 0.762695f, 0.774902f, 0.787598f, 0.798828f, - 0.811523f, 0.823730f, 0.834473f, 0.846191f, 0.857910f, 0.868652f, 0.879883f, 0.891113f, - 0.900391f, 0.911133f, 0.949219f, 0.937012f, 0.925293f, 0.916016f, 0.907227f, 0.899414f, - 0.007618f, 0.023178f, 0.039490f, 0.055542f, 0.072937f, 0.090271f, 0.107605f, 0.125122f, - 0.142944f, 0.160889f, 0.178955f, 0.197510f, 0.216553f, 0.234497f, 0.252686f, 0.271240f, - 0.289795f, 0.307861f, 0.326172f, 0.344238f, 0.362549f, 0.380859f, 0.398438f, 0.416504f, - 0.433838f, 0.452393f, 0.468994f, 0.485840f, 0.502930f, 0.519531f, 0.536133f, 0.553223f, - 0.569336f, 0.584473f, 0.599609f, 0.615234f, 0.631348f, 0.646484f, 0.659668f, 0.675293f, - 0.689941f, 0.703125f, 0.716797f, 0.730957f, 0.744141f, 0.756836f, 0.771484f, 0.782227f, - 0.795898f, 0.807617f, 0.819824f, 0.831543f, 0.843750f, 0.854980f, 0.866211f, 0.877441f, - 0.888672f, 0.898438f, 0.943359f, 0.931641f, 0.921387f, 0.912109f, 0.903809f, 0.896484f, - 0.007118f, 0.021255f, 0.035889f, 0.051514f, 0.066895f, 0.083191f, 0.098999f, 0.115540f, - 0.132324f, 0.149292f, 0.166260f, 0.183716f, 0.200928f, 0.218628f, 0.236084f, 0.253906f, - 0.272217f, 0.289795f, 0.307617f, 0.325439f, 0.342529f, 0.360596f, 0.378906f, 0.395996f, - 0.413330f, 0.430908f, 0.447510f, 0.465332f, 0.481934f, 0.497803f, 0.514648f, 0.531738f, - 0.547852f, 0.562988f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641113f, 0.655273f, - 0.670410f, 0.685059f, 0.698730f, 0.712891f, 0.726074f, 0.739258f, 0.753418f, 0.766113f, - 0.779785f, 0.791992f, 0.803711f, 0.816406f, 0.829102f, 0.839844f, 0.852539f, 0.863770f, - 0.874512f, 0.886719f, 0.937988f, 0.926758f, 0.917480f, 0.908203f, 0.900391f, 0.893066f, - 0.006481f, 0.019775f, 0.032928f, 0.047272f, 0.061371f, 0.076233f, 0.091064f, 0.107117f, - 0.122559f, 0.138062f, 0.154663f, 0.170532f, 0.187256f, 0.204346f, 0.220947f, 0.237915f, - 0.254883f, 0.272217f, 0.289062f, 0.306641f, 0.323730f, 0.341064f, 0.358643f, 0.375732f, - 0.393555f, 0.410645f, 0.426758f, 0.444580f, 0.461182f, 0.477783f, 0.494141f, 0.510254f, - 0.526855f, 0.543457f, 0.559082f, 0.574219f, 0.590332f, 0.605957f, 0.621094f, 0.634766f, - 0.650879f, 0.665039f, 0.679688f, 0.694824f, 0.708008f, 0.722656f, 0.736816f, 0.749023f, - 0.762695f, 0.775391f, 0.788086f, 0.801270f, 0.813965f, 0.826172f, 0.838379f, 0.849121f, - 0.861328f, 0.873535f, 0.932129f, 0.921875f, 0.912598f, 0.904297f, 0.896484f, 0.889160f, - 0.005924f, 0.017899f, 0.030426f, 0.043427f, 0.056824f, 0.070435f, 0.084106f, 0.098755f, - 0.112976f, 0.128052f, 0.143311f, 0.158936f, 0.174072f, 0.189575f, 0.206421f, 0.222534f, - 0.238403f, 0.255615f, 0.271729f, 0.288818f, 0.305908f, 0.322021f, 0.339355f, 0.356445f, - 0.373291f, 0.390137f, 0.407227f, 0.423584f, 0.440430f, 0.457031f, 0.472900f, 0.489502f, - 0.506836f, 0.521973f, 0.538574f, 0.554688f, 0.570312f, 0.585449f, 0.601074f, 0.616211f, - 0.631348f, 0.646484f, 0.661621f, 0.675781f, 0.690430f, 0.704590f, 0.717285f, 0.731934f, - 0.746094f, 0.759277f, 0.771973f, 0.785156f, 0.798340f, 0.810547f, 0.823242f, 0.835938f, - 0.848145f, 0.860352f, 0.925781f, 0.916504f, 0.908203f, 0.900391f, 0.893066f, 0.886719f, - 0.005573f, 0.016693f, 0.028366f, 0.040192f, 0.052277f, 0.064880f, 0.078064f, 0.090698f, - 0.105042f, 0.118591f, 0.133057f, 0.147461f, 0.162231f, 0.177612f, 0.192383f, 0.207886f, - 0.223633f, 0.239502f, 0.255615f, 0.272217f, 0.288330f, 0.304932f, 0.320312f, 0.337646f, - 0.354004f, 0.369873f, 0.386719f, 0.403320f, 0.419922f, 0.437012f, 0.453369f, 0.469482f, - 0.485596f, 0.501465f, 0.517578f, 0.534180f, 0.549316f, 0.565918f, 0.581055f, 0.595703f, - 0.611328f, 0.626953f, 0.641602f, 0.657227f, 0.671387f, 0.686523f, 0.699707f, 0.714355f, - 0.729004f, 0.742676f, 0.756348f, 0.769043f, 0.782715f, 0.795410f, 0.809082f, 0.821289f, - 0.833984f, 0.846680f, 0.919434f, 0.911133f, 0.903320f, 0.895508f, 0.888672f, 0.882324f, - 0.005016f, 0.015396f, 0.026169f, 0.037231f, 0.048126f, 0.059937f, 0.071716f, 0.084167f, - 0.096680f, 0.109558f, 0.123169f, 0.136719f, 0.150269f, 0.164917f, 0.179077f, 0.194580f, - 0.208984f, 0.223877f, 0.239746f, 0.255127f, 0.270996f, 0.286377f, 0.302490f, 0.319336f, - 0.335205f, 0.351318f, 0.367432f, 0.383545f, 0.399902f, 0.415771f, 0.432373f, 0.448975f, - 0.465088f, 0.481934f, 0.497314f, 0.513672f, 0.529785f, 0.544434f, 0.561035f, 0.576660f, - 0.592285f, 0.607422f, 0.622559f, 0.638184f, 0.652344f, 0.667480f, 0.681641f, 0.696777f, - 0.711426f, 0.725586f, 0.738770f, 0.753418f, 0.766602f, 0.779297f, 0.793945f, 0.807129f, - 0.819824f, 0.833008f, 0.913086f, 0.906738f, 0.898438f, 0.890625f, 0.884277f, 0.878418f, - 0.004738f, 0.014053f, 0.024017f, 0.033752f, 0.044495f, 0.055328f, 0.066467f, 0.078064f, - 0.089661f, 0.102051f, 0.114258f, 0.126831f, 0.139771f, 0.153564f, 0.167114f, 0.181030f, - 0.195190f, 0.209839f, 0.224731f, 0.239136f, 0.253906f, 0.269531f, 0.285156f, 0.300293f, - 0.317139f, 0.332520f, 0.348145f, 0.364990f, 0.380859f, 0.396240f, 0.412109f, 0.428711f, - 0.444336f, 0.460938f, 0.477295f, 0.492676f, 0.509277f, 0.524902f, 0.540527f, 0.556641f, - 0.572266f, 0.587402f, 0.604004f, 0.618164f, 0.633301f, 0.648438f, 0.664062f, 0.678223f, - 0.693359f, 0.708008f, 0.722656f, 0.736328f, 0.750000f, 0.764160f, 0.777832f, 0.791016f, - 0.805176f, 0.817871f, 0.907227f, 0.900879f, 0.894043f, 0.886719f, 0.880371f, 0.874512f, - 0.004105f, 0.012741f, 0.022491f, 0.031769f, 0.041107f, 0.051208f, 0.061249f, 0.071777f, - 0.083069f, 0.093811f, 0.105896f, 0.117554f, 0.129761f, 0.142212f, 0.155273f, 0.168579f, - 0.182251f, 0.196167f, 0.210449f, 0.223755f, 0.238525f, 0.253662f, 0.268799f, 0.283447f, - 0.298828f, 0.313965f, 0.329834f, 0.344971f, 0.361328f, 0.376953f, 0.393066f, 0.408691f, - 0.424561f, 0.441406f, 0.457031f, 0.472656f, 0.488770f, 0.504883f, 0.520996f, 0.536133f, - 0.551758f, 0.567871f, 0.583496f, 0.599121f, 0.614258f, 0.629395f, 0.645996f, 0.660156f, - 0.675781f, 0.689453f, 0.704102f, 0.719727f, 0.733398f, 0.747559f, 0.761719f, 0.776367f, - 0.789062f, 0.803223f, 0.899902f, 0.895020f, 0.888184f, 0.881836f, 0.875488f, 0.870117f, - 0.003925f, 0.011978f, 0.020538f, 0.028763f, 0.038269f, 0.047028f, 0.056732f, 0.066223f, - 0.076904f, 0.086731f, 0.097900f, 0.109314f, 0.120483f, 0.132324f, 0.144653f, 0.156982f, - 0.169678f, 0.183228f, 0.196289f, 0.209961f, 0.223633f, 0.237427f, 0.251953f, 0.266602f, - 0.281982f, 0.296875f, 0.312012f, 0.326660f, 0.342041f, 0.357910f, 0.373779f, 0.389404f, - 0.404785f, 0.420166f, 0.436768f, 0.452637f, 0.468506f, 0.484863f, 0.500977f, 0.516602f, - 0.531738f, 0.546875f, 0.563965f, 0.579102f, 0.595215f, 0.610840f, 0.625977f, 0.641602f, - 0.657227f, 0.671387f, 0.687500f, 0.702148f, 0.716309f, 0.731445f, 0.746094f, 0.760742f, - 0.774414f, 0.788086f, 0.893066f, 0.889648f, 0.882812f, 0.876953f, 0.870605f, 0.865723f, - 0.003704f, 0.011169f, 0.019165f, 0.026550f, 0.035339f, 0.043488f, 0.052277f, 0.061066f, - 0.071045f, 0.080933f, 0.090576f, 0.101074f, 0.111877f, 0.122925f, 0.134277f, 0.146118f, - 0.157837f, 0.170288f, 0.183105f, 0.195557f, 0.209351f, 0.222900f, 0.236328f, 0.250732f, - 0.264893f, 0.279297f, 0.294189f, 0.308838f, 0.323975f, 0.339844f, 0.354736f, 0.370117f, - 0.385986f, 0.401367f, 0.416504f, 0.432861f, 0.448486f, 0.463867f, 0.480469f, 0.497070f, - 0.511719f, 0.527832f, 0.544434f, 0.559570f, 0.575684f, 0.591797f, 0.606934f, 0.623047f, - 0.638184f, 0.654297f, 0.668945f, 0.684570f, 0.699219f, 0.714355f, 0.729492f, 0.744629f, - 0.758789f, 0.773926f, 0.886230f, 0.883301f, 0.877441f, 0.871582f, 0.866211f, 0.860840f, - 0.003500f, 0.010292f, 0.017395f, 0.024963f, 0.032440f, 0.040344f, 0.048462f, 0.057098f, - 0.065063f, 0.074646f, 0.083679f, 0.093445f, 0.103882f, 0.114136f, 0.124451f, 0.135498f, - 0.146606f, 0.158447f, 0.170410f, 0.182739f, 0.195435f, 0.208008f, 0.221558f, 0.234863f, - 0.248657f, 0.262695f, 0.276855f, 0.291748f, 0.306152f, 0.320801f, 0.335693f, 0.350830f, - 0.365967f, 0.382080f, 0.396973f, 0.413330f, 0.429199f, 0.444336f, 0.459473f, 0.476074f, - 0.492188f, 0.507812f, 0.524414f, 0.540039f, 0.555664f, 0.571777f, 0.586914f, 0.604004f, - 0.619629f, 0.635742f, 0.650391f, 0.666504f, 0.682129f, 0.697754f, 0.712891f, 0.728027f, - 0.743164f, 0.758301f, 0.878906f, 0.877441f, 0.871582f, 0.866699f, 0.860840f, 0.856445f, - 0.003084f, 0.009697f, 0.016403f, 0.022659f, 0.029892f, 0.037354f, 0.044281f, 0.052338f, - 0.060516f, 0.068970f, 0.077515f, 0.086243f, 0.096069f, 0.105713f, 0.115356f, 0.125610f, - 0.136353f, 0.147339f, 0.158081f, 0.170410f, 0.181396f, 0.194458f, 0.207275f, 0.219482f, - 0.232910f, 0.246704f, 0.260010f, 0.274170f, 0.288330f, 0.302979f, 0.317383f, 0.332764f, - 0.347656f, 0.363037f, 0.378174f, 0.392578f, 0.408936f, 0.424316f, 0.440430f, 0.456299f, - 0.472656f, 0.488525f, 0.503906f, 0.519531f, 0.535645f, 0.552734f, 0.568359f, 0.584961f, - 0.600586f, 0.616699f, 0.633301f, 0.648438f, 0.663574f, 0.679199f, 0.694824f, 0.710938f, - 0.726074f, 0.742188f, 0.872559f, 0.870605f, 0.865723f, 0.860840f, 0.855957f, 0.851074f, - 0.002913f, 0.008781f, 0.014938f, 0.021759f, 0.027878f, 0.034393f, 0.041412f, 0.048737f, - 0.055969f, 0.063599f, 0.072021f, 0.080200f, 0.088928f, 0.097839f, 0.106934f, 0.116150f, - 0.126587f, 0.136353f, 0.147095f, 0.157715f, 0.169189f, 0.181519f, 0.193481f, 0.205933f, - 0.217773f, 0.231323f, 0.244629f, 0.257812f, 0.271240f, 0.285400f, 0.299561f, 0.314453f, - 0.329590f, 0.343506f, 0.358887f, 0.373779f, 0.389648f, 0.405029f, 0.420410f, 0.437012f, - 0.452393f, 0.468262f, 0.484375f, 0.500000f, 0.516113f, 0.532227f, 0.548828f, 0.564941f, - 0.581055f, 0.597168f, 0.612793f, 0.629883f, 0.645508f, 0.662109f, 0.678223f, 0.694336f, - 0.709473f, 0.726074f, 0.863770f, 0.864258f, 0.859863f, 0.854980f, 0.850586f, 0.846191f, - 0.002815f, 0.008194f, 0.013954f, 0.019653f, 0.025696f, 0.031982f, 0.038177f, 0.044830f, - 0.051819f, 0.058502f, 0.066162f, 0.073792f, 0.082031f, 0.090393f, 0.098999f, 0.107605f, - 0.117493f, 0.126709f, 0.137207f, 0.146729f, 0.157593f, 0.168579f, 0.179810f, 0.191772f, - 0.203369f, 0.215820f, 0.228882f, 0.241455f, 0.254395f, 0.268311f, 0.282227f, 0.296631f, - 0.310303f, 0.325439f, 0.339844f, 0.354736f, 0.370361f, 0.385742f, 0.400879f, 0.416504f, - 0.432617f, 0.448486f, 0.464355f, 0.479980f, 0.496094f, 0.513184f, 0.528809f, 0.545410f, - 0.561035f, 0.578613f, 0.594727f, 0.611328f, 0.626953f, 0.643555f, 0.660156f, 0.676270f, - 0.693359f, 0.709473f, 0.856445f, 0.858398f, 0.854492f, 0.849121f, 0.845215f, 0.841309f, - 0.002583f, 0.007492f, 0.012878f, 0.018417f, 0.023941f, 0.029495f, 0.035339f, 0.041779f, - 0.047577f, 0.054047f, 0.061523f, 0.068787f, 0.075562f, 0.083313f, 0.091858f, 0.099792f, - 0.108521f, 0.117615f, 0.126709f, 0.136108f, 0.146851f, 0.156860f, 0.166992f, 0.178345f, - 0.189819f, 0.202148f, 0.213623f, 0.225830f, 0.238892f, 0.252197f, 0.265137f, 0.278809f, - 0.292480f, 0.306885f, 0.321045f, 0.336914f, 0.350830f, 0.366943f, 0.381348f, 0.396240f, - 0.412354f, 0.428223f, 0.444336f, 0.460449f, 0.476318f, 0.493408f, 0.509277f, 0.525879f, - 0.542480f, 0.559082f, 0.574707f, 0.591797f, 0.608398f, 0.625488f, 0.642090f, 0.659180f, - 0.675781f, 0.691406f, 0.848145f, 0.851562f, 0.848145f, 0.843750f, 0.838867f, 0.835449f, - 0.002512f, 0.007374f, 0.012115f, 0.016983f, 0.022064f, 0.027359f, 0.032715f, 0.038147f, - 0.044373f, 0.050354f, 0.056641f, 0.063293f, 0.070190f, 0.077026f, 0.084717f, 0.092041f, - 0.100342f, 0.108398f, 0.117554f, 0.126221f, 0.135742f, 0.145142f, 0.155151f, 0.165771f, - 0.176758f, 0.187988f, 0.199341f, 0.210815f, 0.223389f, 0.236206f, 0.249023f, 0.261719f, - 0.275879f, 0.289062f, 0.303467f, 0.317627f, 0.332520f, 0.347412f, 0.361816f, 0.377197f, - 0.393066f, 0.407959f, 0.424072f, 0.440186f, 0.457031f, 0.473145f, 0.489502f, 0.505859f, - 0.522461f, 0.540039f, 0.555664f, 0.572754f, 0.589844f, 0.606445f, 0.623535f, 0.640625f, - 0.658203f, 0.675781f, 0.840820f, 0.843750f, 0.841309f, 0.836914f, 0.833984f, 0.830566f, - 0.002369f, 0.006668f, 0.011093f, 0.015778f, 0.020523f, 0.025223f, 0.030701f, 0.035339f, - 0.040710f, 0.046600f, 0.051971f, 0.058075f, 0.064819f, 0.071228f, 0.077942f, 0.085205f, - 0.092224f, 0.100464f, 0.108398f, 0.116882f, 0.125610f, 0.134155f, 0.143555f, 0.153564f, - 0.164062f, 0.174316f, 0.185303f, 0.196899f, 0.208496f, 0.220093f, 0.232666f, 0.245239f, - 0.258057f, 0.271729f, 0.285645f, 0.299561f, 0.313721f, 0.328613f, 0.342773f, 0.358154f, - 0.373535f, 0.388916f, 0.405518f, 0.419922f, 0.437012f, 0.453125f, 0.469238f, 0.486328f, - 0.502930f, 0.519531f, 0.536133f, 0.553223f, 0.571289f, 0.588379f, 0.605469f, 0.623047f, - 0.640137f, 0.656250f, 0.833008f, 0.837402f, 0.834473f, 0.831055f, 0.827637f, 0.824219f, - 0.002188f, 0.006027f, 0.010582f, 0.014297f, 0.018921f, 0.023270f, 0.028183f, 0.032593f, - 0.037781f, 0.042999f, 0.048584f, 0.053650f, 0.059601f, 0.065369f, 0.071899f, 0.078369f, - 0.085449f, 0.092407f, 0.099609f, 0.107788f, 0.115601f, 0.124451f, 0.133301f, 0.142212f, - 0.151978f, 0.161865f, 0.172363f, 0.182617f, 0.193970f, 0.205566f, 0.217407f, 0.229858f, - 0.241943f, 0.254639f, 0.268311f, 0.281494f, 0.295654f, 0.310059f, 0.324219f, 0.339600f, - 0.353760f, 0.369629f, 0.385010f, 0.400879f, 0.417725f, 0.433594f, 0.449219f, 0.465820f, - 0.482910f, 0.499512f, 0.517090f, 0.534180f, 0.551270f, 0.568848f, 0.586426f, 0.604004f, - 0.622559f, 0.639160f, 0.824219f, 0.830078f, 0.827637f, 0.824707f, 0.821777f, 0.818359f, - 0.002098f, 0.005634f, 0.009354f, 0.013557f, 0.017685f, 0.021576f, 0.025604f, 0.030380f, - 0.034943f, 0.039429f, 0.044281f, 0.049255f, 0.055023f, 0.060577f, 0.066101f, 0.072144f, - 0.078491f, 0.085083f, 0.091858f, 0.098999f, 0.106873f, 0.114502f, 0.122498f, 0.131592f, - 0.140137f, 0.149536f, 0.159424f, 0.169556f, 0.180054f, 0.191162f, 0.202026f, 0.213989f, - 0.226318f, 0.239136f, 0.250977f, 0.264648f, 0.278320f, 0.291748f, 0.305908f, 0.320557f, - 0.334961f, 0.350342f, 0.365479f, 0.381592f, 0.397461f, 0.413818f, 0.429199f, 0.446289f, - 0.462891f, 0.479736f, 0.496338f, 0.514160f, 0.530762f, 0.548828f, 0.566406f, 0.584473f, - 0.602539f, 0.621582f, 0.815918f, 0.823730f, 0.821289f, 0.817871f, 0.815430f, 0.812500f, - 0.001772f, 0.005249f, 0.008995f, 0.012260f, 0.016251f, 0.020020f, 0.024216f, 0.027603f, - 0.032196f, 0.036377f, 0.041199f, 0.045410f, 0.050110f, 0.055603f, 0.061005f, 0.066406f, - 0.072327f, 0.077820f, 0.084290f, 0.090942f, 0.098083f, 0.105164f, 0.113037f, 0.120789f, - 0.129272f, 0.138062f, 0.147339f, 0.156982f, 0.166626f, 0.176758f, 0.187866f, 0.199097f, - 0.210449f, 0.222412f, 0.234985f, 0.247559f, 0.260742f, 0.273682f, 0.287598f, 0.302002f, - 0.316650f, 0.331299f, 0.346191f, 0.362061f, 0.377686f, 0.393066f, 0.409668f, 0.426514f, - 0.443115f, 0.459717f, 0.476807f, 0.494629f, 0.511230f, 0.529785f, 0.547852f, 0.565430f, - 0.583984f, 0.602539f, 0.806152f, 0.814453f, 0.813965f, 0.811035f, 0.809082f, 0.806641f, - 0.001631f, 0.005131f, 0.008186f, 0.011673f, 0.014938f, 0.018463f, 0.021957f, 0.025635f, - 0.029083f, 0.033325f, 0.037445f, 0.041840f, 0.046478f, 0.050751f, 0.055634f, 0.060760f, - 0.065979f, 0.071472f, 0.077515f, 0.083801f, 0.090027f, 0.096802f, 0.104065f, 0.110840f, - 0.119080f, 0.127197f, 0.135498f, 0.144775f, 0.153931f, 0.163574f, 0.173462f, 0.184570f, - 0.195312f, 0.207153f, 0.218506f, 0.230591f, 0.243652f, 0.256348f, 0.270020f, 0.283691f, - 0.297852f, 0.312744f, 0.326904f, 0.342529f, 0.357910f, 0.373535f, 0.389404f, 0.406494f, - 0.421875f, 0.439941f, 0.457275f, 0.474365f, 0.492432f, 0.509766f, 0.527832f, 0.546875f, - 0.564941f, 0.584473f, 0.797852f, 0.807129f, 0.807129f, 0.804199f, 0.801758f, 0.799316f, - 0.001632f, 0.004704f, 0.007912f, 0.010788f, 0.013870f, 0.017105f, 0.020187f, 0.023483f, - 0.026932f, 0.030563f, 0.034332f, 0.038086f, 0.042694f, 0.046631f, 0.050995f, 0.055725f, - 0.060486f, 0.065674f, 0.070862f, 0.076721f, 0.082825f, 0.088623f, 0.094910f, 0.102112f, - 0.109070f, 0.116516f, 0.124695f, 0.133057f, 0.141968f, 0.151001f, 0.160522f, 0.170776f, - 0.181030f, 0.191650f, 0.202881f, 0.214722f, 0.227417f, 0.239624f, 0.252686f, 0.265625f, - 0.279785f, 0.293213f, 0.308350f, 0.323242f, 0.338867f, 0.354248f, 0.370117f, 0.386475f, - 0.403076f, 0.420410f, 0.437012f, 0.454102f, 0.471924f, 0.490234f, 0.508789f, 0.526855f, - 0.545410f, 0.564453f, 0.788086f, 0.799316f, 0.798828f, 0.797852f, 0.794434f, 0.791992f, - 0.001594f, 0.004177f, 0.007122f, 0.010201f, 0.012344f, 0.015839f, 0.018372f, 0.021683f, - 0.024857f, 0.028534f, 0.031464f, 0.035034f, 0.038879f, 0.042572f, 0.046295f, 0.051056f, - 0.055389f, 0.059723f, 0.064697f, 0.069763f, 0.075073f, 0.080750f, 0.087219f, 0.093445f, - 0.099548f, 0.107056f, 0.114136f, 0.121887f, 0.130249f, 0.138794f, 0.147217f, 0.157104f, - 0.166748f, 0.177124f, 0.187988f, 0.199097f, 0.210693f, 0.222778f, 0.235352f, 0.248169f, - 0.261719f, 0.275635f, 0.289062f, 0.303955f, 0.319336f, 0.334717f, 0.350098f, 0.365479f, - 0.382324f, 0.398926f, 0.416016f, 0.433594f, 0.451904f, 0.469238f, 0.487549f, 0.506348f, - 0.525391f, 0.544922f, 0.779297f, 0.791504f, 0.791504f, 0.789551f, 0.788086f, 0.786133f, - 0.001365f, 0.004173f, 0.006222f, 0.008842f, 0.011703f, 0.014366f, 0.017242f, 0.020218f, - 0.022903f, 0.025787f, 0.028824f, 0.032227f, 0.035522f, 0.038818f, 0.042511f, 0.046326f, - 0.050507f, 0.054657f, 0.058594f, 0.063660f, 0.068359f, 0.073914f, 0.078918f, 0.085083f, - 0.091125f, 0.097534f, 0.104126f, 0.111511f, 0.118896f, 0.126831f, 0.135742f, 0.144043f, - 0.153564f, 0.163330f, 0.173462f, 0.184082f, 0.195068f, 0.206787f, 0.218628f, 0.231079f, - 0.243896f, 0.257080f, 0.270996f, 0.285645f, 0.300049f, 0.314941f, 0.330322f, 0.346191f, - 0.362305f, 0.379395f, 0.395508f, 0.412842f, 0.431641f, 0.448975f, 0.468262f, 0.487549f, - 0.505371f, 0.525391f, 0.769531f, 0.783691f, 0.783691f, 0.782715f, 0.781250f, 0.778809f, - 0.001230f, 0.003925f, 0.006268f, 0.008659f, 0.010796f, 0.013145f, 0.015617f, 0.018234f, - 0.021133f, 0.023682f, 0.026215f, 0.029251f, 0.032349f, 0.035400f, 0.038696f, 0.042206f, - 0.045807f, 0.049377f, 0.053925f, 0.057953f, 0.062500f, 0.067078f, 0.071777f, 0.077271f, - 0.082703f, 0.088806f, 0.094910f, 0.101379f, 0.109192f, 0.115967f, 0.123779f, 0.131470f, - 0.140259f, 0.149536f, 0.159302f, 0.169312f, 0.180054f, 0.190674f, 0.202515f, 0.214722f, - 0.226562f, 0.239624f, 0.253174f, 0.266602f, 0.281738f, 0.295898f, 0.311035f, 0.326904f, - 0.342529f, 0.359131f, 0.375732f, 0.393066f, 0.410400f, 0.428467f, 0.447510f, 0.466064f, - 0.485596f, 0.504883f, 0.759277f, 0.774902f, 0.775879f, 0.774902f, 0.773438f, 0.771973f, - 0.001031f, 0.003601f, 0.005604f, 0.007858f, 0.009880f, 0.012146f, 0.014549f, 0.016998f, - 0.019043f, 0.021362f, 0.024475f, 0.026566f, 0.029358f, 0.032196f, 0.035248f, 0.038391f, - 0.041656f, 0.045044f, 0.048553f, 0.052582f, 0.056213f, 0.060669f, 0.065186f, 0.070068f, - 0.074768f, 0.080322f, 0.086060f, 0.092102f, 0.098877f, 0.105408f, 0.112366f, 0.120239f, - 0.128540f, 0.136597f, 0.145874f, 0.155396f, 0.165283f, 0.175537f, 0.186401f, 0.198120f, - 0.210083f, 0.222534f, 0.235229f, 0.248657f, 0.262451f, 0.277344f, 0.291504f, 0.307617f, - 0.322998f, 0.339111f, 0.354980f, 0.372559f, 0.390625f, 0.408936f, 0.426758f, 0.445312f, - 0.466064f, 0.485840f, 0.749512f, 0.765137f, 0.767578f, 0.767090f, 0.765137f, 0.764648f, - 0.001161f, 0.003078f, 0.005310f, 0.007282f, 0.009201f, 0.011330f, 0.013214f, 0.015404f, - 0.017273f, 0.019409f, 0.021988f, 0.024078f, 0.026550f, 0.029358f, 0.032043f, 0.034454f, - 0.037415f, 0.040710f, 0.043854f, 0.047272f, 0.050659f, 0.054840f, 0.058777f, 0.063293f, - 0.067566f, 0.072449f, 0.077759f, 0.083069f, 0.088928f, 0.095886f, 0.102478f, 0.109070f, - 0.116760f, 0.124390f, 0.132935f, 0.141479f, 0.151123f, 0.161011f, 0.171143f, 0.182007f, - 0.193726f, 0.205688f, 0.218018f, 0.230835f, 0.244507f, 0.258789f, 0.272949f, 0.287109f, - 0.303467f, 0.319336f, 0.335449f, 0.352539f, 0.369873f, 0.387939f, 0.406250f, 0.425049f, - 0.444824f, 0.464844f, 0.739258f, 0.756348f, 0.758789f, 0.758789f, 0.757324f, 0.756836f, - 0.001004f, 0.002939f, 0.005005f, 0.006779f, 0.008453f, 0.010323f, 0.012177f, 0.013870f, - 0.016052f, 0.018051f, 0.019638f, 0.022141f, 0.023956f, 0.026413f, 0.028870f, 0.031281f, - 0.033661f, 0.036591f, 0.039429f, 0.042542f, 0.045776f, 0.049011f, 0.053009f, 0.056885f, - 0.061035f, 0.065186f, 0.069885f, 0.075134f, 0.080505f, 0.085999f, 0.091858f, 0.098633f, - 0.105591f, 0.112732f, 0.120667f, 0.128662f, 0.137573f, 0.146729f, 0.156372f, 0.166748f, - 0.177490f, 0.189331f, 0.201294f, 0.213501f, 0.226807f, 0.239746f, 0.254150f, 0.268555f, - 0.283936f, 0.298828f, 0.316162f, 0.332275f, 0.349609f, 0.367432f, 0.385498f, 0.404053f, - 0.423828f, 0.443848f, 0.728516f, 0.747559f, 0.750488f, 0.750488f, 0.749512f, 0.748047f, - 0.000970f, 0.002523f, 0.004665f, 0.006203f, 0.007759f, 0.009491f, 0.011070f, 0.012802f, - 0.014336f, 0.016266f, 0.017944f, 0.019852f, 0.021805f, 0.023911f, 0.025818f, 0.028137f, - 0.030579f, 0.032837f, 0.035248f, 0.038055f, 0.041046f, 0.044189f, 0.047333f, 0.050842f, - 0.054504f, 0.058502f, 0.062866f, 0.067383f, 0.071960f, 0.077393f, 0.082642f, 0.088928f, - 0.095093f, 0.101685f, 0.108765f, 0.116272f, 0.124451f, 0.133423f, 0.142212f, 0.152100f, - 0.162354f, 0.172729f, 0.184692f, 0.196411f, 0.209106f, 0.221802f, 0.235718f, 0.250000f, - 0.265137f, 0.280029f, 0.296143f, 0.312012f, 0.329346f, 0.346924f, 0.364990f, 0.384277f, - 0.403564f, 0.423340f, 0.718262f, 0.738770f, 0.741211f, 0.742188f, 0.741211f, 0.740234f, - 0.000785f, 0.002600f, 0.004028f, 0.005390f, 0.007275f, 0.008774f, 0.010124f, 0.011620f, - 0.013306f, 0.014427f, 0.015991f, 0.017838f, 0.019577f, 0.021469f, 0.023254f, 0.024902f, - 0.027115f, 0.029190f, 0.031677f, 0.034088f, 0.036682f, 0.039307f, 0.042175f, 0.045410f, - 0.048553f, 0.052002f, 0.055908f, 0.060028f, 0.064270f, 0.068909f, 0.074097f, 0.079163f, - 0.085022f, 0.091309f, 0.097473f, 0.104797f, 0.112183f, 0.120239f, 0.128662f, 0.137451f, - 0.146973f, 0.157471f, 0.168213f, 0.179810f, 0.191650f, 0.204468f, 0.217529f, 0.231201f, - 0.245605f, 0.260254f, 0.275879f, 0.292236f, 0.308838f, 0.326416f, 0.344238f, 0.363037f, - 0.382080f, 0.403076f, 0.707031f, 0.729980f, 0.732422f, 0.733398f, 0.733398f, 0.732910f, - 0.000775f, 0.002190f, 0.003696f, 0.005081f, 0.006397f, 0.007858f, 0.009239f, 0.010323f, - 0.011803f, 0.012978f, 0.014328f, 0.015915f, 0.017349f, 0.019058f, 0.020630f, 0.022339f, - 0.024445f, 0.025909f, 0.028275f, 0.030151f, 0.032532f, 0.035065f, 0.037476f, 0.040283f, - 0.042969f, 0.046448f, 0.049469f, 0.053314f, 0.056976f, 0.061371f, 0.065613f, 0.070435f, - 0.075623f, 0.081360f, 0.087341f, 0.093628f, 0.100220f, 0.107788f, 0.115845f, 0.123901f, - 0.133057f, 0.142456f, 0.152832f, 0.163574f, 0.174561f, 0.187012f, 0.199463f, 0.212646f, - 0.226562f, 0.241455f, 0.256836f, 0.272705f, 0.288818f, 0.305664f, 0.323486f, 0.341797f, - 0.362305f, 0.382080f, 0.695312f, 0.719238f, 0.722656f, 0.724121f, 0.724121f, 0.723633f, - 0.000906f, 0.002022f, 0.003521f, 0.004963f, 0.005756f, 0.006847f, 0.008446f, 0.009392f, - 0.010437f, 0.012039f, 0.012863f, 0.014343f, 0.015457f, 0.016876f, 0.018295f, 0.019730f, - 0.021484f, 0.023102f, 0.024689f, 0.026581f, 0.028717f, 0.030945f, 0.032928f, 0.035370f, - 0.037872f, 0.040894f, 0.043915f, 0.047028f, 0.050415f, 0.054169f, 0.058167f, 0.062286f, - 0.067078f, 0.071960f, 0.077209f, 0.082947f, 0.089417f, 0.096008f, 0.103271f, 0.110718f, - 0.119324f, 0.128052f, 0.137817f, 0.147705f, 0.158691f, 0.169922f, 0.181519f, 0.195435f, - 0.208496f, 0.222534f, 0.237305f, 0.252441f, 0.268799f, 0.285645f, 0.302979f, 0.322266f, - 0.340332f, 0.360840f, 0.683594f, 0.708984f, 0.714355f, 0.715332f, 0.715820f, 0.715332f, - 0.000700f, 0.002043f, 0.003139f, 0.004219f, 0.005417f, 0.006477f, 0.007442f, 0.008415f, - 0.009499f, 0.010475f, 0.011497f, 0.012619f, 0.013824f, 0.014969f, 0.016190f, 0.017639f, - 0.018799f, 0.020386f, 0.021896f, 0.023560f, 0.025131f, 0.027176f, 0.028900f, 0.031067f, - 0.033295f, 0.035919f, 0.038239f, 0.041229f, 0.044373f, 0.047394f, 0.050934f, 0.054871f, - 0.058838f, 0.063293f, 0.068115f, 0.073303f, 0.078857f, 0.084839f, 0.091309f, 0.098328f, - 0.106079f, 0.114136f, 0.123230f, 0.132690f, 0.143066f, 0.153442f, 0.165161f, 0.177368f, - 0.190186f, 0.203979f, 0.218262f, 0.232910f, 0.248901f, 0.265381f, 0.282227f, 0.301025f, - 0.319580f, 0.339355f, 0.672852f, 0.699707f, 0.704590f, 0.706055f, 0.706543f, 0.706055f, - 0.000762f, 0.001804f, 0.002762f, 0.003914f, 0.004791f, 0.005764f, 0.006542f, 0.007622f, - 0.008606f, 0.009232f, 0.010178f, 0.011093f, 0.012108f, 0.013191f, 0.014412f, 0.015289f, - 0.016510f, 0.017731f, 0.019119f, 0.020615f, 0.022049f, 0.023483f, 0.025345f, 0.027100f, - 0.028885f, 0.031067f, 0.033417f, 0.035797f, 0.038422f, 0.041382f, 0.044495f, 0.047638f, - 0.051178f, 0.055267f, 0.059387f, 0.064026f, 0.069092f, 0.074585f, 0.080566f, 0.087097f, - 0.093811f, 0.101624f, 0.109619f, 0.117798f, 0.127319f, 0.137817f, 0.148682f, 0.160278f, - 0.172607f, 0.185669f, 0.199097f, 0.214233f, 0.229492f, 0.245850f, 0.261963f, 0.280273f, - 0.299316f, 0.319580f, 0.660645f, 0.689453f, 0.694824f, 0.696777f, 0.697266f, 0.697266f, - 0.000499f, 0.001527f, 0.002565f, 0.003622f, 0.004429f, 0.005138f, 0.005955f, 0.006691f, - 0.007317f, 0.008156f, 0.008949f, 0.009903f, 0.010635f, 0.011452f, 0.012512f, 0.013451f, - 0.014503f, 0.015610f, 0.016632f, 0.017746f, 0.019073f, 0.020355f, 0.021957f, 0.023453f, - 0.025208f, 0.026932f, 0.028732f, 0.030945f, 0.033142f, 0.035614f, 0.038300f, 0.041199f, - 0.044464f, 0.047760f, 0.051514f, 0.055573f, 0.059998f, 0.064819f, 0.070312f, 0.075867f, - 0.082275f, 0.088806f, 0.096436f, 0.104797f, 0.113342f, 0.122559f, 0.132568f, 0.143799f, - 0.155396f, 0.167725f, 0.181274f, 0.195068f, 0.209961f, 0.225708f, 0.242310f, 0.259766f, - 0.277832f, 0.297363f, 0.648926f, 0.678711f, 0.685059f, 0.687500f, 0.687500f, 0.687988f, - 0.000653f, 0.001627f, 0.002562f, 0.003166f, 0.003872f, 0.004562f, 0.005287f, 0.005905f, - 0.006557f, 0.007309f, 0.007835f, 0.008621f, 0.009140f, 0.010109f, 0.010773f, 0.011627f, - 0.012428f, 0.013351f, 0.014488f, 0.015472f, 0.016479f, 0.017578f, 0.018845f, 0.020157f, - 0.021591f, 0.023132f, 0.024765f, 0.026337f, 0.028473f, 0.030594f, 0.032867f, 0.035309f, - 0.037933f, 0.041107f, 0.044403f, 0.047852f, 0.051666f, 0.055756f, 0.060455f, 0.065552f, - 0.070740f, 0.077454f, 0.083862f, 0.091125f, 0.099304f, 0.107971f, 0.117859f, 0.127808f, - 0.139038f, 0.150757f, 0.163574f, 0.176880f, 0.191162f, 0.206665f, 0.222656f, 0.239258f, - 0.257568f, 0.277100f, 0.636230f, 0.667969f, 0.675293f, 0.677734f, 0.678223f, 0.678711f, - 0.000393f, 0.001375f, 0.002174f, 0.002773f, 0.003334f, 0.004070f, 0.004692f, 0.005047f, - 0.005672f, 0.006298f, 0.006893f, 0.007454f, 0.007957f, 0.008636f, 0.009171f, 0.010002f, - 0.010674f, 0.011574f, 0.012451f, 0.013145f, 0.014091f, 0.014893f, 0.016083f, 0.017151f, - 0.018402f, 0.019714f, 0.021042f, 0.022415f, 0.024155f, 0.026108f, 0.027786f, 0.030212f, - 0.032379f, 0.034698f, 0.037415f, 0.040436f, 0.043793f, 0.047455f, 0.051727f, 0.056030f, - 0.061218f, 0.066284f, 0.072571f, 0.079041f, 0.086121f, 0.094299f, 0.102844f, 0.112305f, - 0.122925f, 0.134033f, 0.145752f, 0.158569f, 0.172729f, 0.187378f, 0.203003f, 0.219238f, - 0.237671f, 0.255859f, 0.624023f, 0.657227f, 0.664062f, 0.666992f, 0.668457f, 0.668457f, - 0.000379f, 0.001404f, 0.001893f, 0.002403f, 0.002840f, 0.003458f, 0.004021f, 0.004459f, - 0.004894f, 0.005527f, 0.005844f, 0.006256f, 0.006866f, 0.007423f, 0.007957f, 0.008476f, - 0.009155f, 0.009735f, 0.010422f, 0.011078f, 0.011925f, 0.012787f, 0.013458f, 0.014526f, - 0.015541f, 0.016632f, 0.017838f, 0.019028f, 0.020248f, 0.021851f, 0.023514f, 0.024979f, - 0.027054f, 0.029236f, 0.031555f, 0.034180f, 0.036713f, 0.040375f, 0.043854f, 0.047607f, - 0.051727f, 0.056549f, 0.061768f, 0.067627f, 0.073792f, 0.081116f, 0.089111f, 0.097595f, - 0.107056f, 0.117371f, 0.128906f, 0.141113f, 0.154053f, 0.168579f, 0.183960f, 0.199585f, - 0.216309f, 0.235352f, 0.612793f, 0.647949f, 0.652832f, 0.656250f, 0.658691f, 0.658203f, - 0.000506f, 0.001164f, 0.001575f, 0.002136f, 0.002600f, 0.003054f, 0.003405f, 0.003735f, - 0.004364f, 0.004681f, 0.004944f, 0.005569f, 0.005810f, 0.006187f, 0.006813f, 0.007233f, - 0.007881f, 0.008217f, 0.008850f, 0.009293f, 0.010109f, 0.010788f, 0.011543f, 0.012161f, - 0.012993f, 0.013931f, 0.014809f, 0.015945f, 0.016983f, 0.018234f, 0.019440f, 0.020813f, - 0.022491f, 0.024261f, 0.026169f, 0.028458f, 0.030701f, 0.033295f, 0.036560f, 0.039520f, - 0.043121f, 0.047333f, 0.052032f, 0.056885f, 0.062561f, 0.068909f, 0.076111f, 0.083496f, - 0.092407f, 0.101929f, 0.112671f, 0.124451f, 0.136719f, 0.150146f, 0.165039f, 0.180786f, - 0.197510f, 0.215210f, 0.597656f, 0.636230f, 0.642578f, 0.647461f, 0.647949f, 0.649902f, - 0.000344f, 0.001057f, 0.001456f, 0.001907f, 0.002377f, 0.002735f, 0.002983f, 0.003359f, - 0.003651f, 0.003960f, 0.004311f, 0.004471f, 0.005009f, 0.005283f, 0.005653f, 0.006145f, - 0.006592f, 0.006889f, 0.007469f, 0.007889f, 0.008423f, 0.008911f, 0.009567f, 0.010124f, - 0.010788f, 0.011574f, 0.012466f, 0.013123f, 0.014053f, 0.015091f, 0.016159f, 0.017288f, - 0.018539f, 0.020111f, 0.021698f, 0.023285f, 0.025024f, 0.027405f, 0.029800f, 0.032501f, - 0.035583f, 0.039001f, 0.042908f, 0.047302f, 0.052185f, 0.057465f, 0.063843f, 0.070984f, - 0.078857f, 0.087463f, 0.097168f, 0.108215f, 0.120117f, 0.132812f, 0.146851f, 0.161865f, - 0.177856f, 0.195557f, 0.585449f, 0.624023f, 0.633301f, 0.636230f, 0.637695f, 0.638672f, - 0.000516f, 0.000847f, 0.001210f, 0.001663f, 0.002012f, 0.002218f, 0.002424f, 0.002861f, - 0.002947f, 0.003275f, 0.003469f, 0.003819f, 0.004169f, 0.004337f, 0.004658f, 0.005169f, - 0.005424f, 0.005795f, 0.006138f, 0.006500f, 0.007057f, 0.007458f, 0.007874f, 0.008369f, - 0.008888f, 0.009583f, 0.010147f, 0.010864f, 0.011589f, 0.012428f, 0.013161f, 0.013931f, - 0.015076f, 0.016266f, 0.017456f, 0.018845f, 0.020432f, 0.022232f, 0.024094f, 0.026459f, - 0.028809f, 0.031586f, 0.034973f, 0.038513f, 0.042755f, 0.047485f, 0.052643f, 0.058929f, - 0.065796f, 0.073792f, 0.082581f, 0.092407f, 0.103516f, 0.115723f, 0.128906f, 0.142944f, - 0.158813f, 0.175781f, 0.572266f, 0.613770f, 0.621094f, 0.625977f, 0.626953f, 0.628418f, - 0.000262f, 0.000864f, 0.001096f, 0.001409f, 0.001576f, 0.001852f, 0.002047f, 0.002247f, - 0.002518f, 0.002741f, 0.002956f, 0.003157f, 0.003359f, 0.003597f, 0.003872f, 0.004230f, - 0.004406f, 0.004772f, 0.005035f, 0.005379f, 0.005695f, 0.006153f, 0.006485f, 0.006935f, - 0.007275f, 0.007801f, 0.008301f, 0.008789f, 0.009300f, 0.009949f, 0.010727f, 0.011482f, - 0.012245f, 0.013145f, 0.014236f, 0.015236f, 0.016525f, 0.017838f, 0.019348f, 0.021088f, - 0.023010f, 0.025253f, 0.027878f, 0.031128f, 0.034149f, 0.038269f, 0.042694f, 0.047852f, - 0.053833f, 0.060852f, 0.068665f, 0.077698f, 0.087891f, 0.099182f, 0.111633f, 0.125732f, - 0.140381f, 0.157227f, 0.558105f, 0.601562f, 0.610840f, 0.614746f, 0.617188f, 0.619141f, - 0.000270f, 0.000683f, 0.000851f, 0.001138f, 0.001346f, 0.001561f, 0.001701f, 0.001884f, - 0.001984f, 0.002193f, 0.002455f, 0.002609f, 0.002743f, 0.002993f, 0.003159f, 0.003361f, - 0.003593f, 0.003883f, 0.004044f, 0.004360f, 0.004532f, 0.004971f, 0.005169f, 0.005573f, - 0.005863f, 0.006252f, 0.006653f, 0.007095f, 0.007572f, 0.008110f, 0.008713f, 0.009056f, - 0.009827f, 0.010574f, 0.011307f, 0.012070f, 0.013069f, 0.014122f, 0.015297f, 0.016678f, - 0.018234f, 0.019775f, 0.021835f, 0.024216f, 0.026917f, 0.030151f, 0.033875f, 0.038147f, - 0.043121f, 0.049408f, 0.056091f, 0.064026f, 0.073059f, 0.083801f, 0.095276f, 0.108459f, - 0.122803f, 0.138794f, 0.545410f, 0.590332f, 0.599609f, 0.603516f, 0.606445f, 0.607422f, - 0.000190f, 0.000607f, 0.000724f, 0.000989f, 0.001171f, 0.001265f, 0.001416f, 0.001602f, - 0.001666f, 0.001761f, 0.001893f, 0.002102f, 0.002199f, 0.002413f, 0.002537f, 0.002743f, - 0.002850f, 0.003027f, 0.003258f, 0.003494f, 0.003729f, 0.003937f, 0.004204f, 0.004410f, - 0.004616f, 0.004921f, 0.005192f, 0.005604f, 0.005936f, 0.006298f, 0.006836f, 0.007233f, - 0.007694f, 0.008224f, 0.008827f, 0.009506f, 0.010262f, 0.011055f, 0.011978f, 0.012955f, - 0.014099f, 0.015434f, 0.017029f, 0.018677f, 0.020813f, 0.023193f, 0.026169f, 0.029541f, - 0.033783f, 0.038513f, 0.044403f, 0.051208f, 0.059387f, 0.068665f, 0.079468f, 0.091858f, - 0.105774f, 0.120728f, 0.530762f, 0.578125f, 0.588379f, 0.592773f, 0.595215f, 0.597168f, - 0.000151f, 0.000443f, 0.000673f, 0.000793f, 0.000937f, 0.000987f, 0.001092f, 0.001192f, - 0.001324f, 0.001460f, 0.001495f, 0.001565f, 0.001778f, 0.001944f, 0.002054f, 0.002096f, - 0.002254f, 0.002338f, 0.002594f, 0.002737f, 0.002886f, 0.003048f, 0.003294f, 0.003460f, - 0.003679f, 0.003868f, 0.004086f, 0.004322f, 0.004642f, 0.004894f, 0.005199f, 0.005554f, - 0.006035f, 0.006451f, 0.006836f, 0.007359f, 0.007820f, 0.008461f, 0.009163f, 0.009956f, - 0.010803f, 0.011871f, 0.012917f, 0.014343f, 0.015900f, 0.017670f, 0.019791f, 0.022400f, - 0.025589f, 0.029404f, 0.034210f, 0.039948f, 0.046936f, 0.055298f, 0.064941f, 0.076172f, - 0.089172f, 0.103821f, 0.517090f, 0.565918f, 0.576172f, 0.582031f, 0.584961f, 0.586426f, - 0.000203f, 0.000287f, 0.000531f, 0.000688f, 0.000738f, 0.000820f, 0.000915f, 0.000875f, - 0.001036f, 0.001117f, 0.001215f, 0.001317f, 0.001374f, 0.001476f, 0.001524f, 0.001682f, - 0.001726f, 0.001867f, 0.002014f, 0.002056f, 0.002209f, 0.002365f, 0.002495f, 0.002663f, - 0.002775f, 0.002953f, 0.003134f, 0.003325f, 0.003567f, 0.003736f, 0.004070f, 0.004261f, - 0.004494f, 0.004845f, 0.005116f, 0.005459f, 0.005928f, 0.006329f, 0.006863f, 0.007458f, - 0.008087f, 0.008873f, 0.009689f, 0.010651f, 0.011826f, 0.013130f, 0.014732f, 0.016617f, - 0.018890f, 0.021912f, 0.025482f, 0.029938f, 0.035736f, 0.042847f, 0.051453f, 0.061615f, - 0.074158f, 0.087952f, 0.504395f, 0.554199f, 0.565918f, 0.569336f, 0.573242f, 0.574219f, - 0.000215f, 0.000259f, 0.000423f, 0.000534f, 0.000499f, 0.000649f, 0.000622f, 0.000690f, - 0.000717f, 0.000817f, 0.000937f, 0.000984f, 0.001045f, 0.001148f, 0.001182f, 0.001211f, - 0.001339f, 0.001406f, 0.001463f, 0.001590f, 0.001666f, 0.001759f, 0.001867f, 0.001949f, - 0.002064f, 0.002176f, 0.002342f, 0.002453f, 0.002619f, 0.002871f, 0.003033f, 0.003101f, - 0.003389f, 0.003620f, 0.003794f, 0.004059f, 0.004368f, 0.004681f, 0.005035f, 0.005466f, - 0.005917f, 0.006405f, 0.007092f, 0.007744f, 0.008591f, 0.009506f, 0.010567f, 0.011993f, - 0.013710f, 0.015762f, 0.018326f, 0.021759f, 0.026077f, 0.031891f, 0.039124f, 0.048462f, - 0.059570f, 0.072571f, 0.489258f, 0.542480f, 0.553223f, 0.558594f, 0.562012f, 0.563965f, - 0.000067f, 0.000253f, 0.000305f, 0.000367f, 0.000422f, 0.000431f, 0.000530f, 0.000466f, - 0.000565f, 0.000590f, 0.000702f, 0.000690f, 0.000746f, 0.000795f, 0.000859f, 0.000897f, - 0.000962f, 0.001021f, 0.001069f, 0.001105f, 0.001207f, 0.001257f, 0.001354f, 0.001424f, - 0.001483f, 0.001570f, 0.001687f, 0.001750f, 0.001857f, 0.001982f, 0.002071f, 0.002281f, - 0.002361f, 0.002527f, 0.002684f, 0.002846f, 0.003092f, 0.003342f, 0.003622f, 0.003866f, - 0.004173f, 0.004520f, 0.004955f, 0.005428f, 0.006023f, 0.006687f, 0.007481f, 0.008446f, - 0.009628f, 0.011047f, 0.012840f, 0.015205f, 0.018326f, 0.022629f, 0.028442f, 0.036102f, - 0.046051f, 0.058197f, 0.476318f, 0.529785f, 0.541992f, 0.547852f, 0.550293f, 0.553223f, - 0.000000f, 0.000118f, 0.000216f, 0.000288f, 0.000272f, 0.000350f, 0.000312f, 0.000374f, - 0.000395f, 0.000470f, 0.000488f, 0.000477f, 0.000495f, 0.000548f, 0.000573f, 0.000646f, - 0.000636f, 0.000714f, 0.000763f, 0.000803f, 0.000852f, 0.000897f, 0.000930f, 0.000985f, - 0.001056f, 0.001089f, 0.001163f, 0.001210f, 0.001281f, 0.001432f, 0.001431f, 0.001548f, - 0.001622f, 0.001743f, 0.001869f, 0.001991f, 0.002104f, 0.002262f, 0.002428f, 0.002632f, - 0.002815f, 0.003077f, 0.003344f, 0.003656f, 0.004002f, 0.004478f, 0.004974f, 0.005627f, - 0.006435f, 0.007481f, 0.008713f, 0.010307f, 0.012291f, 0.015289f, 0.019409f, 0.025497f, - 0.033966f, 0.045013f, 0.461914f, 0.517090f, 0.529297f, 0.536133f, 0.539551f, 0.541504f, - 0.000073f, 0.000175f, 0.000165f, 0.000149f, 0.000200f, 0.000208f, 0.000215f, 0.000260f, - 0.000268f, 0.000277f, 0.000292f, 0.000341f, 0.000334f, 0.000370f, 0.000413f, 0.000424f, - 0.000449f, 0.000474f, 0.000488f, 0.000507f, 0.000555f, 0.000574f, 0.000616f, 0.000652f, - 0.000696f, 0.000746f, 0.000780f, 0.000804f, 0.000849f, 0.000888f, 0.000949f, 0.001011f, - 0.001075f, 0.001151f, 0.001225f, 0.001266f, 0.001385f, 0.001466f, 0.001596f, 0.001699f, - 0.001808f, 0.001980f, 0.002157f, 0.002329f, 0.002544f, 0.002850f, 0.003178f, 0.003593f, - 0.004047f, 0.004658f, 0.005508f, 0.006565f, 0.007935f, 0.009819f, 0.012527f, 0.016647f, - 0.023514f, 0.033173f, 0.447510f, 0.503906f, 0.517578f, 0.523926f, 0.527344f, 0.529297f, - 0.000000f, 0.000106f, 0.000097f, 0.000099f, 0.000136f, 0.000157f, 0.000129f, 0.000162f, - 0.000167f, 0.000172f, 0.000180f, 0.000186f, 0.000209f, 0.000227f, 0.000232f, 0.000248f, - 0.000260f, 0.000291f, 0.000300f, 0.000327f, 0.000335f, 0.000343f, 0.000363f, 0.000395f, - 0.000428f, 0.000459f, 0.000458f, 0.000477f, 0.000515f, 0.000549f, 0.000578f, 0.000621f, - 0.000659f, 0.000683f, 0.000741f, 0.000767f, 0.000818f, 0.000877f, 0.000952f, 0.001010f, - 0.001085f, 0.001177f, 0.001275f, 0.001406f, 0.001516f, 0.001664f, 0.001884f, 0.002096f, - 0.002415f, 0.002745f, 0.003231f, 0.003843f, 0.004715f, 0.005936f, 0.007629f, 0.010139f, - 0.014763f, 0.022812f, 0.433350f, 0.491455f, 0.506348f, 0.511719f, 0.515625f, 0.518066f, - 0.000104f, 0.000080f, 0.000069f, 0.000062f, 0.000074f, 0.000074f, 0.000089f, 0.000097f, - 0.000099f, 0.000102f, 0.000105f, 0.000126f, 0.000106f, 0.000119f, 0.000139f, 0.000135f, - 0.000154f, 0.000164f, 0.000166f, 0.000175f, 0.000188f, 0.000194f, 0.000211f, 0.000220f, - 0.000252f, 0.000248f, 0.000260f, 0.000272f, 0.000293f, 0.000301f, 0.000328f, 0.000347f, - 0.000365f, 0.000371f, 0.000401f, 0.000422f, 0.000447f, 0.000489f, 0.000524f, 0.000553f, - 0.000588f, 0.000635f, 0.000701f, 0.000751f, 0.000816f, 0.000897f, 0.000997f, 0.001109f, - 0.001265f, 0.001460f, 0.001686f, 0.002035f, 0.002457f, 0.003130f, 0.004124f, 0.005676f, - 0.008263f, 0.014114f, 0.418945f, 0.479492f, 0.493652f, 0.500000f, 0.503418f, 0.506836f, - 0.000089f, 0.000065f, 0.000056f, 0.000050f, 0.000045f, 0.000042f, 0.000046f, 0.000042f, - 0.000043f, 0.000055f, 0.000046f, 0.000049f, 0.000065f, 0.000055f, 0.000057f, 0.000063f, - 0.000075f, 0.000080f, 0.000078f, 0.000084f, 0.000085f, 0.000092f, 0.000097f, 0.000102f, - 0.000108f, 0.000117f, 0.000118f, 0.000138f, 0.000135f, 0.000142f, 0.000151f, 0.000160f, - 0.000172f, 0.000180f, 0.000195f, 0.000197f, 0.000210f, 0.000230f, 0.000244f, 0.000266f, - 0.000279f, 0.000299f, 0.000324f, 0.000352f, 0.000383f, 0.000414f, 0.000457f, 0.000509f, - 0.000575f, 0.000650f, 0.000756f, 0.000904f, 0.001103f, 0.001410f, 0.001880f, 0.002668f, - 0.004112f, 0.007290f, 0.404541f, 0.466309f, 0.481201f, 0.488037f, 0.492432f, 0.495361f, - 0.000066f, 0.000046f, 0.000038f, 0.000034f, 0.000031f, 0.000029f, 0.000027f, 0.000026f, - 0.000025f, 0.000023f, 0.000022f, 0.000024f, 0.000020f, 0.000021f, 0.000021f, 0.000026f, - 0.000024f, 0.000028f, 0.000031f, 0.000032f, 0.000032f, 0.000035f, 0.000040f, 0.000038f, - 0.000041f, 0.000047f, 0.000049f, 0.000043f, 0.000050f, 0.000052f, 0.000056f, 0.000059f, - 0.000066f, 0.000062f, 0.000067f, 0.000071f, 0.000082f, 0.000083f, 0.000089f, 0.000098f, - 0.000104f, 0.000107f, 0.000116f, 0.000125f, 0.000141f, 0.000149f, 0.000160f, 0.000183f, - 0.000207f, 0.000228f, 0.000264f, 0.000311f, 0.000376f, 0.000469f, 0.000646f, 0.000937f, - 0.001554f, 0.002983f, 0.390381f, 0.454346f, 0.469727f, 0.476318f, 0.480713f, 0.484131f, - 0.000028f, 0.000019f, 0.000015f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, - 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f, - 0.000008f, 0.000009f, 0.000009f, 0.000010f, 0.000010f, 0.000011f, 0.000012f, 0.000011f, - 0.000014f, 0.000015f, 0.000016f, 0.000016f, 0.000018f, 0.000019f, 0.000019f, 0.000022f, - 0.000023f, 0.000024f, 0.000026f, 0.000028f, 0.000029f, 0.000032f, 0.000037f, 0.000037f, - 0.000042f, 0.000048f, 0.000056f, 0.000066f, 0.000077f, 0.000091f, 0.000124f, 0.000183f, - 0.000318f, 0.000779f, 0.376465f, 0.441406f, 0.457275f, 0.464600f, 0.468994f, 0.471924f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, - 0.000010f, 0.000027f, 0.363037f, 0.428223f, 0.444580f, 0.452881f, 0.457031f, 0.459961f, - }, - { - 0.014420f, 0.043488f, 0.072388f, 0.100830f, 0.129150f, 0.156494f, 0.183350f, 0.210327f, - 0.235352f, 0.260986f, 0.285645f, 0.309082f, 0.332764f, 0.355713f, 0.377441f, 0.399658f, - 0.420898f, 0.441650f, 0.461914f, 0.481445f, 0.500977f, 0.520508f, 0.538574f, 0.556641f, - 0.574707f, 0.591797f, 0.608398f, 0.624512f, 0.641602f, 0.657227f, 0.672363f, 0.687500f, - 0.702148f, 0.717285f, 0.730957f, 0.745117f, 0.758789f, 0.772461f, 0.783203f, 0.797363f, - 0.810547f, 0.822266f, 0.833984f, 0.845703f, 0.857422f, 0.868652f, 0.879395f, 0.890625f, - 0.901367f, 0.911621f, 0.921875f, 0.932129f, 0.941895f, 0.951660f, 0.960938f, 0.970215f, - 0.979492f, 0.987793f, 0.981934f, 0.957031f, 0.938965f, 0.923340f, 0.909668f, 0.897461f, - 0.013199f, 0.039978f, 0.066284f, 0.093445f, 0.119324f, 0.145386f, 0.170410f, 0.195801f, - 0.220581f, 0.244019f, 0.268066f, 0.291260f, 0.314453f, 0.335938f, 0.358154f, 0.379639f, - 0.399902f, 0.420898f, 0.441406f, 0.460938f, 0.480225f, 0.498291f, 0.516602f, 0.535156f, - 0.553223f, 0.570312f, 0.587891f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.667480f, - 0.682617f, 0.696777f, 0.711914f, 0.726074f, 0.739746f, 0.753418f, 0.766602f, 0.779785f, - 0.791992f, 0.804688f, 0.817871f, 0.829102f, 0.841309f, 0.852539f, 0.864258f, 0.875488f, - 0.886230f, 0.896973f, 0.907227f, 0.917969f, 0.928223f, 0.937500f, 0.947266f, 0.957520f, - 0.966797f, 0.975586f, 0.976562f, 0.952637f, 0.935547f, 0.920898f, 0.907715f, 0.895996f, - 0.011932f, 0.036499f, 0.061554f, 0.085999f, 0.110962f, 0.135010f, 0.158813f, 0.182373f, - 0.206421f, 0.229004f, 0.251221f, 0.274170f, 0.295654f, 0.317871f, 0.339111f, 0.360107f, - 0.379395f, 0.399414f, 0.420654f, 0.440430f, 0.458252f, 0.477295f, 0.496094f, 0.513672f, - 0.531738f, 0.549805f, 0.566406f, 0.583984f, 0.599121f, 0.616211f, 0.631348f, 0.647461f, - 0.662598f, 0.677734f, 0.692383f, 0.705566f, 0.720703f, 0.734863f, 0.748047f, 0.761230f, - 0.774414f, 0.787598f, 0.799805f, 0.812500f, 0.824707f, 0.837402f, 0.848633f, 0.859375f, - 0.871094f, 0.882324f, 0.892578f, 0.904297f, 0.913574f, 0.924316f, 0.934570f, 0.943848f, - 0.954102f, 0.963867f, 0.970703f, 0.948242f, 0.931641f, 0.917480f, 0.905273f, 0.894043f, - 0.011070f, 0.033478f, 0.056396f, 0.079529f, 0.101990f, 0.125244f, 0.147705f, 0.170410f, - 0.192139f, 0.214111f, 0.235596f, 0.257812f, 0.279053f, 0.300293f, 0.320557f, 0.340576f, - 0.360596f, 0.381104f, 0.400635f, 0.420166f, 0.438965f, 0.458008f, 0.476562f, 0.493652f, - 0.511230f, 0.527832f, 0.545898f, 0.562012f, 0.579102f, 0.595703f, 0.610840f, 0.627930f, - 0.642578f, 0.657227f, 0.672363f, 0.686523f, 0.701660f, 0.715332f, 0.729492f, 0.742676f, - 0.756348f, 0.769531f, 0.782227f, 0.795898f, 0.807617f, 0.820312f, 0.832031f, 0.843262f, - 0.855469f, 0.866699f, 0.877441f, 0.889648f, 0.899414f, 0.910156f, 0.920410f, 0.930664f, - 0.940430f, 0.950684f, 0.964844f, 0.943848f, 0.927734f, 0.914551f, 0.902344f, 0.891602f, - 0.010010f, 0.031067f, 0.051880f, 0.073303f, 0.094421f, 0.116577f, 0.136963f, 0.157959f, - 0.180542f, 0.200684f, 0.221436f, 0.242676f, 0.262939f, 0.283447f, 0.303467f, 0.323242f, - 0.342529f, 0.362305f, 0.381348f, 0.399414f, 0.418701f, 0.437256f, 0.455322f, 0.472412f, - 0.490479f, 0.507812f, 0.524902f, 0.541992f, 0.558105f, 0.574219f, 0.591309f, 0.606445f, - 0.622070f, 0.637695f, 0.652344f, 0.666504f, 0.683594f, 0.695801f, 0.710449f, 0.724121f, - 0.737305f, 0.751465f, 0.765137f, 0.777344f, 0.790039f, 0.802734f, 0.814941f, 0.827637f, - 0.839355f, 0.851074f, 0.862305f, 0.874512f, 0.885254f, 0.895996f, 0.906738f, 0.917480f, - 0.927246f, 0.937988f, 0.958984f, 0.939453f, 0.923828f, 0.911133f, 0.899414f, 0.889160f, - 0.009491f, 0.028305f, 0.047699f, 0.067810f, 0.087341f, 0.107849f, 0.127686f, 0.147827f, - 0.167725f, 0.187744f, 0.207886f, 0.227051f, 0.247314f, 0.266846f, 0.286377f, 0.305908f, - 0.324463f, 0.343262f, 0.361572f, 0.380371f, 0.399658f, 0.416748f, 0.435547f, 0.452881f, - 0.470703f, 0.488281f, 0.503906f, 0.522461f, 0.538086f, 0.554199f, 0.571289f, 0.586914f, - 0.602051f, 0.617676f, 0.633789f, 0.647949f, 0.663086f, 0.677246f, 0.692871f, 0.705078f, - 0.718750f, 0.732910f, 0.746582f, 0.759766f, 0.773438f, 0.785645f, 0.798340f, 0.811035f, - 0.823242f, 0.834961f, 0.847168f, 0.859863f, 0.870117f, 0.881348f, 0.893066f, 0.903320f, - 0.914551f, 0.924316f, 0.953125f, 0.934082f, 0.919434f, 0.906738f, 0.896484f, 0.885742f, - 0.008598f, 0.026245f, 0.044495f, 0.062622f, 0.081177f, 0.100098f, 0.119019f, 0.137817f, - 0.156616f, 0.175903f, 0.194946f, 0.213745f, 0.232788f, 0.251221f, 0.269775f, 0.288330f, - 0.307129f, 0.325928f, 0.344238f, 0.362305f, 0.380371f, 0.397705f, 0.415771f, 0.433105f, - 0.450928f, 0.468262f, 0.484863f, 0.501953f, 0.518555f, 0.534668f, 0.550293f, 0.566406f, - 0.582520f, 0.598145f, 0.612305f, 0.627930f, 0.643555f, 0.657715f, 0.672852f, 0.687500f, - 0.700684f, 0.715332f, 0.728516f, 0.742188f, 0.755371f, 0.769531f, 0.781738f, 0.794434f, - 0.807129f, 0.818359f, 0.831543f, 0.843262f, 0.855469f, 0.865723f, 0.877930f, 0.889160f, - 0.900391f, 0.911621f, 0.946777f, 0.929199f, 0.915039f, 0.903320f, 0.892578f, 0.883301f, - 0.007896f, 0.024490f, 0.041138f, 0.057892f, 0.075439f, 0.092712f, 0.110229f, 0.128296f, - 0.146118f, 0.164429f, 0.181885f, 0.200562f, 0.218628f, 0.236572f, 0.255127f, 0.272949f, - 0.291016f, 0.308594f, 0.326172f, 0.343994f, 0.361816f, 0.380127f, 0.396973f, 0.414551f, - 0.430908f, 0.447998f, 0.465576f, 0.481445f, 0.497559f, 0.514160f, 0.529785f, 0.546387f, - 0.562988f, 0.578613f, 0.593262f, 0.609375f, 0.623047f, 0.638672f, 0.653809f, 0.667480f, - 0.681641f, 0.697266f, 0.710938f, 0.724121f, 0.737305f, 0.752441f, 0.765625f, 0.776367f, - 0.790527f, 0.803223f, 0.815918f, 0.827637f, 0.839844f, 0.851562f, 0.863281f, 0.875000f, - 0.886719f, 0.898926f, 0.940430f, 0.923828f, 0.910645f, 0.899414f, 0.889160f, 0.879883f, - 0.007320f, 0.022369f, 0.038055f, 0.053925f, 0.070190f, 0.086609f, 0.103027f, 0.119568f, - 0.136475f, 0.153320f, 0.170532f, 0.187988f, 0.204834f, 0.223022f, 0.240112f, 0.257324f, - 0.275391f, 0.291504f, 0.308838f, 0.326904f, 0.344727f, 0.361572f, 0.378662f, 0.395020f, - 0.411865f, 0.428711f, 0.445068f, 0.462646f, 0.478271f, 0.494141f, 0.510254f, 0.525879f, - 0.542480f, 0.557129f, 0.573242f, 0.588867f, 0.603516f, 0.618164f, 0.633789f, 0.648438f, - 0.663086f, 0.678223f, 0.691895f, 0.706543f, 0.720215f, 0.733398f, 0.746582f, 0.759766f, - 0.774414f, 0.786621f, 0.799805f, 0.811523f, 0.823730f, 0.836914f, 0.848145f, 0.860840f, - 0.872070f, 0.884277f, 0.933594f, 0.918945f, 0.906250f, 0.895020f, 0.885254f, 0.876953f, - 0.006760f, 0.021011f, 0.034973f, 0.050049f, 0.065369f, 0.080261f, 0.095337f, 0.111633f, - 0.127319f, 0.142822f, 0.159668f, 0.176514f, 0.192383f, 0.209106f, 0.225586f, 0.242554f, - 0.259277f, 0.275635f, 0.292480f, 0.309326f, 0.326904f, 0.343750f, 0.359619f, 0.376465f, - 0.393066f, 0.409424f, 0.426514f, 0.442871f, 0.458252f, 0.475586f, 0.490967f, 0.505859f, - 0.522461f, 0.539062f, 0.554199f, 0.569336f, 0.583984f, 0.600586f, 0.614258f, 0.630371f, - 0.643555f, 0.658691f, 0.673340f, 0.687500f, 0.702148f, 0.715332f, 0.729980f, 0.743652f, - 0.756348f, 0.770020f, 0.782715f, 0.796387f, 0.808105f, 0.820801f, 0.833008f, 0.846680f, - 0.857910f, 0.870117f, 0.927246f, 0.913574f, 0.901367f, 0.891113f, 0.881348f, 0.873047f, - 0.006367f, 0.019165f, 0.032379f, 0.046295f, 0.060089f, 0.074463f, 0.088867f, 0.103821f, - 0.118835f, 0.133911f, 0.149048f, 0.164673f, 0.180298f, 0.196289f, 0.212524f, 0.228516f, - 0.244385f, 0.260742f, 0.277344f, 0.293213f, 0.309570f, 0.326416f, 0.342773f, 0.358887f, - 0.374512f, 0.391113f, 0.406982f, 0.423340f, 0.439453f, 0.455078f, 0.470947f, 0.487793f, - 0.502441f, 0.519043f, 0.533691f, 0.550293f, 0.564941f, 0.580078f, 0.595703f, 0.610840f, - 0.625488f, 0.640137f, 0.654785f, 0.669434f, 0.683594f, 0.696777f, 0.710938f, 0.725586f, - 0.738770f, 0.752441f, 0.766113f, 0.778320f, 0.791016f, 0.805176f, 0.818359f, 0.830566f, - 0.842773f, 0.854980f, 0.920410f, 0.908203f, 0.896484f, 0.886230f, 0.877441f, 0.868652f, - 0.005981f, 0.017914f, 0.030350f, 0.042908f, 0.056213f, 0.069092f, 0.083008f, 0.096619f, - 0.111084f, 0.124634f, 0.139526f, 0.154297f, 0.169312f, 0.184570f, 0.199951f, 0.215454f, - 0.230713f, 0.245728f, 0.261963f, 0.277588f, 0.293213f, 0.309326f, 0.325195f, 0.340820f, - 0.356934f, 0.373047f, 0.388916f, 0.404785f, 0.420410f, 0.436279f, 0.452148f, 0.468506f, - 0.483154f, 0.499756f, 0.515137f, 0.530762f, 0.545898f, 0.560059f, 0.576172f, 0.590820f, - 0.606445f, 0.621094f, 0.635254f, 0.649902f, 0.663574f, 0.678223f, 0.692383f, 0.706543f, - 0.720703f, 0.733887f, 0.748535f, 0.762695f, 0.775391f, 0.789551f, 0.801758f, 0.814941f, - 0.828125f, 0.840332f, 0.913574f, 0.902344f, 0.890625f, 0.881836f, 0.872559f, 0.865234f, - 0.005402f, 0.016617f, 0.028061f, 0.039948f, 0.051758f, 0.064270f, 0.076782f, 0.089600f, - 0.102600f, 0.116455f, 0.130371f, 0.144165f, 0.158936f, 0.172607f, 0.187744f, 0.201904f, - 0.216431f, 0.232422f, 0.247192f, 0.261719f, 0.277100f, 0.292480f, 0.308838f, 0.323975f, - 0.339355f, 0.355469f, 0.371338f, 0.386230f, 0.402344f, 0.417725f, 0.433350f, 0.448486f, - 0.464600f, 0.480225f, 0.495361f, 0.510742f, 0.525879f, 0.541992f, 0.557129f, 0.571777f, - 0.586914f, 0.601562f, 0.616211f, 0.631836f, 0.645508f, 0.661621f, 0.674805f, 0.688965f, - 0.703125f, 0.717773f, 0.731934f, 0.745605f, 0.757812f, 0.772949f, 0.785156f, 0.799316f, - 0.812012f, 0.826172f, 0.906738f, 0.896484f, 0.886230f, 0.876465f, 0.868164f, 0.860840f, - 0.005264f, 0.015457f, 0.026474f, 0.037170f, 0.048157f, 0.059845f, 0.071594f, 0.083984f, - 0.096191f, 0.109070f, 0.121887f, 0.134766f, 0.148193f, 0.161255f, 0.175781f, 0.189209f, - 0.203369f, 0.218384f, 0.233032f, 0.247681f, 0.261963f, 0.277100f, 0.292480f, 0.307129f, - 0.322998f, 0.337891f, 0.352539f, 0.368652f, 0.384033f, 0.399170f, 0.414307f, 0.430420f, - 0.445801f, 0.460693f, 0.475342f, 0.491211f, 0.506836f, 0.521973f, 0.537598f, 0.551758f, - 0.567383f, 0.582520f, 0.598145f, 0.612305f, 0.627441f, 0.642090f, 0.656738f, 0.670898f, - 0.685059f, 0.698730f, 0.713867f, 0.728516f, 0.742188f, 0.755371f, 0.770020f, 0.782715f, - 0.796387f, 0.810547f, 0.899414f, 0.889648f, 0.879883f, 0.872070f, 0.863770f, 0.856445f, - 0.004719f, 0.014229f, 0.024384f, 0.034607f, 0.044708f, 0.055756f, 0.066895f, 0.077942f, - 0.089600f, 0.101624f, 0.113525f, 0.125854f, 0.138428f, 0.151245f, 0.164673f, 0.177734f, - 0.191650f, 0.205078f, 0.219360f, 0.233154f, 0.247925f, 0.261475f, 0.276367f, 0.291504f, - 0.305908f, 0.320312f, 0.335449f, 0.350098f, 0.365723f, 0.380615f, 0.395996f, 0.411133f, - 0.427002f, 0.441895f, 0.456543f, 0.472656f, 0.487793f, 0.502441f, 0.518555f, 0.533203f, - 0.547852f, 0.562988f, 0.577637f, 0.593262f, 0.607910f, 0.623535f, 0.638184f, 0.652344f, - 0.666992f, 0.681641f, 0.696777f, 0.711426f, 0.725098f, 0.738281f, 0.753418f, 0.766113f, - 0.782227f, 0.794922f, 0.892090f, 0.884277f, 0.875000f, 0.866699f, 0.858887f, 0.852539f, - 0.004280f, 0.013329f, 0.022476f, 0.031982f, 0.042114f, 0.051849f, 0.062225f, 0.072449f, - 0.083679f, 0.095032f, 0.105530f, 0.117676f, 0.129517f, 0.141357f, 0.154297f, 0.166748f, - 0.178711f, 0.192505f, 0.205933f, 0.219727f, 0.233521f, 0.247070f, 0.260986f, 0.275391f, - 0.290039f, 0.303955f, 0.319580f, 0.333740f, 0.347412f, 0.363037f, 0.377686f, 0.392822f, - 0.408203f, 0.422852f, 0.437988f, 0.453125f, 0.468506f, 0.483398f, 0.498779f, 0.514160f, - 0.527832f, 0.543945f, 0.559570f, 0.574707f, 0.588867f, 0.604492f, 0.619141f, 0.634277f, - 0.648438f, 0.663086f, 0.678223f, 0.692383f, 0.707520f, 0.721680f, 0.735352f, 0.749512f, - 0.764648f, 0.778320f, 0.884277f, 0.877441f, 0.868652f, 0.861328f, 0.854492f, 0.847656f, - 0.004280f, 0.012138f, 0.021103f, 0.029999f, 0.038940f, 0.048279f, 0.057831f, 0.067566f, - 0.077454f, 0.087524f, 0.098816f, 0.109558f, 0.120728f, 0.131958f, 0.143799f, 0.155762f, - 0.168091f, 0.180176f, 0.193359f, 0.206177f, 0.219360f, 0.232910f, 0.246338f, 0.260254f, - 0.273682f, 0.287598f, 0.302246f, 0.316650f, 0.331299f, 0.344971f, 0.359863f, 0.374268f, - 0.389648f, 0.404297f, 0.419434f, 0.434326f, 0.449463f, 0.464844f, 0.479492f, 0.494141f, - 0.509766f, 0.524414f, 0.540039f, 0.555176f, 0.569824f, 0.584961f, 0.600098f, 0.615723f, - 0.629883f, 0.645508f, 0.659668f, 0.675293f, 0.689453f, 0.704590f, 0.719238f, 0.732422f, - 0.748535f, 0.762207f, 0.876953f, 0.871582f, 0.863281f, 0.855957f, 0.849609f, 0.842773f, - 0.003744f, 0.011436f, 0.019348f, 0.027893f, 0.036102f, 0.044739f, 0.053711f, 0.063110f, - 0.072205f, 0.081970f, 0.091919f, 0.101746f, 0.112732f, 0.122864f, 0.134521f, 0.145996f, - 0.157715f, 0.169434f, 0.181519f, 0.193848f, 0.206665f, 0.219360f, 0.231445f, 0.245361f, - 0.259033f, 0.272217f, 0.286621f, 0.299805f, 0.314209f, 0.328125f, 0.342285f, 0.357178f, - 0.371826f, 0.386475f, 0.400635f, 0.415527f, 0.430420f, 0.445068f, 0.459717f, 0.476074f, - 0.490234f, 0.505371f, 0.521484f, 0.536133f, 0.551758f, 0.565430f, 0.581543f, 0.595703f, - 0.611816f, 0.626465f, 0.641602f, 0.656738f, 0.671875f, 0.686523f, 0.701172f, 0.715820f, - 0.731445f, 0.746582f, 0.868652f, 0.864746f, 0.856934f, 0.851074f, 0.844727f, 0.837891f, - 0.003595f, 0.011093f, 0.018265f, 0.025711f, 0.033600f, 0.041656f, 0.050140f, 0.058350f, - 0.067505f, 0.076416f, 0.085632f, 0.095093f, 0.104919f, 0.115295f, 0.125610f, 0.136108f, - 0.147583f, 0.157959f, 0.169800f, 0.181519f, 0.193359f, 0.205933f, 0.218140f, 0.231323f, - 0.243652f, 0.257324f, 0.270508f, 0.283447f, 0.297363f, 0.311523f, 0.325928f, 0.339111f, - 0.353516f, 0.367432f, 0.382812f, 0.396973f, 0.412109f, 0.426758f, 0.441406f, 0.456055f, - 0.471436f, 0.486328f, 0.501953f, 0.516113f, 0.531738f, 0.546875f, 0.562500f, 0.577637f, - 0.592773f, 0.607910f, 0.622559f, 0.638184f, 0.653809f, 0.669434f, 0.684082f, 0.699219f, - 0.714355f, 0.729492f, 0.860840f, 0.857422f, 0.852051f, 0.844727f, 0.839355f, 0.832520f, - 0.003349f, 0.009933f, 0.016754f, 0.024063f, 0.031204f, 0.038849f, 0.046356f, 0.054413f, - 0.062744f, 0.070984f, 0.080017f, 0.088989f, 0.097778f, 0.107361f, 0.117004f, 0.127197f, - 0.137451f, 0.148071f, 0.159180f, 0.169922f, 0.181519f, 0.192993f, 0.204956f, 0.217407f, - 0.229980f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.307861f, 0.321533f, - 0.335693f, 0.350098f, 0.364258f, 0.379150f, 0.393066f, 0.407715f, 0.422607f, 0.437500f, - 0.452148f, 0.467041f, 0.482422f, 0.497314f, 0.512695f, 0.527832f, 0.542969f, 0.558594f, - 0.573730f, 0.589844f, 0.604004f, 0.619629f, 0.635254f, 0.651367f, 0.665527f, 0.681152f, - 0.696289f, 0.711914f, 0.852539f, 0.851562f, 0.846191f, 0.838867f, 0.832520f, 0.827637f, - 0.003290f, 0.009415f, 0.015976f, 0.022095f, 0.028946f, 0.036255f, 0.043396f, 0.050598f, - 0.058502f, 0.066284f, 0.074036f, 0.082275f, 0.091187f, 0.099731f, 0.108826f, 0.118652f, - 0.128296f, 0.137939f, 0.148193f, 0.159302f, 0.170166f, 0.180786f, 0.191895f, 0.203491f, - 0.215210f, 0.227661f, 0.240112f, 0.252686f, 0.265625f, 0.278564f, 0.291748f, 0.305176f, - 0.318604f, 0.332764f, 0.346924f, 0.360352f, 0.375000f, 0.389160f, 0.404297f, 0.418213f, - 0.433105f, 0.448486f, 0.463135f, 0.477783f, 0.493408f, 0.508301f, 0.523438f, 0.540039f, - 0.554199f, 0.570312f, 0.585938f, 0.601074f, 0.617188f, 0.633301f, 0.648926f, 0.664062f, - 0.679688f, 0.695312f, 0.844727f, 0.844238f, 0.838867f, 0.833008f, 0.827148f, 0.822266f, - 0.002913f, 0.008621f, 0.014595f, 0.020950f, 0.027496f, 0.033600f, 0.040558f, 0.047119f, - 0.054260f, 0.061615f, 0.068970f, 0.076782f, 0.084717f, 0.093140f, 0.101562f, 0.109985f, - 0.118591f, 0.129150f, 0.138306f, 0.148682f, 0.158447f, 0.169189f, 0.180054f, 0.191162f, - 0.202148f, 0.213379f, 0.225586f, 0.237305f, 0.250488f, 0.262939f, 0.275391f, 0.288086f, - 0.302490f, 0.315186f, 0.329346f, 0.342529f, 0.356934f, 0.370117f, 0.385742f, 0.400146f, - 0.414795f, 0.429199f, 0.444336f, 0.459473f, 0.473389f, 0.489258f, 0.503906f, 0.519531f, - 0.535645f, 0.551270f, 0.566895f, 0.582520f, 0.598145f, 0.614258f, 0.629395f, 0.645996f, - 0.661621f, 0.677734f, 0.837402f, 0.836914f, 0.832520f, 0.826660f, 0.821777f, 0.816406f, - 0.002748f, 0.008018f, 0.014168f, 0.019196f, 0.025040f, 0.031250f, 0.037506f, 0.043732f, - 0.050415f, 0.057098f, 0.063721f, 0.071167f, 0.078979f, 0.086609f, 0.094299f, 0.102783f, - 0.111145f, 0.119812f, 0.128296f, 0.138306f, 0.147583f, 0.157593f, 0.168213f, 0.178711f, - 0.188843f, 0.200317f, 0.211792f, 0.223511f, 0.235352f, 0.247192f, 0.259521f, 0.272461f, - 0.285156f, 0.298584f, 0.312012f, 0.324707f, 0.339111f, 0.352783f, 0.366943f, 0.381348f, - 0.395996f, 0.410889f, 0.425537f, 0.439941f, 0.454834f, 0.470459f, 0.485352f, 0.501953f, - 0.516113f, 0.531738f, 0.547363f, 0.563477f, 0.579102f, 0.595703f, 0.611328f, 0.626953f, - 0.642578f, 0.659668f, 0.828125f, 0.830566f, 0.825684f, 0.820801f, 0.815430f, 0.811035f, - 0.002630f, 0.007412f, 0.012978f, 0.018356f, 0.023758f, 0.028931f, 0.034729f, 0.040894f, - 0.046631f, 0.053101f, 0.059143f, 0.065979f, 0.073669f, 0.080200f, 0.087585f, 0.095276f, - 0.102844f, 0.111633f, 0.119812f, 0.128296f, 0.137573f, 0.146729f, 0.156128f, 0.166382f, - 0.176880f, 0.187256f, 0.197998f, 0.209351f, 0.220581f, 0.232422f, 0.244385f, 0.256592f, - 0.268799f, 0.281982f, 0.294922f, 0.308105f, 0.321045f, 0.334717f, 0.348633f, 0.363525f, - 0.378174f, 0.391846f, 0.406006f, 0.420898f, 0.436279f, 0.451660f, 0.466064f, 0.481934f, - 0.496826f, 0.513184f, 0.528320f, 0.543945f, 0.560059f, 0.576660f, 0.592285f, 0.608887f, - 0.625000f, 0.640625f, 0.819336f, 0.822266f, 0.818848f, 0.813965f, 0.810059f, 0.805664f, - 0.002201f, 0.007240f, 0.011803f, 0.016617f, 0.021622f, 0.027344f, 0.032288f, 0.037598f, - 0.043427f, 0.049194f, 0.055267f, 0.061462f, 0.067566f, 0.073853f, 0.080872f, 0.088013f, - 0.095703f, 0.103821f, 0.111145f, 0.119446f, 0.127563f, 0.136597f, 0.145752f, 0.155273f, - 0.165039f, 0.174683f, 0.185181f, 0.195801f, 0.206543f, 0.218140f, 0.229370f, 0.241455f, - 0.253174f, 0.265381f, 0.278564f, 0.291504f, 0.304199f, 0.317383f, 0.331299f, 0.344971f, - 0.358643f, 0.373291f, 0.386963f, 0.402100f, 0.416016f, 0.431641f, 0.447266f, 0.462646f, - 0.477295f, 0.493652f, 0.509277f, 0.524902f, 0.541504f, 0.557617f, 0.574219f, 0.589844f, - 0.605957f, 0.623047f, 0.810059f, 0.814453f, 0.811035f, 0.807129f, 0.803223f, 0.798828f, - 0.002293f, 0.006927f, 0.010994f, 0.015617f, 0.020584f, 0.025131f, 0.029663f, 0.034760f, - 0.040192f, 0.045532f, 0.050964f, 0.056793f, 0.062805f, 0.068726f, 0.074890f, 0.081482f, - 0.088806f, 0.096069f, 0.103333f, 0.110535f, 0.118896f, 0.126709f, 0.135254f, 0.144165f, - 0.153442f, 0.162720f, 0.172119f, 0.182495f, 0.192749f, 0.203735f, 0.214600f, 0.225952f, - 0.237793f, 0.250000f, 0.261719f, 0.274170f, 0.287354f, 0.300293f, 0.313477f, 0.326904f, - 0.340820f, 0.354980f, 0.369385f, 0.383545f, 0.396973f, 0.411865f, 0.427734f, 0.442871f, - 0.458740f, 0.473633f, 0.489502f, 0.505859f, 0.522461f, 0.537598f, 0.553711f, 0.572754f, - 0.588379f, 0.604492f, 0.802246f, 0.807617f, 0.804199f, 0.800781f, 0.797363f, 0.792969f, - 0.002081f, 0.006172f, 0.010460f, 0.014503f, 0.019104f, 0.023163f, 0.027832f, 0.032410f, - 0.037354f, 0.041992f, 0.047211f, 0.052490f, 0.057831f, 0.063232f, 0.069458f, 0.075317f, - 0.082153f, 0.088257f, 0.094910f, 0.102295f, 0.110107f, 0.117554f, 0.125122f, 0.133667f, - 0.142456f, 0.151001f, 0.160767f, 0.169922f, 0.179443f, 0.190430f, 0.200562f, 0.211914f, - 0.222412f, 0.234009f, 0.245850f, 0.258545f, 0.270752f, 0.283203f, 0.296387f, 0.309082f, - 0.322998f, 0.336670f, 0.350098f, 0.364990f, 0.378906f, 0.393311f, 0.408936f, 0.423096f, - 0.438965f, 0.454834f, 0.470703f, 0.486572f, 0.502441f, 0.518555f, 0.534668f, 0.551270f, - 0.569336f, 0.585938f, 0.792480f, 0.799316f, 0.797363f, 0.793457f, 0.790039f, 0.786621f, - 0.002028f, 0.005669f, 0.009705f, 0.013565f, 0.017532f, 0.021286f, 0.025574f, 0.030197f, - 0.034180f, 0.038757f, 0.043488f, 0.048737f, 0.053497f, 0.058594f, 0.064026f, 0.070007f, - 0.075623f, 0.081360f, 0.088135f, 0.094238f, 0.101379f, 0.108643f, 0.116028f, 0.123718f, - 0.131592f, 0.140137f, 0.149048f, 0.157715f, 0.167114f, 0.176636f, 0.187012f, 0.197388f, - 0.208130f, 0.219238f, 0.230347f, 0.241943f, 0.254150f, 0.266113f, 0.279053f, 0.291504f, - 0.304932f, 0.318848f, 0.332031f, 0.345947f, 0.360107f, 0.375000f, 0.389404f, 0.404541f, - 0.419922f, 0.434814f, 0.450684f, 0.466553f, 0.482910f, 0.499023f, 0.516113f, 0.533203f, - 0.550293f, 0.567383f, 0.783203f, 0.790527f, 0.789551f, 0.786621f, 0.783691f, 0.780762f, - 0.001852f, 0.005554f, 0.008957f, 0.012642f, 0.016296f, 0.020172f, 0.024033f, 0.027878f, - 0.031677f, 0.035919f, 0.040253f, 0.044952f, 0.049255f, 0.053955f, 0.058960f, 0.063965f, - 0.069336f, 0.074951f, 0.080933f, 0.087219f, 0.093201f, 0.100159f, 0.106689f, 0.114197f, - 0.121521f, 0.129517f, 0.137817f, 0.146118f, 0.155151f, 0.164307f, 0.173462f, 0.183472f, - 0.193970f, 0.204224f, 0.215210f, 0.226562f, 0.238037f, 0.250244f, 0.262451f, 0.274902f, - 0.287598f, 0.301025f, 0.314209f, 0.327393f, 0.342041f, 0.356445f, 0.370850f, 0.385254f, - 0.400879f, 0.415771f, 0.431396f, 0.446777f, 0.463379f, 0.480469f, 0.497314f, 0.514160f, - 0.530273f, 0.547363f, 0.774414f, 0.783203f, 0.782715f, 0.779297f, 0.776367f, 0.773438f, - 0.001690f, 0.005207f, 0.008278f, 0.011696f, 0.015068f, 0.018784f, 0.022186f, 0.025909f, - 0.029221f, 0.033508f, 0.037109f, 0.041321f, 0.045471f, 0.049774f, 0.054108f, 0.058838f, - 0.063843f, 0.069214f, 0.074280f, 0.080078f, 0.086243f, 0.091980f, 0.098083f, 0.105164f, - 0.111877f, 0.119446f, 0.126953f, 0.134888f, 0.143555f, 0.151978f, 0.161133f, 0.170532f, - 0.180176f, 0.189697f, 0.200684f, 0.211182f, 0.222412f, 0.234009f, 0.245972f, 0.257568f, - 0.270508f, 0.282959f, 0.295898f, 0.309570f, 0.323486f, 0.337158f, 0.351562f, 0.366211f, - 0.381104f, 0.396729f, 0.411865f, 0.427490f, 0.443604f, 0.459961f, 0.477051f, 0.494385f, - 0.510742f, 0.529297f, 0.763184f, 0.774902f, 0.773438f, 0.771973f, 0.769043f, 0.767578f, - 0.001528f, 0.004692f, 0.007587f, 0.010956f, 0.014221f, 0.016907f, 0.020218f, 0.023407f, - 0.027283f, 0.030273f, 0.033997f, 0.038055f, 0.041809f, 0.045959f, 0.049683f, 0.053955f, - 0.058838f, 0.063171f, 0.068176f, 0.073120f, 0.078491f, 0.084473f, 0.090332f, 0.096619f, - 0.102905f, 0.109619f, 0.116699f, 0.124207f, 0.131958f, 0.140503f, 0.148438f, 0.157349f, - 0.166626f, 0.176392f, 0.186157f, 0.196045f, 0.207031f, 0.218018f, 0.229736f, 0.241699f, - 0.253174f, 0.265381f, 0.278320f, 0.291748f, 0.305176f, 0.318848f, 0.333496f, 0.347412f, - 0.362305f, 0.376709f, 0.392822f, 0.407715f, 0.424072f, 0.440430f, 0.457031f, 0.473633f, - 0.491211f, 0.508789f, 0.753906f, 0.766602f, 0.767090f, 0.764160f, 0.761719f, 0.759766f, - 0.001261f, 0.004250f, 0.007389f, 0.010185f, 0.013023f, 0.015976f, 0.018692f, 0.021713f, - 0.024734f, 0.028183f, 0.031464f, 0.034943f, 0.038452f, 0.041870f, 0.045410f, 0.049561f, - 0.054047f, 0.058044f, 0.062164f, 0.067017f, 0.071838f, 0.077332f, 0.082581f, 0.088318f, - 0.094360f, 0.100525f, 0.107117f, 0.114258f, 0.121643f, 0.128540f, 0.136841f, 0.144897f, - 0.153931f, 0.162476f, 0.171875f, 0.182007f, 0.192139f, 0.202637f, 0.213623f, 0.224854f, - 0.237183f, 0.248657f, 0.260986f, 0.274170f, 0.287354f, 0.300781f, 0.314453f, 0.328613f, - 0.343018f, 0.358643f, 0.373291f, 0.388916f, 0.404785f, 0.420654f, 0.437744f, 0.454590f, - 0.471924f, 0.489990f, 0.744629f, 0.757812f, 0.757812f, 0.756836f, 0.754395f, 0.752441f, - 0.001527f, 0.004047f, 0.006680f, 0.009369f, 0.012024f, 0.014618f, 0.017288f, 0.020248f, - 0.022705f, 0.025803f, 0.028778f, 0.031769f, 0.034912f, 0.038330f, 0.041595f, 0.045166f, - 0.048737f, 0.052673f, 0.056885f, 0.061218f, 0.065552f, 0.070251f, 0.075012f, 0.080505f, - 0.086060f, 0.091614f, 0.097656f, 0.104065f, 0.110901f, 0.118225f, 0.125366f, 0.133179f, - 0.141357f, 0.149902f, 0.158569f, 0.168213f, 0.177734f, 0.187866f, 0.198364f, 0.208984f, - 0.220581f, 0.232422f, 0.244019f, 0.256836f, 0.269287f, 0.282471f, 0.296143f, 0.309326f, - 0.324463f, 0.338379f, 0.353760f, 0.368652f, 0.385498f, 0.400635f, 0.417725f, 0.434570f, - 0.451660f, 0.469482f, 0.733887f, 0.749023f, 0.750977f, 0.749023f, 0.747070f, 0.744629f, - 0.001313f, 0.003803f, 0.006126f, 0.008507f, 0.011185f, 0.013550f, 0.015839f, 0.018219f, - 0.021027f, 0.023438f, 0.026520f, 0.029129f, 0.031738f, 0.034821f, 0.037964f, 0.041138f, - 0.044434f, 0.048035f, 0.051636f, 0.055420f, 0.059540f, 0.063782f, 0.068176f, 0.073181f, - 0.077881f, 0.083496f, 0.088989f, 0.094849f, 0.101440f, 0.107849f, 0.114441f, 0.121887f, - 0.129395f, 0.137207f, 0.145874f, 0.154419f, 0.163574f, 0.173462f, 0.183228f, 0.193726f, - 0.204712f, 0.216064f, 0.227661f, 0.239624f, 0.251709f, 0.264648f, 0.277832f, 0.291504f, - 0.305664f, 0.320312f, 0.334473f, 0.349854f, 0.365479f, 0.380615f, 0.397217f, 0.414551f, - 0.432129f, 0.449951f, 0.722656f, 0.740234f, 0.741699f, 0.741211f, 0.739746f, 0.737793f, - 0.001137f, 0.003654f, 0.005871f, 0.007881f, 0.010262f, 0.012268f, 0.014496f, 0.017059f, - 0.018890f, 0.021317f, 0.023605f, 0.026291f, 0.029007f, 0.031494f, 0.034515f, 0.036987f, - 0.040375f, 0.043457f, 0.046936f, 0.050385f, 0.053925f, 0.058044f, 0.061981f, 0.066650f, - 0.070679f, 0.075562f, 0.080994f, 0.085938f, 0.091919f, 0.098450f, 0.104370f, 0.110840f, - 0.118164f, 0.125366f, 0.133301f, 0.141357f, 0.150024f, 0.159546f, 0.168457f, 0.178711f, - 0.189453f, 0.199707f, 0.211060f, 0.222656f, 0.234741f, 0.247314f, 0.260010f, 0.272705f, - 0.287354f, 0.300781f, 0.315674f, 0.330322f, 0.345947f, 0.362061f, 0.377441f, 0.394775f, - 0.412109f, 0.429199f, 0.712891f, 0.730957f, 0.733398f, 0.733398f, 0.731445f, 0.729492f, - 0.001163f, 0.003218f, 0.005329f, 0.007542f, 0.009331f, 0.011330f, 0.013367f, 0.015434f, - 0.017685f, 0.019714f, 0.021515f, 0.024139f, 0.026062f, 0.028763f, 0.031204f, 0.033722f, - 0.036163f, 0.039398f, 0.041992f, 0.045624f, 0.048553f, 0.051971f, 0.056000f, 0.059937f, - 0.063904f, 0.068054f, 0.072876f, 0.077820f, 0.083374f, 0.088623f, 0.094116f, 0.100830f, - 0.107117f, 0.114197f, 0.121399f, 0.129272f, 0.136963f, 0.145630f, 0.154785f, 0.163696f, - 0.173828f, 0.184204f, 0.194946f, 0.205933f, 0.217529f, 0.229614f, 0.242676f, 0.255859f, - 0.269043f, 0.282471f, 0.296387f, 0.311523f, 0.326172f, 0.341553f, 0.357910f, 0.374756f, - 0.391846f, 0.409180f, 0.701660f, 0.721680f, 0.723633f, 0.724609f, 0.723145f, 0.722656f, - 0.001008f, 0.003147f, 0.004818f, 0.006882f, 0.008530f, 0.010468f, 0.012390f, 0.013832f, - 0.016006f, 0.017899f, 0.019608f, 0.021866f, 0.023849f, 0.025940f, 0.027847f, 0.030350f, - 0.032806f, 0.035187f, 0.037994f, 0.040619f, 0.043732f, 0.046875f, 0.050110f, 0.053833f, - 0.057617f, 0.061371f, 0.065613f, 0.070068f, 0.074768f, 0.079895f, 0.085144f, 0.090637f, - 0.096863f, 0.103149f, 0.110107f, 0.116943f, 0.124634f, 0.132568f, 0.140991f, 0.149536f, - 0.159302f, 0.169189f, 0.179443f, 0.189575f, 0.201538f, 0.213013f, 0.225342f, 0.236938f, - 0.250244f, 0.264160f, 0.278320f, 0.292236f, 0.307617f, 0.322021f, 0.337891f, 0.354248f, - 0.371582f, 0.389160f, 0.689941f, 0.712891f, 0.715820f, 0.715820f, 0.715820f, 0.714355f, - 0.001126f, 0.002708f, 0.004486f, 0.006313f, 0.007927f, 0.009659f, 0.011238f, 0.012833f, - 0.014435f, 0.015823f, 0.017670f, 0.019485f, 0.021347f, 0.023453f, 0.025101f, 0.027161f, - 0.029160f, 0.031525f, 0.033752f, 0.036560f, 0.039154f, 0.041687f, 0.044891f, 0.047943f, - 0.051453f, 0.054871f, 0.058655f, 0.062622f, 0.067078f, 0.071411f, 0.076355f, 0.081665f, - 0.086792f, 0.092957f, 0.098877f, 0.105713f, 0.112549f, 0.119995f, 0.127563f, 0.135864f, - 0.144897f, 0.154297f, 0.164185f, 0.173828f, 0.185059f, 0.196045f, 0.208008f, 0.219849f, - 0.232666f, 0.245483f, 0.259033f, 0.273438f, 0.287842f, 0.302734f, 0.318604f, 0.334473f, - 0.351318f, 0.369385f, 0.679688f, 0.702637f, 0.707031f, 0.707031f, 0.707031f, 0.705566f, - 0.000980f, 0.002733f, 0.004021f, 0.005688f, 0.007084f, 0.008553f, 0.010345f, 0.011513f, - 0.012962f, 0.014297f, 0.015823f, 0.017609f, 0.019119f, 0.020721f, 0.022568f, 0.024200f, - 0.026291f, 0.028000f, 0.030457f, 0.032410f, 0.034912f, 0.037476f, 0.039734f, 0.042786f, - 0.045563f, 0.048920f, 0.052185f, 0.055817f, 0.059662f, 0.063660f, 0.067993f, 0.072632f, - 0.077759f, 0.083191f, 0.088623f, 0.094971f, 0.101135f, 0.107849f, 0.115479f, 0.122864f, - 0.131592f, 0.139893f, 0.149414f, 0.158447f, 0.169067f, 0.179443f, 0.191040f, 0.202393f, - 0.214478f, 0.227539f, 0.240723f, 0.255127f, 0.268555f, 0.283447f, 0.298828f, 0.315186f, - 0.331787f, 0.348389f, 0.667480f, 0.693359f, 0.697754f, 0.698730f, 0.698242f, 0.697754f, - 0.000870f, 0.002420f, 0.003994f, 0.005165f, 0.006584f, 0.007763f, 0.009209f, 0.010468f, - 0.011604f, 0.013336f, 0.013977f, 0.015442f, 0.016830f, 0.018509f, 0.020065f, 0.021606f, - 0.023224f, 0.024933f, 0.026672f, 0.028656f, 0.030914f, 0.033112f, 0.035187f, 0.037689f, - 0.040344f, 0.043335f, 0.046234f, 0.049438f, 0.052948f, 0.056427f, 0.060394f, 0.064331f, - 0.069031f, 0.073853f, 0.078735f, 0.084412f, 0.090271f, 0.096436f, 0.103455f, 0.110229f, - 0.118042f, 0.126099f, 0.134766f, 0.143921f, 0.153198f, 0.163696f, 0.174438f, 0.185913f, - 0.197754f, 0.210083f, 0.222778f, 0.235962f, 0.250000f, 0.264648f, 0.279053f, 0.294922f, - 0.311279f, 0.328613f, 0.655273f, 0.684082f, 0.688477f, 0.689941f, 0.689941f, 0.689941f, - 0.000790f, 0.002153f, 0.003576f, 0.004726f, 0.005966f, 0.007172f, 0.008186f, 0.009453f, - 0.010521f, 0.011482f, 0.012772f, 0.013771f, 0.015144f, 0.016434f, 0.017792f, 0.019226f, - 0.020355f, 0.022049f, 0.023666f, 0.025375f, 0.027145f, 0.029297f, 0.030975f, 0.033142f, - 0.035339f, 0.037964f, 0.040405f, 0.043365f, 0.046478f, 0.049744f, 0.053101f, 0.057068f, - 0.060944f, 0.065063f, 0.069763f, 0.074646f, 0.079956f, 0.085938f, 0.091675f, 0.098083f, - 0.105164f, 0.112732f, 0.121033f, 0.129395f, 0.138428f, 0.148560f, 0.158325f, 0.169067f, - 0.180664f, 0.192139f, 0.205078f, 0.217529f, 0.231934f, 0.246094f, 0.260010f, 0.275391f, - 0.292236f, 0.309570f, 0.644043f, 0.673340f, 0.678711f, 0.680664f, 0.680664f, 0.680176f, - 0.000538f, 0.002022f, 0.003185f, 0.004456f, 0.005360f, 0.006321f, 0.007286f, 0.008484f, - 0.009422f, 0.010185f, 0.011177f, 0.012283f, 0.013191f, 0.014435f, 0.015587f, 0.016769f, - 0.017914f, 0.019302f, 0.020584f, 0.022171f, 0.023819f, 0.025391f, 0.027222f, 0.028992f, - 0.030914f, 0.033234f, 0.035461f, 0.037903f, 0.040649f, 0.043396f, 0.046326f, 0.049561f, - 0.053131f, 0.056946f, 0.061279f, 0.065613f, 0.070374f, 0.075439f, 0.080811f, 0.086731f, - 0.093140f, 0.100037f, 0.107544f, 0.115662f, 0.124023f, 0.132935f, 0.143066f, 0.153320f, - 0.163696f, 0.175415f, 0.187012f, 0.200195f, 0.213013f, 0.227173f, 0.241455f, 0.256592f, - 0.272461f, 0.288330f, 0.632812f, 0.663574f, 0.669434f, 0.670898f, 0.671387f, 0.671875f, - 0.000686f, 0.001864f, 0.002884f, 0.003883f, 0.004829f, 0.005592f, 0.006504f, 0.007454f, - 0.008064f, 0.008995f, 0.009850f, 0.010948f, 0.011711f, 0.012581f, 0.013763f, 0.014618f, - 0.015701f, 0.016953f, 0.018112f, 0.019180f, 0.020691f, 0.021973f, 0.023560f, 0.025192f, - 0.026962f, 0.028717f, 0.030624f, 0.032959f, 0.035004f, 0.037567f, 0.040314f, 0.043121f, - 0.046204f, 0.049713f, 0.053284f, 0.057129f, 0.061157f, 0.065796f, 0.071167f, 0.076477f, - 0.082214f, 0.088379f, 0.095276f, 0.102600f, 0.110596f, 0.118652f, 0.127808f, 0.137817f, - 0.147705f, 0.158569f, 0.170166f, 0.182251f, 0.195068f, 0.208008f, 0.222656f, 0.237671f, - 0.252686f, 0.269287f, 0.620605f, 0.653320f, 0.659180f, 0.661621f, 0.663086f, 0.663574f, - 0.000782f, 0.001828f, 0.002949f, 0.003487f, 0.004421f, 0.005032f, 0.005878f, 0.006557f, - 0.007332f, 0.008110f, 0.008591f, 0.009537f, 0.010094f, 0.011147f, 0.011864f, 0.012779f, - 0.013573f, 0.014549f, 0.015625f, 0.016846f, 0.017822f, 0.018936f, 0.020279f, 0.021729f, - 0.023117f, 0.024704f, 0.026505f, 0.028183f, 0.030289f, 0.032349f, 0.034546f, 0.037109f, - 0.039703f, 0.042786f, 0.045837f, 0.049133f, 0.053009f, 0.056763f, 0.061584f, 0.066284f, - 0.071411f, 0.076843f, 0.083191f, 0.089722f, 0.097290f, 0.104919f, 0.113647f, 0.122498f, - 0.132324f, 0.142578f, 0.153809f, 0.164917f, 0.177612f, 0.190430f, 0.203857f, 0.218506f, - 0.233887f, 0.249390f, 0.606934f, 0.642578f, 0.649414f, 0.653320f, 0.652832f, 0.654785f, - 0.000604f, 0.001636f, 0.002550f, 0.003180f, 0.003799f, 0.004498f, 0.005051f, 0.005573f, - 0.006325f, 0.006836f, 0.007607f, 0.008087f, 0.008820f, 0.009483f, 0.010132f, 0.010918f, - 0.011665f, 0.012527f, 0.013535f, 0.014297f, 0.015251f, 0.016190f, 0.017288f, 0.018433f, - 0.019791f, 0.021133f, 0.022400f, 0.023865f, 0.025742f, 0.027664f, 0.029373f, 0.031677f, - 0.034027f, 0.036255f, 0.039032f, 0.042023f, 0.045197f, 0.048798f, 0.052643f, 0.056824f, - 0.061493f, 0.066467f, 0.072327f, 0.078308f, 0.084473f, 0.091858f, 0.099609f, 0.108032f, - 0.117249f, 0.126831f, 0.137451f, 0.148193f, 0.160034f, 0.172729f, 0.186035f, 0.199829f, - 0.214722f, 0.229980f, 0.596680f, 0.632812f, 0.638672f, 0.642578f, 0.644531f, 0.645020f, - 0.000447f, 0.001384f, 0.001986f, 0.002697f, 0.003225f, 0.003828f, 0.004501f, 0.005009f, - 0.005459f, 0.006027f, 0.006474f, 0.006935f, 0.007591f, 0.008217f, 0.008644f, 0.009308f, - 0.010025f, 0.010498f, 0.011330f, 0.012100f, 0.012909f, 0.013924f, 0.014618f, 0.015610f, - 0.016739f, 0.017807f, 0.019043f, 0.020340f, 0.021622f, 0.023178f, 0.024979f, 0.026520f, - 0.028366f, 0.030640f, 0.032959f, 0.035492f, 0.038239f, 0.041260f, 0.044495f, 0.048340f, - 0.052399f, 0.056732f, 0.061768f, 0.067017f, 0.072754f, 0.079224f, 0.086304f, 0.093994f, - 0.102478f, 0.111511f, 0.121521f, 0.132080f, 0.143311f, 0.155518f, 0.168213f, 0.181763f, - 0.196411f, 0.211548f, 0.583008f, 0.621094f, 0.629395f, 0.632324f, 0.634766f, 0.635742f, - 0.000375f, 0.001324f, 0.001728f, 0.002466f, 0.002872f, 0.003384f, 0.003685f, 0.004185f, - 0.004845f, 0.005184f, 0.005444f, 0.006130f, 0.006401f, 0.006844f, 0.007446f, 0.007957f, - 0.008636f, 0.008965f, 0.009659f, 0.010139f, 0.010971f, 0.011742f, 0.012497f, 0.013138f, - 0.014099f, 0.014992f, 0.015900f, 0.017166f, 0.018143f, 0.019485f, 0.020676f, 0.022156f, - 0.023697f, 0.025528f, 0.027374f, 0.029556f, 0.031921f, 0.034424f, 0.037445f, 0.040375f, - 0.044067f, 0.047577f, 0.052155f, 0.056824f, 0.062042f, 0.067688f, 0.074158f, 0.081055f, - 0.088745f, 0.097351f, 0.106323f, 0.116455f, 0.127075f, 0.138672f, 0.151123f, 0.164062f, - 0.177856f, 0.192871f, 0.570801f, 0.610840f, 0.619629f, 0.623047f, 0.625488f, 0.625977f, - 0.000432f, 0.000921f, 0.001664f, 0.002056f, 0.002697f, 0.003061f, 0.003326f, 0.003757f, - 0.004044f, 0.004379f, 0.004761f, 0.004948f, 0.005463f, 0.005791f, 0.006199f, 0.006752f, - 0.007229f, 0.007526f, 0.008156f, 0.008621f, 0.009193f, 0.009712f, 0.010330f, 0.010994f, - 0.011688f, 0.012466f, 0.013374f, 0.014153f, 0.015099f, 0.016083f, 0.017212f, 0.018250f, - 0.019623f, 0.021210f, 0.022614f, 0.024445f, 0.026321f, 0.028351f, 0.030762f, 0.033325f, - 0.036377f, 0.039642f, 0.043304f, 0.047485f, 0.051880f, 0.056885f, 0.062469f, 0.068542f, - 0.075623f, 0.083374f, 0.091919f, 0.101135f, 0.111389f, 0.122559f, 0.134277f, 0.146606f, - 0.160278f, 0.174683f, 0.557617f, 0.600098f, 0.609375f, 0.612793f, 0.615723f, 0.616699f, - 0.000255f, 0.000997f, 0.001393f, 0.001908f, 0.002239f, 0.002512f, 0.002720f, 0.003166f, - 0.003283f, 0.003616f, 0.003866f, 0.004223f, 0.004597f, 0.004795f, 0.005127f, 0.005573f, - 0.005939f, 0.006359f, 0.006657f, 0.007133f, 0.007687f, 0.008041f, 0.008545f, 0.009087f, - 0.009636f, 0.010300f, 0.010910f, 0.011757f, 0.012489f, 0.013313f, 0.014153f, 0.014954f, - 0.016037f, 0.017258f, 0.018555f, 0.019867f, 0.021530f, 0.023239f, 0.025055f, 0.027252f, - 0.029663f, 0.032379f, 0.035339f, 0.038666f, 0.042664f, 0.047058f, 0.051849f, 0.057465f, - 0.063416f, 0.070557f, 0.078369f, 0.086731f, 0.096313f, 0.106384f, 0.117798f, 0.129761f, - 0.143311f, 0.156982f, 0.544922f, 0.588867f, 0.599121f, 0.602539f, 0.605469f, 0.606445f, - 0.000353f, 0.000879f, 0.001276f, 0.001613f, 0.001785f, 0.002075f, 0.002300f, 0.002501f, - 0.002808f, 0.003010f, 0.003283f, 0.003487f, 0.003714f, 0.003967f, 0.004269f, 0.004597f, - 0.004837f, 0.005230f, 0.005512f, 0.005878f, 0.006203f, 0.006626f, 0.007030f, 0.007519f, - 0.007866f, 0.008354f, 0.009010f, 0.009468f, 0.010017f, 0.010765f, 0.011444f, 0.012291f, - 0.013100f, 0.014030f, 0.015030f, 0.016098f, 0.017441f, 0.018646f, 0.020157f, 0.021912f, - 0.023804f, 0.026047f, 0.028488f, 0.031342f, 0.034424f, 0.037994f, 0.042206f, 0.046997f, - 0.052338f, 0.058533f, 0.065369f, 0.073364f, 0.081787f, 0.091492f, 0.102356f, 0.113647f, - 0.126343f, 0.139526f, 0.531250f, 0.579102f, 0.587891f, 0.592773f, 0.595703f, 0.596680f, - 0.000295f, 0.000784f, 0.000912f, 0.001261f, 0.001517f, 0.001761f, 0.001893f, 0.002113f, - 0.002211f, 0.002432f, 0.002676f, 0.002861f, 0.002993f, 0.003294f, 0.003479f, 0.003700f, - 0.003933f, 0.004242f, 0.004452f, 0.004745f, 0.004974f, 0.005428f, 0.005642f, 0.006081f, - 0.006401f, 0.006817f, 0.007240f, 0.007641f, 0.008209f, 0.008667f, 0.009361f, 0.009720f, - 0.010506f, 0.011261f, 0.012024f, 0.012794f, 0.013840f, 0.014893f, 0.016113f, 0.017395f, - 0.018860f, 0.020493f, 0.022446f, 0.024658f, 0.027283f, 0.030228f, 0.033691f, 0.037659f, - 0.042145f, 0.047546f, 0.053467f, 0.060547f, 0.068359f, 0.077332f, 0.087158f, 0.098145f, - 0.109741f, 0.123230f, 0.517090f, 0.566895f, 0.576660f, 0.581543f, 0.584961f, 0.587402f, - 0.000247f, 0.000702f, 0.000849f, 0.001033f, 0.001304f, 0.001416f, 0.001576f, 0.001754f, - 0.001860f, 0.001953f, 0.002104f, 0.002327f, 0.002419f, 0.002651f, 0.002785f, 0.003014f, - 0.003134f, 0.003315f, 0.003584f, 0.003813f, 0.004078f, 0.004295f, 0.004555f, 0.004784f, - 0.005013f, 0.005329f, 0.005669f, 0.006069f, 0.006439f, 0.006821f, 0.007381f, 0.007797f, - 0.008301f, 0.008812f, 0.009430f, 0.010139f, 0.010948f, 0.011642f, 0.012573f, 0.013664f, - 0.014671f, 0.016052f, 0.017502f, 0.019135f, 0.021255f, 0.023438f, 0.026199f, 0.029312f, - 0.033203f, 0.037476f, 0.042725f, 0.048828f, 0.055695f, 0.063721f, 0.072937f, 0.082947f, - 0.094666f, 0.107117f, 0.504883f, 0.555664f, 0.566406f, 0.572754f, 0.574707f, 0.577148f, - 0.000217f, 0.000516f, 0.000750f, 0.000898f, 0.001011f, 0.001117f, 0.001203f, 0.001307f, - 0.001470f, 0.001604f, 0.001659f, 0.001750f, 0.001945f, 0.002121f, 0.002249f, 0.002316f, - 0.002478f, 0.002581f, 0.002832f, 0.003000f, 0.003164f, 0.003334f, 0.003593f, 0.003784f, - 0.003990f, 0.004196f, 0.004440f, 0.004673f, 0.005035f, 0.005329f, 0.005642f, 0.005981f, - 0.006462f, 0.006916f, 0.007313f, 0.007805f, 0.008377f, 0.008987f, 0.009727f, 0.010521f, - 0.011314f, 0.012421f, 0.013466f, 0.014755f, 0.016235f, 0.017914f, 0.019913f, 0.022461f, - 0.025330f, 0.028778f, 0.033081f, 0.038239f, 0.044189f, 0.051422f, 0.059662f, 0.069336f, - 0.080200f, 0.091980f, 0.492676f, 0.543945f, 0.555664f, 0.561035f, 0.564453f, 0.566406f, - 0.000131f, 0.000355f, 0.000605f, 0.000759f, 0.000832f, 0.000904f, 0.001018f, 0.000975f, - 0.001144f, 0.001235f, 0.001336f, 0.001447f, 0.001518f, 0.001620f, 0.001668f, 0.001835f, - 0.001901f, 0.002045f, 0.002188f, 0.002270f, 0.002424f, 0.002577f, 0.002707f, 0.002893f, - 0.003002f, 0.003223f, 0.003407f, 0.003572f, 0.003851f, 0.004017f, 0.004391f, 0.004608f, - 0.004833f, 0.005203f, 0.005497f, 0.005886f, 0.006351f, 0.006771f, 0.007278f, 0.007858f, - 0.008560f, 0.009315f, 0.010086f, 0.011078f, 0.012222f, 0.013443f, 0.015022f, 0.016769f, - 0.018967f, 0.021591f, 0.024780f, 0.028931f, 0.033875f, 0.039734f, 0.047241f, 0.056122f, - 0.066101f, 0.077637f, 0.477783f, 0.532715f, 0.544922f, 0.551270f, 0.553711f, 0.555664f, - 0.000245f, 0.000303f, 0.000473f, 0.000498f, 0.000544f, 0.000707f, 0.000700f, 0.000767f, - 0.000802f, 0.000892f, 0.001021f, 0.001086f, 0.001140f, 0.001260f, 0.001303f, 0.001325f, - 0.001462f, 0.001553f, 0.001603f, 0.001746f, 0.001816f, 0.001904f, 0.002043f, 0.002127f, - 0.002254f, 0.002356f, 0.002548f, 0.002672f, 0.002851f, 0.003092f, 0.003265f, 0.003374f, - 0.003647f, 0.003891f, 0.004097f, 0.004360f, 0.004669f, 0.004997f, 0.005390f, 0.005810f, - 0.006226f, 0.006756f, 0.007450f, 0.008095f, 0.008934f, 0.009827f, 0.010902f, 0.012268f, - 0.013840f, 0.015701f, 0.018036f, 0.021072f, 0.024948f, 0.029800f, 0.035980f, 0.043945f, - 0.053345f, 0.063843f, 0.465576f, 0.520996f, 0.535645f, 0.540039f, 0.543457f, 0.545898f, - 0.000108f, 0.000275f, 0.000332f, 0.000402f, 0.000462f, 0.000468f, 0.000580f, 0.000522f, - 0.000616f, 0.000657f, 0.000758f, 0.000762f, 0.000812f, 0.000870f, 0.000945f, 0.000978f, - 0.001054f, 0.001109f, 0.001179f, 0.001213f, 0.001311f, 0.001371f, 0.001473f, 0.001558f, - 0.001629f, 0.001718f, 0.001837f, 0.001903f, 0.002016f, 0.002159f, 0.002258f, 0.002478f, - 0.002548f, 0.002731f, 0.002909f, 0.003086f, 0.003317f, 0.003580f, 0.003885f, 0.004116f, - 0.004421f, 0.004818f, 0.005264f, 0.005745f, 0.006294f, 0.006966f, 0.007748f, 0.008667f, - 0.009766f, 0.011086f, 0.012787f, 0.014908f, 0.017746f, 0.021271f, 0.026382f, 0.032990f, - 0.041199f, 0.051239f, 0.452393f, 0.509277f, 0.522461f, 0.529297f, 0.533203f, 0.535156f, - 0.000016f, 0.000143f, 0.000244f, 0.000315f, 0.000309f, 0.000391f, 0.000344f, 0.000402f, - 0.000429f, 0.000517f, 0.000522f, 0.000526f, 0.000546f, 0.000606f, 0.000628f, 0.000705f, - 0.000692f, 0.000781f, 0.000837f, 0.000868f, 0.000923f, 0.000969f, 0.001013f, 0.001070f, - 0.001142f, 0.001186f, 0.001273f, 0.001326f, 0.001397f, 0.001534f, 0.001561f, 0.001685f, - 0.001775f, 0.001873f, 0.002024f, 0.002153f, 0.002272f, 0.002443f, 0.002611f, 0.002800f, - 0.003014f, 0.003250f, 0.003529f, 0.003868f, 0.004227f, 0.004692f, 0.005192f, 0.005836f, - 0.006603f, 0.007587f, 0.008751f, 0.010193f, 0.012001f, 0.014610f, 0.018219f, 0.023392f, - 0.030594f, 0.039795f, 0.437744f, 0.498291f, 0.512207f, 0.517578f, 0.521484f, 0.525391f, - 0.000102f, 0.000186f, 0.000171f, 0.000181f, 0.000227f, 0.000229f, 0.000231f, 0.000278f, - 0.000293f, 0.000304f, 0.000314f, 0.000375f, 0.000365f, 0.000411f, 0.000446f, 0.000457f, - 0.000496f, 0.000513f, 0.000533f, 0.000554f, 0.000603f, 0.000622f, 0.000669f, 0.000708f, - 0.000757f, 0.000789f, 0.000843f, 0.000875f, 0.000925f, 0.000964f, 0.001037f, 0.001094f, - 0.001172f, 0.001243f, 0.001324f, 0.001373f, 0.001497f, 0.001570f, 0.001712f, 0.001829f, - 0.001947f, 0.002123f, 0.002291f, 0.002472f, 0.002703f, 0.003008f, 0.003342f, 0.003757f, - 0.004204f, 0.004810f, 0.005539f, 0.006554f, 0.007828f, 0.009537f, 0.011894f, 0.015442f, - 0.021072f, 0.029282f, 0.424561f, 0.486084f, 0.500488f, 0.506836f, 0.512207f, 0.514648f, - 0.000014f, 0.000127f, 0.000112f, 0.000109f, 0.000143f, 0.000165f, 0.000141f, 0.000180f, - 0.000185f, 0.000191f, 0.000196f, 0.000203f, 0.000233f, 0.000252f, 0.000260f, 0.000274f, - 0.000288f, 0.000314f, 0.000328f, 0.000363f, 0.000362f, 0.000374f, 0.000400f, 0.000436f, - 0.000464f, 0.000501f, 0.000504f, 0.000521f, 0.000563f, 0.000593f, 0.000635f, 0.000671f, - 0.000712f, 0.000740f, 0.000800f, 0.000837f, 0.000892f, 0.000955f, 0.001030f, 0.001092f, - 0.001167f, 0.001270f, 0.001369f, 0.001491f, 0.001626f, 0.001769f, 0.001993f, 0.002209f, - 0.002523f, 0.002863f, 0.003325f, 0.003880f, 0.004715f, 0.005764f, 0.007320f, 0.009468f, - 0.013344f, 0.020187f, 0.410645f, 0.473877f, 0.489258f, 0.496826f, 0.500488f, 0.503906f, - 0.000103f, 0.000078f, 0.000067f, 0.000065f, 0.000086f, 0.000085f, 0.000101f, 0.000106f, - 0.000106f, 0.000107f, 0.000115f, 0.000133f, 0.000118f, 0.000133f, 0.000154f, 0.000150f, - 0.000167f, 0.000177f, 0.000180f, 0.000190f, 0.000207f, 0.000213f, 0.000228f, 0.000238f, - 0.000267f, 0.000277f, 0.000287f, 0.000298f, 0.000313f, 0.000325f, 0.000347f, 0.000375f, - 0.000393f, 0.000405f, 0.000440f, 0.000463f, 0.000486f, 0.000527f, 0.000562f, 0.000599f, - 0.000639f, 0.000688f, 0.000757f, 0.000807f, 0.000879f, 0.000961f, 0.001059f, 0.001180f, - 0.001342f, 0.001533f, 0.001762f, 0.002102f, 0.002502f, 0.003128f, 0.004028f, 0.005379f, - 0.007591f, 0.012505f, 0.397217f, 0.462891f, 0.478760f, 0.485840f, 0.490479f, 0.492676f, - 0.000087f, 0.000063f, 0.000054f, 0.000048f, 0.000047f, 0.000044f, 0.000046f, 0.000047f, - 0.000047f, 0.000060f, 0.000053f, 0.000056f, 0.000072f, 0.000060f, 0.000064f, 0.000069f, - 0.000078f, 0.000085f, 0.000084f, 0.000090f, 0.000094f, 0.000102f, 0.000105f, 0.000111f, - 0.000116f, 0.000126f, 0.000132f, 0.000150f, 0.000147f, 0.000158f, 0.000167f, 0.000178f, - 0.000185f, 0.000192f, 0.000211f, 0.000216f, 0.000226f, 0.000246f, 0.000265f, 0.000284f, - 0.000299f, 0.000325f, 0.000349f, 0.000381f, 0.000415f, 0.000448f, 0.000490f, 0.000544f, - 0.000612f, 0.000694f, 0.000798f, 0.000943f, 0.001139f, 0.001436f, 0.001870f, 0.002586f, - 0.003817f, 0.006474f, 0.383545f, 0.450195f, 0.467041f, 0.474365f, 0.478760f, 0.482422f, - 0.000065f, 0.000045f, 0.000037f, 0.000033f, 0.000030f, 0.000028f, 0.000026f, 0.000025f, - 0.000024f, 0.000022f, 0.000021f, 0.000025f, 0.000020f, 0.000021f, 0.000025f, 0.000029f, - 0.000028f, 0.000031f, 0.000033f, 0.000034f, 0.000036f, 0.000041f, 0.000045f, 0.000040f, - 0.000045f, 0.000049f, 0.000051f, 0.000048f, 0.000055f, 0.000057f, 0.000061f, 0.000066f, - 0.000072f, 0.000068f, 0.000073f, 0.000078f, 0.000087f, 0.000089f, 0.000097f, 0.000104f, - 0.000113f, 0.000115f, 0.000128f, 0.000137f, 0.000148f, 0.000160f, 0.000174f, 0.000194f, - 0.000221f, 0.000248f, 0.000283f, 0.000324f, 0.000396f, 0.000496f, 0.000657f, 0.000928f, - 0.001479f, 0.002684f, 0.371094f, 0.438477f, 0.455078f, 0.463867f, 0.468750f, 0.471191f, - 0.000029f, 0.000019f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000012f, 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, - 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000007f, 0.000008f, 0.000007f, - 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000011f, 0.000012f, 0.000013f, - 0.000015f, 0.000017f, 0.000018f, 0.000018f, 0.000020f, 0.000019f, 0.000021f, 0.000024f, - 0.000024f, 0.000026f, 0.000028f, 0.000031f, 0.000031f, 0.000035f, 0.000040f, 0.000041f, - 0.000045f, 0.000052f, 0.000059f, 0.000071f, 0.000083f, 0.000099f, 0.000132f, 0.000188f, - 0.000315f, 0.000712f, 0.356934f, 0.426514f, 0.444824f, 0.452637f, 0.457520f, 0.460938f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000006f, - 0.000010f, 0.000027f, 0.343750f, 0.414795f, 0.433105f, 0.441895f, 0.446289f, 0.449951f, - }, - { - 0.012436f, 0.037598f, 0.062805f, 0.087891f, 0.113037f, 0.137329f, 0.161621f, 0.185425f, - 0.209717f, 0.232544f, 0.255371f, 0.278076f, 0.300049f, 0.321289f, 0.343506f, 0.364014f, - 0.385010f, 0.404785f, 0.424561f, 0.444824f, 0.463623f, 0.482422f, 0.501465f, 0.520020f, - 0.537598f, 0.554688f, 0.572266f, 0.589355f, 0.605957f, 0.622070f, 0.639648f, 0.655273f, - 0.670410f, 0.685547f, 0.700684f, 0.715332f, 0.730469f, 0.744629f, 0.758301f, 0.771973f, - 0.785156f, 0.799316f, 0.812012f, 0.825684f, 0.837891f, 0.850586f, 0.863281f, 0.875000f, - 0.887207f, 0.898926f, 0.910156f, 0.921387f, 0.933105f, 0.944336f, 0.954102f, 0.964844f, - 0.976074f, 0.985840f, 0.978027f, 0.947266f, 0.925781f, 0.907715f, 0.892090f, 0.877930f, - 0.011276f, 0.034546f, 0.058289f, 0.082031f, 0.105469f, 0.128662f, 0.152344f, 0.174805f, - 0.197876f, 0.219604f, 0.241455f, 0.263672f, 0.284912f, 0.306152f, 0.326416f, 0.347168f, - 0.366699f, 0.387695f, 0.406494f, 0.426025f, 0.444824f, 0.463379f, 0.481934f, 0.500000f, - 0.518066f, 0.535645f, 0.552246f, 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634766f, - 0.650391f, 0.666016f, 0.681152f, 0.695801f, 0.710938f, 0.725586f, 0.739258f, 0.753906f, - 0.768066f, 0.781250f, 0.794922f, 0.807617f, 0.821289f, 0.833496f, 0.846191f, 0.858398f, - 0.870605f, 0.882812f, 0.894531f, 0.906250f, 0.917480f, 0.929199f, 0.939453f, 0.951660f, - 0.961426f, 0.972656f, 0.971680f, 0.942871f, 0.921875f, 0.904785f, 0.889160f, 0.875977f, - 0.010628f, 0.032288f, 0.054932f, 0.076172f, 0.099060f, 0.121216f, 0.142700f, 0.164795f, - 0.186279f, 0.207642f, 0.229248f, 0.249756f, 0.269531f, 0.291016f, 0.310791f, 0.331543f, - 0.349609f, 0.369385f, 0.388916f, 0.409180f, 0.427246f, 0.444824f, 0.463135f, 0.480713f, - 0.499512f, 0.516602f, 0.533203f, 0.550293f, 0.567383f, 0.583496f, 0.599609f, 0.615723f, - 0.630859f, 0.646973f, 0.661621f, 0.677246f, 0.691895f, 0.705566f, 0.720703f, 0.735352f, - 0.749512f, 0.763184f, 0.776367f, 0.790039f, 0.803223f, 0.816406f, 0.828613f, 0.842285f, - 0.854492f, 0.867676f, 0.878418f, 0.890137f, 0.902832f, 0.913086f, 0.925293f, 0.936035f, - 0.947754f, 0.958008f, 0.964844f, 0.937500f, 0.917480f, 0.901367f, 0.886719f, 0.873535f, - 0.009926f, 0.030167f, 0.050995f, 0.071594f, 0.092346f, 0.113892f, 0.134399f, 0.154663f, - 0.175537f, 0.195679f, 0.216309f, 0.235840f, 0.256104f, 0.276611f, 0.295654f, 0.314453f, - 0.333496f, 0.353027f, 0.370850f, 0.389404f, 0.408936f, 0.427490f, 0.445312f, 0.462891f, - 0.480225f, 0.497803f, 0.513672f, 0.531250f, 0.547363f, 0.563965f, 0.580078f, 0.597168f, - 0.612305f, 0.627930f, 0.642578f, 0.658691f, 0.673340f, 0.687500f, 0.702637f, 0.717285f, - 0.731445f, 0.744629f, 0.758301f, 0.772461f, 0.786133f, 0.799316f, 0.811523f, 0.824707f, - 0.837891f, 0.849121f, 0.861816f, 0.874023f, 0.887207f, 0.898438f, 0.910156f, 0.920898f, - 0.932617f, 0.943848f, 0.958008f, 0.932129f, 0.913086f, 0.897461f, 0.883301f, 0.871094f, - 0.009178f, 0.028107f, 0.047729f, 0.066895f, 0.086182f, 0.106384f, 0.125977f, 0.145386f, - 0.165527f, 0.184937f, 0.203857f, 0.224121f, 0.242676f, 0.261475f, 0.281006f, 0.300049f, - 0.318604f, 0.336426f, 0.355469f, 0.372314f, 0.391113f, 0.409424f, 0.426514f, 0.444092f, - 0.461426f, 0.477783f, 0.495850f, 0.512207f, 0.528809f, 0.544434f, 0.561035f, 0.576660f, - 0.593262f, 0.608398f, 0.623047f, 0.638184f, 0.655273f, 0.668945f, 0.682617f, 0.697754f, - 0.712402f, 0.726562f, 0.740234f, 0.753906f, 0.768066f, 0.781250f, 0.794434f, 0.807617f, - 0.820312f, 0.833496f, 0.845215f, 0.858398f, 0.870605f, 0.881836f, 0.894043f, 0.906738f, - 0.917480f, 0.928711f, 0.951172f, 0.926758f, 0.909180f, 0.893555f, 0.880859f, 0.868164f, - 0.008667f, 0.025986f, 0.044922f, 0.062805f, 0.081421f, 0.099854f, 0.118347f, 0.137085f, - 0.155518f, 0.173828f, 0.193115f, 0.211304f, 0.229858f, 0.248413f, 0.266602f, 0.285400f, - 0.303223f, 0.321045f, 0.339111f, 0.357178f, 0.373779f, 0.391357f, 0.409424f, 0.426270f, - 0.443115f, 0.460449f, 0.476807f, 0.494141f, 0.510254f, 0.526855f, 0.541992f, 0.559082f, - 0.574219f, 0.589355f, 0.605469f, 0.620117f, 0.636230f, 0.649902f, 0.664551f, 0.678711f, - 0.693848f, 0.707031f, 0.723145f, 0.736328f, 0.750977f, 0.762695f, 0.776855f, 0.790039f, - 0.803223f, 0.816406f, 0.828613f, 0.842285f, 0.853516f, 0.866211f, 0.878906f, 0.890625f, - 0.902832f, 0.913574f, 0.944336f, 0.921875f, 0.903809f, 0.889160f, 0.876953f, 0.865234f, - 0.008057f, 0.024658f, 0.041321f, 0.058411f, 0.075989f, 0.093811f, 0.110535f, 0.128784f, - 0.146729f, 0.164307f, 0.182007f, 0.200073f, 0.217773f, 0.234619f, 0.252930f, 0.271240f, - 0.288086f, 0.306152f, 0.322998f, 0.341064f, 0.357910f, 0.374756f, 0.391357f, 0.409180f, - 0.425293f, 0.442383f, 0.458496f, 0.475342f, 0.491455f, 0.507324f, 0.523438f, 0.539551f, - 0.555176f, 0.570312f, 0.585938f, 0.601074f, 0.616699f, 0.631836f, 0.646484f, 0.660645f, - 0.676270f, 0.688477f, 0.704102f, 0.718262f, 0.731445f, 0.745117f, 0.760254f, 0.771484f, - 0.785156f, 0.799316f, 0.812500f, 0.824707f, 0.836914f, 0.850098f, 0.862793f, 0.874512f, - 0.886719f, 0.898438f, 0.937500f, 0.915527f, 0.899414f, 0.885254f, 0.872559f, 0.861816f, - 0.007477f, 0.022919f, 0.038971f, 0.054901f, 0.070801f, 0.087646f, 0.104065f, 0.121155f, - 0.137573f, 0.155029f, 0.171875f, 0.188721f, 0.206177f, 0.222778f, 0.240112f, 0.257080f, - 0.274170f, 0.290283f, 0.308350f, 0.324463f, 0.342041f, 0.358154f, 0.375488f, 0.391113f, - 0.407471f, 0.424561f, 0.440430f, 0.456787f, 0.474121f, 0.489746f, 0.505371f, 0.521484f, - 0.536133f, 0.552246f, 0.565918f, 0.582031f, 0.597168f, 0.613281f, 0.626953f, 0.642578f, - 0.656738f, 0.670898f, 0.684570f, 0.699219f, 0.712891f, 0.727539f, 0.741211f, 0.754395f, - 0.768066f, 0.781738f, 0.794434f, 0.808105f, 0.820312f, 0.833984f, 0.846680f, 0.858887f, - 0.871582f, 0.883301f, 0.930176f, 0.910156f, 0.894043f, 0.880371f, 0.868652f, 0.858398f, - 0.007023f, 0.021240f, 0.036224f, 0.051300f, 0.066467f, 0.082092f, 0.097900f, 0.113892f, - 0.129517f, 0.145752f, 0.161743f, 0.178223f, 0.194702f, 0.210327f, 0.227661f, 0.243408f, - 0.260986f, 0.276855f, 0.292725f, 0.309814f, 0.326172f, 0.342041f, 0.358398f, 0.375732f, - 0.391113f, 0.406982f, 0.422852f, 0.438965f, 0.454590f, 0.471191f, 0.486816f, 0.502441f, - 0.517578f, 0.533203f, 0.548340f, 0.562988f, 0.578613f, 0.593750f, 0.609375f, 0.623535f, - 0.638184f, 0.652832f, 0.666992f, 0.680664f, 0.695312f, 0.708984f, 0.722656f, 0.736816f, - 0.750000f, 0.764160f, 0.777344f, 0.789551f, 0.803223f, 0.816895f, 0.830078f, 0.842773f, - 0.854980f, 0.868652f, 0.922852f, 0.904297f, 0.889160f, 0.875977f, 0.864746f, 0.854492f, - 0.006458f, 0.019913f, 0.033691f, 0.048126f, 0.062744f, 0.077026f, 0.092224f, 0.106567f, - 0.122192f, 0.137207f, 0.152222f, 0.167725f, 0.183838f, 0.199951f, 0.215088f, 0.231323f, - 0.246826f, 0.262695f, 0.279053f, 0.294678f, 0.310547f, 0.326172f, 0.342041f, 0.358887f, - 0.374268f, 0.389893f, 0.405518f, 0.421143f, 0.437012f, 0.452637f, 0.467773f, 0.483643f, - 0.499512f, 0.513672f, 0.529785f, 0.545410f, 0.560059f, 0.575195f, 0.590332f, 0.604980f, - 0.618652f, 0.634277f, 0.648438f, 0.662598f, 0.676270f, 0.690918f, 0.704102f, 0.718750f, - 0.732422f, 0.745605f, 0.760254f, 0.773438f, 0.786621f, 0.801270f, 0.812988f, 0.826172f, - 0.839844f, 0.851562f, 0.915527f, 0.897949f, 0.883789f, 0.871094f, 0.860352f, 0.850586f, - 0.006077f, 0.018921f, 0.031464f, 0.045258f, 0.058411f, 0.072144f, 0.085999f, 0.100220f, - 0.114258f, 0.129028f, 0.143677f, 0.158691f, 0.173584f, 0.188477f, 0.203247f, 0.219238f, - 0.234497f, 0.249634f, 0.264893f, 0.280273f, 0.295410f, 0.310791f, 0.326904f, 0.342285f, - 0.357910f, 0.373535f, 0.388428f, 0.404053f, 0.420166f, 0.435303f, 0.450195f, 0.465332f, - 0.481201f, 0.496338f, 0.511230f, 0.525879f, 0.540527f, 0.556641f, 0.570312f, 0.585938f, - 0.600098f, 0.614746f, 0.629883f, 0.644531f, 0.657715f, 0.672363f, 0.687012f, 0.700684f, - 0.714355f, 0.729004f, 0.742188f, 0.755371f, 0.769531f, 0.782227f, 0.796875f, 0.810059f, - 0.823242f, 0.836426f, 0.907715f, 0.891602f, 0.877930f, 0.866211f, 0.855957f, 0.846680f, - 0.005596f, 0.017654f, 0.029587f, 0.041840f, 0.055115f, 0.067871f, 0.080566f, 0.093994f, - 0.107361f, 0.120911f, 0.134766f, 0.149414f, 0.163452f, 0.177979f, 0.192261f, 0.206787f, - 0.221191f, 0.236816f, 0.250732f, 0.266113f, 0.281250f, 0.295898f, 0.311279f, 0.326904f, - 0.342041f, 0.356201f, 0.371826f, 0.387451f, 0.402344f, 0.417236f, 0.432373f, 0.447266f, - 0.462891f, 0.477539f, 0.492432f, 0.506836f, 0.522949f, 0.536621f, 0.551758f, 0.566895f, - 0.582031f, 0.596191f, 0.610352f, 0.625488f, 0.640625f, 0.653320f, 0.668457f, 0.682617f, - 0.696777f, 0.710449f, 0.724609f, 0.739258f, 0.751465f, 0.765625f, 0.780273f, 0.792480f, - 0.806152f, 0.820801f, 0.899902f, 0.885742f, 0.872070f, 0.861328f, 0.851562f, 0.842285f, - 0.005451f, 0.016479f, 0.028259f, 0.039856f, 0.051331f, 0.063416f, 0.075867f, 0.088196f, - 0.100952f, 0.113770f, 0.126953f, 0.140747f, 0.153564f, 0.167847f, 0.181519f, 0.195679f, - 0.210083f, 0.223633f, 0.237427f, 0.252197f, 0.267334f, 0.281738f, 0.296143f, 0.311035f, - 0.325928f, 0.340332f, 0.355469f, 0.370361f, 0.385010f, 0.400635f, 0.415039f, 0.429688f, - 0.444092f, 0.459717f, 0.474121f, 0.489258f, 0.503906f, 0.519043f, 0.533203f, 0.548828f, - 0.562012f, 0.577637f, 0.591797f, 0.606445f, 0.621582f, 0.635742f, 0.650391f, 0.664551f, - 0.678223f, 0.692871f, 0.706055f, 0.721191f, 0.733887f, 0.747559f, 0.762207f, 0.775879f, - 0.791016f, 0.804199f, 0.892090f, 0.878906f, 0.866699f, 0.855957f, 0.846191f, 0.837891f, - 0.004963f, 0.015343f, 0.026169f, 0.037079f, 0.047943f, 0.059570f, 0.070801f, 0.083008f, - 0.095093f, 0.106750f, 0.119507f, 0.132080f, 0.145142f, 0.158569f, 0.171143f, 0.184692f, - 0.198730f, 0.211792f, 0.225830f, 0.239380f, 0.253662f, 0.267578f, 0.281738f, 0.295898f, - 0.309814f, 0.324219f, 0.340088f, 0.353760f, 0.368164f, 0.383057f, 0.397705f, 0.412842f, - 0.426758f, 0.441406f, 0.456787f, 0.470947f, 0.485352f, 0.500000f, 0.515137f, 0.529785f, - 0.543945f, 0.559082f, 0.572754f, 0.588379f, 0.602539f, 0.616699f, 0.631348f, 0.645996f, - 0.659180f, 0.674805f, 0.689453f, 0.703125f, 0.716797f, 0.729980f, 0.744629f, 0.758789f, - 0.772461f, 0.786621f, 0.883789f, 0.872070f, 0.860840f, 0.850586f, 0.841309f, 0.833008f, - 0.004726f, 0.014549f, 0.024109f, 0.034668f, 0.044708f, 0.055573f, 0.066467f, 0.077820f, - 0.088928f, 0.100342f, 0.112000f, 0.124390f, 0.136230f, 0.148804f, 0.161621f, 0.173950f, - 0.186768f, 0.200439f, 0.213623f, 0.226074f, 0.239868f, 0.253418f, 0.267090f, 0.281250f, - 0.295410f, 0.309570f, 0.323486f, 0.337891f, 0.352295f, 0.365967f, 0.381104f, 0.394775f, - 0.409180f, 0.423828f, 0.438477f, 0.452881f, 0.467773f, 0.481689f, 0.496582f, 0.511230f, - 0.525391f, 0.539551f, 0.554199f, 0.568848f, 0.583984f, 0.599121f, 0.612305f, 0.627441f, - 0.641113f, 0.656250f, 0.669922f, 0.684570f, 0.699219f, 0.713379f, 0.727539f, 0.741699f, - 0.755859f, 0.771484f, 0.875488f, 0.865723f, 0.854492f, 0.845215f, 0.836426f, 0.828613f, - 0.004452f, 0.013359f, 0.022690f, 0.032745f, 0.042297f, 0.051910f, 0.061920f, 0.072693f, - 0.083496f, 0.094177f, 0.105408f, 0.116760f, 0.128174f, 0.140137f, 0.151855f, 0.164185f, - 0.176758f, 0.189087f, 0.201660f, 0.214478f, 0.227173f, 0.240356f, 0.253906f, 0.267578f, - 0.280273f, 0.294922f, 0.307373f, 0.321045f, 0.336670f, 0.350098f, 0.363770f, 0.378174f, - 0.392334f, 0.406006f, 0.420410f, 0.434082f, 0.448975f, 0.463623f, 0.478271f, 0.492676f, - 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565430f, 0.580078f, 0.593750f, 0.608887f, - 0.623047f, 0.638184f, 0.651367f, 0.666016f, 0.681152f, 0.695312f, 0.709473f, 0.723145f, - 0.738281f, 0.752930f, 0.867676f, 0.858398f, 0.848633f, 0.839355f, 0.831055f, 0.823730f, - 0.004143f, 0.012794f, 0.021713f, 0.030396f, 0.039551f, 0.048645f, 0.058563f, 0.068176f, - 0.078308f, 0.088928f, 0.098328f, 0.109924f, 0.120728f, 0.131592f, 0.142944f, 0.154175f, - 0.165771f, 0.178223f, 0.190186f, 0.202881f, 0.214844f, 0.227417f, 0.240845f, 0.253906f, - 0.265869f, 0.279541f, 0.293213f, 0.305908f, 0.320068f, 0.333496f, 0.347168f, 0.361816f, - 0.375000f, 0.389160f, 0.403320f, 0.417236f, 0.431396f, 0.444824f, 0.459473f, 0.473633f, - 0.488525f, 0.503418f, 0.517578f, 0.532227f, 0.545410f, 0.560547f, 0.575684f, 0.590332f, - 0.604004f, 0.618652f, 0.632812f, 0.647949f, 0.663086f, 0.676758f, 0.691895f, 0.706543f, - 0.721191f, 0.735840f, 0.859375f, 0.852539f, 0.842773f, 0.833496f, 0.824707f, 0.818848f, - 0.003839f, 0.012062f, 0.020126f, 0.028366f, 0.036774f, 0.045593f, 0.054718f, 0.063416f, - 0.073120f, 0.082825f, 0.092957f, 0.102966f, 0.113464f, 0.123535f, 0.134277f, 0.145020f, - 0.155762f, 0.167847f, 0.179199f, 0.190796f, 0.202393f, 0.214844f, 0.227417f, 0.239868f, - 0.252197f, 0.264648f, 0.277588f, 0.291016f, 0.304199f, 0.317383f, 0.330811f, 0.343750f, - 0.357422f, 0.371826f, 0.385254f, 0.399902f, 0.413574f, 0.427246f, 0.441162f, 0.455566f, - 0.469971f, 0.484375f, 0.498535f, 0.514160f, 0.527344f, 0.541992f, 0.556152f, 0.570312f, - 0.585449f, 0.600098f, 0.614746f, 0.629883f, 0.645508f, 0.658203f, 0.673340f, 0.688477f, - 0.703125f, 0.718262f, 0.851074f, 0.844727f, 0.835938f, 0.827637f, 0.820312f, 0.812988f, - 0.003786f, 0.011147f, 0.018921f, 0.026550f, 0.034729f, 0.042664f, 0.051117f, 0.060028f, - 0.068298f, 0.077454f, 0.086914f, 0.096130f, 0.105835f, 0.115662f, 0.126343f, 0.136475f, - 0.146606f, 0.157715f, 0.168457f, 0.180176f, 0.191528f, 0.202759f, 0.215088f, 0.226929f, - 0.239014f, 0.251221f, 0.263428f, 0.275391f, 0.289062f, 0.301514f, 0.314941f, 0.328369f, - 0.341797f, 0.354736f, 0.367676f, 0.382324f, 0.395264f, 0.409912f, 0.423340f, 0.437012f, - 0.451660f, 0.465576f, 0.480469f, 0.494629f, 0.508301f, 0.522949f, 0.538086f, 0.551758f, - 0.567383f, 0.582031f, 0.596191f, 0.610840f, 0.625977f, 0.639648f, 0.655273f, 0.670410f, - 0.685547f, 0.700684f, 0.842285f, 0.837402f, 0.829590f, 0.821289f, 0.813965f, 0.808105f, - 0.003504f, 0.010445f, 0.017609f, 0.025131f, 0.032349f, 0.040314f, 0.047485f, 0.055756f, - 0.064026f, 0.072571f, 0.080872f, 0.089661f, 0.099426f, 0.108459f, 0.118286f, 0.127930f, - 0.137817f, 0.147583f, 0.158203f, 0.169189f, 0.180908f, 0.191040f, 0.203003f, 0.214111f, - 0.225708f, 0.237549f, 0.249023f, 0.261475f, 0.273926f, 0.286865f, 0.299316f, 0.311768f, - 0.325684f, 0.338623f, 0.351562f, 0.364746f, 0.378418f, 0.392578f, 0.405518f, 0.419678f, - 0.433105f, 0.447998f, 0.461670f, 0.475830f, 0.490479f, 0.503906f, 0.519531f, 0.533203f, - 0.547852f, 0.562988f, 0.576660f, 0.591797f, 0.606445f, 0.622070f, 0.636719f, 0.652344f, - 0.666504f, 0.682617f, 0.833496f, 0.830078f, 0.822754f, 0.815918f, 0.808594f, 0.802734f, - 0.003447f, 0.009941f, 0.016373f, 0.023300f, 0.030228f, 0.037689f, 0.044128f, 0.052551f, - 0.059845f, 0.068115f, 0.076538f, 0.083862f, 0.092896f, 0.101440f, 0.110596f, 0.119995f, - 0.129028f, 0.138916f, 0.148926f, 0.158936f, 0.169189f, 0.180176f, 0.190308f, 0.201416f, - 0.212769f, 0.224365f, 0.235962f, 0.247192f, 0.259033f, 0.271973f, 0.283936f, 0.296631f, - 0.309570f, 0.321777f, 0.334961f, 0.348389f, 0.361572f, 0.374756f, 0.388184f, 0.401611f, - 0.415771f, 0.429443f, 0.443359f, 0.457520f, 0.471436f, 0.486084f, 0.500977f, 0.514648f, - 0.528809f, 0.543457f, 0.558594f, 0.573242f, 0.588867f, 0.603516f, 0.617676f, 0.633301f, - 0.648926f, 0.664551f, 0.824219f, 0.823242f, 0.815918f, 0.809082f, 0.802246f, 0.796387f, - 0.003141f, 0.009407f, 0.015251f, 0.021851f, 0.028107f, 0.034882f, 0.041779f, 0.048340f, - 0.056244f, 0.062988f, 0.071106f, 0.078796f, 0.087036f, 0.094910f, 0.103149f, 0.112305f, - 0.121460f, 0.130371f, 0.139404f, 0.149048f, 0.159180f, 0.169189f, 0.179565f, 0.189087f, - 0.200317f, 0.211548f, 0.222412f, 0.233765f, 0.245117f, 0.257324f, 0.269043f, 0.281006f, - 0.293213f, 0.305664f, 0.318848f, 0.331055f, 0.343750f, 0.358398f, 0.369873f, 0.384033f, - 0.397217f, 0.411865f, 0.424805f, 0.438965f, 0.453125f, 0.467529f, 0.481689f, 0.495850f, - 0.510254f, 0.524414f, 0.539551f, 0.554688f, 0.569824f, 0.584961f, 0.599121f, 0.614258f, - 0.629883f, 0.645020f, 0.815430f, 0.814453f, 0.809570f, 0.802734f, 0.796875f, 0.791504f, - 0.002838f, 0.008461f, 0.014236f, 0.020676f, 0.026749f, 0.032593f, 0.039032f, 0.045715f, - 0.052216f, 0.059479f, 0.066467f, 0.073608f, 0.080933f, 0.088623f, 0.096619f, 0.104919f, - 0.113098f, 0.121521f, 0.130493f, 0.139526f, 0.148560f, 0.158203f, 0.167969f, 0.177979f, - 0.187988f, 0.198730f, 0.208862f, 0.220093f, 0.231323f, 0.242798f, 0.253906f, 0.265869f, - 0.278320f, 0.289551f, 0.302246f, 0.314941f, 0.327393f, 0.340088f, 0.353516f, 0.365967f, - 0.379883f, 0.392822f, 0.406738f, 0.420898f, 0.434814f, 0.447998f, 0.462891f, 0.477539f, - 0.491455f, 0.506836f, 0.520996f, 0.536133f, 0.550781f, 0.565918f, 0.581055f, 0.596680f, - 0.611816f, 0.627441f, 0.806152f, 0.807617f, 0.801270f, 0.796387f, 0.790039f, 0.784668f, - 0.002689f, 0.008102f, 0.013618f, 0.019058f, 0.024719f, 0.030548f, 0.036560f, 0.042725f, - 0.048615f, 0.054779f, 0.061615f, 0.068604f, 0.075012f, 0.082703f, 0.090271f, 0.097900f, - 0.105530f, 0.113586f, 0.121826f, 0.130371f, 0.139282f, 0.147705f, 0.157349f, 0.166504f, - 0.176147f, 0.186401f, 0.196289f, 0.207520f, 0.217651f, 0.228394f, 0.239868f, 0.251465f, - 0.262451f, 0.274414f, 0.286377f, 0.298828f, 0.311035f, 0.323730f, 0.336670f, 0.349121f, - 0.362549f, 0.375244f, 0.389160f, 0.402344f, 0.417236f, 0.429932f, 0.443848f, 0.458984f, - 0.472168f, 0.487793f, 0.501953f, 0.517578f, 0.531738f, 0.546875f, 0.561523f, 0.576660f, - 0.593262f, 0.608398f, 0.797852f, 0.798828f, 0.794922f, 0.789551f, 0.784668f, 0.779297f, - 0.002666f, 0.007462f, 0.012596f, 0.018066f, 0.023026f, 0.028412f, 0.033813f, 0.039398f, - 0.045166f, 0.051239f, 0.057587f, 0.063721f, 0.070312f, 0.077148f, 0.084167f, 0.090820f, - 0.098267f, 0.105591f, 0.113159f, 0.121460f, 0.129761f, 0.138428f, 0.147217f, 0.156128f, - 0.165283f, 0.174438f, 0.183960f, 0.194092f, 0.204834f, 0.214844f, 0.225830f, 0.236816f, - 0.247925f, 0.259033f, 0.270752f, 0.282227f, 0.294678f, 0.306641f, 0.319336f, 0.332031f, - 0.344482f, 0.357910f, 0.371094f, 0.384033f, 0.398682f, 0.412109f, 0.425781f, 0.440186f, - 0.454102f, 0.468018f, 0.482910f, 0.497314f, 0.512207f, 0.528320f, 0.542969f, 0.558594f, - 0.573242f, 0.589355f, 0.787598f, 0.791016f, 0.787109f, 0.781738f, 0.777344f, 0.772461f, - 0.002569f, 0.007069f, 0.012199f, 0.016739f, 0.021393f, 0.026672f, 0.031189f, 0.037109f, - 0.042480f, 0.047729f, 0.053345f, 0.059387f, 0.065430f, 0.071838f, 0.078186f, 0.084167f, - 0.091492f, 0.098816f, 0.105774f, 0.112976f, 0.121155f, 0.129028f, 0.136963f, 0.145508f, - 0.153687f, 0.163086f, 0.172363f, 0.181885f, 0.191406f, 0.201782f, 0.211670f, 0.222412f, - 0.233032f, 0.244263f, 0.255371f, 0.266846f, 0.278809f, 0.290527f, 0.302734f, 0.314697f, - 0.327393f, 0.340820f, 0.353027f, 0.366455f, 0.380127f, 0.393799f, 0.406006f, 0.421143f, - 0.435059f, 0.449707f, 0.463623f, 0.479248f, 0.494141f, 0.509277f, 0.523438f, 0.539551f, - 0.555176f, 0.570801f, 0.778320f, 0.783203f, 0.779785f, 0.775879f, 0.770996f, 0.767090f, - 0.002398f, 0.006733f, 0.010918f, 0.015495f, 0.020203f, 0.024963f, 0.029663f, 0.034485f, - 0.039246f, 0.044678f, 0.049896f, 0.055267f, 0.060486f, 0.066345f, 0.072693f, 0.078857f, - 0.085083f, 0.091370f, 0.097961f, 0.105530f, 0.112244f, 0.119629f, 0.127563f, 0.135376f, - 0.143799f, 0.152100f, 0.160889f, 0.169922f, 0.178833f, 0.188843f, 0.198608f, 0.208496f, - 0.218628f, 0.229492f, 0.240479f, 0.251953f, 0.262695f, 0.274902f, 0.286377f, 0.298340f, - 0.310547f, 0.323242f, 0.335693f, 0.349365f, 0.362061f, 0.375000f, 0.388916f, 0.402832f, - 0.416748f, 0.430420f, 0.445068f, 0.459473f, 0.474854f, 0.489258f, 0.504883f, 0.519531f, - 0.535645f, 0.551758f, 0.769043f, 0.774902f, 0.771973f, 0.768555f, 0.764160f, 0.759766f, - 0.002062f, 0.006191f, 0.010384f, 0.014786f, 0.018402f, 0.023270f, 0.027435f, 0.031891f, - 0.036163f, 0.041199f, 0.045685f, 0.051208f, 0.056244f, 0.061371f, 0.066772f, 0.072510f, - 0.078369f, 0.084656f, 0.091125f, 0.097290f, 0.104309f, 0.111145f, 0.118164f, 0.126221f, - 0.133301f, 0.141724f, 0.149658f, 0.157837f, 0.167236f, 0.176025f, 0.185547f, 0.195190f, - 0.205444f, 0.215332f, 0.225830f, 0.236084f, 0.247314f, 0.259033f, 0.270020f, 0.281982f, - 0.293701f, 0.305908f, 0.318848f, 0.331787f, 0.344482f, 0.357178f, 0.370361f, 0.384521f, - 0.397461f, 0.411621f, 0.426025f, 0.440674f, 0.455322f, 0.470703f, 0.485596f, 0.500977f, - 0.517578f, 0.532227f, 0.759277f, 0.766602f, 0.764160f, 0.761230f, 0.757324f, 0.753418f, - 0.002064f, 0.005859f, 0.009613f, 0.013626f, 0.017456f, 0.021606f, 0.025574f, 0.029526f, - 0.034302f, 0.038422f, 0.042938f, 0.047485f, 0.052155f, 0.056763f, 0.061951f, 0.067139f, - 0.072754f, 0.078308f, 0.084167f, 0.090149f, 0.096191f, 0.102722f, 0.109558f, 0.116699f, - 0.123901f, 0.131104f, 0.139160f, 0.146729f, 0.155273f, 0.163940f, 0.173096f, 0.182129f, - 0.192017f, 0.201172f, 0.211060f, 0.221558f, 0.232544f, 0.243530f, 0.254150f, 0.266113f, - 0.277588f, 0.289307f, 0.301758f, 0.313965f, 0.326904f, 0.338867f, 0.352051f, 0.366211f, - 0.379150f, 0.393066f, 0.407471f, 0.421875f, 0.436768f, 0.450439f, 0.466553f, 0.481201f, - 0.497314f, 0.513184f, 0.749512f, 0.758301f, 0.756348f, 0.753906f, 0.750000f, 0.746582f, - 0.001851f, 0.005405f, 0.009109f, 0.012589f, 0.016129f, 0.020020f, 0.023926f, 0.027481f, - 0.031738f, 0.035492f, 0.039734f, 0.044128f, 0.048065f, 0.052765f, 0.057373f, 0.061859f, - 0.066711f, 0.072388f, 0.077393f, 0.083130f, 0.088745f, 0.094727f, 0.101135f, 0.107666f, - 0.114380f, 0.121704f, 0.128540f, 0.136108f, 0.144043f, 0.151733f, 0.160522f, 0.169678f, - 0.178589f, 0.187622f, 0.197998f, 0.207397f, 0.217285f, 0.227905f, 0.238892f, 0.250000f, - 0.261230f, 0.272461f, 0.284180f, 0.296387f, 0.308838f, 0.321533f, 0.334473f, 0.347656f, - 0.361328f, 0.375000f, 0.388672f, 0.402588f, 0.417969f, 0.432617f, 0.447021f, 0.461914f, - 0.478516f, 0.493652f, 0.739258f, 0.749512f, 0.749023f, 0.745605f, 0.742188f, 0.739746f, - 0.001666f, 0.005405f, 0.008575f, 0.011696f, 0.015327f, 0.018646f, 0.022293f, 0.025650f, - 0.029327f, 0.032776f, 0.036530f, 0.040619f, 0.044128f, 0.048828f, 0.052887f, 0.057098f, - 0.061829f, 0.066467f, 0.071350f, 0.076355f, 0.081909f, 0.087341f, 0.092896f, 0.099304f, - 0.105469f, 0.112000f, 0.118835f, 0.125977f, 0.133545f, 0.140991f, 0.148438f, 0.156982f, - 0.165771f, 0.174805f, 0.183960f, 0.193115f, 0.203369f, 0.212891f, 0.223389f, 0.234497f, - 0.244751f, 0.256348f, 0.268066f, 0.279541f, 0.291260f, 0.303955f, 0.316406f, 0.329590f, - 0.342529f, 0.355957f, 0.369385f, 0.384766f, 0.398926f, 0.413330f, 0.428467f, 0.442383f, - 0.458740f, 0.474609f, 0.728516f, 0.740723f, 0.740234f, 0.738281f, 0.735352f, 0.732910f, - 0.001534f, 0.004936f, 0.007980f, 0.011223f, 0.013893f, 0.017212f, 0.020294f, 0.023361f, - 0.026688f, 0.030182f, 0.033600f, 0.037537f, 0.040924f, 0.044495f, 0.048340f, 0.052155f, - 0.056732f, 0.061035f, 0.065430f, 0.069824f, 0.075073f, 0.080078f, 0.085571f, 0.091003f, - 0.096863f, 0.103271f, 0.109009f, 0.115723f, 0.123230f, 0.129639f, 0.137207f, 0.145264f, - 0.153320f, 0.161499f, 0.170410f, 0.179688f, 0.189087f, 0.198364f, 0.208740f, 0.218750f, - 0.229126f, 0.240356f, 0.251465f, 0.263184f, 0.274902f, 0.286621f, 0.299072f, 0.311768f, - 0.324463f, 0.337402f, 0.351074f, 0.364746f, 0.378662f, 0.394287f, 0.408936f, 0.423096f, - 0.439453f, 0.455322f, 0.716797f, 0.731934f, 0.732422f, 0.729980f, 0.728027f, 0.725586f, - 0.001639f, 0.004337f, 0.007439f, 0.009888f, 0.013092f, 0.015717f, 0.018921f, 0.021805f, - 0.024612f, 0.027542f, 0.030762f, 0.034088f, 0.037598f, 0.041107f, 0.044189f, 0.047699f, - 0.051666f, 0.055664f, 0.059723f, 0.064148f, 0.068542f, 0.073425f, 0.078003f, 0.083435f, - 0.088806f, 0.094360f, 0.100159f, 0.106079f, 0.112915f, 0.119690f, 0.125977f, 0.133667f, - 0.141357f, 0.149414f, 0.157349f, 0.166260f, 0.175049f, 0.184326f, 0.193970f, 0.203735f, - 0.214355f, 0.224609f, 0.235352f, 0.246460f, 0.257568f, 0.269287f, 0.281738f, 0.294189f, - 0.305908f, 0.319824f, 0.332520f, 0.346680f, 0.360596f, 0.375244f, 0.389648f, 0.404297f, - 0.419189f, 0.435791f, 0.707520f, 0.723145f, 0.723633f, 0.722656f, 0.720703f, 0.717773f, - 0.001469f, 0.004345f, 0.006844f, 0.009483f, 0.012428f, 0.014679f, 0.017166f, 0.019989f, - 0.022949f, 0.025574f, 0.028320f, 0.031525f, 0.034088f, 0.037323f, 0.040710f, 0.043762f, - 0.047119f, 0.050873f, 0.054352f, 0.058441f, 0.062561f, 0.066711f, 0.071167f, 0.075989f, - 0.080627f, 0.086426f, 0.091553f, 0.097473f, 0.103210f, 0.109680f, 0.115723f, 0.122986f, - 0.129761f, 0.137451f, 0.145142f, 0.153198f, 0.161621f, 0.170654f, 0.179688f, 0.189087f, - 0.198730f, 0.209229f, 0.219604f, 0.230225f, 0.241211f, 0.252197f, 0.264404f, 0.276367f, - 0.288574f, 0.301270f, 0.314453f, 0.328125f, 0.341309f, 0.354980f, 0.370117f, 0.385498f, - 0.399902f, 0.415771f, 0.696289f, 0.714355f, 0.715820f, 0.714355f, 0.712891f, 0.710449f, - 0.001227f, 0.003862f, 0.006245f, 0.008644f, 0.010796f, 0.013344f, 0.015823f, 0.018448f, - 0.020645f, 0.023331f, 0.025681f, 0.028305f, 0.030975f, 0.033722f, 0.036987f, 0.039673f, - 0.043121f, 0.046112f, 0.049774f, 0.053406f, 0.056854f, 0.060760f, 0.064697f, 0.069397f, - 0.073364f, 0.078369f, 0.083313f, 0.088257f, 0.094116f, 0.100098f, 0.105957f, 0.112122f, - 0.118774f, 0.125854f, 0.133057f, 0.140869f, 0.148682f, 0.157227f, 0.165405f, 0.174927f, - 0.184082f, 0.193726f, 0.204102f, 0.214111f, 0.225098f, 0.236328f, 0.247314f, 0.259277f, - 0.270752f, 0.282959f, 0.296143f, 0.309082f, 0.322510f, 0.336426f, 0.350830f, 0.365479f, - 0.380371f, 0.396240f, 0.684570f, 0.705078f, 0.706543f, 0.706543f, 0.705078f, 0.703125f, - 0.001069f, 0.003525f, 0.006062f, 0.008286f, 0.010178f, 0.012589f, 0.014542f, 0.017075f, - 0.019241f, 0.021179f, 0.023499f, 0.026047f, 0.028137f, 0.030762f, 0.033417f, 0.035889f, - 0.038757f, 0.041779f, 0.044586f, 0.048309f, 0.051056f, 0.054810f, 0.058777f, 0.062347f, - 0.066528f, 0.070740f, 0.075256f, 0.080261f, 0.085205f, 0.090393f, 0.095886f, 0.102478f, - 0.108154f, 0.114441f, 0.121399f, 0.128784f, 0.135742f, 0.144165f, 0.151978f, 0.160767f, - 0.169434f, 0.178833f, 0.188721f, 0.198608f, 0.208984f, 0.220215f, 0.230957f, 0.241943f, - 0.253906f, 0.265869f, 0.278564f, 0.291260f, 0.304443f, 0.318359f, 0.332031f, 0.346680f, - 0.361572f, 0.377197f, 0.673828f, 0.695801f, 0.698242f, 0.697754f, 0.697266f, 0.695312f, - 0.001211f, 0.003250f, 0.005112f, 0.007195f, 0.009651f, 0.011414f, 0.013641f, 0.015205f, - 0.017334f, 0.019608f, 0.021164f, 0.023712f, 0.025726f, 0.027863f, 0.029984f, 0.032410f, - 0.035034f, 0.037689f, 0.040466f, 0.042938f, 0.046478f, 0.049591f, 0.052856f, 0.056274f, - 0.060089f, 0.063721f, 0.068115f, 0.072266f, 0.076904f, 0.081970f, 0.087036f, 0.092285f, - 0.097961f, 0.104309f, 0.110535f, 0.117126f, 0.124084f, 0.131226f, 0.139038f, 0.147095f, - 0.155884f, 0.164429f, 0.174194f, 0.183228f, 0.192749f, 0.203491f, 0.214233f, 0.224976f, - 0.236206f, 0.247925f, 0.260498f, 0.272705f, 0.285889f, 0.299805f, 0.312988f, 0.327637f, - 0.342529f, 0.356934f, 0.662598f, 0.686523f, 0.689453f, 0.689453f, 0.688965f, 0.687500f, - 0.001138f, 0.003206f, 0.005180f, 0.007309f, 0.008377f, 0.010635f, 0.012352f, 0.014153f, - 0.015640f, 0.017487f, 0.019272f, 0.021164f, 0.023026f, 0.025314f, 0.027222f, 0.029282f, - 0.031433f, 0.033600f, 0.036041f, 0.038788f, 0.041626f, 0.044281f, 0.047455f, 0.050507f, - 0.054047f, 0.057556f, 0.061188f, 0.065063f, 0.069214f, 0.073486f, 0.078369f, 0.083191f, - 0.088196f, 0.093811f, 0.099609f, 0.106018f, 0.112305f, 0.119385f, 0.126343f, 0.134033f, - 0.142090f, 0.150635f, 0.159546f, 0.168579f, 0.177734f, 0.187500f, 0.198242f, 0.208618f, - 0.219604f, 0.231812f, 0.242188f, 0.254883f, 0.267578f, 0.281494f, 0.294434f, 0.308350f, - 0.322998f, 0.338379f, 0.651367f, 0.676758f, 0.681152f, 0.680664f, 0.680664f, 0.679688f, - 0.000977f, 0.002806f, 0.004559f, 0.006176f, 0.008034f, 0.009476f, 0.011131f, 0.012741f, - 0.014275f, 0.015732f, 0.017334f, 0.019104f, 0.020767f, 0.022293f, 0.024323f, 0.026016f, - 0.028198f, 0.030197f, 0.032257f, 0.034515f, 0.036957f, 0.039856f, 0.042084f, 0.044891f, - 0.047791f, 0.051147f, 0.054535f, 0.058197f, 0.061768f, 0.065674f, 0.069946f, 0.074585f, - 0.079102f, 0.084412f, 0.089600f, 0.095398f, 0.101196f, 0.107544f, 0.114258f, 0.121094f, - 0.128662f, 0.137085f, 0.145020f, 0.153687f, 0.162720f, 0.172607f, 0.182129f, 0.192749f, - 0.203125f, 0.214111f, 0.226074f, 0.237671f, 0.249878f, 0.262207f, 0.275635f, 0.289551f, - 0.304199f, 0.318848f, 0.639160f, 0.666992f, 0.671387f, 0.671875f, 0.671875f, 0.671387f, - 0.000968f, 0.002722f, 0.004318f, 0.005634f, 0.007393f, 0.008667f, 0.010139f, 0.011383f, - 0.012856f, 0.014389f, 0.015427f, 0.016907f, 0.018387f, 0.020081f, 0.021683f, 0.023315f, - 0.025085f, 0.026840f, 0.028641f, 0.030624f, 0.032837f, 0.035065f, 0.037445f, 0.039948f, - 0.042542f, 0.045410f, 0.048340f, 0.051514f, 0.054840f, 0.058502f, 0.062408f, 0.066223f, - 0.070679f, 0.075134f, 0.080078f, 0.085388f, 0.090515f, 0.096436f, 0.102722f, 0.109314f, - 0.116333f, 0.123352f, 0.131592f, 0.139526f, 0.147949f, 0.156860f, 0.166748f, 0.176758f, - 0.187134f, 0.197632f, 0.209106f, 0.220337f, 0.232666f, 0.244751f, 0.257568f, 0.270996f, - 0.284912f, 0.300537f, 0.627441f, 0.657227f, 0.662598f, 0.663574f, 0.663574f, 0.663086f, - 0.001081f, 0.002466f, 0.003862f, 0.005348f, 0.006447f, 0.007927f, 0.009018f, 0.010490f, - 0.011436f, 0.012627f, 0.013916f, 0.015015f, 0.016449f, 0.017563f, 0.019165f, 0.020706f, - 0.021973f, 0.023834f, 0.025467f, 0.027130f, 0.029175f, 0.030991f, 0.033081f, 0.035156f, - 0.037384f, 0.040039f, 0.042603f, 0.045502f, 0.048492f, 0.051636f, 0.054962f, 0.058716f, - 0.062439f, 0.066467f, 0.071045f, 0.075378f, 0.080811f, 0.085815f, 0.091492f, 0.098022f, - 0.103943f, 0.111023f, 0.118164f, 0.125732f, 0.133911f, 0.142456f, 0.151367f, 0.161011f, - 0.170898f, 0.181396f, 0.192139f, 0.203247f, 0.214844f, 0.227173f, 0.239380f, 0.252441f, - 0.266602f, 0.281006f, 0.616699f, 0.647949f, 0.653320f, 0.655273f, 0.654785f, 0.655273f, - 0.000735f, 0.002331f, 0.003601f, 0.005005f, 0.005825f, 0.007061f, 0.008049f, 0.009148f, - 0.010315f, 0.011131f, 0.012230f, 0.013367f, 0.014328f, 0.015541f, 0.016968f, 0.018234f, - 0.019257f, 0.020798f, 0.022202f, 0.023666f, 0.025452f, 0.027115f, 0.028885f, 0.030792f, - 0.032715f, 0.035034f, 0.037323f, 0.039825f, 0.042419f, 0.045258f, 0.048157f, 0.051422f, - 0.054810f, 0.058411f, 0.062378f, 0.066528f, 0.071106f, 0.076233f, 0.081116f, 0.086853f, - 0.092407f, 0.098938f, 0.105469f, 0.112854f, 0.120361f, 0.128418f, 0.136841f, 0.145752f, - 0.155273f, 0.165283f, 0.175537f, 0.186646f, 0.197510f, 0.209473f, 0.221558f, 0.234619f, - 0.248047f, 0.261719f, 0.603516f, 0.636719f, 0.644531f, 0.645020f, 0.645508f, 0.646484f, - 0.000837f, 0.002073f, 0.003357f, 0.004292f, 0.005409f, 0.006271f, 0.007271f, 0.007973f, - 0.008873f, 0.009956f, 0.010811f, 0.012032f, 0.012848f, 0.013664f, 0.014870f, 0.015839f, - 0.017090f, 0.018280f, 0.019333f, 0.020691f, 0.022186f, 0.023453f, 0.025223f, 0.026779f, - 0.028595f, 0.030441f, 0.032410f, 0.034729f, 0.036743f, 0.039307f, 0.042023f, 0.044434f, - 0.047791f, 0.050781f, 0.054413f, 0.058075f, 0.061951f, 0.066711f, 0.071106f, 0.076355f, - 0.081848f, 0.087341f, 0.093872f, 0.099854f, 0.107483f, 0.114441f, 0.122925f, 0.131104f, - 0.140381f, 0.149414f, 0.159180f, 0.170166f, 0.181152f, 0.192139f, 0.204468f, 0.216553f, - 0.230103f, 0.244507f, 0.592773f, 0.626953f, 0.635254f, 0.637207f, 0.636719f, 0.637695f, - 0.000524f, 0.001863f, 0.003014f, 0.003777f, 0.004852f, 0.005516f, 0.006428f, 0.007111f, - 0.008095f, 0.008888f, 0.009476f, 0.010345f, 0.011063f, 0.012016f, 0.012810f, 0.013786f, - 0.014648f, 0.015717f, 0.016891f, 0.017929f, 0.019150f, 0.020401f, 0.021606f, 0.023193f, - 0.024597f, 0.026276f, 0.027939f, 0.029770f, 0.031738f, 0.033936f, 0.036194f, 0.038574f, - 0.041107f, 0.043945f, 0.047180f, 0.050385f, 0.054291f, 0.057770f, 0.061981f, 0.066345f, - 0.071167f, 0.076355f, 0.082153f, 0.088074f, 0.094666f, 0.101685f, 0.109131f, 0.117249f, - 0.125610f, 0.134399f, 0.143921f, 0.154175f, 0.164795f, 0.175659f, 0.187256f, 0.199341f, - 0.211670f, 0.225464f, 0.580078f, 0.617676f, 0.625000f, 0.627930f, 0.628906f, 0.628906f, - 0.000657f, 0.001829f, 0.002909f, 0.003525f, 0.004295f, 0.005051f, 0.005592f, 0.006123f, - 0.006920f, 0.007553f, 0.008339f, 0.008888f, 0.009689f, 0.010262f, 0.011017f, 0.011848f, - 0.012634f, 0.013489f, 0.014572f, 0.015427f, 0.016449f, 0.017426f, 0.018539f, 0.019852f, - 0.021133f, 0.022507f, 0.023834f, 0.025375f, 0.027084f, 0.028976f, 0.030792f, 0.032959f, - 0.035400f, 0.037720f, 0.040405f, 0.043243f, 0.046356f, 0.049530f, 0.053314f, 0.057190f, - 0.061554f, 0.066223f, 0.071472f, 0.076782f, 0.082825f, 0.089417f, 0.096191f, 0.103210f, - 0.111633f, 0.119934f, 0.128662f, 0.138550f, 0.148315f, 0.158813f, 0.170288f, 0.182373f, - 0.194458f, 0.207642f, 0.567383f, 0.606445f, 0.615234f, 0.619141f, 0.620117f, 0.620117f, - 0.000584f, 0.001548f, 0.002333f, 0.003086f, 0.003660f, 0.004303f, 0.005020f, 0.005543f, - 0.006042f, 0.006538f, 0.007118f, 0.007641f, 0.008301f, 0.008919f, 0.009499f, 0.010147f, - 0.010918f, 0.011414f, 0.012222f, 0.013084f, 0.013901f, 0.014954f, 0.015671f, 0.016724f, - 0.017914f, 0.019012f, 0.020325f, 0.021698f, 0.022949f, 0.024445f, 0.026215f, 0.027954f, - 0.029755f, 0.032043f, 0.034210f, 0.036591f, 0.039215f, 0.042297f, 0.045441f, 0.048676f, - 0.052612f, 0.056580f, 0.061432f, 0.066040f, 0.071350f, 0.077332f, 0.083496f, 0.090393f, - 0.097717f, 0.105835f, 0.114380f, 0.123413f, 0.133301f, 0.143066f, 0.153931f, 0.165039f, - 0.177124f, 0.190308f, 0.555176f, 0.597656f, 0.604980f, 0.609375f, 0.609863f, 0.611328f, - 0.000438f, 0.001456f, 0.001925f, 0.002811f, 0.003246f, 0.003731f, 0.004108f, 0.004669f, - 0.005344f, 0.005535f, 0.005913f, 0.006641f, 0.007038f, 0.007473f, 0.008049f, 0.008675f, - 0.009361f, 0.009689f, 0.010513f, 0.011032f, 0.011894f, 0.012695f, 0.013390f, 0.014183f, - 0.015114f, 0.016037f, 0.016998f, 0.018280f, 0.019272f, 0.020645f, 0.022003f, 0.023361f, - 0.024796f, 0.026779f, 0.028656f, 0.030685f, 0.032928f, 0.035370f, 0.038147f, 0.040955f, - 0.044403f, 0.047821f, 0.052032f, 0.056183f, 0.060974f, 0.066162f, 0.071777f, 0.078125f, - 0.084656f, 0.092102f, 0.100159f, 0.109009f, 0.117981f, 0.127563f, 0.138306f, 0.148804f, - 0.160645f, 0.173218f, 0.542969f, 0.586914f, 0.594727f, 0.599609f, 0.601074f, 0.601074f, - 0.000520f, 0.001104f, 0.001921f, 0.002256f, 0.002886f, 0.003389f, 0.003689f, 0.004063f, - 0.004440f, 0.004829f, 0.005230f, 0.005466f, 0.005966f, 0.006332f, 0.006786f, 0.007347f, - 0.007835f, 0.008232f, 0.008812f, 0.009216f, 0.009865f, 0.010490f, 0.011124f, 0.011803f, - 0.012573f, 0.013390f, 0.014275f, 0.015121f, 0.016144f, 0.016953f, 0.018234f, 0.019257f, - 0.020782f, 0.022064f, 0.023743f, 0.025360f, 0.027176f, 0.029327f, 0.031616f, 0.034058f, - 0.036957f, 0.039917f, 0.043182f, 0.047272f, 0.051025f, 0.055695f, 0.060913f, 0.066345f, - 0.072693f, 0.079285f, 0.086548f, 0.094543f, 0.103271f, 0.112793f, 0.122864f, 0.132812f, - 0.144531f, 0.156616f, 0.530273f, 0.576660f, 0.585449f, 0.590332f, 0.592285f, 0.593262f, - 0.000366f, 0.001040f, 0.001583f, 0.002129f, 0.002522f, 0.002792f, 0.003012f, 0.003420f, - 0.003630f, 0.003967f, 0.004246f, 0.004623f, 0.005039f, 0.005253f, 0.005627f, 0.006096f, - 0.006447f, 0.006939f, 0.007179f, 0.007710f, 0.008324f, 0.008698f, 0.009247f, 0.009796f, - 0.010414f, 0.011063f, 0.011627f, 0.012543f, 0.013191f, 0.014099f, 0.014938f, 0.015930f, - 0.016983f, 0.018219f, 0.019440f, 0.020813f, 0.022324f, 0.024002f, 0.025818f, 0.027969f, - 0.030289f, 0.032898f, 0.035583f, 0.038727f, 0.042450f, 0.046234f, 0.050781f, 0.055695f, - 0.061157f, 0.067383f, 0.074158f, 0.081360f, 0.089478f, 0.098267f, 0.107788f, 0.117737f, - 0.129028f, 0.140503f, 0.517578f, 0.566406f, 0.575195f, 0.581055f, 0.582520f, 0.584473f, - 0.000482f, 0.001008f, 0.001481f, 0.001818f, 0.002001f, 0.002296f, 0.002569f, 0.002781f, - 0.002998f, 0.003319f, 0.003620f, 0.003828f, 0.004082f, 0.004364f, 0.004658f, 0.004978f, - 0.005257f, 0.005665f, 0.005993f, 0.006340f, 0.006725f, 0.007160f, 0.007576f, 0.008095f, - 0.008522f, 0.008980f, 0.009621f, 0.010170f, 0.010765f, 0.011543f, 0.012161f, 0.013023f, - 0.013840f, 0.014801f, 0.015869f, 0.016861f, 0.018127f, 0.019379f, 0.020859f, 0.022583f, - 0.024261f, 0.026596f, 0.028839f, 0.031555f, 0.034271f, 0.037628f, 0.041504f, 0.045837f, - 0.050598f, 0.056000f, 0.062134f, 0.068726f, 0.076172f, 0.084656f, 0.093567f, 0.103088f, - 0.113586f, 0.125000f, 0.504883f, 0.554688f, 0.565918f, 0.570801f, 0.573242f, 0.574219f, - 0.000400f, 0.000803f, 0.001046f, 0.001427f, 0.001657f, 0.001952f, 0.002033f, 0.002337f, - 0.002453f, 0.002678f, 0.002871f, 0.003120f, 0.003286f, 0.003605f, 0.003817f, 0.004036f, - 0.004299f, 0.004604f, 0.004848f, 0.005142f, 0.005428f, 0.005871f, 0.006107f, 0.006584f, - 0.006908f, 0.007332f, 0.007736f, 0.008186f, 0.008820f, 0.009308f, 0.009964f, 0.010422f, - 0.011200f, 0.011993f, 0.012726f, 0.013512f, 0.014511f, 0.015610f, 0.016724f, 0.017914f, - 0.019440f, 0.021057f, 0.022827f, 0.024933f, 0.027466f, 0.030197f, 0.033295f, 0.036896f, - 0.041077f, 0.045776f, 0.050995f, 0.056976f, 0.063721f, 0.071167f, 0.079773f, 0.089172f, - 0.098633f, 0.109314f, 0.491699f, 0.543457f, 0.555176f, 0.561035f, 0.563477f, 0.565430f, - 0.000279f, 0.000821f, 0.000974f, 0.001161f, 0.001382f, 0.001583f, 0.001670f, 0.001934f, - 0.002064f, 0.002153f, 0.002306f, 0.002544f, 0.002670f, 0.002909f, 0.003052f, 0.003288f, - 0.003429f, 0.003624f, 0.003893f, 0.004082f, 0.004406f, 0.004635f, 0.004925f, 0.005196f, - 0.005444f, 0.005764f, 0.006134f, 0.006546f, 0.006947f, 0.007343f, 0.007858f, 0.008270f, - 0.008858f, 0.009346f, 0.010010f, 0.010757f, 0.011475f, 0.012260f, 0.013206f, 0.014214f, - 0.015236f, 0.016479f, 0.017975f, 0.019623f, 0.021515f, 0.023590f, 0.026062f, 0.028976f, - 0.032471f, 0.036224f, 0.040833f, 0.046082f, 0.052094f, 0.059052f, 0.066650f, 0.075684f, - 0.084778f, 0.094971f, 0.479492f, 0.532715f, 0.545898f, 0.551270f, 0.553711f, 0.555664f, - 0.000253f, 0.000612f, 0.000835f, 0.000998f, 0.001111f, 0.001228f, 0.001334f, 0.001452f, - 0.001619f, 0.001757f, 0.001837f, 0.001920f, 0.002140f, 0.002321f, 0.002453f, 0.002544f, - 0.002670f, 0.002790f, 0.003086f, 0.003260f, 0.003422f, 0.003620f, 0.003893f, 0.004101f, - 0.004326f, 0.004528f, 0.004761f, 0.005051f, 0.005444f, 0.005756f, 0.006065f, 0.006435f, - 0.006882f, 0.007378f, 0.007763f, 0.008286f, 0.008865f, 0.009506f, 0.010162f, 0.011024f, - 0.011826f, 0.012917f, 0.013916f, 0.015175f, 0.016602f, 0.018204f, 0.020035f, 0.022293f, - 0.024948f, 0.028076f, 0.031921f, 0.036377f, 0.041565f, 0.047577f, 0.054535f, 0.062622f, - 0.071777f, 0.081787f, 0.465576f, 0.522461f, 0.535645f, 0.541992f, 0.544922f, 0.546875f, - 0.000155f, 0.000398f, 0.000680f, 0.000828f, 0.000907f, 0.000989f, 0.001113f, 0.001081f, - 0.001253f, 0.001350f, 0.001453f, 0.001573f, 0.001661f, 0.001777f, 0.001829f, 0.001978f, - 0.002062f, 0.002216f, 0.002346f, 0.002470f, 0.002644f, 0.002804f, 0.002930f, 0.003134f, - 0.003265f, 0.003485f, 0.003674f, 0.003866f, 0.004154f, 0.004333f, 0.004707f, 0.004910f, - 0.005180f, 0.005581f, 0.005875f, 0.006283f, 0.006729f, 0.007164f, 0.007713f, 0.008270f, - 0.008934f, 0.009727f, 0.010513f, 0.011482f, 0.012520f, 0.013710f, 0.015152f, 0.016815f, - 0.018799f, 0.021118f, 0.024048f, 0.027756f, 0.032104f, 0.037201f, 0.043518f, 0.050903f, - 0.059418f, 0.068420f, 0.453125f, 0.511719f, 0.525391f, 0.530762f, 0.535156f, 0.536621f, - 0.000303f, 0.000337f, 0.000498f, 0.000560f, 0.000603f, 0.000721f, 0.000782f, 0.000845f, - 0.000880f, 0.000988f, 0.001119f, 0.001184f, 0.001258f, 0.001377f, 0.001420f, 0.001446f, - 0.001590f, 0.001666f, 0.001754f, 0.001889f, 0.001980f, 0.002073f, 0.002216f, 0.002308f, - 0.002447f, 0.002562f, 0.002758f, 0.002899f, 0.003084f, 0.003328f, 0.003506f, 0.003641f, - 0.003922f, 0.004147f, 0.004391f, 0.004665f, 0.004959f, 0.005322f, 0.005695f, 0.006119f, - 0.006588f, 0.007072f, 0.007790f, 0.008392f, 0.009178f, 0.010056f, 0.011124f, 0.012383f, - 0.013832f, 0.015587f, 0.017685f, 0.020309f, 0.023926f, 0.028076f, 0.033447f, 0.039978f, - 0.047638f, 0.056335f, 0.440186f, 0.500000f, 0.514160f, 0.520996f, 0.524414f, 0.526855f, - 0.000132f, 0.000296f, 0.000368f, 0.000444f, 0.000501f, 0.000519f, 0.000631f, 0.000580f, - 0.000675f, 0.000735f, 0.000820f, 0.000840f, 0.000882f, 0.000946f, 0.001029f, 0.001070f, - 0.001164f, 0.001221f, 0.001286f, 0.001317f, 0.001416f, 0.001494f, 0.001607f, 0.001681f, - 0.001763f, 0.001863f, 0.001978f, 0.002069f, 0.002169f, 0.002348f, 0.002451f, 0.002661f, - 0.002754f, 0.002943f, 0.003130f, 0.003323f, 0.003553f, 0.003813f, 0.004124f, 0.004364f, - 0.004669f, 0.005062f, 0.005493f, 0.005985f, 0.006546f, 0.007172f, 0.007950f, 0.008850f, - 0.009857f, 0.011116f, 0.012695f, 0.014603f, 0.016983f, 0.020157f, 0.024490f, 0.029968f, - 0.036957f, 0.045166f, 0.426025f, 0.488770f, 0.503906f, 0.511719f, 0.515137f, 0.517578f, - 0.000063f, 0.000160f, 0.000267f, 0.000282f, 0.000339f, 0.000417f, 0.000377f, 0.000433f, - 0.000472f, 0.000570f, 0.000563f, 0.000578f, 0.000599f, 0.000663f, 0.000681f, 0.000759f, - 0.000760f, 0.000845f, 0.000910f, 0.000941f, 0.000997f, 0.001057f, 0.001110f, 0.001169f, - 0.001238f, 0.001288f, 0.001381f, 0.001441f, 0.001514f, 0.001655f, 0.001693f, 0.001815f, - 0.001910f, 0.002028f, 0.002153f, 0.002308f, 0.002441f, 0.002607f, 0.002783f, 0.002962f, - 0.003214f, 0.003458f, 0.003744f, 0.004051f, 0.004444f, 0.004883f, 0.005402f, 0.006031f, - 0.006699f, 0.007610f, 0.008766f, 0.009933f, 0.011688f, 0.013931f, 0.017075f, 0.021454f, - 0.027313f, 0.035004f, 0.414307f, 0.478271f, 0.493652f, 0.501465f, 0.505859f, 0.508301f, - 0.000120f, 0.000194f, 0.000194f, 0.000205f, 0.000245f, 0.000246f, 0.000251f, 0.000301f, - 0.000322f, 0.000332f, 0.000343f, 0.000413f, 0.000397f, 0.000448f, 0.000481f, 0.000494f, - 0.000545f, 0.000556f, 0.000582f, 0.000601f, 0.000653f, 0.000676f, 0.000726f, 0.000767f, - 0.000821f, 0.000840f, 0.000919f, 0.000952f, 0.001011f, 0.001054f, 0.001116f, 0.001186f, - 0.001263f, 0.001337f, 0.001418f, 0.001482f, 0.001607f, 0.001685f, 0.001842f, 0.001965f, - 0.002090f, 0.002235f, 0.002420f, 0.002613f, 0.002851f, 0.003159f, 0.003492f, 0.003887f, - 0.004345f, 0.004906f, 0.005600f, 0.006474f, 0.007645f, 0.009186f, 0.011230f, 0.014305f, - 0.019135f, 0.025848f, 0.400635f, 0.466797f, 0.483398f, 0.490967f, 0.495117f, 0.498047f, - 0.000030f, 0.000140f, 0.000121f, 0.000114f, 0.000147f, 0.000178f, 0.000159f, 0.000195f, - 0.000199f, 0.000204f, 0.000216f, 0.000223f, 0.000255f, 0.000271f, 0.000288f, 0.000302f, - 0.000314f, 0.000346f, 0.000357f, 0.000395f, 0.000397f, 0.000408f, 0.000436f, 0.000470f, - 0.000501f, 0.000542f, 0.000547f, 0.000566f, 0.000612f, 0.000641f, 0.000692f, 0.000722f, - 0.000767f, 0.000798f, 0.000861f, 0.000898f, 0.000963f, 0.001030f, 0.001107f, 0.001164f, - 0.001255f, 0.001361f, 0.001464f, 0.001591f, 0.001719f, 0.001871f, 0.002111f, 0.002312f, - 0.002617f, 0.002964f, 0.003368f, 0.003902f, 0.004654f, 0.005653f, 0.006958f, 0.008888f, - 0.012161f, 0.017822f, 0.388672f, 0.456543f, 0.473389f, 0.481201f, 0.486328f, 0.489014f, - 0.000102f, 0.000076f, 0.000076f, 0.000075f, 0.000095f, 0.000092f, 0.000109f, 0.000111f, - 0.000112f, 0.000113f, 0.000126f, 0.000147f, 0.000135f, 0.000144f, 0.000165f, 0.000161f, - 0.000179f, 0.000192f, 0.000198f, 0.000202f, 0.000224f, 0.000232f, 0.000248f, 0.000259f, - 0.000278f, 0.000295f, 0.000308f, 0.000320f, 0.000340f, 0.000353f, 0.000379f, 0.000402f, - 0.000423f, 0.000440f, 0.000472f, 0.000503f, 0.000526f, 0.000564f, 0.000610f, 0.000644f, - 0.000690f, 0.000741f, 0.000810f, 0.000862f, 0.000946f, 0.001024f, 0.001121f, 0.001247f, - 0.001407f, 0.001603f, 0.001822f, 0.002144f, 0.002539f, 0.003098f, 0.003901f, 0.005096f, - 0.006931f, 0.011024f, 0.375244f, 0.444092f, 0.462158f, 0.470215f, 0.475586f, 0.478760f, - 0.000085f, 0.000061f, 0.000052f, 0.000047f, 0.000049f, 0.000046f, 0.000047f, 0.000050f, - 0.000055f, 0.000069f, 0.000060f, 0.000062f, 0.000077f, 0.000066f, 0.000069f, 0.000075f, - 0.000084f, 0.000093f, 0.000093f, 0.000098f, 0.000102f, 0.000108f, 0.000111f, 0.000121f, - 0.000129f, 0.000136f, 0.000142f, 0.000154f, 0.000162f, 0.000172f, 0.000182f, 0.000187f, - 0.000197f, 0.000209f, 0.000225f, 0.000231f, 0.000246f, 0.000262f, 0.000290f, 0.000306f, - 0.000321f, 0.000349f, 0.000380f, 0.000402f, 0.000437f, 0.000480f, 0.000525f, 0.000579f, - 0.000649f, 0.000735f, 0.000842f, 0.000984f, 0.001173f, 0.001451f, 0.001855f, 0.002485f, - 0.003542f, 0.005753f, 0.362305f, 0.434326f, 0.451904f, 0.460693f, 0.465576f, 0.468506f, - 0.000064f, 0.000044f, 0.000036f, 0.000032f, 0.000029f, 0.000027f, 0.000025f, 0.000024f, - 0.000022f, 0.000023f, 0.000021f, 0.000027f, 0.000023f, 0.000022f, 0.000028f, 0.000031f, - 0.000030f, 0.000034f, 0.000036f, 0.000038f, 0.000040f, 0.000045f, 0.000048f, 0.000042f, - 0.000047f, 0.000053f, 0.000055f, 0.000054f, 0.000060f, 0.000062f, 0.000065f, 0.000072f, - 0.000078f, 0.000075f, 0.000079f, 0.000087f, 0.000093f, 0.000098f, 0.000106f, 0.000113f, - 0.000121f, 0.000126f, 0.000136f, 0.000150f, 0.000159f, 0.000173f, 0.000190f, 0.000209f, - 0.000235f, 0.000265f, 0.000302f, 0.000343f, 0.000416f, 0.000515f, 0.000665f, 0.000917f, - 0.001396f, 0.002401f, 0.349854f, 0.421875f, 0.440918f, 0.449951f, 0.455811f, 0.458008f, - 0.000030f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000011f, 0.000011f, 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, - 0.000009f, 0.000008f, 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000008f, 0.000008f, - 0.000009f, 0.000011f, 0.000011f, 0.000013f, 0.000013f, 0.000012f, 0.000013f, 0.000014f, - 0.000016f, 0.000018f, 0.000018f, 0.000019f, 0.000021f, 0.000021f, 0.000023f, 0.000027f, - 0.000025f, 0.000028f, 0.000031f, 0.000032f, 0.000033f, 0.000038f, 0.000043f, 0.000046f, - 0.000050f, 0.000055f, 0.000062f, 0.000074f, 0.000088f, 0.000106f, 0.000138f, 0.000191f, - 0.000312f, 0.000653f, 0.337402f, 0.410645f, 0.431152f, 0.438965f, 0.445068f, 0.448975f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000006f, - 0.000010f, 0.000026f, 0.324219f, 0.399902f, 0.419922f, 0.429688f, 0.435059f, 0.438965f, - }, - { - 0.010521f, 0.032043f, 0.054443f, 0.076843f, 0.098572f, 0.121216f, 0.142700f, 0.164062f, - 0.185913f, 0.207275f, 0.229004f, 0.249268f, 0.270508f, 0.290527f, 0.311035f, 0.331055f, - 0.350586f, 0.370361f, 0.389648f, 0.408936f, 0.428223f, 0.446533f, 0.465088f, 0.482666f, - 0.500977f, 0.519043f, 0.536133f, 0.553223f, 0.570801f, 0.587891f, 0.604980f, 0.621582f, - 0.637207f, 0.653320f, 0.668945f, 0.685547f, 0.700684f, 0.716309f, 0.730957f, 0.745605f, - 0.760254f, 0.774902f, 0.789551f, 0.803711f, 0.816895f, 0.831543f, 0.845703f, 0.858887f, - 0.871582f, 0.885254f, 0.897949f, 0.910645f, 0.923340f, 0.936035f, 0.948242f, 0.959961f, - 0.972168f, 0.984375f, 0.972656f, 0.936035f, 0.910645f, 0.890137f, 0.872070f, 0.855957f, - 0.010048f, 0.030350f, 0.051392f, 0.072266f, 0.093506f, 0.114319f, 0.135620f, 0.155273f, - 0.177124f, 0.197144f, 0.217773f, 0.237915f, 0.257568f, 0.277588f, 0.298096f, 0.316895f, - 0.336182f, 0.355225f, 0.374268f, 0.393311f, 0.411865f, 0.430176f, 0.448486f, 0.466309f, - 0.483398f, 0.501465f, 0.519043f, 0.535645f, 0.552734f, 0.570312f, 0.586426f, 0.602539f, - 0.618652f, 0.635254f, 0.650879f, 0.666016f, 0.682129f, 0.697266f, 0.712402f, 0.727539f, - 0.741699f, 0.756836f, 0.770996f, 0.785645f, 0.799805f, 0.812988f, 0.826660f, 0.840332f, - 0.854004f, 0.867676f, 0.881348f, 0.893066f, 0.907715f, 0.919434f, 0.932617f, 0.943848f, - 0.955566f, 0.968262f, 0.965332f, 0.930664f, 0.906738f, 0.886719f, 0.869629f, 0.854004f, - 0.009254f, 0.028961f, 0.048615f, 0.068054f, 0.088562f, 0.108093f, 0.128540f, 0.147705f, - 0.167236f, 0.188599f, 0.207886f, 0.227295f, 0.244873f, 0.265625f, 0.284668f, 0.303955f, - 0.322510f, 0.340820f, 0.358887f, 0.378662f, 0.396484f, 0.414307f, 0.431885f, 0.448975f, - 0.466797f, 0.484619f, 0.500977f, 0.519043f, 0.535645f, 0.551758f, 0.568359f, 0.584961f, - 0.600586f, 0.616699f, 0.632324f, 0.647949f, 0.663086f, 0.678223f, 0.693848f, 0.708984f, - 0.723633f, 0.738281f, 0.752930f, 0.767578f, 0.780762f, 0.794922f, 0.809082f, 0.822754f, - 0.835938f, 0.849609f, 0.863770f, 0.875488f, 0.888672f, 0.902344f, 0.915527f, 0.927246f, - 0.939453f, 0.952637f, 0.958008f, 0.925293f, 0.901855f, 0.882812f, 0.866211f, 0.851562f, - 0.008736f, 0.027039f, 0.045807f, 0.064514f, 0.083801f, 0.102844f, 0.121826f, 0.140869f, - 0.159302f, 0.179077f, 0.197388f, 0.216064f, 0.234741f, 0.253662f, 0.271729f, 0.290283f, - 0.308350f, 0.327148f, 0.344238f, 0.362061f, 0.381836f, 0.398926f, 0.416016f, 0.432373f, - 0.450195f, 0.466797f, 0.484375f, 0.500977f, 0.517090f, 0.533691f, 0.550781f, 0.567871f, - 0.582031f, 0.598145f, 0.613770f, 0.629395f, 0.645020f, 0.659668f, 0.675781f, 0.689941f, - 0.705566f, 0.719727f, 0.734375f, 0.749512f, 0.763184f, 0.776855f, 0.791016f, 0.804688f, - 0.818848f, 0.832031f, 0.845215f, 0.858398f, 0.872559f, 0.884766f, 0.897949f, 0.909668f, - 0.922852f, 0.936035f, 0.950684f, 0.919434f, 0.896973f, 0.878906f, 0.862793f, 0.848633f, - 0.008339f, 0.025543f, 0.043427f, 0.060974f, 0.078979f, 0.097168f, 0.115051f, 0.133179f, - 0.151367f, 0.169678f, 0.187988f, 0.206055f, 0.223999f, 0.241821f, 0.260742f, 0.277832f, - 0.295166f, 0.313232f, 0.331299f, 0.347412f, 0.365479f, 0.383057f, 0.399902f, 0.416992f, - 0.433350f, 0.450195f, 0.467773f, 0.484863f, 0.499756f, 0.515625f, 0.532715f, 0.548340f, - 0.564941f, 0.580566f, 0.596191f, 0.610840f, 0.626953f, 0.641602f, 0.656738f, 0.671875f, - 0.686035f, 0.701660f, 0.714844f, 0.730469f, 0.745117f, 0.759766f, 0.772461f, 0.786621f, - 0.801270f, 0.814453f, 0.827637f, 0.841309f, 0.854004f, 0.867676f, 0.880859f, 0.893555f, - 0.907227f, 0.919434f, 0.943359f, 0.913086f, 0.891602f, 0.874512f, 0.858887f, 0.845703f, - 0.008102f, 0.024002f, 0.040802f, 0.057098f, 0.074768f, 0.091553f, 0.108826f, 0.126343f, - 0.143921f, 0.161377f, 0.179077f, 0.195923f, 0.213745f, 0.230835f, 0.248047f, 0.265869f, - 0.282227f, 0.299561f, 0.316895f, 0.334473f, 0.350586f, 0.367920f, 0.384277f, 0.400391f, - 0.417725f, 0.434326f, 0.450195f, 0.467285f, 0.482910f, 0.498291f, 0.514648f, 0.530762f, - 0.546387f, 0.561523f, 0.577637f, 0.593262f, 0.608398f, 0.623535f, 0.637695f, 0.654297f, - 0.668457f, 0.682617f, 0.698242f, 0.711914f, 0.727051f, 0.741211f, 0.754395f, 0.768066f, - 0.782715f, 0.796387f, 0.810547f, 0.823730f, 0.836426f, 0.849609f, 0.863770f, 0.876465f, - 0.889648f, 0.902344f, 0.934570f, 0.907715f, 0.887207f, 0.870117f, 0.854980f, 0.842285f, - 0.007504f, 0.022812f, 0.038727f, 0.054871f, 0.070312f, 0.087097f, 0.103088f, 0.119446f, - 0.136475f, 0.153442f, 0.169556f, 0.186523f, 0.203369f, 0.219971f, 0.236450f, 0.253418f, - 0.270264f, 0.287109f, 0.302979f, 0.319824f, 0.336182f, 0.353271f, 0.369141f, 0.386230f, - 0.402100f, 0.417725f, 0.433594f, 0.450684f, 0.466553f, 0.482178f, 0.498047f, 0.513184f, - 0.528809f, 0.543945f, 0.559082f, 0.575195f, 0.589844f, 0.605469f, 0.621094f, 0.634277f, - 0.649414f, 0.665039f, 0.679688f, 0.694824f, 0.708496f, 0.722168f, 0.736816f, 0.750000f, - 0.763184f, 0.778809f, 0.791504f, 0.805664f, 0.819336f, 0.832520f, 0.845703f, 0.858887f, - 0.872070f, 0.885742f, 0.927246f, 0.900879f, 0.881836f, 0.864746f, 0.851074f, 0.838867f, - 0.006836f, 0.021683f, 0.036224f, 0.051666f, 0.066772f, 0.081970f, 0.098022f, 0.113831f, - 0.129517f, 0.145264f, 0.161011f, 0.177856f, 0.193359f, 0.209106f, 0.226196f, 0.241821f, - 0.257812f, 0.274414f, 0.290283f, 0.306641f, 0.322754f, 0.338623f, 0.354492f, 0.370361f, - 0.386230f, 0.402100f, 0.417725f, 0.433838f, 0.449463f, 0.465088f, 0.480469f, 0.495605f, - 0.511719f, 0.527344f, 0.541016f, 0.556641f, 0.571777f, 0.587402f, 0.601562f, 0.617676f, - 0.631836f, 0.646484f, 0.660645f, 0.674805f, 0.689941f, 0.704102f, 0.718262f, 0.731934f, - 0.746582f, 0.760254f, 0.774414f, 0.786621f, 0.801758f, 0.815430f, 0.828125f, 0.842285f, - 0.854980f, 0.868652f, 0.918457f, 0.894531f, 0.875977f, 0.859863f, 0.846680f, 0.834961f, - 0.006672f, 0.020401f, 0.034088f, 0.048462f, 0.062927f, 0.077820f, 0.092529f, 0.107666f, - 0.122803f, 0.137695f, 0.152954f, 0.169067f, 0.183716f, 0.199829f, 0.214722f, 0.230347f, - 0.246704f, 0.262207f, 0.277832f, 0.292969f, 0.308105f, 0.324219f, 0.339600f, 0.354492f, - 0.371094f, 0.386963f, 0.401855f, 0.418457f, 0.432861f, 0.449219f, 0.463379f, 0.478271f, - 0.494385f, 0.508301f, 0.523438f, 0.539551f, 0.553711f, 0.568848f, 0.583984f, 0.598633f, - 0.612793f, 0.627441f, 0.642578f, 0.656250f, 0.670898f, 0.685547f, 0.698730f, 0.714355f, - 0.728027f, 0.742188f, 0.755859f, 0.769531f, 0.783691f, 0.795898f, 0.810059f, 0.824707f, - 0.838379f, 0.850586f, 0.910645f, 0.887695f, 0.870117f, 0.854980f, 0.842285f, 0.831055f, - 0.006207f, 0.019211f, 0.032623f, 0.046112f, 0.059662f, 0.073181f, 0.087585f, 0.102051f, - 0.116577f, 0.130249f, 0.145142f, 0.159790f, 0.175171f, 0.189575f, 0.205322f, 0.219238f, - 0.235474f, 0.249634f, 0.265137f, 0.280029f, 0.294678f, 0.310547f, 0.325928f, 0.340820f, - 0.356201f, 0.371094f, 0.386230f, 0.401367f, 0.416504f, 0.431885f, 0.446533f, 0.461670f, - 0.476074f, 0.492188f, 0.507324f, 0.520996f, 0.535645f, 0.550781f, 0.564941f, 0.580078f, - 0.594727f, 0.609863f, 0.623535f, 0.637695f, 0.652832f, 0.667480f, 0.681152f, 0.695312f, - 0.709473f, 0.723633f, 0.737793f, 0.751953f, 0.765137f, 0.779297f, 0.793945f, 0.807129f, - 0.819824f, 0.833496f, 0.901855f, 0.880859f, 0.864258f, 0.850098f, 0.837891f, 0.826660f, - 0.006020f, 0.018219f, 0.030579f, 0.043365f, 0.055908f, 0.069153f, 0.082336f, 0.096802f, - 0.109497f, 0.123535f, 0.137451f, 0.151855f, 0.165649f, 0.180054f, 0.194702f, 0.208252f, - 0.223999f, 0.238037f, 0.252930f, 0.267334f, 0.281982f, 0.296875f, 0.312012f, 0.326904f, - 0.340820f, 0.355957f, 0.370850f, 0.385986f, 0.400391f, 0.415039f, 0.430176f, 0.445801f, - 0.459229f, 0.474365f, 0.489014f, 0.502441f, 0.518066f, 0.533203f, 0.547363f, 0.562012f, - 0.576660f, 0.590820f, 0.605469f, 0.619629f, 0.633789f, 0.647949f, 0.663574f, 0.676758f, - 0.690918f, 0.705566f, 0.719238f, 0.733398f, 0.746582f, 0.760254f, 0.774414f, 0.788574f, - 0.802246f, 0.816406f, 0.894043f, 0.874023f, 0.858398f, 0.844238f, 0.832031f, 0.822266f, - 0.005520f, 0.017059f, 0.028625f, 0.040649f, 0.053131f, 0.065552f, 0.077698f, 0.091187f, - 0.104065f, 0.117371f, 0.130859f, 0.143677f, 0.157349f, 0.171021f, 0.184814f, 0.198730f, - 0.213135f, 0.226807f, 0.241211f, 0.255127f, 0.269775f, 0.283691f, 0.298096f, 0.312744f, - 0.326660f, 0.341553f, 0.355957f, 0.370117f, 0.384766f, 0.399170f, 0.414307f, 0.427979f, - 0.442627f, 0.457764f, 0.471924f, 0.486084f, 0.500488f, 0.515137f, 0.529785f, 0.543945f, - 0.558594f, 0.572754f, 0.587402f, 0.601074f, 0.615234f, 0.629395f, 0.644043f, 0.657715f, - 0.672852f, 0.685547f, 0.700684f, 0.714844f, 0.728027f, 0.743164f, 0.756348f, 0.770508f, - 0.785645f, 0.798340f, 0.885254f, 0.867676f, 0.852051f, 0.839355f, 0.828125f, 0.817871f, - 0.005241f, 0.015854f, 0.027481f, 0.038605f, 0.050171f, 0.061859f, 0.073853f, 0.085693f, - 0.098328f, 0.111206f, 0.123474f, 0.136475f, 0.149658f, 0.162598f, 0.175293f, 0.188477f, - 0.202148f, 0.216431f, 0.229858f, 0.242798f, 0.256104f, 0.270264f, 0.284668f, 0.298828f, - 0.312744f, 0.326904f, 0.341064f, 0.355469f, 0.369141f, 0.383057f, 0.396729f, 0.411621f, - 0.426025f, 0.439697f, 0.454590f, 0.468506f, 0.482666f, 0.497070f, 0.512207f, 0.525391f, - 0.540527f, 0.555176f, 0.567871f, 0.582031f, 0.596191f, 0.610840f, 0.625488f, 0.639648f, - 0.653809f, 0.668457f, 0.681641f, 0.695801f, 0.710449f, 0.724121f, 0.738770f, 0.751953f, - 0.766602f, 0.780273f, 0.876465f, 0.860352f, 0.845703f, 0.833984f, 0.822754f, 0.812988f, - 0.004982f, 0.015274f, 0.025681f, 0.036438f, 0.047119f, 0.058167f, 0.069397f, 0.081055f, - 0.092957f, 0.104492f, 0.116577f, 0.128418f, 0.141113f, 0.153442f, 0.166504f, 0.179321f, - 0.192261f, 0.205200f, 0.218506f, 0.231934f, 0.244629f, 0.258301f, 0.271729f, 0.284912f, - 0.299072f, 0.312988f, 0.325684f, 0.340088f, 0.353271f, 0.367676f, 0.381836f, 0.395508f, - 0.408936f, 0.423584f, 0.438232f, 0.451416f, 0.466309f, 0.479736f, 0.493896f, 0.507812f, - 0.521973f, 0.536133f, 0.550293f, 0.563965f, 0.578613f, 0.592773f, 0.606934f, 0.620605f, - 0.635254f, 0.649414f, 0.663086f, 0.677246f, 0.691406f, 0.706543f, 0.720703f, 0.734375f, - 0.748047f, 0.762695f, 0.868164f, 0.853027f, 0.839355f, 0.828125f, 0.817383f, 0.808105f, - 0.004745f, 0.014290f, 0.024506f, 0.034393f, 0.044617f, 0.054749f, 0.065308f, 0.076538f, - 0.087646f, 0.098938f, 0.110535f, 0.121582f, 0.134155f, 0.145264f, 0.157837f, 0.170166f, - 0.182373f, 0.194824f, 0.207153f, 0.220337f, 0.233276f, 0.245728f, 0.259277f, 0.271973f, - 0.285645f, 0.298584f, 0.311768f, 0.325684f, 0.338623f, 0.352539f, 0.365967f, 0.379395f, - 0.393066f, 0.406738f, 0.421143f, 0.434326f, 0.448730f, 0.462402f, 0.475586f, 0.490479f, - 0.503906f, 0.518066f, 0.532227f, 0.546387f, 0.560059f, 0.574219f, 0.588379f, 0.602539f, - 0.616211f, 0.630371f, 0.644531f, 0.658691f, 0.673340f, 0.686523f, 0.701660f, 0.715332f, - 0.730469f, 0.745117f, 0.858887f, 0.845215f, 0.833008f, 0.821777f, 0.812012f, 0.802734f, - 0.004494f, 0.013550f, 0.022675f, 0.032227f, 0.042145f, 0.052002f, 0.061554f, 0.072205f, - 0.082520f, 0.093323f, 0.104614f, 0.115112f, 0.126099f, 0.137817f, 0.149536f, 0.160767f, - 0.172607f, 0.184692f, 0.196167f, 0.208862f, 0.221924f, 0.233765f, 0.246216f, 0.258545f, - 0.272461f, 0.284424f, 0.297119f, 0.310547f, 0.323242f, 0.336914f, 0.350586f, 0.363281f, - 0.376953f, 0.390869f, 0.403564f, 0.416992f, 0.431152f, 0.444824f, 0.458496f, 0.472656f, - 0.486084f, 0.500000f, 0.513672f, 0.527832f, 0.541504f, 0.555664f, 0.569824f, 0.583496f, - 0.598145f, 0.611816f, 0.626465f, 0.639648f, 0.654297f, 0.668457f, 0.683594f, 0.697754f, - 0.711914f, 0.726562f, 0.849609f, 0.838867f, 0.826172f, 0.815918f, 0.806641f, 0.796875f, - 0.004288f, 0.012619f, 0.021713f, 0.030945f, 0.039368f, 0.048737f, 0.058533f, 0.067932f, - 0.077759f, 0.088013f, 0.098755f, 0.108398f, 0.119080f, 0.129639f, 0.141235f, 0.152466f, - 0.163940f, 0.174927f, 0.186768f, 0.198608f, 0.210205f, 0.222290f, 0.234131f, 0.246094f, - 0.258789f, 0.270508f, 0.283203f, 0.296631f, 0.309326f, 0.321777f, 0.335449f, 0.348145f, - 0.361084f, 0.374023f, 0.386963f, 0.400391f, 0.414062f, 0.427734f, 0.441162f, 0.455078f, - 0.467773f, 0.482422f, 0.495117f, 0.509277f, 0.523926f, 0.536621f, 0.550781f, 0.564941f, - 0.579102f, 0.593262f, 0.607422f, 0.621582f, 0.635742f, 0.649902f, 0.664551f, 0.678711f, - 0.693848f, 0.708008f, 0.840820f, 0.831055f, 0.819336f, 0.809570f, 0.801270f, 0.792969f, - 0.004013f, 0.012070f, 0.019989f, 0.029190f, 0.037415f, 0.045776f, 0.055023f, 0.064392f, - 0.073669f, 0.083374f, 0.092224f, 0.102295f, 0.112610f, 0.122742f, 0.133057f, 0.143799f, - 0.155273f, 0.165527f, 0.176880f, 0.188110f, 0.199463f, 0.210815f, 0.222534f, 0.234619f, - 0.245972f, 0.258301f, 0.270508f, 0.282715f, 0.294678f, 0.307129f, 0.320557f, 0.333008f, - 0.345947f, 0.358398f, 0.371826f, 0.384277f, 0.397461f, 0.410889f, 0.424561f, 0.437256f, - 0.451416f, 0.464600f, 0.477783f, 0.491455f, 0.504395f, 0.518555f, 0.532715f, 0.546875f, - 0.560547f, 0.574219f, 0.588379f, 0.604004f, 0.617188f, 0.631348f, 0.645020f, 0.660645f, - 0.674316f, 0.689941f, 0.832031f, 0.823242f, 0.813477f, 0.803711f, 0.794922f, 0.787109f, - 0.003790f, 0.011559f, 0.019119f, 0.027069f, 0.035034f, 0.043762f, 0.052032f, 0.060059f, - 0.069153f, 0.078369f, 0.087280f, 0.096741f, 0.105957f, 0.115967f, 0.125732f, 0.135620f, - 0.146118f, 0.156128f, 0.166992f, 0.177612f, 0.188965f, 0.199829f, 0.210815f, 0.222290f, - 0.233887f, 0.244873f, 0.257324f, 0.268799f, 0.281006f, 0.292969f, 0.305420f, 0.317627f, - 0.329834f, 0.341797f, 0.355469f, 0.368164f, 0.380859f, 0.393311f, 0.407227f, 0.419434f, - 0.433350f, 0.446533f, 0.459961f, 0.473633f, 0.486328f, 0.500488f, 0.515625f, 0.528320f, - 0.541504f, 0.556152f, 0.570312f, 0.584473f, 0.598633f, 0.612305f, 0.626465f, 0.640625f, - 0.655762f, 0.670410f, 0.822266f, 0.815918f, 0.805664f, 0.796387f, 0.788574f, 0.782227f, - 0.003599f, 0.010727f, 0.018219f, 0.025177f, 0.033203f, 0.041046f, 0.048981f, 0.057220f, - 0.065247f, 0.073792f, 0.082764f, 0.091064f, 0.100220f, 0.108826f, 0.118591f, 0.128052f, - 0.137573f, 0.147705f, 0.158081f, 0.167603f, 0.177979f, 0.188721f, 0.198975f, 0.210205f, - 0.221924f, 0.232544f, 0.243774f, 0.255615f, 0.267090f, 0.278564f, 0.290039f, 0.302490f, - 0.314941f, 0.327393f, 0.338623f, 0.352295f, 0.364014f, 0.377441f, 0.390381f, 0.403564f, - 0.415039f, 0.428955f, 0.441895f, 0.455078f, 0.468994f, 0.482666f, 0.496094f, 0.509277f, - 0.523926f, 0.537598f, 0.551270f, 0.565430f, 0.579590f, 0.594238f, 0.608887f, 0.622559f, - 0.637207f, 0.651855f, 0.813477f, 0.807617f, 0.798340f, 0.790527f, 0.782715f, 0.775391f, - 0.003355f, 0.009918f, 0.017105f, 0.023911f, 0.031281f, 0.038147f, 0.045990f, 0.053284f, - 0.061493f, 0.069214f, 0.077026f, 0.085571f, 0.093567f, 0.102600f, 0.111755f, 0.120728f, - 0.129761f, 0.138916f, 0.148804f, 0.158447f, 0.167725f, 0.177979f, 0.188965f, 0.198608f, - 0.209473f, 0.220215f, 0.231567f, 0.242554f, 0.253906f, 0.264160f, 0.276123f, 0.287109f, - 0.300049f, 0.312012f, 0.323975f, 0.336182f, 0.348145f, 0.360840f, 0.372803f, 0.385986f, - 0.398438f, 0.411621f, 0.424316f, 0.437256f, 0.450439f, 0.464844f, 0.478027f, 0.490723f, - 0.504395f, 0.518066f, 0.532715f, 0.546387f, 0.561523f, 0.575684f, 0.589355f, 0.604004f, - 0.618164f, 0.632324f, 0.802246f, 0.800293f, 0.792480f, 0.783691f, 0.776367f, 0.769531f, - 0.003265f, 0.009575f, 0.016144f, 0.022415f, 0.029510f, 0.036316f, 0.042755f, 0.050812f, - 0.057556f, 0.065002f, 0.072388f, 0.080200f, 0.087952f, 0.096680f, 0.104858f, 0.113281f, - 0.122070f, 0.130493f, 0.139771f, 0.148926f, 0.158447f, 0.168335f, 0.177612f, 0.187500f, - 0.198120f, 0.208130f, 0.218750f, 0.229492f, 0.240234f, 0.250732f, 0.262207f, 0.273682f, - 0.285156f, 0.296143f, 0.308594f, 0.320068f, 0.332520f, 0.344482f, 0.357178f, 0.368652f, - 0.381836f, 0.394043f, 0.406494f, 0.420410f, 0.433105f, 0.445801f, 0.459717f, 0.473633f, - 0.486816f, 0.500000f, 0.513672f, 0.527832f, 0.541992f, 0.556152f, 0.570312f, 0.585449f, - 0.598633f, 0.613770f, 0.794434f, 0.791504f, 0.784180f, 0.776855f, 0.770020f, 0.764160f, - 0.002954f, 0.008904f, 0.014961f, 0.021210f, 0.027420f, 0.033905f, 0.040619f, 0.047363f, - 0.053986f, 0.060883f, 0.068054f, 0.075378f, 0.082703f, 0.090515f, 0.098022f, 0.105896f, - 0.114319f, 0.122742f, 0.131592f, 0.139771f, 0.149170f, 0.157959f, 0.167480f, 0.177124f, - 0.186768f, 0.196411f, 0.206543f, 0.216919f, 0.227539f, 0.237671f, 0.248413f, 0.259277f, - 0.270264f, 0.281738f, 0.292725f, 0.304443f, 0.315918f, 0.327637f, 0.340576f, 0.352539f, - 0.364746f, 0.377930f, 0.390137f, 0.401855f, 0.415039f, 0.428223f, 0.441406f, 0.454834f, - 0.468506f, 0.481689f, 0.494873f, 0.509277f, 0.523438f, 0.537598f, 0.551758f, 0.565918f, - 0.580078f, 0.594727f, 0.783691f, 0.783203f, 0.776855f, 0.770508f, 0.763672f, 0.757324f, - 0.002836f, 0.008659f, 0.014351f, 0.019913f, 0.025772f, 0.032074f, 0.037933f, 0.044128f, - 0.050903f, 0.057159f, 0.064026f, 0.070496f, 0.077698f, 0.085022f, 0.091919f, 0.099426f, - 0.107727f, 0.114990f, 0.123169f, 0.131226f, 0.140015f, 0.148682f, 0.157349f, 0.166260f, - 0.175171f, 0.184692f, 0.194214f, 0.203979f, 0.214355f, 0.224487f, 0.234985f, 0.245728f, - 0.256104f, 0.267334f, 0.278320f, 0.288818f, 0.301025f, 0.312256f, 0.324219f, 0.335938f, - 0.347900f, 0.360596f, 0.372070f, 0.384521f, 0.397217f, 0.410400f, 0.423340f, 0.436279f, - 0.449463f, 0.463135f, 0.476807f, 0.490723f, 0.503906f, 0.517578f, 0.532227f, 0.546875f, - 0.561035f, 0.575684f, 0.773926f, 0.775391f, 0.769043f, 0.763672f, 0.757812f, 0.751953f, - 0.002506f, 0.008080f, 0.013100f, 0.018738f, 0.024384f, 0.029953f, 0.035797f, 0.041473f, - 0.047485f, 0.053558f, 0.059265f, 0.065918f, 0.072693f, 0.079468f, 0.086426f, 0.093384f, - 0.100708f, 0.108032f, 0.115417f, 0.122986f, 0.130615f, 0.139038f, 0.147827f, 0.156494f, - 0.165039f, 0.173828f, 0.182617f, 0.192139f, 0.201782f, 0.211426f, 0.221558f, 0.231323f, - 0.242188f, 0.252686f, 0.263672f, 0.274414f, 0.284912f, 0.296143f, 0.308105f, 0.319824f, - 0.331543f, 0.343750f, 0.355225f, 0.367432f, 0.379883f, 0.393066f, 0.405273f, 0.418457f, - 0.431641f, 0.444580f, 0.457764f, 0.471924f, 0.485840f, 0.499268f, 0.512695f, 0.527344f, - 0.542480f, 0.556641f, 0.764160f, 0.766602f, 0.761719f, 0.756348f, 0.750488f, 0.745605f, - 0.002640f, 0.007809f, 0.012497f, 0.017593f, 0.023102f, 0.028122f, 0.033569f, 0.038879f, - 0.044250f, 0.049988f, 0.055908f, 0.061615f, 0.067627f, 0.074036f, 0.080566f, 0.087524f, - 0.093262f, 0.100769f, 0.107910f, 0.114929f, 0.121948f, 0.130371f, 0.137939f, 0.146362f, - 0.154297f, 0.163208f, 0.171509f, 0.180664f, 0.189697f, 0.199341f, 0.208618f, 0.218506f, - 0.228394f, 0.238892f, 0.248779f, 0.259277f, 0.270752f, 0.281250f, 0.292236f, 0.303467f, - 0.315186f, 0.326660f, 0.338867f, 0.351074f, 0.362305f, 0.374756f, 0.387939f, 0.400146f, - 0.413330f, 0.426514f, 0.439209f, 0.452881f, 0.466553f, 0.480225f, 0.494141f, 0.508301f, - 0.522949f, 0.537109f, 0.753906f, 0.758301f, 0.754395f, 0.749023f, 0.743652f, 0.739258f, - 0.002441f, 0.007088f, 0.011993f, 0.016266f, 0.021255f, 0.026031f, 0.031189f, 0.036072f, - 0.041260f, 0.046753f, 0.052155f, 0.057587f, 0.063232f, 0.068787f, 0.075623f, 0.081055f, - 0.087341f, 0.094177f, 0.100647f, 0.106689f, 0.113892f, 0.121399f, 0.129028f, 0.136841f, - 0.144287f, 0.152222f, 0.160522f, 0.169312f, 0.178101f, 0.186523f, 0.196045f, 0.205200f, - 0.214966f, 0.224487f, 0.234863f, 0.244751f, 0.255371f, 0.265625f, 0.276367f, 0.287842f, - 0.298828f, 0.310303f, 0.321533f, 0.333984f, 0.345459f, 0.357666f, 0.370117f, 0.382568f, - 0.394287f, 0.407959f, 0.421875f, 0.433838f, 0.446777f, 0.461426f, 0.475098f, 0.488525f, - 0.504395f, 0.517578f, 0.744141f, 0.749512f, 0.746094f, 0.741699f, 0.736816f, 0.732422f, - 0.002172f, 0.006695f, 0.011093f, 0.015266f, 0.020081f, 0.024521f, 0.029388f, 0.033966f, - 0.038727f, 0.043427f, 0.048706f, 0.053772f, 0.059418f, 0.064270f, 0.069580f, 0.075500f, - 0.081421f, 0.087280f, 0.093262f, 0.099670f, 0.106567f, 0.113220f, 0.119995f, 0.127197f, - 0.134644f, 0.142212f, 0.150146f, 0.157959f, 0.166382f, 0.174927f, 0.184082f, 0.192505f, - 0.201904f, 0.211792f, 0.220825f, 0.230713f, 0.240601f, 0.251221f, 0.261719f, 0.272461f, - 0.282715f, 0.294434f, 0.305420f, 0.316650f, 0.328369f, 0.340088f, 0.352783f, 0.364746f, - 0.377197f, 0.389648f, 0.402832f, 0.416016f, 0.429443f, 0.442627f, 0.456055f, 0.469971f, - 0.484863f, 0.499268f, 0.733887f, 0.741211f, 0.737793f, 0.734375f, 0.729980f, 0.725586f, - 0.002045f, 0.006187f, 0.010406f, 0.014664f, 0.018570f, 0.022675f, 0.027176f, 0.031586f, - 0.035858f, 0.040253f, 0.045227f, 0.049774f, 0.054504f, 0.059692f, 0.065186f, 0.070374f, - 0.075500f, 0.080627f, 0.086792f, 0.092285f, 0.098999f, 0.104675f, 0.111816f, 0.118286f, - 0.125610f, 0.132324f, 0.139771f, 0.147339f, 0.155029f, 0.163696f, 0.171631f, 0.180420f, - 0.189087f, 0.197754f, 0.207275f, 0.216309f, 0.226440f, 0.236694f, 0.246338f, 0.256836f, - 0.267334f, 0.278320f, 0.289062f, 0.300537f, 0.312012f, 0.323975f, 0.335449f, 0.347168f, - 0.359375f, 0.372314f, 0.384521f, 0.396973f, 0.410400f, 0.423584f, 0.437500f, 0.450928f, - 0.465332f, 0.479736f, 0.723145f, 0.732422f, 0.729980f, 0.726562f, 0.722656f, 0.718750f, - 0.002148f, 0.005802f, 0.009811f, 0.013565f, 0.017578f, 0.021179f, 0.025040f, 0.029053f, - 0.033417f, 0.037445f, 0.042114f, 0.046112f, 0.050720f, 0.055511f, 0.060028f, 0.065002f, - 0.069458f, 0.075134f, 0.080078f, 0.085693f, 0.091492f, 0.097290f, 0.103394f, 0.109802f, - 0.116089f, 0.122925f, 0.129883f, 0.136963f, 0.144165f, 0.151733f, 0.160156f, 0.167847f, - 0.176392f, 0.184692f, 0.193848f, 0.203003f, 0.212402f, 0.221680f, 0.231689f, 0.242065f, - 0.251953f, 0.262207f, 0.273193f, 0.283936f, 0.295410f, 0.306152f, 0.318359f, 0.329590f, - 0.342285f, 0.354248f, 0.366455f, 0.379150f, 0.391846f, 0.405273f, 0.418701f, 0.432617f, - 0.446289f, 0.460205f, 0.712891f, 0.723633f, 0.722168f, 0.718750f, 0.715332f, 0.712402f, - 0.001963f, 0.005642f, 0.009071f, 0.012756f, 0.016006f, 0.020020f, 0.023422f, 0.027679f, - 0.030762f, 0.034943f, 0.038605f, 0.042969f, 0.047028f, 0.051178f, 0.055542f, 0.060120f, - 0.064575f, 0.069153f, 0.074280f, 0.079041f, 0.084595f, 0.089905f, 0.095276f, 0.101440f, - 0.107300f, 0.113586f, 0.119751f, 0.127075f, 0.134033f, 0.141357f, 0.148438f, 0.155884f, - 0.164062f, 0.172729f, 0.180542f, 0.190063f, 0.198364f, 0.207764f, 0.217163f, 0.226807f, - 0.236938f, 0.247070f, 0.257324f, 0.268066f, 0.278320f, 0.289795f, 0.301025f, 0.312744f, - 0.324707f, 0.336182f, 0.347900f, 0.360840f, 0.372803f, 0.386230f, 0.399902f, 0.413574f, - 0.427246f, 0.441162f, 0.702148f, 0.714355f, 0.713867f, 0.711426f, 0.707520f, 0.704590f, - 0.001995f, 0.005245f, 0.008553f, 0.011543f, 0.015015f, 0.018326f, 0.021881f, 0.025131f, - 0.028641f, 0.032349f, 0.035675f, 0.039520f, 0.043549f, 0.047089f, 0.051086f, 0.054962f, - 0.059265f, 0.063782f, 0.068054f, 0.072571f, 0.077759f, 0.082520f, 0.088013f, 0.093323f, - 0.098755f, 0.104858f, 0.111145f, 0.117371f, 0.123840f, 0.130615f, 0.137207f, 0.144897f, - 0.152344f, 0.160278f, 0.167969f, 0.176514f, 0.185425f, 0.193848f, 0.202881f, 0.212524f, - 0.221924f, 0.231323f, 0.241821f, 0.251953f, 0.262451f, 0.272949f, 0.284424f, 0.295166f, - 0.306396f, 0.319092f, 0.329590f, 0.343018f, 0.355225f, 0.368652f, 0.381348f, 0.393799f, - 0.408447f, 0.422852f, 0.691406f, 0.706055f, 0.706055f, 0.703125f, 0.700684f, 0.697754f, - 0.001692f, 0.004898f, 0.007828f, 0.011070f, 0.013992f, 0.017227f, 0.020187f, 0.023499f, - 0.026520f, 0.029526f, 0.033081f, 0.036377f, 0.039459f, 0.043396f, 0.047028f, 0.050323f, - 0.054199f, 0.058350f, 0.062317f, 0.066711f, 0.071106f, 0.075928f, 0.080750f, 0.085510f, - 0.090820f, 0.096497f, 0.102234f, 0.107727f, 0.114075f, 0.120300f, 0.126587f, 0.133789f, - 0.141113f, 0.148193f, 0.156006f, 0.163696f, 0.171753f, 0.180542f, 0.188965f, 0.198120f, - 0.207275f, 0.216797f, 0.226318f, 0.236206f, 0.246338f, 0.256836f, 0.267334f, 0.278809f, - 0.289795f, 0.300781f, 0.313232f, 0.324707f, 0.337402f, 0.349365f, 0.362305f, 0.376221f, - 0.389404f, 0.403809f, 0.680176f, 0.696289f, 0.697266f, 0.695312f, 0.692871f, 0.689941f, - 0.001606f, 0.004543f, 0.007450f, 0.010269f, 0.012962f, 0.015900f, 0.018677f, 0.021591f, - 0.024628f, 0.027618f, 0.030182f, 0.033783f, 0.036194f, 0.039734f, 0.042725f, 0.046478f, - 0.049652f, 0.053253f, 0.057251f, 0.060883f, 0.065186f, 0.069336f, 0.073730f, 0.078247f, - 0.083252f, 0.088501f, 0.093628f, 0.099182f, 0.104553f, 0.110718f, 0.116577f, 0.123108f, - 0.129883f, 0.136719f, 0.143921f, 0.151367f, 0.159302f, 0.167114f, 0.175415f, 0.183960f, - 0.192871f, 0.202148f, 0.210938f, 0.221436f, 0.230713f, 0.240723f, 0.250977f, 0.261963f, - 0.272461f, 0.283691f, 0.295166f, 0.306885f, 0.319092f, 0.331055f, 0.343750f, 0.356689f, - 0.370361f, 0.383545f, 0.669434f, 0.687500f, 0.688965f, 0.687500f, 0.685547f, 0.682617f, - 0.001701f, 0.004345f, 0.006802f, 0.009514f, 0.012283f, 0.014793f, 0.017288f, 0.019958f, - 0.022614f, 0.025177f, 0.027695f, 0.030487f, 0.033081f, 0.035858f, 0.039185f, 0.042236f, - 0.045319f, 0.048523f, 0.051941f, 0.055847f, 0.059326f, 0.063171f, 0.067139f, 0.071594f, - 0.075928f, 0.080566f, 0.085571f, 0.090454f, 0.095520f, 0.101196f, 0.106567f, 0.112427f, - 0.119019f, 0.125610f, 0.132324f, 0.139282f, 0.146973f, 0.154419f, 0.161987f, 0.170532f, - 0.178833f, 0.187134f, 0.196777f, 0.206177f, 0.214966f, 0.225220f, 0.235352f, 0.246094f, - 0.255615f, 0.266846f, 0.278320f, 0.290039f, 0.301270f, 0.313477f, 0.325195f, 0.338867f, - 0.352539f, 0.365234f, 0.657715f, 0.678711f, 0.679688f, 0.679199f, 0.677734f, 0.675293f, - 0.001310f, 0.003979f, 0.006393f, 0.008522f, 0.011223f, 0.013557f, 0.015976f, 0.018433f, - 0.020737f, 0.022842f, 0.025421f, 0.027649f, 0.030289f, 0.032806f, 0.035645f, 0.038025f, - 0.041199f, 0.044220f, 0.047058f, 0.050720f, 0.053589f, 0.057281f, 0.061157f, 0.064941f, - 0.068787f, 0.072998f, 0.077698f, 0.082153f, 0.086975f, 0.092102f, 0.097229f, 0.103027f, - 0.108826f, 0.114746f, 0.121094f, 0.127930f, 0.134521f, 0.141846f, 0.149292f, 0.157227f, - 0.164673f, 0.173218f, 0.182007f, 0.190552f, 0.199951f, 0.209717f, 0.219360f, 0.229004f, - 0.239502f, 0.250244f, 0.260986f, 0.272461f, 0.282959f, 0.295166f, 0.307373f, 0.320557f, - 0.333252f, 0.346436f, 0.646973f, 0.668945f, 0.670898f, 0.671387f, 0.669922f, 0.668457f, - 0.001348f, 0.003523f, 0.005863f, 0.008133f, 0.010338f, 0.012520f, 0.014511f, 0.016464f, - 0.018768f, 0.020920f, 0.022888f, 0.025665f, 0.027588f, 0.029861f, 0.032135f, 0.034485f, - 0.037140f, 0.040039f, 0.042725f, 0.045532f, 0.048859f, 0.051971f, 0.055237f, 0.058594f, - 0.062408f, 0.066101f, 0.070251f, 0.074280f, 0.078735f, 0.083435f, 0.088318f, 0.093567f, - 0.098633f, 0.104431f, 0.110291f, 0.116455f, 0.122986f, 0.129517f, 0.136963f, 0.143921f, - 0.152222f, 0.159546f, 0.167358f, 0.176514f, 0.185181f, 0.194214f, 0.203857f, 0.213623f, - 0.223389f, 0.233521f, 0.244385f, 0.255127f, 0.266602f, 0.277832f, 0.289307f, 0.301758f, - 0.314697f, 0.328613f, 0.635254f, 0.659668f, 0.663086f, 0.663086f, 0.662109f, 0.660156f, - 0.001084f, 0.003263f, 0.005554f, 0.007416f, 0.009445f, 0.011185f, 0.013161f, 0.015366f, - 0.017136f, 0.019058f, 0.020935f, 0.022781f, 0.024857f, 0.026886f, 0.029160f, 0.031097f, - 0.033569f, 0.035858f, 0.038361f, 0.040924f, 0.043427f, 0.046478f, 0.049500f, 0.052948f, - 0.056122f, 0.059418f, 0.063293f, 0.067139f, 0.070923f, 0.075073f, 0.079712f, 0.084229f, - 0.089233f, 0.094604f, 0.100037f, 0.105774f, 0.111694f, 0.117798f, 0.124634f, 0.131226f, - 0.139038f, 0.146484f, 0.154175f, 0.162231f, 0.170654f, 0.179199f, 0.188599f, 0.197754f, - 0.207153f, 0.217407f, 0.227295f, 0.238159f, 0.248657f, 0.260986f, 0.271973f, 0.284912f, - 0.296631f, 0.308838f, 0.623535f, 0.650391f, 0.653809f, 0.654297f, 0.653809f, 0.652832f, - 0.001070f, 0.003069f, 0.005108f, 0.006855f, 0.008522f, 0.010384f, 0.011993f, 0.013847f, - 0.015549f, 0.016968f, 0.018677f, 0.020660f, 0.022079f, 0.024048f, 0.026077f, 0.027954f, - 0.030014f, 0.032135f, 0.034210f, 0.036560f, 0.038971f, 0.041840f, 0.044434f, 0.047089f, - 0.049896f, 0.053284f, 0.056763f, 0.060120f, 0.063477f, 0.067505f, 0.071533f, 0.075928f, - 0.080261f, 0.085205f, 0.089905f, 0.095520f, 0.100830f, 0.106567f, 0.113159f, 0.119385f, - 0.126221f, 0.133301f, 0.140259f, 0.148560f, 0.156494f, 0.165039f, 0.173462f, 0.182861f, - 0.192017f, 0.201172f, 0.211548f, 0.221802f, 0.232666f, 0.243286f, 0.254639f, 0.265869f, - 0.278809f, 0.291260f, 0.611816f, 0.640625f, 0.645508f, 0.645996f, 0.645508f, 0.645020f, - 0.001057f, 0.002815f, 0.004646f, 0.006187f, 0.007935f, 0.009583f, 0.011139f, 0.012428f, - 0.013878f, 0.015404f, 0.016830f, 0.018433f, 0.019836f, 0.021637f, 0.023300f, 0.024857f, - 0.026855f, 0.028519f, 0.030533f, 0.032593f, 0.034790f, 0.037140f, 0.039520f, 0.041748f, - 0.044525f, 0.047302f, 0.050232f, 0.053497f, 0.056580f, 0.059998f, 0.063721f, 0.067627f, - 0.071777f, 0.076111f, 0.080627f, 0.085571f, 0.090698f, 0.096130f, 0.101624f, 0.107849f, - 0.114258f, 0.120544f, 0.127686f, 0.135132f, 0.142700f, 0.150269f, 0.158813f, 0.167725f, - 0.176392f, 0.185791f, 0.195312f, 0.205444f, 0.216064f, 0.226562f, 0.237793f, 0.248657f, - 0.260254f, 0.272949f, 0.600098f, 0.631348f, 0.636230f, 0.637207f, 0.637695f, 0.636719f, - 0.001022f, 0.002628f, 0.004486f, 0.005684f, 0.007179f, 0.008636f, 0.009911f, 0.011307f, - 0.012428f, 0.013771f, 0.015152f, 0.016342f, 0.017822f, 0.018997f, 0.020584f, 0.022263f, - 0.023651f, 0.025482f, 0.027191f, 0.028793f, 0.030960f, 0.032715f, 0.034912f, 0.036987f, - 0.039368f, 0.041840f, 0.044495f, 0.047180f, 0.050110f, 0.053314f, 0.056580f, 0.060059f, - 0.063660f, 0.067383f, 0.071777f, 0.075928f, 0.081055f, 0.085938f, 0.091187f, 0.096619f, - 0.102356f, 0.108826f, 0.115051f, 0.121948f, 0.129150f, 0.136475f, 0.144653f, 0.152832f, - 0.161621f, 0.170288f, 0.179932f, 0.189209f, 0.198730f, 0.209595f, 0.220459f, 0.231201f, - 0.242798f, 0.255615f, 0.588867f, 0.621094f, 0.626953f, 0.629883f, 0.629395f, 0.629883f, - 0.001016f, 0.002304f, 0.003975f, 0.005024f, 0.006584f, 0.007812f, 0.008926f, 0.009987f, - 0.011024f, 0.012199f, 0.013321f, 0.014595f, 0.015617f, 0.016830f, 0.018326f, 0.019577f, - 0.020798f, 0.022293f, 0.023758f, 0.025253f, 0.027145f, 0.028656f, 0.030640f, 0.032501f, - 0.034546f, 0.036682f, 0.039001f, 0.041412f, 0.044037f, 0.046875f, 0.049622f, 0.052917f, - 0.056030f, 0.059387f, 0.063354f, 0.067383f, 0.071655f, 0.075928f, 0.080750f, 0.085876f, - 0.091248f, 0.097168f, 0.102905f, 0.109497f, 0.116272f, 0.123413f, 0.130859f, 0.138550f, - 0.147217f, 0.155518f, 0.164551f, 0.173828f, 0.183350f, 0.193481f, 0.204102f, 0.214600f, - 0.225342f, 0.237915f, 0.575684f, 0.611816f, 0.617188f, 0.621094f, 0.621582f, 0.620605f, - 0.000768f, 0.002398f, 0.003801f, 0.004875f, 0.005848f, 0.006889f, 0.008072f, 0.008820f, - 0.009758f, 0.010910f, 0.011810f, 0.013023f, 0.013878f, 0.014786f, 0.016083f, 0.017166f, - 0.018402f, 0.019577f, 0.020691f, 0.022125f, 0.023743f, 0.025009f, 0.026779f, 0.028336f, - 0.030075f, 0.031921f, 0.033997f, 0.036255f, 0.038452f, 0.040833f, 0.043488f, 0.045959f, - 0.049011f, 0.052216f, 0.055634f, 0.059052f, 0.062744f, 0.066956f, 0.071289f, 0.075745f, - 0.080566f, 0.086060f, 0.091614f, 0.097351f, 0.103821f, 0.110291f, 0.117432f, 0.124939f, - 0.132568f, 0.140869f, 0.149414f, 0.158325f, 0.168213f, 0.177368f, 0.187744f, 0.197876f, - 0.208984f, 0.219849f, 0.563965f, 0.602051f, 0.608887f, 0.610840f, 0.613770f, 0.612305f, - 0.000764f, 0.002028f, 0.003302f, 0.004276f, 0.005325f, 0.006035f, 0.007034f, 0.007843f, - 0.008904f, 0.009628f, 0.010323f, 0.011192f, 0.012039f, 0.013092f, 0.013924f, 0.014854f, - 0.015793f, 0.016953f, 0.018036f, 0.019211f, 0.020355f, 0.021667f, 0.023010f, 0.024582f, - 0.026016f, 0.027771f, 0.029434f, 0.031235f, 0.033264f, 0.035217f, 0.037628f, 0.039886f, - 0.042084f, 0.044952f, 0.048126f, 0.051392f, 0.054779f, 0.058197f, 0.062164f, 0.066223f, - 0.070740f, 0.075439f, 0.080566f, 0.086182f, 0.091919f, 0.098145f, 0.104431f, 0.111633f, - 0.119080f, 0.126587f, 0.134888f, 0.143311f, 0.152710f, 0.162109f, 0.171631f, 0.182129f, - 0.192139f, 0.203491f, 0.552246f, 0.591309f, 0.599609f, 0.602539f, 0.604004f, 0.604980f, - 0.000782f, 0.001970f, 0.003082f, 0.003859f, 0.004635f, 0.005611f, 0.006123f, 0.006767f, - 0.007595f, 0.008270f, 0.009140f, 0.009674f, 0.010490f, 0.011040f, 0.011902f, 0.012749f, - 0.013573f, 0.014526f, 0.015656f, 0.016541f, 0.017548f, 0.018631f, 0.019730f, 0.021103f, - 0.022446f, 0.023758f, 0.025162f, 0.026611f, 0.028458f, 0.030441f, 0.032074f, 0.034302f, - 0.036316f, 0.038727f, 0.041138f, 0.044098f, 0.046997f, 0.050232f, 0.053711f, 0.057281f, - 0.061340f, 0.065491f, 0.070435f, 0.075256f, 0.080688f, 0.086426f, 0.092346f, 0.098694f, - 0.105896f, 0.113098f, 0.120911f, 0.129028f, 0.137695f, 0.146606f, 0.155884f, 0.165894f, - 0.175903f, 0.186768f, 0.540527f, 0.582520f, 0.590332f, 0.593750f, 0.594727f, 0.596191f, - 0.000711f, 0.001649f, 0.002529f, 0.003332f, 0.004036f, 0.004799f, 0.005444f, 0.006050f, - 0.006638f, 0.007160f, 0.007771f, 0.008331f, 0.008980f, 0.009644f, 0.010307f, 0.010887f, - 0.011787f, 0.012306f, 0.013176f, 0.014099f, 0.014915f, 0.015839f, 0.016708f, 0.017822f, - 0.019073f, 0.020233f, 0.021423f, 0.022690f, 0.024033f, 0.025589f, 0.027344f, 0.028976f, - 0.030930f, 0.032990f, 0.035156f, 0.037445f, 0.040131f, 0.042847f, 0.045776f, 0.049042f, - 0.052551f, 0.056519f, 0.060486f, 0.064941f, 0.069458f, 0.074951f, 0.080444f, 0.086487f, - 0.092957f, 0.099915f, 0.107361f, 0.114929f, 0.123535f, 0.131714f, 0.140747f, 0.150513f, - 0.160767f, 0.171265f, 0.527832f, 0.572754f, 0.581543f, 0.583496f, 0.586426f, 0.587402f, - 0.000504f, 0.001575f, 0.002235f, 0.003147f, 0.003641f, 0.004150f, 0.004570f, 0.005173f, - 0.005863f, 0.006016f, 0.006462f, 0.007111f, 0.007660f, 0.008156f, 0.008736f, 0.009354f, - 0.010094f, 0.010475f, 0.011253f, 0.011879f, 0.012657f, 0.013603f, 0.014267f, 0.015099f, - 0.016144f, 0.017014f, 0.017990f, 0.019104f, 0.020416f, 0.021652f, 0.022919f, 0.024353f, - 0.025986f, 0.027710f, 0.029602f, 0.031494f, 0.033722f, 0.036102f, 0.038635f, 0.041412f, - 0.044525f, 0.047729f, 0.051636f, 0.055511f, 0.059540f, 0.064331f, 0.069580f, 0.075073f, - 0.080750f, 0.087341f, 0.094116f, 0.101379f, 0.109558f, 0.117676f, 0.126221f, 0.135376f, - 0.145874f, 0.155518f, 0.516113f, 0.562012f, 0.571777f, 0.576172f, 0.578125f, 0.579102f, - 0.000445f, 0.001304f, 0.002201f, 0.002535f, 0.003126f, 0.003664f, 0.004047f, 0.004463f, - 0.004887f, 0.005234f, 0.005711f, 0.005997f, 0.006500f, 0.006901f, 0.007389f, 0.007904f, - 0.008293f, 0.008919f, 0.009499f, 0.009941f, 0.010635f, 0.011269f, 0.011948f, 0.012589f, - 0.013435f, 0.014252f, 0.015091f, 0.016052f, 0.017059f, 0.017960f, 0.019241f, 0.020264f, - 0.021667f, 0.022995f, 0.024628f, 0.026230f, 0.027985f, 0.029984f, 0.032288f, 0.034515f, - 0.037140f, 0.040009f, 0.043152f, 0.046722f, 0.050354f, 0.054504f, 0.059143f, 0.064026f, - 0.069458f, 0.075256f, 0.081726f, 0.088562f, 0.095825f, 0.103516f, 0.112000f, 0.120850f, - 0.130005f, 0.140381f, 0.502441f, 0.551758f, 0.562012f, 0.566406f, 0.568848f, 0.571289f, - 0.000396f, 0.001226f, 0.001812f, 0.002357f, 0.002796f, 0.003094f, 0.003328f, 0.003763f, - 0.003979f, 0.004364f, 0.004642f, 0.005051f, 0.005489f, 0.005745f, 0.006126f, 0.006611f, - 0.007004f, 0.007473f, 0.007771f, 0.008293f, 0.008919f, 0.009392f, 0.009941f, 0.010483f, - 0.011169f, 0.011765f, 0.012436f, 0.013344f, 0.014030f, 0.014908f, 0.015778f, 0.016769f, - 0.017838f, 0.018997f, 0.020279f, 0.021622f, 0.023056f, 0.024704f, 0.026474f, 0.028580f, - 0.030579f, 0.033051f, 0.035706f, 0.038605f, 0.041840f, 0.045380f, 0.049500f, 0.053986f, - 0.058685f, 0.063843f, 0.069885f, 0.076050f, 0.083191f, 0.090576f, 0.098511f, 0.107056f, - 0.115479f, 0.125122f, 0.491211f, 0.541504f, 0.552734f, 0.557617f, 0.560547f, 0.562012f, - 0.000559f, 0.001152f, 0.001668f, 0.001955f, 0.002234f, 0.002550f, 0.002821f, 0.003057f, - 0.003296f, 0.003635f, 0.003948f, 0.004189f, 0.004448f, 0.004761f, 0.005077f, 0.005417f, - 0.005699f, 0.006142f, 0.006458f, 0.006844f, 0.007271f, 0.007717f, 0.008156f, 0.008675f, - 0.009132f, 0.009590f, 0.010277f, 0.010864f, 0.011482f, 0.012131f, 0.012901f, 0.013741f, - 0.014595f, 0.015549f, 0.016525f, 0.017563f, 0.018799f, 0.020111f, 0.021484f, 0.023087f, - 0.024765f, 0.026840f, 0.028992f, 0.031403f, 0.034119f, 0.037323f, 0.040680f, 0.044464f, - 0.048584f, 0.053345f, 0.058838f, 0.064514f, 0.071045f, 0.078247f, 0.085571f, 0.093567f, - 0.101685f, 0.111023f, 0.477539f, 0.531738f, 0.542969f, 0.548340f, 0.552246f, 0.553711f, - 0.000459f, 0.000939f, 0.001184f, 0.001600f, 0.001761f, 0.002144f, 0.002258f, 0.002546f, - 0.002708f, 0.002922f, 0.003157f, 0.003414f, 0.003588f, 0.003918f, 0.004154f, 0.004387f, - 0.004662f, 0.004993f, 0.005249f, 0.005566f, 0.005867f, 0.006252f, 0.006573f, 0.007061f, - 0.007408f, 0.007858f, 0.008270f, 0.008713f, 0.009361f, 0.009911f, 0.010513f, 0.011047f, - 0.011841f, 0.012566f, 0.013252f, 0.014175f, 0.015182f, 0.016220f, 0.017258f, 0.018524f, - 0.019882f, 0.021454f, 0.023132f, 0.025146f, 0.027405f, 0.029877f, 0.032745f, 0.035919f, - 0.039642f, 0.043823f, 0.048492f, 0.053619f, 0.059235f, 0.065735f, 0.072693f, 0.080383f, - 0.088867f, 0.097412f, 0.466309f, 0.520508f, 0.533691f, 0.539062f, 0.542480f, 0.543945f, - 0.000369f, 0.000915f, 0.001124f, 0.001297f, 0.001534f, 0.001741f, 0.001833f, 0.002111f, - 0.002272f, 0.002369f, 0.002516f, 0.002766f, 0.002920f, 0.003162f, 0.003317f, 0.003551f, - 0.003723f, 0.003941f, 0.004211f, 0.004425f, 0.004757f, 0.004993f, 0.005306f, 0.005581f, - 0.005859f, 0.006203f, 0.006592f, 0.007015f, 0.007450f, 0.007828f, 0.008377f, 0.008797f, - 0.009361f, 0.009895f, 0.010582f, 0.011322f, 0.012016f, 0.012772f, 0.013687f, 0.014748f, - 0.015778f, 0.016907f, 0.018326f, 0.019821f, 0.021622f, 0.023483f, 0.025742f, 0.028473f, - 0.031525f, 0.034943f, 0.038910f, 0.043457f, 0.048645f, 0.054749f, 0.061279f, 0.068420f, - 0.076111f, 0.084778f, 0.453613f, 0.510742f, 0.523926f, 0.529785f, 0.533203f, 0.536133f, - 0.000186f, 0.000582f, 0.000925f, 0.001026f, 0.001228f, 0.001351f, 0.001470f, 0.001606f, - 0.001765f, 0.001908f, 0.001999f, 0.002104f, 0.002281f, 0.002476f, 0.002659f, 0.002766f, - 0.002911f, 0.003040f, 0.003344f, 0.003475f, 0.003683f, 0.003922f, 0.004185f, 0.004417f, - 0.004673f, 0.004890f, 0.005123f, 0.005440f, 0.005817f, 0.006126f, 0.006481f, 0.006859f, - 0.007275f, 0.007740f, 0.008202f, 0.008728f, 0.009315f, 0.009972f, 0.010597f, 0.011391f, - 0.012268f, 0.013252f, 0.014221f, 0.015388f, 0.016724f, 0.018265f, 0.020004f, 0.022049f, - 0.024445f, 0.027206f, 0.030762f, 0.034424f, 0.038971f, 0.044220f, 0.050262f, 0.056976f, - 0.064575f, 0.072083f, 0.441650f, 0.500488f, 0.514160f, 0.520020f, 0.524414f, 0.526855f, - 0.000194f, 0.000467f, 0.000775f, 0.000911f, 0.000994f, 0.001081f, 0.001221f, 0.001204f, - 0.001368f, 0.001479f, 0.001582f, 0.001707f, 0.001801f, 0.001921f, 0.001993f, 0.002146f, - 0.002245f, 0.002398f, 0.002531f, 0.002674f, 0.002871f, 0.003033f, 0.003172f, 0.003374f, - 0.003519f, 0.003742f, 0.003963f, 0.004158f, 0.004448f, 0.004650f, 0.005032f, 0.005230f, - 0.005550f, 0.005932f, 0.006241f, 0.006634f, 0.007088f, 0.007572f, 0.008110f, 0.008636f, - 0.009323f, 0.010071f, 0.010834f, 0.011757f, 0.012779f, 0.013863f, 0.015190f, 0.016769f, - 0.018555f, 0.020706f, 0.023331f, 0.026352f, 0.030182f, 0.034760f, 0.040039f, 0.046356f, - 0.053406f, 0.060638f, 0.427979f, 0.489502f, 0.504883f, 0.511719f, 0.515137f, 0.518066f, - 0.000339f, 0.000388f, 0.000559f, 0.000617f, 0.000667f, 0.000795f, 0.000853f, 0.000938f, - 0.000972f, 0.001079f, 0.001217f, 0.001274f, 0.001369f, 0.001480f, 0.001536f, 0.001581f, - 0.001711f, 0.001804f, 0.001900f, 0.002047f, 0.002129f, 0.002245f, 0.002394f, 0.002493f, - 0.002645f, 0.002773f, 0.002974f, 0.003124f, 0.003307f, 0.003559f, 0.003757f, 0.003893f, - 0.004169f, 0.004353f, 0.004684f, 0.004963f, 0.005272f, 0.005615f, 0.005981f, 0.006420f, - 0.006878f, 0.007378f, 0.008080f, 0.008682f, 0.009438f, 0.010239f, 0.011299f, 0.012459f, - 0.013809f, 0.015305f, 0.017212f, 0.019501f, 0.022583f, 0.026245f, 0.030838f, 0.036255f, - 0.042938f, 0.049988f, 0.416504f, 0.479492f, 0.495361f, 0.501465f, 0.505859f, 0.508789f, - 0.000148f, 0.000349f, 0.000414f, 0.000480f, 0.000554f, 0.000575f, 0.000675f, 0.000641f, - 0.000743f, 0.000809f, 0.000882f, 0.000919f, 0.000967f, 0.001019f, 0.001122f, 0.001156f, - 0.001264f, 0.001322f, 0.001392f, 0.001431f, 0.001529f, 0.001625f, 0.001735f, 0.001802f, - 0.001912f, 0.002007f, 0.002131f, 0.002237f, 0.002338f, 0.002525f, 0.002638f, 0.002850f, - 0.002962f, 0.003130f, 0.003347f, 0.003536f, 0.003784f, 0.004063f, 0.004364f, 0.004623f, - 0.004929f, 0.005314f, 0.005714f, 0.006191f, 0.006760f, 0.007385f, 0.008080f, 0.008919f, - 0.009933f, 0.011078f, 0.012390f, 0.014130f, 0.016251f, 0.019012f, 0.022720f, 0.027496f, - 0.033234f, 0.040192f, 0.403320f, 0.468994f, 0.485352f, 0.491943f, 0.497070f, 0.500000f, - 0.000093f, 0.000191f, 0.000299f, 0.000284f, 0.000367f, 0.000453f, 0.000420f, 0.000467f, - 0.000519f, 0.000611f, 0.000607f, 0.000626f, 0.000647f, 0.000722f, 0.000741f, 0.000815f, - 0.000829f, 0.000910f, 0.000967f, 0.001023f, 0.001076f, 0.001138f, 0.001197f, 0.001260f, - 0.001334f, 0.001393f, 0.001490f, 0.001562f, 0.001633f, 0.001772f, 0.001831f, 0.001949f, - 0.002056f, 0.002167f, 0.002312f, 0.002472f, 0.002607f, 0.002781f, 0.002972f, 0.003145f, - 0.003387f, 0.003647f, 0.003941f, 0.004253f, 0.004604f, 0.005051f, 0.005558f, 0.006165f, - 0.006836f, 0.007660f, 0.008652f, 0.009796f, 0.011284f, 0.013260f, 0.015945f, 0.019608f, - 0.024734f, 0.031082f, 0.390625f, 0.459229f, 0.475586f, 0.482910f, 0.488037f, 0.490723f, - 0.000132f, 0.000208f, 0.000217f, 0.000221f, 0.000267f, 0.000272f, 0.000277f, 0.000320f, - 0.000356f, 0.000372f, 0.000372f, 0.000446f, 0.000436f, 0.000487f, 0.000514f, 0.000531f, - 0.000587f, 0.000601f, 0.000629f, 0.000658f, 0.000707f, 0.000736f, 0.000784f, 0.000816f, - 0.000880f, 0.000909f, 0.000978f, 0.001035f, 0.001084f, 0.001135f, 0.001200f, 0.001278f, - 0.001357f, 0.001429f, 0.001516f, 0.001588f, 0.001724f, 0.001802f, 0.001949f, 0.002085f, - 0.002230f, 0.002373f, 0.002554f, 0.002743f, 0.003000f, 0.003300f, 0.003611f, 0.003963f, - 0.004425f, 0.004967f, 0.005630f, 0.006424f, 0.007462f, 0.008812f, 0.010551f, 0.013184f, - 0.017258f, 0.022980f, 0.377686f, 0.448242f, 0.465820f, 0.474121f, 0.478760f, 0.481934f, - 0.000041f, 0.000149f, 0.000126f, 0.000128f, 0.000158f, 0.000196f, 0.000174f, 0.000206f, - 0.000216f, 0.000223f, 0.000231f, 0.000244f, 0.000276f, 0.000291f, 0.000312f, 0.000326f, - 0.000338f, 0.000374f, 0.000387f, 0.000423f, 0.000430f, 0.000447f, 0.000471f, 0.000509f, - 0.000538f, 0.000583f, 0.000591f, 0.000613f, 0.000659f, 0.000688f, 0.000743f, 0.000779f, - 0.000833f, 0.000865f, 0.000924f, 0.000966f, 0.001033f, 0.001106f, 0.001186f, 0.001245f, - 0.001336f, 0.001453f, 0.001559f, 0.001685f, 0.001807f, 0.001980f, 0.002207f, 0.002417f, - 0.002689f, 0.003027f, 0.003418f, 0.003933f, 0.004604f, 0.005482f, 0.006641f, 0.008263f, - 0.011017f, 0.015778f, 0.364746f, 0.437256f, 0.456055f, 0.463623f, 0.469238f, 0.472656f, - 0.000100f, 0.000089f, 0.000085f, 0.000081f, 0.000101f, 0.000096f, 0.000116f, 0.000116f, - 0.000119f, 0.000126f, 0.000141f, 0.000157f, 0.000149f, 0.000158f, 0.000179f, 0.000176f, - 0.000195f, 0.000206f, 0.000216f, 0.000222f, 0.000240f, 0.000246f, 0.000269f, 0.000279f, - 0.000303f, 0.000320f, 0.000333f, 0.000345f, 0.000365f, 0.000379f, 0.000409f, 0.000434f, - 0.000453f, 0.000477f, 0.000511f, 0.000541f, 0.000569f, 0.000608f, 0.000656f, 0.000689f, - 0.000738f, 0.000795f, 0.000867f, 0.000918f, 0.001005f, 0.001087f, 0.001189f, 0.001312f, - 0.001465f, 0.001656f, 0.001873f, 0.002171f, 0.002546f, 0.003056f, 0.003767f, 0.004765f, - 0.006390f, 0.009811f, 0.353516f, 0.426758f, 0.446045f, 0.455078f, 0.459717f, 0.464111f, - 0.000084f, 0.000059f, 0.000050f, 0.000049f, 0.000049f, 0.000047f, 0.000052f, 0.000058f, - 0.000061f, 0.000075f, 0.000065f, 0.000066f, 0.000080f, 0.000071f, 0.000076f, 0.000082f, - 0.000092f, 0.000102f, 0.000100f, 0.000105f, 0.000110f, 0.000115f, 0.000121f, 0.000133f, - 0.000140f, 0.000146f, 0.000152f, 0.000164f, 0.000177f, 0.000185f, 0.000192f, 0.000202f, - 0.000213f, 0.000224f, 0.000241f, 0.000252f, 0.000268f, 0.000283f, 0.000310f, 0.000328f, - 0.000348f, 0.000374f, 0.000406f, 0.000431f, 0.000470f, 0.000515f, 0.000560f, 0.000614f, - 0.000688f, 0.000771f, 0.000884f, 0.001019f, 0.001202f, 0.001466f, 0.001827f, 0.002369f, - 0.003269f, 0.005184f, 0.341797f, 0.416016f, 0.435791f, 0.445557f, 0.450928f, 0.455078f, - 0.000062f, 0.000042f, 0.000035f, 0.000030f, 0.000028f, 0.000026f, 0.000024f, 0.000023f, - 0.000023f, 0.000023f, 0.000023f, 0.000030f, 0.000024f, 0.000024f, 0.000031f, 0.000034f, - 0.000035f, 0.000037f, 0.000039f, 0.000040f, 0.000043f, 0.000048f, 0.000050f, 0.000046f, - 0.000051f, 0.000057f, 0.000059f, 0.000058f, 0.000063f, 0.000068f, 0.000070f, 0.000077f, - 0.000082f, 0.000082f, 0.000086f, 0.000093f, 0.000100f, 0.000106f, 0.000114f, 0.000120f, - 0.000131f, 0.000136f, 0.000145f, 0.000161f, 0.000171f, 0.000186f, 0.000204f, 0.000222f, - 0.000251f, 0.000281f, 0.000318f, 0.000364f, 0.000430f, 0.000530f, 0.000672f, 0.000902f, - 0.001316f, 0.002153f, 0.329346f, 0.406006f, 0.426758f, 0.436035f, 0.441650f, 0.445801f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, - 0.000011f, 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, - 0.000008f, 0.000008f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000010f, - 0.000011f, 0.000012f, 0.000012f, 0.000014f, 0.000014f, 0.000013f, 0.000015f, 0.000016f, - 0.000018f, 0.000019f, 0.000019f, 0.000020f, 0.000023f, 0.000023f, 0.000025f, 0.000027f, - 0.000028f, 0.000031f, 0.000034f, 0.000034f, 0.000037f, 0.000041f, 0.000045f, 0.000049f, - 0.000053f, 0.000059f, 0.000066f, 0.000079f, 0.000093f, 0.000112f, 0.000144f, 0.000196f, - 0.000307f, 0.000598f, 0.317383f, 0.394531f, 0.416504f, 0.425781f, 0.432129f, 0.436279f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000007f, - 0.000010f, 0.000026f, 0.305420f, 0.384277f, 0.405762f, 0.416504f, 0.423340f, 0.427246f, - }, - { - 0.009338f, 0.028412f, 0.047394f, 0.066895f, 0.086548f, 0.105774f, 0.125854f, 0.145142f, - 0.165039f, 0.184570f, 0.204712f, 0.223389f, 0.243164f, 0.261719f, 0.280762f, 0.299805f, - 0.318848f, 0.338135f, 0.356445f, 0.374512f, 0.393066f, 0.412354f, 0.429932f, 0.447510f, - 0.465576f, 0.483887f, 0.501465f, 0.518555f, 0.536133f, 0.553711f, 0.570312f, 0.587402f, - 0.604492f, 0.621094f, 0.637695f, 0.653809f, 0.670898f, 0.687012f, 0.702637f, 0.719238f, - 0.734863f, 0.750488f, 0.765137f, 0.780762f, 0.795898f, 0.811523f, 0.825684f, 0.840820f, - 0.855469f, 0.870605f, 0.884277f, 0.899414f, 0.913086f, 0.926758f, 0.940918f, 0.955078f, - 0.967773f, 0.981934f, 0.966797f, 0.923828f, 0.894531f, 0.870605f, 0.850586f, 0.832520f, - 0.008652f, 0.026825f, 0.045380f, 0.063965f, 0.082703f, 0.101807f, 0.120544f, 0.139282f, - 0.158569f, 0.177246f, 0.196167f, 0.214722f, 0.233521f, 0.252197f, 0.270508f, 0.289062f, - 0.307861f, 0.325928f, 0.343994f, 0.361328f, 0.380615f, 0.397705f, 0.415771f, 0.433594f, - 0.450928f, 0.469238f, 0.485596f, 0.502930f, 0.520020f, 0.537598f, 0.553223f, 0.570801f, - 0.586914f, 0.603516f, 0.620117f, 0.636719f, 0.652832f, 0.668945f, 0.683594f, 0.700684f, - 0.716309f, 0.731934f, 0.746582f, 0.762695f, 0.777344f, 0.792480f, 0.807617f, 0.821777f, - 0.836914f, 0.850586f, 0.865723f, 0.880371f, 0.894043f, 0.908691f, 0.921875f, 0.937012f, - 0.950195f, 0.963867f, 0.958496f, 0.917969f, 0.889648f, 0.867188f, 0.847656f, 0.830566f, - 0.008293f, 0.025620f, 0.042999f, 0.061035f, 0.079163f, 0.097656f, 0.115112f, 0.132812f, - 0.151367f, 0.170532f, 0.188599f, 0.206787f, 0.223999f, 0.242920f, 0.259766f, 0.278809f, - 0.296143f, 0.313232f, 0.331055f, 0.349609f, 0.367432f, 0.385010f, 0.401611f, 0.418945f, - 0.435791f, 0.453369f, 0.469727f, 0.487061f, 0.503906f, 0.520508f, 0.537598f, 0.553223f, - 0.569824f, 0.586426f, 0.603027f, 0.619141f, 0.634277f, 0.650879f, 0.666504f, 0.682129f, - 0.697754f, 0.713379f, 0.729004f, 0.743164f, 0.758301f, 0.773926f, 0.789062f, 0.803711f, - 0.818359f, 0.833008f, 0.847168f, 0.862305f, 0.875488f, 0.890137f, 0.903809f, 0.917480f, - 0.931152f, 0.945801f, 0.950195f, 0.911133f, 0.884766f, 0.862793f, 0.844238f, 0.828125f, - 0.008148f, 0.024506f, 0.041016f, 0.058289f, 0.075256f, 0.092712f, 0.109802f, 0.127319f, - 0.145020f, 0.162964f, 0.180298f, 0.198120f, 0.215454f, 0.232300f, 0.250244f, 0.267822f, - 0.285400f, 0.302734f, 0.318848f, 0.335693f, 0.354004f, 0.371582f, 0.388672f, 0.405029f, - 0.421143f, 0.438965f, 0.455078f, 0.472168f, 0.487549f, 0.503906f, 0.521484f, 0.537598f, - 0.551758f, 0.568359f, 0.584961f, 0.601562f, 0.616211f, 0.633301f, 0.648926f, 0.664062f, - 0.679199f, 0.694824f, 0.709473f, 0.725098f, 0.740234f, 0.755371f, 0.770020f, 0.785156f, - 0.799805f, 0.813965f, 0.828125f, 0.842773f, 0.856934f, 0.871582f, 0.884766f, 0.898926f, - 0.912598f, 0.926270f, 0.941895f, 0.905273f, 0.879883f, 0.858887f, 0.840332f, 0.824707f, - 0.007523f, 0.023010f, 0.039246f, 0.055542f, 0.072021f, 0.088257f, 0.105347f, 0.122070f, - 0.138306f, 0.155273f, 0.172852f, 0.189575f, 0.206421f, 0.223145f, 0.240112f, 0.256592f, - 0.274170f, 0.291260f, 0.307617f, 0.323730f, 0.340576f, 0.358154f, 0.374023f, 0.390137f, - 0.406738f, 0.422852f, 0.440430f, 0.456543f, 0.472656f, 0.489014f, 0.504395f, 0.520996f, - 0.537109f, 0.552734f, 0.568848f, 0.584473f, 0.599121f, 0.615234f, 0.630859f, 0.645020f, - 0.660645f, 0.677246f, 0.690918f, 0.706055f, 0.721680f, 0.736328f, 0.750977f, 0.766113f, - 0.780273f, 0.794922f, 0.809570f, 0.823730f, 0.837891f, 0.852539f, 0.866211f, 0.880371f, - 0.894531f, 0.908691f, 0.933105f, 0.898438f, 0.874023f, 0.853516f, 0.836426f, 0.821289f, - 0.007339f, 0.021912f, 0.037170f, 0.052948f, 0.068665f, 0.084412f, 0.100281f, 0.116333f, - 0.133057f, 0.149048f, 0.164795f, 0.181274f, 0.198242f, 0.214233f, 0.230835f, 0.247314f, - 0.262939f, 0.279053f, 0.295898f, 0.312500f, 0.328613f, 0.344971f, 0.360107f, 0.376953f, - 0.392578f, 0.408691f, 0.425293f, 0.441406f, 0.456787f, 0.472656f, 0.488525f, 0.504883f, - 0.520020f, 0.535156f, 0.550781f, 0.567383f, 0.582520f, 0.597656f, 0.612793f, 0.628418f, - 0.642578f, 0.657715f, 0.673340f, 0.688477f, 0.702637f, 0.718750f, 0.731445f, 0.748047f, - 0.762207f, 0.775879f, 0.791016f, 0.804199f, 0.818848f, 0.833008f, 0.847656f, 0.861328f, - 0.875000f, 0.890625f, 0.924316f, 0.891602f, 0.868164f, 0.849121f, 0.832520f, 0.817871f, - 0.006817f, 0.021133f, 0.035675f, 0.050018f, 0.065186f, 0.080505f, 0.096069f, 0.111389f, - 0.126831f, 0.142456f, 0.158203f, 0.174194f, 0.189819f, 0.205444f, 0.220703f, 0.237183f, - 0.253174f, 0.268555f, 0.284668f, 0.300049f, 0.316406f, 0.332275f, 0.347656f, 0.363281f, - 0.379395f, 0.394775f, 0.409668f, 0.426270f, 0.442139f, 0.457275f, 0.472656f, 0.488037f, - 0.503906f, 0.518555f, 0.534668f, 0.548828f, 0.564941f, 0.579590f, 0.595215f, 0.610352f, - 0.625000f, 0.640137f, 0.654785f, 0.669434f, 0.685059f, 0.699707f, 0.713379f, 0.728027f, - 0.742676f, 0.758301f, 0.770996f, 0.786621f, 0.799316f, 0.813965f, 0.828613f, 0.842285f, - 0.856445f, 0.871094f, 0.915527f, 0.884766f, 0.862305f, 0.843750f, 0.827637f, 0.813965f, - 0.006611f, 0.020111f, 0.033752f, 0.047974f, 0.062378f, 0.076843f, 0.091431f, 0.106262f, - 0.120911f, 0.136230f, 0.151123f, 0.166382f, 0.181396f, 0.196899f, 0.211670f, 0.227295f, - 0.242554f, 0.257812f, 0.272705f, 0.288086f, 0.304199f, 0.318848f, 0.334473f, 0.349609f, - 0.365967f, 0.379883f, 0.395996f, 0.410889f, 0.426270f, 0.441895f, 0.457764f, 0.472412f, - 0.487061f, 0.502930f, 0.517090f, 0.532227f, 0.547363f, 0.563477f, 0.577637f, 0.592285f, - 0.606934f, 0.621582f, 0.636230f, 0.651367f, 0.665039f, 0.679688f, 0.694336f, 0.709473f, - 0.724121f, 0.738770f, 0.752930f, 0.767578f, 0.780762f, 0.795410f, 0.809082f, 0.823242f, - 0.837891f, 0.852539f, 0.906250f, 0.877441f, 0.855957f, 0.838379f, 0.823242f, 0.809570f, - 0.006153f, 0.019150f, 0.031952f, 0.045624f, 0.059326f, 0.073303f, 0.087158f, 0.101562f, - 0.115540f, 0.129395f, 0.144653f, 0.159180f, 0.173584f, 0.187866f, 0.203613f, 0.217651f, - 0.232300f, 0.247559f, 0.262207f, 0.277344f, 0.292969f, 0.307617f, 0.322021f, 0.336914f, - 0.352051f, 0.367188f, 0.381592f, 0.396729f, 0.411377f, 0.427002f, 0.440918f, 0.456787f, - 0.471436f, 0.486572f, 0.500977f, 0.514648f, 0.530273f, 0.545410f, 0.560059f, 0.574219f, - 0.589355f, 0.604004f, 0.618164f, 0.632324f, 0.647461f, 0.661133f, 0.676270f, 0.691406f, - 0.705078f, 0.719727f, 0.733887f, 0.748047f, 0.763184f, 0.777344f, 0.791016f, 0.805176f, - 0.819336f, 0.833496f, 0.896973f, 0.870117f, 0.849609f, 0.833008f, 0.818359f, 0.805176f, - 0.005947f, 0.018311f, 0.030731f, 0.043243f, 0.056732f, 0.069580f, 0.083435f, 0.096558f, - 0.110474f, 0.123962f, 0.137695f, 0.152100f, 0.166016f, 0.180054f, 0.194092f, 0.208862f, - 0.222656f, 0.236816f, 0.251465f, 0.266113f, 0.281250f, 0.294922f, 0.309814f, 0.324219f, - 0.338623f, 0.352783f, 0.368164f, 0.382568f, 0.397461f, 0.411377f, 0.426025f, 0.441162f, - 0.455078f, 0.469971f, 0.484131f, 0.499268f, 0.513672f, 0.528320f, 0.542969f, 0.557129f, - 0.571289f, 0.585449f, 0.599609f, 0.614258f, 0.628418f, 0.643066f, 0.657227f, 0.671875f, - 0.686523f, 0.700195f, 0.714355f, 0.729004f, 0.743164f, 0.756836f, 0.770996f, 0.785645f, - 0.800293f, 0.814453f, 0.888184f, 0.862305f, 0.843262f, 0.827148f, 0.813477f, 0.800781f, - 0.005646f, 0.017136f, 0.029388f, 0.041534f, 0.053802f, 0.066162f, 0.078979f, 0.092285f, - 0.104980f, 0.118408f, 0.130981f, 0.144897f, 0.158203f, 0.172363f, 0.185547f, 0.199951f, - 0.213501f, 0.226440f, 0.240356f, 0.254883f, 0.269287f, 0.283691f, 0.297607f, 0.311279f, - 0.325439f, 0.339600f, 0.353760f, 0.368408f, 0.382812f, 0.396973f, 0.410645f, 0.425049f, - 0.439697f, 0.454102f, 0.468262f, 0.482178f, 0.496094f, 0.510742f, 0.524902f, 0.539551f, - 0.554199f, 0.568359f, 0.582031f, 0.596191f, 0.610352f, 0.624023f, 0.639160f, 0.652832f, - 0.667969f, 0.681152f, 0.696289f, 0.709961f, 0.723633f, 0.738770f, 0.752441f, 0.765625f, - 0.780273f, 0.794922f, 0.878418f, 0.855469f, 0.836914f, 0.821289f, 0.808105f, 0.796387f, - 0.005478f, 0.016174f, 0.027740f, 0.038849f, 0.051270f, 0.063293f, 0.075317f, 0.087402f, - 0.099854f, 0.112793f, 0.125366f, 0.138184f, 0.151001f, 0.164307f, 0.177734f, 0.190918f, - 0.204102f, 0.217529f, 0.231079f, 0.244141f, 0.257324f, 0.271240f, 0.284668f, 0.299072f, - 0.312744f, 0.326660f, 0.339600f, 0.354004f, 0.368408f, 0.382324f, 0.395264f, 0.410156f, - 0.423096f, 0.437500f, 0.452148f, 0.465332f, 0.480469f, 0.493408f, 0.507812f, 0.521484f, - 0.535645f, 0.549316f, 0.563477f, 0.578125f, 0.592285f, 0.605957f, 0.620605f, 0.634766f, - 0.647949f, 0.662109f, 0.676758f, 0.691406f, 0.705078f, 0.718750f, 0.732910f, 0.747559f, - 0.762207f, 0.777344f, 0.869141f, 0.847656f, 0.830078f, 0.815430f, 0.802734f, 0.791504f, - 0.005005f, 0.015762f, 0.026657f, 0.037384f, 0.048218f, 0.059998f, 0.071594f, 0.083618f, - 0.095215f, 0.107666f, 0.119141f, 0.131958f, 0.144043f, 0.156128f, 0.169800f, 0.182129f, - 0.194824f, 0.207031f, 0.219849f, 0.233032f, 0.247559f, 0.260010f, 0.272949f, 0.286133f, - 0.300293f, 0.313477f, 0.326172f, 0.339844f, 0.353516f, 0.367188f, 0.381592f, 0.394531f, - 0.407959f, 0.422363f, 0.436279f, 0.449463f, 0.462891f, 0.477539f, 0.490723f, 0.504395f, - 0.518066f, 0.532227f, 0.545898f, 0.560059f, 0.574219f, 0.586914f, 0.602051f, 0.616211f, - 0.629395f, 0.644531f, 0.657227f, 0.671875f, 0.685547f, 0.699707f, 0.713867f, 0.728516f, - 0.742676f, 0.756836f, 0.859375f, 0.840332f, 0.823730f, 0.809082f, 0.797363f, 0.786621f, - 0.004894f, 0.014786f, 0.025269f, 0.035614f, 0.045990f, 0.057129f, 0.068420f, 0.079224f, - 0.090698f, 0.102112f, 0.113708f, 0.125610f, 0.137817f, 0.149536f, 0.161377f, 0.174316f, - 0.185791f, 0.198486f, 0.211670f, 0.223389f, 0.236816f, 0.249512f, 0.261230f, 0.274414f, - 0.287598f, 0.300537f, 0.313232f, 0.326904f, 0.340576f, 0.353027f, 0.366211f, 0.379883f, - 0.393066f, 0.406006f, 0.419678f, 0.433350f, 0.446289f, 0.460205f, 0.473633f, 0.487305f, - 0.500977f, 0.515137f, 0.528320f, 0.542480f, 0.554688f, 0.569824f, 0.583008f, 0.597656f, - 0.610840f, 0.625488f, 0.638672f, 0.652832f, 0.666504f, 0.681152f, 0.694824f, 0.708984f, - 0.723145f, 0.737793f, 0.850098f, 0.833008f, 0.817383f, 0.802734f, 0.791992f, 0.780762f, - 0.004536f, 0.014160f, 0.023972f, 0.033630f, 0.043823f, 0.053955f, 0.064697f, 0.075195f, - 0.086365f, 0.096802f, 0.108276f, 0.119751f, 0.130493f, 0.142212f, 0.153687f, 0.165405f, - 0.177246f, 0.189331f, 0.201538f, 0.213501f, 0.225464f, 0.237915f, 0.250244f, 0.262939f, - 0.274902f, 0.288086f, 0.300781f, 0.312988f, 0.326172f, 0.339600f, 0.352051f, 0.365479f, - 0.377930f, 0.390625f, 0.403564f, 0.417480f, 0.430420f, 0.444092f, 0.457520f, 0.470215f, - 0.483643f, 0.497559f, 0.510742f, 0.524414f, 0.537598f, 0.551270f, 0.564941f, 0.579102f, - 0.592285f, 0.605957f, 0.619629f, 0.633789f, 0.647949f, 0.661621f, 0.675293f, 0.689453f, - 0.704102f, 0.718262f, 0.840332f, 0.825195f, 0.809570f, 0.797363f, 0.786133f, 0.776367f, - 0.004433f, 0.013138f, 0.022720f, 0.032013f, 0.041199f, 0.051147f, 0.061462f, 0.071716f, - 0.082336f, 0.091919f, 0.102722f, 0.113586f, 0.124390f, 0.135010f, 0.145996f, 0.157837f, - 0.168823f, 0.180054f, 0.192383f, 0.203491f, 0.215332f, 0.227417f, 0.239502f, 0.251221f, - 0.263672f, 0.275635f, 0.287842f, 0.300537f, 0.312500f, 0.324707f, 0.338135f, 0.350342f, - 0.363037f, 0.375977f, 0.388672f, 0.401611f, 0.413818f, 0.427246f, 0.440186f, 0.453613f, - 0.466064f, 0.479736f, 0.492920f, 0.506836f, 0.519531f, 0.533203f, 0.546875f, 0.560059f, - 0.573242f, 0.587402f, 0.600098f, 0.614746f, 0.628418f, 0.642578f, 0.657227f, 0.670898f, - 0.685059f, 0.699707f, 0.830566f, 0.816406f, 0.802734f, 0.791016f, 0.780273f, 0.770996f, - 0.004372f, 0.012619f, 0.021393f, 0.030350f, 0.039276f, 0.048523f, 0.058289f, 0.067505f, - 0.077393f, 0.087585f, 0.097290f, 0.107727f, 0.118225f, 0.128296f, 0.138550f, 0.149414f, - 0.160278f, 0.171631f, 0.182739f, 0.193359f, 0.205200f, 0.216187f, 0.228027f, 0.240234f, - 0.251465f, 0.263428f, 0.275146f, 0.287598f, 0.298828f, 0.311523f, 0.323242f, 0.336182f, - 0.348633f, 0.360107f, 0.372803f, 0.385986f, 0.398682f, 0.411621f, 0.424072f, 0.436523f, - 0.449951f, 0.462891f, 0.475098f, 0.488525f, 0.501953f, 0.514648f, 0.527344f, 0.541992f, - 0.555176f, 0.569336f, 0.582031f, 0.596191f, 0.609863f, 0.623047f, 0.637695f, 0.651855f, - 0.665527f, 0.679688f, 0.821289f, 0.808105f, 0.795410f, 0.784180f, 0.774902f, 0.765137f, - 0.003937f, 0.012169f, 0.020477f, 0.028641f, 0.037781f, 0.046448f, 0.055481f, 0.064209f, - 0.073181f, 0.082458f, 0.092651f, 0.101990f, 0.111572f, 0.121948f, 0.132202f, 0.142212f, - 0.151978f, 0.162720f, 0.173340f, 0.184326f, 0.195312f, 0.206055f, 0.217163f, 0.228516f, - 0.239990f, 0.250977f, 0.262695f, 0.274658f, 0.285889f, 0.297363f, 0.308838f, 0.321045f, - 0.333496f, 0.345459f, 0.357422f, 0.370117f, 0.382324f, 0.395020f, 0.407227f, 0.419922f, - 0.432617f, 0.444336f, 0.458008f, 0.470703f, 0.483398f, 0.497559f, 0.510254f, 0.522949f, - 0.536133f, 0.550293f, 0.562988f, 0.577637f, 0.590820f, 0.603516f, 0.618164f, 0.632324f, - 0.645508f, 0.660645f, 0.811035f, 0.800293f, 0.788086f, 0.777832f, 0.768555f, 0.760254f, - 0.003868f, 0.011368f, 0.019257f, 0.027512f, 0.035431f, 0.043274f, 0.051880f, 0.060852f, - 0.069214f, 0.078003f, 0.087524f, 0.096924f, 0.105896f, 0.115112f, 0.124817f, 0.134766f, - 0.144409f, 0.154663f, 0.164673f, 0.175415f, 0.184814f, 0.196289f, 0.206299f, 0.216797f, - 0.228394f, 0.239380f, 0.250244f, 0.260986f, 0.273193f, 0.284424f, 0.295410f, 0.307373f, - 0.319092f, 0.331299f, 0.342285f, 0.354248f, 0.366455f, 0.378662f, 0.390869f, 0.403809f, - 0.415771f, 0.427734f, 0.440430f, 0.453369f, 0.466309f, 0.479736f, 0.492188f, 0.504883f, - 0.518066f, 0.531250f, 0.544922f, 0.558105f, 0.571777f, 0.584473f, 0.598633f, 0.612305f, - 0.626465f, 0.641602f, 0.801758f, 0.792480f, 0.781738f, 0.770508f, 0.761230f, 0.753906f, - 0.003616f, 0.010872f, 0.018387f, 0.026077f, 0.033875f, 0.041351f, 0.049591f, 0.057434f, - 0.065674f, 0.073669f, 0.082153f, 0.091064f, 0.100098f, 0.109009f, 0.117981f, 0.127563f, - 0.137207f, 0.146362f, 0.156494f, 0.165894f, 0.176025f, 0.186157f, 0.196655f, 0.206421f, - 0.216919f, 0.227539f, 0.237915f, 0.249268f, 0.260254f, 0.270752f, 0.282471f, 0.293945f, - 0.305176f, 0.316406f, 0.328125f, 0.338867f, 0.350342f, 0.361816f, 0.375244f, 0.387207f, - 0.398926f, 0.411133f, 0.423584f, 0.436523f, 0.448730f, 0.461182f, 0.474121f, 0.485840f, - 0.499756f, 0.513672f, 0.525391f, 0.539062f, 0.552734f, 0.565918f, 0.580566f, 0.593750f, - 0.608398f, 0.621094f, 0.790527f, 0.783691f, 0.773926f, 0.764160f, 0.755859f, 0.747559f, - 0.003450f, 0.010429f, 0.017487f, 0.024445f, 0.031860f, 0.039581f, 0.046631f, 0.054718f, - 0.061951f, 0.070251f, 0.078003f, 0.086121f, 0.094910f, 0.102905f, 0.111572f, 0.120300f, - 0.129761f, 0.138428f, 0.147217f, 0.156982f, 0.166992f, 0.176147f, 0.186157f, 0.196045f, - 0.206299f, 0.216187f, 0.226318f, 0.236938f, 0.247437f, 0.258301f, 0.268311f, 0.279785f, - 0.290527f, 0.301758f, 0.312744f, 0.324219f, 0.335449f, 0.346680f, 0.359131f, 0.370605f, - 0.382812f, 0.394531f, 0.406982f, 0.419189f, 0.430908f, 0.443604f, 0.456055f, 0.468506f, - 0.481445f, 0.494873f, 0.506836f, 0.520996f, 0.534180f, 0.547363f, 0.561035f, 0.573730f, - 0.588379f, 0.601074f, 0.780762f, 0.775879f, 0.766602f, 0.757324f, 0.748535f, 0.741699f, - 0.003281f, 0.009811f, 0.016174f, 0.023438f, 0.030060f, 0.037109f, 0.044464f, 0.051239f, - 0.058441f, 0.066345f, 0.073792f, 0.081238f, 0.089539f, 0.097229f, 0.105286f, 0.113647f, - 0.122498f, 0.130615f, 0.139526f, 0.148438f, 0.157837f, 0.166626f, 0.176636f, 0.185547f, - 0.195312f, 0.204956f, 0.215088f, 0.224976f, 0.234863f, 0.245239f, 0.255859f, 0.266113f, - 0.276367f, 0.287354f, 0.298096f, 0.309326f, 0.320801f, 0.331787f, 0.343018f, 0.355225f, - 0.366211f, 0.378418f, 0.389893f, 0.401611f, 0.413574f, 0.425781f, 0.438721f, 0.451416f, - 0.463135f, 0.476074f, 0.489014f, 0.501465f, 0.514648f, 0.528809f, 0.541992f, 0.554688f, - 0.568848f, 0.582520f, 0.770508f, 0.767090f, 0.758789f, 0.750488f, 0.743164f, 0.735352f, - 0.002901f, 0.009422f, 0.015488f, 0.021729f, 0.028290f, 0.035278f, 0.041321f, 0.048523f, - 0.055420f, 0.062195f, 0.069336f, 0.076477f, 0.084412f, 0.091858f, 0.099609f, 0.107361f, - 0.115112f, 0.123535f, 0.131592f, 0.140137f, 0.148438f, 0.157715f, 0.166382f, 0.174927f, - 0.184692f, 0.193970f, 0.203369f, 0.212646f, 0.222656f, 0.232910f, 0.242920f, 0.252197f, - 0.263184f, 0.273438f, 0.284180f, 0.294922f, 0.305664f, 0.316895f, 0.327881f, 0.338867f, - 0.349854f, 0.361328f, 0.373291f, 0.385254f, 0.397461f, 0.408691f, 0.420898f, 0.433350f, - 0.445801f, 0.458252f, 0.470703f, 0.483154f, 0.496826f, 0.510254f, 0.522461f, 0.535645f, - 0.549805f, 0.562988f, 0.760742f, 0.758789f, 0.750488f, 0.743652f, 0.736328f, 0.729492f, - 0.002861f, 0.008606f, 0.014488f, 0.021057f, 0.026810f, 0.032898f, 0.038879f, 0.045532f, - 0.051666f, 0.058319f, 0.065125f, 0.072449f, 0.079224f, 0.086426f, 0.093689f, 0.100830f, - 0.108276f, 0.116089f, 0.123962f, 0.131958f, 0.140625f, 0.148560f, 0.156494f, 0.164795f, - 0.174194f, 0.183228f, 0.192017f, 0.201294f, 0.210815f, 0.220093f, 0.229858f, 0.239746f, - 0.249390f, 0.260010f, 0.270508f, 0.280518f, 0.290771f, 0.301758f, 0.312744f, 0.323486f, - 0.334473f, 0.345215f, 0.356934f, 0.368408f, 0.379883f, 0.391846f, 0.403564f, 0.416016f, - 0.427490f, 0.439453f, 0.452881f, 0.465332f, 0.478271f, 0.490234f, 0.503906f, 0.517090f, - 0.529785f, 0.543945f, 0.750000f, 0.750000f, 0.743164f, 0.736328f, 0.729492f, 0.723145f, - 0.002977f, 0.008492f, 0.013931f, 0.019745f, 0.024948f, 0.030991f, 0.036804f, 0.042755f, - 0.048889f, 0.055267f, 0.061737f, 0.067932f, 0.074829f, 0.081116f, 0.087646f, 0.095215f, - 0.102356f, 0.109436f, 0.116760f, 0.124023f, 0.131714f, 0.139648f, 0.147461f, 0.155762f, - 0.164185f, 0.172485f, 0.181152f, 0.189697f, 0.198730f, 0.208130f, 0.217285f, 0.226685f, - 0.236572f, 0.245850f, 0.255859f, 0.265869f, 0.276367f, 0.286377f, 0.297607f, 0.307861f, - 0.318359f, 0.329102f, 0.340576f, 0.351807f, 0.363281f, 0.374023f, 0.386230f, 0.397949f, - 0.409668f, 0.422119f, 0.434082f, 0.446777f, 0.459229f, 0.471924f, 0.484863f, 0.497803f, - 0.511230f, 0.525391f, 0.739746f, 0.741211f, 0.735352f, 0.729004f, 0.722656f, 0.717285f, - 0.002441f, 0.007896f, 0.013443f, 0.018402f, 0.023911f, 0.029343f, 0.034454f, 0.040375f, - 0.045868f, 0.051453f, 0.057800f, 0.063721f, 0.070068f, 0.075928f, 0.082520f, 0.089233f, - 0.095703f, 0.102478f, 0.109314f, 0.116638f, 0.123596f, 0.131348f, 0.138550f, 0.145996f, - 0.153809f, 0.162109f, 0.170044f, 0.179199f, 0.187866f, 0.196045f, 0.205078f, 0.213745f, - 0.223389f, 0.233032f, 0.242554f, 0.252197f, 0.261963f, 0.271973f, 0.281982f, 0.292236f, - 0.303223f, 0.312988f, 0.324463f, 0.335693f, 0.346191f, 0.357910f, 0.368652f, 0.380371f, - 0.391846f, 0.404541f, 0.415527f, 0.428467f, 0.440674f, 0.453369f, 0.466553f, 0.479248f, - 0.491455f, 0.505371f, 0.729492f, 0.732422f, 0.727539f, 0.721191f, 0.716309f, 0.709961f, - 0.002457f, 0.007553f, 0.012489f, 0.017548f, 0.022217f, 0.027405f, 0.032471f, 0.037689f, - 0.043060f, 0.048553f, 0.054230f, 0.059631f, 0.065369f, 0.071533f, 0.077393f, 0.083069f, - 0.089417f, 0.096069f, 0.102356f, 0.108398f, 0.115417f, 0.122925f, 0.130127f, 0.137451f, - 0.144531f, 0.152100f, 0.160156f, 0.168091f, 0.176514f, 0.184570f, 0.192871f, 0.201660f, - 0.210571f, 0.219238f, 0.229126f, 0.238281f, 0.248413f, 0.257812f, 0.267578f, 0.277588f, - 0.287354f, 0.298096f, 0.308594f, 0.319336f, 0.329590f, 0.340820f, 0.351318f, 0.363770f, - 0.375732f, 0.386963f, 0.397949f, 0.409912f, 0.422363f, 0.434326f, 0.446533f, 0.459473f, - 0.473145f, 0.486084f, 0.718750f, 0.723633f, 0.719727f, 0.713867f, 0.708984f, 0.703613f, - 0.002436f, 0.006939f, 0.011612f, 0.016113f, 0.021072f, 0.025497f, 0.030640f, 0.035339f, - 0.040222f, 0.045441f, 0.050690f, 0.055725f, 0.060669f, 0.066589f, 0.072144f, 0.077881f, - 0.083740f, 0.089294f, 0.095215f, 0.101501f, 0.108032f, 0.114868f, 0.121643f, 0.128052f, - 0.135010f, 0.142334f, 0.150024f, 0.157349f, 0.164917f, 0.173340f, 0.181274f, 0.189697f, - 0.198120f, 0.206909f, 0.215698f, 0.224365f, 0.234497f, 0.243652f, 0.252930f, 0.262695f, - 0.272461f, 0.282471f, 0.292480f, 0.302979f, 0.313721f, 0.324463f, 0.335205f, 0.346436f, - 0.357666f, 0.369141f, 0.380859f, 0.391602f, 0.404541f, 0.416016f, 0.428467f, 0.440918f, - 0.454102f, 0.466553f, 0.708496f, 0.715820f, 0.711426f, 0.706055f, 0.701660f, 0.696777f, - 0.002188f, 0.006599f, 0.011032f, 0.015068f, 0.019897f, 0.024048f, 0.028656f, 0.033264f, - 0.037720f, 0.042236f, 0.047028f, 0.051941f, 0.056824f, 0.062012f, 0.067444f, 0.072449f, - 0.077942f, 0.083374f, 0.088867f, 0.094727f, 0.100769f, 0.106750f, 0.112732f, 0.119263f, - 0.126099f, 0.133179f, 0.139648f, 0.146729f, 0.154175f, 0.161987f, 0.170044f, 0.177612f, - 0.185791f, 0.194214f, 0.203125f, 0.211670f, 0.220581f, 0.229370f, 0.238770f, 0.248047f, - 0.257812f, 0.267822f, 0.277344f, 0.287109f, 0.297363f, 0.307861f, 0.318848f, 0.329590f, - 0.341064f, 0.351562f, 0.363037f, 0.374512f, 0.385498f, 0.397461f, 0.409668f, 0.422363f, - 0.434326f, 0.447021f, 0.697266f, 0.706543f, 0.703125f, 0.698730f, 0.694336f, 0.689941f, - 0.002024f, 0.006165f, 0.010399f, 0.014481f, 0.018555f, 0.022797f, 0.026627f, 0.030869f, - 0.035187f, 0.039459f, 0.043732f, 0.047943f, 0.052917f, 0.057434f, 0.062622f, 0.067261f, - 0.071838f, 0.077454f, 0.082581f, 0.087891f, 0.093628f, 0.099182f, 0.105469f, 0.111206f, - 0.117126f, 0.123779f, 0.130371f, 0.137085f, 0.143921f, 0.151001f, 0.158691f, 0.166016f, - 0.173950f, 0.181641f, 0.190063f, 0.198120f, 0.206909f, 0.215698f, 0.224976f, 0.233398f, - 0.242798f, 0.252197f, 0.262207f, 0.271973f, 0.281738f, 0.291992f, 0.302734f, 0.313477f, - 0.323242f, 0.334229f, 0.345459f, 0.355957f, 0.368652f, 0.380615f, 0.391602f, 0.403809f, - 0.415771f, 0.428467f, 0.686523f, 0.696777f, 0.695312f, 0.691895f, 0.687500f, 0.683105f, - 0.001931f, 0.005970f, 0.009651f, 0.013557f, 0.017136f, 0.021088f, 0.024902f, 0.028748f, - 0.032623f, 0.036743f, 0.040833f, 0.044983f, 0.049591f, 0.053467f, 0.057800f, 0.062500f, - 0.066833f, 0.071533f, 0.076538f, 0.081238f, 0.086670f, 0.092224f, 0.097290f, 0.103088f, - 0.108887f, 0.114990f, 0.120972f, 0.127197f, 0.134277f, 0.140503f, 0.147705f, 0.154663f, - 0.162231f, 0.169922f, 0.177612f, 0.185303f, 0.193604f, 0.201904f, 0.210815f, 0.219238f, - 0.228516f, 0.237427f, 0.247070f, 0.256592f, 0.265869f, 0.275879f, 0.285645f, 0.295898f, - 0.306396f, 0.317139f, 0.328369f, 0.338623f, 0.350342f, 0.362305f, 0.374023f, 0.385010f, - 0.397461f, 0.410156f, 0.675781f, 0.687988f, 0.687012f, 0.683594f, 0.680664f, 0.676270f, - 0.001725f, 0.005436f, 0.009171f, 0.012589f, 0.016190f, 0.019485f, 0.023132f, 0.026978f, - 0.030899f, 0.034180f, 0.037659f, 0.041565f, 0.045074f, 0.049438f, 0.053345f, 0.057739f, - 0.061768f, 0.065918f, 0.070679f, 0.075073f, 0.080078f, 0.084656f, 0.089966f, 0.095215f, - 0.100464f, 0.106445f, 0.112000f, 0.117615f, 0.124207f, 0.130737f, 0.136719f, 0.144043f, - 0.151123f, 0.158081f, 0.165405f, 0.173096f, 0.181152f, 0.189087f, 0.197510f, 0.205688f, - 0.214600f, 0.223145f, 0.232178f, 0.241699f, 0.250732f, 0.260254f, 0.270264f, 0.279785f, - 0.289795f, 0.300293f, 0.310791f, 0.322510f, 0.333496f, 0.344238f, 0.355713f, 0.367188f, - 0.379395f, 0.392090f, 0.664551f, 0.678711f, 0.678223f, 0.675781f, 0.672852f, 0.669922f, - 0.001741f, 0.005077f, 0.008522f, 0.011810f, 0.014946f, 0.018524f, 0.021332f, 0.024872f, - 0.028519f, 0.031799f, 0.034973f, 0.038727f, 0.041992f, 0.045654f, 0.049072f, 0.052856f, - 0.056671f, 0.060638f, 0.064819f, 0.069092f, 0.073425f, 0.078125f, 0.082886f, 0.087280f, - 0.092651f, 0.098206f, 0.103638f, 0.109192f, 0.114563f, 0.120667f, 0.126709f, 0.133057f, - 0.139771f, 0.146851f, 0.153931f, 0.160767f, 0.168457f, 0.175903f, 0.183838f, 0.192505f, - 0.200195f, 0.208618f, 0.217407f, 0.226562f, 0.236084f, 0.245239f, 0.254639f, 0.263672f, - 0.273926f, 0.283447f, 0.294189f, 0.304932f, 0.315674f, 0.326172f, 0.337402f, 0.348877f, - 0.360107f, 0.373291f, 0.653809f, 0.670410f, 0.669922f, 0.667480f, 0.665527f, 0.662109f, - 0.001639f, 0.004951f, 0.007996f, 0.010857f, 0.013779f, 0.016968f, 0.019974f, 0.023392f, - 0.026001f, 0.029373f, 0.032013f, 0.035370f, 0.038513f, 0.041992f, 0.044586f, 0.048706f, - 0.052124f, 0.055634f, 0.059723f, 0.063354f, 0.067444f, 0.071289f, 0.075745f, 0.080444f, - 0.085022f, 0.089722f, 0.095032f, 0.100220f, 0.105347f, 0.111206f, 0.117126f, 0.123108f, - 0.129395f, 0.135620f, 0.142090f, 0.148682f, 0.156372f, 0.163574f, 0.170898f, 0.178711f, - 0.186890f, 0.194580f, 0.203613f, 0.211426f, 0.220459f, 0.229492f, 0.238281f, 0.248169f, - 0.257324f, 0.267578f, 0.277832f, 0.287354f, 0.298340f, 0.308350f, 0.319824f, 0.331543f, - 0.342041f, 0.354248f, 0.641602f, 0.660645f, 0.662109f, 0.660645f, 0.658203f, 0.654785f, - 0.001569f, 0.004539f, 0.007538f, 0.010368f, 0.013359f, 0.016006f, 0.018539f, 0.021210f, - 0.024384f, 0.026855f, 0.029892f, 0.032471f, 0.035034f, 0.038177f, 0.041199f, 0.044434f, - 0.047485f, 0.050781f, 0.054321f, 0.057953f, 0.061523f, 0.065430f, 0.069275f, 0.073547f, - 0.077820f, 0.082092f, 0.086731f, 0.091736f, 0.096985f, 0.101990f, 0.107361f, 0.112549f, - 0.118774f, 0.124878f, 0.131104f, 0.137573f, 0.144409f, 0.150635f, 0.157837f, 0.165283f, - 0.173340f, 0.181274f, 0.188599f, 0.197510f, 0.205933f, 0.214600f, 0.223633f, 0.232056f, - 0.241577f, 0.251709f, 0.261230f, 0.270996f, 0.281250f, 0.291260f, 0.302246f, 0.313477f, - 0.323730f, 0.336182f, 0.630859f, 0.651855f, 0.652832f, 0.652344f, 0.650391f, 0.647461f, - 0.001558f, 0.004139f, 0.007103f, 0.009560f, 0.012077f, 0.014313f, 0.016983f, 0.019653f, - 0.021988f, 0.024490f, 0.027023f, 0.029526f, 0.031891f, 0.034821f, 0.037903f, 0.040192f, - 0.043457f, 0.046417f, 0.049316f, 0.052795f, 0.055725f, 0.059357f, 0.063354f, 0.066895f, - 0.070740f, 0.074890f, 0.078979f, 0.083801f, 0.088440f, 0.093018f, 0.097961f, 0.103394f, - 0.108704f, 0.114563f, 0.120239f, 0.126343f, 0.132690f, 0.139038f, 0.145874f, 0.152710f, - 0.159912f, 0.168091f, 0.175537f, 0.183228f, 0.191650f, 0.199707f, 0.208130f, 0.216797f, - 0.226074f, 0.235352f, 0.244507f, 0.254395f, 0.264404f, 0.274414f, 0.285156f, 0.296631f, - 0.307373f, 0.318604f, 0.619141f, 0.643066f, 0.644531f, 0.644043f, 0.642578f, 0.639648f, - 0.001314f, 0.004002f, 0.006603f, 0.009056f, 0.011490f, 0.013184f, 0.015587f, 0.017883f, - 0.020157f, 0.022415f, 0.024582f, 0.027206f, 0.029160f, 0.031677f, 0.034088f, 0.036530f, - 0.039337f, 0.042206f, 0.044891f, 0.047729f, 0.050751f, 0.053955f, 0.057312f, 0.060486f, - 0.064148f, 0.068054f, 0.071960f, 0.075867f, 0.079895f, 0.084595f, 0.089172f, 0.094238f, - 0.098999f, 0.104492f, 0.109802f, 0.115173f, 0.121338f, 0.127686f, 0.134033f, 0.140991f, - 0.147095f, 0.154541f, 0.161865f, 0.169800f, 0.177368f, 0.185547f, 0.193848f, 0.201904f, - 0.211060f, 0.219116f, 0.229004f, 0.238525f, 0.248047f, 0.257812f, 0.267822f, 0.277832f, - 0.289062f, 0.300537f, 0.607910f, 0.633301f, 0.636230f, 0.635742f, 0.634766f, 0.633301f, - 0.001217f, 0.003571f, 0.005947f, 0.008011f, 0.010391f, 0.012207f, 0.014313f, 0.016617f, - 0.018280f, 0.020523f, 0.022537f, 0.024475f, 0.026443f, 0.028778f, 0.030884f, 0.032867f, - 0.035553f, 0.037872f, 0.040375f, 0.042938f, 0.045593f, 0.048431f, 0.051605f, 0.054688f, - 0.057953f, 0.061279f, 0.065002f, 0.068665f, 0.072266f, 0.076294f, 0.080872f, 0.085083f, - 0.089783f, 0.094482f, 0.099915f, 0.104736f, 0.110901f, 0.116272f, 0.122314f, 0.128784f, - 0.134888f, 0.142090f, 0.148560f, 0.155884f, 0.163574f, 0.171753f, 0.179077f, 0.187500f, - 0.195679f, 0.204346f, 0.213745f, 0.222656f, 0.231812f, 0.241455f, 0.250977f, 0.261230f, - 0.272461f, 0.282959f, 0.596680f, 0.623535f, 0.627441f, 0.627930f, 0.627441f, 0.625000f, - 0.001111f, 0.003542f, 0.005569f, 0.007504f, 0.009338f, 0.011452f, 0.012939f, 0.015030f, - 0.016678f, 0.018326f, 0.020203f, 0.022217f, 0.023788f, 0.025604f, 0.027771f, 0.029877f, - 0.031860f, 0.033813f, 0.036102f, 0.038605f, 0.040985f, 0.043579f, 0.046448f, 0.049042f, - 0.051849f, 0.055054f, 0.058319f, 0.061615f, 0.065125f, 0.068909f, 0.072815f, 0.076843f, - 0.080872f, 0.085571f, 0.089905f, 0.095398f, 0.100159f, 0.105713f, 0.111206f, 0.116882f, - 0.122925f, 0.129517f, 0.135742f, 0.142822f, 0.149902f, 0.157349f, 0.165161f, 0.172852f, - 0.181152f, 0.189331f, 0.198120f, 0.206909f, 0.215820f, 0.225342f, 0.235474f, 0.245239f, - 0.254883f, 0.266602f, 0.584473f, 0.614746f, 0.619141f, 0.619629f, 0.619141f, 0.618164f, - 0.001149f, 0.003147f, 0.004826f, 0.006886f, 0.008629f, 0.010452f, 0.012024f, 0.013359f, - 0.015175f, 0.016647f, 0.018143f, 0.019882f, 0.021332f, 0.023026f, 0.024902f, 0.026550f, - 0.028397f, 0.030045f, 0.032318f, 0.034393f, 0.036682f, 0.038910f, 0.041107f, 0.043671f, - 0.046295f, 0.048950f, 0.051819f, 0.054993f, 0.058258f, 0.061523f, 0.065063f, 0.068481f, - 0.072510f, 0.076965f, 0.081055f, 0.085510f, 0.090393f, 0.095093f, 0.100342f, 0.105774f, - 0.111694f, 0.117371f, 0.124084f, 0.130371f, 0.136963f, 0.143921f, 0.151245f, 0.159058f, - 0.166626f, 0.174927f, 0.182983f, 0.191650f, 0.200195f, 0.209473f, 0.218750f, 0.228149f, - 0.238037f, 0.249146f, 0.572266f, 0.604980f, 0.609863f, 0.611328f, 0.610352f, 0.611328f, - 0.001009f, 0.003059f, 0.004620f, 0.006283f, 0.007881f, 0.009415f, 0.010864f, 0.011940f, - 0.013443f, 0.014847f, 0.016403f, 0.017700f, 0.019012f, 0.020493f, 0.021927f, 0.023697f, - 0.025177f, 0.026947f, 0.028732f, 0.030472f, 0.032654f, 0.034302f, 0.036591f, 0.038757f, - 0.041046f, 0.043488f, 0.045837f, 0.048706f, 0.051544f, 0.054810f, 0.057770f, 0.061188f, - 0.064331f, 0.068237f, 0.072083f, 0.076416f, 0.080872f, 0.085388f, 0.090149f, 0.095276f, - 0.100403f, 0.105896f, 0.111877f, 0.117798f, 0.124329f, 0.130859f, 0.138062f, 0.145020f, - 0.152710f, 0.160034f, 0.168335f, 0.176514f, 0.185059f, 0.193481f, 0.203125f, 0.212158f, - 0.221924f, 0.232178f, 0.562500f, 0.594727f, 0.601074f, 0.602539f, 0.603516f, 0.602539f, - 0.000865f, 0.002674f, 0.004444f, 0.005615f, 0.007233f, 0.008430f, 0.009827f, 0.010880f, - 0.011917f, 0.013206f, 0.014412f, 0.015717f, 0.016876f, 0.018173f, 0.019501f, 0.020950f, - 0.022217f, 0.023773f, 0.025284f, 0.026749f, 0.028610f, 0.030151f, 0.032166f, 0.034149f, - 0.036041f, 0.038330f, 0.040558f, 0.042877f, 0.045532f, 0.048157f, 0.050934f, 0.053894f, - 0.056946f, 0.060303f, 0.063843f, 0.067566f, 0.071472f, 0.075806f, 0.080261f, 0.084778f, - 0.089600f, 0.094971f, 0.100220f, 0.105896f, 0.111877f, 0.118103f, 0.125000f, 0.131348f, - 0.138550f, 0.146362f, 0.153687f, 0.161987f, 0.169678f, 0.178223f, 0.187134f, 0.196045f, - 0.205811f, 0.215698f, 0.549805f, 0.584961f, 0.592773f, 0.594238f, 0.593750f, 0.595215f, - 0.000951f, 0.002476f, 0.003956f, 0.005062f, 0.006268f, 0.007637f, 0.008888f, 0.009666f, - 0.010628f, 0.011810f, 0.012856f, 0.013878f, 0.014946f, 0.015900f, 0.017227f, 0.018356f, - 0.019592f, 0.020889f, 0.022003f, 0.023438f, 0.025101f, 0.026489f, 0.028122f, 0.029739f, - 0.031555f, 0.033295f, 0.035431f, 0.037537f, 0.039795f, 0.041962f, 0.044647f, 0.047302f, - 0.049957f, 0.052979f, 0.056122f, 0.059387f, 0.062927f, 0.066956f, 0.070679f, 0.074951f, - 0.079468f, 0.084167f, 0.089294f, 0.094482f, 0.100098f, 0.106018f, 0.112061f, 0.118835f, - 0.125366f, 0.132446f, 0.139893f, 0.147827f, 0.155762f, 0.163574f, 0.172607f, 0.180786f, - 0.190063f, 0.199951f, 0.536621f, 0.576172f, 0.583496f, 0.586914f, 0.587402f, 0.586914f, - 0.000788f, 0.002115f, 0.003592f, 0.004780f, 0.005939f, 0.006615f, 0.007740f, 0.008598f, - 0.009514f, 0.010376f, 0.011200f, 0.012138f, 0.013016f, 0.014069f, 0.014977f, 0.015961f, - 0.016922f, 0.018036f, 0.019043f, 0.020447f, 0.021606f, 0.022995f, 0.024323f, 0.025864f, - 0.027344f, 0.028946f, 0.030731f, 0.032593f, 0.034515f, 0.036530f, 0.038910f, 0.041016f, - 0.043274f, 0.046021f, 0.048981f, 0.051819f, 0.055176f, 0.058472f, 0.062012f, 0.065857f, - 0.069946f, 0.074219f, 0.078796f, 0.083801f, 0.088806f, 0.094299f, 0.100281f, 0.106018f, - 0.112793f, 0.119446f, 0.126343f, 0.133545f, 0.141357f, 0.149292f, 0.157104f, 0.165894f, - 0.174683f, 0.184326f, 0.524902f, 0.566895f, 0.575195f, 0.576660f, 0.579102f, 0.579590f, - 0.000661f, 0.001961f, 0.003382f, 0.004311f, 0.005161f, 0.006062f, 0.006737f, 0.007427f, - 0.008286f, 0.008995f, 0.009857f, 0.010368f, 0.011230f, 0.011955f, 0.012833f, 0.013786f, - 0.014565f, 0.015480f, 0.016647f, 0.017578f, 0.018677f, 0.019806f, 0.020950f, 0.022263f, - 0.023651f, 0.024994f, 0.026306f, 0.027863f, 0.029724f, 0.031525f, 0.033325f, 0.035370f, - 0.037292f, 0.039673f, 0.042114f, 0.044769f, 0.047546f, 0.050537f, 0.053680f, 0.057098f, - 0.060852f, 0.064514f, 0.069031f, 0.073303f, 0.078064f, 0.083069f, 0.088379f, 0.094238f, - 0.100220f, 0.106689f, 0.113342f, 0.120300f, 0.127563f, 0.135132f, 0.142700f, 0.151245f, - 0.160034f, 0.168823f, 0.512695f, 0.557129f, 0.566406f, 0.569824f, 0.569824f, 0.571289f, - 0.000757f, 0.001709f, 0.002844f, 0.003582f, 0.004448f, 0.005192f, 0.005989f, 0.006519f, - 0.007038f, 0.007801f, 0.008453f, 0.009071f, 0.009727f, 0.010391f, 0.011009f, 0.011726f, - 0.012650f, 0.013184f, 0.014107f, 0.014977f, 0.015900f, 0.016800f, 0.017776f, 0.018936f, - 0.020172f, 0.021271f, 0.022446f, 0.023697f, 0.025055f, 0.026703f, 0.028397f, 0.030014f, - 0.031921f, 0.033905f, 0.035919f, 0.038177f, 0.040680f, 0.043243f, 0.045898f, 0.049072f, - 0.052216f, 0.055725f, 0.059784f, 0.063538f, 0.067688f, 0.072327f, 0.077271f, 0.082764f, - 0.088379f, 0.094299f, 0.100708f, 0.107239f, 0.114136f, 0.121582f, 0.128906f, 0.136963f, - 0.145630f, 0.153564f, 0.500977f, 0.547852f, 0.556641f, 0.561523f, 0.562500f, 0.563965f, - 0.000704f, 0.001769f, 0.002542f, 0.003523f, 0.004036f, 0.004562f, 0.005032f, 0.005661f, - 0.006176f, 0.006542f, 0.007072f, 0.007698f, 0.008339f, 0.008827f, 0.009323f, 0.010094f, - 0.010757f, 0.011276f, 0.012093f, 0.012733f, 0.013489f, 0.014488f, 0.015244f, 0.016006f, - 0.017151f, 0.017975f, 0.018967f, 0.020142f, 0.021255f, 0.022552f, 0.023880f, 0.025314f, - 0.026840f, 0.028503f, 0.030441f, 0.032166f, 0.034424f, 0.036438f, 0.039001f, 0.041656f, - 0.044464f, 0.047455f, 0.050842f, 0.054443f, 0.058167f, 0.062286f, 0.066956f, 0.071899f, - 0.076904f, 0.082458f, 0.088501f, 0.094482f, 0.101196f, 0.108337f, 0.115662f, 0.123352f, - 0.130981f, 0.139282f, 0.489746f, 0.538574f, 0.547852f, 0.551270f, 0.554688f, 0.555176f, - 0.000579f, 0.001450f, 0.002396f, 0.002857f, 0.003454f, 0.004032f, 0.004356f, 0.004791f, - 0.005333f, 0.005718f, 0.006130f, 0.006485f, 0.007042f, 0.007473f, 0.007988f, 0.008476f, - 0.008865f, 0.009613f, 0.010086f, 0.010651f, 0.011345f, 0.012047f, 0.012764f, 0.013435f, - 0.014282f, 0.015144f, 0.015884f, 0.016846f, 0.017868f, 0.018814f, 0.020050f, 0.021164f, - 0.022507f, 0.023773f, 0.025192f, 0.026978f, 0.028564f, 0.030640f, 0.032623f, 0.034882f, - 0.037231f, 0.039886f, 0.042786f, 0.046143f, 0.049286f, 0.052979f, 0.057098f, 0.061279f, - 0.066223f, 0.071167f, 0.076660f, 0.082581f, 0.088989f, 0.095581f, 0.102661f, 0.109863f, - 0.117737f, 0.125488f, 0.476807f, 0.528320f, 0.538574f, 0.543945f, 0.546875f, 0.546875f, - 0.000510f, 0.001428f, 0.002037f, 0.002613f, 0.003086f, 0.003290f, 0.003672f, 0.004108f, - 0.004345f, 0.004768f, 0.005035f, 0.005470f, 0.005959f, 0.006207f, 0.006599f, 0.007095f, - 0.007568f, 0.008003f, 0.008377f, 0.008904f, 0.009575f, 0.010010f, 0.010643f, 0.011131f, - 0.011871f, 0.012535f, 0.013199f, 0.014038f, 0.014839f, 0.015640f, 0.016586f, 0.017502f, - 0.018585f, 0.019745f, 0.021088f, 0.022354f, 0.023727f, 0.025253f, 0.026962f, 0.028870f, - 0.030762f, 0.033051f, 0.035492f, 0.038177f, 0.041229f, 0.044403f, 0.048004f, 0.051880f, - 0.056213f, 0.060516f, 0.065857f, 0.071045f, 0.077271f, 0.083374f, 0.090027f, 0.096863f, - 0.104492f, 0.112183f, 0.463623f, 0.518066f, 0.529785f, 0.535156f, 0.538086f, 0.540039f, - 0.000473f, 0.001222f, 0.001771f, 0.002117f, 0.002323f, 0.002796f, 0.003096f, 0.003355f, - 0.003601f, 0.003975f, 0.004295f, 0.004543f, 0.004833f, 0.005142f, 0.005455f, 0.005848f, - 0.006165f, 0.006535f, 0.006947f, 0.007370f, 0.007809f, 0.008240f, 0.008690f, 0.009216f, - 0.009758f, 0.010223f, 0.010925f, 0.011536f, 0.012146f, 0.012833f, 0.013573f, 0.014389f, - 0.015244f, 0.016220f, 0.017120f, 0.018219f, 0.019379f, 0.020599f, 0.021988f, 0.023514f, - 0.025131f, 0.027054f, 0.029037f, 0.031311f, 0.033752f, 0.036591f, 0.039520f, 0.042999f, - 0.046661f, 0.050873f, 0.055603f, 0.060333f, 0.066101f, 0.071960f, 0.078491f, 0.084961f, - 0.091797f, 0.099426f, 0.452148f, 0.508301f, 0.520508f, 0.526367f, 0.528809f, 0.530273f, - 0.000299f, 0.001057f, 0.001329f, 0.001771f, 0.001957f, 0.002350f, 0.002483f, 0.002697f, - 0.002964f, 0.003181f, 0.003441f, 0.003653f, 0.003904f, 0.004238f, 0.004501f, 0.004738f, - 0.005024f, 0.005390f, 0.005657f, 0.005985f, 0.006279f, 0.006714f, 0.007053f, 0.007507f, - 0.007881f, 0.008369f, 0.008774f, 0.009300f, 0.009888f, 0.010483f, 0.011093f, 0.011627f, - 0.012398f, 0.013130f, 0.013855f, 0.014717f, 0.015686f, 0.016739f, 0.017761f, 0.018890f, - 0.020248f, 0.021698f, 0.023376f, 0.025131f, 0.027237f, 0.029556f, 0.032166f, 0.035004f, - 0.038208f, 0.041962f, 0.045868f, 0.050507f, 0.055359f, 0.060852f, 0.066772f, 0.073242f, - 0.080017f, 0.087097f, 0.440674f, 0.498047f, 0.511719f, 0.517090f, 0.520508f, 0.522949f, - 0.000427f, 0.001020f, 0.001253f, 0.001431f, 0.001690f, 0.001900f, 0.002018f, 0.002304f, - 0.002481f, 0.002569f, 0.002731f, 0.002998f, 0.003157f, 0.003424f, 0.003592f, 0.003838f, - 0.004017f, 0.004253f, 0.004551f, 0.004776f, 0.005100f, 0.005379f, 0.005699f, 0.005932f, - 0.006290f, 0.006630f, 0.007038f, 0.007465f, 0.007927f, 0.008286f, 0.008858f, 0.009293f, - 0.009888f, 0.010429f, 0.011086f, 0.011765f, 0.012482f, 0.013298f, 0.014168f, 0.015068f, - 0.016129f, 0.017288f, 0.018585f, 0.019943f, 0.021622f, 0.023361f, 0.025436f, 0.027847f, - 0.030655f, 0.033447f, 0.037079f, 0.041229f, 0.045776f, 0.050568f, 0.056061f, 0.062317f, - 0.068726f, 0.075684f, 0.427734f, 0.488525f, 0.502441f, 0.508789f, 0.513184f, 0.513672f, - 0.000255f, 0.000597f, 0.001032f, 0.001150f, 0.001353f, 0.001493f, 0.001608f, 0.001750f, - 0.001933f, 0.002062f, 0.002178f, 0.002302f, 0.002474f, 0.002670f, 0.002872f, 0.002995f, - 0.003147f, 0.003298f, 0.003565f, 0.003729f, 0.003941f, 0.004219f, 0.004436f, 0.004719f, - 0.005005f, 0.005230f, 0.005489f, 0.005806f, 0.006191f, 0.006496f, 0.006897f, 0.007267f, - 0.007671f, 0.008179f, 0.008636f, 0.009163f, 0.009766f, 0.010368f, 0.011047f, 0.011810f, - 0.012611f, 0.013527f, 0.014519f, 0.015640f, 0.016800f, 0.018265f, 0.019897f, 0.021698f, - 0.023895f, 0.026260f, 0.029175f, 0.032715f, 0.036682f, 0.041168f, 0.045929f, 0.051758f, - 0.057922f, 0.064575f, 0.415771f, 0.478271f, 0.493652f, 0.500000f, 0.503906f, 0.505859f, - 0.000255f, 0.000544f, 0.000863f, 0.000994f, 0.001086f, 0.001183f, 0.001317f, 0.001328f, - 0.001491f, 0.001608f, 0.001716f, 0.001851f, 0.001943f, 0.002075f, 0.002161f, 0.002319f, - 0.002426f, 0.002596f, 0.002741f, 0.002884f, 0.003088f, 0.003265f, 0.003391f, 0.003620f, - 0.003777f, 0.004005f, 0.004215f, 0.004452f, 0.004734f, 0.004963f, 0.005341f, 0.005577f, - 0.005875f, 0.006271f, 0.006603f, 0.006996f, 0.007450f, 0.007919f, 0.008446f, 0.009003f, - 0.009674f, 0.010338f, 0.011101f, 0.011909f, 0.012917f, 0.013977f, 0.015190f, 0.016495f, - 0.018112f, 0.020325f, 0.022415f, 0.025146f, 0.028473f, 0.032349f, 0.036804f, 0.041992f, - 0.047913f, 0.054077f, 0.404541f, 0.468506f, 0.484131f, 0.490967f, 0.495361f, 0.498291f, - 0.000377f, 0.000440f, 0.000606f, 0.000685f, 0.000735f, 0.000876f, 0.000929f, 0.001035f, - 0.001068f, 0.001157f, 0.001307f, 0.001381f, 0.001473f, 0.001595f, 0.001664f, 0.001708f, - 0.001850f, 0.001957f, 0.002043f, 0.002195f, 0.002291f, 0.002422f, 0.002571f, 0.002687f, - 0.002842f, 0.002979f, 0.003183f, 0.003345f, 0.003532f, 0.003794f, 0.004002f, 0.004154f, - 0.004429f, 0.004635f, 0.004967f, 0.005253f, 0.005573f, 0.005909f, 0.006275f, 0.006695f, - 0.007183f, 0.007660f, 0.008316f, 0.008934f, 0.009644f, 0.010429f, 0.011360f, 0.012497f, - 0.013634f, 0.014977f, 0.016663f, 0.018875f, 0.021423f, 0.024643f, 0.028549f, 0.033020f, - 0.038483f, 0.044525f, 0.391602f, 0.458984f, 0.474854f, 0.482178f, 0.488037f, 0.489990f, - 0.000159f, 0.000401f, 0.000450f, 0.000522f, 0.000605f, 0.000634f, 0.000728f, 0.000702f, - 0.000808f, 0.000882f, 0.000959f, 0.000991f, 0.001043f, 0.001112f, 0.001205f, 0.001245f, - 0.001357f, 0.001419f, 0.001513f, 0.001546f, 0.001648f, 0.001752f, 0.001863f, 0.001942f, - 0.002056f, 0.002159f, 0.002289f, 0.002392f, 0.002506f, 0.002697f, 0.002827f, 0.003023f, - 0.003172f, 0.003330f, 0.003542f, 0.003750f, 0.004017f, 0.004292f, 0.004559f, 0.004871f, - 0.005161f, 0.005539f, 0.005932f, 0.006416f, 0.006973f, 0.007526f, 0.008232f, 0.008980f, - 0.009918f, 0.010895f, 0.012085f, 0.013680f, 0.015472f, 0.017975f, 0.021103f, 0.025146f, - 0.029938f, 0.035645f, 0.379395f, 0.448486f, 0.465820f, 0.473633f, 0.478760f, 0.481689f, - 0.000112f, 0.000220f, 0.000321f, 0.000322f, 0.000401f, 0.000489f, 0.000469f, 0.000510f, - 0.000568f, 0.000653f, 0.000659f, 0.000676f, 0.000703f, 0.000789f, 0.000811f, 0.000886f, - 0.000888f, 0.000994f, 0.001048f, 0.001096f, 0.001155f, 0.001220f, 0.001289f, 0.001357f, - 0.001431f, 0.001496f, 0.001599f, 0.001675f, 0.001759f, 0.001894f, 0.001965f, 0.002083f, - 0.002193f, 0.002310f, 0.002464f, 0.002634f, 0.002758f, 0.002949f, 0.003134f, 0.003319f, - 0.003551f, 0.003830f, 0.004120f, 0.004440f, 0.004784f, 0.005188f, 0.005680f, 0.006222f, - 0.006886f, 0.007614f, 0.008461f, 0.009529f, 0.010864f, 0.012596f, 0.014961f, 0.018097f, - 0.022263f, 0.027466f, 0.367920f, 0.438232f, 0.456543f, 0.465332f, 0.470215f, 0.472900f, - 0.000140f, 0.000219f, 0.000241f, 0.000245f, 0.000290f, 0.000291f, 0.000302f, 0.000342f, - 0.000380f, 0.000409f, 0.000408f, 0.000485f, 0.000473f, 0.000527f, 0.000556f, 0.000575f, - 0.000630f, 0.000642f, 0.000673f, 0.000711f, 0.000762f, 0.000800f, 0.000852f, 0.000886f, - 0.000952f, 0.000982f, 0.001049f, 0.001108f, 0.001159f, 0.001220f, 0.001281f, 0.001369f, - 0.001454f, 0.001522f, 0.001595f, 0.001695f, 0.001839f, 0.001928f, 0.002068f, 0.002209f, - 0.002337f, 0.002504f, 0.002686f, 0.002876f, 0.003139f, 0.003437f, 0.003723f, 0.004078f, - 0.004509f, 0.005009f, 0.005615f, 0.006332f, 0.007317f, 0.008461f, 0.009926f, 0.012154f, - 0.015640f, 0.020325f, 0.356445f, 0.429199f, 0.447266f, 0.456299f, 0.462158f, 0.464844f, - 0.000048f, 0.000154f, 0.000141f, 0.000147f, 0.000174f, 0.000207f, 0.000188f, 0.000221f, - 0.000233f, 0.000242f, 0.000248f, 0.000271f, 0.000299f, 0.000312f, 0.000337f, 0.000350f, - 0.000367f, 0.000403f, 0.000416f, 0.000458f, 0.000465f, 0.000483f, 0.000507f, 0.000546f, - 0.000576f, 0.000625f, 0.000637f, 0.000659f, 0.000705f, 0.000742f, 0.000797f, 0.000837f, - 0.000890f, 0.000925f, 0.000978f, 0.001036f, 0.001103f, 0.001181f, 0.001253f, 0.001329f, - 0.001421f, 0.001529f, 0.001647f, 0.001782f, 0.001906f, 0.002075f, 0.002291f, 0.002483f, - 0.002758f, 0.003059f, 0.003450f, 0.003906f, 0.004536f, 0.005306f, 0.006325f, 0.007713f, - 0.010101f, 0.014084f, 0.343262f, 0.418457f, 0.437744f, 0.447510f, 0.452881f, 0.456543f, - 0.000099f, 0.000100f, 0.000091f, 0.000085f, 0.000105f, 0.000099f, 0.000127f, 0.000127f, - 0.000130f, 0.000137f, 0.000152f, 0.000164f, 0.000164f, 0.000172f, 0.000195f, 0.000186f, - 0.000209f, 0.000222f, 0.000231f, 0.000241f, 0.000258f, 0.000266f, 0.000290f, 0.000301f, - 0.000324f, 0.000343f, 0.000357f, 0.000369f, 0.000392f, 0.000409f, 0.000440f, 0.000463f, - 0.000484f, 0.000513f, 0.000544f, 0.000578f, 0.000607f, 0.000650f, 0.000702f, 0.000737f, - 0.000787f, 0.000846f, 0.000918f, 0.000977f, 0.001062f, 0.001146f, 0.001259f, 0.001379f, - 0.001524f, 0.001701f, 0.001924f, 0.002207f, 0.002542f, 0.003006f, 0.003628f, 0.004494f, - 0.005821f, 0.008774f, 0.332031f, 0.409180f, 0.428467f, 0.438965f, 0.444336f, 0.447998f, - 0.000082f, 0.000057f, 0.000048f, 0.000051f, 0.000055f, 0.000054f, 0.000057f, 0.000064f, - 0.000066f, 0.000079f, 0.000070f, 0.000070f, 0.000084f, 0.000078f, 0.000084f, 0.000091f, - 0.000099f, 0.000108f, 0.000108f, 0.000114f, 0.000119f, 0.000124f, 0.000129f, 0.000144f, - 0.000151f, 0.000158f, 0.000163f, 0.000176f, 0.000188f, 0.000196f, 0.000208f, 0.000220f, - 0.000227f, 0.000239f, 0.000259f, 0.000273f, 0.000290f, 0.000303f, 0.000331f, 0.000351f, - 0.000376f, 0.000402f, 0.000432f, 0.000460f, 0.000500f, 0.000547f, 0.000593f, 0.000648f, - 0.000720f, 0.000805f, 0.000918f, 0.001045f, 0.001225f, 0.001462f, 0.001788f, 0.002264f, - 0.003029f, 0.004623f, 0.320801f, 0.398682f, 0.419922f, 0.430420f, 0.436279f, 0.440674f, - 0.000061f, 0.000041f, 0.000033f, 0.000029f, 0.000026f, 0.000025f, 0.000024f, 0.000024f, - 0.000023f, 0.000023f, 0.000025f, 0.000032f, 0.000026f, 0.000027f, 0.000035f, 0.000037f, - 0.000039f, 0.000041f, 0.000041f, 0.000041f, 0.000044f, 0.000050f, 0.000054f, 0.000051f, - 0.000055f, 0.000060f, 0.000061f, 0.000062f, 0.000069f, 0.000074f, 0.000075f, 0.000081f, - 0.000087f, 0.000090f, 0.000093f, 0.000098f, 0.000108f, 0.000114f, 0.000123f, 0.000130f, - 0.000142f, 0.000144f, 0.000156f, 0.000173f, 0.000179f, 0.000200f, 0.000218f, 0.000237f, - 0.000267f, 0.000299f, 0.000335f, 0.000382f, 0.000448f, 0.000544f, 0.000677f, 0.000883f, - 0.001233f, 0.001933f, 0.309570f, 0.388672f, 0.410889f, 0.421143f, 0.427246f, 0.431885f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000012f, 0.000011f, - 0.000011f, 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000009f, - 0.000009f, 0.000007f, 0.000007f, 0.000007f, 0.000008f, 0.000009f, 0.000011f, 0.000012f, - 0.000012f, 0.000012f, 0.000013f, 0.000015f, 0.000015f, 0.000014f, 0.000016f, 0.000017f, - 0.000019f, 0.000020f, 0.000020f, 0.000022f, 0.000025f, 0.000023f, 0.000026f, 0.000029f, - 0.000031f, 0.000034f, 0.000036f, 0.000037f, 0.000040f, 0.000044f, 0.000048f, 0.000052f, - 0.000056f, 0.000063f, 0.000068f, 0.000083f, 0.000098f, 0.000117f, 0.000149f, 0.000201f, - 0.000301f, 0.000544f, 0.297607f, 0.379150f, 0.400879f, 0.411865f, 0.419189f, 0.423340f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000002f, 0.000003f, 0.000004f, 0.000004f, 0.000004f, 0.000005f, 0.000007f, - 0.000011f, 0.000026f, 0.286621f, 0.368896f, 0.391846f, 0.402588f, 0.409912f, 0.414551f, - }, - { - 0.007935f, 0.024429f, 0.041290f, 0.058838f, 0.076355f, 0.093933f, 0.111145f, 0.128174f, - 0.146606f, 0.164429f, 0.182617f, 0.200562f, 0.218750f, 0.236206f, 0.254150f, 0.271729f, - 0.289551f, 0.308105f, 0.325684f, 0.342773f, 0.360596f, 0.379150f, 0.396240f, 0.414795f, - 0.431641f, 0.450439f, 0.468018f, 0.484619f, 0.502441f, 0.520020f, 0.536621f, 0.554688f, - 0.571777f, 0.588379f, 0.605469f, 0.622559f, 0.640137f, 0.657227f, 0.672852f, 0.689941f, - 0.707031f, 0.723633f, 0.740234f, 0.756836f, 0.773926f, 0.789551f, 0.805664f, 0.821777f, - 0.838379f, 0.854980f, 0.870117f, 0.885742f, 0.901855f, 0.917480f, 0.932617f, 0.948730f, - 0.963379f, 0.979492f, 0.960449f, 0.909668f, 0.876465f, 0.850098f, 0.827637f, 0.807617f, - 0.007530f, 0.023422f, 0.039764f, 0.056610f, 0.073303f, 0.090149f, 0.107300f, 0.124084f, - 0.141968f, 0.158569f, 0.176392f, 0.193604f, 0.210815f, 0.228760f, 0.246094f, 0.262695f, - 0.280518f, 0.298340f, 0.315430f, 0.333252f, 0.350586f, 0.367432f, 0.384766f, 0.402344f, - 0.419678f, 0.436768f, 0.453613f, 0.471436f, 0.488037f, 0.504883f, 0.521973f, 0.538574f, - 0.556641f, 0.573242f, 0.589844f, 0.605957f, 0.623535f, 0.639160f, 0.656250f, 0.673340f, - 0.688477f, 0.706055f, 0.721680f, 0.738770f, 0.754883f, 0.770508f, 0.786133f, 0.803711f, - 0.817871f, 0.834473f, 0.850586f, 0.866211f, 0.881348f, 0.896973f, 0.913086f, 0.928223f, - 0.942871f, 0.958984f, 0.951172f, 0.903320f, 0.871094f, 0.845703f, 0.824219f, 0.805664f, - 0.007320f, 0.022552f, 0.038391f, 0.054260f, 0.070312f, 0.086792f, 0.103271f, 0.120178f, - 0.136841f, 0.153564f, 0.170410f, 0.187256f, 0.203735f, 0.220825f, 0.237793f, 0.255127f, - 0.271240f, 0.288086f, 0.305420f, 0.322021f, 0.339844f, 0.356689f, 0.373047f, 0.390137f, - 0.406738f, 0.423340f, 0.440186f, 0.456787f, 0.474121f, 0.490967f, 0.507324f, 0.523926f, - 0.540527f, 0.557129f, 0.573242f, 0.590332f, 0.606445f, 0.623047f, 0.638672f, 0.655273f, - 0.671875f, 0.687500f, 0.703613f, 0.720215f, 0.735840f, 0.751953f, 0.767578f, 0.783203f, - 0.799316f, 0.814941f, 0.830078f, 0.845703f, 0.861328f, 0.877441f, 0.892090f, 0.908203f, - 0.922852f, 0.938477f, 0.941895f, 0.895996f, 0.865723f, 0.841309f, 0.820801f, 0.802734f, - 0.007008f, 0.021667f, 0.036865f, 0.052216f, 0.067871f, 0.083862f, 0.099426f, 0.115479f, - 0.131470f, 0.148315f, 0.164551f, 0.180298f, 0.196899f, 0.213379f, 0.229370f, 0.246460f, - 0.262695f, 0.279541f, 0.295410f, 0.311523f, 0.329102f, 0.345215f, 0.360840f, 0.378174f, - 0.394043f, 0.410156f, 0.427246f, 0.443115f, 0.459717f, 0.476318f, 0.493652f, 0.508789f, - 0.524902f, 0.541016f, 0.557129f, 0.573242f, 0.589844f, 0.605469f, 0.621582f, 0.638672f, - 0.652832f, 0.669434f, 0.685547f, 0.701660f, 0.717285f, 0.731934f, 0.749023f, 0.764160f, - 0.779785f, 0.794922f, 0.810059f, 0.826172f, 0.841309f, 0.856445f, 0.872070f, 0.886719f, - 0.902344f, 0.917480f, 0.932129f, 0.889648f, 0.859863f, 0.835938f, 0.816895f, 0.799316f, - 0.006817f, 0.020645f, 0.035156f, 0.050110f, 0.065247f, 0.080383f, 0.096313f, 0.111450f, - 0.126587f, 0.142456f, 0.158447f, 0.174316f, 0.189819f, 0.205566f, 0.221802f, 0.237427f, - 0.253662f, 0.269775f, 0.285889f, 0.301514f, 0.317627f, 0.333740f, 0.349609f, 0.366211f, - 0.381348f, 0.397705f, 0.414307f, 0.429932f, 0.447266f, 0.462646f, 0.477539f, 0.494385f, - 0.509766f, 0.525879f, 0.541992f, 0.557617f, 0.571777f, 0.588379f, 0.605469f, 0.619629f, - 0.636230f, 0.651855f, 0.666992f, 0.681152f, 0.698242f, 0.714355f, 0.729980f, 0.745117f, - 0.759766f, 0.775391f, 0.790527f, 0.806152f, 0.821289f, 0.835938f, 0.850586f, 0.866211f, - 0.882324f, 0.896484f, 0.922363f, 0.882324f, 0.854004f, 0.831543f, 0.812500f, 0.795898f, - 0.006378f, 0.019989f, 0.034027f, 0.048004f, 0.062744f, 0.077148f, 0.091980f, 0.107178f, - 0.122192f, 0.137207f, 0.152466f, 0.167603f, 0.183960f, 0.199097f, 0.214111f, 0.229736f, - 0.244995f, 0.260254f, 0.276367f, 0.291504f, 0.306641f, 0.322998f, 0.338623f, 0.354248f, - 0.369629f, 0.385254f, 0.400879f, 0.416504f, 0.432617f, 0.447510f, 0.464111f, 0.479492f, - 0.494141f, 0.511230f, 0.525879f, 0.541016f, 0.556641f, 0.572754f, 0.586914f, 0.602051f, - 0.617676f, 0.633789f, 0.648926f, 0.665039f, 0.679688f, 0.695312f, 0.710449f, 0.726074f, - 0.739746f, 0.755859f, 0.771484f, 0.785645f, 0.800781f, 0.815918f, 0.831055f, 0.846680f, - 0.860840f, 0.875977f, 0.912598f, 0.874512f, 0.847656f, 0.826172f, 0.807617f, 0.791504f, - 0.006603f, 0.019287f, 0.032776f, 0.046356f, 0.060272f, 0.073914f, 0.088135f, 0.102905f, - 0.117554f, 0.132690f, 0.147095f, 0.161377f, 0.176636f, 0.191162f, 0.205444f, 0.221680f, - 0.236572f, 0.251465f, 0.267090f, 0.281250f, 0.296875f, 0.312256f, 0.327393f, 0.342285f, - 0.357666f, 0.373291f, 0.388184f, 0.403076f, 0.418457f, 0.433838f, 0.448975f, 0.465088f, - 0.479980f, 0.494385f, 0.509277f, 0.525879f, 0.540039f, 0.555176f, 0.570801f, 0.586426f, - 0.601074f, 0.616211f, 0.631348f, 0.646484f, 0.661133f, 0.676270f, 0.692383f, 0.705078f, - 0.720215f, 0.735352f, 0.751953f, 0.766602f, 0.781250f, 0.796387f, 0.810059f, 0.825684f, - 0.840820f, 0.855469f, 0.902344f, 0.866699f, 0.841797f, 0.820312f, 0.803223f, 0.787598f, - 0.006111f, 0.018433f, 0.031097f, 0.044739f, 0.057892f, 0.071472f, 0.085205f, 0.099304f, - 0.113037f, 0.127319f, 0.141357f, 0.156128f, 0.169678f, 0.183838f, 0.198608f, 0.213745f, - 0.227661f, 0.243652f, 0.257324f, 0.272705f, 0.286865f, 0.301025f, 0.316406f, 0.331543f, - 0.345703f, 0.360107f, 0.375000f, 0.390625f, 0.405762f, 0.420410f, 0.435303f, 0.449951f, - 0.465088f, 0.479492f, 0.494141f, 0.509277f, 0.523926f, 0.538574f, 0.553711f, 0.569336f, - 0.583496f, 0.598145f, 0.612793f, 0.628418f, 0.642578f, 0.657227f, 0.671387f, 0.687012f, - 0.702637f, 0.716797f, 0.731934f, 0.745605f, 0.761230f, 0.775391f, 0.790527f, 0.805176f, - 0.819824f, 0.834961f, 0.892578f, 0.858887f, 0.834473f, 0.814941f, 0.798340f, 0.783203f, - 0.005756f, 0.017761f, 0.029907f, 0.042572f, 0.055481f, 0.068420f, 0.081482f, 0.095276f, - 0.108826f, 0.122070f, 0.135620f, 0.149902f, 0.163330f, 0.177368f, 0.191284f, 0.206421f, - 0.219482f, 0.233521f, 0.247925f, 0.262451f, 0.277100f, 0.290771f, 0.304688f, 0.319580f, - 0.334229f, 0.348389f, 0.362549f, 0.377441f, 0.391602f, 0.406250f, 0.421143f, 0.435791f, - 0.450439f, 0.463867f, 0.478760f, 0.493164f, 0.507812f, 0.521973f, 0.537109f, 0.551270f, - 0.565430f, 0.580078f, 0.594727f, 0.609863f, 0.624023f, 0.638672f, 0.653320f, 0.668457f, - 0.682129f, 0.697266f, 0.711914f, 0.726562f, 0.740723f, 0.755859f, 0.770996f, 0.785156f, - 0.799805f, 0.814453f, 0.882812f, 0.851562f, 0.827148f, 0.808594f, 0.792969f, 0.778809f, - 0.005741f, 0.017166f, 0.029053f, 0.041138f, 0.053345f, 0.065796f, 0.078674f, 0.091248f, - 0.104614f, 0.117004f, 0.130737f, 0.143921f, 0.156860f, 0.170288f, 0.183960f, 0.197754f, - 0.211304f, 0.224976f, 0.238892f, 0.251953f, 0.266357f, 0.280273f, 0.294922f, 0.308594f, - 0.322021f, 0.336914f, 0.350098f, 0.364502f, 0.378174f, 0.393066f, 0.407471f, 0.420166f, - 0.435059f, 0.449219f, 0.463135f, 0.477295f, 0.491699f, 0.506348f, 0.520996f, 0.534668f, - 0.549316f, 0.563477f, 0.577148f, 0.591309f, 0.605469f, 0.620605f, 0.634766f, 0.648438f, - 0.663086f, 0.677734f, 0.691895f, 0.706543f, 0.720215f, 0.734863f, 0.750488f, 0.765137f, - 0.779297f, 0.793945f, 0.872559f, 0.843262f, 0.820801f, 0.803223f, 0.787598f, 0.773926f, - 0.005283f, 0.016052f, 0.028030f, 0.039246f, 0.050751f, 0.063232f, 0.074829f, 0.087341f, - 0.099976f, 0.112732f, 0.125122f, 0.138062f, 0.150757f, 0.163696f, 0.176758f, 0.189697f, - 0.203125f, 0.216553f, 0.229614f, 0.243286f, 0.256592f, 0.269775f, 0.283203f, 0.297119f, - 0.310547f, 0.324463f, 0.337891f, 0.351807f, 0.365234f, 0.378662f, 0.392822f, 0.406738f, - 0.419922f, 0.434814f, 0.448730f, 0.461182f, 0.476562f, 0.489746f, 0.502930f, 0.517578f, - 0.531738f, 0.545410f, 0.559082f, 0.573730f, 0.587402f, 0.602051f, 0.615723f, 0.629395f, - 0.644043f, 0.658203f, 0.672363f, 0.686523f, 0.701660f, 0.714844f, 0.729980f, 0.743652f, - 0.758301f, 0.774414f, 0.862305f, 0.835449f, 0.813965f, 0.796875f, 0.782227f, 0.769043f, - 0.005272f, 0.015427f, 0.026230f, 0.037506f, 0.049164f, 0.060516f, 0.072021f, 0.083740f, - 0.095825f, 0.108521f, 0.120361f, 0.132324f, 0.144897f, 0.156738f, 0.169922f, 0.182373f, - 0.195068f, 0.208008f, 0.220459f, 0.233887f, 0.246948f, 0.260254f, 0.272461f, 0.285889f, - 0.299561f, 0.312500f, 0.325684f, 0.338867f, 0.352783f, 0.365479f, 0.378906f, 0.392334f, - 0.406006f, 0.419189f, 0.432861f, 0.446777f, 0.460693f, 0.473877f, 0.486572f, 0.500977f, - 0.515137f, 0.528809f, 0.542480f, 0.555176f, 0.569824f, 0.583984f, 0.597656f, 0.611328f, - 0.625000f, 0.639648f, 0.653320f, 0.667480f, 0.681641f, 0.695801f, 0.709961f, 0.723633f, - 0.738281f, 0.752930f, 0.852539f, 0.827148f, 0.807129f, 0.790527f, 0.776367f, 0.764160f, - 0.004822f, 0.014885f, 0.025360f, 0.035767f, 0.046570f, 0.057587f, 0.068726f, 0.080139f, - 0.091736f, 0.103577f, 0.115479f, 0.126709f, 0.138672f, 0.150879f, 0.162231f, 0.174805f, - 0.187622f, 0.199951f, 0.212524f, 0.224854f, 0.236694f, 0.249878f, 0.262207f, 0.275391f, - 0.287842f, 0.300293f, 0.313477f, 0.326904f, 0.340088f, 0.353027f, 0.365479f, 0.378174f, - 0.391602f, 0.404541f, 0.417236f, 0.431641f, 0.444336f, 0.457764f, 0.470703f, 0.484375f, - 0.497803f, 0.510742f, 0.524902f, 0.537598f, 0.552246f, 0.564941f, 0.579590f, 0.592285f, - 0.606445f, 0.621094f, 0.634277f, 0.646973f, 0.662109f, 0.675781f, 0.689453f, 0.704102f, - 0.718262f, 0.733398f, 0.842285f, 0.818848f, 0.799805f, 0.784180f, 0.770996f, 0.758301f, - 0.004745f, 0.014427f, 0.024277f, 0.034546f, 0.044800f, 0.055176f, 0.066040f, 0.076477f, - 0.087341f, 0.099060f, 0.110474f, 0.121216f, 0.132690f, 0.144165f, 0.156006f, 0.167358f, - 0.179688f, 0.191284f, 0.203247f, 0.216187f, 0.227905f, 0.239868f, 0.252441f, 0.264648f, - 0.277100f, 0.289307f, 0.301270f, 0.314453f, 0.326660f, 0.338867f, 0.352539f, 0.364990f, - 0.377686f, 0.390137f, 0.403076f, 0.416016f, 0.428467f, 0.441406f, 0.453857f, 0.468262f, - 0.480957f, 0.494385f, 0.507324f, 0.520020f, 0.534180f, 0.547363f, 0.560059f, 0.573730f, - 0.586914f, 0.601074f, 0.615234f, 0.628418f, 0.641602f, 0.656250f, 0.669434f, 0.683594f, - 0.697754f, 0.712402f, 0.832520f, 0.809570f, 0.792480f, 0.778320f, 0.764160f, 0.753906f, - 0.004612f, 0.013840f, 0.023483f, 0.033081f, 0.042999f, 0.052490f, 0.063049f, 0.073303f, - 0.083801f, 0.094238f, 0.105042f, 0.115967f, 0.127319f, 0.138062f, 0.149048f, 0.160645f, - 0.171875f, 0.183228f, 0.194946f, 0.206665f, 0.218384f, 0.230347f, 0.241699f, 0.253906f, - 0.265869f, 0.277832f, 0.290039f, 0.301758f, 0.314209f, 0.326660f, 0.339111f, 0.351074f, - 0.363281f, 0.375977f, 0.388428f, 0.401123f, 0.413330f, 0.426270f, 0.439453f, 0.451904f, - 0.464111f, 0.478027f, 0.489746f, 0.503418f, 0.515625f, 0.529297f, 0.542480f, 0.556152f, - 0.569336f, 0.582031f, 0.595215f, 0.608887f, 0.622559f, 0.636230f, 0.649902f, 0.663574f, - 0.677246f, 0.691895f, 0.821289f, 0.802246f, 0.785645f, 0.771484f, 0.758789f, 0.748047f, - 0.004345f, 0.012985f, 0.022156f, 0.030884f, 0.040802f, 0.050568f, 0.060303f, 0.069946f, - 0.079956f, 0.090393f, 0.100403f, 0.111084f, 0.120667f, 0.131714f, 0.142700f, 0.153198f, - 0.164429f, 0.175659f, 0.186523f, 0.197876f, 0.208496f, 0.220337f, 0.231567f, 0.243286f, - 0.254639f, 0.266113f, 0.277832f, 0.289795f, 0.301758f, 0.313477f, 0.325439f, 0.337402f, - 0.349609f, 0.361328f, 0.373779f, 0.385986f, 0.398193f, 0.410889f, 0.423340f, 0.435059f, - 0.447998f, 0.460205f, 0.473389f, 0.486084f, 0.499023f, 0.511230f, 0.524414f, 0.537109f, - 0.549805f, 0.563477f, 0.576172f, 0.589355f, 0.603027f, 0.616699f, 0.629883f, 0.644531f, - 0.658691f, 0.670898f, 0.811035f, 0.792969f, 0.777832f, 0.764648f, 0.752441f, 0.742676f, - 0.004002f, 0.012718f, 0.021210f, 0.029877f, 0.039246f, 0.048431f, 0.057281f, 0.067078f, - 0.076538f, 0.086121f, 0.096008f, 0.105957f, 0.115540f, 0.125732f, 0.136475f, 0.146729f, - 0.157227f, 0.167236f, 0.177979f, 0.189819f, 0.200195f, 0.210693f, 0.221802f, 0.232788f, - 0.243896f, 0.255127f, 0.266602f, 0.278320f, 0.289062f, 0.300293f, 0.312012f, 0.323975f, - 0.335449f, 0.347168f, 0.359131f, 0.371094f, 0.382812f, 0.394775f, 0.406982f, 0.419434f, - 0.431152f, 0.443604f, 0.455566f, 0.468506f, 0.481445f, 0.493408f, 0.506348f, 0.519043f, - 0.531738f, 0.544922f, 0.558105f, 0.570801f, 0.583984f, 0.597168f, 0.610352f, 0.624512f, - 0.637695f, 0.651855f, 0.800293f, 0.785156f, 0.770508f, 0.757812f, 0.747070f, 0.737305f, - 0.003967f, 0.011940f, 0.020203f, 0.028931f, 0.037109f, 0.045898f, 0.054840f, 0.063477f, - 0.073059f, 0.082214f, 0.090942f, 0.100647f, 0.110535f, 0.120178f, 0.129639f, 0.139648f, - 0.149902f, 0.160156f, 0.170044f, 0.180786f, 0.190674f, 0.201416f, 0.211792f, 0.222412f, - 0.233521f, 0.244751f, 0.255615f, 0.266113f, 0.276855f, 0.288574f, 0.299561f, 0.311279f, - 0.322266f, 0.333984f, 0.344727f, 0.356934f, 0.368164f, 0.379395f, 0.390869f, 0.403076f, - 0.415283f, 0.427246f, 0.439453f, 0.451172f, 0.464111f, 0.476807f, 0.488281f, 0.500977f, - 0.513672f, 0.526367f, 0.538574f, 0.551758f, 0.564453f, 0.577637f, 0.590820f, 0.604492f, - 0.618164f, 0.631836f, 0.790039f, 0.775879f, 0.763184f, 0.750977f, 0.740723f, 0.731445f, - 0.003679f, 0.011749f, 0.019135f, 0.027237f, 0.035431f, 0.043884f, 0.052399f, 0.060577f, - 0.069153f, 0.077881f, 0.086731f, 0.095947f, 0.104797f, 0.114380f, 0.123535f, 0.133057f, - 0.142700f, 0.152588f, 0.162231f, 0.171753f, 0.182129f, 0.192261f, 0.202026f, 0.212524f, - 0.222900f, 0.233643f, 0.243896f, 0.254395f, 0.264893f, 0.276123f, 0.286621f, 0.297119f, - 0.308105f, 0.319336f, 0.331299f, 0.341553f, 0.353027f, 0.364258f, 0.375977f, 0.387451f, - 0.399414f, 0.410645f, 0.422607f, 0.434814f, 0.445801f, 0.458984f, 0.470703f, 0.482910f, - 0.495361f, 0.508301f, 0.520020f, 0.532227f, 0.545410f, 0.558594f, 0.570801f, 0.584961f, - 0.597656f, 0.611816f, 0.778809f, 0.768066f, 0.754883f, 0.743652f, 0.733887f, 0.725098f, - 0.003525f, 0.010956f, 0.018433f, 0.026260f, 0.033295f, 0.041870f, 0.049377f, 0.057709f, - 0.065735f, 0.074463f, 0.082764f, 0.091736f, 0.099976f, 0.108582f, 0.118103f, 0.126465f, - 0.135742f, 0.144775f, 0.154175f, 0.164307f, 0.173218f, 0.182983f, 0.192505f, 0.202759f, - 0.212646f, 0.221924f, 0.232910f, 0.242188f, 0.252930f, 0.262939f, 0.273926f, 0.284180f, - 0.294922f, 0.305420f, 0.316162f, 0.327637f, 0.338867f, 0.349609f, 0.361084f, 0.371826f, - 0.382812f, 0.395020f, 0.406494f, 0.417725f, 0.429688f, 0.441406f, 0.452637f, 0.465088f, - 0.477783f, 0.489258f, 0.501953f, 0.514160f, 0.527344f, 0.539062f, 0.551758f, 0.564941f, - 0.578125f, 0.591797f, 0.768555f, 0.759277f, 0.748047f, 0.736816f, 0.728027f, 0.718750f, - 0.003363f, 0.010353f, 0.017548f, 0.024765f, 0.032196f, 0.039673f, 0.046936f, 0.054565f, - 0.062561f, 0.070496f, 0.078308f, 0.086731f, 0.094910f, 0.103333f, 0.111633f, 0.120422f, - 0.129150f, 0.137695f, 0.146973f, 0.155762f, 0.164673f, 0.173950f, 0.183228f, 0.193359f, - 0.201782f, 0.212036f, 0.221436f, 0.231323f, 0.241699f, 0.251221f, 0.261719f, 0.271729f, - 0.281494f, 0.291992f, 0.302734f, 0.312988f, 0.323730f, 0.334961f, 0.345459f, 0.357666f, - 0.367432f, 0.378662f, 0.389893f, 0.401855f, 0.412842f, 0.424316f, 0.435791f, 0.447266f, - 0.459473f, 0.471436f, 0.482910f, 0.495605f, 0.507324f, 0.520508f, 0.533203f, 0.545898f, - 0.558594f, 0.570801f, 0.757812f, 0.750488f, 0.740234f, 0.729980f, 0.720703f, 0.712402f, - 0.003254f, 0.010048f, 0.016815f, 0.023453f, 0.030609f, 0.037537f, 0.044617f, 0.051971f, - 0.059265f, 0.066833f, 0.074280f, 0.082153f, 0.089905f, 0.097717f, 0.106018f, 0.113770f, - 0.122131f, 0.131104f, 0.139282f, 0.147705f, 0.155762f, 0.165161f, 0.173950f, 0.183228f, - 0.192139f, 0.200928f, 0.210693f, 0.220093f, 0.229736f, 0.239258f, 0.248657f, 0.259277f, - 0.268799f, 0.279053f, 0.288574f, 0.299561f, 0.309814f, 0.319580f, 0.330322f, 0.340820f, - 0.352783f, 0.362549f, 0.374023f, 0.385010f, 0.395752f, 0.407471f, 0.418701f, 0.429688f, - 0.441650f, 0.453125f, 0.465088f, 0.477539f, 0.489014f, 0.500977f, 0.513184f, 0.526855f, - 0.539062f, 0.552246f, 0.747559f, 0.741699f, 0.731934f, 0.722656f, 0.714355f, 0.707031f, - 0.003345f, 0.009262f, 0.015900f, 0.022614f, 0.029282f, 0.035522f, 0.042633f, 0.048981f, - 0.056000f, 0.063110f, 0.070801f, 0.077454f, 0.084839f, 0.092590f, 0.100281f, 0.107849f, - 0.116089f, 0.123169f, 0.131348f, 0.139648f, 0.148193f, 0.156616f, 0.164795f, 0.173584f, - 0.182617f, 0.191284f, 0.200073f, 0.208740f, 0.218140f, 0.227417f, 0.236694f, 0.246338f, - 0.255859f, 0.265381f, 0.275146f, 0.285889f, 0.294922f, 0.305420f, 0.315918f, 0.325928f, - 0.336670f, 0.347412f, 0.358154f, 0.368652f, 0.378662f, 0.390381f, 0.402100f, 0.412842f, - 0.424316f, 0.435059f, 0.447021f, 0.458984f, 0.470459f, 0.482422f, 0.494873f, 0.508301f, - 0.520020f, 0.532227f, 0.737305f, 0.732910f, 0.723633f, 0.715820f, 0.708008f, 0.700195f, - 0.003195f, 0.009010f, 0.015137f, 0.021225f, 0.027466f, 0.033844f, 0.040161f, 0.046417f, - 0.053497f, 0.059875f, 0.066711f, 0.073425f, 0.080505f, 0.087280f, 0.094788f, 0.102173f, - 0.109070f, 0.117004f, 0.124634f, 0.132446f, 0.139893f, 0.147705f, 0.155884f, 0.163940f, - 0.172729f, 0.180908f, 0.189697f, 0.198242f, 0.206665f, 0.215820f, 0.225220f, 0.233765f, - 0.243408f, 0.251953f, 0.262207f, 0.271484f, 0.281494f, 0.291260f, 0.300537f, 0.311035f, - 0.320801f, 0.332520f, 0.341797f, 0.352051f, 0.362305f, 0.373535f, 0.384521f, 0.395264f, - 0.406494f, 0.417480f, 0.429443f, 0.440430f, 0.451904f, 0.463867f, 0.476074f, 0.487793f, - 0.499268f, 0.513184f, 0.726562f, 0.723633f, 0.716309f, 0.708496f, 0.700684f, 0.694336f, - 0.002859f, 0.008507f, 0.014366f, 0.020203f, 0.026123f, 0.031891f, 0.038025f, 0.044281f, - 0.050354f, 0.056519f, 0.062683f, 0.069275f, 0.075195f, 0.082458f, 0.088806f, 0.095947f, - 0.102783f, 0.110046f, 0.117065f, 0.124878f, 0.132080f, 0.139282f, 0.146851f, 0.154907f, - 0.162598f, 0.171265f, 0.178833f, 0.187500f, 0.195435f, 0.204590f, 0.213013f, 0.221680f, - 0.231079f, 0.239502f, 0.248047f, 0.258301f, 0.267334f, 0.277100f, 0.286133f, 0.296387f, - 0.306641f, 0.316162f, 0.326416f, 0.336426f, 0.346924f, 0.357422f, 0.367188f, 0.378418f, - 0.389160f, 0.400391f, 0.411865f, 0.422852f, 0.433594f, 0.445557f, 0.457520f, 0.468994f, - 0.481445f, 0.493408f, 0.715332f, 0.715332f, 0.708984f, 0.700684f, 0.693848f, 0.687988f, - 0.002701f, 0.008080f, 0.013718f, 0.019058f, 0.024582f, 0.030197f, 0.035675f, 0.041748f, - 0.047302f, 0.053589f, 0.059082f, 0.065308f, 0.071777f, 0.077576f, 0.084106f, 0.090332f, - 0.097107f, 0.103577f, 0.110046f, 0.117493f, 0.124146f, 0.131470f, 0.138550f, 0.145508f, - 0.153564f, 0.161377f, 0.169067f, 0.176880f, 0.184814f, 0.192627f, 0.201294f, 0.209717f, - 0.218140f, 0.226929f, 0.235229f, 0.245117f, 0.253418f, 0.262939f, 0.272705f, 0.281738f, - 0.290771f, 0.300781f, 0.310791f, 0.321289f, 0.330566f, 0.341064f, 0.351562f, 0.361572f, - 0.372559f, 0.382568f, 0.393066f, 0.405273f, 0.415771f, 0.426758f, 0.438721f, 0.450439f, - 0.461670f, 0.474121f, 0.704102f, 0.706543f, 0.700195f, 0.693359f, 0.687012f, 0.681152f, - 0.002546f, 0.007771f, 0.012985f, 0.017975f, 0.023392f, 0.028976f, 0.034180f, 0.039368f, - 0.044556f, 0.050110f, 0.055847f, 0.061218f, 0.066895f, 0.072815f, 0.078674f, 0.085083f, - 0.091309f, 0.097168f, 0.103516f, 0.110107f, 0.116821f, 0.123413f, 0.130371f, 0.137329f, - 0.144165f, 0.151733f, 0.158813f, 0.166382f, 0.174438f, 0.182129f, 0.190063f, 0.197510f, - 0.206055f, 0.214355f, 0.222778f, 0.231812f, 0.240723f, 0.249023f, 0.258789f, 0.267578f, - 0.276855f, 0.285889f, 0.295654f, 0.305420f, 0.315430f, 0.324463f, 0.334961f, 0.345215f, - 0.354492f, 0.365234f, 0.376221f, 0.387451f, 0.398926f, 0.409424f, 0.419678f, 0.432129f, - 0.443848f, 0.455566f, 0.693848f, 0.697266f, 0.691895f, 0.686523f, 0.680176f, 0.674805f, - 0.002542f, 0.007271f, 0.012337f, 0.017181f, 0.021744f, 0.026840f, 0.031555f, 0.037231f, - 0.042236f, 0.046906f, 0.051941f, 0.057709f, 0.063049f, 0.068542f, 0.073853f, 0.079712f, - 0.085266f, 0.091064f, 0.096985f, 0.103027f, 0.109009f, 0.115417f, 0.122192f, 0.128540f, - 0.135132f, 0.141846f, 0.148926f, 0.156250f, 0.163696f, 0.171387f, 0.178223f, 0.186035f, - 0.194580f, 0.202271f, 0.210327f, 0.218994f, 0.227173f, 0.235596f, 0.244385f, 0.252930f, - 0.262451f, 0.271240f, 0.280762f, 0.290771f, 0.299805f, 0.309082f, 0.318359f, 0.329102f, - 0.338623f, 0.348633f, 0.358643f, 0.370117f, 0.379639f, 0.390869f, 0.401611f, 0.413330f, - 0.425293f, 0.436523f, 0.682129f, 0.688477f, 0.684082f, 0.678711f, 0.673340f, 0.667969f, - 0.002300f, 0.007076f, 0.011505f, 0.016251f, 0.020401f, 0.025665f, 0.029816f, 0.034790f, - 0.039368f, 0.044159f, 0.048798f, 0.053955f, 0.059174f, 0.064148f, 0.069153f, 0.074463f, - 0.079346f, 0.085266f, 0.090759f, 0.096191f, 0.102112f, 0.108032f, 0.114075f, 0.120117f, - 0.126587f, 0.133057f, 0.139648f, 0.146240f, 0.153442f, 0.160400f, 0.167725f, 0.174683f, - 0.182739f, 0.190308f, 0.198120f, 0.206177f, 0.214355f, 0.222656f, 0.230713f, 0.239258f, - 0.248413f, 0.257080f, 0.265869f, 0.274658f, 0.284424f, 0.292725f, 0.302490f, 0.313232f, - 0.321777f, 0.331787f, 0.341797f, 0.352295f, 0.363281f, 0.373535f, 0.383545f, 0.395264f, - 0.405762f, 0.416992f, 0.671387f, 0.679688f, 0.675293f, 0.670898f, 0.666016f, 0.661133f, - 0.002104f, 0.006474f, 0.010506f, 0.015099f, 0.018875f, 0.023911f, 0.028534f, 0.032715f, - 0.036652f, 0.041290f, 0.046021f, 0.050171f, 0.054535f, 0.059570f, 0.064575f, 0.069458f, - 0.074341f, 0.079346f, 0.084351f, 0.089844f, 0.095032f, 0.100830f, 0.106628f, 0.112122f, - 0.117859f, 0.124084f, 0.130249f, 0.136841f, 0.143188f, 0.149780f, 0.157349f, 0.163940f, - 0.171021f, 0.178345f, 0.186279f, 0.193848f, 0.201172f, 0.209717f, 0.217529f, 0.225464f, - 0.233765f, 0.242676f, 0.251221f, 0.260254f, 0.268311f, 0.278076f, 0.287109f, 0.296143f, - 0.305908f, 0.315674f, 0.325195f, 0.335449f, 0.344971f, 0.355469f, 0.365967f, 0.377441f, - 0.387939f, 0.398193f, 0.660645f, 0.670410f, 0.667969f, 0.663086f, 0.659180f, 0.654785f, - 0.002085f, 0.006306f, 0.010506f, 0.014107f, 0.018448f, 0.022293f, 0.026215f, 0.029953f, - 0.034515f, 0.038391f, 0.042786f, 0.046844f, 0.051361f, 0.055573f, 0.059784f, 0.064331f, - 0.068970f, 0.073425f, 0.078430f, 0.083313f, 0.088318f, 0.093567f, 0.098816f, 0.104126f, - 0.109924f, 0.115662f, 0.121521f, 0.127197f, 0.133545f, 0.139771f, 0.146729f, 0.153076f, - 0.160278f, 0.166992f, 0.174316f, 0.181274f, 0.188965f, 0.196045f, 0.204468f, 0.212036f, - 0.220459f, 0.228638f, 0.237183f, 0.245483f, 0.254150f, 0.262451f, 0.271484f, 0.281250f, - 0.290283f, 0.299561f, 0.308350f, 0.318115f, 0.328369f, 0.337158f, 0.349121f, 0.358887f, - 0.370117f, 0.380615f, 0.649414f, 0.661133f, 0.659668f, 0.655762f, 0.651855f, 0.647949f, - 0.001922f, 0.005867f, 0.009399f, 0.013565f, 0.017380f, 0.020859f, 0.024551f, 0.028442f, - 0.032318f, 0.035980f, 0.039551f, 0.043488f, 0.047333f, 0.051239f, 0.055573f, 0.059875f, - 0.063660f, 0.067810f, 0.072876f, 0.077087f, 0.081726f, 0.086304f, 0.091370f, 0.096863f, - 0.101746f, 0.107483f, 0.112732f, 0.117920f, 0.124329f, 0.130005f, 0.136108f, 0.142822f, - 0.149170f, 0.155396f, 0.162598f, 0.169434f, 0.176636f, 0.183838f, 0.191772f, 0.198975f, - 0.206665f, 0.214478f, 0.222290f, 0.230835f, 0.239258f, 0.247803f, 0.256836f, 0.264893f, - 0.274414f, 0.283203f, 0.292725f, 0.301758f, 0.311035f, 0.321289f, 0.332275f, 0.340820f, - 0.351562f, 0.363037f, 0.637695f, 0.652832f, 0.651367f, 0.647949f, 0.644531f, 0.641602f, - 0.002052f, 0.005253f, 0.009117f, 0.012482f, 0.016113f, 0.019302f, 0.022842f, 0.026230f, - 0.029831f, 0.033447f, 0.036682f, 0.040588f, 0.044189f, 0.047333f, 0.051178f, 0.055267f, - 0.058807f, 0.062683f, 0.067200f, 0.070984f, 0.075195f, 0.079895f, 0.084534f, 0.088806f, - 0.093933f, 0.098999f, 0.104309f, 0.109619f, 0.114807f, 0.120422f, 0.126587f, 0.132080f, - 0.138550f, 0.144775f, 0.151245f, 0.157837f, 0.164551f, 0.171387f, 0.178467f, 0.186157f, - 0.193359f, 0.201294f, 0.208740f, 0.216797f, 0.224854f, 0.233398f, 0.241211f, 0.250000f, - 0.258545f, 0.267822f, 0.276855f, 0.286133f, 0.295410f, 0.304932f, 0.314697f, 0.324463f, - 0.334229f, 0.344238f, 0.626953f, 0.642578f, 0.643066f, 0.641113f, 0.637695f, 0.634277f, - 0.001711f, 0.005424f, 0.008347f, 0.012024f, 0.014977f, 0.018066f, 0.021500f, 0.024399f, - 0.027756f, 0.030869f, 0.034058f, 0.037048f, 0.040558f, 0.044006f, 0.046906f, 0.050690f, - 0.054169f, 0.057983f, 0.061584f, 0.065247f, 0.069336f, 0.073425f, 0.077576f, 0.082092f, - 0.086670f, 0.091064f, 0.095886f, 0.101196f, 0.105957f, 0.111267f, 0.116943f, 0.122559f, - 0.128174f, 0.133789f, 0.140259f, 0.146118f, 0.153076f, 0.159424f, 0.166016f, 0.173462f, - 0.180542f, 0.187744f, 0.195435f, 0.203003f, 0.209961f, 0.218994f, 0.226562f, 0.234619f, - 0.243286f, 0.251709f, 0.260742f, 0.269531f, 0.277832f, 0.287354f, 0.297363f, 0.306885f, - 0.316406f, 0.326660f, 0.615234f, 0.633789f, 0.634277f, 0.632812f, 0.630371f, 0.626953f, - 0.001721f, 0.004829f, 0.008034f, 0.010857f, 0.013893f, 0.016953f, 0.019806f, 0.022705f, - 0.025589f, 0.028793f, 0.031616f, 0.034180f, 0.036926f, 0.039978f, 0.043213f, 0.046356f, - 0.049744f, 0.052887f, 0.056305f, 0.059906f, 0.063416f, 0.067322f, 0.070862f, 0.075134f, - 0.079285f, 0.083435f, 0.088074f, 0.092712f, 0.097534f, 0.102173f, 0.107544f, 0.112305f, - 0.118225f, 0.123657f, 0.129272f, 0.135376f, 0.141602f, 0.147705f, 0.153931f, 0.160889f, - 0.167847f, 0.174683f, 0.181885f, 0.189209f, 0.196533f, 0.204224f, 0.212524f, 0.219727f, - 0.228271f, 0.236572f, 0.245483f, 0.253418f, 0.261719f, 0.270996f, 0.280029f, 0.289307f, - 0.300537f, 0.309326f, 0.604004f, 0.625000f, 0.626953f, 0.625000f, 0.622559f, 0.620117f, - 0.001624f, 0.004730f, 0.007412f, 0.010300f, 0.013199f, 0.015717f, 0.018448f, 0.020935f, - 0.023163f, 0.026138f, 0.028687f, 0.031204f, 0.033875f, 0.036743f, 0.039825f, 0.042389f, - 0.045166f, 0.048523f, 0.051422f, 0.054535f, 0.057953f, 0.061249f, 0.064880f, 0.068542f, - 0.072388f, 0.076355f, 0.080505f, 0.084534f, 0.089294f, 0.093750f, 0.098389f, 0.103210f, - 0.108337f, 0.113647f, 0.118896f, 0.124817f, 0.130737f, 0.135986f, 0.142212f, 0.148560f, - 0.155151f, 0.162109f, 0.168579f, 0.175415f, 0.183105f, 0.190552f, 0.197998f, 0.205322f, - 0.213623f, 0.221436f, 0.229370f, 0.237915f, 0.246216f, 0.254883f, 0.264160f, 0.273438f, - 0.282471f, 0.292236f, 0.593262f, 0.615723f, 0.618164f, 0.617188f, 0.615234f, 0.612793f, - 0.001355f, 0.004463f, 0.007061f, 0.009506f, 0.011612f, 0.014381f, 0.016830f, 0.019394f, - 0.021576f, 0.023697f, 0.026428f, 0.028778f, 0.030975f, 0.033386f, 0.035950f, 0.038513f, - 0.041260f, 0.044067f, 0.046967f, 0.049622f, 0.052612f, 0.055847f, 0.059052f, 0.062164f, - 0.065918f, 0.069397f, 0.073242f, 0.077271f, 0.081055f, 0.085327f, 0.089661f, 0.094177f, - 0.098877f, 0.103455f, 0.108582f, 0.113647f, 0.119812f, 0.125000f, 0.130981f, 0.137085f, - 0.142944f, 0.149414f, 0.156006f, 0.162354f, 0.169434f, 0.176514f, 0.183716f, 0.191284f, - 0.198975f, 0.206421f, 0.214844f, 0.222412f, 0.231323f, 0.238647f, 0.247437f, 0.256592f, - 0.265625f, 0.276367f, 0.581055f, 0.606445f, 0.609863f, 0.608887f, 0.607910f, 0.606445f, - 0.001413f, 0.004128f, 0.006180f, 0.008781f, 0.010994f, 0.013496f, 0.015427f, 0.017654f, - 0.019684f, 0.021881f, 0.024139f, 0.025879f, 0.028137f, 0.030334f, 0.032471f, 0.034821f, - 0.037354f, 0.039642f, 0.042236f, 0.044708f, 0.047394f, 0.050079f, 0.053223f, 0.056244f, - 0.059479f, 0.062622f, 0.066223f, 0.069946f, 0.073608f, 0.077209f, 0.081604f, 0.085632f, - 0.089722f, 0.094360f, 0.098999f, 0.103943f, 0.108826f, 0.114319f, 0.119568f, 0.125122f, - 0.131104f, 0.137085f, 0.143433f, 0.150024f, 0.156494f, 0.163330f, 0.170044f, 0.177490f, - 0.184326f, 0.191895f, 0.199707f, 0.207764f, 0.215698f, 0.223755f, 0.231812f, 0.240845f, - 0.249756f, 0.258789f, 0.568848f, 0.598145f, 0.601562f, 0.600586f, 0.600586f, 0.599121f, - 0.001182f, 0.003773f, 0.005970f, 0.008293f, 0.010277f, 0.012512f, 0.014030f, 0.016129f, - 0.017929f, 0.019791f, 0.021683f, 0.023590f, 0.025452f, 0.027328f, 0.029404f, 0.031677f, - 0.033539f, 0.035583f, 0.037903f, 0.040314f, 0.042877f, 0.045319f, 0.048126f, 0.050690f, - 0.053436f, 0.056519f, 0.059723f, 0.062744f, 0.066284f, 0.069702f, 0.073608f, 0.077209f, - 0.081055f, 0.085754f, 0.089783f, 0.094421f, 0.099060f, 0.103821f, 0.109192f, 0.114563f, - 0.119934f, 0.125488f, 0.131104f, 0.137695f, 0.144043f, 0.149780f, 0.156738f, 0.163940f, - 0.170654f, 0.177856f, 0.185181f, 0.192871f, 0.200439f, 0.208740f, 0.216675f, 0.225342f, - 0.233521f, 0.242554f, 0.557617f, 0.587891f, 0.592285f, 0.592773f, 0.592285f, 0.592285f, - 0.001198f, 0.003677f, 0.005547f, 0.007561f, 0.009468f, 0.011253f, 0.012833f, 0.014465f, - 0.016205f, 0.017792f, 0.019394f, 0.021240f, 0.022751f, 0.024475f, 0.026260f, 0.028015f, - 0.030136f, 0.031708f, 0.034088f, 0.036102f, 0.038361f, 0.040497f, 0.042816f, 0.045288f, - 0.047882f, 0.050476f, 0.053284f, 0.056183f, 0.059174f, 0.062500f, 0.065796f, 0.069153f, - 0.072998f, 0.076904f, 0.080994f, 0.085083f, 0.089478f, 0.094116f, 0.098633f, 0.103394f, - 0.108704f, 0.113953f, 0.119934f, 0.125366f, 0.131348f, 0.137329f, 0.143555f, 0.150391f, - 0.157227f, 0.163818f, 0.170776f, 0.178467f, 0.185791f, 0.193359f, 0.201538f, 0.209717f, - 0.218018f, 0.226807f, 0.544922f, 0.578613f, 0.583984f, 0.584961f, 0.585449f, 0.584473f, - 0.001067f, 0.003101f, 0.004974f, 0.006855f, 0.008522f, 0.009949f, 0.011635f, 0.012985f, - 0.014595f, 0.016052f, 0.017685f, 0.019012f, 0.020264f, 0.021851f, 0.023346f, 0.025146f, - 0.026688f, 0.028336f, 0.030304f, 0.031860f, 0.034119f, 0.035889f, 0.038025f, 0.040283f, - 0.042450f, 0.044952f, 0.047302f, 0.050049f, 0.052765f, 0.055908f, 0.058594f, 0.061859f, - 0.064880f, 0.068481f, 0.072327f, 0.076172f, 0.080200f, 0.084290f, 0.088684f, 0.093262f, - 0.098145f, 0.102905f, 0.108337f, 0.113708f, 0.119080f, 0.125000f, 0.131348f, 0.137329f, - 0.143921f, 0.150391f, 0.157593f, 0.164551f, 0.171753f, 0.179077f, 0.186768f, 0.194702f, - 0.203003f, 0.210815f, 0.534180f, 0.569336f, 0.575684f, 0.577637f, 0.577637f, 0.577148f, - 0.001196f, 0.003178f, 0.004601f, 0.006241f, 0.007782f, 0.009262f, 0.010391f, 0.011795f, - 0.012955f, 0.014198f, 0.015518f, 0.016785f, 0.018097f, 0.019409f, 0.020782f, 0.022247f, - 0.023544f, 0.025269f, 0.026749f, 0.028152f, 0.030045f, 0.031555f, 0.033630f, 0.035645f, - 0.037567f, 0.039642f, 0.041992f, 0.044281f, 0.046692f, 0.049042f, 0.052094f, 0.054779f, - 0.057831f, 0.060760f, 0.064209f, 0.067627f, 0.071228f, 0.075256f, 0.079224f, 0.083557f, - 0.087891f, 0.092468f, 0.097168f, 0.102356f, 0.107605f, 0.113098f, 0.119019f, 0.124878f, - 0.130859f, 0.137451f, 0.144287f, 0.150635f, 0.157471f, 0.164917f, 0.171997f, 0.179932f, - 0.187378f, 0.196899f, 0.521973f, 0.560547f, 0.566895f, 0.569824f, 0.570312f, 0.568848f, - 0.001242f, 0.002674f, 0.004421f, 0.005573f, 0.006882f, 0.008354f, 0.009491f, 0.010559f, - 0.011406f, 0.012695f, 0.013893f, 0.014908f, 0.015854f, 0.017044f, 0.018234f, 0.019501f, - 0.020752f, 0.022003f, 0.023254f, 0.024689f, 0.026154f, 0.027802f, 0.029434f, 0.031113f, - 0.032898f, 0.034668f, 0.036774f, 0.038910f, 0.040802f, 0.043030f, 0.045593f, 0.048065f, - 0.050873f, 0.053680f, 0.056458f, 0.059692f, 0.062866f, 0.066467f, 0.069946f, 0.074036f, - 0.077942f, 0.082275f, 0.086731f, 0.091614f, 0.096313f, 0.101562f, 0.106934f, 0.112671f, - 0.118591f, 0.124634f, 0.130859f, 0.137207f, 0.144043f, 0.151123f, 0.157593f, 0.165283f, - 0.173218f, 0.180664f, 0.510254f, 0.550781f, 0.558105f, 0.561035f, 0.562012f, 0.562012f, - 0.000842f, 0.002552f, 0.003769f, 0.005333f, 0.006149f, 0.007298f, 0.008362f, 0.009224f, - 0.010254f, 0.011230f, 0.012108f, 0.013092f, 0.014000f, 0.014992f, 0.016006f, 0.016953f, - 0.017990f, 0.019196f, 0.020142f, 0.021622f, 0.022827f, 0.024216f, 0.025513f, 0.026993f, - 0.028564f, 0.030212f, 0.032013f, 0.033813f, 0.035706f, 0.037598f, 0.039703f, 0.041840f, - 0.044159f, 0.046539f, 0.049347f, 0.052155f, 0.055084f, 0.058228f, 0.061554f, 0.065002f, - 0.068909f, 0.072693f, 0.076599f, 0.081238f, 0.085388f, 0.090515f, 0.095764f, 0.100891f, - 0.106689f, 0.112366f, 0.118103f, 0.124634f, 0.130859f, 0.137573f, 0.144287f, 0.151855f, - 0.158447f, 0.166260f, 0.498535f, 0.541992f, 0.549805f, 0.553711f, 0.554199f, 0.554688f, - 0.000874f, 0.002186f, 0.003445f, 0.004807f, 0.005562f, 0.006607f, 0.007378f, 0.008102f, - 0.008919f, 0.009666f, 0.010513f, 0.011131f, 0.012039f, 0.012848f, 0.013779f, 0.014671f, - 0.015465f, 0.016464f, 0.017517f, 0.018585f, 0.019730f, 0.020798f, 0.022018f, 0.023300f, - 0.024612f, 0.026093f, 0.027374f, 0.029022f, 0.030624f, 0.032440f, 0.034180f, 0.036285f, - 0.038116f, 0.040344f, 0.042725f, 0.045349f, 0.047913f, 0.050476f, 0.053406f, 0.056488f, - 0.059998f, 0.063354f, 0.067383f, 0.071289f, 0.075562f, 0.079834f, 0.084656f, 0.089478f, - 0.094849f, 0.100342f, 0.106140f, 0.111877f, 0.118042f, 0.124573f, 0.130981f, 0.137451f, - 0.144653f, 0.152588f, 0.486816f, 0.531738f, 0.541016f, 0.545410f, 0.547363f, 0.546875f, - 0.000667f, 0.002001f, 0.003244f, 0.003895f, 0.004936f, 0.005608f, 0.006477f, 0.006901f, - 0.007648f, 0.008354f, 0.009132f, 0.009766f, 0.010490f, 0.011177f, 0.011780f, 0.012543f, - 0.013420f, 0.014084f, 0.015045f, 0.015961f, 0.016876f, 0.017822f, 0.018768f, 0.019958f, - 0.021255f, 0.022232f, 0.023560f, 0.024780f, 0.026108f, 0.027634f, 0.029221f, 0.030762f, - 0.032684f, 0.034576f, 0.036621f, 0.038605f, 0.040985f, 0.043488f, 0.046021f, 0.049042f, - 0.051727f, 0.054901f, 0.058441f, 0.061981f, 0.065552f, 0.069885f, 0.074097f, 0.078857f, - 0.083923f, 0.088623f, 0.094360f, 0.099854f, 0.105957f, 0.111694f, 0.118164f, 0.124817f, - 0.131836f, 0.138794f, 0.474365f, 0.522949f, 0.532227f, 0.536621f, 0.538574f, 0.539062f, - 0.000876f, 0.002020f, 0.002857f, 0.003855f, 0.004436f, 0.005009f, 0.005482f, 0.006130f, - 0.006588f, 0.007084f, 0.007656f, 0.008286f, 0.008949f, 0.009506f, 0.010025f, 0.010803f, - 0.011444f, 0.012047f, 0.012802f, 0.013512f, 0.014305f, 0.015282f, 0.016052f, 0.016846f, - 0.017914f, 0.018829f, 0.019882f, 0.021027f, 0.022232f, 0.023453f, 0.024689f, 0.026169f, - 0.027573f, 0.029327f, 0.031036f, 0.032806f, 0.034882f, 0.036743f, 0.039032f, 0.041626f, - 0.044312f, 0.046936f, 0.050018f, 0.053253f, 0.056610f, 0.060272f, 0.064392f, 0.068542f, - 0.072937f, 0.078003f, 0.082886f, 0.088318f, 0.093933f, 0.099670f, 0.106140f, 0.112000f, - 0.118713f, 0.125732f, 0.463135f, 0.513672f, 0.524414f, 0.528809f, 0.530762f, 0.532227f, - 0.000573f, 0.001698f, 0.002670f, 0.003082f, 0.003735f, 0.004318f, 0.004673f, 0.005161f, - 0.005779f, 0.006203f, 0.006565f, 0.007015f, 0.007591f, 0.007965f, 0.008583f, 0.009094f, - 0.009491f, 0.010239f, 0.010780f, 0.011353f, 0.012047f, 0.012787f, 0.013504f, 0.014206f, - 0.015060f, 0.015915f, 0.016708f, 0.017685f, 0.018677f, 0.019653f, 0.020828f, 0.021866f, - 0.023224f, 0.024445f, 0.025818f, 0.027557f, 0.029114f, 0.030991f, 0.032928f, 0.035034f, - 0.037201f, 0.039581f, 0.042328f, 0.045166f, 0.048157f, 0.051392f, 0.054962f, 0.058685f, - 0.062988f, 0.067444f, 0.072021f, 0.077148f, 0.082520f, 0.088196f, 0.093750f, 0.100403f, - 0.106201f, 0.112976f, 0.450928f, 0.503906f, 0.515137f, 0.520020f, 0.522949f, 0.524414f, - 0.000643f, 0.001637f, 0.002197f, 0.002800f, 0.003376f, 0.003613f, 0.003914f, 0.004391f, - 0.004742f, 0.005150f, 0.005466f, 0.005924f, 0.006344f, 0.006645f, 0.007046f, 0.007591f, - 0.008118f, 0.008560f, 0.008934f, 0.009529f, 0.010147f, 0.010651f, 0.011276f, 0.011787f, - 0.012543f, 0.013229f, 0.013916f, 0.014740f, 0.015564f, 0.016388f, 0.017258f, 0.018188f, - 0.019257f, 0.020355f, 0.021729f, 0.022766f, 0.024277f, 0.025696f, 0.027237f, 0.029022f, - 0.030945f, 0.033020f, 0.035248f, 0.037689f, 0.040405f, 0.043182f, 0.046295f, 0.049866f, - 0.053528f, 0.057526f, 0.061920f, 0.066284f, 0.071716f, 0.077209f, 0.082703f, 0.088196f, - 0.094177f, 0.101074f, 0.438965f, 0.494629f, 0.507324f, 0.512207f, 0.515137f, 0.516113f, - 0.000484f, 0.001272f, 0.001968f, 0.002327f, 0.002573f, 0.003054f, 0.003338f, 0.003660f, - 0.003906f, 0.004303f, 0.004658f, 0.004921f, 0.005222f, 0.005547f, 0.005878f, 0.006290f, - 0.006542f, 0.007015f, 0.007442f, 0.007851f, 0.008339f, 0.008713f, 0.009247f, 0.009811f, - 0.010345f, 0.010849f, 0.011490f, 0.012123f, 0.012733f, 0.013428f, 0.014183f, 0.014961f, - 0.015839f, 0.016815f, 0.017731f, 0.018768f, 0.019821f, 0.021072f, 0.022385f, 0.023727f, - 0.025345f, 0.027084f, 0.028946f, 0.030914f, 0.033295f, 0.035614f, 0.038513f, 0.041473f, - 0.044678f, 0.048462f, 0.052338f, 0.056671f, 0.061310f, 0.066101f, 0.071533f, 0.077148f, - 0.083069f, 0.089172f, 0.427246f, 0.485352f, 0.498535f, 0.503906f, 0.508301f, 0.509766f, - 0.000416f, 0.001121f, 0.001410f, 0.001959f, 0.002159f, 0.002558f, 0.002724f, 0.002939f, - 0.003220f, 0.003447f, 0.003733f, 0.003944f, 0.004219f, 0.004578f, 0.004810f, 0.005100f, - 0.005402f, 0.005783f, 0.006077f, 0.006382f, 0.006729f, 0.007141f, 0.007526f, 0.007965f, - 0.008354f, 0.008858f, 0.009300f, 0.009789f, 0.010452f, 0.010986f, 0.011658f, 0.012131f, - 0.012833f, 0.013702f, 0.014435f, 0.015266f, 0.016113f, 0.017136f, 0.018143f, 0.019241f, - 0.020493f, 0.021820f, 0.023346f, 0.025085f, 0.027023f, 0.028976f, 0.031174f, 0.033966f, - 0.036743f, 0.039856f, 0.043396f, 0.047180f, 0.051605f, 0.056152f, 0.061127f, 0.066284f, - 0.072021f, 0.078247f, 0.415283f, 0.475586f, 0.490234f, 0.496338f, 0.499756f, 0.501953f, - 0.000493f, 0.001126f, 0.001391f, 0.001574f, 0.001786f, 0.002073f, 0.002188f, 0.002417f, - 0.002657f, 0.002785f, 0.002964f, 0.003189f, 0.003384f, 0.003687f, 0.003859f, 0.004124f, - 0.004330f, 0.004555f, 0.004890f, 0.005119f, 0.005451f, 0.005749f, 0.006054f, 0.006348f, - 0.006683f, 0.007050f, 0.007458f, 0.007889f, 0.008339f, 0.008751f, 0.009323f, 0.009766f, - 0.010353f, 0.010887f, 0.011520f, 0.012192f, 0.012932f, 0.013748f, 0.014542f, 0.015434f, - 0.016434f, 0.017471f, 0.018723f, 0.019989f, 0.021500f, 0.023117f, 0.024948f, 0.027100f, - 0.029770f, 0.032166f, 0.035248f, 0.038696f, 0.042633f, 0.046875f, 0.051605f, 0.056427f, - 0.061859f, 0.067688f, 0.403320f, 0.467041f, 0.480957f, 0.487793f, 0.491699f, 0.494385f, - 0.000336f, 0.000673f, 0.001150f, 0.001274f, 0.001482f, 0.001630f, 0.001748f, 0.001904f, - 0.002087f, 0.002232f, 0.002306f, 0.002497f, 0.002672f, 0.002872f, 0.003092f, 0.003225f, - 0.003387f, 0.003553f, 0.003819f, 0.003979f, 0.004230f, 0.004517f, 0.004738f, 0.005016f, - 0.005322f, 0.005569f, 0.005848f, 0.006184f, 0.006573f, 0.006851f, 0.007271f, 0.007660f, - 0.008064f, 0.008568f, 0.009048f, 0.009567f, 0.010139f, 0.010788f, 0.011391f, 0.012161f, - 0.012939f, 0.013763f, 0.014694f, 0.015717f, 0.016815f, 0.018097f, 0.019714f, 0.021149f, - 0.023270f, 0.025421f, 0.028015f, 0.030991f, 0.034271f, 0.038116f, 0.042328f, 0.046997f, - 0.052094f, 0.057770f, 0.391113f, 0.457031f, 0.472412f, 0.479736f, 0.484375f, 0.486816f, - 0.000309f, 0.000612f, 0.000953f, 0.001086f, 0.001191f, 0.001281f, 0.001351f, 0.001442f, - 0.001610f, 0.001733f, 0.001783f, 0.001991f, 0.002087f, 0.002232f, 0.002337f, 0.002495f, - 0.002611f, 0.002775f, 0.002935f, 0.003101f, 0.003302f, 0.003496f, 0.003622f, 0.003839f, - 0.004047f, 0.004265f, 0.004494f, 0.004738f, 0.005039f, 0.005272f, 0.005650f, 0.005898f, - 0.006210f, 0.006588f, 0.006950f, 0.007332f, 0.007782f, 0.008240f, 0.008766f, 0.009331f, - 0.009964f, 0.010612f, 0.011314f, 0.012062f, 0.013023f, 0.014038f, 0.015007f, 0.016251f, - 0.017761f, 0.019501f, 0.021530f, 0.023926f, 0.026718f, 0.030106f, 0.033905f, 0.038361f, - 0.043060f, 0.048370f, 0.379395f, 0.446777f, 0.464111f, 0.471191f, 0.475586f, 0.479492f, - 0.000439f, 0.000476f, 0.000672f, 0.000752f, 0.000810f, 0.000949f, 0.001011f, 0.001121f, - 0.001160f, 0.001249f, 0.001408f, 0.001493f, 0.001591f, 0.001719f, 0.001788f, 0.001845f, - 0.001982f, 0.002106f, 0.002201f, 0.002357f, 0.002460f, 0.002598f, 0.002724f, 0.002869f, - 0.003036f, 0.003187f, 0.003397f, 0.003569f, 0.003763f, 0.004017f, 0.004211f, 0.004414f, - 0.004704f, 0.004890f, 0.005234f, 0.005524f, 0.005825f, 0.006187f, 0.006535f, 0.006977f, - 0.007423f, 0.007874f, 0.008553f, 0.009079f, 0.009857f, 0.010567f, 0.011360f, 0.012306f, - 0.013390f, 0.014702f, 0.016220f, 0.017960f, 0.020157f, 0.022995f, 0.026352f, 0.030212f, - 0.034790f, 0.039459f, 0.368408f, 0.437744f, 0.455322f, 0.463379f, 0.468018f, 0.471436f, - 0.000202f, 0.000437f, 0.000488f, 0.000579f, 0.000664f, 0.000692f, 0.000792f, 0.000762f, - 0.000875f, 0.000949f, 0.001038f, 0.001068f, 0.001116f, 0.001196f, 0.001300f, 0.001352f, - 0.001458f, 0.001529f, 0.001623f, 0.001667f, 0.001770f, 0.001884f, 0.001989f, 0.002071f, - 0.002203f, 0.002310f, 0.002445f, 0.002556f, 0.002680f, 0.002876f, 0.002991f, 0.003206f, - 0.003365f, 0.003531f, 0.003759f, 0.003956f, 0.004227f, 0.004513f, 0.004768f, 0.005074f, - 0.005402f, 0.005756f, 0.006142f, 0.006603f, 0.007160f, 0.007645f, 0.008339f, 0.008987f, - 0.009819f, 0.010780f, 0.011803f, 0.013153f, 0.014763f, 0.016876f, 0.019623f, 0.022995f, - 0.026978f, 0.031708f, 0.356445f, 0.428223f, 0.446533f, 0.455078f, 0.460449f, 0.463379f, - 0.000126f, 0.000241f, 0.000344f, 0.000353f, 0.000437f, 0.000522f, 0.000513f, 0.000552f, - 0.000613f, 0.000699f, 0.000717f, 0.000727f, 0.000763f, 0.000848f, 0.000877f, 0.000956f, - 0.000963f, 0.001068f, 0.001128f, 0.001170f, 0.001238f, 0.001311f, 0.001385f, 0.001454f, - 0.001534f, 0.001603f, 0.001714f, 0.001779f, 0.001885f, 0.002016f, 0.002092f, 0.002214f, - 0.002331f, 0.002460f, 0.002613f, 0.002777f, 0.002924f, 0.003120f, 0.003298f, 0.003496f, - 0.003708f, 0.004009f, 0.004292f, 0.004601f, 0.004951f, 0.005341f, 0.005772f, 0.006260f, - 0.006901f, 0.007572f, 0.008324f, 0.009300f, 0.010445f, 0.011848f, 0.013870f, 0.016678f, - 0.020218f, 0.024536f, 0.345703f, 0.419189f, 0.437500f, 0.447021f, 0.452393f, 0.455811f, - 0.000146f, 0.000240f, 0.000268f, 0.000268f, 0.000310f, 0.000311f, 0.000331f, 0.000366f, - 0.000410f, 0.000447f, 0.000446f, 0.000517f, 0.000511f, 0.000571f, 0.000596f, 0.000618f, - 0.000674f, 0.000691f, 0.000723f, 0.000762f, 0.000822f, 0.000856f, 0.000912f, 0.000950f, - 0.001014f, 0.001049f, 0.001128f, 0.001188f, 0.001237f, 0.001303f, 0.001371f, 0.001466f, - 0.001532f, 0.001623f, 0.001701f, 0.001805f, 0.001945f, 0.002035f, 0.002186f, 0.002329f, - 0.002460f, 0.002632f, 0.002819f, 0.003012f, 0.003271f, 0.003550f, 0.003819f, 0.004162f, - 0.004539f, 0.005024f, 0.005585f, 0.006233f, 0.007050f, 0.008072f, 0.009331f, 0.011269f, - 0.014160f, 0.018112f, 0.333740f, 0.408447f, 0.428711f, 0.438232f, 0.443359f, 0.447510f, - 0.000053f, 0.000163f, 0.000155f, 0.000160f, 0.000191f, 0.000228f, 0.000206f, 0.000233f, - 0.000248f, 0.000263f, 0.000267f, 0.000294f, 0.000324f, 0.000335f, 0.000364f, 0.000378f, - 0.000396f, 0.000435f, 0.000445f, 0.000490f, 0.000502f, 0.000522f, 0.000543f, 0.000582f, - 0.000619f, 0.000665f, 0.000679f, 0.000705f, 0.000755f, 0.000797f, 0.000856f, 0.000887f, - 0.000953f, 0.000988f, 0.001043f, 0.001103f, 0.001177f, 0.001256f, 0.001331f, 0.001410f, - 0.001508f, 0.001612f, 0.001734f, 0.001873f, 0.001999f, 0.002163f, 0.002378f, 0.002565f, - 0.002827f, 0.003119f, 0.003479f, 0.003899f, 0.004463f, 0.005116f, 0.005951f, 0.007153f, - 0.009163f, 0.012535f, 0.322510f, 0.400146f, 0.420654f, 0.430176f, 0.436523f, 0.440430f, - 0.000097f, 0.000107f, 0.000095f, 0.000087f, 0.000107f, 0.000110f, 0.000137f, 0.000139f, - 0.000140f, 0.000147f, 0.000168f, 0.000175f, 0.000177f, 0.000184f, 0.000210f, 0.000200f, - 0.000224f, 0.000239f, 0.000246f, 0.000258f, 0.000278f, 0.000288f, 0.000312f, 0.000324f, - 0.000347f, 0.000368f, 0.000382f, 0.000395f, 0.000418f, 0.000440f, 0.000471f, 0.000495f, - 0.000521f, 0.000547f, 0.000577f, 0.000620f, 0.000649f, 0.000695f, 0.000749f, 0.000785f, - 0.000838f, 0.000897f, 0.000972f, 0.001028f, 0.001118f, 0.001204f, 0.001316f, 0.001432f, - 0.001580f, 0.001748f, 0.001961f, 0.002207f, 0.002533f, 0.002941f, 0.003487f, 0.004223f, - 0.005371f, 0.007809f, 0.311523f, 0.390381f, 0.411377f, 0.421875f, 0.428467f, 0.432617f, - 0.000000f, 0.000055f, 0.000046f, 0.000054f, 0.000060f, 0.000058f, 0.000060f, 0.000068f, - 0.000068f, 0.000082f, 0.000076f, 0.000078f, 0.000092f, 0.000087f, 0.000091f, 0.000097f, - 0.000105f, 0.000115f, 0.000118f, 0.000124f, 0.000128f, 0.000133f, 0.000139f, 0.000154f, - 0.000160f, 0.000172f, 0.000175f, 0.000191f, 0.000201f, 0.000211f, 0.000221f, 0.000238f, - 0.000242f, 0.000257f, 0.000277f, 0.000295f, 0.000309f, 0.000326f, 0.000351f, 0.000375f, - 0.000400f, 0.000428f, 0.000459f, 0.000490f, 0.000535f, 0.000579f, 0.000626f, 0.000683f, - 0.000754f, 0.000836f, 0.000952f, 0.001064f, 0.001237f, 0.001460f, 0.001751f, 0.002157f, - 0.002800f, 0.004189f, 0.299561f, 0.380127f, 0.403076f, 0.413574f, 0.419922f, 0.424072f, - 0.000059f, 0.000039f, 0.000032f, 0.000028f, 0.000025f, 0.000025f, 0.000025f, 0.000024f, - 0.000023f, 0.000024f, 0.000026f, 0.000034f, 0.000029f, 0.000031f, 0.000038f, 0.000040f, - 0.000042f, 0.000043f, 0.000042f, 0.000043f, 0.000048f, 0.000054f, 0.000058f, 0.000056f, - 0.000060f, 0.000062f, 0.000066f, 0.000069f, 0.000072f, 0.000078f, 0.000082f, 0.000085f, - 0.000093f, 0.000096f, 0.000099f, 0.000106f, 0.000116f, 0.000123f, 0.000132f, 0.000140f, - 0.000150f, 0.000154f, 0.000167f, 0.000184f, 0.000192f, 0.000212f, 0.000231f, 0.000251f, - 0.000282f, 0.000314f, 0.000350f, 0.000401f, 0.000463f, 0.000554f, 0.000679f, 0.000861f, - 0.001157f, 0.001750f, 0.289307f, 0.371582f, 0.394043f, 0.406006f, 0.412109f, 0.417236f, - 0.000031f, 0.000020f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f, - 0.000010f, 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000008f, 0.000008f, 0.000009f, - 0.000009f, 0.000007f, 0.000008f, 0.000008f, 0.000010f, 0.000011f, 0.000012f, 0.000013f, - 0.000013f, 0.000013f, 0.000014f, 0.000017f, 0.000017f, 0.000016f, 0.000018f, 0.000019f, - 0.000021f, 0.000021f, 0.000022f, 0.000025f, 0.000027f, 0.000025f, 0.000028f, 0.000030f, - 0.000033f, 0.000036f, 0.000038f, 0.000040f, 0.000042f, 0.000047f, 0.000052f, 0.000057f, - 0.000060f, 0.000068f, 0.000073f, 0.000089f, 0.000104f, 0.000124f, 0.000153f, 0.000204f, - 0.000293f, 0.000497f, 0.278076f, 0.362793f, 0.385498f, 0.397705f, 0.405029f, 0.409912f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000005f, 0.000008f, - 0.000012f, 0.000026f, 0.267822f, 0.353027f, 0.376953f, 0.388916f, 0.395996f, 0.401367f, - }, - { - 0.006824f, 0.021286f, 0.036285f, 0.051208f, 0.066467f, 0.082825f, 0.098694f, 0.114563f, - 0.130737f, 0.146973f, 0.162720f, 0.179932f, 0.196411f, 0.212646f, 0.229370f, 0.246338f, - 0.263184f, 0.279785f, 0.297363f, 0.314209f, 0.331055f, 0.348389f, 0.365479f, 0.383301f, - 0.400146f, 0.417725f, 0.435303f, 0.451904f, 0.469971f, 0.486816f, 0.503906f, 0.521484f, - 0.539551f, 0.556641f, 0.573730f, 0.592285f, 0.609375f, 0.627441f, 0.644531f, 0.662598f, - 0.679688f, 0.696777f, 0.714355f, 0.731934f, 0.749512f, 0.768066f, 0.784180f, 0.802246f, - 0.820312f, 0.837891f, 0.854980f, 0.871582f, 0.889648f, 0.906738f, 0.924805f, 0.941406f, - 0.959473f, 0.976074f, 0.953125f, 0.895020f, 0.857422f, 0.827637f, 0.803223f, 0.781738f, - 0.006741f, 0.020706f, 0.035187f, 0.049866f, 0.065125f, 0.079895f, 0.095581f, 0.111206f, - 0.126953f, 0.142822f, 0.158569f, 0.174561f, 0.190796f, 0.207031f, 0.223511f, 0.239380f, - 0.256104f, 0.272705f, 0.289307f, 0.305664f, 0.322754f, 0.338867f, 0.356201f, 0.372314f, - 0.389404f, 0.406494f, 0.423828f, 0.440430f, 0.457520f, 0.474854f, 0.491211f, 0.508789f, - 0.525391f, 0.541992f, 0.559082f, 0.576660f, 0.594238f, 0.610840f, 0.627930f, 0.645508f, - 0.662598f, 0.679199f, 0.696289f, 0.713379f, 0.731445f, 0.747559f, 0.765137f, 0.782715f, - 0.799805f, 0.816895f, 0.834473f, 0.851074f, 0.868164f, 0.884766f, 0.902344f, 0.919434f, - 0.936523f, 0.953613f, 0.942871f, 0.887695f, 0.851562f, 0.823730f, 0.799805f, 0.779297f, - 0.006504f, 0.020004f, 0.033875f, 0.048676f, 0.063110f, 0.077759f, 0.092712f, 0.108032f, - 0.123230f, 0.138672f, 0.153931f, 0.170044f, 0.185791f, 0.200806f, 0.217041f, 0.233276f, - 0.248901f, 0.265137f, 0.280762f, 0.297363f, 0.313721f, 0.329834f, 0.346680f, 0.363037f, - 0.378418f, 0.395752f, 0.411621f, 0.428467f, 0.445312f, 0.461670f, 0.479004f, 0.494873f, - 0.511230f, 0.527832f, 0.544434f, 0.561523f, 0.578613f, 0.594727f, 0.611328f, 0.628906f, - 0.645508f, 0.662109f, 0.679199f, 0.695312f, 0.712402f, 0.729004f, 0.746094f, 0.762695f, - 0.779297f, 0.796387f, 0.812500f, 0.829590f, 0.846191f, 0.863281f, 0.879395f, 0.896973f, - 0.914062f, 0.930176f, 0.932129f, 0.879395f, 0.845703f, 0.818848f, 0.795898f, 0.776367f, - 0.006226f, 0.019318f, 0.032959f, 0.046631f, 0.060699f, 0.075745f, 0.089966f, 0.104553f, - 0.119385f, 0.134277f, 0.149292f, 0.164917f, 0.179932f, 0.195190f, 0.210693f, 0.226562f, - 0.242188f, 0.257568f, 0.273438f, 0.289062f, 0.304932f, 0.320557f, 0.336426f, 0.352539f, - 0.368652f, 0.384766f, 0.400391f, 0.417236f, 0.433105f, 0.448730f, 0.465088f, 0.481689f, - 0.497559f, 0.513672f, 0.528809f, 0.546875f, 0.562500f, 0.578613f, 0.595215f, 0.612793f, - 0.627930f, 0.645508f, 0.661621f, 0.677246f, 0.693848f, 0.709961f, 0.726562f, 0.743164f, - 0.759766f, 0.774902f, 0.791992f, 0.808594f, 0.825195f, 0.841309f, 0.856934f, 0.874023f, - 0.890625f, 0.907715f, 0.921387f, 0.872070f, 0.839355f, 0.813477f, 0.791504f, 0.772461f, - 0.005928f, 0.018997f, 0.031830f, 0.045380f, 0.059235f, 0.072754f, 0.087463f, 0.101562f, - 0.115723f, 0.130371f, 0.145264f, 0.159668f, 0.175049f, 0.189453f, 0.204468f, 0.219482f, - 0.234497f, 0.250000f, 0.266113f, 0.280273f, 0.295410f, 0.311768f, 0.327393f, 0.343018f, - 0.357422f, 0.373779f, 0.389404f, 0.404785f, 0.421143f, 0.437012f, 0.452881f, 0.468262f, - 0.484375f, 0.499512f, 0.515137f, 0.531738f, 0.546875f, 0.562500f, 0.579102f, 0.595215f, - 0.610840f, 0.627441f, 0.643555f, 0.659180f, 0.674805f, 0.691406f, 0.708008f, 0.723145f, - 0.738770f, 0.755371f, 0.771484f, 0.787598f, 0.803711f, 0.819824f, 0.835449f, 0.851562f, - 0.867676f, 0.884277f, 0.910156f, 0.864258f, 0.832520f, 0.808105f, 0.787109f, 0.769043f, - 0.005939f, 0.018066f, 0.030991f, 0.043488f, 0.057312f, 0.070557f, 0.084473f, 0.098328f, - 0.112610f, 0.126587f, 0.140259f, 0.154907f, 0.169678f, 0.184326f, 0.198608f, 0.213379f, - 0.227783f, 0.242065f, 0.257568f, 0.272705f, 0.287109f, 0.302246f, 0.318115f, 0.333252f, - 0.347656f, 0.362549f, 0.378418f, 0.393555f, 0.408936f, 0.423828f, 0.439697f, 0.455078f, - 0.471191f, 0.484863f, 0.500488f, 0.517578f, 0.532227f, 0.547363f, 0.562500f, 0.579102f, - 0.594727f, 0.610352f, 0.625488f, 0.641602f, 0.657227f, 0.671875f, 0.687500f, 0.704102f, - 0.719238f, 0.733887f, 0.750488f, 0.767090f, 0.782715f, 0.798340f, 0.813965f, 0.830566f, - 0.845215f, 0.862305f, 0.899902f, 0.855469f, 0.825684f, 0.801758f, 0.782227f, 0.764648f, - 0.005684f, 0.017639f, 0.030334f, 0.042572f, 0.055298f, 0.068054f, 0.081787f, 0.095276f, - 0.108765f, 0.122192f, 0.136353f, 0.150513f, 0.164307f, 0.178467f, 0.192627f, 0.206665f, - 0.221436f, 0.234985f, 0.249634f, 0.264404f, 0.278564f, 0.293213f, 0.308350f, 0.321533f, - 0.337646f, 0.353027f, 0.367432f, 0.381592f, 0.395996f, 0.411865f, 0.426758f, 0.441895f, - 0.456543f, 0.471680f, 0.485840f, 0.501465f, 0.517090f, 0.531738f, 0.546387f, 0.562012f, - 0.576660f, 0.592773f, 0.608398f, 0.623047f, 0.638672f, 0.654297f, 0.668457f, 0.684082f, - 0.699707f, 0.714844f, 0.730469f, 0.745605f, 0.761230f, 0.777832f, 0.791504f, 0.807617f, - 0.823242f, 0.839355f, 0.889160f, 0.847656f, 0.818848f, 0.796387f, 0.776855f, 0.760254f, - 0.005417f, 0.017136f, 0.028778f, 0.041016f, 0.054047f, 0.066528f, 0.079590f, 0.092102f, - 0.105225f, 0.118652f, 0.131714f, 0.145630f, 0.158813f, 0.172607f, 0.186523f, 0.200317f, - 0.213745f, 0.227905f, 0.242188f, 0.256104f, 0.270020f, 0.283936f, 0.299072f, 0.312744f, - 0.327148f, 0.341797f, 0.355957f, 0.369629f, 0.384766f, 0.399414f, 0.413574f, 0.427490f, - 0.443115f, 0.457764f, 0.472656f, 0.487061f, 0.501465f, 0.516602f, 0.530762f, 0.545898f, - 0.560547f, 0.574707f, 0.589844f, 0.605469f, 0.619629f, 0.633301f, 0.648926f, 0.665527f, - 0.679688f, 0.694824f, 0.709961f, 0.725586f, 0.739746f, 0.755371f, 0.770020f, 0.786133f, - 0.802246f, 0.817383f, 0.877930f, 0.838867f, 0.812012f, 0.790039f, 0.771973f, 0.755371f, - 0.005520f, 0.016464f, 0.027695f, 0.039948f, 0.051575f, 0.063965f, 0.076660f, 0.089111f, - 0.101807f, 0.114319f, 0.126953f, 0.140381f, 0.153564f, 0.166992f, 0.180298f, 0.193970f, - 0.207153f, 0.220337f, 0.234131f, 0.248169f, 0.261475f, 0.275146f, 0.288818f, 0.302734f, - 0.316162f, 0.330566f, 0.345459f, 0.358887f, 0.372803f, 0.386719f, 0.401367f, 0.415527f, - 0.429199f, 0.443848f, 0.458008f, 0.472412f, 0.486572f, 0.500977f, 0.515137f, 0.529785f, - 0.544434f, 0.558105f, 0.572754f, 0.587891f, 0.601074f, 0.617188f, 0.631836f, 0.645020f, - 0.660645f, 0.674805f, 0.689453f, 0.704590f, 0.719727f, 0.734375f, 0.750000f, 0.764160f, - 0.780273f, 0.794922f, 0.866699f, 0.830566f, 0.804688f, 0.784180f, 0.766113f, 0.750977f, - 0.005222f, 0.016022f, 0.026962f, 0.038086f, 0.050049f, 0.061798f, 0.074158f, 0.085876f, - 0.098145f, 0.110718f, 0.122986f, 0.135864f, 0.148438f, 0.161133f, 0.173584f, 0.187378f, - 0.199707f, 0.213501f, 0.226440f, 0.240112f, 0.252441f, 0.266113f, 0.279785f, 0.292725f, - 0.306152f, 0.320068f, 0.333984f, 0.347900f, 0.361572f, 0.374512f, 0.387695f, 0.402344f, - 0.416504f, 0.429688f, 0.443604f, 0.458008f, 0.471680f, 0.485596f, 0.499023f, 0.513184f, - 0.527832f, 0.541016f, 0.555664f, 0.569336f, 0.583984f, 0.598633f, 0.612793f, 0.626465f, - 0.641602f, 0.656250f, 0.669922f, 0.684570f, 0.698730f, 0.713867f, 0.728516f, 0.742188f, - 0.757812f, 0.771484f, 0.855957f, 0.822266f, 0.797852f, 0.777832f, 0.760742f, 0.746094f, - 0.004944f, 0.015327f, 0.026230f, 0.037201f, 0.048187f, 0.059448f, 0.071167f, 0.082642f, - 0.094727f, 0.106506f, 0.119019f, 0.130371f, 0.143555f, 0.155640f, 0.167725f, 0.180908f, - 0.193604f, 0.206177f, 0.218506f, 0.231812f, 0.244873f, 0.257568f, 0.270996f, 0.283203f, - 0.296387f, 0.309814f, 0.322754f, 0.336670f, 0.348877f, 0.362061f, 0.376465f, 0.389893f, - 0.402588f, 0.415283f, 0.429443f, 0.443115f, 0.457031f, 0.470459f, 0.483887f, 0.497314f, - 0.511230f, 0.524414f, 0.538574f, 0.551758f, 0.565918f, 0.579590f, 0.593750f, 0.606934f, - 0.621094f, 0.635254f, 0.649902f, 0.664062f, 0.678223f, 0.692871f, 0.707031f, 0.721191f, - 0.735840f, 0.750488f, 0.846191f, 0.813477f, 0.790527f, 0.770996f, 0.754883f, 0.740723f, - 0.004951f, 0.014656f, 0.025253f, 0.035309f, 0.046417f, 0.057465f, 0.068665f, 0.079773f, - 0.091370f, 0.102844f, 0.114441f, 0.126099f, 0.138062f, 0.150391f, 0.161987f, 0.174561f, - 0.186523f, 0.198730f, 0.211060f, 0.223267f, 0.235352f, 0.248779f, 0.260986f, 0.274414f, - 0.286621f, 0.298584f, 0.312256f, 0.324463f, 0.337158f, 0.350342f, 0.363281f, 0.376953f, - 0.389404f, 0.402344f, 0.415283f, 0.428955f, 0.441162f, 0.455322f, 0.467285f, 0.481201f, - 0.493896f, 0.507324f, 0.520996f, 0.534668f, 0.547852f, 0.561035f, 0.575195f, 0.588867f, - 0.603027f, 0.616211f, 0.630371f, 0.643555f, 0.658203f, 0.671875f, 0.686035f, 0.699707f, - 0.714844f, 0.729492f, 0.833984f, 0.804688f, 0.782227f, 0.764160f, 0.749512f, 0.735352f, - 0.004700f, 0.014343f, 0.024200f, 0.034515f, 0.044586f, 0.055176f, 0.066162f, 0.077209f, - 0.087830f, 0.098816f, 0.110413f, 0.121826f, 0.132690f, 0.144897f, 0.156372f, 0.168213f, - 0.179443f, 0.191650f, 0.203369f, 0.215088f, 0.227661f, 0.239990f, 0.251709f, 0.263916f, - 0.276611f, 0.289551f, 0.301270f, 0.313965f, 0.325928f, 0.338135f, 0.350586f, 0.363037f, - 0.376465f, 0.388428f, 0.401123f, 0.414062f, 0.426514f, 0.439209f, 0.452393f, 0.465088f, - 0.478271f, 0.491455f, 0.503906f, 0.517090f, 0.530273f, 0.543457f, 0.556641f, 0.570312f, - 0.583008f, 0.597168f, 0.610352f, 0.624512f, 0.638184f, 0.651367f, 0.665527f, 0.679199f, - 0.692871f, 0.708496f, 0.823242f, 0.796387f, 0.774902f, 0.757812f, 0.742676f, 0.729980f, - 0.004395f, 0.013802f, 0.023499f, 0.033173f, 0.043121f, 0.053345f, 0.063538f, 0.073730f, - 0.085083f, 0.095581f, 0.106140f, 0.116760f, 0.127930f, 0.139160f, 0.150757f, 0.161621f, - 0.173096f, 0.184814f, 0.196289f, 0.207520f, 0.219971f, 0.231201f, 0.242920f, 0.254150f, - 0.266602f, 0.278320f, 0.290527f, 0.302490f, 0.314209f, 0.326904f, 0.338867f, 0.349854f, - 0.362305f, 0.375488f, 0.387451f, 0.400146f, 0.412354f, 0.424805f, 0.436768f, 0.449219f, - 0.461914f, 0.475098f, 0.487061f, 0.500000f, 0.512695f, 0.525391f, 0.538574f, 0.551758f, - 0.564453f, 0.577148f, 0.590820f, 0.604004f, 0.618164f, 0.631348f, 0.644531f, 0.658203f, - 0.672363f, 0.686523f, 0.812500f, 0.786621f, 0.767090f, 0.750977f, 0.736816f, 0.724609f, - 0.004425f, 0.013405f, 0.022385f, 0.032043f, 0.041565f, 0.051605f, 0.061340f, 0.071106f, - 0.081116f, 0.091125f, 0.101868f, 0.112671f, 0.123169f, 0.133667f, 0.144897f, 0.155029f, - 0.166748f, 0.177246f, 0.188599f, 0.199585f, 0.211182f, 0.222046f, 0.233643f, 0.245361f, - 0.255615f, 0.268066f, 0.279053f, 0.291260f, 0.303223f, 0.314209f, 0.325684f, 0.338379f, - 0.349854f, 0.361572f, 0.374023f, 0.385254f, 0.397949f, 0.409912f, 0.421143f, 0.434082f, - 0.445801f, 0.457764f, 0.470215f, 0.482910f, 0.495361f, 0.508301f, 0.520996f, 0.534180f, - 0.546387f, 0.560059f, 0.572266f, 0.584961f, 0.597168f, 0.610840f, 0.624023f, 0.638184f, - 0.650879f, 0.666016f, 0.801270f, 0.778320f, 0.760254f, 0.744141f, 0.730469f, 0.719238f, - 0.004261f, 0.012543f, 0.021591f, 0.031052f, 0.039734f, 0.049164f, 0.058838f, 0.068420f, - 0.077881f, 0.087402f, 0.098145f, 0.108276f, 0.118225f, 0.128784f, 0.138550f, 0.149292f, - 0.159790f, 0.170654f, 0.181519f, 0.191772f, 0.203003f, 0.213623f, 0.225098f, 0.235107f, - 0.247070f, 0.257324f, 0.269287f, 0.280273f, 0.291260f, 0.302246f, 0.313721f, 0.325439f, - 0.336670f, 0.348145f, 0.359619f, 0.371338f, 0.382812f, 0.395020f, 0.406738f, 0.418213f, - 0.429932f, 0.442139f, 0.454102f, 0.466309f, 0.479004f, 0.490723f, 0.502930f, 0.515625f, - 0.526855f, 0.540527f, 0.552246f, 0.565918f, 0.578613f, 0.591309f, 0.604492f, 0.617188f, - 0.630859f, 0.644043f, 0.790039f, 0.769531f, 0.751953f, 0.737305f, 0.724121f, 0.713379f, - 0.003983f, 0.012329f, 0.020538f, 0.029312f, 0.038452f, 0.047241f, 0.056244f, 0.065552f, - 0.075195f, 0.084290f, 0.094238f, 0.103638f, 0.113403f, 0.123413f, 0.133057f, 0.143066f, - 0.153076f, 0.163696f, 0.173584f, 0.184204f, 0.194580f, 0.204834f, 0.215332f, 0.225952f, - 0.237305f, 0.247803f, 0.258545f, 0.269531f, 0.280518f, 0.291260f, 0.301758f, 0.312988f, - 0.324219f, 0.335205f, 0.346191f, 0.357178f, 0.368896f, 0.380127f, 0.391113f, 0.403076f, - 0.414551f, 0.426270f, 0.437500f, 0.449951f, 0.460938f, 0.473389f, 0.485596f, 0.497314f, - 0.509277f, 0.522461f, 0.533691f, 0.546875f, 0.558594f, 0.571289f, 0.583496f, 0.596680f, - 0.608887f, 0.623047f, 0.778809f, 0.761230f, 0.744141f, 0.730957f, 0.718262f, 0.707031f, - 0.003717f, 0.012016f, 0.020142f, 0.028137f, 0.036682f, 0.045441f, 0.053711f, 0.062927f, - 0.071777f, 0.080627f, 0.090210f, 0.099060f, 0.108643f, 0.118164f, 0.127808f, 0.137329f, - 0.147095f, 0.156128f, 0.166748f, 0.175903f, 0.186157f, 0.196655f, 0.206909f, 0.216797f, - 0.227417f, 0.236816f, 0.247559f, 0.258301f, 0.268799f, 0.278809f, 0.289795f, 0.299805f, - 0.310547f, 0.321777f, 0.333008f, 0.343262f, 0.354492f, 0.365234f, 0.376953f, 0.387939f, - 0.398438f, 0.410400f, 0.421387f, 0.433105f, 0.444824f, 0.455811f, 0.467529f, 0.479736f, - 0.491943f, 0.502930f, 0.515625f, 0.527344f, 0.540039f, 0.551758f, 0.563965f, 0.576660f, - 0.589844f, 0.602539f, 0.767578f, 0.751465f, 0.736328f, 0.723633f, 0.711914f, 0.701660f, - 0.003813f, 0.011337f, 0.019028f, 0.027252f, 0.035583f, 0.043396f, 0.051849f, 0.060028f, - 0.068481f, 0.077026f, 0.086121f, 0.095093f, 0.103821f, 0.112610f, 0.121765f, 0.131470f, - 0.140503f, 0.149780f, 0.159058f, 0.168701f, 0.178711f, 0.187744f, 0.197998f, 0.207397f, - 0.217651f, 0.227661f, 0.236694f, 0.246704f, 0.257080f, 0.267334f, 0.277832f, 0.288330f, - 0.298584f, 0.308838f, 0.319336f, 0.329590f, 0.340332f, 0.351318f, 0.361816f, 0.372559f, - 0.383301f, 0.395020f, 0.405273f, 0.416260f, 0.427734f, 0.439209f, 0.450195f, 0.462158f, - 0.473389f, 0.485107f, 0.497314f, 0.508301f, 0.520996f, 0.533203f, 0.544922f, 0.557617f, - 0.568848f, 0.582031f, 0.757324f, 0.742676f, 0.729004f, 0.716309f, 0.705566f, 0.695801f, - 0.003633f, 0.011040f, 0.018280f, 0.026062f, 0.033569f, 0.041229f, 0.049591f, 0.057373f, - 0.065308f, 0.073975f, 0.082214f, 0.090393f, 0.099243f, 0.107544f, 0.116028f, 0.125854f, - 0.134155f, 0.143311f, 0.151978f, 0.160767f, 0.170410f, 0.179321f, 0.188477f, 0.198242f, - 0.207764f, 0.217896f, 0.227051f, 0.236328f, 0.246338f, 0.256104f, 0.265869f, 0.276123f, - 0.285645f, 0.295898f, 0.306152f, 0.316162f, 0.326172f, 0.336914f, 0.347412f, 0.358154f, - 0.368164f, 0.378906f, 0.389648f, 0.400146f, 0.410889f, 0.421631f, 0.432861f, 0.444824f, - 0.456055f, 0.466797f, 0.479004f, 0.490234f, 0.501465f, 0.514160f, 0.525879f, 0.537598f, - 0.549316f, 0.561523f, 0.745605f, 0.733887f, 0.721191f, 0.708496f, 0.699219f, 0.689453f, - 0.003469f, 0.010429f, 0.017609f, 0.024612f, 0.032135f, 0.039520f, 0.047516f, 0.055206f, - 0.062347f, 0.070618f, 0.078308f, 0.085938f, 0.094727f, 0.102417f, 0.111511f, 0.119446f, - 0.127441f, 0.136475f, 0.144897f, 0.154175f, 0.162476f, 0.171509f, 0.180054f, 0.189697f, - 0.198486f, 0.207886f, 0.216553f, 0.225830f, 0.235229f, 0.244873f, 0.254395f, 0.263428f, - 0.273193f, 0.283203f, 0.292969f, 0.302734f, 0.312744f, 0.322510f, 0.333008f, 0.342773f, - 0.353027f, 0.363037f, 0.374023f, 0.384521f, 0.395264f, 0.405762f, 0.416260f, 0.427002f, - 0.438232f, 0.449219f, 0.460449f, 0.471924f, 0.482910f, 0.494629f, 0.506348f, 0.517578f, - 0.529785f, 0.541504f, 0.734375f, 0.725098f, 0.712891f, 0.701660f, 0.692383f, 0.683594f, - 0.003328f, 0.009804f, 0.016373f, 0.023727f, 0.030746f, 0.037994f, 0.044952f, 0.052032f, - 0.059998f, 0.067383f, 0.074707f, 0.082214f, 0.089783f, 0.097961f, 0.105774f, 0.114197f, - 0.122131f, 0.129517f, 0.137695f, 0.146118f, 0.154419f, 0.163330f, 0.171997f, 0.180664f, - 0.188477f, 0.197388f, 0.206055f, 0.215332f, 0.224365f, 0.233765f, 0.242798f, 0.251709f, - 0.260986f, 0.270020f, 0.279785f, 0.289062f, 0.299561f, 0.308594f, 0.318115f, 0.328613f, - 0.338135f, 0.348877f, 0.358154f, 0.368408f, 0.378174f, 0.388916f, 0.399658f, 0.410156f, - 0.420898f, 0.431885f, 0.442871f, 0.453369f, 0.463867f, 0.475342f, 0.486572f, 0.498535f, - 0.510742f, 0.521973f, 0.723633f, 0.715820f, 0.705078f, 0.694336f, 0.686035f, 0.677246f, - 0.003090f, 0.009628f, 0.016129f, 0.022644f, 0.029068f, 0.036407f, 0.042633f, 0.049866f, - 0.056946f, 0.063904f, 0.071167f, 0.078186f, 0.085327f, 0.092896f, 0.100098f, 0.107788f, - 0.115662f, 0.123230f, 0.131104f, 0.139160f, 0.146973f, 0.154907f, 0.162964f, 0.171265f, - 0.179565f, 0.188110f, 0.196777f, 0.204834f, 0.213745f, 0.222168f, 0.231079f, 0.239868f, - 0.248779f, 0.258057f, 0.267090f, 0.276611f, 0.285645f, 0.294434f, 0.304688f, 0.314209f, - 0.323242f, 0.332520f, 0.342773f, 0.353027f, 0.362549f, 0.373047f, 0.383057f, 0.393311f, - 0.404053f, 0.414307f, 0.424561f, 0.435059f, 0.445801f, 0.456787f, 0.467773f, 0.479004f, - 0.490479f, 0.501953f, 0.712891f, 0.707031f, 0.696777f, 0.687500f, 0.679199f, 0.671387f, - 0.003096f, 0.009026f, 0.015450f, 0.021606f, 0.027695f, 0.034302f, 0.040833f, 0.047455f, - 0.054077f, 0.060669f, 0.067444f, 0.074097f, 0.081604f, 0.088501f, 0.095337f, 0.102295f, - 0.109375f, 0.116821f, 0.124146f, 0.131592f, 0.139404f, 0.147217f, 0.155029f, 0.162231f, - 0.170288f, 0.177979f, 0.186646f, 0.194092f, 0.203247f, 0.211670f, 0.219604f, 0.228149f, - 0.236816f, 0.245605f, 0.254639f, 0.263184f, 0.272217f, 0.281250f, 0.290527f, 0.299805f, - 0.308838f, 0.318604f, 0.327637f, 0.337646f, 0.347900f, 0.356934f, 0.367432f, 0.376953f, - 0.387451f, 0.397217f, 0.407227f, 0.417480f, 0.427979f, 0.439209f, 0.449463f, 0.459717f, - 0.470947f, 0.482666f, 0.701172f, 0.698242f, 0.688477f, 0.680176f, 0.671875f, 0.665039f, - 0.002831f, 0.008789f, 0.014702f, 0.020523f, 0.026642f, 0.032684f, 0.038757f, 0.044708f, - 0.051666f, 0.057312f, 0.063660f, 0.070190f, 0.076904f, 0.083435f, 0.090454f, 0.097046f, - 0.103821f, 0.110535f, 0.117981f, 0.124817f, 0.131714f, 0.138916f, 0.146606f, 0.153687f, - 0.161011f, 0.168823f, 0.176270f, 0.184570f, 0.192139f, 0.200317f, 0.208008f, 0.216309f, - 0.224609f, 0.233032f, 0.241821f, 0.250244f, 0.258789f, 0.268066f, 0.276611f, 0.285400f, - 0.294678f, 0.303223f, 0.312500f, 0.322021f, 0.331787f, 0.340088f, 0.350830f, 0.360596f, - 0.369385f, 0.380371f, 0.389893f, 0.399658f, 0.410645f, 0.420654f, 0.430908f, 0.442383f, - 0.452148f, 0.464111f, 0.690430f, 0.688965f, 0.681152f, 0.672852f, 0.665039f, 0.658691f, - 0.002712f, 0.008553f, 0.013878f, 0.019638f, 0.025360f, 0.030716f, 0.037231f, 0.042633f, - 0.048615f, 0.054810f, 0.060638f, 0.066650f, 0.072205f, 0.078796f, 0.085083f, 0.091492f, - 0.097961f, 0.104065f, 0.110718f, 0.117859f, 0.124207f, 0.130981f, 0.138550f, 0.145142f, - 0.152588f, 0.160156f, 0.166992f, 0.174561f, 0.181885f, 0.189453f, 0.197754f, 0.205444f, - 0.213013f, 0.220825f, 0.229004f, 0.237061f, 0.246094f, 0.254639f, 0.262939f, 0.271484f, - 0.280273f, 0.288818f, 0.298584f, 0.307129f, 0.316162f, 0.325195f, 0.334229f, 0.344482f, - 0.353516f, 0.363525f, 0.372803f, 0.382812f, 0.392822f, 0.402344f, 0.412842f, 0.423096f, - 0.433350f, 0.444092f, 0.679199f, 0.679688f, 0.672852f, 0.665039f, 0.658203f, 0.651855f, - 0.002674f, 0.007828f, 0.013290f, 0.018723f, 0.023743f, 0.029160f, 0.034790f, 0.040100f, - 0.045929f, 0.051544f, 0.057068f, 0.063110f, 0.068359f, 0.074280f, 0.080078f, 0.086243f, - 0.092346f, 0.098206f, 0.104919f, 0.110779f, 0.117493f, 0.123291f, 0.130005f, 0.136963f, - 0.143677f, 0.150635f, 0.157471f, 0.164307f, 0.171631f, 0.179199f, 0.186279f, 0.193604f, - 0.201904f, 0.209229f, 0.217163f, 0.224976f, 0.233154f, 0.240967f, 0.249634f, 0.258301f, - 0.266113f, 0.274414f, 0.283691f, 0.291748f, 0.301025f, 0.310059f, 0.319336f, 0.327148f, - 0.337402f, 0.347168f, 0.355957f, 0.364746f, 0.375488f, 0.385498f, 0.394043f, 0.405273f, - 0.415283f, 0.426025f, 0.667969f, 0.670410f, 0.664551f, 0.657227f, 0.651367f, 0.645508f, - 0.002731f, 0.007622f, 0.012627f, 0.017868f, 0.022781f, 0.028107f, 0.032959f, 0.037811f, - 0.043121f, 0.048615f, 0.053925f, 0.059235f, 0.064514f, 0.070007f, 0.075562f, 0.080688f, - 0.086914f, 0.092102f, 0.098083f, 0.104309f, 0.110107f, 0.115906f, 0.122314f, 0.128540f, - 0.135010f, 0.141479f, 0.147949f, 0.154663f, 0.161865f, 0.168579f, 0.175415f, 0.182739f, - 0.191040f, 0.197510f, 0.205200f, 0.212891f, 0.219971f, 0.228638f, 0.236328f, 0.244263f, - 0.252686f, 0.260498f, 0.268799f, 0.278076f, 0.286133f, 0.294434f, 0.303223f, 0.312500f, - 0.320801f, 0.329834f, 0.339844f, 0.347656f, 0.357910f, 0.367676f, 0.376709f, 0.386963f, - 0.396729f, 0.406982f, 0.656738f, 0.662598f, 0.656738f, 0.649902f, 0.644531f, 0.638672f, - 0.002411f, 0.007168f, 0.012238f, 0.016739f, 0.021957f, 0.026184f, 0.031311f, 0.035583f, - 0.041016f, 0.045685f, 0.050568f, 0.055573f, 0.060791f, 0.065735f, 0.070557f, 0.076111f, - 0.081238f, 0.086792f, 0.092163f, 0.097534f, 0.103271f, 0.108887f, 0.114563f, 0.120605f, - 0.126587f, 0.132446f, 0.139038f, 0.145508f, 0.152100f, 0.158447f, 0.165527f, 0.171997f, - 0.178833f, 0.186035f, 0.193481f, 0.200928f, 0.207886f, 0.215820f, 0.222900f, 0.230713f, - 0.238770f, 0.246948f, 0.255127f, 0.262695f, 0.271484f, 0.280029f, 0.287842f, 0.296631f, - 0.305420f, 0.313965f, 0.322754f, 0.331787f, 0.340576f, 0.350342f, 0.359375f, 0.369385f, - 0.379150f, 0.388184f, 0.645508f, 0.652832f, 0.648438f, 0.643066f, 0.637695f, 0.632324f, - 0.002480f, 0.006691f, 0.011452f, 0.015900f, 0.020828f, 0.024734f, 0.029327f, 0.033752f, - 0.038513f, 0.042999f, 0.047638f, 0.052429f, 0.056671f, 0.061859f, 0.066040f, 0.071289f, - 0.075684f, 0.080688f, 0.086243f, 0.091248f, 0.096436f, 0.101562f, 0.107300f, 0.112366f, - 0.118347f, 0.124146f, 0.130249f, 0.135864f, 0.141968f, 0.148438f, 0.155029f, 0.161377f, - 0.167969f, 0.174683f, 0.181641f, 0.188599f, 0.195679f, 0.203247f, 0.210449f, 0.217529f, - 0.225342f, 0.233398f, 0.241577f, 0.249023f, 0.256592f, 0.264893f, 0.273193f, 0.281494f, - 0.289795f, 0.297607f, 0.306885f, 0.315430f, 0.323730f, 0.333496f, 0.342529f, 0.351318f, - 0.360840f, 0.370605f, 0.634766f, 0.643555f, 0.640625f, 0.635742f, 0.630859f, 0.625488f, - 0.002230f, 0.006477f, 0.010582f, 0.014870f, 0.019073f, 0.023270f, 0.027893f, 0.031860f, - 0.036072f, 0.040253f, 0.044373f, 0.048706f, 0.052856f, 0.057312f, 0.061859f, 0.066406f, - 0.070984f, 0.075317f, 0.080139f, 0.084839f, 0.089661f, 0.094910f, 0.099792f, 0.104858f, - 0.110718f, 0.115356f, 0.121399f, 0.126831f, 0.132690f, 0.138672f, 0.145142f, 0.151001f, - 0.157471f, 0.164185f, 0.170532f, 0.177002f, 0.184082f, 0.191040f, 0.197876f, 0.205200f, - 0.212402f, 0.219604f, 0.227295f, 0.234985f, 0.242188f, 0.250244f, 0.257812f, 0.266113f, - 0.274170f, 0.282471f, 0.290771f, 0.299072f, 0.307373f, 0.316162f, 0.326416f, 0.333984f, - 0.343750f, 0.353271f, 0.622070f, 0.634277f, 0.631836f, 0.627930f, 0.623535f, 0.619141f, - 0.002220f, 0.006039f, 0.010353f, 0.014328f, 0.017838f, 0.022141f, 0.025742f, 0.029510f, - 0.033600f, 0.037781f, 0.041443f, 0.045502f, 0.049469f, 0.053436f, 0.057190f, 0.061462f, - 0.065735f, 0.069946f, 0.074524f, 0.078674f, 0.083069f, 0.087830f, 0.092468f, 0.097412f, - 0.102783f, 0.107910f, 0.112793f, 0.118164f, 0.123901f, 0.129395f, 0.135132f, 0.140991f, - 0.147339f, 0.152954f, 0.159302f, 0.165527f, 0.172363f, 0.178589f, 0.185425f, 0.191895f, - 0.199219f, 0.206665f, 0.213989f, 0.221069f, 0.228516f, 0.236206f, 0.243042f, 0.251709f, - 0.258789f, 0.266846f, 0.275146f, 0.283203f, 0.291260f, 0.300537f, 0.308350f, 0.317627f, - 0.326904f, 0.335938f, 0.611816f, 0.625000f, 0.624023f, 0.620117f, 0.616211f, 0.612793f, - 0.001965f, 0.005882f, 0.009613f, 0.013184f, 0.016785f, 0.020370f, 0.024384f, 0.027664f, - 0.031311f, 0.035126f, 0.038727f, 0.042572f, 0.046112f, 0.049347f, 0.053253f, 0.056915f, - 0.060883f, 0.064697f, 0.068909f, 0.072693f, 0.076843f, 0.081055f, 0.085754f, 0.090088f, - 0.094849f, 0.099609f, 0.104614f, 0.109741f, 0.114746f, 0.119995f, 0.125488f, 0.130981f, - 0.136719f, 0.142700f, 0.148315f, 0.154541f, 0.160522f, 0.166870f, 0.173828f, 0.179932f, - 0.186768f, 0.193604f, 0.200439f, 0.207764f, 0.214844f, 0.221802f, 0.228882f, 0.236328f, - 0.244385f, 0.252197f, 0.259277f, 0.268066f, 0.275635f, 0.283447f, 0.292236f, 0.301270f, - 0.309570f, 0.318848f, 0.600098f, 0.616211f, 0.615234f, 0.612793f, 0.609375f, 0.605469f, - 0.001966f, 0.005653f, 0.009109f, 0.012428f, 0.015945f, 0.018967f, 0.022537f, 0.025894f, - 0.029175f, 0.032440f, 0.035797f, 0.038818f, 0.042389f, 0.046051f, 0.049072f, 0.052521f, - 0.056335f, 0.059906f, 0.063293f, 0.067017f, 0.070923f, 0.075134f, 0.078979f, 0.083496f, - 0.087646f, 0.091980f, 0.096619f, 0.101196f, 0.105957f, 0.111145f, 0.116028f, 0.121277f, - 0.126831f, 0.132080f, 0.137817f, 0.143311f, 0.149780f, 0.155029f, 0.161621f, 0.167847f, - 0.173950f, 0.180786f, 0.187622f, 0.194214f, 0.201050f, 0.207764f, 0.215210f, 0.222046f, - 0.229370f, 0.236816f, 0.244751f, 0.251953f, 0.260010f, 0.268311f, 0.276123f, 0.284180f, - 0.293213f, 0.301514f, 0.588379f, 0.606934f, 0.607422f, 0.604980f, 0.602051f, 0.599609f, - 0.001963f, 0.005333f, 0.008377f, 0.011589f, 0.014450f, 0.017593f, 0.021133f, 0.023972f, - 0.027145f, 0.030075f, 0.033295f, 0.035858f, 0.038818f, 0.041992f, 0.045288f, 0.048279f, - 0.051849f, 0.054840f, 0.058289f, 0.061737f, 0.065186f, 0.068848f, 0.072632f, 0.076721f, - 0.080505f, 0.084717f, 0.088806f, 0.093079f, 0.097717f, 0.102356f, 0.106934f, 0.111755f, - 0.116882f, 0.121887f, 0.127319f, 0.132935f, 0.138306f, 0.144287f, 0.149902f, 0.156250f, - 0.162109f, 0.168579f, 0.174316f, 0.180908f, 0.187500f, 0.194458f, 0.201538f, 0.208252f, - 0.215210f, 0.222656f, 0.229980f, 0.237061f, 0.244629f, 0.252441f, 0.260254f, 0.267334f, - 0.276123f, 0.284180f, 0.576660f, 0.597656f, 0.599609f, 0.598145f, 0.595215f, 0.591797f, - 0.001631f, 0.004906f, 0.007805f, 0.010826f, 0.013802f, 0.016983f, 0.019485f, 0.022079f, - 0.024750f, 0.027939f, 0.030136f, 0.033112f, 0.035797f, 0.038727f, 0.041443f, 0.044281f, - 0.047058f, 0.050018f, 0.053253f, 0.056396f, 0.059662f, 0.063049f, 0.066406f, 0.069946f, - 0.073730f, 0.077454f, 0.081360f, 0.085388f, 0.089417f, 0.093750f, 0.098267f, 0.102844f, - 0.107727f, 0.112244f, 0.117615f, 0.122253f, 0.127441f, 0.133057f, 0.138550f, 0.144287f, - 0.150024f, 0.156250f, 0.161987f, 0.167969f, 0.174805f, 0.181274f, 0.187744f, 0.194580f, - 0.201294f, 0.208374f, 0.215210f, 0.222412f, 0.229736f, 0.237183f, 0.244629f, 0.252197f, - 0.260010f, 0.269287f, 0.566406f, 0.588867f, 0.590820f, 0.590332f, 0.587891f, 0.585938f, - 0.001858f, 0.004318f, 0.007465f, 0.010246f, 0.012550f, 0.015793f, 0.018143f, 0.020782f, - 0.022980f, 0.025116f, 0.027924f, 0.030106f, 0.032623f, 0.035126f, 0.037720f, 0.040283f, - 0.042847f, 0.045380f, 0.048492f, 0.051300f, 0.054321f, 0.057373f, 0.060516f, 0.063599f, - 0.067139f, 0.070496f, 0.074219f, 0.078003f, 0.081848f, 0.085754f, 0.089783f, 0.093994f, - 0.098267f, 0.102783f, 0.107239f, 0.112366f, 0.117371f, 0.122498f, 0.127686f, 0.132935f, - 0.138428f, 0.144043f, 0.150024f, 0.155884f, 0.161865f, 0.168091f, 0.174316f, 0.180664f, - 0.187622f, 0.194214f, 0.200928f, 0.207520f, 0.214966f, 0.221680f, 0.229370f, 0.236816f, - 0.244751f, 0.252441f, 0.553223f, 0.579102f, 0.583496f, 0.582031f, 0.581055f, 0.579590f, - 0.001425f, 0.004284f, 0.007019f, 0.009521f, 0.011894f, 0.014191f, 0.016632f, 0.018723f, - 0.021210f, 0.023209f, 0.025482f, 0.027344f, 0.029617f, 0.032043f, 0.034210f, 0.036407f, - 0.039001f, 0.041077f, 0.043976f, 0.046448f, 0.049133f, 0.051819f, 0.054932f, 0.057770f, - 0.060730f, 0.063965f, 0.067322f, 0.070862f, 0.074280f, 0.077698f, 0.082031f, 0.085571f, - 0.089844f, 0.093994f, 0.098022f, 0.102722f, 0.107178f, 0.111877f, 0.116821f, 0.121887f, - 0.127075f, 0.132446f, 0.138062f, 0.143799f, 0.149414f, 0.155518f, 0.161377f, 0.167480f, - 0.173950f, 0.180176f, 0.186890f, 0.193481f, 0.200562f, 0.207397f, 0.214355f, 0.221313f, - 0.229492f, 0.237427f, 0.541504f, 0.570801f, 0.575195f, 0.575195f, 0.573730f, 0.572266f, - 0.001613f, 0.004181f, 0.006252f, 0.008774f, 0.011108f, 0.013054f, 0.015152f, 0.016937f, - 0.019150f, 0.021011f, 0.023163f, 0.024826f, 0.026993f, 0.028793f, 0.030823f, 0.033081f, - 0.035156f, 0.037201f, 0.039612f, 0.041748f, 0.044464f, 0.046814f, 0.049438f, 0.052155f, - 0.054840f, 0.057831f, 0.060699f, 0.063599f, 0.067078f, 0.070374f, 0.073853f, 0.077087f, - 0.081177f, 0.085083f, 0.089111f, 0.093262f, 0.097473f, 0.101929f, 0.106689f, 0.111023f, - 0.116455f, 0.121277f, 0.126343f, 0.132080f, 0.137573f, 0.142700f, 0.148682f, 0.154907f, - 0.161133f, 0.167236f, 0.173340f, 0.179688f, 0.186768f, 0.193115f, 0.200684f, 0.207275f, - 0.214233f, 0.221924f, 0.530273f, 0.561523f, 0.565430f, 0.567383f, 0.564941f, 0.564941f, - 0.001237f, 0.003775f, 0.006348f, 0.008141f, 0.010117f, 0.012184f, 0.013763f, 0.015656f, - 0.017319f, 0.018967f, 0.020645f, 0.022507f, 0.023926f, 0.025757f, 0.027573f, 0.029449f, - 0.031677f, 0.033325f, 0.035645f, 0.037659f, 0.039734f, 0.041809f, 0.044189f, 0.046692f, - 0.049133f, 0.051697f, 0.054504f, 0.057251f, 0.060059f, 0.063110f, 0.066467f, 0.069763f, - 0.072937f, 0.076477f, 0.080505f, 0.084290f, 0.088013f, 0.092407f, 0.096436f, 0.101013f, - 0.105713f, 0.110352f, 0.115356f, 0.120605f, 0.125488f, 0.130981f, 0.136353f, 0.142090f, - 0.148438f, 0.153931f, 0.159912f, 0.166260f, 0.172485f, 0.179321f, 0.185791f, 0.193115f, - 0.199463f, 0.206665f, 0.520020f, 0.552246f, 0.558105f, 0.559570f, 0.559082f, 0.557617f, - 0.001151f, 0.003399f, 0.005611f, 0.007439f, 0.009354f, 0.010925f, 0.012489f, 0.014061f, - 0.015610f, 0.017258f, 0.018845f, 0.020248f, 0.021484f, 0.023193f, 0.024796f, 0.026459f, - 0.028183f, 0.029785f, 0.031738f, 0.033386f, 0.035309f, 0.037384f, 0.039368f, 0.041626f, - 0.043701f, 0.046204f, 0.048553f, 0.051178f, 0.053955f, 0.056488f, 0.059418f, 0.062256f, - 0.065308f, 0.068542f, 0.071899f, 0.075623f, 0.079224f, 0.082947f, 0.087097f, 0.091064f, - 0.095520f, 0.099854f, 0.104736f, 0.109314f, 0.114136f, 0.119324f, 0.124756f, 0.130127f, - 0.135498f, 0.141113f, 0.146973f, 0.153198f, 0.159180f, 0.165527f, 0.172241f, 0.178711f, - 0.185425f, 0.192749f, 0.507324f, 0.543945f, 0.549316f, 0.552246f, 0.551270f, 0.551270f, - 0.001070f, 0.002996f, 0.004986f, 0.006851f, 0.008514f, 0.009850f, 0.011330f, 0.012596f, - 0.014015f, 0.015259f, 0.016586f, 0.017731f, 0.019287f, 0.020676f, 0.022079f, 0.023468f, - 0.024765f, 0.026489f, 0.028030f, 0.029465f, 0.031311f, 0.032898f, 0.034851f, 0.036743f, - 0.038940f, 0.040833f, 0.043091f, 0.045074f, 0.047729f, 0.050079f, 0.052673f, 0.055389f, - 0.058136f, 0.061188f, 0.064087f, 0.067261f, 0.070618f, 0.074158f, 0.077942f, 0.081726f, - 0.085815f, 0.089783f, 0.094055f, 0.098572f, 0.103088f, 0.107971f, 0.113037f, 0.118164f, - 0.123413f, 0.128784f, 0.134521f, 0.140137f, 0.146118f, 0.152100f, 0.158325f, 0.164307f, - 0.171387f, 0.177368f, 0.496094f, 0.534668f, 0.541992f, 0.543945f, 0.544434f, 0.544434f, - 0.001086f, 0.003069f, 0.004463f, 0.006256f, 0.007393f, 0.009026f, 0.010178f, 0.011276f, - 0.012260f, 0.013542f, 0.014648f, 0.015808f, 0.016861f, 0.017899f, 0.019333f, 0.020599f, - 0.021942f, 0.023117f, 0.024384f, 0.025833f, 0.027344f, 0.028992f, 0.030579f, 0.032318f, - 0.034149f, 0.035828f, 0.037842f, 0.039764f, 0.041901f, 0.044037f, 0.046539f, 0.048645f, - 0.051147f, 0.053894f, 0.056641f, 0.059631f, 0.062500f, 0.065735f, 0.069031f, 0.072754f, - 0.076294f, 0.080139f, 0.083984f, 0.088379f, 0.092712f, 0.097229f, 0.101929f, 0.106873f, - 0.111694f, 0.117004f, 0.122314f, 0.127930f, 0.133789f, 0.139282f, 0.145142f, 0.151367f, - 0.157349f, 0.163818f, 0.484619f, 0.525391f, 0.534180f, 0.536621f, 0.536133f, 0.536621f, - 0.001125f, 0.002892f, 0.003883f, 0.005867f, 0.006603f, 0.007935f, 0.009026f, 0.009911f, - 0.010956f, 0.012077f, 0.012909f, 0.013901f, 0.014977f, 0.015671f, 0.016983f, 0.018021f, - 0.019058f, 0.020279f, 0.021225f, 0.022598f, 0.023941f, 0.025299f, 0.026535f, 0.028107f, - 0.029755f, 0.031113f, 0.033020f, 0.034668f, 0.036682f, 0.038483f, 0.040527f, 0.042511f, - 0.044708f, 0.046936f, 0.049744f, 0.052216f, 0.054840f, 0.057800f, 0.060791f, 0.064087f, - 0.067505f, 0.071045f, 0.074463f, 0.078491f, 0.082397f, 0.086609f, 0.091248f, 0.095581f, - 0.100342f, 0.105530f, 0.110474f, 0.116272f, 0.120972f, 0.126953f, 0.132812f, 0.138672f, - 0.144287f, 0.150513f, 0.472412f, 0.516113f, 0.524902f, 0.528809f, 0.529785f, 0.529785f, - 0.000859f, 0.002470f, 0.003815f, 0.005226f, 0.005913f, 0.007206f, 0.007942f, 0.008652f, - 0.009583f, 0.010406f, 0.011223f, 0.011971f, 0.012856f, 0.013664f, 0.014664f, 0.015549f, - 0.016464f, 0.017487f, 0.018478f, 0.019592f, 0.020767f, 0.021774f, 0.023117f, 0.024338f, - 0.025604f, 0.027008f, 0.028519f, 0.029953f, 0.031525f, 0.033173f, 0.034943f, 0.036865f, - 0.038696f, 0.040863f, 0.042969f, 0.045471f, 0.048004f, 0.050293f, 0.052979f, 0.055847f, - 0.058960f, 0.062042f, 0.065491f, 0.069153f, 0.072937f, 0.076660f, 0.080750f, 0.085144f, - 0.089539f, 0.094177f, 0.099304f, 0.104187f, 0.109741f, 0.114807f, 0.120483f, 0.125977f, - 0.131836f, 0.138306f, 0.460449f, 0.507812f, 0.516602f, 0.520020f, 0.522461f, 0.522949f, - 0.000906f, 0.002359f, 0.003643f, 0.004356f, 0.005310f, 0.005989f, 0.007030f, 0.007507f, - 0.008255f, 0.009010f, 0.009834f, 0.010483f, 0.011230f, 0.011887f, 0.012573f, 0.013367f, - 0.014252f, 0.014954f, 0.015900f, 0.016785f, 0.017776f, 0.018631f, 0.019775f, 0.020874f, - 0.022110f, 0.023117f, 0.024368f, 0.025589f, 0.026932f, 0.028549f, 0.029938f, 0.031525f, - 0.033325f, 0.035187f, 0.037109f, 0.038971f, 0.041138f, 0.043396f, 0.045715f, 0.048370f, - 0.051025f, 0.053772f, 0.057129f, 0.060089f, 0.063416f, 0.067261f, 0.070679f, 0.075012f, - 0.079285f, 0.083618f, 0.088379f, 0.093018f, 0.098083f, 0.102478f, 0.108093f, 0.114380f, - 0.119507f, 0.125488f, 0.448975f, 0.498291f, 0.508789f, 0.513672f, 0.514648f, 0.516113f, - 0.000728f, 0.001932f, 0.003067f, 0.003990f, 0.004784f, 0.005295f, 0.005974f, 0.006584f, - 0.007099f, 0.007652f, 0.008255f, 0.008904f, 0.009491f, 0.010109f, 0.010658f, 0.011497f, - 0.012131f, 0.012718f, 0.013535f, 0.014336f, 0.015083f, 0.016083f, 0.016785f, 0.017761f, - 0.018738f, 0.019669f, 0.020691f, 0.021805f, 0.023010f, 0.024170f, 0.025467f, 0.026794f, - 0.028336f, 0.029922f, 0.031555f, 0.033203f, 0.035034f, 0.036987f, 0.039062f, 0.041290f, - 0.043671f, 0.046143f, 0.048920f, 0.051880f, 0.054901f, 0.058228f, 0.061615f, 0.065369f, - 0.069214f, 0.073425f, 0.077637f, 0.082214f, 0.087097f, 0.091797f, 0.096497f, 0.102356f, - 0.107483f, 0.113464f, 0.437256f, 0.489746f, 0.500977f, 0.504883f, 0.507812f, 0.509277f, - 0.000724f, 0.001842f, 0.002728f, 0.003332f, 0.004101f, 0.004707f, 0.005020f, 0.005497f, - 0.006245f, 0.006603f, 0.007027f, 0.007515f, 0.008156f, 0.008537f, 0.009125f, 0.009659f, - 0.010101f, 0.010864f, 0.011482f, 0.012070f, 0.012756f, 0.013496f, 0.014236f, 0.014931f, - 0.015808f, 0.016632f, 0.017487f, 0.018433f, 0.019379f, 0.020416f, 0.021530f, 0.022583f, - 0.023804f, 0.024979f, 0.026443f, 0.027939f, 0.029526f, 0.031235f, 0.033020f, 0.035004f, - 0.037018f, 0.039185f, 0.041595f, 0.044159f, 0.046783f, 0.049866f, 0.052856f, 0.056274f, - 0.059906f, 0.063721f, 0.067749f, 0.072327f, 0.076172f, 0.081299f, 0.085938f, 0.091309f, - 0.096558f, 0.101807f, 0.426270f, 0.480469f, 0.492676f, 0.498047f, 0.500488f, 0.501953f, - 0.000673f, 0.001715f, 0.002426f, 0.002953f, 0.003588f, 0.003944f, 0.004200f, 0.004776f, - 0.005131f, 0.005527f, 0.005886f, 0.006371f, 0.006790f, 0.007076f, 0.007538f, 0.008133f, - 0.008644f, 0.009140f, 0.009483f, 0.010071f, 0.010689f, 0.011230f, 0.011879f, 0.012474f, - 0.013222f, 0.013916f, 0.014587f, 0.015411f, 0.016190f, 0.016983f, 0.017883f, 0.018845f, - 0.019867f, 0.020935f, 0.022141f, 0.023270f, 0.024567f, 0.026001f, 0.027481f, 0.029114f, - 0.030777f, 0.032684f, 0.034698f, 0.036865f, 0.039337f, 0.041748f, 0.044647f, 0.047882f, - 0.050964f, 0.054260f, 0.058258f, 0.062195f, 0.066528f, 0.070679f, 0.075623f, 0.080505f, - 0.085510f, 0.090515f, 0.414307f, 0.472168f, 0.484131f, 0.490234f, 0.492920f, 0.495850f, - 0.000484f, 0.001445f, 0.002169f, 0.002569f, 0.002836f, 0.003317f, 0.003569f, 0.003952f, - 0.004215f, 0.004623f, 0.004959f, 0.005306f, 0.005592f, 0.005951f, 0.006306f, 0.006737f, - 0.007004f, 0.007492f, 0.007942f, 0.008331f, 0.008865f, 0.009270f, 0.009781f, 0.010338f, - 0.010887f, 0.011429f, 0.012047f, 0.012726f, 0.013336f, 0.014030f, 0.014771f, 0.015572f, - 0.016418f, 0.017258f, 0.018234f, 0.019196f, 0.020279f, 0.021423f, 0.022675f, 0.023987f, - 0.025375f, 0.027039f, 0.028702f, 0.030563f, 0.032623f, 0.034698f, 0.037262f, 0.040039f, - 0.042664f, 0.046051f, 0.049194f, 0.052948f, 0.057129f, 0.061371f, 0.065613f, 0.070007f, - 0.075317f, 0.080200f, 0.402588f, 0.462402f, 0.476807f, 0.482666f, 0.485107f, 0.487061f, - 0.000459f, 0.001265f, 0.001572f, 0.002138f, 0.002365f, 0.002775f, 0.002920f, 0.003189f, - 0.003454f, 0.003723f, 0.003986f, 0.004250f, 0.004536f, 0.004906f, 0.005150f, 0.005463f, - 0.005787f, 0.006172f, 0.006481f, 0.006794f, 0.007156f, 0.007542f, 0.007980f, 0.008430f, - 0.008827f, 0.009361f, 0.009796f, 0.010300f, 0.010910f, 0.011497f, 0.012161f, 0.012672f, - 0.013336f, 0.014183f, 0.014893f, 0.015640f, 0.016541f, 0.017517f, 0.018448f, 0.019485f, - 0.020676f, 0.021912f, 0.023392f, 0.024979f, 0.026627f, 0.028351f, 0.030457f, 0.032806f, - 0.035034f, 0.037933f, 0.041229f, 0.044373f, 0.047821f, 0.052002f, 0.056244f, 0.060547f, - 0.065247f, 0.069885f, 0.390869f, 0.453857f, 0.468018f, 0.475098f, 0.478027f, 0.480469f, - 0.000332f, 0.001075f, 0.001464f, 0.001721f, 0.001911f, 0.002235f, 0.002375f, 0.002558f, - 0.002834f, 0.002998f, 0.003185f, 0.003441f, 0.003647f, 0.003952f, 0.004139f, 0.004421f, - 0.004631f, 0.004879f, 0.005180f, 0.005447f, 0.005795f, 0.006115f, 0.006416f, 0.006718f, - 0.007099f, 0.007462f, 0.007881f, 0.008331f, 0.008797f, 0.009140f, 0.009735f, 0.010223f, - 0.010803f, 0.011337f, 0.011986f, 0.012611f, 0.013283f, 0.014076f, 0.014847f, 0.015732f, - 0.016693f, 0.017700f, 0.018784f, 0.019897f, 0.021317f, 0.022873f, 0.024429f, 0.026306f, - 0.028473f, 0.030960f, 0.033600f, 0.036407f, 0.039856f, 0.043549f, 0.047119f, 0.051392f, - 0.055969f, 0.060394f, 0.379639f, 0.444580f, 0.458984f, 0.467529f, 0.470947f, 0.472900f, - 0.000408f, 0.000770f, 0.001271f, 0.001390f, 0.001601f, 0.001762f, 0.001848f, 0.002052f, - 0.002247f, 0.002401f, 0.002491f, 0.002684f, 0.002878f, 0.003086f, 0.003304f, 0.003452f, - 0.003626f, 0.003805f, 0.004074f, 0.004257f, 0.004513f, 0.004807f, 0.005039f, 0.005299f, - 0.005638f, 0.005905f, 0.006191f, 0.006516f, 0.006927f, 0.007206f, 0.007645f, 0.008034f, - 0.008415f, 0.008911f, 0.009384f, 0.009941f, 0.010483f, 0.011116f, 0.011711f, 0.012428f, - 0.013191f, 0.013969f, 0.014862f, 0.015854f, 0.016785f, 0.017975f, 0.019348f, 0.020721f, - 0.022461f, 0.024445f, 0.026733f, 0.029175f, 0.032227f, 0.035248f, 0.038788f, 0.042755f, - 0.046967f, 0.051636f, 0.367920f, 0.435059f, 0.452148f, 0.459229f, 0.463623f, 0.466797f, - 0.000382f, 0.000669f, 0.001037f, 0.001185f, 0.001293f, 0.001379f, 0.001470f, 0.001565f, - 0.001729f, 0.001864f, 0.001928f, 0.002138f, 0.002237f, 0.002398f, 0.002510f, 0.002672f, - 0.002802f, 0.002966f, 0.003134f, 0.003319f, 0.003517f, 0.003723f, 0.003870f, 0.004089f, - 0.004311f, 0.004532f, 0.004772f, 0.005013f, 0.005314f, 0.005573f, 0.005924f, 0.006203f, - 0.006523f, 0.006897f, 0.007240f, 0.007660f, 0.008041f, 0.008530f, 0.009048f, 0.009621f, - 0.010201f, 0.010841f, 0.011467f, 0.012192f, 0.013138f, 0.013969f, 0.014931f, 0.016113f, - 0.017380f, 0.018936f, 0.020630f, 0.022751f, 0.025208f, 0.027924f, 0.031311f, 0.034851f, - 0.038879f, 0.043274f, 0.356689f, 0.426270f, 0.443848f, 0.451660f, 0.456055f, 0.459473f, - 0.000482f, 0.000542f, 0.000723f, 0.000822f, 0.000881f, 0.001025f, 0.001100f, 0.001209f, - 0.001249f, 0.001355f, 0.001522f, 0.001599f, 0.001708f, 0.001836f, 0.001918f, 0.001970f, - 0.002129f, 0.002251f, 0.002357f, 0.002522f, 0.002636f, 0.002768f, 0.002911f, 0.003056f, - 0.003237f, 0.003393f, 0.003605f, 0.003771f, 0.003994f, 0.004234f, 0.004444f, 0.004635f, - 0.004932f, 0.005150f, 0.005486f, 0.005779f, 0.006081f, 0.006458f, 0.006775f, 0.007179f, - 0.007668f, 0.008110f, 0.008690f, 0.009209f, 0.009926f, 0.010551f, 0.011330f, 0.012184f, - 0.013184f, 0.014297f, 0.015610f, 0.017181f, 0.019165f, 0.021500f, 0.024384f, 0.027618f, - 0.031372f, 0.035614f, 0.345459f, 0.417236f, 0.435303f, 0.443604f, 0.448730f, 0.451904f, - 0.000240f, 0.000479f, 0.000533f, 0.000625f, 0.000716f, 0.000746f, 0.000857f, 0.000835f, - 0.000941f, 0.001024f, 0.001104f, 0.001155f, 0.001204f, 0.001282f, 0.001396f, 0.001453f, - 0.001554f, 0.001627f, 0.001737f, 0.001787f, 0.001894f, 0.002012f, 0.002119f, 0.002218f, - 0.002335f, 0.002453f, 0.002611f, 0.002714f, 0.002848f, 0.003050f, 0.003168f, 0.003395f, - 0.003529f, 0.003740f, 0.003963f, 0.004158f, 0.004429f, 0.004688f, 0.004982f, 0.005280f, - 0.005600f, 0.005959f, 0.006340f, 0.006775f, 0.007252f, 0.007748f, 0.008369f, 0.008980f, - 0.009705f, 0.010513f, 0.011513f, 0.012665f, 0.014069f, 0.015869f, 0.018158f, 0.020950f, - 0.024338f, 0.028366f, 0.335205f, 0.408203f, 0.427002f, 0.435547f, 0.441162f, 0.445312f, - 0.000138f, 0.000265f, 0.000381f, 0.000386f, 0.000465f, 0.000556f, 0.000558f, 0.000597f, - 0.000659f, 0.000748f, 0.000770f, 0.000786f, 0.000829f, 0.000904f, 0.000940f, 0.001021f, - 0.001043f, 0.001139f, 0.001201f, 0.001253f, 0.001327f, 0.001396f, 0.001481f, 0.001555f, - 0.001637f, 0.001712f, 0.001813f, 0.001899f, 0.002005f, 0.002140f, 0.002220f, 0.002348f, - 0.002462f, 0.002600f, 0.002733f, 0.002932f, 0.003075f, 0.003279f, 0.003452f, 0.003630f, - 0.003872f, 0.004166f, 0.004436f, 0.004742f, 0.005077f, 0.005459f, 0.005848f, 0.006310f, - 0.006874f, 0.007492f, 0.008171f, 0.009026f, 0.009995f, 0.011307f, 0.013008f, 0.015343f, - 0.018265f, 0.021881f, 0.323486f, 0.399170f, 0.418945f, 0.428467f, 0.434326f, 0.437988f, - 0.000165f, 0.000260f, 0.000287f, 0.000296f, 0.000331f, 0.000339f, 0.000360f, 0.000395f, - 0.000442f, 0.000482f, 0.000487f, 0.000551f, 0.000546f, 0.000611f, 0.000640f, 0.000667f, - 0.000711f, 0.000742f, 0.000775f, 0.000816f, 0.000876f, 0.000916f, 0.000974f, 0.001015f, - 0.001081f, 0.001123f, 0.001195f, 0.001267f, 0.001317f, 0.001388f, 0.001459f, 0.001558f, - 0.001630f, 0.001718f, 0.001804f, 0.001916f, 0.002033f, 0.002148f, 0.002295f, 0.002455f, - 0.002583f, 0.002754f, 0.002941f, 0.003134f, 0.003386f, 0.003639f, 0.003910f, 0.004215f, - 0.004597f, 0.005013f, 0.005520f, 0.006130f, 0.006821f, 0.007690f, 0.008789f, 0.010452f, - 0.012909f, 0.016174f, 0.312012f, 0.390381f, 0.410645f, 0.420654f, 0.426270f, 0.430664f, - 0.000057f, 0.000171f, 0.000164f, 0.000170f, 0.000211f, 0.000213f, 0.000229f, 0.000247f, - 0.000267f, 0.000279f, 0.000289f, 0.000317f, 0.000349f, 0.000364f, 0.000390f, 0.000407f, - 0.000427f, 0.000467f, 0.000476f, 0.000521f, 0.000537f, 0.000561f, 0.000578f, 0.000626f, - 0.000667f, 0.000714f, 0.000729f, 0.000753f, 0.000806f, 0.000855f, 0.000911f, 0.000945f, - 0.001004f, 0.001054f, 0.001112f, 0.001172f, 0.001251f, 0.001333f, 0.001406f, 0.001489f, - 0.001595f, 0.001694f, 0.001811f, 0.001952f, 0.002090f, 0.002243f, 0.002453f, 0.002638f, - 0.002888f, 0.003143f, 0.003489f, 0.003870f, 0.004353f, 0.004921f, 0.005672f, 0.006664f, - 0.008423f, 0.011230f, 0.301758f, 0.381104f, 0.402832f, 0.413330f, 0.418457f, 0.423828f, - 0.000096f, 0.000112f, 0.000097f, 0.000090f, 0.000113f, 0.000119f, 0.000144f, 0.000149f, - 0.000151f, 0.000158f, 0.000181f, 0.000184f, 0.000179f, 0.000201f, 0.000224f, 0.000216f, - 0.000237f, 0.000255f, 0.000263f, 0.000276f, 0.000297f, 0.000308f, 0.000332f, 0.000347f, - 0.000369f, 0.000395f, 0.000408f, 0.000422f, 0.000447f, 0.000471f, 0.000500f, 0.000531f, - 0.000554f, 0.000583f, 0.000617f, 0.000660f, 0.000690f, 0.000739f, 0.000795f, 0.000833f, - 0.000885f, 0.000948f, 0.001022f, 0.001085f, 0.001175f, 0.001262f, 0.001371f, 0.001487f, - 0.001633f, 0.001778f, 0.001986f, 0.002218f, 0.002502f, 0.002865f, 0.003330f, 0.003979f, - 0.004932f, 0.007000f, 0.291260f, 0.372070f, 0.394043f, 0.404541f, 0.412109f, 0.416260f, - 0.000000f, 0.000056f, 0.000049f, 0.000061f, 0.000064f, 0.000061f, 0.000062f, 0.000071f, - 0.000072f, 0.000088f, 0.000083f, 0.000086f, 0.000097f, 0.000094f, 0.000098f, 0.000105f, - 0.000116f, 0.000122f, 0.000126f, 0.000134f, 0.000137f, 0.000143f, 0.000150f, 0.000164f, - 0.000171f, 0.000183f, 0.000188f, 0.000204f, 0.000214f, 0.000224f, 0.000236f, 0.000255f, - 0.000258f, 0.000277f, 0.000293f, 0.000315f, 0.000328f, 0.000349f, 0.000376f, 0.000396f, - 0.000426f, 0.000454f, 0.000486f, 0.000521f, 0.000563f, 0.000605f, 0.000657f, 0.000714f, - 0.000791f, 0.000866f, 0.000977f, 0.001085f, 0.001243f, 0.001441f, 0.001703f, 0.002058f, - 0.002573f, 0.003740f, 0.280029f, 0.362793f, 0.385742f, 0.397217f, 0.404297f, 0.408936f, - 0.000058f, 0.000038f, 0.000031f, 0.000027f, 0.000025f, 0.000026f, 0.000025f, 0.000024f, - 0.000024f, 0.000027f, 0.000030f, 0.000038f, 0.000032f, 0.000035f, 0.000040f, 0.000041f, - 0.000044f, 0.000045f, 0.000045f, 0.000047f, 0.000052f, 0.000058f, 0.000061f, 0.000059f, - 0.000065f, 0.000067f, 0.000069f, 0.000073f, 0.000078f, 0.000083f, 0.000089f, 0.000091f, - 0.000099f, 0.000103f, 0.000106f, 0.000114f, 0.000124f, 0.000132f, 0.000141f, 0.000150f, - 0.000158f, 0.000164f, 0.000180f, 0.000193f, 0.000205f, 0.000225f, 0.000245f, 0.000267f, - 0.000297f, 0.000329f, 0.000365f, 0.000416f, 0.000479f, 0.000563f, 0.000676f, 0.000839f, - 0.001088f, 0.001589f, 0.270264f, 0.353760f, 0.377197f, 0.390137f, 0.396973f, 0.402100f, - 0.000030f, 0.000019f, 0.000016f, 0.000014f, 0.000013f, 0.000012f, 0.000011f, 0.000011f, - 0.000010f, 0.000010f, 0.000009f, 0.000009f, 0.000009f, 0.000008f, 0.000007f, 0.000009f, - 0.000009f, 0.000008f, 0.000009f, 0.000010f, 0.000011f, 0.000012f, 0.000012f, 0.000014f, - 0.000014f, 0.000014f, 0.000015f, 0.000018f, 0.000017f, 0.000017f, 0.000019f, 0.000020f, - 0.000022f, 0.000022f, 0.000023f, 0.000026f, 0.000028f, 0.000027f, 0.000030f, 0.000032f, - 0.000035f, 0.000038f, 0.000040f, 0.000042f, 0.000045f, 0.000049f, 0.000055f, 0.000060f, - 0.000065f, 0.000074f, 0.000078f, 0.000095f, 0.000109f, 0.000129f, 0.000160f, 0.000205f, - 0.000284f, 0.000452f, 0.259766f, 0.345703f, 0.369629f, 0.382812f, 0.390625f, 0.395264f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, 0.000001f, - 0.000001f, 0.000001f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, 0.000002f, - 0.000002f, 0.000003f, 0.000003f, 0.000004f, 0.000004f, 0.000005f, 0.000006f, 0.000009f, - 0.000012f, 0.000026f, 0.249878f, 0.336182f, 0.362061f, 0.374512f, 0.382080f, 0.387695f, - }}; - /* 4 different blue noise, one per channel */ const float blue_noise[64 * 64][4] = { {0.367188f, 0.855469f, 0.523438f, 0.375000f}, {0.242188f, 0.699219f, 0.164062f, 0.292969f}, @@ -23031,3 +5554,17449 @@ const float blue_noise[64 * 64][4] = { {0.621094f, 0.089844f, 0.500000f, 0.394531f}, {0.523438f, 0.644531f, 0.906250f, 0.773438f}, {0.796875f, 0.507812f, 0.203125f, 0.480469f}, {0.582031f, 0.042969f, 0.367188f, 0.710938f}, }; + +const float bsdf_split_sum_ggx[64 * 64 * 2] = { + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000034f, 0.999512f, 0.000057f, + 0.999512f, 0.000089f, 0.999023f, 0.000133f, 0.996582f, 0.000174f, 0.983887f, 0.000068f, + 0.983398f, 0.000099f, 0.982910f, 0.000140f, 0.982422f, 0.000192f, 0.980469f, 0.000251f, + 0.975098f, 0.000288f, 0.964844f, 0.000255f, 0.962402f, 0.000324f, 0.957520f, 0.000386f, + 0.947754f, 0.000402f, 0.939941f, 0.000443f, 0.931641f, 0.000499f, 0.919434f, 0.000515f, + 0.909668f, 0.000575f, 0.896484f, 0.000598f, 0.883789f, 0.000648f, 0.868652f, 0.000673f, + 0.854004f, 0.000715f, 0.837402f, 0.000743f, 0.819824f, 0.000767f, 0.801758f, 0.000795f, + 0.782715f, 0.000817f, 0.762695f, 0.000833f, 0.741699f, 0.000846f, 0.720703f, 0.000857f, + 0.698730f, 0.000864f, 0.676758f, 0.000868f, 0.654297f, 0.000868f, 0.631348f, 0.000865f, + 0.608887f, 0.000858f, 0.585938f, 0.000849f, 0.562988f, 0.000837f, 0.540527f, 0.000823f, + 0.518066f, 0.000807f, 0.496582f, 0.000789f, 0.474854f, 0.000769f, 0.453857f, 0.000748f, + 0.433350f, 0.000726f, 0.413086f, 0.000703f, 0.393799f, 0.000680f, 0.375000f, 0.000656f, + 0.356689f, 0.000632f, 0.339111f, 0.000607f, 0.322266f, 0.000584f, 0.306152f, 0.000559f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000001f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000011f, 0.999512f, 0.000020f, 0.999512f, 0.000035f, 0.999512f, 0.000057f, + 0.999512f, 0.000090f, 0.999023f, 0.000134f, 0.996582f, 0.000174f, 0.983887f, 0.000069f, + 0.983398f, 0.000100f, 0.982910f, 0.000141f, 0.982422f, 0.000193f, 0.980469f, 0.000252f, + 0.975098f, 0.000288f, 0.964844f, 0.000259f, 0.962402f, 0.000326f, 0.957520f, 0.000387f, + 0.947754f, 0.000401f, 0.939941f, 0.000445f, 0.931641f, 0.000500f, 0.919922f, 0.000520f, + 0.909668f, 0.000576f, 0.896484f, 0.000603f, 0.883789f, 0.000650f, 0.869141f, 0.000678f, + 0.854004f, 0.000716f, 0.837402f, 0.000744f, 0.819824f, 0.000771f, 0.801758f, 0.000796f, + 0.782715f, 0.000818f, 0.762695f, 0.000835f, 0.741699f, 0.000849f, 0.720703f, 0.000860f, + 0.698730f, 0.000866f, 0.676758f, 0.000869f, 0.654297f, 0.000869f, 0.631348f, 0.000866f, + 0.608887f, 0.000859f, 0.585938f, 0.000850f, 0.562988f, 0.000838f, 0.540527f, 0.000824f, + 0.518555f, 0.000808f, 0.496582f, 0.000790f, 0.474854f, 0.000771f, 0.453857f, 0.000750f, + 0.433350f, 0.000728f, 0.413330f, 0.000704f, 0.393799f, 0.000681f, 0.375000f, 0.000657f, + 0.356689f, 0.000632f, 0.339111f, 0.000608f, 0.322266f, 0.000584f, 0.306152f, 0.000560f, + 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, + 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 1.000000f, 0.000000f, + 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000003f, 0.999512f, 0.000006f, + 0.999512f, 0.000012f, 0.999512f, 0.000021f, 0.999512f, 0.000036f, 0.999512f, 0.000059f, + 0.999512f, 0.000093f, 0.999023f, 0.000138f, 0.996094f, 0.000172f, 0.984863f, 0.000086f, + 0.983398f, 0.000104f, 0.982910f, 0.000146f, 0.982422f, 0.000199f, 0.979980f, 0.000257f, + 0.974609f, 0.000288f, 0.965820f, 0.000278f, 0.962402f, 0.000334f, 0.957031f, 0.000392f, + 0.947754f, 0.000413f, 0.939453f, 0.000453f, 0.931152f, 0.000504f, 0.920410f, 0.000537f, + 0.909180f, 0.000582f, 0.896973f, 0.000619f, 0.883301f, 0.000656f, 0.869141f, 0.000693f, + 0.853516f, 0.000724f, 0.837402f, 0.000755f, 0.819824f, 0.000784f, 0.801270f, 0.000807f, + 0.782227f, 0.000827f, 0.762207f, 0.000845f, 0.741699f, 0.000860f, 0.720703f, 0.000870f, + 0.698730f, 0.000875f, 0.676758f, 0.000879f, 0.654297f, 0.000878f, 0.631348f, 0.000875f, + 0.608887f, 0.000868f, 0.585938f, 0.000858f, 0.562988f, 0.000846f, 0.540527f, 0.000831f, + 0.518555f, 0.000814f, 0.496582f, 0.000796f, 0.474854f, 0.000776f, 0.453857f, 0.000755f, + 0.433350f, 0.000732f, 0.413330f, 0.000709f, 0.393799f, 0.000685f, 0.375000f, 0.000661f, + 0.356934f, 0.000637f, 0.339355f, 0.000612f, 0.322510f, 0.000587f, 0.306396f, 0.000564f, + 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, + 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, 0.999512f, 0.000001f, + 0.999512f, 0.000001f, 0.999512f, 0.000002f, 0.999512f, 0.000004f, 0.999512f, 0.000008f, + 0.999512f, 0.000014f, 0.999512f, 0.000024f, 0.999512f, 0.000040f, 0.999512f, 0.000064f, + 0.999512f, 0.000098f, 0.999023f, 0.000143f, 0.995605f, 0.000165f, 0.986328f, 0.000105f, + 0.983398f, 0.000112f, 0.982910f, 0.000155f, 0.981934f, 0.000209f, 0.979980f, 0.000267f, + 0.974121f, 0.000285f, 0.966797f, 0.000300f, 0.961914f, 0.000347f, 0.956543f, 0.000401f, + 0.948242f, 0.000431f, 0.939453f, 0.000471f, 0.930664f, 0.000513f, 0.920410f, 0.000558f, + 0.908691f, 0.000592f, 0.896973f, 0.000638f, 0.883301f, 0.000670f, 0.869141f, 0.000711f, + 0.853516f, 0.000741f, 0.836914f, 0.000773f, 0.819824f, 0.000801f, 0.801270f, 0.000825f, + 0.782227f, 0.000846f, 0.762207f, 0.000863f, 0.741699f, 0.000875f, 0.720215f, 0.000885f, + 0.698730f, 0.000892f, 0.676758f, 0.000894f, 0.654297f, 0.000893f, 0.631348f, 0.000889f, + 0.608398f, 0.000881f, 0.585938f, 0.000871f, 0.562988f, 0.000858f, 0.540527f, 0.000843f, + 0.518555f, 0.000825f, 0.496582f, 0.000806f, 0.475098f, 0.000786f, 0.454102f, 0.000764f, + 0.433350f, 0.000741f, 0.413330f, 0.000717f, 0.394043f, 0.000693f, 0.375244f, 0.000669f, + 0.356934f, 0.000644f, 0.339600f, 0.000618f, 0.322754f, 0.000594f, 0.306641f, 0.000569f, + 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, + 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, 0.999512f, 0.000002f, + 0.999512f, 0.000003f, 0.999512f, 0.000004f, 0.999512f, 0.000006f, 0.999512f, 0.000010f, + 0.999512f, 0.000017f, 0.999512f, 0.000028f, 0.999512f, 0.000045f, 0.999512f, 0.000070f, + 0.999512f, 0.000106f, 0.999023f, 0.000152f, 0.994141f, 0.000151f, 0.987305f, 0.000122f, + 0.983398f, 0.000123f, 0.982910f, 0.000169f, 0.981934f, 0.000224f, 0.979492f, 0.000279f, + 0.973633f, 0.000294f, 0.967773f, 0.000324f, 0.961426f, 0.000365f, 0.955566f, 0.000411f, + 0.948242f, 0.000454f, 0.939941f, 0.000496f, 0.930176f, 0.000534f, 0.920410f, 0.000583f, + 0.908691f, 0.000617f, 0.896973f, 0.000663f, 0.883301f, 0.000698f, 0.868652f, 0.000734f, + 0.853516f, 0.000769f, 0.836914f, 0.000800f, 0.819336f, 0.000825f, 0.801270f, 0.000850f, + 0.782227f, 0.000871f, 0.762207f, 0.000887f, 0.741699f, 0.000900f, 0.720215f, 0.000909f, + 0.698730f, 0.000915f, 0.676270f, 0.000916f, 0.653809f, 0.000914f, 0.631348f, 0.000909f, + 0.608398f, 0.000900f, 0.585938f, 0.000889f, 0.562988f, 0.000875f, 0.540527f, 0.000859f, + 0.518555f, 0.000841f, 0.496826f, 0.000821f, 0.475342f, 0.000800f, 0.454102f, 0.000777f, + 0.433594f, 0.000753f, 0.413574f, 0.000729f, 0.394287f, 0.000704f, 0.375488f, 0.000678f, + 0.357178f, 0.000653f, 0.339844f, 0.000627f, 0.322998f, 0.000602f, 0.306885f, 0.000576f, + 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, + 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000004f, 0.999512f, 0.000005f, + 0.999512f, 0.000006f, 0.999512f, 0.000007f, 0.999512f, 0.000010f, 0.999512f, 0.000015f, + 0.999512f, 0.000022f, 0.999512f, 0.000034f, 0.999512f, 0.000052f, 0.999512f, 0.000079f, + 0.999512f, 0.000117f, 0.998535f, 0.000163f, 0.993652f, 0.000150f, 0.988281f, 0.000138f, + 0.983398f, 0.000139f, 0.982910f, 0.000187f, 0.981934f, 0.000244f, 0.979004f, 0.000294f, + 0.973633f, 0.000312f, 0.968262f, 0.000352f, 0.961426f, 0.000392f, 0.955078f, 0.000430f, + 0.948242f, 0.000483f, 0.939453f, 0.000525f, 0.929688f, 0.000563f, 0.920410f, 0.000612f, + 0.908691f, 0.000652f, 0.896484f, 0.000691f, 0.883301f, 0.000733f, 0.868652f, 0.000767f, + 0.853027f, 0.000801f, 0.836426f, 0.000832f, 0.819336f, 0.000860f, 0.800781f, 0.000884f, + 0.781738f, 0.000903f, 0.761719f, 0.000919f, 0.741211f, 0.000931f, 0.720215f, 0.000938f, + 0.698242f, 0.000943f, 0.676270f, 0.000944f, 0.653809f, 0.000941f, 0.631348f, 0.000935f, + 0.608398f, 0.000925f, 0.585938f, 0.000913f, 0.562988f, 0.000898f, 0.541016f, 0.000881f, + 0.518555f, 0.000861f, 0.496826f, 0.000840f, 0.475342f, 0.000818f, 0.454346f, 0.000794f, + 0.433838f, 0.000769f, 0.413818f, 0.000743f, 0.394531f, 0.000718f, 0.375732f, 0.000691f, + 0.357666f, 0.000665f, 0.340088f, 0.000638f, 0.323242f, 0.000612f, 0.307129f, 0.000587f, + 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, + 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000008f, 0.999512f, 0.000009f, + 0.999512f, 0.000010f, 0.999512f, 0.000012f, 0.999512f, 0.000015f, 0.999512f, 0.000021f, + 0.999512f, 0.000030f, 0.999512f, 0.000043f, 0.999512f, 0.000063f, 0.999512f, 0.000091f, + 0.999512f, 0.000131f, 0.998535f, 0.000177f, 0.993164f, 0.000157f, 0.988770f, 0.000157f, + 0.983398f, 0.000160f, 0.982910f, 0.000210f, 0.981445f, 0.000268f, 0.978516f, 0.000311f, + 0.973633f, 0.000338f, 0.968262f, 0.000386f, 0.961426f, 0.000426f, 0.954590f, 0.000461f, + 0.948242f, 0.000518f, 0.939453f, 0.000557f, 0.929688f, 0.000602f, 0.919922f, 0.000647f, + 0.908691f, 0.000694f, 0.895996f, 0.000731f, 0.882812f, 0.000773f, 0.868164f, 0.000809f, + 0.853027f, 0.000844f, 0.836426f, 0.000873f, 0.818848f, 0.000901f, 0.800781f, 0.000924f, + 0.781738f, 0.000944f, 0.761719f, 0.000959f, 0.741211f, 0.000969f, 0.719727f, 0.000977f, + 0.698242f, 0.000979f, 0.676270f, 0.000978f, 0.653809f, 0.000975f, 0.631348f, 0.000967f, + 0.608398f, 0.000956f, 0.585938f, 0.000942f, 0.563477f, 0.000926f, 0.541016f, 0.000907f, + 0.518555f, 0.000886f, 0.497070f, 0.000864f, 0.475586f, 0.000840f, 0.454590f, 0.000814f, + 0.434082f, 0.000789f, 0.414307f, 0.000762f, 0.394775f, 0.000735f, 0.376221f, 0.000708f, + 0.357910f, 0.000680f, 0.340576f, 0.000653f, 0.323730f, 0.000626f, 0.307617f, 0.000599f, + 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, + 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000015f, 0.999512f, 0.000016f, + 0.999512f, 0.000017f, 0.999512f, 0.000020f, 0.999512f, 0.000024f, 0.999512f, 0.000030f, + 0.999512f, 0.000040f, 0.999512f, 0.000055f, 0.999512f, 0.000077f, 0.999512f, 0.000108f, + 0.999023f, 0.000150f, 0.998047f, 0.000193f, 0.993164f, 0.000170f, 0.989258f, 0.000180f, + 0.984375f, 0.000193f, 0.982422f, 0.000239f, 0.981445f, 0.000299f, 0.977539f, 0.000330f, + 0.973145f, 0.000371f, 0.968750f, 0.000425f, 0.961426f, 0.000463f, 0.954590f, 0.000501f, + 0.947754f, 0.000560f, 0.939453f, 0.000602f, 0.929688f, 0.000650f, 0.919434f, 0.000693f, + 0.908203f, 0.000742f, 0.895508f, 0.000782f, 0.882324f, 0.000822f, 0.867676f, 0.000860f, + 0.852539f, 0.000894f, 0.835938f, 0.000925f, 0.818359f, 0.000951f, 0.800293f, 0.000973f, + 0.781250f, 0.000992f, 0.761230f, 0.001005f, 0.740723f, 0.001016f, 0.719727f, 0.001021f, + 0.697754f, 0.001022f, 0.675781f, 0.001020f, 0.653809f, 0.001015f, 0.631348f, 0.001005f, + 0.608398f, 0.000993f, 0.585938f, 0.000977f, 0.563477f, 0.000958f, 0.541016f, 0.000938f, + 0.519043f, 0.000916f, 0.497314f, 0.000892f, 0.475830f, 0.000866f, 0.454834f, 0.000840f, + 0.434570f, 0.000812f, 0.414551f, 0.000784f, 0.395264f, 0.000755f, 0.376465f, 0.000727f, + 0.358398f, 0.000698f, 0.341064f, 0.000669f, 0.324219f, 0.000641f, 0.308105f, 0.000613f, + 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, + 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, 0.999512f, 0.000026f, + 0.999512f, 0.000028f, 0.999512f, 0.000031f, 0.999512f, 0.000036f, 0.999512f, 0.000044f, + 0.999512f, 0.000055f, 0.999512f, 0.000072f, 0.999512f, 0.000096f, 0.999512f, 0.000130f, + 0.999023f, 0.000175f, 0.997559f, 0.000208f, 0.993164f, 0.000191f, 0.989746f, 0.000208f, + 0.985352f, 0.000232f, 0.982422f, 0.000275f, 0.980957f, 0.000335f, 0.977051f, 0.000362f, + 0.973145f, 0.000413f, 0.968750f, 0.000471f, 0.961426f, 0.000505f, 0.954102f, 0.000551f, + 0.947266f, 0.000607f, 0.938965f, 0.000657f, 0.929688f, 0.000705f, 0.918945f, 0.000750f, + 0.907715f, 0.000797f, 0.895508f, 0.000842f, 0.881836f, 0.000882f, 0.867676f, 0.000920f, + 0.852051f, 0.000952f, 0.835449f, 0.000984f, 0.817871f, 0.001010f, 0.799805f, 0.001032f, + 0.780762f, 0.001049f, 0.760742f, 0.001062f, 0.740234f, 0.001071f, 0.719238f, 0.001074f, + 0.697754f, 0.001074f, 0.675781f, 0.001070f, 0.653320f, 0.001061f, 0.630859f, 0.001050f, + 0.608398f, 0.001036f, 0.585938f, 0.001018f, 0.563477f, 0.000998f, 0.541016f, 0.000975f, + 0.519043f, 0.000950f, 0.497559f, 0.000925f, 0.476074f, 0.000897f, 0.455322f, 0.000868f, + 0.434814f, 0.000839f, 0.415039f, 0.000809f, 0.395752f, 0.000779f, 0.376953f, 0.000749f, + 0.358887f, 0.000719f, 0.341553f, 0.000689f, 0.324707f, 0.000659f, 0.308594f, 0.000630f, + 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, + 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000041f, 0.999512f, 0.000042f, + 0.999512f, 0.000044f, 0.999512f, 0.000048f, 0.999512f, 0.000054f, 0.999512f, 0.000062f, + 0.999512f, 0.000075f, 0.999512f, 0.000094f, 0.999512f, 0.000121f, 0.999512f, 0.000158f, + 0.999023f, 0.000206f, 0.996582f, 0.000219f, 0.993164f, 0.000219f, 0.990234f, 0.000243f, + 0.986328f, 0.000276f, 0.982422f, 0.000320f, 0.980469f, 0.000377f, 0.976562f, 0.000407f, + 0.973145f, 0.000465f, 0.968262f, 0.000524f, 0.961426f, 0.000562f, 0.954102f, 0.000614f, + 0.946777f, 0.000663f, 0.938965f, 0.000721f, 0.929199f, 0.000769f, 0.918457f, 0.000818f, + 0.907227f, 0.000865f, 0.895020f, 0.000910f, 0.881348f, 0.000951f, 0.867188f, 0.000991f, + 0.851562f, 0.001023f, 0.834961f, 0.001053f, 0.817383f, 0.001079f, 0.799316f, 0.001100f, + 0.780273f, 0.001115f, 0.760254f, 0.001127f, 0.739746f, 0.001133f, 0.718750f, 0.001136f, + 0.697266f, 0.001133f, 0.675293f, 0.001126f, 0.653320f, 0.001117f, 0.630859f, 0.001102f, + 0.608398f, 0.001085f, 0.585938f, 0.001065f, 0.563477f, 0.001042f, 0.541016f, 0.001018f, + 0.519531f, 0.000991f, 0.497803f, 0.000962f, 0.476562f, 0.000932f, 0.455566f, 0.000902f, + 0.435303f, 0.000870f, 0.415527f, 0.000839f, 0.396240f, 0.000806f, 0.377686f, 0.000774f, + 0.359619f, 0.000742f, 0.342041f, 0.000711f, 0.325439f, 0.000680f, 0.309326f, 0.000649f, + 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, + 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000062f, 0.999512f, 0.000063f, + 0.999512f, 0.000066f, 0.999512f, 0.000071f, 0.999512f, 0.000077f, 0.999512f, 0.000088f, + 0.999512f, 0.000102f, 0.999512f, 0.000124f, 0.999512f, 0.000153f, 0.999512f, 0.000194f, + 0.999023f, 0.000245f, 0.995605f, 0.000245f, 0.993164f, 0.000256f, 0.990234f, 0.000287f, + 0.986816f, 0.000329f, 0.981934f, 0.000374f, 0.979492f, 0.000424f, 0.976074f, 0.000462f, + 0.972656f, 0.000527f, 0.967773f, 0.000584f, 0.961426f, 0.000630f, 0.954102f, 0.000687f, + 0.946289f, 0.000734f, 0.938477f, 0.000796f, 0.928711f, 0.000846f, 0.917969f, 0.000896f, + 0.906738f, 0.000946f, 0.894531f, 0.000991f, 0.880859f, 0.001032f, 0.866211f, 0.001071f, + 0.851074f, 0.001105f, 0.834473f, 0.001134f, 0.816895f, 0.001159f, 0.798828f, 0.001178f, + 0.779785f, 0.001193f, 0.759766f, 0.001202f, 0.739258f, 0.001206f, 0.718262f, 0.001206f, + 0.696777f, 0.001201f, 0.675293f, 0.001191f, 0.652832f, 0.001179f, 0.630859f, 0.001162f, + 0.608398f, 0.001142f, 0.585938f, 0.001119f, 0.563477f, 0.001093f, 0.541504f, 0.001065f, + 0.519531f, 0.001036f, 0.498047f, 0.001005f, 0.476807f, 0.000973f, 0.456055f, 0.000939f, + 0.435791f, 0.000906f, 0.416016f, 0.000872f, 0.396973f, 0.000838f, 0.378174f, 0.000803f, + 0.360352f, 0.000770f, 0.342773f, 0.000737f, 0.326172f, 0.000704f, 0.310059f, 0.000672f, + 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, + 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000091f, 0.999512f, 0.000092f, + 0.999512f, 0.000096f, 0.999512f, 0.000101f, 0.999512f, 0.000109f, 0.999512f, 0.000121f, + 0.999512f, 0.000138f, 0.999512f, 0.000162f, 0.999512f, 0.000195f, 0.999512f, 0.000240f, + 0.998535f, 0.000293f, 0.995605f, 0.000285f, 0.992676f, 0.000303f, 0.990234f, 0.000341f, + 0.987305f, 0.000391f, 0.982422f, 0.000442f, 0.979004f, 0.000477f, 0.976074f, 0.000531f, + 0.972656f, 0.000600f, 0.967285f, 0.000652f, 0.961426f, 0.000711f, 0.954102f, 0.000769f, + 0.945312f, 0.000819f, 0.937988f, 0.000881f, 0.928711f, 0.000937f, 0.917480f, 0.000987f, + 0.905762f, 0.001037f, 0.894043f, 0.001085f, 0.880371f, 0.001127f, 0.865723f, 0.001163f, + 0.850098f, 0.001198f, 0.833496f, 0.001225f, 0.816406f, 0.001249f, 0.798340f, 0.001266f, + 0.779297f, 0.001280f, 0.759277f, 0.001287f, 0.738770f, 0.001288f, 0.717773f, 0.001286f, + 0.696777f, 0.001278f, 0.674805f, 0.001266f, 0.652832f, 0.001248f, 0.630371f, 0.001229f, + 0.608398f, 0.001205f, 0.585938f, 0.001180f, 0.563477f, 0.001150f, 0.541504f, 0.001120f, + 0.520020f, 0.001087f, 0.498535f, 0.001053f, 0.477295f, 0.001018f, 0.456543f, 0.000982f, + 0.436279f, 0.000946f, 0.416748f, 0.000909f, 0.397461f, 0.000872f, 0.378906f, 0.000836f, + 0.361084f, 0.000800f, 0.343506f, 0.000765f, 0.326904f, 0.000731f, 0.310791f, 0.000697f, + 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, + 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000129f, 0.999512f, 0.000131f, + 0.999512f, 0.000135f, 0.999512f, 0.000142f, 0.999512f, 0.000151f, 0.999512f, 0.000164f, + 0.999512f, 0.000184f, 0.999512f, 0.000210f, 0.999512f, 0.000247f, 0.999023f, 0.000296f, + 0.998535f, 0.000350f, 0.995117f, 0.000337f, 0.992676f, 0.000364f, 0.990723f, 0.000408f, + 0.987793f, 0.000465f, 0.982910f, 0.000521f, 0.978027f, 0.000550f, 0.975586f, 0.000614f, + 0.972168f, 0.000687f, 0.966797f, 0.000738f, 0.960938f, 0.000806f, 0.953613f, 0.000861f, + 0.945312f, 0.000921f, 0.937012f, 0.000978f, 0.928223f, 0.001041f, 0.917480f, 0.001094f, + 0.905273f, 0.001142f, 0.893066f, 0.001192f, 0.879883f, 0.001235f, 0.864746f, 0.001272f, + 0.849609f, 0.001305f, 0.833008f, 0.001332f, 0.815918f, 0.001353f, 0.797363f, 0.001369f, + 0.778320f, 0.001378f, 0.758789f, 0.001383f, 0.738281f, 0.001382f, 0.717773f, 0.001375f, + 0.696289f, 0.001364f, 0.674316f, 0.001348f, 0.652344f, 0.001328f, 0.630371f, 0.001305f, + 0.607910f, 0.001277f, 0.585938f, 0.001247f, 0.563965f, 0.001215f, 0.541992f, 0.001181f, + 0.520020f, 0.001144f, 0.498779f, 0.001106f, 0.477783f, 0.001068f, 0.457275f, 0.001029f, + 0.437012f, 0.000990f, 0.417480f, 0.000951f, 0.398193f, 0.000911f, 0.379639f, 0.000873f, + 0.361816f, 0.000834f, 0.344482f, 0.000796f, 0.327637f, 0.000760f, 0.311768f, 0.000724f, + 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, + 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000179f, 0.999512f, 0.000181f, + 0.999512f, 0.000186f, 0.999512f, 0.000193f, 0.999512f, 0.000204f, 0.999512f, 0.000220f, + 0.999512f, 0.000242f, 0.999512f, 0.000272f, 0.999023f, 0.000313f, 0.999023f, 0.000366f, + 0.998047f, 0.000414f, 0.994629f, 0.000404f, 0.992676f, 0.000438f, 0.990723f, 0.000489f, + 0.987793f, 0.000553f, 0.983398f, 0.000611f, 0.977539f, 0.000640f, 0.975098f, 0.000713f, + 0.971680f, 0.000786f, 0.966309f, 0.000842f, 0.960938f, 0.000916f, 0.953613f, 0.000973f, + 0.945312f, 0.001039f, 0.936035f, 0.001096f, 0.927246f, 0.001159f, 0.916992f, 0.001216f, + 0.904785f, 0.001266f, 0.892090f, 0.001312f, 0.878906f, 0.001357f, 0.864258f, 0.001394f, + 0.848633f, 0.001426f, 0.832520f, 0.001451f, 0.814941f, 0.001470f, 0.796875f, 0.001483f, + 0.777832f, 0.001490f, 0.758301f, 0.001491f, 0.737793f, 0.001486f, 0.716797f, 0.001476f, + 0.695801f, 0.001460f, 0.674316f, 0.001440f, 0.652344f, 0.001416f, 0.630371f, 0.001389f, + 0.607910f, 0.001357f, 0.585938f, 0.001323f, 0.563965f, 0.001287f, 0.541992f, 0.001247f, + 0.520508f, 0.001207f, 0.499268f, 0.001166f, 0.478271f, 0.001124f, 0.457764f, 0.001081f, + 0.437744f, 0.001040f, 0.418213f, 0.000997f, 0.399170f, 0.000955f, 0.380615f, 0.000913f, + 0.362793f, 0.000872f, 0.345459f, 0.000832f, 0.328613f, 0.000793f, 0.312744f, 0.000754f, + 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, + 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000243f, 0.999512f, 0.000245f, + 0.999512f, 0.000251f, 0.999512f, 0.000259f, 0.999512f, 0.000272f, 0.999512f, 0.000289f, + 0.999512f, 0.000314f, 0.999512f, 0.000348f, 0.999023f, 0.000394f, 0.999023f, 0.000452f, + 0.997070f, 0.000480f, 0.994629f, 0.000487f, 0.992676f, 0.000528f, 0.990723f, 0.000587f, + 0.987793f, 0.000658f, 0.983398f, 0.000711f, 0.977051f, 0.000749f, 0.974609f, 0.000830f, + 0.970703f, 0.000898f, 0.965820f, 0.000966f, 0.960449f, 0.001040f, 0.953125f, 0.001104f, + 0.944824f, 0.001170f, 0.935547f, 0.001232f, 0.926270f, 0.001294f, 0.916016f, 0.001354f, + 0.904297f, 0.001408f, 0.891602f, 0.001453f, 0.877930f, 0.001496f, 0.863770f, 0.001533f, + 0.847656f, 0.001561f, 0.831543f, 0.001585f, 0.813965f, 0.001601f, 0.795898f, 0.001612f, + 0.776855f, 0.001616f, 0.757324f, 0.001612f, 0.737305f, 0.001603f, 0.716309f, 0.001588f, + 0.695312f, 0.001568f, 0.673828f, 0.001544f, 0.651855f, 0.001514f, 0.629883f, 0.001482f, + 0.607910f, 0.001446f, 0.585938f, 0.001407f, 0.563965f, 0.001366f, 0.542480f, 0.001323f, + 0.520996f, 0.001278f, 0.499756f, 0.001232f, 0.478760f, 0.001186f, 0.458496f, 0.001140f, + 0.438477f, 0.001094f, 0.418945f, 0.001047f, 0.399902f, 0.001002f, 0.381592f, 0.000957f, + 0.363770f, 0.000913f, 0.346436f, 0.000870f, 0.329834f, 0.000828f, 0.313721f, 0.000788f, + 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, + 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000323f, 0.999512f, 0.000326f, + 0.999512f, 0.000332f, 0.999512f, 0.000342f, 0.999512f, 0.000356f, 0.999512f, 0.000376f, + 0.999023f, 0.000404f, 0.999023f, 0.000442f, 0.999023f, 0.000493f, 0.998535f, 0.000556f, + 0.996582f, 0.000569f, 0.994141f, 0.000590f, 0.992676f, 0.000638f, 0.990723f, 0.000705f, + 0.988281f, 0.000782f, 0.983398f, 0.000825f, 0.977539f, 0.000883f, 0.974121f, 0.000966f, + 0.969727f, 0.001030f, 0.965332f, 0.001111f, 0.959473f, 0.001182f, 0.952637f, 0.001257f, + 0.944336f, 0.001322f, 0.935059f, 0.001389f, 0.925781f, 0.001451f, 0.915527f, 0.001511f, + 0.903809f, 0.001565f, 0.890625f, 0.001612f, 0.876953f, 0.001654f, 0.862793f, 0.001689f, + 0.847168f, 0.001716f, 0.830566f, 0.001737f, 0.813477f, 0.001750f, 0.794922f, 0.001755f, + 0.776367f, 0.001755f, 0.756348f, 0.001746f, 0.736328f, 0.001733f, 0.715820f, 0.001713f, + 0.694824f, 0.001688f, 0.673340f, 0.001657f, 0.651855f, 0.001623f, 0.629883f, 0.001585f, + 0.607910f, 0.001543f, 0.585938f, 0.001499f, 0.564453f, 0.001452f, 0.542480f, 0.001404f, + 0.520996f, 0.001355f, 0.500000f, 0.001306f, 0.479492f, 0.001255f, 0.459229f, 0.001204f, + 0.439209f, 0.001154f, 0.419678f, 0.001103f, 0.400879f, 0.001054f, 0.382568f, 0.001005f, + 0.364746f, 0.000958f, 0.347412f, 0.000913f, 0.330811f, 0.000868f, 0.314941f, 0.000825f, + 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, + 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000422f, 0.999512f, 0.000426f, + 0.999512f, 0.000433f, 0.999512f, 0.000445f, 0.999023f, 0.000461f, 0.999023f, 0.000484f, + 0.999023f, 0.000515f, 0.999023f, 0.000557f, 0.999023f, 0.000613f, 0.998535f, 0.000681f, + 0.996094f, 0.000683f, 0.994141f, 0.000715f, 0.992676f, 0.000771f, 0.990723f, 0.000845f, + 0.987793f, 0.000926f, 0.983398f, 0.000968f, 0.978027f, 0.001040f, 0.973633f, 0.001123f, + 0.969238f, 0.001190f, 0.964844f, 0.001278f, 0.958984f, 0.001349f, 0.952148f, 0.001431f, + 0.943848f, 0.001499f, 0.934570f, 0.001565f, 0.924316f, 0.001631f, 0.914551f, 0.001692f, + 0.902832f, 0.001745f, 0.889648f, 0.001791f, 0.875977f, 0.001829f, 0.861816f, 0.001863f, + 0.846191f, 0.001888f, 0.829590f, 0.001904f, 0.812500f, 0.001915f, 0.793945f, 0.001915f, + 0.775391f, 0.001910f, 0.755859f, 0.001897f, 0.735840f, 0.001877f, 0.715332f, 0.001851f, + 0.694336f, 0.001820f, 0.672852f, 0.001783f, 0.651367f, 0.001743f, 0.629395f, 0.001698f, + 0.607910f, 0.001651f, 0.585938f, 0.001600f, 0.564453f, 0.001549f, 0.542969f, 0.001495f, + 0.521484f, 0.001440f, 0.500488f, 0.001385f, 0.480225f, 0.001329f, 0.459961f, 0.001274f, + 0.440186f, 0.001219f, 0.420654f, 0.001164f, 0.401855f, 0.001111f, 0.383545f, 0.001060f, + 0.365967f, 0.001009f, 0.348633f, 0.000959f, 0.332031f, 0.000912f, 0.316162f, 0.000866f, + 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, + 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000545f, 0.999023f, 0.000549f, + 0.999023f, 0.000557f, 0.999023f, 0.000570f, 0.999023f, 0.000588f, 0.999023f, 0.000614f, + 0.999023f, 0.000649f, 0.999023f, 0.000696f, 0.998535f, 0.000758f, 0.998047f, 0.000828f, + 0.995605f, 0.000824f, 0.993652f, 0.000865f, 0.992188f, 0.000930f, 0.990723f, 0.001012f, + 0.987793f, 0.001093f, 0.983398f, 0.001141f, 0.978027f, 0.001224f, 0.972656f, 0.001304f, + 0.968750f, 0.001380f, 0.963867f, 0.001470f, 0.958008f, 0.001546f, 0.951660f, 0.001627f, + 0.943359f, 0.001702f, 0.934082f, 0.001769f, 0.923340f, 0.001833f, 0.913574f, 0.001896f, + 0.901855f, 0.001949f, 0.889160f, 0.001995f, 0.875000f, 0.002031f, 0.860352f, 0.002062f, + 0.845215f, 0.002083f, 0.828613f, 0.002094f, 0.811035f, 0.002098f, 0.792969f, 0.002094f, + 0.774414f, 0.002081f, 0.754883f, 0.002062f, 0.734863f, 0.002035f, 0.714355f, 0.002003f, + 0.693359f, 0.001965f, 0.672363f, 0.001923f, 0.650879f, 0.001874f, 0.629395f, 0.001823f, + 0.607910f, 0.001769f, 0.585938f, 0.001712f, 0.564453f, 0.001654f, 0.543457f, 0.001595f, + 0.521973f, 0.001534f, 0.501465f, 0.001472f, 0.480957f, 0.001410f, 0.460693f, 0.001350f, + 0.440918f, 0.001290f, 0.421875f, 0.001232f, 0.403076f, 0.001174f, 0.384766f, 0.001118f, + 0.367188f, 0.001062f, 0.349854f, 0.001010f, 0.333496f, 0.000958f, 0.317383f, 0.000909f, + 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, + 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000694f, 0.999023f, 0.000699f, + 0.999023f, 0.000708f, 0.999023f, 0.000723f, 0.999023f, 0.000743f, 0.999023f, 0.000772f, + 0.999023f, 0.000811f, 0.998535f, 0.000864f, 0.998535f, 0.000931f, 0.997559f, 0.000999f, + 0.995117f, 0.000996f, 0.993652f, 0.001045f, 0.992188f, 0.001119f, 0.990234f, 0.001207f, + 0.987305f, 0.001283f, 0.982910f, 0.001344f, 0.978516f, 0.001436f, 0.971680f, 0.001508f, + 0.967773f, 0.001599f, 0.962891f, 0.001686f, 0.957520f, 0.001774f, 0.950684f, 0.001852f, + 0.942871f, 0.001933f, 0.933105f, 0.002003f, 0.922852f, 0.002066f, 0.912109f, 0.002125f, + 0.900879f, 0.002178f, 0.888184f, 0.002222f, 0.874023f, 0.002254f, 0.859375f, 0.002281f, + 0.843750f, 0.002296f, 0.827148f, 0.002304f, 0.810059f, 0.002302f, 0.791992f, 0.002293f, + 0.773438f, 0.002272f, 0.753906f, 0.002247f, 0.733887f, 0.002213f, 0.713867f, 0.002172f, + 0.692871f, 0.002125f, 0.671875f, 0.002073f, 0.650391f, 0.002018f, 0.629395f, 0.001961f, + 0.607910f, 0.001899f, 0.586426f, 0.001835f, 0.564941f, 0.001769f, 0.543457f, 0.001701f, + 0.522461f, 0.001635f, 0.501953f, 0.001567f, 0.481689f, 0.001500f, 0.461670f, 0.001433f, + 0.441895f, 0.001369f, 0.422852f, 0.001305f, 0.404053f, 0.001242f, 0.385986f, 0.001181f, + 0.368408f, 0.001122f, 0.351318f, 0.001065f, 0.334717f, 0.001010f, 0.318848f, 0.000957f, + 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, + 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000874f, 0.999023f, 0.000879f, + 0.999023f, 0.000890f, 0.999023f, 0.000906f, 0.998535f, 0.000930f, 0.998535f, 0.000962f, + 0.998535f, 0.001005f, 0.998535f, 0.001063f, 0.998047f, 0.001138f, 0.997070f, 0.001189f, + 0.994629f, 0.001201f, 0.993164f, 0.001258f, 0.991699f, 0.001341f, 0.990234f, 0.001437f, + 0.986816f, 0.001500f, 0.982910f, 0.001581f, 0.978516f, 0.001681f, 0.971680f, 0.001753f, + 0.967285f, 0.001852f, 0.961914f, 0.001937f, 0.956543f, 0.002033f, 0.949707f, 0.002113f, + 0.941895f, 0.002190f, 0.932617f, 0.002268f, 0.921875f, 0.002331f, 0.910645f, 0.002388f, + 0.899414f, 0.002438f, 0.886719f, 0.002478f, 0.873047f, 0.002508f, 0.857910f, 0.002527f, + 0.842773f, 0.002539f, 0.826172f, 0.002539f, 0.808594f, 0.002529f, 0.791016f, 0.002512f, + 0.772461f, 0.002485f, 0.752930f, 0.002449f, 0.733398f, 0.002407f, 0.712891f, 0.002357f, + 0.692383f, 0.002302f, 0.671387f, 0.002241f, 0.650391f, 0.002178f, 0.628906f, 0.002110f, + 0.607422f, 0.002039f, 0.586426f, 0.001966f, 0.564941f, 0.001894f, 0.543945f, 0.001820f, + 0.522949f, 0.001745f, 0.502441f, 0.001671f, 0.482422f, 0.001597f, 0.462646f, 0.001525f, + 0.443115f, 0.001453f, 0.424072f, 0.001384f, 0.405518f, 0.001316f, 0.387451f, 0.001250f, + 0.369873f, 0.001186f, 0.352783f, 0.001124f, 0.336182f, 0.001065f, 0.320312f, 0.001009f, + 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, + 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001090f, 0.998535f, 0.001096f, + 0.998535f, 0.001108f, 0.998535f, 0.001126f, 0.998535f, 0.001152f, 0.998535f, 0.001188f, + 0.998535f, 0.001237f, 0.998047f, 0.001301f, 0.998047f, 0.001381f, 0.996094f, 0.001410f, + 0.994141f, 0.001442f, 0.993164f, 0.001511f, 0.991699f, 0.001602f, 0.989746f, 0.001703f, + 0.986328f, 0.001763f, 0.982910f, 0.001861f, 0.978027f, 0.001961f, 0.971680f, 0.002041f, + 0.966309f, 0.002142f, 0.960938f, 0.002230f, 0.955566f, 0.002325f, 0.948730f, 0.002413f, + 0.940918f, 0.002491f, 0.931641f, 0.002563f, 0.920898f, 0.002628f, 0.909668f, 0.002684f, + 0.897949f, 0.002729f, 0.885742f, 0.002766f, 0.871582f, 0.002790f, 0.856934f, 0.002804f, + 0.841309f, 0.002806f, 0.824707f, 0.002800f, 0.807617f, 0.002783f, 0.789551f, 0.002754f, + 0.770996f, 0.002718f, 0.751953f, 0.002672f, 0.732422f, 0.002621f, 0.711914f, 0.002562f, + 0.691406f, 0.002497f, 0.670898f, 0.002426f, 0.649902f, 0.002352f, 0.628906f, 0.002274f, + 0.607422f, 0.002193f, 0.586426f, 0.002113f, 0.565430f, 0.002031f, 0.544434f, 0.001948f, + 0.523926f, 0.001866f, 0.503418f, 0.001784f, 0.483398f, 0.001703f, 0.463623f, 0.001623f, + 0.444092f, 0.001546f, 0.425293f, 0.001470f, 0.406738f, 0.001396f, 0.388672f, 0.001325f, + 0.371338f, 0.001256f, 0.354248f, 0.001190f, 0.337891f, 0.001126f, 0.322021f, 0.001065f, + 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, + 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001348f, 0.998535f, 0.001354f, + 0.998535f, 0.001368f, 0.998535f, 0.001389f, 0.998047f, 0.001417f, 0.998047f, 0.001457f, + 0.998047f, 0.001511f, 0.998047f, 0.001581f, 0.997559f, 0.001668f, 0.995605f, 0.001684f, + 0.994141f, 0.001730f, 0.992676f, 0.001808f, 0.991211f, 0.001908f, 0.989258f, 0.002010f, + 0.985840f, 0.002073f, 0.982422f, 0.002182f, 0.978027f, 0.002279f, 0.971680f, 0.002373f, + 0.964844f, 0.002470f, 0.959961f, 0.002567f, 0.954102f, 0.002657f, 0.947754f, 0.002750f, + 0.939941f, 0.002831f, 0.930664f, 0.002901f, 0.919922f, 0.002962f, 0.908691f, 0.003014f, + 0.896484f, 0.003056f, 0.884277f, 0.003088f, 0.870605f, 0.003105f, 0.855469f, 0.003111f, + 0.839355f, 0.003105f, 0.823242f, 0.003088f, 0.806152f, 0.003061f, 0.788086f, 0.003023f, + 0.770020f, 0.002975f, 0.750977f, 0.002920f, 0.730957f, 0.002855f, 0.711426f, 0.002785f, + 0.690918f, 0.002708f, 0.670410f, 0.002626f, 0.649414f, 0.002541f, 0.628418f, 0.002453f, + 0.607422f, 0.002363f, 0.586426f, 0.002272f, 0.565918f, 0.002180f, 0.544922f, 0.002089f, + 0.524414f, 0.001995f, 0.504395f, 0.001906f, 0.484375f, 0.001818f, 0.464600f, 0.001731f, + 0.445312f, 0.001646f, 0.426514f, 0.001563f, 0.408203f, 0.001483f, 0.390381f, 0.001406f, + 0.372803f, 0.001332f, 0.355957f, 0.001261f, 0.339600f, 0.001192f, 0.323730f, 0.001126f, + 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, + 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001653f, 0.998047f, 0.001660f, + 0.998047f, 0.001676f, 0.998047f, 0.001698f, 0.998047f, 0.001730f, 0.998047f, 0.001775f, + 0.997559f, 0.001834f, 0.997559f, 0.001911f, 0.997070f, 0.002003f, 0.994629f, 0.002008f, + 0.993652f, 0.002064f, 0.992188f, 0.002155f, 0.990723f, 0.002264f, 0.988281f, 0.002357f, + 0.985352f, 0.002436f, 0.981934f, 0.002554f, 0.977051f, 0.002642f, 0.971680f, 0.002752f, + 0.964355f, 0.002844f, 0.958984f, 0.002951f, 0.953125f, 0.003044f, 0.946289f, 0.003130f, + 0.938477f, 0.003214f, 0.929199f, 0.003284f, 0.918945f, 0.003342f, 0.907227f, 0.003389f, + 0.895020f, 0.003424f, 0.882324f, 0.003447f, 0.868652f, 0.003456f, 0.854004f, 0.003452f, + 0.838379f, 0.003437f, 0.821777f, 0.003408f, 0.804688f, 0.003368f, 0.787109f, 0.003319f, + 0.768555f, 0.003258f, 0.749512f, 0.003189f, 0.729980f, 0.003113f, 0.710449f, 0.003029f, + 0.690430f, 0.002939f, 0.669434f, 0.002846f, 0.648926f, 0.002748f, 0.628418f, 0.002647f, + 0.607422f, 0.002546f, 0.586914f, 0.002443f, 0.565918f, 0.002342f, 0.545410f, 0.002239f, + 0.525391f, 0.002138f, 0.504883f, 0.002039f, 0.485352f, 0.001942f, 0.465820f, 0.001846f, + 0.446777f, 0.001754f, 0.427979f, 0.001664f, 0.409668f, 0.001577f, 0.391846f, 0.001494f, + 0.374512f, 0.001413f, 0.357666f, 0.001337f, 0.341309f, 0.001264f, 0.325439f, 0.001193f, + 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, + 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002012f, 0.997559f, 0.002020f, + 0.997559f, 0.002037f, 0.997559f, 0.002062f, 0.997559f, 0.002098f, 0.997559f, 0.002148f, + 0.997070f, 0.002213f, 0.997070f, 0.002296f, 0.996582f, 0.002390f, 0.994141f, 0.002390f, + 0.993164f, 0.002460f, 0.991699f, 0.002558f, 0.990234f, 0.002676f, 0.987793f, 0.002754f, + 0.984863f, 0.002857f, 0.981445f, 0.002977f, 0.976562f, 0.003069f, 0.971191f, 0.003185f, + 0.964355f, 0.003281f, 0.957520f, 0.003384f, 0.951660f, 0.003483f, 0.944824f, 0.003569f, + 0.937012f, 0.003643f, 0.927734f, 0.003712f, 0.917480f, 0.003765f, 0.906250f, 0.003805f, + 0.893555f, 0.003834f, 0.880859f, 0.003847f, 0.867188f, 0.003847f, 0.852539f, 0.003832f, + 0.836914f, 0.003803f, 0.820312f, 0.003761f, 0.803223f, 0.003710f, 0.785645f, 0.003643f, + 0.767090f, 0.003569f, 0.748535f, 0.003485f, 0.729004f, 0.003395f, 0.709473f, 0.003296f, + 0.689453f, 0.003193f, 0.668945f, 0.003084f, 0.648438f, 0.002974f, 0.627930f, 0.002861f, + 0.607422f, 0.002747f, 0.586914f, 0.002632f, 0.566406f, 0.002518f, 0.545898f, 0.002403f, + 0.525879f, 0.002293f, 0.505859f, 0.002184f, 0.486572f, 0.002075f, 0.467041f, 0.001972f, + 0.447998f, 0.001871f, 0.429443f, 0.001774f, 0.411377f, 0.001679f, 0.393555f, 0.001589f, + 0.376221f, 0.001502f, 0.359375f, 0.001419f, 0.343262f, 0.001340f, 0.327393f, 0.001265f, + 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, + 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002434f, 0.997070f, 0.002443f, + 0.997070f, 0.002462f, 0.997070f, 0.002489f, 0.997070f, 0.002529f, 0.997070f, 0.002583f, + 0.997070f, 0.002655f, 0.996582f, 0.002747f, 0.995605f, 0.002827f, 0.993652f, 0.002840f, + 0.992188f, 0.002918f, 0.991211f, 0.003027f, 0.989746f, 0.003151f, 0.986816f, 0.003223f, + 0.984375f, 0.003344f, 0.980957f, 0.003462f, 0.976074f, 0.003563f, 0.970703f, 0.003677f, + 0.963867f, 0.003782f, 0.956055f, 0.003876f, 0.950195f, 0.003975f, 0.943359f, 0.004063f, + 0.935547f, 0.004135f, 0.926270f, 0.004196f, 0.916016f, 0.004242f, 0.904785f, 0.004276f, + 0.892090f, 0.004292f, 0.878418f, 0.004292f, 0.865234f, 0.004280f, 0.850586f, 0.004253f, + 0.834961f, 0.004208f, 0.818359f, 0.004150f, 0.801758f, 0.004082f, 0.784180f, 0.004002f, + 0.765625f, 0.003910f, 0.747070f, 0.003811f, 0.728027f, 0.003702f, 0.708496f, 0.003590f, + 0.688477f, 0.003469f, 0.668457f, 0.003345f, 0.648438f, 0.003220f, 0.627930f, 0.003092f, + 0.607422f, 0.002964f, 0.587402f, 0.002834f, 0.566895f, 0.002708f, 0.546875f, 0.002583f, + 0.526855f, 0.002459f, 0.506836f, 0.002338f, 0.487549f, 0.002222f, 0.468506f, 0.002108f, + 0.449463f, 0.001997f, 0.431152f, 0.001892f, 0.413086f, 0.001790f, 0.395264f, 0.001692f, + 0.378174f, 0.001598f, 0.361328f, 0.001509f, 0.345215f, 0.001423f, 0.329346f, 0.001342f, + 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, + 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002928f, 0.996582f, 0.002937f, + 0.996582f, 0.002958f, 0.996582f, 0.002989f, 0.996582f, 0.003033f, 0.996582f, 0.003092f, + 0.996094f, 0.003170f, 0.996094f, 0.003271f, 0.994629f, 0.003317f, 0.992676f, 0.003361f, + 0.991699f, 0.003448f, 0.990723f, 0.003571f, 0.988770f, 0.003695f, 0.985840f, 0.003771f, + 0.983398f, 0.003902f, 0.979980f, 0.004005f, 0.975586f, 0.004128f, 0.969727f, 0.004230f, + 0.963379f, 0.004345f, 0.955078f, 0.004440f, 0.948730f, 0.004532f, 0.941406f, 0.004616f, + 0.933594f, 0.004684f, 0.924805f, 0.004738f, 0.914551f, 0.004780f, 0.902832f, 0.004799f, + 0.890625f, 0.004803f, 0.876953f, 0.004791f, 0.863281f, 0.004761f, 0.848633f, 0.004719f, + 0.833496f, 0.004658f, 0.816895f, 0.004585f, 0.799805f, 0.004494f, 0.782227f, 0.004395f, + 0.764160f, 0.004284f, 0.745605f, 0.004166f, 0.726562f, 0.004040f, 0.707520f, 0.003906f, + 0.687500f, 0.003769f, 0.667969f, 0.003630f, 0.647949f, 0.003487f, 0.627930f, 0.003344f, + 0.607422f, 0.003199f, 0.587402f, 0.003056f, 0.567383f, 0.002914f, 0.547363f, 0.002777f, + 0.527832f, 0.002640f, 0.507812f, 0.002508f, 0.488770f, 0.002380f, 0.469727f, 0.002256f, + 0.451172f, 0.002136f, 0.432861f, 0.002020f, 0.414795f, 0.001909f, 0.397217f, 0.001803f, + 0.380127f, 0.001701f, 0.363525f, 0.001605f, 0.347168f, 0.001513f, 0.331543f, 0.001425f, + 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, + 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003502f, 0.996094f, 0.003513f, + 0.996094f, 0.003536f, 0.996094f, 0.003571f, 0.996094f, 0.003618f, 0.995605f, 0.003683f, + 0.995605f, 0.003769f, 0.995117f, 0.003878f, 0.993652f, 0.003906f, 0.992188f, 0.003963f, + 0.991211f, 0.004066f, 0.989746f, 0.004196f, 0.987793f, 0.004307f, 0.985352f, 0.004402f, + 0.982422f, 0.004539f, 0.978516f, 0.004639f, 0.974609f, 0.004772f, 0.969238f, 0.004875f, + 0.962402f, 0.004986f, 0.954590f, 0.005085f, 0.946777f, 0.005165f, 0.939941f, 0.005241f, + 0.931641f, 0.005302f, 0.922852f, 0.005348f, 0.912598f, 0.005375f, 0.901367f, 0.005383f, + 0.888672f, 0.005375f, 0.875000f, 0.005344f, 0.860840f, 0.005295f, 0.846680f, 0.005234f, + 0.831543f, 0.005154f, 0.814941f, 0.005058f, 0.797852f, 0.004948f, 0.780762f, 0.004826f, + 0.762695f, 0.004696f, 0.744141f, 0.004555f, 0.725586f, 0.004406f, 0.706543f, 0.004253f, + 0.687012f, 0.004097f, 0.666992f, 0.003937f, 0.647461f, 0.003777f, 0.627441f, 0.003614f, + 0.607422f, 0.003454f, 0.587891f, 0.003296f, 0.567871f, 0.003139f, 0.548340f, 0.002985f, + 0.528320f, 0.002836f, 0.509277f, 0.002691f, 0.490234f, 0.002550f, 0.471191f, 0.002415f, + 0.452637f, 0.002283f, 0.434570f, 0.002157f, 0.416748f, 0.002037f, 0.399170f, 0.001924f, + 0.382080f, 0.001813f, 0.365723f, 0.001709f, 0.349365f, 0.001610f, 0.333740f, 0.001515f, + 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, + 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004169f, 0.995605f, 0.004181f, + 0.995605f, 0.004208f, 0.995605f, 0.004242f, 0.995117f, 0.004295f, 0.995117f, 0.004368f, + 0.995117f, 0.004463f, 0.994629f, 0.004578f, 0.992676f, 0.004589f, 0.991211f, 0.004662f, + 0.990234f, 0.004776f, 0.989258f, 0.004917f, 0.986816f, 0.005005f, 0.984375f, 0.005127f, + 0.981445f, 0.005268f, 0.978027f, 0.005371f, 0.973633f, 0.005497f, 0.968262f, 0.005608f, + 0.961426f, 0.005707f, 0.953613f, 0.005806f, 0.944824f, 0.005886f, 0.937500f, 0.005951f, + 0.929688f, 0.006004f, 0.920898f, 0.006035f, 0.910645f, 0.006046f, 0.899414f, 0.006035f, + 0.886719f, 0.006004f, 0.873047f, 0.005959f, 0.858887f, 0.005886f, 0.844238f, 0.005798f, + 0.829102f, 0.005695f, 0.812988f, 0.005577f, 0.796387f, 0.005447f, 0.778809f, 0.005299f, + 0.761230f, 0.005142f, 0.743164f, 0.004978f, 0.724121f, 0.004810f, 0.705078f, 0.004631f, + 0.686035f, 0.004452f, 0.666504f, 0.004272f, 0.646973f, 0.004089f, 0.627441f, 0.003910f, + 0.607910f, 0.003731f, 0.587891f, 0.003555f, 0.568359f, 0.003382f, 0.548828f, 0.003212f, + 0.529785f, 0.003048f, 0.510254f, 0.002888f, 0.491455f, 0.002735f, 0.472900f, 0.002586f, + 0.454590f, 0.002443f, 0.436523f, 0.002308f, 0.418701f, 0.002176f, 0.401367f, 0.002052f, + 0.384277f, 0.001934f, 0.367920f, 0.001822f, 0.351807f, 0.001714f, 0.336182f, 0.001612f, + 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, + 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004940f, 0.994629f, 0.004955f, + 0.994629f, 0.004982f, 0.994629f, 0.005024f, 0.994629f, 0.005081f, 0.994141f, 0.005161f, + 0.994141f, 0.005260f, 0.993652f, 0.005379f, 0.991699f, 0.005383f, 0.990234f, 0.005470f, + 0.989258f, 0.005592f, 0.987793f, 0.005741f, 0.985352f, 0.005825f, 0.983398f, 0.005959f, + 0.979980f, 0.006084f, 0.976562f, 0.006207f, 0.972168f, 0.006317f, 0.966797f, 0.006439f, + 0.960449f, 0.006535f, 0.952637f, 0.006615f, 0.943359f, 0.006687f, 0.935547f, 0.006744f, + 0.927246f, 0.006783f, 0.918457f, 0.006798f, 0.908203f, 0.006790f, 0.896973f, 0.006763f, + 0.884766f, 0.006710f, 0.871094f, 0.006634f, 0.856445f, 0.006542f, 0.841797f, 0.006428f, + 0.826660f, 0.006298f, 0.811035f, 0.006153f, 0.794434f, 0.005989f, 0.776855f, 0.005817f, + 0.759277f, 0.005634f, 0.741211f, 0.005444f, 0.723145f, 0.005245f, 0.704102f, 0.005043f, + 0.685059f, 0.004841f, 0.666016f, 0.004639f, 0.646484f, 0.004433f, 0.627441f, 0.004230f, + 0.607910f, 0.004032f, 0.588379f, 0.003836f, 0.569336f, 0.003645f, 0.549805f, 0.003458f, + 0.530762f, 0.003277f, 0.511719f, 0.003101f, 0.493164f, 0.002934f, 0.474609f, 0.002771f, + 0.456299f, 0.002617f, 0.438477f, 0.002468f, 0.420898f, 0.002327f, 0.403564f, 0.002192f, + 0.386719f, 0.002064f, 0.370361f, 0.001942f, 0.354248f, 0.001826f, 0.338623f, 0.001718f, + 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, + 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005836f, 0.993652f, 0.005852f, + 0.993652f, 0.005882f, 0.993652f, 0.005924f, 0.993652f, 0.005989f, 0.993164f, 0.006073f, + 0.993164f, 0.006184f, 0.992188f, 0.006290f, 0.990234f, 0.006298f, 0.989258f, 0.006393f, + 0.988281f, 0.006535f, 0.986816f, 0.006680f, 0.984375f, 0.006763f, 0.981934f, 0.006912f, + 0.979004f, 0.007019f, 0.975098f, 0.007156f, 0.970703f, 0.007259f, 0.965332f, 0.007370f, + 0.958984f, 0.007465f, 0.951172f, 0.007542f, 0.942383f, 0.007599f, 0.933105f, 0.007641f, + 0.924805f, 0.007656f, 0.916016f, 0.007652f, 0.905762f, 0.007622f, 0.894531f, 0.007568f, + 0.882324f, 0.007492f, 0.868652f, 0.007389f, 0.854492f, 0.007267f, 0.839355f, 0.007122f, + 0.824219f, 0.006958f, 0.808594f, 0.006779f, 0.792480f, 0.006588f, 0.774902f, 0.006382f, + 0.757324f, 0.006168f, 0.739746f, 0.005951f, 0.721680f, 0.005722f, 0.703125f, 0.005493f, + 0.684082f, 0.005264f, 0.665527f, 0.005032f, 0.646484f, 0.004803f, 0.627441f, 0.004578f, + 0.607910f, 0.004356f, 0.588867f, 0.004139f, 0.569824f, 0.003925f, 0.550781f, 0.003723f, + 0.531738f, 0.003525f, 0.513184f, 0.003332f, 0.494629f, 0.003149f, 0.476318f, 0.002974f, + 0.458252f, 0.002804f, 0.440430f, 0.002644f, 0.423096f, 0.002489f, 0.406006f, 0.002344f, + 0.389160f, 0.002205f, 0.372803f, 0.002073f, 0.356689f, 0.001949f, 0.341309f, 0.001831f, + 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, + 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006866f, 0.992676f, 0.006882f, + 0.992676f, 0.006916f, 0.992676f, 0.006966f, 0.992676f, 0.007034f, 0.992188f, 0.007126f, + 0.992188f, 0.007244f, 0.990723f, 0.007305f, 0.989258f, 0.007351f, 0.988281f, 0.007465f, + 0.987305f, 0.007610f, 0.985352f, 0.007732f, 0.982910f, 0.007843f, 0.980469f, 0.007988f, + 0.977051f, 0.008095f, 0.973633f, 0.008224f, 0.969238f, 0.008331f, 0.963867f, 0.008423f, + 0.957520f, 0.008507f, 0.949707f, 0.008575f, 0.940430f, 0.008621f, 0.930664f, 0.008636f, + 0.922363f, 0.008629f, 0.913086f, 0.008606f, 0.902832f, 0.008545f, 0.891602f, 0.008461f, + 0.879395f, 0.008354f, 0.866211f, 0.008217f, 0.852051f, 0.008057f, 0.836914f, 0.007881f, + 0.821777f, 0.007683f, 0.806152f, 0.007469f, 0.790039f, 0.007244f, 0.772949f, 0.007000f, + 0.755859f, 0.006756f, 0.737793f, 0.006500f, 0.720215f, 0.006241f, 0.702148f, 0.005981f, + 0.683594f, 0.005722f, 0.664551f, 0.005463f, 0.645996f, 0.005207f, 0.627441f, 0.004955f, + 0.608398f, 0.004707f, 0.589355f, 0.004467f, 0.570312f, 0.004234f, 0.551758f, 0.004009f, + 0.533203f, 0.003792f, 0.514648f, 0.003582f, 0.496338f, 0.003382f, 0.478271f, 0.003189f, + 0.460205f, 0.003006f, 0.442627f, 0.002831f, 0.425293f, 0.002665f, 0.408203f, 0.002506f, + 0.391602f, 0.002356f, 0.375488f, 0.002214f, 0.359619f, 0.002079f, 0.343994f, 0.001952f, + 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, + 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008049f, 0.991699f, 0.008064f, + 0.991699f, 0.008102f, 0.991211f, 0.008156f, 0.991211f, 0.008232f, 0.991211f, 0.008331f, + 0.990723f, 0.008461f, 0.989258f, 0.008492f, 0.987793f, 0.008560f, 0.986816f, 0.008682f, + 0.985840f, 0.008842f, 0.983398f, 0.008934f, 0.981445f, 0.009071f, 0.979004f, 0.009209f, + 0.975586f, 0.009323f, 0.971680f, 0.009430f, 0.967285f, 0.009544f, 0.961914f, 0.009628f, + 0.955566f, 0.009697f, 0.947754f, 0.009743f, 0.938965f, 0.009766f, 0.928711f, 0.009758f, + 0.919434f, 0.009727f, 0.910156f, 0.009666f, 0.899902f, 0.009575f, 0.888672f, 0.009460f, + 0.876953f, 0.009308f, 0.863770f, 0.009132f, 0.849609f, 0.008934f, 0.834473f, 0.008720f, + 0.818848f, 0.008476f, 0.803223f, 0.008224f, 0.787598f, 0.007957f, 0.770996f, 0.007679f, + 0.753906f, 0.007393f, 0.736328f, 0.007099f, 0.718750f, 0.006805f, 0.700684f, 0.006512f, + 0.682617f, 0.006218f, 0.664062f, 0.005928f, 0.645508f, 0.005642f, 0.627441f, 0.005360f, + 0.608398f, 0.005089f, 0.589844f, 0.004822f, 0.571289f, 0.004566f, 0.552734f, 0.004318f, + 0.534668f, 0.004078f, 0.516113f, 0.003851f, 0.498047f, 0.003633f, 0.480225f, 0.003424f, + 0.462402f, 0.003223f, 0.445068f, 0.003035f, 0.427734f, 0.002853f, 0.410889f, 0.002682f, + 0.394287f, 0.002520f, 0.378174f, 0.002367f, 0.362305f, 0.002222f, 0.346924f, 0.002085f, + 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, + 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009415f, 0.990234f, 0.009430f, + 0.990234f, 0.009476f, 0.990234f, 0.009529f, 0.989746f, 0.009613f, 0.989746f, 0.009720f, + 0.989258f, 0.009857f, 0.987305f, 0.009865f, 0.986328f, 0.009949f, 0.985352f, 0.010078f, + 0.983887f, 0.010246f, 0.981934f, 0.010330f, 0.979980f, 0.010483f, 0.977051f, 0.010590f, + 0.973633f, 0.010719f, 0.969727f, 0.010811f, 0.965332f, 0.010910f, 0.959961f, 0.010986f, + 0.953613f, 0.011032f, 0.945801f, 0.011055f, 0.937012f, 0.011055f, 0.926758f, 0.011017f, + 0.916016f, 0.010948f, 0.906738f, 0.010849f, 0.896484f, 0.010719f, 0.885742f, 0.010559f, + 0.873535f, 0.010368f, 0.860352f, 0.010147f, 0.846680f, 0.009903f, 0.832031f, 0.009636f, + 0.816406f, 0.009354f, 0.800781f, 0.009048f, 0.785156f, 0.008736f, 0.768555f, 0.008415f, + 0.751953f, 0.008087f, 0.734863f, 0.007751f, 0.717285f, 0.007420f, 0.699707f, 0.007088f, + 0.681641f, 0.006756f, 0.663574f, 0.006432f, 0.645508f, 0.006111f, 0.627441f, 0.005802f, + 0.608887f, 0.005501f, 0.590332f, 0.005207f, 0.572266f, 0.004925f, 0.554199f, 0.004654f, + 0.535645f, 0.004391f, 0.517578f, 0.004143f, 0.500000f, 0.003904f, 0.482178f, 0.003675f, + 0.464844f, 0.003458f, 0.447510f, 0.003254f, 0.430420f, 0.003057f, 0.413574f, 0.002872f, + 0.397217f, 0.002697f, 0.381104f, 0.002531f, 0.365234f, 0.002375f, 0.349854f, 0.002228f, + 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, + 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.010979f, 0.988770f, 0.011002f, + 0.988770f, 0.011040f, 0.988281f, 0.011108f, 0.988281f, 0.011192f, 0.987793f, 0.011314f, + 0.987305f, 0.011444f, 0.985840f, 0.011436f, 0.984375f, 0.011536f, 0.983398f, 0.011688f, + 0.981934f, 0.011833f, 0.979980f, 0.011925f, 0.978027f, 0.012077f, 0.974609f, 0.012169f, + 0.971680f, 0.012291f, 0.967773f, 0.012383f, 0.962891f, 0.012451f, 0.957520f, 0.012505f, + 0.951172f, 0.012527f, 0.943359f, 0.012527f, 0.934570f, 0.012489f, 0.924316f, 0.012421f, + 0.913574f, 0.012306f, 0.902832f, 0.012161f, 0.893066f, 0.011986f, 0.881836f, 0.011772f, + 0.870117f, 0.011536f, 0.857422f, 0.011261f, 0.843750f, 0.010963f, 0.829102f, 0.010643f, + 0.813477f, 0.010307f, 0.797852f, 0.009949f, 0.782227f, 0.009590f, 0.766113f, 0.009216f, + 0.750000f, 0.008842f, 0.732910f, 0.008461f, 0.715820f, 0.008080f, 0.698242f, 0.007710f, + 0.680664f, 0.007339f, 0.663086f, 0.006977f, 0.645020f, 0.006622f, 0.627441f, 0.006279f, + 0.609375f, 0.005943f, 0.591309f, 0.005623f, 0.573242f, 0.005310f, 0.555176f, 0.005013f, + 0.537598f, 0.004730f, 0.519531f, 0.004456f, 0.501953f, 0.004196f, 0.484375f, 0.003948f, + 0.467041f, 0.003714f, 0.449951f, 0.003490f, 0.433105f, 0.003277f, 0.416504f, 0.003077f, + 0.400146f, 0.002888f, 0.384033f, 0.002708f, 0.368408f, 0.002541f, 0.353271f, 0.002382f, + 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, + 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012772f, 0.986816f, 0.012794f, + 0.986816f, 0.012840f, 0.986816f, 0.012909f, 0.986328f, 0.013008f, 0.986328f, 0.013130f, + 0.985352f, 0.013252f, 0.983398f, 0.013237f, 0.982422f, 0.013359f, 0.981445f, 0.013519f, + 0.979492f, 0.013626f, 0.977539f, 0.013741f, 0.975586f, 0.013885f, 0.972656f, 0.013977f, + 0.969238f, 0.014069f, 0.964844f, 0.014153f, 0.960449f, 0.014198f, 0.954590f, 0.014221f, + 0.948242f, 0.014214f, 0.940918f, 0.014175f, 0.932129f, 0.014099f, 0.921875f, 0.013977f, + 0.910645f, 0.013817f, 0.899414f, 0.013626f, 0.889160f, 0.013390f, 0.877930f, 0.013123f, + 0.866211f, 0.012817f, 0.853516f, 0.012489f, 0.840332f, 0.012131f, 0.825684f, 0.011749f, + 0.811035f, 0.011353f, 0.795410f, 0.010941f, 0.779297f, 0.010513f, 0.763672f, 0.010086f, + 0.747559f, 0.009659f, 0.730957f, 0.009224f, 0.714355f, 0.008804f, 0.697266f, 0.008377f, + 0.679688f, 0.007973f, 0.662598f, 0.007565f, 0.645020f, 0.007175f, 0.627441f, 0.006794f, + 0.609863f, 0.006424f, 0.592285f, 0.006069f, 0.574219f, 0.005730f, 0.556641f, 0.005405f, + 0.539062f, 0.005093f, 0.521484f, 0.004795f, 0.503906f, 0.004513f, 0.486816f, 0.004242f, + 0.469727f, 0.003986f, 0.452637f, 0.003746f, 0.436035f, 0.003515f, 0.419434f, 0.003300f, + 0.403320f, 0.003094f, 0.387451f, 0.002901f, 0.371826f, 0.002720f, 0.356445f, 0.002548f, + 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, + 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014832f, 0.984863f, 0.014854f, + 0.984863f, 0.014908f, 0.984375f, 0.014977f, 0.984375f, 0.015083f, 0.983887f, 0.015213f, + 0.982910f, 0.015266f, 0.981445f, 0.015312f, 0.980469f, 0.015427f, 0.979492f, 0.015602f, + 0.977051f, 0.015671f, 0.975586f, 0.015808f, 0.972656f, 0.015915f, 0.969727f, 0.016022f, + 0.966309f, 0.016083f, 0.962402f, 0.016129f, 0.957520f, 0.016159f, 0.951660f, 0.016159f, + 0.945312f, 0.016113f, 0.937500f, 0.016022f, 0.928711f, 0.015884f, 0.918945f, 0.015717f, + 0.907715f, 0.015503f, 0.895996f, 0.015244f, 0.884766f, 0.014954f, 0.874023f, 0.014610f, + 0.862305f, 0.014236f, 0.849609f, 0.013840f, 0.836426f, 0.013405f, 0.822754f, 0.012955f, + 0.808105f, 0.012489f, 0.792480f, 0.012016f, 0.776855f, 0.011528f, 0.760742f, 0.011040f, + 0.745605f, 0.010551f, 0.729492f, 0.010063f, 0.712891f, 0.009583f, 0.695801f, 0.009109f, + 0.679199f, 0.008652f, 0.662109f, 0.008202f, 0.645020f, 0.007771f, 0.627930f, 0.007351f, + 0.610352f, 0.006947f, 0.592773f, 0.006554f, 0.575684f, 0.006184f, 0.558105f, 0.005825f, + 0.540527f, 0.005486f, 0.523438f, 0.005161f, 0.506348f, 0.004852f, 0.489258f, 0.004559f, + 0.472412f, 0.004284f, 0.455566f, 0.004021f, 0.438965f, 0.003773f, 0.422607f, 0.003538f, + 0.406494f, 0.003317f, 0.390625f, 0.003109f, 0.375244f, 0.002913f, 0.360107f, 0.002729f, + 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, + 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017181f, 0.982422f, 0.017212f, + 0.982422f, 0.017258f, 0.981934f, 0.017349f, 0.981934f, 0.017456f, 0.981445f, 0.017593f, + 0.979980f, 0.017609f, 0.978516f, 0.017670f, 0.978027f, 0.017807f, 0.976562f, 0.017960f, + 0.974609f, 0.018021f, 0.972656f, 0.018173f, 0.969727f, 0.018234f, 0.966797f, 0.018326f, + 0.963379f, 0.018372f, 0.958984f, 0.018402f, 0.954102f, 0.018387f, 0.948242f, 0.018326f, + 0.941895f, 0.018234f, 0.934082f, 0.018097f, 0.925293f, 0.017899f, 0.915527f, 0.017654f, + 0.904297f, 0.017365f, 0.892578f, 0.017029f, 0.880371f, 0.016663f, 0.869629f, 0.016251f, + 0.857910f, 0.015793f, 0.845703f, 0.015320f, 0.832520f, 0.014801f, 0.818848f, 0.014282f, + 0.804688f, 0.013733f, 0.789551f, 0.013184f, 0.774414f, 0.012627f, 0.758301f, 0.012070f, + 0.742676f, 0.011520f, 0.727539f, 0.010971f, 0.711426f, 0.010429f, 0.694824f, 0.009903f, + 0.678223f, 0.009392f, 0.661621f, 0.008896f, 0.645020f, 0.008415f, 0.627930f, 0.007950f, + 0.610840f, 0.007507f, 0.593750f, 0.007080f, 0.576660f, 0.006672f, 0.559570f, 0.006283f, + 0.542480f, 0.005909f, 0.525391f, 0.005558f, 0.508789f, 0.005222f, 0.491943f, 0.004906f, + 0.475098f, 0.004604f, 0.458496f, 0.004318f, 0.442139f, 0.004051f, 0.426025f, 0.003798f, + 0.409912f, 0.003559f, 0.394287f, 0.003334f, 0.378906f, 0.003122f, 0.363770f, 0.002924f, + 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, + 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019882f, 0.979980f, 0.019913f, + 0.979492f, 0.019958f, 0.979492f, 0.020050f, 0.979004f, 0.020172f, 0.978516f, 0.020309f, + 0.977051f, 0.020294f, 0.976074f, 0.020370f, 0.975098f, 0.020523f, 0.973633f, 0.020645f, + 0.971680f, 0.020706f, 0.969238f, 0.020828f, 0.966797f, 0.020889f, 0.963379f, 0.020935f, + 0.959961f, 0.020966f, 0.955566f, 0.020950f, 0.950684f, 0.020889f, 0.944824f, 0.020782f, + 0.937988f, 0.020615f, 0.930176f, 0.020401f, 0.921387f, 0.020142f, 0.911621f, 0.019821f, + 0.900879f, 0.019455f, 0.888672f, 0.019028f, 0.876465f, 0.018555f, 0.864746f, 0.018051f, + 0.853027f, 0.017502f, 0.841309f, 0.016937f, 0.828125f, 0.016327f, 0.814941f, 0.015717f, + 0.801270f, 0.015091f, 0.786621f, 0.014465f, 0.771484f, 0.013824f, 0.756348f, 0.013191f, + 0.740723f, 0.012566f, 0.725098f, 0.011955f, 0.709961f, 0.011353f, 0.693848f, 0.010765f, + 0.677734f, 0.010193f, 0.661133f, 0.009644f, 0.644531f, 0.009109f, 0.628418f, 0.008598f, + 0.611816f, 0.008110f, 0.595215f, 0.007645f, 0.578125f, 0.007198f, 0.561523f, 0.006775f, + 0.544922f, 0.006367f, 0.527832f, 0.005985f, 0.511230f, 0.005619f, 0.494629f, 0.005276f, + 0.478027f, 0.004948f, 0.461670f, 0.004642f, 0.445557f, 0.004349f, 0.429443f, 0.004078f, + 0.413574f, 0.003820f, 0.397949f, 0.003576f, 0.382568f, 0.003349f, 0.367676f, 0.003136f, + 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, + 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022964f, 0.976562f, 0.022995f, + 0.976562f, 0.023056f, 0.976074f, 0.023148f, 0.976074f, 0.023270f, 0.975586f, 0.023407f, + 0.973633f, 0.023361f, 0.972656f, 0.023453f, 0.971680f, 0.023590f, 0.969727f, 0.023666f, + 0.968262f, 0.023773f, 0.965820f, 0.023834f, 0.962891f, 0.023895f, 0.959473f, 0.023895f, + 0.956055f, 0.023880f, 0.951172f, 0.023804f, 0.946289f, 0.023682f, 0.940430f, 0.023514f, + 0.933594f, 0.023285f, 0.925781f, 0.022980f, 0.917480f, 0.022629f, 0.907715f, 0.022217f, + 0.896973f, 0.021744f, 0.884766f, 0.021210f, 0.872070f, 0.020645f, 0.859375f, 0.020035f, + 0.848145f, 0.019379f, 0.836426f, 0.018707f, 0.823730f, 0.018005f, 0.811035f, 0.017288f, + 0.797363f, 0.016571f, 0.783203f, 0.015854f, 0.768555f, 0.015121f, 0.753906f, 0.014412f, + 0.738281f, 0.013702f, 0.723145f, 0.013016f, 0.708008f, 0.012344f, 0.692871f, 0.011688f, + 0.677246f, 0.011063f, 0.661133f, 0.010452f, 0.645020f, 0.009865f, 0.628906f, 0.009308f, + 0.612793f, 0.008766f, 0.596191f, 0.008255f, 0.580078f, 0.007771f, 0.563477f, 0.007305f, + 0.546875f, 0.006863f, 0.530273f, 0.006447f, 0.513672f, 0.006050f, 0.497559f, 0.005676f, + 0.481201f, 0.005325f, 0.465088f, 0.004990f, 0.448975f, 0.004677f, 0.433105f, 0.004379f, + 0.417236f, 0.004101f, 0.401855f, 0.003841f, 0.386475f, 0.003595f, 0.371582f, 0.003365f, + 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, + 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026489f, 0.973145f, 0.026535f, + 0.973145f, 0.026596f, 0.972656f, 0.026688f, 0.972168f, 0.026825f, 0.971680f, 0.026901f, + 0.969727f, 0.026871f, 0.968750f, 0.026978f, 0.967773f, 0.027130f, 0.965820f, 0.027145f, + 0.963867f, 0.027252f, 0.961426f, 0.027252f, 0.958984f, 0.027283f, 0.955566f, 0.027267f, + 0.951660f, 0.027176f, 0.946777f, 0.027039f, 0.941406f, 0.026855f, 0.935547f, 0.026581f, + 0.928711f, 0.026260f, 0.920898f, 0.025864f, 0.912598f, 0.025406f, 0.902832f, 0.024872f, + 0.892090f, 0.024277f, 0.880371f, 0.023636f, 0.868164f, 0.022934f, 0.854980f, 0.022217f, + 0.842285f, 0.021439f, 0.831055f, 0.020645f, 0.818848f, 0.019821f, 0.806641f, 0.019012f, + 0.793457f, 0.018173f, 0.779785f, 0.017349f, 0.765625f, 0.016525f, 0.750977f, 0.015732f, + 0.736328f, 0.014938f, 0.721191f, 0.014168f, 0.706055f, 0.013420f, 0.691406f, 0.012695f, + 0.676270f, 0.011993f, 0.661133f, 0.011322f, 0.645508f, 0.010681f, 0.629395f, 0.010063f, + 0.613281f, 0.009476f, 0.597656f, 0.008919f, 0.581543f, 0.008385f, 0.565430f, 0.007874f, + 0.548828f, 0.007401f, 0.532715f, 0.006947f, 0.516602f, 0.006516f, 0.500488f, 0.006111f, + 0.484375f, 0.005726f, 0.468506f, 0.005367f, 0.452637f, 0.005028f, 0.436768f, 0.004707f, + 0.421387f, 0.004410f, 0.406006f, 0.004128f, 0.390625f, 0.003860f, 0.375977f, 0.003613f, + 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, + 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030533f, 0.969238f, 0.030579f, + 0.968750f, 0.030640f, 0.968750f, 0.030746f, 0.968262f, 0.030884f, 0.966797f, 0.030869f, + 0.965820f, 0.030884f, 0.964844f, 0.030991f, 0.963379f, 0.031128f, 0.961426f, 0.031113f, + 0.959473f, 0.031174f, 0.957031f, 0.031158f, 0.954102f, 0.031113f, 0.950684f, 0.031036f, + 0.946289f, 0.030899f, 0.941895f, 0.030685f, 0.936523f, 0.030396f, 0.930176f, 0.030029f, + 0.923340f, 0.029587f, 0.915527f, 0.029083f, 0.907227f, 0.028488f, 0.897461f, 0.027817f, + 0.887207f, 0.027084f, 0.875488f, 0.026306f, 0.863281f, 0.025467f, 0.850586f, 0.024597f, + 0.837402f, 0.023697f, 0.825195f, 0.022766f, 0.813965f, 0.021820f, 0.801758f, 0.020874f, + 0.789062f, 0.019928f, 0.775879f, 0.018982f, 0.762695f, 0.018066f, 0.748535f, 0.017151f, + 0.734375f, 0.016266f, 0.719727f, 0.015411f, 0.705078f, 0.014580f, 0.689941f, 0.013779f, + 0.675781f, 0.013008f, 0.660645f, 0.012268f, 0.645508f, 0.011559f, 0.630371f, 0.010887f, + 0.614746f, 0.010239f, 0.599121f, 0.009628f, 0.583496f, 0.009048f, 0.567383f, 0.008499f, + 0.551758f, 0.007973f, 0.535645f, 0.007484f, 0.519531f, 0.007019f, 0.503906f, 0.006580f, + 0.488037f, 0.006165f, 0.472168f, 0.005775f, 0.456543f, 0.005409f, 0.440918f, 0.005062f, + 0.425537f, 0.004738f, 0.410156f, 0.004433f, 0.395264f, 0.004150f, 0.380371f, 0.003881f, + 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, + 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035156f, 0.964355f, 0.035187f, + 0.964355f, 0.035278f, 0.963867f, 0.035370f, 0.963379f, 0.035522f, 0.961914f, 0.035431f, + 0.960938f, 0.035461f, 0.959961f, 0.035583f, 0.958496f, 0.035614f, 0.956543f, 0.035645f, + 0.954102f, 0.035614f, 0.951660f, 0.035583f, 0.948730f, 0.035492f, 0.944824f, 0.035309f, + 0.940918f, 0.035095f, 0.936035f, 0.034760f, 0.930664f, 0.034363f, 0.924316f, 0.033875f, + 0.917480f, 0.033295f, 0.909668f, 0.032623f, 0.900879f, 0.031891f, 0.891602f, 0.031082f, + 0.881348f, 0.030182f, 0.870117f, 0.029236f, 0.858398f, 0.028244f, 0.845703f, 0.027222f, + 0.832520f, 0.026154f, 0.819824f, 0.025070f, 0.808105f, 0.023987f, 0.796387f, 0.022903f, + 0.784668f, 0.021820f, 0.771973f, 0.020767f, 0.759277f, 0.019714f, 0.745605f, 0.018707f, + 0.731934f, 0.017715f, 0.718262f, 0.016754f, 0.703613f, 0.015839f, 0.689453f, 0.014954f, + 0.674805f, 0.014099f, 0.660645f, 0.013283f, 0.645996f, 0.012512f, 0.631348f, 0.011772f, + 0.615723f, 0.011063f, 0.600586f, 0.010399f, 0.584961f, 0.009766f, 0.569824f, 0.009171f, + 0.554199f, 0.008598f, 0.538574f, 0.008064f, 0.522949f, 0.007565f, 0.507324f, 0.007088f, + 0.491699f, 0.006641f, 0.476074f, 0.006218f, 0.460449f, 0.005821f, 0.445068f, 0.005447f, + 0.429932f, 0.005100f, 0.414795f, 0.004768f, 0.399658f, 0.004459f, 0.385010f, 0.004173f, + 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, + 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040466f, 0.958984f, 0.040497f, + 0.958984f, 0.040558f, 0.958496f, 0.040680f, 0.958008f, 0.040802f, 0.956543f, 0.040680f, + 0.955566f, 0.040741f, 0.954590f, 0.040833f, 0.952637f, 0.040771f, 0.951172f, 0.040802f, + 0.948730f, 0.040710f, 0.945801f, 0.040588f, 0.942383f, 0.040436f, 0.938965f, 0.040161f, + 0.934570f, 0.039825f, 0.929199f, 0.039368f, 0.923828f, 0.038818f, 0.917480f, 0.038177f, + 0.910645f, 0.037445f, 0.902832f, 0.036621f, 0.894531f, 0.035675f, 0.885254f, 0.034668f, + 0.875000f, 0.033600f, 0.864258f, 0.032471f, 0.852539f, 0.031281f, 0.840332f, 0.030075f, + 0.827637f, 0.028839f, 0.814941f, 0.027588f, 0.802246f, 0.026337f, 0.791016f, 0.025116f, + 0.779785f, 0.023880f, 0.768066f, 0.022690f, 0.755859f, 0.021515f, 0.743164f, 0.020370f, + 0.729980f, 0.019272f, 0.716309f, 0.018219f, 0.702637f, 0.017181f, 0.688965f, 0.016220f, + 0.674316f, 0.015282f, 0.660645f, 0.014389f, 0.646484f, 0.013535f, 0.631836f, 0.012726f, + 0.617676f, 0.011963f, 0.602539f, 0.011230f, 0.587402f, 0.010544f, 0.572266f, 0.009895f, + 0.557129f, 0.009277f, 0.541992f, 0.008698f, 0.526367f, 0.008148f, 0.510742f, 0.007637f, + 0.495605f, 0.007153f, 0.480225f, 0.006699f, 0.464844f, 0.006268f, 0.449463f, 0.005867f, + 0.434326f, 0.005489f, 0.419434f, 0.005135f, 0.404541f, 0.004803f, 0.389893f, 0.004490f, + 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, + 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046539f, 0.953125f, 0.046570f, + 0.952637f, 0.046661f, 0.952637f, 0.046753f, 0.951660f, 0.046844f, 0.950195f, 0.046692f, + 0.949219f, 0.046753f, 0.948242f, 0.046814f, 0.946289f, 0.046722f, 0.944336f, 0.046661f, + 0.941895f, 0.046539f, 0.938965f, 0.046295f, 0.935547f, 0.045990f, 0.931641f, 0.045624f, + 0.927246f, 0.045135f, 0.922363f, 0.044525f, 0.916504f, 0.043823f, 0.910156f, 0.042999f, + 0.902832f, 0.042023f, 0.895508f, 0.041016f, 0.887207f, 0.039856f, 0.877930f, 0.038635f, + 0.868164f, 0.037354f, 0.857910f, 0.036011f, 0.846680f, 0.034607f, 0.834961f, 0.033203f, + 0.822266f, 0.031738f, 0.809570f, 0.030334f, 0.797363f, 0.028900f, 0.785645f, 0.027496f, + 0.774902f, 0.026123f, 0.763672f, 0.024765f, 0.751953f, 0.023453f, 0.739746f, 0.022186f, + 0.727539f, 0.020966f, 0.714844f, 0.019775f, 0.701660f, 0.018661f, 0.688477f, 0.017578f, + 0.674805f, 0.016556f, 0.660645f, 0.015572f, 0.646973f, 0.014641f, 0.633301f, 0.013756f, + 0.619141f, 0.012924f, 0.604492f, 0.012131f, 0.589844f, 0.011383f, 0.574707f, 0.010674f, + 0.560059f, 0.010010f, 0.544922f, 0.009377f, 0.529785f, 0.008789f, 0.514648f, 0.008232f, + 0.499756f, 0.007710f, 0.484375f, 0.007217f, 0.469238f, 0.006752f, 0.454346f, 0.006317f, + 0.439209f, 0.005913f, 0.424316f, 0.005531f, 0.409668f, 0.005173f, 0.395020f, 0.004837f, + 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, + 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.946289f, 0.053497f, 0.945801f, 0.053558f, + 0.945801f, 0.053619f, 0.945312f, 0.053741f, 0.944336f, 0.053680f, 0.942871f, 0.053589f, + 0.941895f, 0.053619f, 0.940918f, 0.053589f, 0.938965f, 0.053497f, 0.937012f, 0.053314f, + 0.934570f, 0.053101f, 0.931641f, 0.052765f, 0.927734f, 0.052338f, 0.923828f, 0.051788f, + 0.919434f, 0.051147f, 0.914062f, 0.050354f, 0.908203f, 0.049408f, 0.901855f, 0.048370f, + 0.895020f, 0.047180f, 0.887207f, 0.045868f, 0.878906f, 0.044495f, 0.870117f, 0.042999f, + 0.860840f, 0.041473f, 0.850586f, 0.039886f, 0.839844f, 0.038239f, 0.828613f, 0.036591f, + 0.816895f, 0.034943f, 0.804688f, 0.033295f, 0.792480f, 0.031677f, 0.780273f, 0.030075f, + 0.769531f, 0.028534f, 0.758789f, 0.027008f, 0.748047f, 0.025543f, 0.736816f, 0.024139f, + 0.725098f, 0.022781f, 0.713379f, 0.021484f, 0.700684f, 0.020233f, 0.687988f, 0.019058f, + 0.674805f, 0.017929f, 0.661621f, 0.016846f, 0.647949f, 0.015839f, 0.634277f, 0.014877f, + 0.620605f, 0.013962f, 0.606445f, 0.013100f, 0.592285f, 0.012291f, 0.578125f, 0.011520f, + 0.563477f, 0.010803f, 0.548340f, 0.010117f, 0.533691f, 0.009476f, 0.519043f, 0.008873f, + 0.503906f, 0.008308f, 0.489014f, 0.007778f, 0.474121f, 0.007278f, 0.458984f, 0.006813f, + 0.444336f, 0.006371f, 0.429688f, 0.005959f, 0.415039f, 0.005573f, 0.400391f, 0.005215f, + 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, + 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061523f, 0.937988f, 0.061554f, + 0.937500f, 0.061615f, 0.937500f, 0.061737f, 0.936035f, 0.061554f, 0.935059f, 0.061493f, + 0.934082f, 0.061523f, 0.932129f, 0.061340f, 0.930664f, 0.061218f, 0.928223f, 0.060913f, + 0.925781f, 0.060577f, 0.922852f, 0.060089f, 0.918945f, 0.059479f, 0.915039f, 0.058777f, + 0.910156f, 0.057892f, 0.904785f, 0.056854f, 0.898926f, 0.055664f, 0.892578f, 0.054321f, + 0.885742f, 0.052887f, 0.877930f, 0.051270f, 0.870117f, 0.049591f, 0.861328f, 0.047821f, + 0.852539f, 0.045990f, 0.842773f, 0.044098f, 0.832520f, 0.042206f, 0.822266f, 0.040314f, + 0.811035f, 0.038391f, 0.799316f, 0.036530f, 0.787598f, 0.034668f, 0.775879f, 0.032867f, + 0.764648f, 0.031143f, 0.753906f, 0.029449f, 0.744141f, 0.027817f, 0.733398f, 0.026245f, + 0.722656f, 0.024750f, 0.711426f, 0.023315f, 0.699707f, 0.021942f, 0.687500f, 0.020645f, + 0.675293f, 0.019409f, 0.662109f, 0.018234f, 0.649414f, 0.017120f, 0.635742f, 0.016083f, + 0.622070f, 0.015091f, 0.608887f, 0.014153f, 0.595215f, 0.013268f, 0.581055f, 0.012444f, + 0.566895f, 0.011658f, 0.552246f, 0.010918f, 0.537598f, 0.010223f, 0.522949f, 0.009575f, + 0.508301f, 0.008965f, 0.493896f, 0.008385f, 0.479004f, 0.007851f, 0.464355f, 0.007347f, + 0.449463f, 0.006874f, 0.435059f, 0.006428f, 0.420654f, 0.006012f, 0.406250f, 0.005623f, + 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, + 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070679f, 0.928711f, 0.070740f, + 0.928223f, 0.070801f, 0.928223f, 0.070923f, 0.926270f, 0.070618f, 0.925781f, 0.070557f, + 0.924805f, 0.070557f, 0.922852f, 0.070251f, 0.920898f, 0.069946f, 0.918945f, 0.069580f, + 0.916016f, 0.069092f, 0.913086f, 0.068420f, 0.909180f, 0.067627f, 0.904785f, 0.066589f, + 0.899902f, 0.065430f, 0.894531f, 0.064148f, 0.888672f, 0.062622f, 0.882324f, 0.060974f, + 0.875488f, 0.059174f, 0.867676f, 0.057251f, 0.860352f, 0.055206f, 0.852051f, 0.053070f, + 0.843262f, 0.050934f, 0.834473f, 0.048737f, 0.825195f, 0.046509f, 0.814941f, 0.044312f, + 0.804688f, 0.042145f, 0.793945f, 0.040009f, 0.783203f, 0.037933f, 0.771973f, 0.035889f, + 0.760742f, 0.033936f, 0.750000f, 0.032074f, 0.739746f, 0.030258f, 0.729980f, 0.028519f, + 0.720215f, 0.026871f, 0.709473f, 0.025284f, 0.698730f, 0.023788f, 0.687500f, 0.022369f, + 0.675781f, 0.021011f, 0.663574f, 0.019730f, 0.650879f, 0.018524f, 0.637695f, 0.017380f, + 0.624512f, 0.016296f, 0.611328f, 0.015289f, 0.597656f, 0.014328f, 0.584473f, 0.013428f, + 0.570312f, 0.012581f, 0.556641f, 0.011787f, 0.541992f, 0.011032f, 0.527832f, 0.010330f, + 0.513184f, 0.009674f, 0.498779f, 0.009048f, 0.484375f, 0.008469f, 0.469727f, 0.007927f, + 0.455322f, 0.007416f, 0.440674f, 0.006939f, 0.426270f, 0.006489f, 0.412354f, 0.006073f, + 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, + 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081299f, 0.917969f, 0.081360f, + 0.917969f, 0.081421f, 0.916992f, 0.081421f, 0.915527f, 0.081055f, 0.915039f, 0.080994f, + 0.913574f, 0.080750f, 0.912109f, 0.080444f, 0.910156f, 0.080017f, 0.907715f, 0.079468f, + 0.904785f, 0.078735f, 0.901367f, 0.077820f, 0.897461f, 0.076721f, 0.893555f, 0.075500f, + 0.888184f, 0.073975f, 0.882812f, 0.072266f, 0.876953f, 0.070374f, 0.870605f, 0.068359f, + 0.863770f, 0.066101f, 0.856934f, 0.063782f, 0.849121f, 0.061340f, 0.841797f, 0.058868f, + 0.833496f, 0.056335f, 0.825195f, 0.053741f, 0.816406f, 0.051208f, 0.807617f, 0.048676f, + 0.798340f, 0.046204f, 0.788086f, 0.043793f, 0.777832f, 0.041443f, 0.767578f, 0.039185f, + 0.757324f, 0.036987f, 0.746582f, 0.034882f, 0.736328f, 0.032898f, 0.726562f, 0.030975f, + 0.717285f, 0.029144f, 0.708008f, 0.027420f, 0.697754f, 0.025772f, 0.687012f, 0.024216f, + 0.676270f, 0.022736f, 0.664551f, 0.021347f, 0.652344f, 0.020020f, 0.640137f, 0.018784f, + 0.627441f, 0.017609f, 0.614258f, 0.016510f, 0.601074f, 0.015480f, 0.587402f, 0.014503f, + 0.574219f, 0.013588f, 0.560547f, 0.012726f, 0.546875f, 0.011909f, 0.532715f, 0.011154f, + 0.518066f, 0.010437f, 0.503906f, 0.009773f, 0.489746f, 0.009148f, 0.475342f, 0.008560f, + 0.461182f, 0.008011f, 0.446777f, 0.007496f, 0.432617f, 0.007011f, 0.418457f, 0.006561f, + 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, + 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, 0.905762f, 0.093567f, + 0.905273f, 0.093628f, 0.904297f, 0.093384f, 0.903320f, 0.093140f, 0.902344f, 0.093018f, + 0.900879f, 0.092590f, 0.899414f, 0.092224f, 0.897461f, 0.091553f, 0.895020f, 0.090759f, + 0.892090f, 0.089783f, 0.888672f, 0.088562f, 0.884766f, 0.087097f, 0.880371f, 0.085449f, + 0.875488f, 0.083496f, 0.870117f, 0.081360f, 0.863770f, 0.078979f, 0.857910f, 0.076477f, + 0.851074f, 0.073792f, 0.844727f, 0.070984f, 0.837402f, 0.068054f, 0.830566f, 0.065125f, + 0.823242f, 0.062195f, 0.815430f, 0.059204f, 0.807617f, 0.056274f, 0.799805f, 0.053406f, + 0.791016f, 0.050598f, 0.782227f, 0.047852f, 0.772949f, 0.045227f, 0.763672f, 0.042694f, + 0.753906f, 0.040253f, 0.744141f, 0.037933f, 0.733887f, 0.035736f, 0.724121f, 0.033600f, + 0.714844f, 0.031616f, 0.706055f, 0.029709f, 0.696777f, 0.027908f, 0.687012f, 0.026199f, + 0.676270f, 0.024597f, 0.665527f, 0.023087f, 0.654297f, 0.021652f, 0.642578f, 0.020309f, + 0.630371f, 0.019028f, 0.617676f, 0.017838f, 0.604980f, 0.016708f, 0.591797f, 0.015656f, + 0.578125f, 0.014671f, 0.564941f, 0.013741f, 0.551270f, 0.012863f, 0.537598f, 0.012047f, + 0.523926f, 0.011276f, 0.509766f, 0.010559f, 0.495605f, 0.009880f, 0.481445f, 0.009247f, + 0.467285f, 0.008659f, 0.453125f, 0.008102f, 0.439209f, 0.007584f, 0.425293f, 0.007095f, + 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, + 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, 0.891602f, 0.107727f, + 0.891113f, 0.107727f, 0.890137f, 0.107300f, 0.889160f, 0.107056f, 0.888184f, 0.106812f, + 0.886719f, 0.106201f, 0.884766f, 0.105530f, 0.882812f, 0.104736f, 0.880371f, 0.103638f, + 0.877441f, 0.102234f, 0.874023f, 0.100708f, 0.870117f, 0.098755f, 0.865234f, 0.096619f, + 0.860352f, 0.094177f, 0.854980f, 0.091492f, 0.849609f, 0.088562f, 0.843750f, 0.085449f, + 0.837402f, 0.082214f, 0.831055f, 0.078857f, 0.824707f, 0.075439f, 0.818359f, 0.071960f, + 0.812012f, 0.068542f, 0.805176f, 0.065125f, 0.798340f, 0.061768f, 0.791504f, 0.058502f, + 0.783691f, 0.055328f, 0.775879f, 0.052246f, 0.768066f, 0.049316f, 0.759766f, 0.046478f, + 0.750977f, 0.043793f, 0.741699f, 0.041199f, 0.732422f, 0.038788f, 0.723145f, 0.036438f, + 0.713379f, 0.034241f, 0.704102f, 0.032166f, 0.695801f, 0.030228f, 0.686523f, 0.028366f, + 0.676758f, 0.026611f, 0.666992f, 0.024963f, 0.656250f, 0.023407f, 0.645020f, 0.021942f, + 0.633301f, 0.020569f, 0.621582f, 0.019272f, 0.608887f, 0.018051f, 0.596191f, 0.016922f, + 0.583008f, 0.015839f, 0.569824f, 0.014847f, 0.556152f, 0.013901f, 0.542969f, 0.013016f, + 0.529297f, 0.012192f, 0.515625f, 0.011414f, 0.501953f, 0.010681f, 0.487793f, 0.010002f, + 0.473877f, 0.009361f, 0.459717f, 0.008766f, 0.445801f, 0.008202f, 0.432129f, 0.007683f, + 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, + 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875488f, 0.124084f, 0.875000f, 0.124084f, + 0.874512f, 0.124084f, 0.873535f, 0.123474f, 0.872559f, 0.123169f, 0.871582f, 0.122559f, + 0.870117f, 0.121948f, 0.868164f, 0.120972f, 0.866211f, 0.119812f, 0.863770f, 0.118347f, + 0.860840f, 0.116516f, 0.856934f, 0.114380f, 0.853027f, 0.111938f, 0.848633f, 0.109192f, + 0.843750f, 0.106079f, 0.838867f, 0.102722f, 0.833496f, 0.099121f, 0.827637f, 0.095337f, + 0.822266f, 0.091431f, 0.816406f, 0.087463f, 0.811035f, 0.083435f, 0.805664f, 0.079407f, + 0.799805f, 0.075378f, 0.794434f, 0.071472f, 0.788574f, 0.067627f, 0.782715f, 0.063965f, + 0.776367f, 0.060425f, 0.770020f, 0.056976f, 0.762695f, 0.053680f, 0.755371f, 0.050568f, + 0.747559f, 0.047577f, 0.739746f, 0.044739f, 0.731445f, 0.042053f, 0.722656f, 0.039520f, + 0.713379f, 0.037109f, 0.704102f, 0.034851f, 0.695312f, 0.032684f, 0.686035f, 0.030685f, + 0.677246f, 0.028778f, 0.667969f, 0.026978f, 0.658203f, 0.025299f, 0.647461f, 0.023712f, + 0.636719f, 0.022232f, 0.625000f, 0.020828f, 0.613281f, 0.019516f, 0.600586f, 0.018280f, + 0.588379f, 0.017120f, 0.575195f, 0.016037f, 0.562012f, 0.015022f, 0.548340f, 0.014076f, + 0.535156f, 0.013176f, 0.521484f, 0.012337f, 0.508301f, 0.011559f, 0.494629f, 0.010826f, + 0.480713f, 0.010132f, 0.467041f, 0.009491f, 0.453125f, 0.008888f, 0.439453f, 0.008324f, + 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, + 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, 0.855957f, 0.143066f, + 0.854980f, 0.142700f, 0.854492f, 0.142212f, 0.853516f, 0.141724f, 0.852539f, 0.140869f, + 0.851074f, 0.139893f, 0.849121f, 0.138672f, 0.847168f, 0.136963f, 0.844238f, 0.135010f, + 0.841309f, 0.132690f, 0.837891f, 0.129883f, 0.833984f, 0.126709f, 0.829590f, 0.123169f, + 0.824707f, 0.119263f, 0.820312f, 0.115112f, 0.815430f, 0.110718f, 0.810547f, 0.106140f, + 0.805664f, 0.101501f, 0.800781f, 0.096802f, 0.796387f, 0.092041f, 0.791992f, 0.087402f, + 0.787598f, 0.082825f, 0.782715f, 0.078369f, 0.778320f, 0.074036f, 0.773926f, 0.069824f, + 0.769043f, 0.065857f, 0.763672f, 0.062042f, 0.757812f, 0.058380f, 0.751465f, 0.054932f, + 0.745117f, 0.051636f, 0.737793f, 0.048523f, 0.730469f, 0.045593f, 0.722168f, 0.042786f, + 0.713867f, 0.040161f, 0.705566f, 0.037689f, 0.696289f, 0.035370f, 0.687500f, 0.033173f, + 0.678223f, 0.031113f, 0.669434f, 0.029175f, 0.660156f, 0.027344f, 0.649902f, 0.025620f, + 0.639648f, 0.024017f, 0.628906f, 0.022507f, 0.617676f, 0.021088f, 0.605469f, 0.019760f, + 0.593262f, 0.018509f, 0.581055f, 0.017334f, 0.567871f, 0.016235f, 0.554688f, 0.015221f, + 0.541504f, 0.014259f, 0.528320f, 0.013359f, 0.514648f, 0.012512f, 0.501465f, 0.011719f, + 0.488037f, 0.010979f, 0.474365f, 0.010284f, 0.460938f, 0.009636f, 0.447266f, 0.009033f, + 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, + 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, 0.833984f, 0.165283f, + 0.832520f, 0.164551f, 0.832031f, 0.164062f, 0.831543f, 0.163330f, 0.830078f, 0.162231f, + 0.828613f, 0.160767f, 0.827148f, 0.159058f, 0.824707f, 0.156738f, 0.822266f, 0.154053f, + 0.819336f, 0.150879f, 0.815918f, 0.147217f, 0.812012f, 0.143188f, 0.808105f, 0.138672f, + 0.803711f, 0.133789f, 0.799805f, 0.128662f, 0.795410f, 0.123413f, 0.791504f, 0.117859f, + 0.787598f, 0.112366f, 0.784180f, 0.106812f, 0.780762f, 0.101318f, 0.777344f, 0.095947f, + 0.774414f, 0.090759f, 0.770996f, 0.085693f, 0.768066f, 0.080811f, 0.764648f, 0.076172f, + 0.761230f, 0.071716f, 0.757324f, 0.067444f, 0.752930f, 0.063416f, 0.748047f, 0.059631f, + 0.742676f, 0.056000f, 0.736328f, 0.052612f, 0.729980f, 0.049377f, 0.722656f, 0.046326f, + 0.715332f, 0.043457f, 0.707031f, 0.040771f, 0.698730f, 0.038239f, 0.689941f, 0.035858f, + 0.680664f, 0.033600f, 0.671387f, 0.031525f, 0.662109f, 0.029541f, 0.652832f, 0.027695f, + 0.643066f, 0.025955f, 0.632812f, 0.024323f, 0.622070f, 0.022797f, 0.610352f, 0.021347f, + 0.598633f, 0.020004f, 0.586914f, 0.018753f, 0.574219f, 0.017578f, 0.561523f, 0.016464f, + 0.548828f, 0.015434f, 0.535645f, 0.014458f, 0.521973f, 0.013550f, 0.508789f, 0.012703f, + 0.495361f, 0.011902f, 0.481934f, 0.011154f, 0.468750f, 0.010460f, 0.455566f, 0.009804f, + 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, + 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.808105f, 0.191284f, 0.807617f, 0.191162f, + 0.806641f, 0.190186f, 0.806152f, 0.189453f, 0.805176f, 0.188232f, 0.804199f, 0.186768f, + 0.802734f, 0.184814f, 0.801270f, 0.182373f, 0.799316f, 0.179321f, 0.796875f, 0.175781f, + 0.793945f, 0.171631f, 0.790527f, 0.166870f, 0.787109f, 0.161621f, 0.783691f, 0.155884f, + 0.780273f, 0.149780f, 0.776855f, 0.143555f, 0.773926f, 0.137085f, 0.770996f, 0.130615f, + 0.768066f, 0.124084f, 0.766113f, 0.117676f, 0.764160f, 0.111328f, 0.762207f, 0.105164f, + 0.760742f, 0.099243f, 0.759277f, 0.093567f, 0.757324f, 0.088135f, 0.755859f, 0.082886f, + 0.753418f, 0.077942f, 0.750977f, 0.073303f, 0.748047f, 0.068848f, 0.744141f, 0.064636f, + 0.740234f, 0.060669f, 0.735352f, 0.056946f, 0.729492f, 0.053436f, 0.723633f, 0.050110f, + 0.716797f, 0.046997f, 0.709473f, 0.044067f, 0.701660f, 0.041321f, 0.693359f, 0.038727f, + 0.684570f, 0.036316f, 0.675781f, 0.034027f, 0.666016f, 0.031921f, 0.656250f, 0.029922f, + 0.646484f, 0.028046f, 0.636230f, 0.026276f, 0.625977f, 0.024628f, 0.615723f, 0.023087f, + 0.604492f, 0.021637f, 0.592773f, 0.020279f, 0.580566f, 0.019012f, 0.568359f, 0.017822f, + 0.556152f, 0.016708f, 0.542969f, 0.015671f, 0.530273f, 0.014694f, 0.517090f, 0.013779f, + 0.503906f, 0.012917f, 0.490479f, 0.012115f, 0.477295f, 0.011360f, 0.463867f, 0.010658f, + 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, + 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.777344f, 0.221680f, 0.776855f, 0.221069f, + 0.776367f, 0.220093f, 0.775879f, 0.219116f, 0.774902f, 0.217529f, 0.773926f, 0.215332f, + 0.772949f, 0.212646f, 0.771484f, 0.209229f, 0.769531f, 0.205078f, 0.767090f, 0.200195f, + 0.764648f, 0.194824f, 0.761719f, 0.188599f, 0.759277f, 0.181885f, 0.756348f, 0.174683f, + 0.753906f, 0.167358f, 0.751953f, 0.159668f, 0.750000f, 0.151855f, 0.748535f, 0.144165f, + 0.747559f, 0.136597f, 0.747070f, 0.129150f, 0.747070f, 0.121948f, 0.747070f, 0.114990f, + 0.747070f, 0.108276f, 0.747070f, 0.101929f, 0.747070f, 0.095886f, 0.747070f, 0.090088f, + 0.746094f, 0.084656f, 0.745117f, 0.079468f, 0.743652f, 0.074585f, 0.741211f, 0.070007f, + 0.738281f, 0.065674f, 0.734375f, 0.061584f, 0.729980f, 0.057770f, 0.724609f, 0.054169f, + 0.718750f, 0.050781f, 0.712402f, 0.047607f, 0.705078f, 0.044617f, 0.697754f, 0.041840f, + 0.689453f, 0.039215f, 0.680664f, 0.036774f, 0.671387f, 0.034454f, 0.661621f, 0.032318f, + 0.651855f, 0.030289f, 0.641602f, 0.028397f, 0.630859f, 0.026627f, 0.620117f, 0.024963f, + 0.609863f, 0.023407f, 0.598633f, 0.021942f, 0.587402f, 0.020584f, 0.575195f, 0.019302f, + 0.563477f, 0.018112f, 0.550781f, 0.016983f, 0.538086f, 0.015930f, 0.525391f, 0.014954f, + 0.512695f, 0.014030f, 0.499512f, 0.013161f, 0.486572f, 0.012360f, 0.473389f, 0.011604f, + 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, + 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.741211f, 0.257324f, 0.740723f, 0.256348f, + 0.740234f, 0.255371f, 0.739746f, 0.253418f, 0.739258f, 0.251221f, 0.738770f, 0.248291f, + 0.737793f, 0.244507f, 0.736328f, 0.239868f, 0.734863f, 0.234253f, 0.732910f, 0.227783f, + 0.730957f, 0.220459f, 0.729492f, 0.212524f, 0.727539f, 0.204102f, 0.726074f, 0.195190f, + 0.725098f, 0.186035f, 0.724609f, 0.176758f, 0.724609f, 0.167725f, 0.725586f, 0.158691f, + 0.726562f, 0.149902f, 0.727539f, 0.141357f, 0.729492f, 0.133179f, 0.731445f, 0.125366f, + 0.733398f, 0.117920f, 0.735352f, 0.110840f, 0.737305f, 0.104126f, 0.738770f, 0.097717f, + 0.739258f, 0.091736f, 0.739746f, 0.086060f, 0.739258f, 0.080750f, 0.738281f, 0.075745f, + 0.736328f, 0.070984f, 0.733887f, 0.066528f, 0.730469f, 0.062408f, 0.726074f, 0.058502f, + 0.721191f, 0.054840f, 0.715820f, 0.051392f, 0.708984f, 0.048187f, 0.702148f, 0.045166f, + 0.694336f, 0.042328f, 0.686035f, 0.039703f, 0.677246f, 0.037201f, 0.667969f, 0.034882f, + 0.658691f, 0.032715f, 0.648438f, 0.030685f, 0.638184f, 0.028778f, 0.627441f, 0.026993f, + 0.616211f, 0.025330f, 0.604980f, 0.023758f, 0.593750f, 0.022293f, 0.582031f, 0.020920f, + 0.570801f, 0.019638f, 0.558594f, 0.018433f, 0.546387f, 0.017303f, 0.534180f, 0.016235f, + 0.521484f, 0.015251f, 0.508789f, 0.014328f, 0.496094f, 0.013458f, 0.483398f, 0.012642f, + 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, + 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.299316f, 0.698242f, 0.298340f, + 0.698242f, 0.296875f, 0.697754f, 0.294189f, 0.697266f, 0.291016f, 0.697266f, 0.286621f, + 0.696289f, 0.281250f, 0.695801f, 0.274658f, 0.694824f, 0.266846f, 0.693848f, 0.258301f, + 0.692871f, 0.248779f, 0.692383f, 0.238525f, 0.692383f, 0.227905f, 0.692871f, 0.216919f, + 0.693848f, 0.205933f, 0.695801f, 0.194946f, 0.698242f, 0.184204f, 0.701172f, 0.173828f, + 0.704590f, 0.163818f, 0.708496f, 0.154175f, 0.712402f, 0.145020f, 0.716309f, 0.136230f, + 0.720703f, 0.128052f, 0.724121f, 0.120178f, 0.728027f, 0.112793f, 0.730957f, 0.105835f, + 0.733398f, 0.099243f, 0.734863f, 0.093079f, 0.735840f, 0.087219f, 0.736328f, 0.081787f, + 0.735352f, 0.076660f, 0.733887f, 0.071838f, 0.731445f, 0.067322f, 0.728027f, 0.063110f, + 0.724121f, 0.059143f, 0.719238f, 0.055450f, 0.713379f, 0.051971f, 0.707031f, 0.048706f, + 0.700195f, 0.045685f, 0.692383f, 0.042816f, 0.684082f, 0.040161f, 0.675293f, 0.037659f, + 0.666016f, 0.035339f, 0.656250f, 0.033142f, 0.645996f, 0.031113f, 0.635254f, 0.029190f, + 0.624512f, 0.027405f, 0.613281f, 0.025726f, 0.602051f, 0.024155f, 0.590332f, 0.022675f, + 0.578613f, 0.021301f, 0.566406f, 0.020004f, 0.554688f, 0.018799f, 0.542969f, 0.017670f, + 0.530762f, 0.016602f, 0.518066f, 0.015602f, 0.505859f, 0.014671f, 0.493408f, 0.013794f, + 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, + 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.349365f, 0.647461f, 0.348145f, + 0.647461f, 0.345459f, 0.647949f, 0.341797f, 0.647949f, 0.336914f, 0.647949f, 0.330566f, + 0.647949f, 0.322998f, 0.647949f, 0.313721f, 0.648438f, 0.303223f, 0.648926f, 0.291748f, + 0.649902f, 0.279297f, 0.651367f, 0.266113f, 0.653809f, 0.252930f, 0.657227f, 0.239746f, + 0.661133f, 0.226685f, 0.665527f, 0.213867f, 0.670898f, 0.201538f, 0.676758f, 0.189697f, + 0.683105f, 0.178345f, 0.689453f, 0.167603f, 0.695801f, 0.157349f, 0.702148f, 0.147705f, + 0.708496f, 0.138550f, 0.714355f, 0.130005f, 0.719238f, 0.121948f, 0.724121f, 0.114319f, + 0.728027f, 0.107117f, 0.730957f, 0.100403f, 0.733398f, 0.094116f, 0.734375f, 0.088196f, + 0.734863f, 0.082642f, 0.734375f, 0.077393f, 0.732910f, 0.072571f, 0.730469f, 0.067993f, + 0.727051f, 0.063721f, 0.722656f, 0.059753f, 0.717773f, 0.056000f, 0.712402f, 0.052521f, + 0.705566f, 0.049255f, 0.698730f, 0.046204f, 0.690918f, 0.043335f, 0.682617f, 0.040649f, + 0.673828f, 0.038147f, 0.664551f, 0.035797f, 0.654785f, 0.033630f, 0.644531f, 0.031555f, + 0.633789f, 0.029663f, 0.623047f, 0.027863f, 0.611816f, 0.026169f, 0.600586f, 0.024597f, + 0.588867f, 0.023117f, 0.576660f, 0.021744f, 0.564941f, 0.020447f, 0.552734f, 0.019226f, + 0.540039f, 0.018082f, 0.527832f, 0.017014f, 0.515625f, 0.016006f, 0.503418f, 0.015068f, + 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, + 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.409180f, 0.586914f, 0.406982f, + 0.587891f, 0.402832f, 0.588379f, 0.397461f, 0.589355f, 0.389893f, 0.590332f, 0.380615f, + 0.591797f, 0.369385f, 0.593262f, 0.356445f, 0.595703f, 0.342041f, 0.598633f, 0.326904f, + 0.602539f, 0.310791f, 0.607422f, 0.294678f, 0.613281f, 0.278809f, 0.620117f, 0.262939f, + 0.627441f, 0.247803f, 0.635742f, 0.233154f, 0.644531f, 0.219238f, 0.653809f, 0.205933f, + 0.663086f, 0.193359f, 0.672363f, 0.181519f, 0.681152f, 0.170166f, 0.689941f, 0.159668f, + 0.697754f, 0.149658f, 0.705566f, 0.140259f, 0.712402f, 0.131348f, 0.718262f, 0.123169f, + 0.723633f, 0.115417f, 0.728027f, 0.108093f, 0.731445f, 0.101257f, 0.733398f, 0.094849f, + 0.734863f, 0.088867f, 0.735352f, 0.083313f, 0.734375f, 0.078064f, 0.732910f, 0.073120f, + 0.730469f, 0.068542f, 0.727051f, 0.064270f, 0.722656f, 0.060303f, 0.717773f, 0.056549f, + 0.711914f, 0.053040f, 0.705078f, 0.049774f, 0.698242f, 0.046722f, 0.690430f, 0.043854f, + 0.682129f, 0.041199f, 0.673340f, 0.038696f, 0.663574f, 0.036346f, 0.653809f, 0.034149f, + 0.644043f, 0.032104f, 0.633301f, 0.030182f, 0.622559f, 0.028381f, 0.611328f, 0.026688f, + 0.600098f, 0.025116f, 0.588379f, 0.023621f, 0.576172f, 0.022232f, 0.564453f, 0.020935f, + 0.552246f, 0.019714f, 0.540039f, 0.018570f, 0.527832f, 0.017487f, 0.515137f, 0.016479f, + 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, + 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.513672f, 0.480225f, 0.514648f, 0.477051f, + 0.516113f, 0.470459f, 0.517578f, 0.461426f, 0.520020f, 0.449707f, 0.522949f, 0.435547f, + 0.526367f, 0.419189f, 0.530762f, 0.401123f, 0.536621f, 0.381836f, 0.543457f, 0.362061f, + 0.551758f, 0.342285f, 0.561523f, 0.322998f, 0.571777f, 0.304199f, 0.583496f, 0.286133f, + 0.595703f, 0.268799f, 0.607910f, 0.252441f, 0.620605f, 0.237061f, 0.633301f, 0.222412f, + 0.645508f, 0.208618f, 0.657227f, 0.195557f, 0.668945f, 0.183350f, 0.679688f, 0.171753f, + 0.689453f, 0.160889f, 0.698730f, 0.150757f, 0.707031f, 0.141113f, 0.714355f, 0.132202f, + 0.720703f, 0.123901f, 0.726074f, 0.116028f, 0.729980f, 0.108704f, 0.733398f, 0.101807f, + 0.735352f, 0.095398f, 0.736328f, 0.089417f, 0.736816f, 0.083801f, 0.735840f, 0.078552f, + 0.733887f, 0.073608f, 0.730957f, 0.069031f, 0.727539f, 0.064819f, 0.723145f, 0.060822f, + 0.717773f, 0.057098f, 0.711914f, 0.053589f, 0.705078f, 0.050323f, 0.698242f, 0.047302f, + 0.690430f, 0.044434f, 0.681641f, 0.041779f, 0.672852f, 0.039276f, 0.663574f, 0.036926f, + 0.653809f, 0.034729f, 0.644043f, 0.032684f, 0.633301f, 0.030777f, 0.622559f, 0.028976f, + 0.611816f, 0.027283f, 0.600098f, 0.025711f, 0.588867f, 0.024216f, 0.577148f, 0.022827f, + 0.564941f, 0.021530f, 0.553223f, 0.020294f, 0.541016f, 0.019150f, 0.528809f, 0.018066f, + 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, + 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.425781f, 0.564453f, 0.427246f, 0.558594f, + 0.430176f, 0.547363f, 0.434082f, 0.532227f, 0.438965f, 0.513184f, 0.445312f, 0.491943f, + 0.453125f, 0.468262f, 0.462891f, 0.443848f, 0.474365f, 0.419434f, 0.487549f, 0.395264f, + 0.501953f, 0.372070f, 0.518066f, 0.349854f, 0.534180f, 0.328613f, 0.551270f, 0.308594f, + 0.568359f, 0.289795f, 0.584961f, 0.271729f, 0.601074f, 0.254883f, 0.617188f, 0.238892f, + 0.632324f, 0.223877f, 0.646484f, 0.209717f, 0.659668f, 0.196411f, 0.672363f, 0.183960f, + 0.683594f, 0.172241f, 0.693848f, 0.161255f, 0.703125f, 0.151001f, 0.711426f, 0.141357f, + 0.718750f, 0.132446f, 0.724609f, 0.124023f, 0.729980f, 0.116211f, 0.733887f, 0.108826f, + 0.736328f, 0.101990f, 0.738281f, 0.095642f, 0.738770f, 0.089661f, 0.738770f, 0.084106f, + 0.737305f, 0.078918f, 0.735352f, 0.074036f, 0.732422f, 0.069519f, 0.728516f, 0.065247f, + 0.723633f, 0.061310f, 0.718262f, 0.057617f, 0.712402f, 0.054169f, 0.705566f, 0.050934f, + 0.698242f, 0.047913f, 0.690430f, 0.045074f, 0.682129f, 0.042419f, 0.673340f, 0.039948f, + 0.664062f, 0.037598f, 0.654785f, 0.035431f, 0.644531f, 0.033386f, 0.634277f, 0.031464f, + 0.623535f, 0.029694f, 0.612793f, 0.028000f, 0.601562f, 0.026413f, 0.590332f, 0.024933f, + 0.578613f, 0.023529f, 0.566895f, 0.022217f, 0.555176f, 0.020981f, 0.543457f, 0.019836f, + 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, + 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.318848f, 0.661621f, 0.322266f, 0.649414f, + 0.328613f, 0.627441f, 0.336914f, 0.600586f, 0.347900f, 0.570801f, 0.361572f, 0.539551f, + 0.377930f, 0.508789f, 0.396484f, 0.479248f, 0.416992f, 0.450928f, 0.438965f, 0.424072f, + 0.461426f, 0.398682f, 0.484131f, 0.374512f, 0.506348f, 0.351807f, 0.528320f, 0.330078f, + 0.549805f, 0.309570f, 0.569824f, 0.290039f, 0.589355f, 0.271973f, 0.607422f, 0.254639f, + 0.624512f, 0.238525f, 0.640137f, 0.223267f, 0.654785f, 0.208984f, 0.668457f, 0.195557f, + 0.680664f, 0.183105f, 0.691895f, 0.171387f, 0.701660f, 0.160522f, 0.710449f, 0.150269f, + 0.718262f, 0.140747f, 0.724609f, 0.131836f, 0.729980f, 0.123596f, 0.734375f, 0.115845f, + 0.737793f, 0.108643f, 0.740234f, 0.101868f, 0.741211f, 0.095581f, 0.741699f, 0.089722f, + 0.740723f, 0.084229f, 0.739258f, 0.079102f, 0.736816f, 0.074341f, 0.733398f, 0.069885f, + 0.729492f, 0.065735f, 0.724609f, 0.061859f, 0.719238f, 0.058197f, 0.712891f, 0.054779f, + 0.706543f, 0.051605f, 0.699219f, 0.048615f, 0.691406f, 0.045807f, 0.683105f, 0.043182f, + 0.674316f, 0.040710f, 0.665039f, 0.038422f, 0.655762f, 0.036255f, 0.645508f, 0.034210f, + 0.635254f, 0.032318f, 0.625000f, 0.030518f, 0.614258f, 0.028839f, 0.603516f, 0.027252f, + 0.592285f, 0.025757f, 0.581055f, 0.024368f, 0.569336f, 0.023041f, 0.558105f, 0.021805f, + 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, + 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.193481f, 0.746094f, 0.202271f, 0.719238f, + 0.218872f, 0.678711f, 0.239990f, 0.639648f, 0.264893f, 0.603027f, 0.292725f, 0.568848f, + 0.322266f, 0.537109f, 0.352783f, 0.506348f, 0.383057f, 0.477295f, 0.413086f, 0.449219f, + 0.441895f, 0.422119f, 0.469482f, 0.396484f, 0.495850f, 0.371826f, 0.520508f, 0.348633f, + 0.543945f, 0.326660f, 0.565918f, 0.305908f, 0.586426f, 0.286377f, 0.605469f, 0.268066f, + 0.623047f, 0.250732f, 0.639160f, 0.234863f, 0.654297f, 0.219849f, 0.667969f, 0.205811f, + 0.680176f, 0.192627f, 0.691406f, 0.180420f, 0.701660f, 0.168945f, 0.710938f, 0.158325f, + 0.718750f, 0.148438f, 0.725586f, 0.139160f, 0.730957f, 0.130493f, 0.735840f, 0.122498f, + 0.739258f, 0.114990f, 0.742188f, 0.107971f, 0.743652f, 0.101440f, 0.744141f, 0.095276f, + 0.744141f, 0.089600f, 0.743164f, 0.084290f, 0.741211f, 0.079285f, 0.738281f, 0.074646f, + 0.734863f, 0.070251f, 0.730469f, 0.066162f, 0.725586f, 0.062378f, 0.719727f, 0.058807f, + 0.713867f, 0.055450f, 0.707031f, 0.052338f, 0.699707f, 0.049377f, 0.691895f, 0.046631f, + 0.683594f, 0.044037f, 0.675293f, 0.041595f, 0.666016f, 0.039307f, 0.656738f, 0.037170f, + 0.646973f, 0.035156f, 0.637207f, 0.033264f, 0.626953f, 0.031464f, 0.616211f, 0.029800f, + 0.605469f, 0.028229f, 0.594727f, 0.026733f, 0.583496f, 0.025330f, 0.572266f, 0.024017f, + 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, + 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.129028f, 0.758301f, 0.153564f, 0.733887f, + 0.189453f, 0.698242f, 0.225830f, 0.661621f, 0.261963f, 0.625488f, 0.297363f, 0.590332f, + 0.331543f, 0.556152f, 0.364502f, 0.522949f, 0.395752f, 0.491699f, 0.425781f, 0.461670f, + 0.454102f, 0.433350f, 0.480957f, 0.406494f, 0.505859f, 0.381104f, 0.529785f, 0.357178f, + 0.551758f, 0.334717f, 0.572754f, 0.313721f, 0.592285f, 0.293945f, 0.610352f, 0.275391f, + 0.626953f, 0.258057f, 0.642578f, 0.242065f, 0.656738f, 0.226807f, 0.670410f, 0.212646f, + 0.682129f, 0.199463f, 0.693359f, 0.187012f, 0.703125f, 0.175537f, 0.711914f, 0.164673f, + 0.719727f, 0.154663f, 0.726562f, 0.145264f, 0.732422f, 0.136475f, 0.737305f, 0.128174f, + 0.741211f, 0.120544f, 0.743652f, 0.113403f, 0.745605f, 0.106689f, 0.747070f, 0.100464f, + 0.747070f, 0.094604f, 0.746094f, 0.089111f, 0.744629f, 0.083984f, 0.742676f, 0.079163f, + 0.739258f, 0.074707f, 0.735840f, 0.070435f, 0.731445f, 0.066528f, 0.726074f, 0.062805f, + 0.720703f, 0.059357f, 0.714355f, 0.056091f, 0.707520f, 0.053040f, 0.700684f, 0.050171f, + 0.692871f, 0.047455f, 0.684570f, 0.044922f, 0.676270f, 0.042542f, 0.667480f, 0.040283f, + 0.658203f, 0.038177f, 0.648438f, 0.036194f, 0.638672f, 0.034302f, 0.628906f, 0.032532f, + 0.618652f, 0.030884f, 0.607910f, 0.029312f, 0.597656f, 0.027832f, 0.586426f, 0.026428f, +}; + +const float btdf_split_sum_ggx[16][64 * 64 * 2] = { + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.468994f, 0.999512f, 0.470215f, 0.999512f, 0.480713f, + 0.999512f, 0.490967f, 0.999512f, 0.499756f, 0.999512f, 0.507324f, 0.999512f, 0.513672f, + 0.999512f, 0.518555f, 0.999512f, 0.522949f, 0.999512f, 0.526367f, 0.999512f, 0.529297f, + 0.999512f, 0.531250f, 0.999512f, 0.533203f, 0.999512f, 0.534668f, 0.999512f, 0.535645f, + 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.536133f, 0.999512f, 0.535645f, + 0.999512f, 0.535156f, 0.999512f, 0.534180f, 0.999512f, 0.533203f, 0.999512f, 0.532227f, + 0.999512f, 0.530762f, 0.999512f, 0.528809f, 0.999512f, 0.526855f, 0.999512f, 0.524902f, + 0.999512f, 0.522461f, 0.999512f, 0.520020f, 0.999512f, 0.517578f, 0.999512f, 0.514648f, + 0.999512f, 0.511719f, 0.999512f, 0.508789f, 0.999512f, 0.505371f, 0.999512f, 0.501465f, + 0.999512f, 0.498047f, 0.999512f, 0.494141f, 0.999512f, 0.489746f, 0.999512f, 0.485352f, + 0.999512f, 0.480713f, 0.999512f, 0.475830f, 0.999512f, 0.470459f, 0.999512f, 0.464844f, + 0.999512f, 0.458984f, 0.999512f, 0.452881f, 0.999512f, 0.446289f, 0.999512f, 0.439209f, + 0.999512f, 0.431641f, 0.999512f, 0.423584f, 0.999512f, 0.414795f, 0.999512f, 0.405518f, + 0.999512f, 0.395264f, 0.999512f, 0.384277f, 0.999512f, 0.372070f, 0.999512f, 0.358398f, + 0.999512f, 0.343262f, 0.999512f, 0.325928f, 0.999512f, 0.305664f, 0.999512f, 0.281738f, + 0.999512f, 0.251953f, 0.999512f, 0.212524f, 0.999512f, 0.152954f, 0.999512f, 0.040253f, + 0.000000f, 1.000000f, 0.999512f, 0.484131f, 1.000000f, 0.432861f, 0.999512f, 0.411865f, + 0.999512f, 0.400879f, 1.000000f, 0.394287f, 1.000000f, 0.389893f, 0.999512f, 0.386719f, + 0.999512f, 0.384033f, 0.999512f, 0.381836f, 1.000000f, 0.379883f, 0.999512f, 0.377930f, + 1.000000f, 0.375977f, 0.999512f, 0.374023f, 1.000000f, 0.372070f, 0.999512f, 0.370117f, + 0.999512f, 0.367920f, 0.999512f, 0.365723f, 1.000000f, 0.363281f, 0.999512f, 0.361084f, + 0.999512f, 0.358398f, 0.999512f, 0.355957f, 1.000000f, 0.353271f, 0.999512f, 0.350342f, + 0.999512f, 0.347412f, 0.999512f, 0.344238f, 0.999512f, 0.341309f, 0.999512f, 0.337891f, + 1.000000f, 0.334473f, 0.999512f, 0.331055f, 1.000000f, 0.327393f, 0.999512f, 0.323730f, + 0.999512f, 0.319824f, 0.999512f, 0.315674f, 0.999512f, 0.311523f, 0.999512f, 0.307373f, + 0.999512f, 0.302734f, 0.999512f, 0.298096f, 0.999512f, 0.293457f, 0.999512f, 0.288574f, + 0.999512f, 0.283203f, 0.999512f, 0.278076f, 0.999512f, 0.272461f, 0.999512f, 0.266602f, + 0.999512f, 0.260498f, 0.999512f, 0.254395f, 0.999512f, 0.247803f, 0.999512f, 0.240845f, + 0.999512f, 0.233643f, 0.999512f, 0.226074f, 0.999512f, 0.218018f, 0.999512f, 0.209473f, + 0.999512f, 0.200439f, 0.999512f, 0.190796f, 0.999512f, 0.180542f, 1.000000f, 0.169312f, + 0.999512f, 0.157227f, 0.999512f, 0.143921f, 0.999512f, 0.129028f, 0.999512f, 0.112366f, + 0.999512f, 0.093018f, 0.999512f, 0.069946f, 0.999512f, 0.040527f, 0.999512f, 0.004879f, + 0.000000f, 1.000000f, 1.000000f, 0.506836f, 1.000000f, 0.434570f, 1.000000f, 0.398193f, + 1.000000f, 0.375977f, 1.000000f, 0.360352f, 0.999512f, 0.348877f, 0.999512f, 0.339600f, + 1.000000f, 0.332031f, 1.000000f, 0.325684f, 1.000000f, 0.319824f, 1.000000f, 0.314697f, + 1.000000f, 0.310059f, 1.000000f, 0.305664f, 1.000000f, 0.301514f, 1.000000f, 0.297363f, + 1.000000f, 0.293457f, 1.000000f, 0.289795f, 1.000000f, 0.285889f, 1.000000f, 0.282227f, + 1.000000f, 0.278564f, 0.999512f, 0.274902f, 1.000000f, 0.271240f, 1.000000f, 0.267578f, + 1.000000f, 0.263916f, 1.000000f, 0.260254f, 1.000000f, 0.256592f, 1.000000f, 0.252686f, + 1.000000f, 0.249023f, 1.000000f, 0.245117f, 1.000000f, 0.241089f, 1.000000f, 0.237183f, + 1.000000f, 0.233032f, 1.000000f, 0.228882f, 1.000000f, 0.224731f, 1.000000f, 0.220337f, + 1.000000f, 0.215942f, 1.000000f, 0.211426f, 1.000000f, 0.206787f, 0.999512f, 0.202148f, + 1.000000f, 0.197266f, 1.000000f, 0.192261f, 1.000000f, 0.187134f, 0.999512f, 0.181885f, + 1.000000f, 0.176514f, 1.000000f, 0.170898f, 1.000000f, 0.165161f, 1.000000f, 0.159180f, + 1.000000f, 0.152954f, 0.999512f, 0.146484f, 1.000000f, 0.139771f, 0.999512f, 0.132812f, + 1.000000f, 0.125488f, 0.999512f, 0.117737f, 0.999512f, 0.109619f, 0.999512f, 0.101013f, + 0.999512f, 0.091858f, 1.000000f, 0.082092f, 1.000000f, 0.071533f, 0.999512f, 0.060028f, + 0.999512f, 0.047333f, 0.999512f, 0.033081f, 1.000000f, 0.016830f, 0.999512f, 0.001331f, + 0.000000f, 1.000000f, 1.000000f, 0.524902f, 1.000000f, 0.440430f, 1.000000f, 0.395020f, + 1.000000f, 0.365479f, 1.000000f, 0.343994f, 1.000000f, 0.327637f, 1.000000f, 0.314453f, + 1.000000f, 0.303467f, 1.000000f, 0.293945f, 1.000000f, 0.285645f, 1.000000f, 0.278076f, + 1.000000f, 0.271484f, 1.000000f, 0.265381f, 1.000000f, 0.259521f, 1.000000f, 0.254150f, + 1.000000f, 0.249023f, 1.000000f, 0.244141f, 0.999512f, 0.239380f, 1.000000f, 0.234863f, + 1.000000f, 0.230469f, 1.000000f, 0.226074f, 1.000000f, 0.221802f, 1.000000f, 0.217651f, + 1.000000f, 0.213501f, 1.000000f, 0.209473f, 1.000000f, 0.205322f, 1.000000f, 0.201294f, + 0.999512f, 0.197266f, 1.000000f, 0.193237f, 1.000000f, 0.189209f, 1.000000f, 0.185181f, + 1.000000f, 0.181030f, 0.999512f, 0.177002f, 1.000000f, 0.172852f, 0.999512f, 0.168701f, + 1.000000f, 0.164429f, 0.999512f, 0.160156f, 1.000000f, 0.155884f, 1.000000f, 0.151489f, + 1.000000f, 0.147095f, 1.000000f, 0.142578f, 1.000000f, 0.137939f, 1.000000f, 0.133301f, + 1.000000f, 0.128540f, 1.000000f, 0.123657f, 1.000000f, 0.118652f, 1.000000f, 0.113525f, + 1.000000f, 0.108276f, 1.000000f, 0.102844f, 1.000000f, 0.097290f, 1.000000f, 0.091553f, + 1.000000f, 0.085571f, 1.000000f, 0.079407f, 1.000000f, 0.073059f, 1.000000f, 0.066345f, + 1.000000f, 0.059387f, 1.000000f, 0.052063f, 1.000000f, 0.044342f, 0.999512f, 0.036194f, + 0.999512f, 0.027496f, 1.000000f, 0.018219f, 0.999512f, 0.008430f, 0.999512f, 0.000505f, + 0.000000f, 1.000000f, 1.000000f, 0.538574f, 1.000000f, 0.446777f, 1.000000f, 0.395020f, + 1.000000f, 0.360352f, 1.000000f, 0.334717f, 1.000000f, 0.314941f, 1.000000f, 0.298584f, + 1.000000f, 0.284912f, 1.000000f, 0.273193f, 1.000000f, 0.263184f, 1.000000f, 0.253906f, + 1.000000f, 0.245850f, 1.000000f, 0.238281f, 1.000000f, 0.231445f, 1.000000f, 0.224976f, + 1.000000f, 0.218872f, 1.000000f, 0.213257f, 0.999512f, 0.207764f, 1.000000f, 0.202637f, + 1.000000f, 0.197632f, 1.000000f, 0.192749f, 1.000000f, 0.188110f, 1.000000f, 0.183594f, + 1.000000f, 0.179199f, 0.999512f, 0.174927f, 1.000000f, 0.170654f, 1.000000f, 0.166382f, + 0.999512f, 0.162354f, 1.000000f, 0.158203f, 1.000000f, 0.154175f, 1.000000f, 0.150146f, + 1.000000f, 0.146240f, 1.000000f, 0.142212f, 1.000000f, 0.138184f, 1.000000f, 0.134277f, + 1.000000f, 0.130249f, 1.000000f, 0.126343f, 1.000000f, 0.122314f, 1.000000f, 0.118286f, + 1.000000f, 0.114258f, 1.000000f, 0.110168f, 1.000000f, 0.106079f, 1.000000f, 0.101868f, + 0.999512f, 0.097717f, 0.999512f, 0.093445f, 1.000000f, 0.089111f, 1.000000f, 0.084717f, + 1.000000f, 0.080200f, 1.000000f, 0.075684f, 1.000000f, 0.071045f, 1.000000f, 0.066284f, + 1.000000f, 0.061462f, 1.000000f, 0.056488f, 1.000000f, 0.051361f, 1.000000f, 0.046112f, + 0.999512f, 0.040710f, 1.000000f, 0.035126f, 1.000000f, 0.029388f, 1.000000f, 0.023422f, + 1.000000f, 0.017273f, 0.999512f, 0.010963f, 0.999512f, 0.004715f, 0.999512f, 0.000231f, + 0.000000f, 1.000000f, 1.000000f, 0.549316f, 1.000000f, 0.452393f, 1.000000f, 0.396240f, + 1.000000f, 0.357666f, 1.000000f, 0.329102f, 1.000000f, 0.306396f, 1.000000f, 0.287842f, + 1.000000f, 0.272217f, 0.999512f, 0.258789f, 1.000000f, 0.247192f, 1.000000f, 0.236816f, + 0.999512f, 0.227417f, 1.000000f, 0.218872f, 1.000000f, 0.211060f, 1.000000f, 0.203857f, + 1.000000f, 0.197144f, 0.999512f, 0.190796f, 1.000000f, 0.184814f, 1.000000f, 0.179199f, + 1.000000f, 0.173828f, 1.000000f, 0.168701f, 1.000000f, 0.163696f, 1.000000f, 0.158936f, + 1.000000f, 0.154297f, 0.999512f, 0.149902f, 1.000000f, 0.145508f, 1.000000f, 0.141235f, + 1.000000f, 0.137085f, 1.000000f, 0.133057f, 1.000000f, 0.129028f, 1.000000f, 0.125122f, + 0.999512f, 0.121277f, 0.999512f, 0.117432f, 1.000000f, 0.113647f, 1.000000f, 0.109863f, + 1.000000f, 0.106140f, 1.000000f, 0.102417f, 1.000000f, 0.098694f, 1.000000f, 0.094971f, + 1.000000f, 0.091309f, 0.999512f, 0.087585f, 0.999512f, 0.083923f, 1.000000f, 0.080200f, + 1.000000f, 0.076477f, 0.999512f, 0.072754f, 1.000000f, 0.068970f, 0.999512f, 0.065186f, + 0.999512f, 0.061371f, 1.000000f, 0.057495f, 1.000000f, 0.053619f, 1.000000f, 0.049652f, + 1.000000f, 0.045654f, 1.000000f, 0.041595f, 1.000000f, 0.037476f, 1.000000f, 0.033295f, + 0.999512f, 0.029053f, 1.000000f, 0.024734f, 1.000000f, 0.020340f, 1.000000f, 0.015900f, + 0.999512f, 0.011436f, 1.000000f, 0.007008f, 1.000000f, 0.002840f, 0.999512f, 0.000120f, + 0.000000f, 1.000000f, 0.999512f, 0.558105f, 1.000000f, 0.457275f, 0.999512f, 0.397705f, + 1.000000f, 0.356201f, 1.000000f, 0.325195f, 1.000000f, 0.300293f, 0.999512f, 0.280029f, + 1.000000f, 0.262939f, 1.000000f, 0.248291f, 0.999512f, 0.235352f, 1.000000f, 0.223877f, + 1.000000f, 0.213623f, 1.000000f, 0.204346f, 0.999512f, 0.195801f, 0.999512f, 0.187988f, + 1.000000f, 0.180664f, 1.000000f, 0.173828f, 0.999512f, 0.167480f, 1.000000f, 0.161499f, + 0.999512f, 0.155884f, 1.000000f, 0.150391f, 0.999512f, 0.145264f, 1.000000f, 0.140381f, + 1.000000f, 0.135620f, 0.999512f, 0.131104f, 1.000000f, 0.126587f, 1.000000f, 0.122375f, + 1.000000f, 0.118225f, 1.000000f, 0.114197f, 1.000000f, 0.110291f, 1.000000f, 0.106445f, + 1.000000f, 0.102661f, 1.000000f, 0.098999f, 1.000000f, 0.095337f, 1.000000f, 0.091736f, + 0.999512f, 0.088257f, 1.000000f, 0.084778f, 1.000000f, 0.081299f, 0.999512f, 0.077881f, + 0.999512f, 0.074524f, 1.000000f, 0.071167f, 1.000000f, 0.067810f, 1.000000f, 0.064514f, + 1.000000f, 0.061218f, 1.000000f, 0.057922f, 1.000000f, 0.054626f, 1.000000f, 0.051331f, + 0.999512f, 0.048065f, 1.000000f, 0.044739f, 0.999512f, 0.041443f, 0.999512f, 0.038116f, + 1.000000f, 0.034790f, 1.000000f, 0.031464f, 1.000000f, 0.028107f, 0.999512f, 0.024734f, + 0.999512f, 0.021347f, 1.000000f, 0.017960f, 1.000000f, 0.014565f, 1.000000f, 0.011185f, + 1.000000f, 0.007866f, 1.000000f, 0.004681f, 0.999512f, 0.001804f, 1.000000f, 0.000067f, + 0.000000f, 1.000000f, 1.000000f, 0.564941f, 1.000000f, 0.461426f, 1.000000f, 0.399170f, + 1.000000f, 0.355469f, 1.000000f, 0.322510f, 0.999512f, 0.296143f, 1.000000f, 0.274170f, + 1.000000f, 0.255859f, 1.000000f, 0.240112f, 0.999512f, 0.226196f, 1.000000f, 0.213989f, + 0.999512f, 0.202881f, 0.999512f, 0.192993f, 1.000000f, 0.183838f, 1.000000f, 0.175537f, + 1.000000f, 0.167847f, 1.000000f, 0.160645f, 1.000000f, 0.154053f, 1.000000f, 0.147705f, + 0.999512f, 0.141846f, 0.999512f, 0.136230f, 1.000000f, 0.130981f, 1.000000f, 0.125854f, + 1.000000f, 0.121094f, 1.000000f, 0.116455f, 1.000000f, 0.112061f, 1.000000f, 0.107788f, + 1.000000f, 0.103638f, 1.000000f, 0.099670f, 1.000000f, 0.095825f, 1.000000f, 0.092041f, + 1.000000f, 0.088379f, 1.000000f, 0.084839f, 1.000000f, 0.081360f, 1.000000f, 0.078003f, + 1.000000f, 0.074646f, 1.000000f, 0.071411f, 1.000000f, 0.068176f, 1.000000f, 0.065002f, + 0.999512f, 0.061951f, 0.999512f, 0.058868f, 1.000000f, 0.055847f, 0.999512f, 0.052856f, + 1.000000f, 0.049896f, 0.999512f, 0.046967f, 1.000000f, 0.044067f, 1.000000f, 0.041199f, + 1.000000f, 0.038330f, 1.000000f, 0.035492f, 0.999512f, 0.032684f, 0.999512f, 0.029877f, + 1.000000f, 0.027069f, 0.999512f, 0.024292f, 0.999512f, 0.021530f, 1.000000f, 0.018784f, + 1.000000f, 0.016052f, 0.999512f, 0.013351f, 1.000000f, 0.010689f, 1.000000f, 0.008087f, + 1.000000f, 0.005581f, 1.000000f, 0.003231f, 1.000000f, 0.001194f, 0.999512f, 0.000040f, + 0.000000f, 1.000000f, 1.000000f, 0.570801f, 1.000000f, 0.465088f, 1.000000f, 0.400635f, + 1.000000f, 0.355225f, 1.000000f, 0.320557f, 1.000000f, 0.292725f, 1.000000f, 0.269775f, + 0.999512f, 0.250488f, 1.000000f, 0.233765f, 0.999512f, 0.218994f, 1.000000f, 0.206055f, + 1.000000f, 0.194458f, 1.000000f, 0.183960f, 1.000000f, 0.174438f, 1.000000f, 0.165649f, + 1.000000f, 0.157593f, 0.999512f, 0.150146f, 1.000000f, 0.143311f, 1.000000f, 0.136719f, + 1.000000f, 0.130737f, 1.000000f, 0.125000f, 1.000000f, 0.119568f, 1.000000f, 0.114441f, + 1.000000f, 0.109558f, 0.999512f, 0.104919f, 0.999512f, 0.100464f, 1.000000f, 0.096252f, + 1.000000f, 0.092163f, 1.000000f, 0.088196f, 0.999512f, 0.084412f, 1.000000f, 0.080750f, + 1.000000f, 0.077209f, 1.000000f, 0.073792f, 1.000000f, 0.070496f, 1.000000f, 0.067261f, + 1.000000f, 0.064087f, 0.999512f, 0.061035f, 1.000000f, 0.058044f, 1.000000f, 0.055115f, + 1.000000f, 0.052246f, 1.000000f, 0.049408f, 1.000000f, 0.046661f, 1.000000f, 0.043976f, + 0.999512f, 0.041290f, 1.000000f, 0.038696f, 0.999512f, 0.036102f, 1.000000f, 0.033569f, + 1.000000f, 0.031082f, 0.999512f, 0.028610f, 1.000000f, 0.026184f, 1.000000f, 0.023788f, + 1.000000f, 0.021423f, 1.000000f, 0.019073f, 0.999512f, 0.016785f, 1.000000f, 0.014519f, + 0.999512f, 0.012299f, 0.999512f, 0.010124f, 1.000000f, 0.008011f, 1.000000f, 0.005978f, + 1.000000f, 0.004051f, 1.000000f, 0.002293f, 1.000000f, 0.000817f, 1.000000f, 0.000025f, + 0.000000f, 1.000000f, 1.000000f, 0.575684f, 0.999512f, 0.468018f, 1.000000f, 0.402100f, + 1.000000f, 0.354980f, 1.000000f, 0.319092f, 1.000000f, 0.290283f, 1.000000f, 0.266357f, + 1.000000f, 0.246094f, 1.000000f, 0.228638f, 1.000000f, 0.213257f, 1.000000f, 0.199707f, + 1.000000f, 0.187622f, 1.000000f, 0.176758f, 1.000000f, 0.166748f, 1.000000f, 0.157715f, + 1.000000f, 0.149414f, 1.000000f, 0.141724f, 1.000000f, 0.134521f, 1.000000f, 0.127930f, + 0.999512f, 0.121704f, 1.000000f, 0.115906f, 1.000000f, 0.110413f, 1.000000f, 0.105225f, + 1.000000f, 0.100281f, 1.000000f, 0.095642f, 1.000000f, 0.091187f, 1.000000f, 0.086975f, + 0.999512f, 0.082886f, 1.000000f, 0.079041f, 1.000000f, 0.075317f, 1.000000f, 0.071777f, + 1.000000f, 0.068298f, 1.000000f, 0.065002f, 1.000000f, 0.061829f, 0.999512f, 0.058746f, + 1.000000f, 0.055756f, 1.000000f, 0.052856f, 1.000000f, 0.050049f, 1.000000f, 0.047302f, + 1.000000f, 0.044647f, 0.999512f, 0.042053f, 0.999512f, 0.039520f, 1.000000f, 0.037048f, + 0.999512f, 0.034637f, 1.000000f, 0.032288f, 1.000000f, 0.029999f, 1.000000f, 0.027756f, + 1.000000f, 0.025543f, 1.000000f, 0.023392f, 1.000000f, 0.021271f, 1.000000f, 0.019211f, + 0.999512f, 0.017181f, 1.000000f, 0.015213f, 1.000000f, 0.013283f, 1.000000f, 0.011398f, + 0.999512f, 0.009567f, 1.000000f, 0.007805f, 0.999512f, 0.006107f, 1.000000f, 0.004498f, + 0.999512f, 0.003000f, 1.000000f, 0.001662f, 1.000000f, 0.000573f, 1.000000f, 0.000017f, + 0.000000f, 1.000000f, 1.000000f, 0.579590f, 1.000000f, 0.470703f, 0.999512f, 0.403320f, + 1.000000f, 0.355225f, 1.000000f, 0.318115f, 1.000000f, 0.288086f, 1.000000f, 0.263428f, + 1.000000f, 0.242554f, 1.000000f, 0.224365f, 1.000000f, 0.208618f, 1.000000f, 0.194580f, + 1.000000f, 0.182007f, 1.000000f, 0.170776f, 1.000000f, 0.160522f, 1.000000f, 0.151245f, + 1.000000f, 0.142578f, 1.000000f, 0.134766f, 1.000000f, 0.127441f, 1.000000f, 0.120667f, + 0.999512f, 0.114380f, 1.000000f, 0.108459f, 1.000000f, 0.102844f, 1.000000f, 0.097656f, + 1.000000f, 0.092712f, 1.000000f, 0.088013f, 1.000000f, 0.083618f, 1.000000f, 0.079407f, + 1.000000f, 0.075439f, 1.000000f, 0.071594f, 1.000000f, 0.067993f, 1.000000f, 0.064453f, + 1.000000f, 0.061157f, 1.000000f, 0.057953f, 0.999512f, 0.054871f, 1.000000f, 0.051910f, + 1.000000f, 0.049072f, 1.000000f, 0.046326f, 1.000000f, 0.043671f, 1.000000f, 0.041107f, + 1.000000f, 0.038605f, 1.000000f, 0.036194f, 1.000000f, 0.033875f, 1.000000f, 0.031616f, + 1.000000f, 0.029434f, 1.000000f, 0.027298f, 1.000000f, 0.025223f, 1.000000f, 0.023224f, + 1.000000f, 0.021255f, 1.000000f, 0.019363f, 1.000000f, 0.017517f, 1.000000f, 0.015717f, + 1.000000f, 0.013977f, 1.000000f, 0.012291f, 1.000000f, 0.010651f, 1.000000f, 0.009071f, + 1.000000f, 0.007557f, 0.999512f, 0.006104f, 1.000000f, 0.004726f, 0.999512f, 0.003439f, + 0.999512f, 0.002260f, 0.999512f, 0.001228f, 1.000000f, 0.000412f, 0.999512f, 0.000011f, + 0.000000f, 1.000000f, 1.000000f, 0.583008f, 1.000000f, 0.473145f, 1.000000f, 0.404541f, + 1.000000f, 0.355225f, 1.000000f, 0.317139f, 1.000000f, 0.286621f, 1.000000f, 0.261230f, + 1.000000f, 0.239624f, 1.000000f, 0.220947f, 1.000000f, 0.204712f, 1.000000f, 0.190308f, + 1.000000f, 0.177368f, 1.000000f, 0.165771f, 1.000000f, 0.155273f, 1.000000f, 0.145752f, + 1.000000f, 0.137085f, 1.000000f, 0.129028f, 1.000000f, 0.121582f, 1.000000f, 0.114685f, + 1.000000f, 0.108276f, 1.000000f, 0.102295f, 1.000000f, 0.096680f, 1.000000f, 0.091431f, + 1.000000f, 0.086487f, 1.000000f, 0.081787f, 1.000000f, 0.077393f, 1.000000f, 0.073242f, + 1.000000f, 0.069275f, 0.999512f, 0.065552f, 1.000000f, 0.061951f, 1.000000f, 0.058563f, + 0.999512f, 0.055298f, 1.000000f, 0.052216f, 0.999512f, 0.049225f, 1.000000f, 0.046387f, + 1.000000f, 0.043671f, 1.000000f, 0.041046f, 1.000000f, 0.038513f, 1.000000f, 0.036102f, + 1.000000f, 0.033783f, 1.000000f, 0.031525f, 1.000000f, 0.029373f, 1.000000f, 0.027298f, + 1.000000f, 0.025284f, 1.000000f, 0.023346f, 0.999512f, 0.021469f, 1.000000f, 0.019653f, + 1.000000f, 0.017899f, 1.000000f, 0.016220f, 1.000000f, 0.014587f, 1.000000f, 0.013016f, + 1.000000f, 0.011505f, 1.000000f, 0.010048f, 1.000000f, 0.008652f, 1.000000f, 0.007313f, + 1.000000f, 0.006042f, 1.000000f, 0.004837f, 1.000000f, 0.003708f, 1.000000f, 0.002666f, + 1.000000f, 0.001729f, 1.000000f, 0.000923f, 1.000000f, 0.000301f, 1.000000f, 0.000008f, + 0.000000f, 1.000000f, 1.000000f, 0.585938f, 1.000000f, 0.475098f, 1.000000f, 0.405518f, + 1.000000f, 0.355225f, 1.000000f, 0.316650f, 1.000000f, 0.285156f, 1.000000f, 0.259277f, + 1.000000f, 0.237183f, 1.000000f, 0.218140f, 1.000000f, 0.201416f, 1.000000f, 0.186646f, + 1.000000f, 0.173584f, 1.000000f, 0.161743f, 1.000000f, 0.151001f, 1.000000f, 0.141235f, + 1.000000f, 0.132324f, 1.000000f, 0.124207f, 0.999512f, 0.116638f, 1.000000f, 0.109680f, + 1.000000f, 0.103210f, 0.999512f, 0.097168f, 1.000000f, 0.091492f, 1.000000f, 0.086243f, + 1.000000f, 0.081299f, 1.000000f, 0.076660f, 1.000000f, 0.072266f, 1.000000f, 0.068115f, + 1.000000f, 0.064209f, 1.000000f, 0.060516f, 1.000000f, 0.057007f, 1.000000f, 0.053680f, + 1.000000f, 0.050507f, 1.000000f, 0.047485f, 1.000000f, 0.044617f, 1.000000f, 0.041870f, + 1.000000f, 0.039246f, 1.000000f, 0.036743f, 1.000000f, 0.034363f, 0.999512f, 0.032074f, + 1.000000f, 0.029877f, 1.000000f, 0.027771f, 1.000000f, 0.025757f, 1.000000f, 0.023819f, + 1.000000f, 0.021957f, 0.999512f, 0.020172f, 1.000000f, 0.018463f, 1.000000f, 0.016830f, + 1.000000f, 0.015251f, 1.000000f, 0.013741f, 1.000000f, 0.012291f, 0.999512f, 0.010902f, + 1.000000f, 0.009575f, 1.000000f, 0.008308f, 1.000000f, 0.007107f, 1.000000f, 0.005966f, + 1.000000f, 0.004887f, 1.000000f, 0.003880f, 1.000000f, 0.002945f, 1.000000f, 0.002094f, + 0.999512f, 0.001340f, 1.000000f, 0.000703f, 0.999512f, 0.000224f, 1.000000f, 0.000005f, + 0.000000f, 1.000000f, 1.000000f, 0.588379f, 1.000000f, 0.476807f, 1.000000f, 0.406250f, + 1.000000f, 0.355469f, 1.000000f, 0.315918f, 1.000000f, 0.284180f, 1.000000f, 0.257568f, + 1.000000f, 0.235229f, 1.000000f, 0.215698f, 1.000000f, 0.198730f, 1.000000f, 0.183716f, + 1.000000f, 0.170288f, 1.000000f, 0.158203f, 0.999512f, 0.147339f, 1.000000f, 0.137451f, + 0.999512f, 0.128418f, 0.999512f, 0.120178f, 1.000000f, 0.112549f, 0.999512f, 0.105469f, + 1.000000f, 0.098938f, 1.000000f, 0.092896f, 1.000000f, 0.087219f, 1.000000f, 0.081909f, + 1.000000f, 0.076965f, 1.000000f, 0.072327f, 1.000000f, 0.067993f, 1.000000f, 0.063843f, + 1.000000f, 0.059998f, 1.000000f, 0.056366f, 1.000000f, 0.052917f, 1.000000f, 0.049622f, + 1.000000f, 0.046539f, 1.000000f, 0.043610f, 1.000000f, 0.040802f, 1.000000f, 0.038147f, + 1.000000f, 0.035645f, 1.000000f, 0.033234f, 1.000000f, 0.030945f, 1.000000f, 0.028778f, + 1.000000f, 0.026688f, 1.000000f, 0.024704f, 1.000000f, 0.022812f, 1.000000f, 0.021011f, + 1.000000f, 0.019287f, 1.000000f, 0.017639f, 1.000000f, 0.016068f, 1.000000f, 0.014565f, + 0.999512f, 0.013130f, 1.000000f, 0.011772f, 0.999512f, 0.010468f, 1.000000f, 0.009232f, + 1.000000f, 0.008064f, 1.000000f, 0.006954f, 1.000000f, 0.005905f, 1.000000f, 0.004921f, + 0.999512f, 0.004002f, 1.000000f, 0.003149f, 1.000000f, 0.002367f, 1.000000f, 0.001666f, + 1.000000f, 0.001052f, 0.999512f, 0.000543f, 1.000000f, 0.000169f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 1.000000f, 0.590820f, 1.000000f, 0.478271f, 1.000000f, 0.407227f, + 1.000000f, 0.355713f, 1.000000f, 0.315674f, 1.000000f, 0.283203f, 1.000000f, 0.256348f, + 1.000000f, 0.233521f, 1.000000f, 0.213745f, 1.000000f, 0.196411f, 1.000000f, 0.181152f, + 1.000000f, 0.167480f, 1.000000f, 0.155273f, 1.000000f, 0.144287f, 1.000000f, 0.134277f, + 1.000000f, 0.125122f, 1.000000f, 0.116760f, 1.000000f, 0.109070f, 1.000000f, 0.101929f, + 1.000000f, 0.095398f, 1.000000f, 0.089294f, 1.000000f, 0.083618f, 1.000000f, 0.078308f, + 1.000000f, 0.073364f, 1.000000f, 0.068726f, 1.000000f, 0.064392f, 0.999512f, 0.060333f, + 1.000000f, 0.056488f, 1.000000f, 0.052887f, 1.000000f, 0.049500f, 1.000000f, 0.046265f, + 1.000000f, 0.043243f, 1.000000f, 0.040375f, 1.000000f, 0.037659f, 1.000000f, 0.035095f, + 1.000000f, 0.032654f, 1.000000f, 0.030350f, 1.000000f, 0.028152f, 1.000000f, 0.026062f, + 1.000000f, 0.024078f, 1.000000f, 0.022202f, 1.000000f, 0.020416f, 1.000000f, 0.018723f, + 0.999512f, 0.017105f, 0.999512f, 0.015579f, 1.000000f, 0.014122f, 1.000000f, 0.012741f, + 1.000000f, 0.011436f, 1.000000f, 0.010193f, 0.999512f, 0.009018f, 0.999512f, 0.007912f, + 1.000000f, 0.006866f, 1.000000f, 0.005882f, 1.000000f, 0.004963f, 1.000000f, 0.004105f, + 1.000000f, 0.003313f, 1.000000f, 0.002586f, 1.000000f, 0.001926f, 1.000000f, 0.001341f, + 1.000000f, 0.000836f, 1.000000f, 0.000425f, 1.000000f, 0.000129f, 1.000000f, 0.000003f, + 0.000000f, 1.000000f, 1.000000f, 0.592773f, 0.999512f, 0.479492f, 0.999512f, 0.407959f, + 1.000000f, 0.355713f, 1.000000f, 0.315186f, 0.999512f, 0.282471f, 1.000000f, 0.255127f, + 0.999512f, 0.232056f, 1.000000f, 0.212036f, 1.000000f, 0.194458f, 1.000000f, 0.178955f, + 1.000000f, 0.165161f, 0.999512f, 0.152832f, 0.999512f, 0.141724f, 0.999512f, 0.131592f, + 1.000000f, 0.122314f, 1.000000f, 0.113892f, 1.000000f, 0.106140f, 1.000000f, 0.098999f, + 1.000000f, 0.092346f, 1.000000f, 0.086243f, 1.000000f, 0.080566f, 1.000000f, 0.075256f, + 0.999512f, 0.070312f, 0.999512f, 0.065674f, 1.000000f, 0.061401f, 1.000000f, 0.057343f, + 1.000000f, 0.053558f, 1.000000f, 0.049988f, 1.000000f, 0.046631f, 0.999512f, 0.043488f, + 1.000000f, 0.040497f, 1.000000f, 0.037689f, 1.000000f, 0.035034f, 0.999512f, 0.032532f, + 1.000000f, 0.030182f, 1.000000f, 0.027954f, 1.000000f, 0.025833f, 1.000000f, 0.023834f, + 1.000000f, 0.021942f, 1.000000f, 0.020157f, 1.000000f, 0.018463f, 1.000000f, 0.016846f, + 1.000000f, 0.015343f, 1.000000f, 0.013908f, 0.999512f, 0.012550f, 1.000000f, 0.011269f, + 1.000000f, 0.010063f, 0.999512f, 0.008926f, 1.000000f, 0.007858f, 1.000000f, 0.006851f, + 1.000000f, 0.005913f, 1.000000f, 0.005035f, 0.999512f, 0.004219f, 1.000000f, 0.003468f, + 0.999512f, 0.002777f, 1.000000f, 0.002148f, 1.000000f, 0.001586f, 1.000000f, 0.001092f, + 1.000000f, 0.000673f, 1.000000f, 0.000337f, 1.000000f, 0.000100f, 1.000000f, 0.000002f, + 0.000000f, 1.000000f, 1.000000f, 0.594238f, 1.000000f, 0.480713f, 1.000000f, 0.408447f, + 1.000000f, 0.355957f, 0.999512f, 0.314941f, 1.000000f, 0.281982f, 1.000000f, 0.254395f, + 1.000000f, 0.230835f, 1.000000f, 0.210571f, 1.000000f, 0.192871f, 0.999512f, 0.177246f, + 1.000000f, 0.163208f, 1.000000f, 0.150757f, 0.999512f, 0.139526f, 1.000000f, 0.129272f, + 1.000000f, 0.119934f, 1.000000f, 0.111450f, 1.000000f, 0.103638f, 1.000000f, 0.096436f, + 0.999512f, 0.089783f, 0.999512f, 0.083679f, 1.000000f, 0.077942f, 0.999512f, 0.072693f, + 1.000000f, 0.067749f, 1.000000f, 0.063171f, 1.000000f, 0.058868f, 1.000000f, 0.054840f, + 1.000000f, 0.051086f, 1.000000f, 0.047546f, 0.999512f, 0.044250f, 1.000000f, 0.041138f, + 1.000000f, 0.038208f, 1.000000f, 0.035461f, 1.000000f, 0.032867f, 1.000000f, 0.030426f, + 1.000000f, 0.028137f, 1.000000f, 0.025970f, 1.000000f, 0.023926f, 1.000000f, 0.021988f, + 1.000000f, 0.020172f, 1.000000f, 0.018463f, 0.999512f, 0.016846f, 1.000000f, 0.015327f, + 1.000000f, 0.013893f, 1.000000f, 0.012543f, 1.000000f, 0.011269f, 1.000000f, 0.010071f, + 1.000000f, 0.008949f, 1.000000f, 0.007904f, 1.000000f, 0.006920f, 1.000000f, 0.006004f, + 1.000000f, 0.005150f, 1.000000f, 0.004360f, 1.000000f, 0.003632f, 1.000000f, 0.002962f, + 1.000000f, 0.002354f, 1.000000f, 0.001807f, 1.000000f, 0.001322f, 1.000000f, 0.000901f, + 0.999512f, 0.000548f, 0.999512f, 0.000270f, 1.000000f, 0.000079f, 1.000000f, 0.000002f, + 0.000000f, 1.000000f, 1.000000f, 0.595703f, 1.000000f, 0.481689f, 1.000000f, 0.408936f, + 1.000000f, 0.355957f, 1.000000f, 0.314697f, 1.000000f, 0.281250f, 1.000000f, 0.253418f, + 1.000000f, 0.229858f, 1.000000f, 0.209351f, 1.000000f, 0.191406f, 1.000000f, 0.175659f, + 1.000000f, 0.161621f, 1.000000f, 0.148926f, 1.000000f, 0.137573f, 0.999512f, 0.127319f, + 1.000000f, 0.117920f, 1.000000f, 0.109375f, 1.000000f, 0.101501f, 1.000000f, 0.094299f, + 1.000000f, 0.087646f, 1.000000f, 0.081482f, 1.000000f, 0.075806f, 1.000000f, 0.070496f, + 1.000000f, 0.065552f, 1.000000f, 0.061005f, 1.000000f, 0.056732f, 1.000000f, 0.052734f, + 1.000000f, 0.049011f, 1.000000f, 0.045502f, 1.000000f, 0.042236f, 1.000000f, 0.039185f, + 0.999512f, 0.036285f, 0.999512f, 0.033600f, 1.000000f, 0.031052f, 1.000000f, 0.028671f, + 1.000000f, 0.026428f, 1.000000f, 0.024323f, 0.999512f, 0.022339f, 0.999512f, 0.020477f, + 1.000000f, 0.018723f, 1.000000f, 0.017075f, 1.000000f, 0.015526f, 1.000000f, 0.014069f, + 1.000000f, 0.012703f, 1.000000f, 0.011421f, 1.000000f, 0.010223f, 1.000000f, 0.009102f, + 1.000000f, 0.008049f, 1.000000f, 0.007076f, 1.000000f, 0.006165f, 1.000000f, 0.005322f, + 1.000000f, 0.004539f, 1.000000f, 0.003820f, 1.000000f, 0.003162f, 1.000000f, 0.002563f, + 0.999512f, 0.002022f, 0.999512f, 0.001540f, 1.000000f, 0.001117f, 1.000000f, 0.000753f, + 0.999512f, 0.000453f, 1.000000f, 0.000220f, 1.000000f, 0.000063f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.596680f, 1.000000f, 0.482422f, 1.000000f, 0.409424f, + 1.000000f, 0.356201f, 1.000000f, 0.314697f, 0.999512f, 0.281006f, 1.000000f, 0.252930f, + 0.999512f, 0.229004f, 0.999512f, 0.208252f, 1.000000f, 0.190308f, 1.000000f, 0.174316f, + 0.999512f, 0.160156f, 1.000000f, 0.147461f, 1.000000f, 0.135986f, 1.000000f, 0.125610f, + 0.999512f, 0.116211f, 1.000000f, 0.107605f, 1.000000f, 0.099731f, 1.000000f, 0.092468f, + 1.000000f, 0.085815f, 1.000000f, 0.079651f, 1.000000f, 0.073975f, 1.000000f, 0.068665f, + 1.000000f, 0.063782f, 1.000000f, 0.059204f, 1.000000f, 0.054932f, 1.000000f, 0.050964f, + 1.000000f, 0.047272f, 1.000000f, 0.043793f, 1.000000f, 0.040558f, 0.999512f, 0.037537f, + 1.000000f, 0.034698f, 1.000000f, 0.032043f, 1.000000f, 0.029541f, 1.000000f, 0.027206f, + 1.000000f, 0.025009f, 1.000000f, 0.022949f, 1.000000f, 0.021027f, 1.000000f, 0.019211f, + 1.000000f, 0.017517f, 1.000000f, 0.015915f, 1.000000f, 0.014435f, 1.000000f, 0.013039f, + 1.000000f, 0.011734f, 0.999512f, 0.010513f, 1.000000f, 0.009369f, 0.999512f, 0.008308f, + 0.999512f, 0.007320f, 0.999512f, 0.006405f, 1.000000f, 0.005554f, 1.000000f, 0.004772f, + 1.000000f, 0.004047f, 1.000000f, 0.003389f, 1.000000f, 0.002789f, 1.000000f, 0.002245f, + 1.000000f, 0.001760f, 0.999512f, 0.001329f, 1.000000f, 0.000956f, 1.000000f, 0.000638f, + 1.000000f, 0.000379f, 0.999512f, 0.000182f, 1.000000f, 0.000051f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.597656f, 1.000000f, 0.483154f, 1.000000f, 0.409912f, + 1.000000f, 0.356201f, 1.000000f, 0.314453f, 1.000000f, 0.280518f, 1.000000f, 0.252197f, + 1.000000f, 0.228271f, 1.000000f, 0.207397f, 1.000000f, 0.189209f, 1.000000f, 0.173218f, + 1.000000f, 0.158936f, 1.000000f, 0.146118f, 1.000000f, 0.134644f, 0.999512f, 0.124268f, + 1.000000f, 0.114807f, 1.000000f, 0.106140f, 1.000000f, 0.098206f, 0.999512f, 0.090942f, + 1.000000f, 0.084290f, 1.000000f, 0.078125f, 1.000000f, 0.072388f, 0.999512f, 0.067139f, + 1.000000f, 0.062225f, 0.999512f, 0.057678f, 1.000000f, 0.053436f, 1.000000f, 0.049500f, + 1.000000f, 0.045807f, 1.000000f, 0.042358f, 1.000000f, 0.039154f, 1.000000f, 0.036163f, + 1.000000f, 0.033356f, 1.000000f, 0.030746f, 1.000000f, 0.028290f, 1.000000f, 0.025986f, + 1.000000f, 0.023834f, 1.000000f, 0.021820f, 1.000000f, 0.019943f, 1.000000f, 0.018173f, + 1.000000f, 0.016525f, 1.000000f, 0.014977f, 1.000000f, 0.013535f, 1.000000f, 0.012192f, + 1.000000f, 0.010933f, 1.000000f, 0.009766f, 1.000000f, 0.008675f, 1.000000f, 0.007664f, + 1.000000f, 0.006729f, 1.000000f, 0.005859f, 1.000000f, 0.005062f, 1.000000f, 0.004326f, + 1.000000f, 0.003656f, 1.000000f, 0.003044f, 1.000000f, 0.002489f, 1.000000f, 0.001993f, + 1.000000f, 0.001552f, 1.000000f, 0.001163f, 1.000000f, 0.000830f, 1.000000f, 0.000549f, + 1.000000f, 0.000323f, 0.999512f, 0.000152f, 1.000000f, 0.000042f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.598633f, 0.999512f, 0.483887f, 1.000000f, 0.410156f, + 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f, + 1.000000f, 0.227661f, 1.000000f, 0.206665f, 1.000000f, 0.188354f, 1.000000f, 0.172241f, + 0.999512f, 0.157959f, 1.000000f, 0.145020f, 0.999512f, 0.133545f, 1.000000f, 0.123047f, + 0.999512f, 0.113525f, 1.000000f, 0.104858f, 0.999512f, 0.096924f, 1.000000f, 0.089661f, + 1.000000f, 0.082947f, 0.999512f, 0.076782f, 1.000000f, 0.071106f, 0.999512f, 0.065796f, + 1.000000f, 0.060944f, 0.999512f, 0.056396f, 1.000000f, 0.052185f, 1.000000f, 0.048248f, + 0.999512f, 0.044586f, 0.999512f, 0.041168f, 1.000000f, 0.037994f, 1.000000f, 0.035034f, + 1.000000f, 0.032257f, 0.999512f, 0.029663f, 0.999512f, 0.027237f, 1.000000f, 0.024979f, + 1.000000f, 0.022858f, 1.000000f, 0.020889f, 1.000000f, 0.019043f, 1.000000f, 0.017319f, + 1.000000f, 0.015701f, 1.000000f, 0.014206f, 0.999512f, 0.012802f, 0.999512f, 0.011497f, + 1.000000f, 0.010284f, 1.000000f, 0.009155f, 1.000000f, 0.008110f, 1.000000f, 0.007141f, + 1.000000f, 0.006245f, 1.000000f, 0.005421f, 1.000000f, 0.004662f, 1.000000f, 0.003971f, + 1.000000f, 0.003340f, 0.999512f, 0.002768f, 1.000000f, 0.002253f, 1.000000f, 0.001793f, + 1.000000f, 0.001387f, 1.000000f, 0.001033f, 1.000000f, 0.000731f, 1.000000f, 0.000479f, + 1.000000f, 0.000279f, 0.999512f, 0.000130f, 1.000000f, 0.000035f, 1.000000f, 0.000001f, + 0.000000f, 1.000000f, 1.000000f, 0.599609f, 1.000000f, 0.484375f, 1.000000f, 0.410645f, + 0.999512f, 0.356445f, 1.000000f, 0.314209f, 1.000000f, 0.280029f, 0.999512f, 0.251465f, + 0.999512f, 0.227051f, 0.999512f, 0.206055f, 1.000000f, 0.187622f, 0.999512f, 0.171509f, + 1.000000f, 0.156982f, 1.000000f, 0.144165f, 1.000000f, 0.132568f, 1.000000f, 0.122070f, + 1.000000f, 0.112549f, 1.000000f, 0.103821f, 1.000000f, 0.095886f, 1.000000f, 0.088562f, + 0.999512f, 0.081909f, 0.999512f, 0.075684f, 1.000000f, 0.070007f, 1.000000f, 0.064758f, + 1.000000f, 0.059845f, 1.000000f, 0.055328f, 1.000000f, 0.051117f, 1.000000f, 0.047211f, + 1.000000f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 1.000000f, 0.034058f, + 1.000000f, 0.031311f, 1.000000f, 0.028763f, 1.000000f, 0.026382f, 1.000000f, 0.024139f, + 1.000000f, 0.022064f, 1.000000f, 0.020111f, 1.000000f, 0.018295f, 0.999512f, 0.016602f, + 1.000000f, 0.015038f, 0.999512f, 0.013565f, 1.000000f, 0.012199f, 0.999512f, 0.010933f, + 0.999512f, 0.009750f, 1.000000f, 0.008659f, 1.000000f, 0.007648f, 1.000000f, 0.006718f, + 0.999512f, 0.005856f, 1.000000f, 0.005066f, 0.999512f, 0.004341f, 0.999512f, 0.003685f, + 0.999512f, 0.003086f, 1.000000f, 0.002546f, 1.000000f, 0.002062f, 1.000000f, 0.001634f, + 1.000000f, 0.001256f, 1.000000f, 0.000930f, 1.000000f, 0.000653f, 1.000000f, 0.000425f, + 1.000000f, 0.000245f, 1.000000f, 0.000113f, 1.000000f, 0.000030f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600098f, 1.000000f, 0.484863f, 1.000000f, 0.410889f, + 0.999512f, 0.356689f, 1.000000f, 0.314209f, 0.999512f, 0.279785f, 1.000000f, 0.250977f, + 1.000000f, 0.226685f, 1.000000f, 0.205566f, 1.000000f, 0.187012f, 1.000000f, 0.170776f, + 1.000000f, 0.156372f, 1.000000f, 0.143311f, 0.999512f, 0.131714f, 1.000000f, 0.121216f, + 1.000000f, 0.111633f, 1.000000f, 0.102966f, 1.000000f, 0.094971f, 1.000000f, 0.087708f, + 1.000000f, 0.080994f, 0.999512f, 0.074768f, 1.000000f, 0.069092f, 1.000000f, 0.063843f, + 1.000000f, 0.058960f, 0.999512f, 0.054443f, 0.999512f, 0.050232f, 1.000000f, 0.046356f, + 1.000000f, 0.042725f, 1.000000f, 0.039337f, 0.999512f, 0.036224f, 1.000000f, 0.033295f, + 1.000000f, 0.030579f, 1.000000f, 0.028030f, 1.000000f, 0.025665f, 1.000000f, 0.023453f, + 1.000000f, 0.021393f, 0.999512f, 0.019485f, 1.000000f, 0.017700f, 0.999512f, 0.016037f, + 1.000000f, 0.014488f, 1.000000f, 0.013046f, 0.999512f, 0.011711f, 0.999512f, 0.010468f, + 1.000000f, 0.009323f, 0.999512f, 0.008255f, 1.000000f, 0.007278f, 0.999512f, 0.006374f, + 1.000000f, 0.005543f, 0.999512f, 0.004780f, 0.999512f, 0.004086f, 1.000000f, 0.003456f, + 0.999512f, 0.002884f, 1.000000f, 0.002371f, 0.999512f, 0.001913f, 1.000000f, 0.001508f, + 1.000000f, 0.001154f, 0.999512f, 0.000850f, 1.000000f, 0.000593f, 1.000000f, 0.000383f, + 1.000000f, 0.000219f, 1.000000f, 0.000099f, 1.000000f, 0.000026f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.600586f, 0.999512f, 0.485352f, 1.000000f, 0.411133f, + 1.000000f, 0.356689f, 1.000000f, 0.314209f, 1.000000f, 0.279541f, 0.999512f, 0.250732f, + 0.999512f, 0.226318f, 1.000000f, 0.205078f, 0.999512f, 0.186523f, 1.000000f, 0.170288f, + 1.000000f, 0.155762f, 1.000000f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f, + 1.000000f, 0.110962f, 1.000000f, 0.102234f, 1.000000f, 0.094238f, 1.000000f, 0.086914f, + 1.000000f, 0.080200f, 1.000000f, 0.074036f, 1.000000f, 0.068359f, 0.999512f, 0.063049f, + 1.000000f, 0.058228f, 1.000000f, 0.053711f, 1.000000f, 0.049530f, 1.000000f, 0.045654f, + 1.000000f, 0.042023f, 0.999512f, 0.038666f, 1.000000f, 0.035553f, 1.000000f, 0.032654f, + 0.999512f, 0.029953f, 0.999512f, 0.027435f, 1.000000f, 0.025085f, 0.999512f, 0.022903f, + 1.000000f, 0.020859f, 1.000000f, 0.018967f, 1.000000f, 0.017197f, 1.000000f, 0.015564f, + 1.000000f, 0.014046f, 1.000000f, 0.012627f, 1.000000f, 0.011314f, 0.999512f, 0.010101f, + 1.000000f, 0.008972f, 1.000000f, 0.007935f, 1.000000f, 0.006981f, 1.000000f, 0.006100f, + 1.000000f, 0.005291f, 1.000000f, 0.004555f, 1.000000f, 0.003883f, 1.000000f, 0.003275f, + 1.000000f, 0.002726f, 1.000000f, 0.002232f, 1.000000f, 0.001795f, 1.000000f, 0.001410f, + 1.000000f, 0.001074f, 0.999512f, 0.000787f, 1.000000f, 0.000546f, 1.000000f, 0.000350f, + 0.999512f, 0.000198f, 1.000000f, 0.000089f, 1.000000f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601074f, 1.000000f, 0.485596f, 1.000000f, 0.411133f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279541f, 0.999512f, 0.250488f, + 1.000000f, 0.225952f, 1.000000f, 0.204712f, 1.000000f, 0.186157f, 1.000000f, 0.169800f, + 1.000000f, 0.155273f, 0.999512f, 0.142212f, 1.000000f, 0.130493f, 1.000000f, 0.119934f, + 1.000000f, 0.110352f, 1.000000f, 0.101624f, 1.000000f, 0.093628f, 1.000000f, 0.086304f, + 1.000000f, 0.079590f, 0.999512f, 0.073425f, 1.000000f, 0.067749f, 1.000000f, 0.062469f, + 1.000000f, 0.057617f, 1.000000f, 0.053101f, 1.000000f, 0.048950f, 1.000000f, 0.045074f, + 1.000000f, 0.041473f, 1.000000f, 0.038116f, 1.000000f, 0.035034f, 1.000000f, 0.032135f, + 1.000000f, 0.029449f, 1.000000f, 0.026947f, 1.000000f, 0.024612f, 1.000000f, 0.022446f, + 1.000000f, 0.020432f, 1.000000f, 0.018555f, 0.999512f, 0.016815f, 1.000000f, 0.015190f, + 0.999512f, 0.013687f, 1.000000f, 0.012291f, 1.000000f, 0.011002f, 1.000000f, 0.009804f, + 0.999512f, 0.008698f, 1.000000f, 0.007683f, 1.000000f, 0.006744f, 1.000000f, 0.005882f, + 1.000000f, 0.005093f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 1.000000f, 0.003132f, + 1.000000f, 0.002600f, 1.000000f, 0.002125f, 1.000000f, 0.001703f, 0.999512f, 0.001333f, + 1.000000f, 0.001012f, 1.000000f, 0.000739f, 1.000000f, 0.000510f, 1.000000f, 0.000326f, + 1.000000f, 0.000183f, 1.000000f, 0.000082f, 1.000000f, 0.000021f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.485840f, 1.000000f, 0.411377f, + 0.999512f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f, + 0.999512f, 0.225708f, 1.000000f, 0.204468f, 1.000000f, 0.185791f, 1.000000f, 0.169434f, + 1.000000f, 0.154785f, 1.000000f, 0.141724f, 1.000000f, 0.130005f, 0.999512f, 0.119507f, + 1.000000f, 0.109863f, 1.000000f, 0.101135f, 0.999512f, 0.093140f, 1.000000f, 0.085815f, + 1.000000f, 0.079102f, 1.000000f, 0.072937f, 1.000000f, 0.067261f, 1.000000f, 0.061981f, + 1.000000f, 0.057129f, 1.000000f, 0.052643f, 0.999512f, 0.048462f, 1.000000f, 0.044617f, + 1.000000f, 0.041016f, 1.000000f, 0.037689f, 1.000000f, 0.034607f, 1.000000f, 0.031708f, + 0.999512f, 0.029053f, 1.000000f, 0.026550f, 0.999512f, 0.024246f, 1.000000f, 0.022095f, + 1.000000f, 0.020081f, 0.999512f, 0.018219f, 0.999512f, 0.016495f, 1.000000f, 0.014900f, + 0.999512f, 0.013405f, 1.000000f, 0.012032f, 1.000000f, 0.010750f, 1.000000f, 0.009575f, + 1.000000f, 0.008484f, 1.000000f, 0.007481f, 0.999512f, 0.006557f, 1.000000f, 0.005714f, + 1.000000f, 0.004940f, 1.000000f, 0.004234f, 1.000000f, 0.003597f, 1.000000f, 0.003021f, + 1.000000f, 0.002502f, 1.000000f, 0.002041f, 1.000000f, 0.001633f, 1.000000f, 0.001274f, + 0.999512f, 0.000965f, 0.999512f, 0.000702f, 1.000000f, 0.000483f, 1.000000f, 0.000307f, + 0.999512f, 0.000172f, 1.000000f, 0.000076f, 1.000000f, 0.000019f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.601562f, 1.000000f, 0.486084f, 1.000000f, 0.411377f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279297f, 1.000000f, 0.250244f, + 1.000000f, 0.225464f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 1.000000f, 0.154541f, 1.000000f, 0.141479f, 1.000000f, 0.129639f, 1.000000f, 0.119141f, + 1.000000f, 0.109497f, 1.000000f, 0.100769f, 0.999512f, 0.092773f, 1.000000f, 0.085449f, + 1.000000f, 0.078735f, 1.000000f, 0.072510f, 1.000000f, 0.066833f, 1.000000f, 0.061615f, + 1.000000f, 0.056763f, 1.000000f, 0.052277f, 1.000000f, 0.048096f, 1.000000f, 0.044250f, + 1.000000f, 0.040680f, 1.000000f, 0.037354f, 0.999512f, 0.034271f, 1.000000f, 0.031403f, + 1.000000f, 0.028732f, 1.000000f, 0.026260f, 1.000000f, 0.023956f, 1.000000f, 0.021805f, + 0.999512f, 0.019821f, 1.000000f, 0.017975f, 0.999512f, 0.016251f, 1.000000f, 0.014671f, + 1.000000f, 0.013191f, 1.000000f, 0.011826f, 1.000000f, 0.010559f, 1.000000f, 0.009392f, + 1.000000f, 0.008316f, 0.999512f, 0.007328f, 1.000000f, 0.006416f, 1.000000f, 0.005585f, + 1.000000f, 0.004822f, 1.000000f, 0.004131f, 0.999512f, 0.003504f, 1.000000f, 0.002937f, + 1.000000f, 0.002430f, 1.000000f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f, + 1.000000f, 0.000929f, 1.000000f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f, + 1.000000f, 0.000163f, 1.000000f, 0.000072f, 1.000000f, 0.000018f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486084f, 0.999512f, 0.411621f, + 1.000000f, 0.356689f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225342f, 1.000000f, 0.203979f, 1.000000f, 0.185303f, 1.000000f, 0.168823f, + 1.000000f, 0.154297f, 1.000000f, 0.141235f, 1.000000f, 0.129395f, 1.000000f, 0.118835f, + 1.000000f, 0.109192f, 1.000000f, 0.100464f, 1.000000f, 0.092468f, 1.000000f, 0.085144f, + 1.000000f, 0.078430f, 1.000000f, 0.072266f, 0.999512f, 0.066528f, 1.000000f, 0.061310f, + 1.000000f, 0.056458f, 1.000000f, 0.051971f, 1.000000f, 0.047821f, 1.000000f, 0.043976f, + 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f, + 1.000000f, 0.028503f, 0.999512f, 0.026031f, 1.000000f, 0.023727f, 1.000000f, 0.021606f, + 1.000000f, 0.019623f, 1.000000f, 0.017776f, 1.000000f, 0.016068f, 1.000000f, 0.014496f, + 1.000000f, 0.013031f, 1.000000f, 0.011673f, 1.000000f, 0.010414f, 1.000000f, 0.009262f, + 1.000000f, 0.008194f, 1.000000f, 0.007214f, 1.000000f, 0.006313f, 1.000000f, 0.005489f, + 0.999512f, 0.004734f, 1.000000f, 0.004051f, 1.000000f, 0.003433f, 1.000000f, 0.002876f, + 1.000000f, 0.002377f, 0.999512f, 0.001932f, 1.000000f, 0.001540f, 1.000000f, 0.001198f, + 1.000000f, 0.000904f, 1.000000f, 0.000654f, 0.999512f, 0.000448f, 1.000000f, 0.000283f, + 1.000000f, 0.000157f, 1.000000f, 0.000069f, 1.000000f, 0.000017f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225220f, 1.000000f, 0.203857f, 1.000000f, 0.185181f, 0.999512f, 0.168701f, + 1.000000f, 0.154053f, 0.999512f, 0.140991f, 1.000000f, 0.129272f, 1.000000f, 0.118652f, + 1.000000f, 0.109009f, 1.000000f, 0.100220f, 1.000000f, 0.092224f, 1.000000f, 0.084900f, + 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 1.000000f, 0.061096f, + 0.999512f, 0.056244f, 1.000000f, 0.051758f, 1.000000f, 0.047607f, 1.000000f, 0.043762f, + 1.000000f, 0.040222f, 0.999512f, 0.036896f, 1.000000f, 0.033813f, 1.000000f, 0.030975f, + 1.000000f, 0.028320f, 1.000000f, 0.025864f, 1.000000f, 0.023575f, 1.000000f, 0.021454f, + 1.000000f, 0.019470f, 1.000000f, 0.017639f, 1.000000f, 0.015945f, 1.000000f, 0.014374f, + 1.000000f, 0.012917f, 1.000000f, 0.011566f, 1.000000f, 0.010315f, 1.000000f, 0.009163f, + 0.999512f, 0.008102f, 1.000000f, 0.007133f, 1.000000f, 0.006237f, 1.000000f, 0.005421f, + 1.000000f, 0.004673f, 1.000000f, 0.003998f, 0.999512f, 0.003384f, 1.000000f, 0.002832f, + 0.999512f, 0.002338f, 0.999512f, 0.001900f, 1.000000f, 0.001513f, 1.000000f, 0.001176f, + 0.999512f, 0.000886f, 1.000000f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f, + 1.000000f, 0.000153f, 1.000000f, 0.000067f, 1.000000f, 0.000017f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f, + 0.999512f, 0.153931f, 1.000000f, 0.140869f, 1.000000f, 0.129150f, 0.999512f, 0.118469f, + 0.999512f, 0.108887f, 1.000000f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f, + 0.999512f, 0.078064f, 1.000000f, 0.071899f, 1.000000f, 0.066162f, 1.000000f, 0.060944f, + 1.000000f, 0.056122f, 0.999512f, 0.051636f, 1.000000f, 0.047485f, 1.000000f, 0.043640f, + 1.000000f, 0.040070f, 1.000000f, 0.036774f, 1.000000f, 0.033691f, 1.000000f, 0.030869f, + 1.000000f, 0.028214f, 1.000000f, 0.025757f, 1.000000f, 0.023468f, 1.000000f, 0.021347f, + 1.000000f, 0.019379f, 1.000000f, 0.017548f, 1.000000f, 0.015854f, 1.000000f, 0.014290f, + 0.999512f, 0.012840f, 1.000000f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008049f, 1.000000f, 0.007080f, 0.999512f, 0.006187f, 0.999512f, 0.005375f, + 1.000000f, 0.004635f, 0.999512f, 0.003960f, 1.000000f, 0.003353f, 1.000000f, 0.002804f, + 0.999512f, 0.002314f, 1.000000f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f, + 1.000000f, 0.000875f, 1.000000f, 0.000632f, 1.000000f, 0.000432f, 1.000000f, 0.000272f, + 1.000000f, 0.000151f, 0.999512f, 0.000066f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 0.999512f, 0.356934f, 1.000000f, 0.313965f, 0.999512f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 0.999512f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.100037f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 0.999512f, 0.071777f, 1.000000f, 0.066101f, 0.999512f, 0.060883f, + 1.000000f, 0.056030f, 0.999512f, 0.051544f, 1.000000f, 0.047424f, 0.999512f, 0.043579f, + 1.000000f, 0.040009f, 1.000000f, 0.036713f, 0.999512f, 0.033630f, 1.000000f, 0.030792f, + 1.000000f, 0.028152f, 1.000000f, 0.025696f, 1.000000f, 0.023407f, 1.000000f, 0.021301f, + 1.000000f, 0.019333f, 1.000000f, 0.017502f, 0.999512f, 0.015808f, 1.000000f, 0.014244f, + 1.000000f, 0.012794f, 1.000000f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f, + 0.999512f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005352f, + 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003336f, 1.000000f, 0.002789f, + 1.000000f, 0.002300f, 1.000000f, 0.001868f, 1.000000f, 0.001486f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 1.000000f, 0.000428f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f, + 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.997070f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996582f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.996094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.995605f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.994629f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000912f, 0.993652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001939f, 0.993164f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.002798f, 0.992676f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.003477f, 0.991699f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.004002f, 0.990234f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.005341f, 0.989258f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.006973f, 0.987305f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.008606f, 0.985352f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998047f, 0.011108f, 0.982910f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001425f, 0.997070f, 0.014374f, 0.979492f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.002775f, 0.996582f, 0.018860f, 0.975586f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000144f, 0.998047f, 0.003784f, 0.996094f, 0.024811f, 0.969727f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.002699f, 0.997559f, 0.004440f, 0.994629f, 0.034180f, 0.961426f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.002378f, 0.997559f, 0.003843f, 0.996582f, 0.007648f, 0.993164f, 0.047485f, 0.950684f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000106f, 0.999023f, 0.001904f, 0.998047f, 0.002897f, 0.997559f, + 0.003870f, 0.996582f, 0.005512f, 0.995117f, 0.011642f, 0.989746f, 0.068420f, 0.933594f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001366f, 0.999023f, 0.002296f, 0.998535f, + 0.002888f, 0.998047f, 0.003391f, 0.997559f, 0.003883f, 0.997070f, 0.004372f, 0.996582f, + 0.006683f, 0.994629f, 0.009514f, 0.992188f, 0.019272f, 0.984375f, 0.102539f, 0.907715f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000374f, 0.999512f, 0.001418f, 0.999023f, + 0.001929f, 0.998535f, 0.002419f, 0.998535f, 0.002895f, 0.998047f, 0.003201f, 0.998047f, + 0.003405f, 0.997559f, 0.003880f, 0.997559f, 0.003897f, 0.997070f, 0.004379f, 0.997070f, + 0.004784f, 0.996094f, 0.006626f, 0.995605f, 0.008133f, 0.994629f, 0.009506f, 0.992676f, + 0.012962f, 0.990723f, 0.019562f, 0.985840f, 0.037567f, 0.972656f, 0.159668f, 0.867188f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000064f, 0.999512f, 0.000964f, 0.999512f, + 0.001456f, 0.999023f, 0.001945f, 0.999023f, 0.002424f, 0.998535f, 0.002436f, 0.998535f, + 0.002918f, 0.998535f, 0.002924f, 0.998047f, 0.003403f, 0.998047f, 0.003412f, 0.998047f, + 0.003733f, 0.997559f, 0.003897f, 0.997559f, 0.003901f, 0.997559f, 0.004292f, 0.997559f, + 0.004383f, 0.997070f, 0.004387f, 0.997070f, 0.004391f, 0.997070f, 0.005638f, 0.996582f, + 0.006310f, 0.996094f, 0.006813f, 0.995605f, 0.007763f, 0.995117f, 0.008270f, 0.995117f, + 0.008751f, 0.994629f, 0.010361f, 0.993652f, 0.011818f, 0.992676f, 0.013054f, 0.991699f, + 0.015396f, 0.990723f, 0.018417f, 0.988770f, 0.022064f, 0.986816f, 0.027237f, 0.983398f, + 0.035950f, 0.978027f, 0.051636f, 0.968262f, 0.089050f, 0.942871f, 0.253662f, 0.802734f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001949f, 0.999023f, 0.002439f, 0.998535f, + 0.002928f, 0.998047f, 0.003416f, 0.997559f, 0.003899f, 0.997559f, 0.003904f, 0.997559f, + 0.004379f, 0.997070f, 0.004391f, 0.997070f, 0.004391f, 0.997070f, 0.005844f, 0.996582f, + 0.006790f, 0.996094f, 0.007160f, 0.996094f, 0.007317f, 0.995605f, 0.008286f, 0.995117f, + 0.008293f, 0.995117f, 0.008774f, 0.995117f, 0.009735f, 0.994629f, 0.010704f, 0.994141f, + 0.011215f, 0.993652f, 0.012184f, 0.993652f, 0.012642f, 0.993164f, 0.013733f, 0.992676f, + 0.014603f, 0.992188f, 0.015579f, 0.992188f, 0.016418f, 0.991699f, 0.017120f, 0.991211f, + 0.019241f, 0.990723f, 0.019836f, 0.990234f, 0.020416f, 0.989746f, 0.022781f, 0.989258f, + 0.023727f, 0.988281f, 0.024826f, 0.987793f, 0.026901f, 0.987305f, 0.027756f, 0.986328f, + 0.029617f, 0.985840f, 0.032043f, 0.984863f, 0.034210f, 0.983887f, 0.036804f, 0.982910f, + 0.039612f, 0.981934f, 0.041321f, 0.980957f, 0.044220f, 0.979492f, 0.048370f, 0.978027f, + 0.051941f, 0.976562f, 0.055420f, 0.974609f, 0.059326f, 0.972656f, 0.064880f, 0.970703f, + 0.070557f, 0.967773f, 0.077026f, 0.964844f, 0.085449f, 0.961426f, 0.094055f, 0.957031f, + 0.104126f, 0.952148f, 0.117554f, 0.945801f, 0.133179f, 0.937500f, 0.154053f, 0.926758f, + 0.181152f, 0.911133f, 0.219604f, 0.887207f, 0.281738f, 0.841797f, 0.392822f, 0.706055f, + 0.000000f, 1.000000f, 0.600586f, 0.700195f, 0.647461f, 0.655273f, 0.678711f, 0.636719f, + 0.704590f, 0.626953f, 0.724609f, 0.621094f, 0.743652f, 0.617676f, 0.759277f, 0.614746f, + 0.773438f, 0.612305f, 0.784180f, 0.610840f, 0.796875f, 0.608887f, 0.806152f, 0.607422f, + 0.815430f, 0.605469f, 0.824219f, 0.604004f, 0.831543f, 0.602051f, 0.839355f, 0.600586f, + 0.845703f, 0.598633f, 0.851074f, 0.596680f, 0.857422f, 0.594238f, 0.864258f, 0.592285f, + 0.868652f, 0.589844f, 0.874512f, 0.587402f, 0.878906f, 0.584961f, 0.883301f, 0.582031f, + 0.887207f, 0.579590f, 0.891602f, 0.576660f, 0.895508f, 0.573730f, 0.899414f, 0.570801f, + 0.902832f, 0.567383f, 0.905273f, 0.563965f, 0.908691f, 0.560547f, 0.912109f, 0.557129f, + 0.914551f, 0.553223f, 0.917480f, 0.549316f, 0.919922f, 0.545410f, 0.922363f, 0.541016f, + 0.924805f, 0.536621f, 0.927734f, 0.532227f, 0.929688f, 0.527344f, 0.932617f, 0.522461f, + 0.934570f, 0.517090f, 0.936035f, 0.511719f, 0.939941f, 0.505859f, 0.940918f, 0.500000f, + 0.942871f, 0.493896f, 0.945312f, 0.487061f, 0.946777f, 0.480225f, 0.948730f, 0.472900f, + 0.949707f, 0.464844f, 0.951660f, 0.456543f, 0.953125f, 0.447510f, 0.956543f, 0.437744f, + 0.957520f, 0.427246f, 0.958496f, 0.416016f, 0.960449f, 0.403564f, 0.961914f, 0.389648f, + 0.963867f, 0.374268f, 0.965820f, 0.356689f, 0.966797f, 0.336426f, 0.968750f, 0.312500f, + 0.971191f, 0.282471f, 0.973633f, 0.242798f, 0.975098f, 0.183105f, 0.976562f, 0.067505f, + 0.000000f, 1.000000f, 0.776367f, 0.615723f, 0.843262f, 0.534180f, 0.880859f, 0.493896f, + 0.903320f, 0.469971f, 0.918945f, 0.454102f, 0.929199f, 0.442627f, 0.938965f, 0.433838f, + 0.945312f, 0.427002f, 0.950195f, 0.421143f, 0.956055f, 0.416016f, 0.959961f, 0.411377f, + 0.963379f, 0.407227f, 0.965820f, 0.403320f, 0.968262f, 0.399658f, 0.970215f, 0.396240f, + 0.971680f, 0.392822f, 0.974121f, 0.389160f, 0.975586f, 0.385986f, 0.977051f, 0.382324f, + 0.978027f, 0.378906f, 0.979980f, 0.375488f, 0.980469f, 0.372070f, 0.981934f, 0.368408f, + 0.982422f, 0.364990f, 0.982910f, 0.361328f, 0.983887f, 0.357666f, 0.984375f, 0.353760f, + 0.985840f, 0.349854f, 0.986328f, 0.345703f, 0.986816f, 0.341553f, 0.987305f, 0.337402f, + 0.987793f, 0.333252f, 0.987793f, 0.328857f, 0.988281f, 0.324463f, 0.989258f, 0.319824f, + 0.989746f, 0.314941f, 0.990723f, 0.309814f, 0.990723f, 0.304688f, 0.991211f, 0.299561f, + 0.991211f, 0.294189f, 0.991211f, 0.288574f, 0.991699f, 0.282715f, 0.991699f, 0.276611f, + 0.991699f, 0.270508f, 0.992676f, 0.263916f, 0.992676f, 0.257080f, 0.993164f, 0.250000f, + 0.993652f, 0.242432f, 0.994629f, 0.234497f, 0.994629f, 0.226196f, 0.994629f, 0.217529f, + 0.995117f, 0.208130f, 0.995117f, 0.198242f, 0.995117f, 0.187744f, 0.995117f, 0.176392f, + 0.995605f, 0.164062f, 0.995605f, 0.150391f, 0.995605f, 0.135376f, 0.995605f, 0.118469f, + 0.996094f, 0.098755f, 0.996094f, 0.075256f, 0.996582f, 0.045105f, 0.997070f, 0.007687f, + 0.000000f, 1.000000f, 0.871582f, 0.576172f, 0.923340f, 0.484863f, 0.945801f, 0.438477f, + 0.958008f, 0.409668f, 0.965820f, 0.389648f, 0.970703f, 0.374756f, 0.974609f, 0.363037f, + 0.977539f, 0.353271f, 0.980469f, 0.344971f, 0.982910f, 0.337646f, 0.983887f, 0.331543f, + 0.985840f, 0.325439f, 0.986816f, 0.320068f, 0.987793f, 0.315186f, 0.988281f, 0.310303f, + 0.989746f, 0.305908f, 0.990234f, 0.301270f, 0.991211f, 0.296875f, 0.991211f, 0.292725f, + 0.991699f, 0.288818f, 0.991699f, 0.284668f, 0.992188f, 0.280762f, 0.993164f, 0.276611f, + 0.993652f, 0.272705f, 0.994141f, 0.268555f, 0.994629f, 0.264404f, 0.994629f, 0.260254f, + 0.995117f, 0.256104f, 0.995117f, 0.251953f, 0.995117f, 0.247925f, 0.995117f, 0.243774f, + 0.995117f, 0.239502f, 0.995605f, 0.235107f, 0.995605f, 0.230713f, 0.995605f, 0.226196f, + 0.995605f, 0.221680f, 0.996094f, 0.217041f, 0.996094f, 0.212280f, 0.996094f, 0.207397f, + 0.996094f, 0.202393f, 0.996582f, 0.197266f, 0.996582f, 0.192017f, 0.996582f, 0.186646f, + 0.997070f, 0.181030f, 0.997070f, 0.175293f, 0.997070f, 0.169312f, 0.997559f, 0.163208f, + 0.998047f, 0.156738f, 0.998047f, 0.150146f, 0.998535f, 0.143188f, 0.999512f, 0.135742f, + 0.999512f, 0.128174f, 0.999512f, 0.120239f, 0.999512f, 0.111877f, 0.999512f, 0.103088f, + 0.999512f, 0.093750f, 0.999512f, 0.083801f, 0.999512f, 0.072998f, 0.999512f, 0.061340f, + 0.999512f, 0.048401f, 0.999512f, 0.033936f, 0.999512f, 0.017349f, 0.999512f, 0.001410f, + 0.000000f, 1.000000f, 0.921387f, 0.562988f, 0.956543f, 0.467773f, 0.969727f, 0.417236f, + 0.977051f, 0.384277f, 0.981934f, 0.360352f, 0.984863f, 0.342285f, 0.986328f, 0.327637f, + 0.988281f, 0.315430f, 0.990234f, 0.304932f, 0.990723f, 0.295898f, 0.991699f, 0.287842f, + 0.992188f, 0.280518f, 0.992676f, 0.273926f, 0.994141f, 0.267334f, 0.994629f, 0.261475f, + 0.994629f, 0.256104f, 0.995117f, 0.250732f, 0.995117f, 0.245850f, 0.995117f, 0.240967f, + 0.995605f, 0.236328f, 0.995605f, 0.231812f, 0.995605f, 0.227295f, 0.996094f, 0.222900f, + 0.996094f, 0.218628f, 0.996094f, 0.214355f, 0.996582f, 0.210083f, 0.996582f, 0.205933f, + 0.997070f, 0.201660f, 0.997070f, 0.197510f, 0.997559f, 0.193237f, 0.997559f, 0.188965f, + 0.998047f, 0.184692f, 0.998535f, 0.180420f, 0.999023f, 0.176025f, 0.999512f, 0.171509f, + 0.999512f, 0.167114f, 0.999512f, 0.162598f, 0.999512f, 0.158203f, 0.999512f, 0.153687f, + 0.999512f, 0.149170f, 0.999512f, 0.144531f, 0.999512f, 0.139771f, 0.999512f, 0.135010f, + 0.999512f, 0.130127f, 0.999512f, 0.125122f, 0.999512f, 0.120117f, 0.999512f, 0.114929f, + 0.999512f, 0.109558f, 0.999512f, 0.104065f, 0.999512f, 0.098450f, 0.999512f, 0.092590f, + 0.999512f, 0.086609f, 0.999512f, 0.080383f, 0.999512f, 0.073914f, 0.999512f, 0.067139f, + 0.999512f, 0.060120f, 0.999512f, 0.052704f, 0.999512f, 0.044922f, 0.999512f, 0.036652f, + 0.999512f, 0.027878f, 0.999512f, 0.018494f, 0.999512f, 0.008583f, 0.999512f, 0.000521f, + 0.000000f, 1.000000f, 0.948730f, 0.560059f, 0.972656f, 0.462891f, 0.981445f, 0.408447f, + 0.985840f, 0.371826f, 0.988281f, 0.344971f, 0.990234f, 0.323975f, 0.991699f, 0.306885f, + 0.992676f, 0.292725f, 0.994629f, 0.280273f, 0.994629f, 0.269531f, 0.995117f, 0.260010f, + 0.995117f, 0.251465f, 0.995605f, 0.243774f, 0.995605f, 0.236572f, 0.996094f, 0.229858f, + 0.996094f, 0.223633f, 0.996582f, 0.217773f, 0.996582f, 0.212158f, 0.997070f, 0.206665f, + 0.997559f, 0.201538f, 0.997559f, 0.196411f, 0.998047f, 0.191528f, 0.999023f, 0.186646f, + 0.999512f, 0.181885f, 0.999512f, 0.177246f, 0.999512f, 0.172852f, 0.999512f, 0.168579f, + 0.999512f, 0.164307f, 0.999512f, 0.160034f, 0.999512f, 0.156006f, 0.999512f, 0.151855f, + 0.999512f, 0.147705f, 0.999512f, 0.143677f, 0.999512f, 0.139648f, 0.999512f, 0.135620f, + 0.999512f, 0.131592f, 0.999512f, 0.127563f, 0.999512f, 0.123474f, 0.999512f, 0.119446f, + 0.999512f, 0.115295f, 0.999512f, 0.111206f, 0.999512f, 0.106995f, 0.999512f, 0.102783f, + 0.999512f, 0.098511f, 0.999512f, 0.094238f, 0.999512f, 0.089844f, 0.999512f, 0.085388f, + 0.999512f, 0.080933f, 0.999512f, 0.076294f, 0.999512f, 0.071655f, 0.999512f, 0.066833f, + 0.999512f, 0.061951f, 0.999512f, 0.056946f, 0.999512f, 0.051819f, 0.999512f, 0.046509f, + 0.999512f, 0.041077f, 0.999512f, 0.035431f, 0.999512f, 0.029648f, 0.999512f, 0.023636f, + 0.999512f, 0.017441f, 0.999512f, 0.011086f, 0.999512f, 0.004772f, 0.999512f, 0.000236f, + 0.000000f, 1.000000f, 0.963867f, 0.562988f, 0.980957f, 0.462646f, 0.986816f, 0.405029f, + 0.990234f, 0.365234f, 0.992188f, 0.335938f, 0.994629f, 0.312256f, 0.994629f, 0.293213f, + 0.995117f, 0.277344f, 0.995605f, 0.263672f, 0.995605f, 0.251709f, 0.996094f, 0.241089f, + 0.996582f, 0.231567f, 0.997070f, 0.222778f, 0.997559f, 0.214722f, 0.998047f, 0.207153f, + 0.998535f, 0.200073f, 0.999512f, 0.193237f, 0.999512f, 0.187012f, 0.999512f, 0.181152f, + 0.999512f, 0.175659f, 0.999512f, 0.170410f, 0.999512f, 0.165283f, 0.999512f, 0.160400f, + 0.999512f, 0.155762f, 0.999512f, 0.151245f, 0.999512f, 0.146851f, 0.999512f, 0.142456f, + 0.999512f, 0.138306f, 0.999512f, 0.134155f, 0.999512f, 0.130127f, 0.999512f, 0.126099f, + 0.999512f, 0.122192f, 0.999512f, 0.118347f, 0.999512f, 0.114502f, 0.999512f, 0.110657f, + 0.999512f, 0.106873f, 0.999512f, 0.103149f, 0.999512f, 0.099365f, 0.999512f, 0.095642f, + 0.999512f, 0.091919f, 0.999512f, 0.088196f, 0.999512f, 0.084473f, 0.999512f, 0.080750f, + 0.999512f, 0.076965f, 0.999512f, 0.073181f, 0.999512f, 0.069397f, 0.999512f, 0.065613f, + 0.999512f, 0.061768f, 0.999512f, 0.057892f, 0.999512f, 0.053955f, 0.999512f, 0.049988f, + 0.999512f, 0.045959f, 0.999512f, 0.041870f, 0.999512f, 0.037720f, 0.999512f, 0.033508f, + 0.999512f, 0.029251f, 0.999512f, 0.024902f, 0.999512f, 0.020493f, 0.999512f, 0.016022f, + 0.999512f, 0.011520f, 0.999512f, 0.007065f, 0.999512f, 0.002867f, 0.999512f, 0.000121f, + 0.000000f, 1.000000f, 0.973145f, 0.566406f, 0.986328f, 0.463867f, 0.990723f, 0.403564f, + 0.992676f, 0.361816f, 0.994629f, 0.329590f, 0.995117f, 0.304688f, 0.995605f, 0.284180f, + 0.996094f, 0.266846f, 0.996582f, 0.251709f, 0.997070f, 0.238647f, 0.998047f, 0.226807f, + 0.999512f, 0.215942f, 0.999512f, 0.206177f, 0.999512f, 0.197510f, 0.999512f, 0.189453f, + 0.999512f, 0.182129f, 0.999512f, 0.175171f, 0.999512f, 0.168823f, 0.999512f, 0.162720f, + 0.999512f, 0.156982f, 0.999512f, 0.151489f, 0.999512f, 0.146240f, 0.999512f, 0.141357f, + 0.999512f, 0.136475f, 0.999512f, 0.131958f, 0.999512f, 0.127441f, 0.999512f, 0.123169f, + 0.999512f, 0.119019f, 0.999512f, 0.114929f, 0.999512f, 0.110962f, 0.999512f, 0.107056f, + 0.999512f, 0.103271f, 0.999512f, 0.099548f, 0.999512f, 0.095886f, 0.999512f, 0.092285f, + 0.999512f, 0.088745f, 0.999512f, 0.085266f, 0.999512f, 0.081787f, 0.999512f, 0.078369f, + 0.999512f, 0.074951f, 0.999512f, 0.071533f, 0.999512f, 0.068176f, 0.999512f, 0.064880f, + 0.999512f, 0.061554f, 0.999512f, 0.058228f, 0.999512f, 0.054932f, 0.999512f, 0.051605f, + 0.999512f, 0.048309f, 0.999512f, 0.044983f, 0.999512f, 0.041656f, 0.999512f, 0.038330f, + 0.999512f, 0.034973f, 0.999512f, 0.031616f, 0.999512f, 0.028259f, 0.999512f, 0.024872f, + 0.999512f, 0.021469f, 0.999512f, 0.018051f, 0.999512f, 0.014641f, 0.999512f, 0.011253f, + 0.999512f, 0.007919f, 0.999512f, 0.004711f, 0.999512f, 0.001818f, 0.999512f, 0.000068f, + 0.000000f, 1.000000f, 0.979492f, 0.570801f, 0.989746f, 0.466064f, 0.993164f, 0.403564f, + 0.994629f, 0.359375f, 0.995605f, 0.325928f, 0.996094f, 0.299316f, 0.996582f, 0.277344f, + 0.997559f, 0.258545f, 0.999023f, 0.242188f, 0.999512f, 0.227783f, 0.999512f, 0.215332f, + 0.999512f, 0.204102f, 0.999512f, 0.194092f, 0.999512f, 0.184937f, 0.999512f, 0.176514f, + 0.999512f, 0.168823f, 0.999512f, 0.161621f, 0.999512f, 0.154785f, 0.999512f, 0.148560f, + 0.999512f, 0.142578f, 0.999512f, 0.136963f, 0.999512f, 0.131592f, 0.999512f, 0.126587f, + 0.999512f, 0.121704f, 0.999512f, 0.117065f, 0.999512f, 0.112610f, 0.999512f, 0.108337f, + 0.999512f, 0.104187f, 0.999512f, 0.100159f, 0.999512f, 0.096252f, 0.999512f, 0.092468f, + 0.999512f, 0.088806f, 0.999512f, 0.085266f, 0.999512f, 0.081726f, 0.999512f, 0.078308f, + 0.999512f, 0.075012f, 0.999512f, 0.071716f, 0.999512f, 0.068481f, 0.999512f, 0.065308f, + 0.999512f, 0.062225f, 0.999512f, 0.059143f, 0.999512f, 0.056091f, 0.999512f, 0.053101f, + 0.999512f, 0.050140f, 0.999512f, 0.047180f, 0.999512f, 0.044281f, 0.999512f, 0.041382f, + 0.999512f, 0.038513f, 0.999512f, 0.035645f, 0.999512f, 0.032806f, 0.999512f, 0.029999f, + 0.999512f, 0.027191f, 0.999512f, 0.024399f, 0.999512f, 0.021622f, 0.999512f, 0.018860f, + 0.999512f, 0.016113f, 0.999512f, 0.013412f, 0.999512f, 0.010742f, 0.999512f, 0.008125f, + 0.999512f, 0.005608f, 0.999512f, 0.003248f, 0.999512f, 0.001202f, 0.999512f, 0.000041f, + 0.000000f, 1.000000f, 0.984375f, 0.574707f, 0.991211f, 0.468750f, 0.994629f, 0.403564f, + 0.995605f, 0.358154f, 0.996582f, 0.323242f, 0.997559f, 0.295166f, 0.999023f, 0.271484f, + 0.999512f, 0.251465f, 0.999512f, 0.234741f, 0.999512f, 0.219971f, 0.999512f, 0.206909f, + 0.999512f, 0.195312f, 0.999512f, 0.184692f, 0.999512f, 0.175171f, 0.999512f, 0.166382f, + 0.999512f, 0.158325f, 0.999512f, 0.150879f, 0.999512f, 0.143799f, 0.999512f, 0.137329f, + 0.999512f, 0.131226f, 0.999512f, 0.125488f, 0.999512f, 0.120056f, 0.999512f, 0.114929f, + 0.999512f, 0.109985f, 0.999512f, 0.105347f, 0.999512f, 0.100891f, 0.999512f, 0.096619f, + 0.999512f, 0.092529f, 0.999512f, 0.088562f, 0.999512f, 0.084778f, 0.999512f, 0.081055f, + 0.999512f, 0.077515f, 0.999512f, 0.074097f, 0.999512f, 0.070740f, 0.999512f, 0.067505f, + 0.999512f, 0.064331f, 0.999512f, 0.061249f, 0.999512f, 0.058258f, 0.999512f, 0.055298f, + 0.999512f, 0.052429f, 0.999512f, 0.049622f, 0.999512f, 0.046844f, 0.999512f, 0.044128f, + 0.999512f, 0.041443f, 0.999512f, 0.038818f, 0.999512f, 0.036255f, 0.999512f, 0.033691f, + 0.999512f, 0.031204f, 0.999512f, 0.028717f, 0.999512f, 0.026276f, 0.999512f, 0.023865f, + 0.999512f, 0.021500f, 0.999512f, 0.019150f, 0.999512f, 0.016846f, 0.999512f, 0.014572f, + 0.999512f, 0.012344f, 0.999512f, 0.010162f, 0.999512f, 0.008041f, 0.999512f, 0.006001f, + 0.999512f, 0.004066f, 0.999512f, 0.002302f, 0.999512f, 0.000821f, 0.999512f, 0.000026f, + 0.000000f, 1.000000f, 0.986328f, 0.578613f, 0.994141f, 0.470215f, 0.995117f, 0.404541f, + 0.996582f, 0.357422f, 0.997559f, 0.321045f, 0.999512f, 0.291016f, 0.999512f, 0.267090f, + 0.999512f, 0.246826f, 0.999512f, 0.229248f, 0.999512f, 0.213867f, 0.999512f, 0.200317f, + 0.999512f, 0.188232f, 0.999512f, 0.177246f, 0.999512f, 0.167358f, 0.999512f, 0.158203f, + 0.999512f, 0.149902f, 0.999512f, 0.142212f, 0.999512f, 0.135010f, 0.999512f, 0.128296f, + 0.999512f, 0.122131f, 0.999512f, 0.116272f, 0.999512f, 0.110718f, 0.999512f, 0.105530f, + 0.999512f, 0.100586f, 0.999512f, 0.095947f, 0.999512f, 0.091492f, 0.999512f, 0.087219f, + 0.999512f, 0.083191f, 0.999512f, 0.079285f, 0.999512f, 0.075562f, 0.999512f, 0.072021f, + 0.999512f, 0.068542f, 0.999512f, 0.065247f, 0.999512f, 0.062042f, 0.999512f, 0.058929f, + 0.999512f, 0.055939f, 0.999512f, 0.053009f, 0.999512f, 0.050201f, 0.999512f, 0.047455f, + 0.999512f, 0.044769f, 0.999512f, 0.042175f, 0.999512f, 0.039642f, 0.999512f, 0.037170f, + 0.999512f, 0.034760f, 0.999512f, 0.032410f, 0.999512f, 0.030090f, 0.999512f, 0.027832f, + 0.999512f, 0.025635f, 0.999512f, 0.023468f, 0.999512f, 0.021347f, 0.999512f, 0.019272f, + 0.999512f, 0.017242f, 0.999512f, 0.015259f, 0.999512f, 0.013329f, 0.999512f, 0.011436f, + 0.999512f, 0.009605f, 0.999512f, 0.007828f, 0.999512f, 0.006130f, 0.999512f, 0.004513f, + 0.999512f, 0.003012f, 0.999512f, 0.001669f, 0.999512f, 0.000576f, 0.999512f, 0.000017f, + 0.000000f, 1.000000f, 0.989746f, 0.581543f, 0.994629f, 0.472656f, 0.996094f, 0.405273f, + 0.997559f, 0.356689f, 0.999512f, 0.318604f, 0.999512f, 0.288574f, 0.999512f, 0.263916f, + 0.999512f, 0.243042f, 0.999512f, 0.224854f, 0.999512f, 0.208984f, 0.999512f, 0.194946f, + 0.999512f, 0.182495f, 0.999512f, 0.171143f, 0.999512f, 0.160889f, 0.999512f, 0.151611f, + 0.999512f, 0.142944f, 0.999512f, 0.135132f, 0.999512f, 0.127808f, 0.999512f, 0.120972f, + 0.999512f, 0.114624f, 0.999512f, 0.108704f, 0.999512f, 0.103149f, 0.999512f, 0.097900f, + 0.999512f, 0.092957f, 0.999512f, 0.088257f, 0.999512f, 0.083862f, 0.999512f, 0.079651f, + 0.999512f, 0.075623f, 0.999512f, 0.071777f, 0.999512f, 0.068176f, 0.999512f, 0.064636f, + 0.999512f, 0.061310f, 0.999512f, 0.058105f, 0.999512f, 0.055023f, 0.999512f, 0.052063f, + 0.999512f, 0.049194f, 0.999512f, 0.046448f, 0.999512f, 0.043793f, 0.999512f, 0.041199f, + 0.999512f, 0.038727f, 0.999512f, 0.036316f, 0.999512f, 0.033966f, 0.999512f, 0.031708f, + 0.999512f, 0.029510f, 0.999512f, 0.027374f, 0.999512f, 0.025299f, 0.999512f, 0.023285f, + 0.999512f, 0.021317f, 0.999512f, 0.019409f, 0.999512f, 0.017563f, 0.999512f, 0.015762f, + 0.999512f, 0.014015f, 0.999512f, 0.012321f, 0.999512f, 0.010681f, 0.999512f, 0.009102f, + 0.999512f, 0.007580f, 0.999512f, 0.006123f, 0.999512f, 0.004742f, 0.999512f, 0.003450f, + 0.999512f, 0.002268f, 0.999512f, 0.001232f, 0.999512f, 0.000413f, 0.999512f, 0.000011f, + 0.000000f, 1.000000f, 0.990723f, 0.584961f, 0.995117f, 0.474854f, 0.997070f, 0.406006f, + 0.999512f, 0.355469f, 0.999512f, 0.317383f, 0.999512f, 0.286865f, 0.999512f, 0.261475f, + 0.999512f, 0.239990f, 0.999512f, 0.221313f, 0.999512f, 0.205078f, 0.999512f, 0.190552f, + 0.999512f, 0.177734f, 0.999512f, 0.166138f, 0.999512f, 0.155640f, 0.999512f, 0.146118f, + 0.999512f, 0.137329f, 0.999512f, 0.129272f, 0.999512f, 0.121826f, 0.999512f, 0.114929f, + 0.999512f, 0.108521f, 0.999512f, 0.102478f, 0.999512f, 0.096863f, 0.999512f, 0.091614f, + 0.999512f, 0.086670f, 0.999512f, 0.081970f, 0.999512f, 0.077576f, 0.999512f, 0.073425f, + 0.999512f, 0.069458f, 0.999512f, 0.065674f, 0.999512f, 0.062103f, 0.999512f, 0.058685f, + 0.999512f, 0.055450f, 0.999512f, 0.052338f, 0.999512f, 0.049347f, 0.999512f, 0.046509f, + 0.999512f, 0.043762f, 0.999512f, 0.041138f, 0.999512f, 0.038605f, 0.999512f, 0.036194f, + 0.999512f, 0.033844f, 0.999512f, 0.031616f, 0.999512f, 0.029449f, 0.999512f, 0.027359f, + 0.999512f, 0.025345f, 0.999512f, 0.023392f, 0.999512f, 0.021515f, 0.999512f, 0.019699f, + 0.999512f, 0.017944f, 0.999512f, 0.016251f, 0.999512f, 0.014626f, 0.999512f, 0.013046f, + 0.999512f, 0.011528f, 0.999512f, 0.010071f, 0.999512f, 0.008667f, 0.999512f, 0.007332f, + 0.999512f, 0.006058f, 0.999512f, 0.004848f, 0.999512f, 0.003717f, 0.999512f, 0.002674f, + 0.999512f, 0.001734f, 0.999512f, 0.000925f, 0.999512f, 0.000302f, 0.999512f, 0.000008f, + 0.000000f, 1.000000f, 0.992676f, 0.587402f, 0.995605f, 0.476562f, 0.998535f, 0.406006f, + 0.999512f, 0.355469f, 0.999512f, 0.316650f, 0.999512f, 0.285400f, 0.999512f, 0.259521f, + 0.999512f, 0.237427f, 0.999512f, 0.218384f, 0.999512f, 0.201660f, 0.999512f, 0.186890f, + 0.999512f, 0.173828f, 0.999512f, 0.161987f, 0.999512f, 0.151245f, 0.999512f, 0.141479f, + 0.999512f, 0.132568f, 0.999512f, 0.124390f, 0.999512f, 0.116882f, 0.999512f, 0.109863f, + 0.999512f, 0.103394f, 0.999512f, 0.097351f, 0.999512f, 0.091675f, 0.999512f, 0.086426f, + 0.999512f, 0.081421f, 0.999512f, 0.076782f, 0.999512f, 0.072388f, 0.999512f, 0.068237f, + 0.999512f, 0.064331f, 0.999512f, 0.060638f, 0.999512f, 0.057129f, 0.999512f, 0.053772f, + 0.999512f, 0.050598f, 0.999512f, 0.047577f, 0.999512f, 0.044708f, 0.999512f, 0.041962f, + 0.999512f, 0.039337f, 0.999512f, 0.036835f, 0.999512f, 0.034424f, 0.999512f, 0.032135f, + 0.999512f, 0.029938f, 0.999512f, 0.027832f, 0.999512f, 0.025803f, 0.999512f, 0.023865f, + 0.999512f, 0.022003f, 0.999512f, 0.020218f, 0.999512f, 0.018509f, 0.999512f, 0.016861f, + 0.999512f, 0.015282f, 0.999512f, 0.013771f, 0.999512f, 0.012314f, 0.999512f, 0.010925f, + 0.999512f, 0.009598f, 0.999512f, 0.008331f, 0.999512f, 0.007122f, 0.999512f, 0.005978f, + 0.999512f, 0.004898f, 0.999512f, 0.003889f, 0.999512f, 0.002953f, 0.999512f, 0.002100f, + 0.999512f, 0.001343f, 0.999512f, 0.000705f, 0.999512f, 0.000224f, 0.999512f, 0.000006f, + 0.000000f, 1.000000f, 0.994141f, 0.589355f, 0.996582f, 0.477783f, 0.999512f, 0.406250f, + 0.999512f, 0.355469f, 0.999512f, 0.316162f, 0.999512f, 0.284424f, 0.999512f, 0.257812f, + 0.999512f, 0.235352f, 0.999512f, 0.215942f, 0.999512f, 0.198975f, 0.999512f, 0.183838f, + 0.999512f, 0.170532f, 0.999512f, 0.158447f, 0.999512f, 0.147583f, 0.999512f, 0.137695f, + 0.999512f, 0.128540f, 0.999512f, 0.120300f, 0.999512f, 0.112671f, 0.999512f, 0.105652f, + 0.999512f, 0.099060f, 0.999512f, 0.093018f, 0.999512f, 0.087341f, 0.999512f, 0.082031f, + 0.999512f, 0.077087f, 0.999512f, 0.072449f, 0.999512f, 0.068054f, 0.999512f, 0.063965f, + 0.999512f, 0.060120f, 0.999512f, 0.056458f, 0.999512f, 0.052979f, 0.999512f, 0.049713f, + 0.999512f, 0.046600f, 0.999512f, 0.043671f, 0.999512f, 0.040863f, 0.999512f, 0.038208f, + 0.999512f, 0.035706f, 0.999512f, 0.033295f, 0.999512f, 0.031006f, 0.999512f, 0.028824f, + 0.999512f, 0.026733f, 0.999512f, 0.024750f, 0.999512f, 0.022858f, 0.999512f, 0.021042f, + 0.999512f, 0.019318f, 0.999512f, 0.017670f, 0.999512f, 0.016098f, 0.999512f, 0.014595f, + 0.999512f, 0.013161f, 0.999512f, 0.011795f, 0.999512f, 0.010490f, 0.999512f, 0.009254f, + 0.999512f, 0.008080f, 0.999512f, 0.006966f, 0.999512f, 0.005917f, 0.999512f, 0.004932f, + 0.999512f, 0.004009f, 0.999512f, 0.003155f, 0.999512f, 0.002373f, 0.999512f, 0.001669f, + 0.999512f, 0.001054f, 0.999512f, 0.000544f, 0.999512f, 0.000169f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 0.994629f, 0.591309f, 0.997559f, 0.478760f, 0.999512f, 0.406982f, + 0.999512f, 0.355713f, 0.999512f, 0.315674f, 0.999512f, 0.283447f, 0.999512f, 0.256592f, + 0.999512f, 0.233643f, 0.999512f, 0.213867f, 0.999512f, 0.196533f, 0.999512f, 0.181274f, + 0.999512f, 0.167725f, 0.999512f, 0.155518f, 0.999512f, 0.144409f, 0.999512f, 0.134399f, + 0.999512f, 0.125244f, 0.999512f, 0.116882f, 0.999512f, 0.109192f, 0.999512f, 0.102051f, + 0.999512f, 0.095459f, 0.999512f, 0.089355f, 0.999512f, 0.083679f, 0.999512f, 0.078369f, + 0.999512f, 0.073425f, 0.999512f, 0.068787f, 0.999512f, 0.064453f, 0.999512f, 0.060394f, + 0.999512f, 0.056580f, 0.999512f, 0.052948f, 0.999512f, 0.049561f, 0.999512f, 0.046326f, + 0.999512f, 0.043304f, 0.999512f, 0.040436f, 0.999512f, 0.037720f, 0.999512f, 0.035126f, + 0.999512f, 0.032684f, 0.999512f, 0.030380f, 0.999512f, 0.028183f, 0.999512f, 0.026108f, + 0.999512f, 0.024124f, 0.999512f, 0.022232f, 0.999512f, 0.020447f, 0.999512f, 0.018753f, + 0.999512f, 0.017136f, 0.999512f, 0.015602f, 0.999512f, 0.014145f, 0.999512f, 0.012764f, + 0.999512f, 0.011452f, 0.999512f, 0.010208f, 0.999512f, 0.009033f, 0.999512f, 0.007919f, + 0.999512f, 0.006878f, 0.999512f, 0.005894f, 0.999512f, 0.004971f, 0.999512f, 0.004112f, + 0.999512f, 0.003319f, 0.999512f, 0.002590f, 0.999512f, 0.001930f, 0.999512f, 0.001343f, + 0.999512f, 0.000838f, 0.999512f, 0.000426f, 0.999512f, 0.000129f, 0.999512f, 0.000003f, + 0.000000f, 1.000000f, 0.995117f, 0.593262f, 0.999512f, 0.479004f, 0.999512f, 0.407715f, + 0.999512f, 0.355713f, 0.999512f, 0.315430f, 0.999512f, 0.282715f, 0.999512f, 0.255371f, + 0.999512f, 0.232178f, 0.999512f, 0.212158f, 0.999512f, 0.194580f, 0.999512f, 0.179077f, + 0.999512f, 0.165283f, 0.999512f, 0.152954f, 0.999512f, 0.141846f, 0.999512f, 0.131714f, + 0.999512f, 0.122437f, 0.999512f, 0.114014f, 0.999512f, 0.106201f, 0.999512f, 0.099060f, + 0.999512f, 0.092468f, 0.999512f, 0.086304f, 0.999512f, 0.080627f, 0.999512f, 0.075317f, + 0.999512f, 0.070374f, 0.999512f, 0.065735f, 0.999512f, 0.061462f, 0.999512f, 0.057404f, + 0.999512f, 0.053619f, 0.999512f, 0.050049f, 0.999512f, 0.046692f, 0.999512f, 0.043518f, + 0.999512f, 0.040558f, 0.999512f, 0.037750f, 0.999512f, 0.035095f, 0.999512f, 0.032593f, + 0.999512f, 0.030228f, 0.999512f, 0.027985f, 0.999512f, 0.025864f, 0.999512f, 0.023865f, + 0.999512f, 0.021973f, 0.999512f, 0.020172f, 0.999512f, 0.018478f, 0.999512f, 0.016876f, + 0.999512f, 0.015358f, 0.999512f, 0.013924f, 0.999512f, 0.012566f, 0.999512f, 0.011284f, + 0.999512f, 0.010078f, 0.999512f, 0.008934f, 0.999512f, 0.007866f, 0.999512f, 0.006863f, + 0.999512f, 0.005920f, 0.999512f, 0.005043f, 0.999512f, 0.004227f, 0.999512f, 0.003473f, + 0.999512f, 0.002781f, 0.999512f, 0.002151f, 0.999512f, 0.001589f, 0.999512f, 0.001094f, + 0.999512f, 0.000674f, 0.999512f, 0.000337f, 0.999512f, 0.000100f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.995605f, 0.594727f, 0.999512f, 0.480225f, 0.999512f, 0.408447f, + 0.999512f, 0.355957f, 0.999512f, 0.315186f, 0.999512f, 0.281982f, 0.999512f, 0.254395f, + 0.999512f, 0.230957f, 0.999512f, 0.210693f, 0.999512f, 0.192993f, 0.999512f, 0.177246f, + 0.999512f, 0.163330f, 0.999512f, 0.150879f, 0.999512f, 0.139526f, 0.999512f, 0.129395f, + 0.999512f, 0.120056f, 0.999512f, 0.111511f, 0.999512f, 0.103699f, 0.999512f, 0.096497f, + 0.999512f, 0.089905f, 0.999512f, 0.083740f, 0.999512f, 0.078003f, 0.999512f, 0.072754f, + 0.999512f, 0.067810f, 0.999512f, 0.063171f, 0.999512f, 0.058929f, 0.999512f, 0.054901f, + 0.999512f, 0.051117f, 0.999512f, 0.047607f, 0.999512f, 0.044281f, 0.999512f, 0.041168f, + 0.999512f, 0.038239f, 0.999512f, 0.035492f, 0.999512f, 0.032898f, 0.999512f, 0.030457f, + 0.999512f, 0.028168f, 0.999512f, 0.025986f, 0.999512f, 0.023941f, 0.999512f, 0.022018f, + 0.999512f, 0.020203f, 0.999512f, 0.018478f, 0.999512f, 0.016861f, 0.999512f, 0.015343f, + 0.999512f, 0.013908f, 0.999512f, 0.012550f, 0.999512f, 0.011284f, 0.999512f, 0.010086f, + 0.999512f, 0.008965f, 0.999512f, 0.007912f, 0.999512f, 0.006927f, 0.999512f, 0.006012f, + 0.999512f, 0.005157f, 0.999512f, 0.004364f, 0.999512f, 0.003637f, 0.999512f, 0.002968f, + 0.999512f, 0.002357f, 0.999512f, 0.001810f, 0.999512f, 0.001324f, 0.999512f, 0.000903f, + 0.999512f, 0.000549f, 0.999512f, 0.000271f, 0.999512f, 0.000079f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.996094f, 0.596191f, 0.999512f, 0.481201f, 0.999512f, 0.408936f, + 0.999512f, 0.355957f, 0.999512f, 0.314941f, 0.999512f, 0.281494f, 0.999512f, 0.253662f, + 0.999512f, 0.229858f, 0.999512f, 0.209473f, 0.999512f, 0.191528f, 0.999512f, 0.175781f, + 0.999512f, 0.161621f, 0.999512f, 0.149048f, 0.999512f, 0.137695f, 0.999512f, 0.127319f, + 0.999512f, 0.118042f, 0.999512f, 0.109436f, 0.999512f, 0.101562f, 0.999512f, 0.094360f, + 0.999512f, 0.087708f, 0.999512f, 0.081543f, 0.999512f, 0.075867f, 0.999512f, 0.070557f, + 0.999512f, 0.065613f, 0.999512f, 0.061066f, 0.999512f, 0.056763f, 0.999512f, 0.052795f, + 0.999512f, 0.049042f, 0.999512f, 0.045563f, 0.999512f, 0.042267f, 0.999512f, 0.039215f, + 0.999512f, 0.036316f, 0.999512f, 0.033630f, 0.999512f, 0.031082f, 0.999512f, 0.028702f, + 0.999512f, 0.026459f, 0.999512f, 0.024338f, 0.999512f, 0.022354f, 0.999512f, 0.020493f, + 0.999512f, 0.018738f, 0.999512f, 0.017090f, 0.999512f, 0.015541f, 0.999512f, 0.014084f, + 0.999512f, 0.012718f, 0.999512f, 0.011436f, 0.999512f, 0.010231f, 0.999512f, 0.009109f, + 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006172f, 0.999512f, 0.005325f, + 0.999512f, 0.004543f, 0.999512f, 0.003826f, 0.999512f, 0.003166f, 0.999512f, 0.002565f, + 0.999512f, 0.002024f, 0.999512f, 0.001542f, 0.999512f, 0.001118f, 0.999512f, 0.000754f, + 0.999512f, 0.000453f, 0.999512f, 0.000220f, 0.999512f, 0.000063f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.996582f, 0.597168f, 0.999512f, 0.482178f, 0.999512f, 0.409424f, + 0.999512f, 0.356201f, 0.999512f, 0.314697f, 0.999512f, 0.281006f, 0.999512f, 0.252930f, + 0.999512f, 0.229004f, 0.999512f, 0.208374f, 0.999512f, 0.190308f, 0.999512f, 0.174438f, + 0.999512f, 0.160156f, 0.999512f, 0.147461f, 0.999512f, 0.136108f, 0.999512f, 0.125732f, + 0.999512f, 0.116272f, 0.999512f, 0.107666f, 0.999512f, 0.099792f, 0.999512f, 0.092529f, + 0.999512f, 0.085876f, 0.999512f, 0.079712f, 0.999512f, 0.073975f, 0.999512f, 0.068726f, + 0.999512f, 0.063782f, 0.999512f, 0.059235f, 0.999512f, 0.054962f, 0.999512f, 0.050995f, + 0.999512f, 0.047302f, 0.999512f, 0.043823f, 0.999512f, 0.040588f, 0.999512f, 0.037567f, + 0.999512f, 0.034729f, 0.999512f, 0.032043f, 0.999512f, 0.029572f, 0.999512f, 0.027222f, + 0.999512f, 0.025024f, 0.999512f, 0.022964f, 0.999512f, 0.021042f, 0.999512f, 0.019226f, + 0.999512f, 0.017532f, 0.999512f, 0.015930f, 0.999512f, 0.014442f, 0.999512f, 0.013046f, + 0.999512f, 0.011742f, 0.999512f, 0.010521f, 0.999512f, 0.009377f, 0.999512f, 0.008316f, + 0.999512f, 0.007328f, 0.999512f, 0.006409f, 0.999512f, 0.005558f, 0.999512f, 0.004776f, + 0.999512f, 0.004051f, 0.999512f, 0.003393f, 0.999512f, 0.002790f, 0.999512f, 0.002247f, + 0.999512f, 0.001761f, 0.999512f, 0.001330f, 0.999512f, 0.000957f, 0.999512f, 0.000639f, + 0.999512f, 0.000380f, 0.999512f, 0.000182f, 0.999512f, 0.000051f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.998047f, 0.597656f, 0.999512f, 0.482910f, 0.999512f, 0.409912f, + 0.999512f, 0.356201f, 0.999512f, 0.314453f, 0.999512f, 0.280518f, 0.999512f, 0.252197f, + 0.999512f, 0.228271f, 0.999512f, 0.207520f, 0.999512f, 0.189331f, 0.999512f, 0.173218f, + 0.999512f, 0.158936f, 0.999512f, 0.146240f, 0.999512f, 0.134644f, 0.999512f, 0.124329f, + 0.999512f, 0.114807f, 0.999512f, 0.106201f, 0.999512f, 0.098267f, 0.999512f, 0.091003f, + 0.999512f, 0.084290f, 0.999512f, 0.078125f, 0.999512f, 0.072449f, 0.999512f, 0.067139f, + 0.999512f, 0.062256f, 0.999512f, 0.057709f, 0.999512f, 0.053467f, 0.999512f, 0.049500f, + 0.999512f, 0.045837f, 0.999512f, 0.042389f, 0.999512f, 0.039185f, 0.999512f, 0.036194f, + 0.999512f, 0.033386f, 0.999512f, 0.030762f, 0.999512f, 0.028305f, 0.999512f, 0.026001f, + 0.999512f, 0.023849f, 0.999512f, 0.021835f, 0.999512f, 0.019943f, 0.999512f, 0.018188f, + 0.999512f, 0.016525f, 0.999512f, 0.014992f, 0.999512f, 0.013550f, 0.999512f, 0.012199f, + 0.999512f, 0.010941f, 0.999512f, 0.009773f, 0.999512f, 0.008682f, 0.999512f, 0.007671f, + 0.999512f, 0.006733f, 0.999512f, 0.005867f, 0.999512f, 0.005066f, 0.999512f, 0.004330f, + 0.999512f, 0.003658f, 0.999512f, 0.003046f, 0.999512f, 0.002493f, 0.999512f, 0.001995f, + 0.999512f, 0.001553f, 0.999512f, 0.001164f, 0.999512f, 0.000830f, 0.999512f, 0.000549f, + 0.999512f, 0.000323f, 0.999512f, 0.000152f, 0.999512f, 0.000042f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.597656f, 0.999512f, 0.483643f, 0.999512f, 0.410156f, + 0.999512f, 0.356445f, 0.999512f, 0.314453f, 0.999512f, 0.280273f, 0.999512f, 0.251709f, + 0.999512f, 0.227661f, 0.999512f, 0.206665f, 0.999512f, 0.188477f, 0.999512f, 0.172241f, + 0.999512f, 0.157959f, 0.999512f, 0.145142f, 0.999512f, 0.133545f, 0.999512f, 0.123108f, + 0.999512f, 0.113586f, 0.999512f, 0.104919f, 0.999512f, 0.096985f, 0.999512f, 0.089722f, + 0.999512f, 0.083008f, 0.999512f, 0.076843f, 0.999512f, 0.071106f, 0.999512f, 0.065857f, + 0.999512f, 0.060974f, 0.999512f, 0.056427f, 0.999512f, 0.052185f, 0.999512f, 0.048279f, + 0.999512f, 0.044617f, 0.999512f, 0.041199f, 0.999512f, 0.037994f, 0.999512f, 0.035034f, + 0.999512f, 0.032257f, 0.999512f, 0.029678f, 0.999512f, 0.027252f, 0.999512f, 0.024994f, + 0.999512f, 0.022873f, 0.999512f, 0.020889f, 0.999512f, 0.019043f, 0.999512f, 0.017319f, + 0.999512f, 0.015717f, 0.999512f, 0.014214f, 0.999512f, 0.012810f, 0.999512f, 0.011505f, + 0.999512f, 0.010292f, 0.999512f, 0.009163f, 0.999512f, 0.008110f, 0.999512f, 0.007145f, + 0.999512f, 0.006248f, 0.999512f, 0.005424f, 0.999512f, 0.004665f, 0.999512f, 0.003971f, + 0.999512f, 0.003342f, 0.999512f, 0.002769f, 0.999512f, 0.002254f, 0.999512f, 0.001794f, + 0.999512f, 0.001388f, 0.999512f, 0.001034f, 0.999512f, 0.000731f, 0.999512f, 0.000480f, + 0.999512f, 0.000279f, 0.999512f, 0.000130f, 0.999512f, 0.000035f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.999512f, 0.598633f, 0.999512f, 0.484131f, 0.999512f, 0.410400f, + 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.280029f, 0.999512f, 0.251465f, + 0.999512f, 0.227051f, 0.999512f, 0.206055f, 0.999512f, 0.187744f, 0.999512f, 0.171509f, + 0.999512f, 0.157104f, 0.999512f, 0.144165f, 0.999512f, 0.132568f, 0.999512f, 0.122070f, + 0.999512f, 0.112549f, 0.999512f, 0.103882f, 0.999512f, 0.095886f, 0.999512f, 0.088623f, + 0.999512f, 0.081909f, 0.999512f, 0.075745f, 0.999512f, 0.070007f, 0.999512f, 0.064758f, + 0.999512f, 0.059875f, 0.999512f, 0.055359f, 0.999512f, 0.051147f, 0.999512f, 0.047211f, + 0.999512f, 0.043579f, 0.999512f, 0.040192f, 0.999512f, 0.037018f, 0.999512f, 0.034088f, + 0.999512f, 0.031342f, 0.999512f, 0.028778f, 0.999512f, 0.026382f, 0.999512f, 0.024155f, + 0.999512f, 0.022064f, 0.999512f, 0.020126f, 0.999512f, 0.018311f, 0.999512f, 0.016617f, + 0.999512f, 0.015045f, 0.999512f, 0.013573f, 0.999512f, 0.012207f, 0.999512f, 0.010933f, + 0.999512f, 0.009758f, 0.999512f, 0.008659f, 0.999512f, 0.007652f, 0.999512f, 0.006718f, + 0.999512f, 0.005859f, 0.999512f, 0.005070f, 0.999512f, 0.004345f, 0.999512f, 0.003687f, + 0.999512f, 0.003088f, 0.999512f, 0.002548f, 0.999512f, 0.002064f, 0.999512f, 0.001635f, + 0.999512f, 0.001257f, 0.999512f, 0.000931f, 0.999512f, 0.000654f, 0.999512f, 0.000425f, + 0.999512f, 0.000245f, 0.999512f, 0.000113f, 0.999512f, 0.000030f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.599609f, 0.999512f, 0.484619f, 0.999512f, 0.410645f, + 0.999512f, 0.356445f, 0.999512f, 0.314209f, 0.999512f, 0.279785f, 0.999512f, 0.250977f, + 0.999512f, 0.226685f, 0.999512f, 0.205566f, 0.999512f, 0.187134f, 0.999512f, 0.170776f, + 0.999512f, 0.156372f, 0.999512f, 0.143433f, 0.999512f, 0.131714f, 0.999512f, 0.121216f, + 0.999512f, 0.111694f, 0.999512f, 0.102966f, 0.999512f, 0.094971f, 0.999512f, 0.087708f, + 0.999512f, 0.080994f, 0.999512f, 0.074829f, 0.999512f, 0.069092f, 0.999512f, 0.063843f, + 0.999512f, 0.058990f, 0.999512f, 0.054443f, 0.999512f, 0.050262f, 0.999512f, 0.046356f, + 0.999512f, 0.042725f, 0.999512f, 0.039368f, 0.999512f, 0.036224f, 0.999512f, 0.033295f, + 0.999512f, 0.030579f, 0.999512f, 0.028046f, 0.999512f, 0.025665f, 0.999512f, 0.023468f, + 0.999512f, 0.021408f, 0.999512f, 0.019485f, 0.999512f, 0.017700f, 0.999512f, 0.016037f, + 0.999512f, 0.014496f, 0.999512f, 0.013054f, 0.999512f, 0.011719f, 0.999512f, 0.010475f, + 0.999512f, 0.009323f, 0.999512f, 0.008263f, 0.999512f, 0.007282f, 0.999512f, 0.006378f, + 0.999512f, 0.005547f, 0.999512f, 0.004784f, 0.999512f, 0.004089f, 0.999512f, 0.003458f, + 0.999512f, 0.002886f, 0.999512f, 0.002373f, 0.999512f, 0.001914f, 0.999512f, 0.001509f, + 0.999512f, 0.001155f, 0.999512f, 0.000850f, 0.999512f, 0.000593f, 0.999512f, 0.000383f, + 0.999512f, 0.000219f, 0.999512f, 0.000100f, 0.999512f, 0.000026f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600098f, 0.999512f, 0.485107f, 0.999512f, 0.410889f, + 0.999512f, 0.356689f, 0.999512f, 0.314209f, 0.999512f, 0.279541f, 0.999512f, 0.250732f, + 0.999512f, 0.226318f, 0.999512f, 0.205078f, 0.999512f, 0.186523f, 0.999512f, 0.170288f, + 0.999512f, 0.155762f, 0.999512f, 0.142700f, 0.999512f, 0.131104f, 0.999512f, 0.120544f, + 0.999512f, 0.110962f, 0.999512f, 0.102234f, 0.999512f, 0.094238f, 0.999512f, 0.086975f, + 0.999512f, 0.080261f, 0.999512f, 0.074036f, 0.999512f, 0.068359f, 0.999512f, 0.063110f, + 0.999512f, 0.058228f, 0.999512f, 0.053711f, 0.999512f, 0.049530f, 0.999512f, 0.045654f, + 0.999512f, 0.042053f, 0.999512f, 0.038696f, 0.999512f, 0.035553f, 0.999512f, 0.032654f, + 0.999512f, 0.029953f, 0.999512f, 0.027435f, 0.999512f, 0.025085f, 0.999512f, 0.022903f, + 0.999512f, 0.020874f, 0.999512f, 0.018967f, 0.999512f, 0.017212f, 0.999512f, 0.015572f, + 0.999512f, 0.014046f, 0.999512f, 0.012634f, 0.999512f, 0.011322f, 0.999512f, 0.010101f, + 0.999512f, 0.008980f, 0.999512f, 0.007935f, 0.999512f, 0.006981f, 0.999512f, 0.006104f, + 0.999512f, 0.005295f, 0.999512f, 0.004555f, 0.999512f, 0.003885f, 0.999512f, 0.003275f, + 0.999512f, 0.002726f, 0.999512f, 0.002234f, 0.999512f, 0.001796f, 0.999512f, 0.001410f, + 0.999512f, 0.001075f, 0.999512f, 0.000787f, 0.999512f, 0.000546f, 0.999512f, 0.000351f, + 0.999512f, 0.000199f, 0.999512f, 0.000089f, 0.999512f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.600586f, 0.999512f, 0.485596f, 0.999512f, 0.411133f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279541f, 0.999512f, 0.250488f, + 0.999512f, 0.225952f, 0.999512f, 0.204712f, 0.999512f, 0.186157f, 0.999512f, 0.169800f, + 0.999512f, 0.155273f, 0.999512f, 0.142212f, 0.999512f, 0.130493f, 0.999512f, 0.119995f, + 0.999512f, 0.110352f, 0.999512f, 0.101624f, 0.999512f, 0.093628f, 0.999512f, 0.086304f, + 0.999512f, 0.079590f, 0.999512f, 0.073425f, 0.999512f, 0.067749f, 0.999512f, 0.062500f, + 0.999512f, 0.057617f, 0.999512f, 0.053131f, 0.999512f, 0.048950f, 0.999512f, 0.045074f, + 0.999512f, 0.041473f, 0.999512f, 0.038147f, 0.999512f, 0.035034f, 0.999512f, 0.032135f, + 0.999512f, 0.029449f, 0.999512f, 0.026947f, 0.999512f, 0.024612f, 0.999512f, 0.022446f, + 0.999512f, 0.020432f, 0.999512f, 0.018555f, 0.999512f, 0.016815f, 0.999512f, 0.015198f, + 0.999512f, 0.013695f, 0.999512f, 0.012299f, 0.999512f, 0.011002f, 0.999512f, 0.009804f, + 0.999512f, 0.008698f, 0.999512f, 0.007683f, 0.999512f, 0.006744f, 0.999512f, 0.005882f, + 0.999512f, 0.005096f, 0.999512f, 0.004375f, 0.999512f, 0.003723f, 0.999512f, 0.003132f, + 0.999512f, 0.002600f, 0.999512f, 0.002125f, 0.999512f, 0.001703f, 0.999512f, 0.001333f, + 0.999512f, 0.001013f, 0.999512f, 0.000739f, 0.999512f, 0.000510f, 0.999512f, 0.000326f, + 0.999512f, 0.000183f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601074f, 0.999512f, 0.485840f, 0.999512f, 0.411377f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225708f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f, + 0.999512f, 0.154785f, 0.999512f, 0.141846f, 0.999512f, 0.130005f, 0.999512f, 0.119507f, + 0.999512f, 0.109863f, 0.999512f, 0.101135f, 0.999512f, 0.093140f, 0.999512f, 0.085815f, + 0.999512f, 0.079102f, 0.999512f, 0.072937f, 0.999512f, 0.067261f, 0.999512f, 0.062012f, + 0.999512f, 0.057129f, 0.999512f, 0.052643f, 0.999512f, 0.048492f, 0.999512f, 0.044617f, + 0.999512f, 0.041016f, 0.999512f, 0.037689f, 0.999512f, 0.034607f, 0.999512f, 0.031708f, + 0.999512f, 0.029053f, 0.999512f, 0.026566f, 0.999512f, 0.024246f, 0.999512f, 0.022095f, + 0.999512f, 0.020096f, 0.999512f, 0.018234f, 0.999512f, 0.016495f, 0.999512f, 0.014900f, + 0.999512f, 0.013412f, 0.999512f, 0.012032f, 0.999512f, 0.010757f, 0.999512f, 0.009575f, + 0.999512f, 0.008484f, 0.999512f, 0.007481f, 0.999512f, 0.006561f, 0.999512f, 0.005714f, + 0.999512f, 0.004940f, 0.999512f, 0.004238f, 0.999512f, 0.003599f, 0.999512f, 0.003021f, + 0.999512f, 0.002504f, 0.999512f, 0.002041f, 0.999512f, 0.001633f, 0.999512f, 0.001274f, + 0.999512f, 0.000965f, 0.999512f, 0.000702f, 0.999512f, 0.000483f, 0.999512f, 0.000307f, + 0.999512f, 0.000172f, 0.999512f, 0.000076f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411377f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 0.999512f, 0.154541f, 0.999512f, 0.141479f, 0.999512f, 0.129761f, 0.999512f, 0.119141f, + 0.999512f, 0.109497f, 0.999512f, 0.100769f, 0.999512f, 0.092773f, 0.999512f, 0.085449f, + 0.999512f, 0.078735f, 0.999512f, 0.072571f, 0.999512f, 0.066833f, 0.999512f, 0.061615f, + 0.999512f, 0.056763f, 0.999512f, 0.052277f, 0.999512f, 0.048096f, 0.999512f, 0.044250f, + 0.999512f, 0.040680f, 0.999512f, 0.037354f, 0.999512f, 0.034271f, 0.999512f, 0.031403f, + 0.999512f, 0.028732f, 0.999512f, 0.026260f, 0.999512f, 0.023956f, 0.999512f, 0.021820f, + 0.999512f, 0.019821f, 0.999512f, 0.017975f, 0.999512f, 0.016251f, 0.999512f, 0.014671f, + 0.999512f, 0.013191f, 0.999512f, 0.011826f, 0.999512f, 0.010559f, 0.999512f, 0.009392f, + 0.999512f, 0.008316f, 0.999512f, 0.007328f, 0.999512f, 0.006416f, 0.999512f, 0.005585f, + 0.999512f, 0.004822f, 0.999512f, 0.004131f, 0.999512f, 0.003504f, 0.999512f, 0.002937f, + 0.999512f, 0.002430f, 0.999512f, 0.001978f, 0.999512f, 0.001579f, 0.999512f, 0.001230f, + 0.999512f, 0.000930f, 0.999512f, 0.000674f, 0.999512f, 0.000463f, 0.999512f, 0.000293f, + 0.999512f, 0.000163f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.601562f, 0.999512f, 0.486084f, 0.999512f, 0.411621f, + 0.999512f, 0.356689f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225342f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168945f, + 0.999512f, 0.154297f, 0.999512f, 0.141235f, 0.999512f, 0.129395f, 0.999512f, 0.118835f, + 0.999512f, 0.109192f, 0.999512f, 0.100464f, 0.999512f, 0.092468f, 0.999512f, 0.085144f, + 0.999512f, 0.078430f, 0.999512f, 0.072266f, 0.999512f, 0.066528f, 0.999512f, 0.061310f, + 0.999512f, 0.056458f, 0.999512f, 0.051971f, 0.999512f, 0.047821f, 0.999512f, 0.043976f, + 0.999512f, 0.040405f, 0.999512f, 0.037079f, 0.999512f, 0.033997f, 0.999512f, 0.031158f, + 0.999512f, 0.028503f, 0.999512f, 0.026031f, 0.999512f, 0.023743f, 0.999512f, 0.021606f, + 0.999512f, 0.019623f, 0.999512f, 0.017776f, 0.999512f, 0.016083f, 0.999512f, 0.014496f, + 0.999512f, 0.013031f, 0.999512f, 0.011673f, 0.999512f, 0.010422f, 0.999512f, 0.009262f, + 0.999512f, 0.008194f, 0.999512f, 0.007214f, 0.999512f, 0.006313f, 0.999512f, 0.005489f, + 0.999512f, 0.004738f, 0.999512f, 0.004051f, 0.999512f, 0.003433f, 0.999512f, 0.002876f, + 0.999512f, 0.002377f, 0.999512f, 0.001932f, 0.999512f, 0.001540f, 0.999512f, 0.001198f, + 0.999512f, 0.000904f, 0.999512f, 0.000654f, 0.999512f, 0.000448f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f, + 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129272f, 0.999512f, 0.118652f, + 0.999512f, 0.109009f, 0.999512f, 0.100220f, 0.999512f, 0.092224f, 0.999512f, 0.084900f, + 0.999512f, 0.078186f, 0.999512f, 0.072021f, 0.999512f, 0.066345f, 0.999512f, 0.061096f, + 0.999512f, 0.056244f, 0.999512f, 0.051788f, 0.999512f, 0.047638f, 0.999512f, 0.043762f, + 0.999512f, 0.040222f, 0.999512f, 0.036896f, 0.999512f, 0.033813f, 0.999512f, 0.030975f, + 0.999512f, 0.028336f, 0.999512f, 0.025864f, 0.999512f, 0.023575f, 0.999512f, 0.021454f, + 0.999512f, 0.019485f, 0.999512f, 0.017639f, 0.999512f, 0.015945f, 0.999512f, 0.014374f, + 0.999512f, 0.012917f, 0.999512f, 0.011566f, 0.999512f, 0.010315f, 0.999512f, 0.009163f, + 0.999512f, 0.008102f, 0.999512f, 0.007133f, 0.999512f, 0.006237f, 0.999512f, 0.005421f, + 0.999512f, 0.004673f, 0.999512f, 0.003998f, 0.999512f, 0.003386f, 0.999512f, 0.002832f, + 0.999512f, 0.002338f, 0.999512f, 0.001900f, 0.999512f, 0.001513f, 0.999512f, 0.001176f, + 0.999512f, 0.000886f, 0.999512f, 0.000640f, 0.999512f, 0.000438f, 0.999512f, 0.000276f, + 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 0.999512f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129150f, 0.999512f, 0.118530f, + 0.999512f, 0.108887f, 0.999512f, 0.100098f, 0.999512f, 0.092102f, 0.999512f, 0.084778f, + 0.999512f, 0.078064f, 0.999512f, 0.071899f, 0.999512f, 0.066162f, 0.999512f, 0.060974f, + 0.999512f, 0.056122f, 0.999512f, 0.051636f, 0.999512f, 0.047485f, 0.999512f, 0.043640f, + 0.999512f, 0.040070f, 0.999512f, 0.036774f, 0.999512f, 0.033691f, 0.999512f, 0.030869f, + 0.999512f, 0.028214f, 0.999512f, 0.025757f, 0.999512f, 0.023468f, 0.999512f, 0.021347f, + 0.999512f, 0.019379f, 0.999512f, 0.017548f, 0.999512f, 0.015854f, 0.999512f, 0.014290f, + 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008049f, 0.999512f, 0.007080f, 0.999512f, 0.006191f, 0.999512f, 0.005375f, + 0.999512f, 0.004635f, 0.999512f, 0.003960f, 0.999512f, 0.003353f, 0.999512f, 0.002804f, + 0.999512f, 0.002314f, 0.999512f, 0.001879f, 0.999512f, 0.001495f, 0.999512f, 0.001162f, + 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f, + 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.999512f, 0.602051f, 1.000000f, 0.486328f, 0.999512f, 0.411621f, + 0.999512f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225098f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 0.999512f, 0.118408f, + 1.000000f, 0.108765f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f, + 0.999512f, 0.077942f, 0.999512f, 0.071777f, 0.999512f, 0.066101f, 0.999512f, 0.060883f, + 0.999512f, 0.056030f, 0.999512f, 0.051544f, 0.999512f, 0.047424f, 0.999512f, 0.043579f, + 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033630f, 0.999512f, 0.030792f, + 0.999512f, 0.028152f, 0.999512f, 0.025696f, 0.999512f, 0.023422f, 0.999512f, 0.021301f, + 0.999512f, 0.019333f, 0.999512f, 0.017502f, 0.999512f, 0.015808f, 0.999512f, 0.014252f, + 0.999512f, 0.012794f, 0.999512f, 0.011452f, 0.999512f, 0.010216f, 0.999512f, 0.009071f, + 0.999512f, 0.008018f, 0.999512f, 0.007050f, 0.999512f, 0.006165f, 0.999512f, 0.005352f, + 0.999512f, 0.004612f, 0.999512f, 0.003941f, 0.999512f, 0.003336f, 0.999512f, 0.002789f, + 0.999512f, 0.002300f, 0.999512f, 0.001868f, 0.999512f, 0.001486f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000269f, + 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 1.000000f, 0.602051f, 1.000000f, 0.486328f, 1.000000f, 0.411621f, + 1.000000f, 0.356934f, 1.000000f, 0.313965f, 1.000000f, 0.279053f, 1.000000f, 0.250000f, + 1.000000f, 0.225098f, 1.000000f, 0.203735f, 1.000000f, 0.185059f, 1.000000f, 0.168457f, + 1.000000f, 0.153809f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056000f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012779f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.935059f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.996582f, 0.000000f, 0.991699f, 0.000000f, 0.934082f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.997070f, 0.000000f, 0.991699f, 0.000000f, 0.934570f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.997070f, 0.000000f, 0.990723f, 0.000045f, 0.933594f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.990723f, 0.000103f, 0.931641f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.990234f, 0.000173f, 0.930176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.998047f, 0.000000f, 0.996094f, 0.000000f, 0.989746f, 0.000454f, 0.928223f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.989258f, 0.000752f, 0.925293f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.998535f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.989258f, 0.001340f, 0.922852f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000613f, 0.988770f, 0.002121f, 0.919922f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.001522f, 0.987793f, 0.003326f, 0.916016f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.002142f, 0.986816f, 0.004902f, 0.911133f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000865f, 0.994141f, 0.002377f, 0.986328f, 0.007065f, 0.905762f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000006f, 0.995605f, 0.001914f, 0.993164f, 0.002640f, 0.985352f, 0.010147f, 0.900391f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.001153f, 0.995605f, 0.002747f, 0.992676f, 0.003948f, 0.984375f, 0.014236f, 0.894043f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000743f, 0.996094f, + 0.002214f, 0.994629f, 0.003420f, 0.992188f, 0.005241f, 0.982422f, 0.019714f, 0.886719f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000686f, 0.996582f, 0.002001f, 0.995605f, + 0.003027f, 0.993652f, 0.003918f, 0.990723f, 0.007099f, 0.980957f, 0.026337f, 0.878418f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000896f, 0.996582f, 0.001984f, 0.996094f, 0.002903f, 0.994629f, + 0.003674f, 0.992676f, 0.005245f, 0.989258f, 0.009995f, 0.979004f, 0.034637f, 0.868652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000255f, 0.997070f, + 0.001376f, 0.996582f, 0.002239f, 0.996094f, 0.002960f, 0.995605f, 0.003559f, 0.993652f, + 0.004147f, 0.992188f, 0.006874f, 0.987793f, 0.012512f, 0.976074f, 0.044891f, 0.858398f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000094f, 0.997070f, 0.001110f, 0.997070f, 0.001945f, 0.996582f, + 0.002563f, 0.996094f, 0.003107f, 0.996094f, 0.003622f, 0.994141f, 0.004120f, 0.992676f, + 0.005798f, 0.990234f, 0.008347f, 0.985840f, 0.015884f, 0.972168f, 0.056793f, 0.846191f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000411f, 0.997559f, + 0.001294f, 0.997070f, 0.001970f, 0.996582f, 0.002508f, 0.996582f, 0.002974f, 0.996094f, + 0.003359f, 0.996094f, 0.003719f, 0.994629f, 0.004181f, 0.993164f, 0.005527f, 0.991699f, + 0.007481f, 0.988770f, 0.010933f, 0.983398f, 0.020096f, 0.967773f, 0.070923f, 0.832031f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000279f, 0.997559f, 0.001101f, 0.997559f, 0.001685f, 0.997070f, 0.002193f, 0.997070f, + 0.002655f, 0.996582f, 0.003038f, 0.996094f, 0.003267f, 0.996094f, 0.003710f, 0.995605f, + 0.004074f, 0.994629f, 0.004257f, 0.993164f, 0.005833f, 0.992188f, 0.007458f, 0.989746f, + 0.009766f, 0.986816f, 0.014023f, 0.979980f, 0.025726f, 0.961914f, 0.087708f, 0.816406f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000735f, 0.997559f, 0.001388f, 0.997559f, 0.001780f, 0.997070f, + 0.002251f, 0.997070f, 0.002659f, 0.996582f, 0.002811f, 0.996582f, 0.003246f, 0.996094f, + 0.003510f, 0.996094f, 0.003769f, 0.996094f, 0.004089f, 0.995117f, 0.004272f, 0.994141f, + 0.005089f, 0.993164f, 0.006470f, 0.992188f, 0.007740f, 0.990234f, 0.009552f, 0.987793f, + 0.012672f, 0.983887f, 0.018448f, 0.976074f, 0.033417f, 0.954590f, 0.107422f, 0.798340f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000339f, 0.998047f, 0.001081f, 0.998047f, 0.001574f, 0.997559f, 0.001827f, 0.997559f, + 0.002275f, 0.997070f, 0.002583f, 0.997070f, 0.002810f, 0.996582f, 0.003122f, 0.996582f, + 0.003309f, 0.996582f, 0.003561f, 0.996094f, 0.003790f, 0.996094f, 0.003849f, 0.995605f, + 0.004253f, 0.994629f, 0.004314f, 0.994141f, 0.005405f, 0.993652f, 0.006416f, 0.992676f, + 0.007534f, 0.991699f, 0.008308f, 0.990234f, 0.010536f, 0.987793f, 0.012924f, 0.984863f, + 0.017166f, 0.979980f, 0.024399f, 0.970215f, 0.043671f, 0.944824f, 0.130005f, 0.778320f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000720f, 0.998047f, + 0.001271f, 0.998047f, 0.001718f, 0.998047f, 0.001868f, 0.997559f, 0.002308f, 0.997559f, + 0.002445f, 0.997070f, 0.002810f, 0.997070f, 0.002867f, 0.997070f, 0.003267f, 0.996582f, + 0.003347f, 0.996582f, 0.003590f, 0.996582f, 0.003809f, 0.996094f, 0.003849f, 0.996094f, + 0.004181f, 0.995605f, 0.004311f, 0.995117f, 0.004337f, 0.994629f, 0.005432f, 0.994141f, + 0.006378f, 0.993164f, 0.006992f, 0.992676f, 0.007889f, 0.991699f, 0.008499f, 0.990234f, + 0.010254f, 0.988770f, 0.011909f, 0.987305f, 0.014374f, 0.984375f, 0.017975f, 0.980469f, + 0.023239f, 0.974121f, 0.033539f, 0.962402f, 0.057526f, 0.932129f, 0.156372f, 0.755859f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000325f, 0.998535f, 0.001050f, 0.998535f, 0.001381f, 0.998047f, 0.001841f, 0.998047f, + 0.002081f, 0.997559f, 0.002359f, 0.997559f, 0.002447f, 0.997559f, 0.002836f, 0.997070f, + 0.002882f, 0.997070f, 0.003223f, 0.997070f, 0.003353f, 0.996582f, 0.003378f, 0.996582f, + 0.003727f, 0.996582f, 0.003841f, 0.996582f, 0.003866f, 0.996094f, 0.004097f, 0.996094f, + 0.004311f, 0.995605f, 0.004345f, 0.995117f, 0.004463f, 0.994629f, 0.005764f, 0.994141f, + 0.006466f, 0.993652f, 0.006981f, 0.993164f, 0.007450f, 0.992676f, 0.008064f, 0.991699f, + 0.008682f, 0.991211f, 0.010078f, 0.990234f, 0.011444f, 0.988770f, 0.012810f, 0.987305f, + 0.014717f, 0.985352f, 0.017349f, 0.982422f, 0.020828f, 0.979004f, 0.025436f, 0.974121f, + 0.033142f, 0.966309f, 0.046814f, 0.951172f, 0.078186f, 0.914551f, 0.186279f, 0.730957f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000789f, 0.998535f, 0.001338f, 0.998535f, 0.001708f, 0.998047f, + 0.001906f, 0.998047f, 0.002312f, 0.998047f, 0.002401f, 0.997559f, 0.002708f, 0.997559f, + 0.002880f, 0.997559f, 0.002903f, 0.997070f, 0.003292f, 0.997070f, 0.003376f, 0.997070f, + 0.003391f, 0.996582f, 0.003693f, 0.996582f, 0.003853f, 0.996582f, 0.003876f, 0.996582f, + 0.003883f, 0.996094f, 0.004257f, 0.996094f, 0.004345f, 0.995605f, 0.004364f, 0.995117f, + 0.004715f, 0.994629f, 0.005821f, 0.994629f, 0.006481f, 0.994141f, 0.006840f, 0.993652f, + 0.007168f, 0.993652f, 0.007568f, 0.993164f, 0.008102f, 0.992188f, 0.008560f, 0.991699f, + 0.009575f, 0.991211f, 0.010666f, 0.990234f, 0.011513f, 0.989258f, 0.012497f, 0.988281f, + 0.013969f, 0.987305f, 0.015282f, 0.985840f, 0.017303f, 0.983887f, 0.019363f, 0.981934f, + 0.022629f, 0.979004f, 0.026077f, 0.975586f, 0.030899f, 0.970703f, 0.038208f, 0.964355f, + 0.048920f, 0.953613f, 0.067078f, 0.934570f, 0.107483f, 0.891113f, 0.220215f, 0.703613f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000422f, 0.999023f, 0.001333f, 0.998535f, 0.001707f, 0.998535f, + 0.001929f, 0.998047f, 0.002382f, 0.998047f, 0.002422f, 0.997559f, 0.002855f, 0.997559f, + 0.002909f, 0.997559f, 0.002916f, 0.997070f, 0.003376f, 0.997070f, 0.003399f, 0.997070f, + 0.003405f, 0.996582f, 0.003839f, 0.996582f, 0.003881f, 0.996582f, 0.003889f, 0.996582f, + 0.003893f, 0.996094f, 0.004330f, 0.996094f, 0.004368f, 0.995605f, 0.004555f, 0.995605f, + 0.005287f, 0.995117f, 0.005974f, 0.994629f, 0.006672f, 0.994141f, 0.007069f, 0.994141f, + 0.007229f, 0.993652f, 0.007607f, 0.993652f, 0.007729f, 0.993164f, 0.008400f, 0.992676f, + 0.009026f, 0.992188f, 0.009872f, 0.991699f, 0.010773f, 0.991211f, 0.011246f, 0.990723f, + 0.011604f, 0.989746f, 0.012962f, 0.988770f, 0.014107f, 0.988281f, 0.015137f, 0.987305f, + 0.016022f, 0.986328f, 0.017838f, 0.985352f, 0.018921f, 0.983398f, 0.021347f, 0.981934f, + 0.023483f, 0.980469f, 0.025940f, 0.978516f, 0.028519f, 0.975586f, 0.032196f, 0.972656f, + 0.037262f, 0.968750f, 0.042358f, 0.963379f, 0.050262f, 0.957031f, 0.060425f, 0.947754f, + 0.075745f, 0.933594f, 0.100952f, 0.909180f, 0.150269f, 0.857422f, 0.257080f, 0.674316f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000370f, 0.999023f, 0.001435f, 0.998535f, + 0.001935f, 0.998535f, 0.002403f, 0.998047f, 0.002434f, 0.997559f, 0.002914f, 0.997559f, + 0.002922f, 0.997559f, 0.003397f, 0.997070f, 0.003408f, 0.997070f, 0.003412f, 0.997070f, + 0.003889f, 0.996582f, 0.003897f, 0.996582f, 0.003899f, 0.996582f, 0.004349f, 0.996094f, + 0.005032f, 0.995605f, 0.005718f, 0.995117f, 0.006176f, 0.995117f, 0.006611f, 0.994629f, + 0.007233f, 0.994141f, 0.007278f, 0.994141f, 0.007736f, 0.993652f, 0.007771f, 0.993652f, + 0.008148f, 0.992676f, 0.009468f, 0.992188f, 0.010078f, 0.991699f, 0.010925f, 0.991211f, + 0.011299f, 0.991211f, 0.011597f, 0.990723f, 0.011902f, 0.990234f, 0.013397f, 0.989258f, + 0.014366f, 0.988770f, 0.015320f, 0.988281f, 0.015762f, 0.987305f, 0.017136f, 0.986328f, + 0.018494f, 0.985840f, 0.019135f, 0.984863f, 0.020325f, 0.983887f, 0.022293f, 0.982910f, + 0.023926f, 0.981934f, 0.025345f, 0.980469f, 0.027115f, 0.979004f, 0.029114f, 0.977539f, + 0.031433f, 0.976074f, 0.033905f, 0.973633f, 0.037201f, 0.971680f, 0.040192f, 0.969238f, + 0.043945f, 0.966309f, 0.048737f, 0.962891f, 0.053955f, 0.958984f, 0.059631f, 0.954102f, + 0.067017f, 0.948242f, 0.076050f, 0.940918f, 0.087769f, 0.931152f, 0.103699f, 0.917969f, + 0.125244f, 0.898438f, 0.157471f, 0.868652f, 0.212036f, 0.811035f, 0.298584f, 0.642578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.001461f, 0.999023f, 0.002430f, 0.998535f, + 0.002922f, 0.998047f, 0.003342f, 0.997559f, 0.003414f, 0.997559f, 0.003899f, 0.997070f, + 0.004780f, 0.996094f, 0.005817f, 0.995605f, 0.006329f, 0.995117f, 0.006817f, 0.994629f, + 0.007732f, 0.994141f, 0.007793f, 0.993652f, 0.009407f, 0.992676f, 0.010078f, 0.992188f, + 0.010658f, 0.991699f, 0.011658f, 0.991211f, 0.012436f, 0.990723f, 0.013901f, 0.989746f, + 0.014809f, 0.989258f, 0.015106f, 0.988770f, 0.015961f, 0.987793f, 0.018448f, 0.986816f, + 0.019196f, 0.986328f, 0.019440f, 0.985352f, 0.021423f, 0.984375f, 0.022339f, 0.983887f, + 0.023834f, 0.982910f, 0.025330f, 0.981934f, 0.026566f, 0.980957f, 0.028549f, 0.979980f, + 0.030380f, 0.979004f, 0.031799f, 0.977539f, 0.033600f, 0.976562f, 0.035095f, 0.975098f, + 0.038330f, 0.973633f, 0.040131f, 0.972656f, 0.041656f, 0.971191f, 0.044373f, 0.969238f, + 0.046631f, 0.967773f, 0.050232f, 0.965820f, 0.053284f, 0.963867f, 0.056763f, 0.961426f, + 0.060303f, 0.959473f, 0.063721f, 0.957031f, 0.067627f, 0.954102f, 0.071960f, 0.951172f, + 0.076660f, 0.947754f, 0.082336f, 0.944336f, 0.087891f, 0.940430f, 0.094604f, 0.936035f, + 0.101562f, 0.931152f, 0.109619f, 0.925293f, 0.119080f, 0.918457f, 0.129517f, 0.910645f, + 0.141357f, 0.901855f, 0.155518f, 0.890625f, 0.172363f, 0.876953f, 0.192383f, 0.859863f, + 0.217896f, 0.836914f, 0.250977f, 0.803711f, 0.297852f, 0.748047f, 0.341553f, 0.608398f, + 0.000000f, 1.000000f, 0.005363f, 0.997559f, 0.010078f, 0.994141f, 0.015091f, 0.990723f, + 0.020065f, 0.987305f, 0.024734f, 0.983887f, 0.028702f, 0.980957f, 0.034027f, 0.977539f, + 0.039154f, 0.974121f, 0.044220f, 0.971191f, 0.049164f, 0.967773f, 0.053772f, 0.964844f, + 0.058350f, 0.962402f, 0.063538f, 0.959473f, 0.068420f, 0.956543f, 0.072754f, 0.953613f, + 0.078552f, 0.950684f, 0.083374f, 0.948242f, 0.088318f, 0.945312f, 0.093262f, 0.942383f, + 0.097961f, 0.939941f, 0.103149f, 0.937500f, 0.109009f, 0.934570f, 0.114319f, 0.931641f, + 0.119019f, 0.929199f, 0.125000f, 0.926270f, 0.130127f, 0.923340f, 0.135376f, 0.920410f, + 0.140503f, 0.917969f, 0.146118f, 0.915039f, 0.151245f, 0.912109f, 0.157104f, 0.909180f, + 0.162354f, 0.906250f, 0.168335f, 0.902832f, 0.173828f, 0.899902f, 0.179443f, 0.896973f, + 0.185303f, 0.893555f, 0.191284f, 0.890137f, 0.197510f, 0.886719f, 0.203735f, 0.883301f, + 0.209717f, 0.879395f, 0.216553f, 0.875488f, 0.222656f, 0.871582f, 0.229248f, 0.867676f, + 0.235596f, 0.863770f, 0.242798f, 0.858887f, 0.249756f, 0.854492f, 0.256592f, 0.849609f, + 0.264160f, 0.844727f, 0.271484f, 0.839355f, 0.279297f, 0.833496f, 0.286865f, 0.827637f, + 0.295410f, 0.820801f, 0.303711f, 0.813965f, 0.312500f, 0.806152f, 0.321777f, 0.797852f, + 0.331299f, 0.788086f, 0.341309f, 0.777344f, 0.352051f, 0.765137f, 0.364014f, 0.750000f, + 0.376709f, 0.731445f, 0.390625f, 0.706543f, 0.405518f, 0.667969f, 0.387695f, 0.570801f, + 0.000000f, 1.000000f, 0.492188f, 0.772461f, 0.515137f, 0.719727f, 0.529297f, 0.693848f, + 0.538574f, 0.678711f, 0.547363f, 0.668945f, 0.554199f, 0.662598f, 0.562012f, 0.657715f, + 0.568359f, 0.654297f, 0.573730f, 0.651367f, 0.579102f, 0.648926f, 0.584473f, 0.646973f, + 0.589355f, 0.645508f, 0.593750f, 0.644043f, 0.598145f, 0.642578f, 0.602051f, 0.641113f, + 0.606445f, 0.639648f, 0.611816f, 0.638184f, 0.615234f, 0.637207f, 0.619629f, 0.635254f, + 0.623535f, 0.633789f, 0.627441f, 0.632324f, 0.630859f, 0.630859f, 0.634766f, 0.628906f, + 0.638184f, 0.627441f, 0.642090f, 0.625488f, 0.645508f, 0.623535f, 0.649414f, 0.621582f, + 0.652832f, 0.619141f, 0.655762f, 0.617188f, 0.659180f, 0.614746f, 0.663574f, 0.612305f, + 0.666504f, 0.609863f, 0.670410f, 0.606934f, 0.673340f, 0.604492f, 0.676758f, 0.601562f, + 0.679688f, 0.598145f, 0.684082f, 0.594727f, 0.688477f, 0.591309f, 0.690430f, 0.587891f, + 0.694824f, 0.583984f, 0.698242f, 0.580078f, 0.701172f, 0.575684f, 0.705078f, 0.571289f, + 0.708008f, 0.566406f, 0.712891f, 0.561523f, 0.715820f, 0.556152f, 0.720215f, 0.550781f, + 0.722656f, 0.544434f, 0.728027f, 0.538086f, 0.731445f, 0.531250f, 0.735352f, 0.523438f, + 0.739746f, 0.515625f, 0.743652f, 0.506836f, 0.747559f, 0.497070f, 0.752441f, 0.486084f, + 0.756836f, 0.473877f, 0.761230f, 0.460205f, 0.767090f, 0.443848f, 0.772461f, 0.424805f, + 0.777832f, 0.401123f, 0.784180f, 0.369385f, 0.790527f, 0.321533f, 0.778809f, 0.219238f, + 0.000000f, 1.000000f, 0.548828f, 0.747070f, 0.594238f, 0.676270f, 0.623535f, 0.636230f, + 0.645996f, 0.608887f, 0.666016f, 0.588867f, 0.682617f, 0.573242f, 0.698242f, 0.560547f, + 0.711914f, 0.549316f, 0.722656f, 0.540039f, 0.735352f, 0.531738f, 0.745117f, 0.523926f, + 0.754395f, 0.517090f, 0.763184f, 0.510254f, 0.772949f, 0.503906f, 0.780273f, 0.498291f, + 0.787109f, 0.492676f, 0.793457f, 0.487305f, 0.800781f, 0.481934f, 0.806641f, 0.476807f, + 0.813477f, 0.471680f, 0.818359f, 0.466797f, 0.824219f, 0.461670f, 0.830078f, 0.456543f, + 0.835938f, 0.451416f, 0.840820f, 0.446533f, 0.844727f, 0.441650f, 0.849121f, 0.436523f, + 0.854492f, 0.431152f, 0.857910f, 0.426270f, 0.862305f, 0.421143f, 0.865723f, 0.415771f, + 0.869629f, 0.410645f, 0.874023f, 0.405273f, 0.876953f, 0.399658f, 0.879883f, 0.394043f, + 0.884277f, 0.388428f, 0.886719f, 0.382568f, 0.890137f, 0.376709f, 0.893066f, 0.370605f, + 0.895996f, 0.364258f, 0.899902f, 0.357910f, 0.902832f, 0.351074f, 0.905273f, 0.344238f, + 0.908691f, 0.337158f, 0.911133f, 0.329834f, 0.913086f, 0.322266f, 0.916016f, 0.314453f, + 0.918457f, 0.306152f, 0.921387f, 0.297607f, 0.923340f, 0.288574f, 0.926270f, 0.279053f, + 0.928711f, 0.269043f, 0.931641f, 0.258301f, 0.933105f, 0.246948f, 0.937012f, 0.234497f, + 0.938477f, 0.221191f, 0.940918f, 0.206543f, 0.943848f, 0.190308f, 0.946289f, 0.171753f, + 0.947754f, 0.150757f, 0.952148f, 0.124451f, 0.953613f, 0.090881f, 0.949707f, 0.040405f, + 0.000000f, 1.000000f, 0.603516f, 0.723633f, 0.665527f, 0.637207f, 0.707031f, 0.584473f, + 0.735352f, 0.548340f, 0.760254f, 0.520020f, 0.779785f, 0.498291f, 0.796875f, 0.479980f, + 0.811035f, 0.464600f, 0.822754f, 0.451172f, 0.834473f, 0.439209f, 0.845215f, 0.428467f, + 0.853516f, 0.418945f, 0.861328f, 0.409912f, 0.870117f, 0.401367f, 0.875977f, 0.393555f, + 0.881836f, 0.386230f, 0.887695f, 0.379150f, 0.892578f, 0.372314f, 0.896973f, 0.365967f, + 0.902344f, 0.359619f, 0.905762f, 0.353516f, 0.911133f, 0.347412f, 0.914551f, 0.341553f, + 0.917969f, 0.335938f, 0.921387f, 0.330078f, 0.923828f, 0.324707f, 0.926758f, 0.319092f, + 0.928711f, 0.313721f, 0.932617f, 0.308105f, 0.933594f, 0.302734f, 0.937012f, 0.297119f, + 0.938965f, 0.291748f, 0.942383f, 0.285889f, 0.943848f, 0.280273f, 0.945801f, 0.274902f, + 0.948242f, 0.269043f, 0.949219f, 0.263428f, 0.950195f, 0.257812f, 0.951660f, 0.252197f, + 0.954590f, 0.245972f, 0.956055f, 0.239868f, 0.957031f, 0.233765f, 0.958496f, 0.227539f, + 0.960938f, 0.220825f, 0.962402f, 0.214233f, 0.963379f, 0.207397f, 0.964844f, 0.200317f, + 0.965332f, 0.193237f, 0.966309f, 0.185791f, 0.967773f, 0.177979f, 0.969238f, 0.170044f, + 0.969727f, 0.161743f, 0.971680f, 0.152832f, 0.972656f, 0.143555f, 0.973633f, 0.133911f, + 0.975098f, 0.123474f, 0.976074f, 0.112427f, 0.977051f, 0.100403f, 0.978027f, 0.087280f, + 0.979492f, 0.072815f, 0.979980f, 0.056366f, 0.981445f, 0.036926f, 0.978027f, 0.012779f, + 0.000000f, 1.000000f, 0.655273f, 0.702148f, 0.727051f, 0.603516f, 0.772461f, 0.542480f, + 0.804199f, 0.499756f, 0.827148f, 0.467773f, 0.846191f, 0.441895f, 0.860840f, 0.420654f, + 0.873047f, 0.403076f, 0.884277f, 0.387451f, 0.894043f, 0.373779f, 0.901367f, 0.361816f, + 0.907715f, 0.350830f, 0.914062f, 0.341064f, 0.919434f, 0.332031f, 0.924805f, 0.323242f, + 0.928711f, 0.315186f, 0.933105f, 0.307617f, 0.937012f, 0.300293f, 0.938965f, 0.293945f, + 0.942871f, 0.287109f, 0.945312f, 0.281006f, 0.948730f, 0.274658f, 0.950684f, 0.268555f, + 0.952148f, 0.262939f, 0.955566f, 0.257324f, 0.957031f, 0.251709f, 0.958496f, 0.246338f, + 0.959961f, 0.240967f, 0.961426f, 0.235840f, 0.963379f, 0.230469f, 0.964844f, 0.225220f, + 0.965820f, 0.220093f, 0.968262f, 0.214844f, 0.968750f, 0.209595f, 0.969727f, 0.204468f, + 0.970703f, 0.199341f, 0.972656f, 0.193970f, 0.973145f, 0.188721f, 0.974121f, 0.183472f, + 0.975586f, 0.178101f, 0.976074f, 0.172852f, 0.977051f, 0.167358f, 0.977539f, 0.161987f, + 0.979004f, 0.156250f, 0.979492f, 0.150513f, 0.980469f, 0.144775f, 0.981445f, 0.138672f, + 0.981445f, 0.132690f, 0.981934f, 0.126465f, 0.981934f, 0.120361f, 0.982910f, 0.113831f, + 0.983887f, 0.106995f, 0.984863f, 0.099976f, 0.985352f, 0.092651f, 0.985840f, 0.085083f, + 0.986328f, 0.077271f, 0.986816f, 0.069031f, 0.987305f, 0.060425f, 0.988281f, 0.051086f, + 0.989258f, 0.040802f, 0.989746f, 0.029984f, 0.989746f, 0.018524f, 0.988770f, 0.007530f, + 0.000000f, 1.000000f, 0.700195f, 0.684082f, 0.778809f, 0.576172f, 0.823730f, 0.509766f, + 0.852051f, 0.464111f, 0.874023f, 0.428955f, 0.888672f, 0.401611f, 0.902832f, 0.378662f, + 0.911621f, 0.359619f, 0.920410f, 0.343018f, 0.926758f, 0.328857f, 0.932129f, 0.315918f, + 0.937500f, 0.304443f, 0.941895f, 0.293945f, 0.947266f, 0.284180f, 0.949707f, 0.275391f, + 0.952637f, 0.267334f, 0.956543f, 0.259521f, 0.958984f, 0.251953f, 0.960938f, 0.245117f, + 0.962891f, 0.238525f, 0.964844f, 0.232178f, 0.966797f, 0.226074f, 0.968262f, 0.220215f, + 0.969238f, 0.214600f, 0.970703f, 0.209106f, 0.972656f, 0.203613f, 0.973145f, 0.198486f, + 0.975586f, 0.193115f, 0.976074f, 0.187988f, 0.977051f, 0.182983f, 0.977539f, 0.178223f, + 0.978516f, 0.173340f, 0.979004f, 0.168701f, 0.980957f, 0.163818f, 0.981445f, 0.158936f, + 0.982422f, 0.154175f, 0.982422f, 0.149414f, 0.982910f, 0.144897f, 0.983398f, 0.140259f, + 0.984863f, 0.135376f, 0.985352f, 0.130493f, 0.985352f, 0.125854f, 0.985840f, 0.121094f, + 0.986328f, 0.116333f, 0.987305f, 0.111328f, 0.987305f, 0.106445f, 0.987793f, 0.101440f, + 0.988281f, 0.096436f, 0.989258f, 0.091125f, 0.989746f, 0.085815f, 0.989746f, 0.080505f, + 0.990723f, 0.075012f, 0.990723f, 0.069397f, 0.990723f, 0.063782f, 0.991211f, 0.057953f, + 0.991211f, 0.052032f, 0.991699f, 0.045807f, 0.992188f, 0.039154f, 0.992676f, 0.032318f, + 0.993652f, 0.024948f, 0.993652f, 0.017715f, 0.993652f, 0.010201f, 0.993652f, 0.004353f, + 0.000000f, 1.000000f, 0.741211f, 0.668457f, 0.819336f, 0.555176f, 0.861328f, 0.486084f, + 0.888184f, 0.437744f, 0.904785f, 0.401611f, 0.917969f, 0.372559f, 0.927734f, 0.349121f, + 0.936523f, 0.328857f, 0.942383f, 0.312012f, 0.948730f, 0.296875f, 0.952148f, 0.283691f, + 0.956543f, 0.271484f, 0.959473f, 0.260742f, 0.962891f, 0.250977f, 0.965332f, 0.241943f, + 0.967773f, 0.233276f, 0.969727f, 0.225342f, 0.971680f, 0.218018f, 0.972656f, 0.211060f, + 0.974121f, 0.204590f, 0.977051f, 0.197876f, 0.977539f, 0.191772f, 0.978516f, 0.186035f, + 0.979492f, 0.180542f, 0.980957f, 0.175171f, 0.981445f, 0.169800f, 0.982422f, 0.164673f, + 0.982422f, 0.159912f, 0.983398f, 0.155029f, 0.984863f, 0.150269f, 0.985840f, 0.145386f, + 0.985840f, 0.140869f, 0.986328f, 0.136475f, 0.986328f, 0.132080f, 0.986816f, 0.127686f, + 0.987305f, 0.123474f, 0.987793f, 0.119141f, 0.988281f, 0.114868f, 0.989746f, 0.110413f, + 0.989746f, 0.106140f, 0.989746f, 0.101990f, 0.990234f, 0.097900f, 0.990234f, 0.093689f, + 0.990723f, 0.089478f, 0.991211f, 0.085266f, 0.991211f, 0.081055f, 0.991211f, 0.076904f, + 0.991699f, 0.072632f, 0.991699f, 0.068420f, 0.992676f, 0.063965f, 0.993164f, 0.059418f, + 0.994141f, 0.054688f, 0.994141f, 0.050110f, 0.994141f, 0.045532f, 0.994141f, 0.040955f, + 0.994629f, 0.036133f, 0.994629f, 0.031403f, 0.994629f, 0.026627f, 0.995117f, 0.021637f, + 0.995117f, 0.016663f, 0.994629f, 0.011780f, 0.995117f, 0.006794f, 0.995117f, 0.003134f, + 0.000000f, 1.000000f, 0.776855f, 0.655762f, 0.853027f, 0.539062f, 0.889648f, 0.468506f, + 0.912109f, 0.419189f, 0.926758f, 0.381592f, 0.937988f, 0.352051f, 0.944824f, 0.327881f, + 0.952148f, 0.306885f, 0.957520f, 0.289307f, 0.961914f, 0.273682f, 0.964355f, 0.260254f, + 0.967285f, 0.247925f, 0.970215f, 0.236694f, 0.972656f, 0.226318f, 0.974121f, 0.217285f, + 0.976562f, 0.208496f, 0.977539f, 0.200562f, 0.979492f, 0.192993f, 0.980957f, 0.185791f, + 0.981445f, 0.179199f, 0.982422f, 0.172852f, 0.982910f, 0.166870f, 0.983887f, 0.161255f, + 0.985840f, 0.155396f, 0.986328f, 0.150024f, 0.986328f, 0.145020f, 0.986816f, 0.140259f, + 0.987305f, 0.135498f, 0.987793f, 0.130859f, 0.988770f, 0.126343f, 0.990234f, 0.121643f, + 0.990234f, 0.117310f, 0.990234f, 0.113159f, 0.990723f, 0.109070f, 0.990723f, 0.105042f, + 0.990723f, 0.101196f, 0.991699f, 0.097168f, 0.991699f, 0.093323f, 0.992188f, 0.089539f, + 0.992188f, 0.085754f, 0.992676f, 0.081970f, 0.993164f, 0.078247f, 0.994141f, 0.074341f, + 0.994629f, 0.070435f, 0.994629f, 0.066711f, 0.994629f, 0.063049f, 0.994629f, 0.059479f, + 0.994629f, 0.055908f, 0.995117f, 0.052185f, 0.995117f, 0.048584f, 0.995117f, 0.044983f, + 0.994629f, 0.041412f, 0.995117f, 0.037689f, 0.995117f, 0.034027f, 0.995117f, 0.030380f, + 0.995117f, 0.026764f, 0.995605f, 0.022888f, 0.995605f, 0.019196f, 0.996094f, 0.015350f, + 0.996094f, 0.011658f, 0.996582f, 0.007851f, 0.997070f, 0.004223f, 0.998535f, 0.000417f, + 0.000000f, 1.000000f, 0.807617f, 0.645508f, 0.878906f, 0.526855f, 0.911621f, 0.455566f, + 0.929199f, 0.405518f, 0.942383f, 0.367188f, 0.951660f, 0.336670f, 0.957520f, 0.311768f, + 0.963867f, 0.290527f, 0.966797f, 0.272461f, 0.970215f, 0.256592f, 0.973145f, 0.242554f, + 0.976074f, 0.229736f, 0.977051f, 0.218506f, 0.979004f, 0.208130f, 0.980957f, 0.198486f, + 0.982422f, 0.189697f, 0.982910f, 0.181641f, 0.984375f, 0.174072f, 0.985352f, 0.166748f, + 0.986328f, 0.160034f, 0.986328f, 0.153809f, 0.987305f, 0.147827f, 0.987793f, 0.142090f, + 0.988770f, 0.136719f, 0.990234f, 0.131226f, 0.990234f, 0.126099f, 0.990234f, 0.121460f, + 0.990723f, 0.116821f, 0.990723f, 0.112488f, 0.991211f, 0.108215f, 0.991699f, 0.104004f, + 0.992188f, 0.099915f, 0.992188f, 0.095947f, 0.992676f, 0.092041f, 0.993164f, 0.088257f, + 0.994141f, 0.084351f, 0.994629f, 0.080505f, 0.994629f, 0.076904f, 0.994629f, 0.073486f, + 0.994629f, 0.070068f, 0.994629f, 0.066772f, 0.995117f, 0.063354f, 0.995117f, 0.060150f, + 0.995117f, 0.056946f, 0.995117f, 0.053802f, 0.995605f, 0.050690f, 0.995605f, 0.047455f, + 0.995605f, 0.044373f, 0.995605f, 0.041351f, 0.996094f, 0.038239f, 0.996094f, 0.035156f, + 0.996094f, 0.032135f, 0.996582f, 0.029144f, 0.996582f, 0.026001f, 0.996582f, 0.023026f, + 0.997070f, 0.019897f, 0.997070f, 0.016907f, 0.997070f, 0.013779f, 0.997559f, 0.010658f, + 0.998535f, 0.007397f, 0.999023f, 0.004097f, 0.999023f, 0.001551f, 0.998535f, 0.000064f, + 0.000000f, 1.000000f, 0.832031f, 0.637695f, 0.897461f, 0.518555f, 0.927734f, 0.446045f, + 0.942871f, 0.395264f, 0.954102f, 0.356445f, 0.960938f, 0.325439f, 0.966309f, 0.300049f, + 0.970703f, 0.278320f, 0.973633f, 0.259766f, 0.976562f, 0.243408f, 0.978516f, 0.229004f, + 0.980469f, 0.216064f, 0.982422f, 0.204468f, 0.983398f, 0.193848f, 0.984863f, 0.184082f, + 0.985840f, 0.175171f, 0.986816f, 0.166992f, 0.987793f, 0.159180f, 0.988281f, 0.152100f, + 0.989746f, 0.145142f, 0.989746f, 0.138794f, 0.990234f, 0.132812f, 0.990723f, 0.127197f, + 0.990723f, 0.121948f, 0.991211f, 0.116882f, 0.991699f, 0.112061f, 0.992188f, 0.107239f, + 0.992676f, 0.102722f, 0.993164f, 0.098328f, 0.994141f, 0.093933f, 0.994629f, 0.089783f, + 0.994629f, 0.085815f, 0.994629f, 0.082092f, 0.994629f, 0.078491f, 0.994629f, 0.075073f, + 0.995117f, 0.071594f, 0.995117f, 0.068237f, 0.995117f, 0.065002f, 0.995117f, 0.061920f, + 0.995605f, 0.058807f, 0.995605f, 0.055725f, 0.995605f, 0.052765f, 0.995605f, 0.049866f, + 0.996094f, 0.046967f, 0.996094f, 0.044098f, 0.996094f, 0.041321f, 0.996094f, 0.038635f, + 0.996582f, 0.035797f, 0.996582f, 0.033142f, 0.997070f, 0.030411f, 0.997070f, 0.027756f, + 0.997559f, 0.025085f, 0.997559f, 0.022461f, 0.998047f, 0.019760f, 0.998535f, 0.017059f, + 0.999512f, 0.014137f, 0.999512f, 0.011505f, 0.999512f, 0.009064f, 0.999512f, 0.006756f, + 0.999512f, 0.004593f, 0.999023f, 0.002617f, 0.999023f, 0.000950f, 0.999023f, 0.000032f, + 0.000000f, 1.000000f, 0.853027f, 0.631836f, 0.915039f, 0.511230f, 0.940918f, 0.438965f, + 0.953125f, 0.387939f, 0.961914f, 0.348633f, 0.968262f, 0.316895f, 0.972656f, 0.290771f, + 0.976074f, 0.268799f, 0.979004f, 0.249878f, 0.980957f, 0.233154f, 0.982422f, 0.218506f, + 0.984863f, 0.205078f, 0.985840f, 0.193237f, 0.986328f, 0.182739f, 0.987793f, 0.172729f, + 0.989258f, 0.163452f, 0.989746f, 0.155029f, 0.989746f, 0.147461f, 0.990723f, 0.140259f, + 0.990723f, 0.133545f, 0.991211f, 0.127319f, 0.991699f, 0.121399f, 0.992676f, 0.115601f, + 0.993164f, 0.110229f, 0.994141f, 0.104919f, 0.994141f, 0.100037f, 0.994629f, 0.095398f, + 0.994629f, 0.091003f, 0.994629f, 0.086853f, 0.994629f, 0.082947f, 0.995117f, 0.079102f, + 0.995117f, 0.075378f, 0.995117f, 0.071838f, 0.995117f, 0.068481f, 0.995605f, 0.065125f, + 0.995605f, 0.061920f, 0.995605f, 0.058838f, 0.995605f, 0.055878f, 0.996094f, 0.052826f, + 0.996094f, 0.049957f, 0.996094f, 0.047211f, 0.996582f, 0.044403f, 0.996582f, 0.041718f, + 0.996582f, 0.039154f, 0.997070f, 0.036469f, 0.997070f, 0.033997f, 0.997559f, 0.031403f, + 0.998047f, 0.028961f, 0.998047f, 0.026474f, 0.998535f, 0.023956f, 0.999512f, 0.021255f, + 0.999512f, 0.018890f, 0.999512f, 0.016647f, 0.999512f, 0.014503f, 0.999512f, 0.012428f, + 0.999512f, 0.010422f, 0.999512f, 0.008499f, 0.999512f, 0.006653f, 0.999512f, 0.004906f, + 0.999512f, 0.003284f, 0.999512f, 0.001829f, 0.999023f, 0.000638f, 0.999023f, 0.000019f, + 0.000000f, 1.000000f, 0.873047f, 0.625977f, 0.927246f, 0.506836f, 0.949707f, 0.433838f, + 0.961426f, 0.381836f, 0.968750f, 0.342041f, 0.974121f, 0.310303f, 0.977051f, 0.283936f, + 0.980469f, 0.261230f, 0.982422f, 0.242065f, 0.984375f, 0.224976f, 0.985840f, 0.209961f, + 0.986816f, 0.196777f, 0.988770f, 0.184448f, 0.989746f, 0.173218f, 0.989746f, 0.163452f, + 0.990723f, 0.154419f, 0.991211f, 0.145996f, 0.991699f, 0.138184f, 0.992188f, 0.130981f, + 0.993164f, 0.124023f, 0.994141f, 0.117371f, 0.994141f, 0.111389f, 0.994629f, 0.105835f, + 0.994629f, 0.100525f, 0.994629f, 0.095581f, 0.994629f, 0.090942f, 0.995117f, 0.086426f, + 0.995117f, 0.082214f, 0.995117f, 0.078247f, 0.995117f, 0.074402f, 0.995605f, 0.070618f, + 0.995605f, 0.067078f, 0.995605f, 0.063721f, 0.996094f, 0.060364f, 0.996094f, 0.057220f, + 0.996094f, 0.054230f, 0.996582f, 0.051178f, 0.996582f, 0.048340f, 0.997070f, 0.045502f, + 0.997070f, 0.042786f, 0.997559f, 0.040161f, 0.997559f, 0.037567f, 0.998047f, 0.034973f, + 0.998535f, 0.032471f, 0.999023f, 0.029922f, 0.999512f, 0.027359f, 0.999512f, 0.025055f, + 0.999512f, 0.022873f, 0.999512f, 0.020782f, 0.999512f, 0.018768f, 0.999512f, 0.016830f, + 0.999512f, 0.014954f, 0.999512f, 0.013130f, 0.999512f, 0.011383f, 0.999512f, 0.009689f, + 0.999512f, 0.008072f, 0.999512f, 0.006523f, 0.999512f, 0.005054f, 0.999512f, 0.003685f, + 0.999512f, 0.002428f, 0.999512f, 0.001325f, 0.999512f, 0.000447f, 0.999023f, 0.000013f, + 0.000000f, 1.000000f, 0.888184f, 0.623047f, 0.937988f, 0.503418f, 0.956543f, 0.430420f, + 0.967285f, 0.377686f, 0.973633f, 0.337402f, 0.978027f, 0.304932f, 0.980469f, 0.278320f, + 0.984375f, 0.255127f, 0.985352f, 0.235718f, 0.986816f, 0.218506f, 0.988770f, 0.203003f, + 0.989746f, 0.189331f, 0.990234f, 0.177246f, 0.990234f, 0.166382f, 0.991211f, 0.156250f, + 0.992188f, 0.146973f, 0.993164f, 0.138306f, 0.994141f, 0.130005f, 0.994141f, 0.122742f, + 0.994629f, 0.116089f, 0.994629f, 0.109680f, 0.994629f, 0.103882f, 0.994629f, 0.098389f, + 0.995117f, 0.093140f, 0.995117f, 0.088257f, 0.995117f, 0.083679f, 0.995605f, 0.079224f, + 0.995605f, 0.075073f, 0.995605f, 0.071167f, 0.996094f, 0.067261f, 0.996094f, 0.063721f, + 0.996582f, 0.060242f, 0.996582f, 0.056915f, 0.996582f, 0.053772f, 0.997070f, 0.050629f, + 0.997070f, 0.047729f, 0.997559f, 0.044769f, 0.998047f, 0.041962f, 0.998535f, 0.039215f, + 0.999023f, 0.036469f, 0.999512f, 0.033752f, 0.999512f, 0.031311f, 0.999512f, 0.029022f, + 0.999512f, 0.026840f, 0.999512f, 0.024734f, 0.999512f, 0.022720f, 0.999512f, 0.020782f, + 0.999512f, 0.018921f, 0.999512f, 0.017120f, 0.999512f, 0.015404f, 0.999512f, 0.013741f, + 0.999512f, 0.012138f, 0.999512f, 0.010597f, 0.999512f, 0.009125f, 0.999512f, 0.007717f, + 0.999512f, 0.006378f, 0.999512f, 0.005108f, 0.999512f, 0.003922f, 0.999512f, 0.002823f, + 0.999512f, 0.001834f, 0.999512f, 0.000981f, 0.999512f, 0.000322f, 0.999512f, 0.000008f, + 0.000000f, 1.000000f, 0.901855f, 0.619629f, 0.946289f, 0.500488f, 0.963867f, 0.426758f, + 0.971680f, 0.374512f, 0.977539f, 0.333740f, 0.980957f, 0.301025f, 0.984375f, 0.273193f, + 0.985840f, 0.250488f, 0.988281f, 0.230347f, 0.989258f, 0.212891f, 0.990234f, 0.197510f, + 0.990723f, 0.183838f, 0.991699f, 0.171387f, 0.992188f, 0.160156f, 0.994141f, 0.149536f, + 0.994141f, 0.140137f, 0.994141f, 0.131714f, 0.994629f, 0.123779f, 0.994629f, 0.116577f, + 0.994629f, 0.109924f, 0.995117f, 0.103577f, 0.995117f, 0.097717f, 0.995605f, 0.092224f, + 0.995605f, 0.087036f, 0.995605f, 0.082214f, 0.996094f, 0.077515f, 0.996094f, 0.073242f, + 0.996582f, 0.069031f, 0.996582f, 0.065125f, 0.997070f, 0.061401f, 0.997070f, 0.057831f, + 0.997559f, 0.054382f, 0.997559f, 0.051117f, 0.998047f, 0.047913f, 0.998535f, 0.044800f, + 0.999512f, 0.041626f, 0.999512f, 0.038818f, 0.999512f, 0.036194f, 0.999512f, 0.033722f, + 0.999512f, 0.031372f, 0.999512f, 0.029144f, 0.999512f, 0.027008f, 0.999512f, 0.024963f, + 0.999512f, 0.022995f, 0.999512f, 0.021118f, 0.999512f, 0.019318f, 0.999512f, 0.017593f, + 0.999512f, 0.015945f, 0.999512f, 0.014366f, 0.999512f, 0.012856f, 0.999512f, 0.011398f, + 0.999512f, 0.010017f, 0.999512f, 0.008690f, 0.999512f, 0.007435f, 0.999512f, 0.006241f, + 0.999512f, 0.005116f, 0.999512f, 0.004063f, 0.999512f, 0.003088f, 0.999512f, 0.002197f, + 0.999512f, 0.001409f, 0.999512f, 0.000741f, 0.999512f, 0.000237f, 0.999512f, 0.000006f, + 0.000000f, 1.000000f, 0.912598f, 0.617676f, 0.952637f, 0.498779f, 0.968262f, 0.424805f, + 0.976074f, 0.371826f, 0.980469f, 0.330566f, 0.983887f, 0.297363f, 0.985840f, 0.270020f, + 0.988770f, 0.246094f, 0.989258f, 0.226196f, 0.990234f, 0.208618f, 0.991211f, 0.193115f, + 0.992188f, 0.178955f, 0.993652f, 0.166138f, 0.994141f, 0.154663f, 0.994141f, 0.144531f, + 0.994629f, 0.135132f, 0.994629f, 0.126709f, 0.995117f, 0.118774f, 0.995117f, 0.111511f, + 0.995117f, 0.104797f, 0.995605f, 0.098450f, 0.995605f, 0.092590f, 0.996094f, 0.087036f, + 0.996094f, 0.081909f, 0.996582f, 0.076965f, 0.996582f, 0.072388f, 0.997070f, 0.067993f, + 0.997559f, 0.063904f, 0.997559f, 0.059967f, 0.998047f, 0.056152f, 0.999023f, 0.052460f, + 0.999512f, 0.048828f, 0.999512f, 0.045593f, 0.999512f, 0.042603f, 0.999512f, 0.039795f, + 0.999512f, 0.037109f, 0.999512f, 0.034576f, 0.999512f, 0.032196f, 0.999512f, 0.029907f, + 0.999512f, 0.027740f, 0.999512f, 0.025665f, 0.999512f, 0.023697f, 0.999512f, 0.021820f, + 0.999512f, 0.020020f, 0.999512f, 0.018311f, 0.999512f, 0.016678f, 0.999512f, 0.015121f, + 0.999512f, 0.013634f, 0.999512f, 0.012222f, 0.999512f, 0.010872f, 0.999512f, 0.009590f, + 0.999512f, 0.008377f, 0.999512f, 0.007225f, 0.999512f, 0.006138f, 0.999512f, 0.005116f, + 0.999512f, 0.004162f, 0.999512f, 0.003277f, 0.999512f, 0.002466f, 0.999512f, 0.001737f, + 0.999512f, 0.001098f, 0.999512f, 0.000568f, 0.999512f, 0.000177f, 0.999512f, 0.000004f, + 0.000000f, 1.000000f, 0.921387f, 0.616211f, 0.958496f, 0.497314f, 0.972656f, 0.422852f, + 0.979004f, 0.369629f, 0.983887f, 0.327881f, 0.985840f, 0.294678f, 0.988770f, 0.266602f, + 0.989258f, 0.243286f, 0.990723f, 0.222778f, 0.991699f, 0.205078f, 0.993652f, 0.188599f, + 0.994141f, 0.174561f, 0.994141f, 0.161987f, 0.994629f, 0.150635f, 0.994629f, 0.140503f, + 0.995117f, 0.130981f, 0.995117f, 0.122498f, 0.995605f, 0.114502f, 0.995605f, 0.107239f, + 0.996094f, 0.100342f, 0.996094f, 0.094055f, 0.996582f, 0.088074f, 0.996582f, 0.082642f, + 0.997070f, 0.077332f, 0.997559f, 0.072388f, 0.998047f, 0.067749f, 0.998535f, 0.063293f, + 0.999512f, 0.058868f, 0.999512f, 0.054901f, 0.999512f, 0.051300f, 0.999512f, 0.047913f, + 0.999512f, 0.044739f, 0.999512f, 0.041718f, 0.999512f, 0.038910f, 0.999512f, 0.036224f, + 0.999512f, 0.033691f, 0.999512f, 0.031311f, 0.999512f, 0.029053f, 0.999512f, 0.026901f, + 0.999512f, 0.024857f, 0.999512f, 0.022903f, 0.999512f, 0.021072f, 0.999512f, 0.019318f, + 0.999512f, 0.017654f, 0.999512f, 0.016068f, 0.999512f, 0.014572f, 0.999512f, 0.013153f, + 0.999512f, 0.011803f, 0.999512f, 0.010521f, 0.999512f, 0.009308f, 0.999512f, 0.008171f, + 0.999512f, 0.007092f, 0.999512f, 0.006081f, 0.999512f, 0.005131f, 0.999512f, 0.004246f, + 0.999512f, 0.003428f, 0.999512f, 0.002676f, 0.999512f, 0.001995f, 0.999512f, 0.001390f, + 0.999512f, 0.000868f, 0.999512f, 0.000442f, 0.999512f, 0.000135f, 0.999512f, 0.000003f, + 0.000000f, 1.000000f, 0.929688f, 0.614746f, 0.962891f, 0.496338f, 0.975098f, 0.421875f, + 0.981934f, 0.367676f, 0.984863f, 0.326416f, 0.988281f, 0.291992f, 0.989258f, 0.264404f, + 0.990723f, 0.240601f, 0.992188f, 0.219849f, 0.993652f, 0.201294f, 0.994141f, 0.185425f, + 0.994141f, 0.171509f, 0.994629f, 0.158813f, 0.994629f, 0.147461f, 0.995117f, 0.136963f, + 0.995605f, 0.127563f, 0.995605f, 0.118896f, 0.996094f, 0.110840f, 0.996094f, 0.103516f, + 0.996582f, 0.096558f, 0.997070f, 0.090149f, 0.997559f, 0.084106f, 0.998047f, 0.078491f, + 0.998535f, 0.073120f, 0.999512f, 0.067871f, 0.999512f, 0.063232f, 0.999512f, 0.059021f, + 0.999512f, 0.055054f, 0.999512f, 0.051361f, 0.999512f, 0.047913f, 0.999512f, 0.044647f, + 0.999512f, 0.041565f, 0.999512f, 0.038696f, 0.999512f, 0.035950f, 0.999512f, 0.033386f, + 0.999512f, 0.030975f, 0.999512f, 0.028671f, 0.999512f, 0.026505f, 0.999512f, 0.024460f, + 0.999512f, 0.022522f, 0.999512f, 0.020676f, 0.999512f, 0.018936f, 0.999512f, 0.017303f, + 0.999512f, 0.015747f, 0.999512f, 0.014275f, 0.999512f, 0.012886f, 0.999512f, 0.011574f, + 0.999512f, 0.010338f, 0.999512f, 0.009171f, 0.999512f, 0.008072f, 0.999512f, 0.007046f, + 0.999512f, 0.006081f, 0.999512f, 0.005180f, 0.999512f, 0.004341f, 0.999512f, 0.003571f, + 0.999512f, 0.002859f, 0.999512f, 0.002214f, 0.999512f, 0.001636f, 0.999512f, 0.001127f, + 0.999512f, 0.000695f, 0.999512f, 0.000348f, 0.999512f, 0.000104f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.936035f, 0.614258f, 0.966797f, 0.495605f, 0.978027f, 0.420654f, + 0.983398f, 0.366699f, 0.987793f, 0.324219f, 0.989258f, 0.290527f, 0.990234f, 0.262451f, + 0.992676f, 0.238037f, 0.993652f, 0.216919f, 0.994141f, 0.198853f, 0.994141f, 0.183105f, + 0.994629f, 0.168823f, 0.995117f, 0.156006f, 0.995117f, 0.144653f, 0.995605f, 0.134033f, + 0.996094f, 0.124512f, 0.996582f, 0.115723f, 0.996582f, 0.107666f, 0.997070f, 0.100098f, + 0.997559f, 0.093140f, 0.998535f, 0.086487f, 0.999512f, 0.080139f, 0.999512f, 0.074463f, + 0.999512f, 0.069336f, 0.999512f, 0.064575f, 0.999512f, 0.060181f, 0.999512f, 0.056030f, + 0.999512f, 0.052185f, 0.999512f, 0.048584f, 0.999512f, 0.045197f, 0.999512f, 0.041992f, + 0.999512f, 0.039001f, 0.999512f, 0.036194f, 0.999512f, 0.033569f, 0.999512f, 0.031082f, + 0.999512f, 0.028732f, 0.999512f, 0.026520f, 0.999512f, 0.024429f, 0.999512f, 0.022461f, + 0.999512f, 0.020615f, 0.999512f, 0.018860f, 0.999512f, 0.017212f, 0.999512f, 0.015656f, + 0.999512f, 0.014198f, 0.999512f, 0.012817f, 0.999512f, 0.011520f, 0.999512f, 0.010307f, + 0.999512f, 0.009155f, 0.999512f, 0.008087f, 0.999512f, 0.007084f, 0.999512f, 0.006145f, + 0.999512f, 0.005276f, 0.999512f, 0.004467f, 0.999512f, 0.003723f, 0.999512f, 0.003038f, + 0.999512f, 0.002415f, 0.999512f, 0.001856f, 0.999512f, 0.001358f, 0.999512f, 0.000926f, + 0.999512f, 0.000564f, 0.999512f, 0.000278f, 0.999512f, 0.000081f, 0.999512f, 0.000002f, + 0.000000f, 1.000000f, 0.942383f, 0.613281f, 0.970703f, 0.494385f, 0.980957f, 0.419678f, + 0.985840f, 0.365479f, 0.988770f, 0.322998f, 0.990234f, 0.289062f, 0.992676f, 0.260010f, + 0.993652f, 0.235718f, 0.994141f, 0.214966f, 0.994629f, 0.196899f, 0.994629f, 0.180908f, + 0.995117f, 0.166504f, 0.995605f, 0.153564f, 0.996094f, 0.141968f, 0.996094f, 0.131470f, + 0.996582f, 0.121826f, 0.997070f, 0.112915f, 0.998047f, 0.104553f, 0.999023f, 0.096741f, + 0.999512f, 0.089478f, 0.999512f, 0.083069f, 0.999512f, 0.077209f, 0.999512f, 0.071777f, + 0.999512f, 0.066711f, 0.999512f, 0.062073f, 0.999512f, 0.057709f, 0.999512f, 0.053650f, + 0.999512f, 0.049835f, 0.999512f, 0.046295f, 0.999512f, 0.042969f, 0.999512f, 0.039856f, + 0.999512f, 0.036926f, 0.999512f, 0.034180f, 0.999512f, 0.031586f, 0.999512f, 0.029175f, + 0.999512f, 0.026886f, 0.999512f, 0.024750f, 0.999512f, 0.022736f, 0.999512f, 0.020844f, + 0.999512f, 0.019058f, 0.999512f, 0.017380f, 0.999512f, 0.015808f, 0.999512f, 0.014328f, + 0.999512f, 0.012939f, 0.999512f, 0.011642f, 0.999512f, 0.010422f, 0.999512f, 0.009277f, + 0.999512f, 0.008209f, 0.999512f, 0.007214f, 0.999512f, 0.006290f, 0.999512f, 0.005428f, + 0.999512f, 0.004635f, 0.999512f, 0.003902f, 0.999512f, 0.003231f, 0.999512f, 0.002619f, + 0.999512f, 0.002068f, 0.999512f, 0.001575f, 0.999512f, 0.001143f, 0.999512f, 0.000772f, + 0.999512f, 0.000464f, 0.999512f, 0.000226f, 0.999512f, 0.000065f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.947266f, 0.612793f, 0.973633f, 0.494141f, 0.982422f, 0.418945f, + 0.987793f, 0.364014f, 0.989258f, 0.322266f, 0.992188f, 0.287354f, 0.993652f, 0.258301f, + 0.994141f, 0.234375f, 0.994141f, 0.213501f, 0.994629f, 0.195190f, 0.995117f, 0.178955f, + 0.995605f, 0.164551f, 0.996094f, 0.151489f, 0.996582f, 0.139771f, 0.997070f, 0.129028f, + 0.998047f, 0.119080f, 0.999512f, 0.109741f, 0.999512f, 0.101379f, 0.999512f, 0.093872f, + 0.999512f, 0.087036f, 0.999512f, 0.080811f, 0.999512f, 0.074951f, 0.999512f, 0.069580f, + 0.999512f, 0.064636f, 0.999512f, 0.059998f, 0.999512f, 0.055695f, 0.999512f, 0.051666f, + 0.999512f, 0.047913f, 0.999512f, 0.044403f, 0.999512f, 0.041107f, 0.999512f, 0.038055f, + 0.999512f, 0.035187f, 0.999512f, 0.032471f, 0.999512f, 0.029968f, 0.999512f, 0.027588f, + 0.999512f, 0.025375f, 0.999512f, 0.023285f, 0.999512f, 0.021332f, 0.999512f, 0.019501f, + 0.999512f, 0.017776f, 0.999512f, 0.016159f, 0.999512f, 0.014656f, 0.999512f, 0.013237f, + 0.999512f, 0.011917f, 0.999512f, 0.010674f, 0.999512f, 0.009521f, 0.999512f, 0.008446f, + 0.999512f, 0.007442f, 0.999512f, 0.006512f, 0.999512f, 0.005650f, 0.999512f, 0.004852f, + 0.999512f, 0.004120f, 0.999512f, 0.003450f, 0.999512f, 0.002840f, 0.999512f, 0.002287f, + 0.999512f, 0.001793f, 0.999512f, 0.001355f, 0.999512f, 0.000975f, 0.999512f, 0.000652f, + 0.999512f, 0.000388f, 0.999512f, 0.000186f, 0.999512f, 0.000052f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.951660f, 0.612305f, 0.976074f, 0.493652f, 0.983887f, 0.418457f, + 0.988281f, 0.363525f, 0.990723f, 0.321045f, 0.993164f, 0.285889f, 0.993652f, 0.257324f, + 0.994141f, 0.233154f, 0.994629f, 0.212158f, 0.995117f, 0.193726f, 0.995605f, 0.177368f, + 0.996582f, 0.162720f, 0.997070f, 0.149414f, 0.997559f, 0.137573f, 0.999023f, 0.126343f, + 0.999512f, 0.116272f, 0.999512f, 0.107422f, 0.999512f, 0.099365f, 0.999512f, 0.091980f, + 0.999512f, 0.085205f, 0.999512f, 0.078979f, 0.999512f, 0.073181f, 0.999512f, 0.067810f, + 0.999512f, 0.062866f, 0.999512f, 0.058289f, 0.999512f, 0.054016f, 0.999512f, 0.050018f, + 0.999512f, 0.046295f, 0.999512f, 0.042847f, 0.999512f, 0.039612f, 0.999512f, 0.036560f, + 0.999512f, 0.033722f, 0.999512f, 0.031097f, 0.999512f, 0.028610f, 0.999512f, 0.026291f, + 0.999512f, 0.024109f, 0.999512f, 0.022079f, 0.999512f, 0.020172f, 0.999512f, 0.018387f, + 0.999512f, 0.016724f, 0.999512f, 0.015167f, 0.999512f, 0.013710f, 0.999512f, 0.012344f, + 0.999512f, 0.011078f, 0.999512f, 0.009895f, 0.999512f, 0.008789f, 0.999512f, 0.007771f, + 0.999512f, 0.006821f, 0.999512f, 0.005943f, 0.999512f, 0.005135f, 0.999512f, 0.004391f, + 0.999512f, 0.003710f, 0.999512f, 0.003090f, 0.999512f, 0.002529f, 0.999512f, 0.002024f, + 0.999512f, 0.001576f, 0.999512f, 0.001183f, 0.999512f, 0.000844f, 0.999512f, 0.000559f, + 0.999512f, 0.000329f, 0.999512f, 0.000155f, 0.999512f, 0.000043f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.955078f, 0.612305f, 0.978516f, 0.493164f, 0.986816f, 0.417480f, + 0.989258f, 0.363037f, 0.992676f, 0.319580f, 0.993652f, 0.285156f, 0.994141f, 0.256348f, + 0.994629f, 0.232056f, 0.995117f, 0.210938f, 0.996094f, 0.192261f, 0.996582f, 0.175659f, + 0.997070f, 0.160889f, 0.998535f, 0.147339f, 0.999512f, 0.134888f, 0.999512f, 0.124268f, + 0.999512f, 0.114563f, 0.999512f, 0.105774f, 0.999512f, 0.097778f, 0.999512f, 0.090454f, + 0.999512f, 0.083679f, 0.999512f, 0.077454f, 0.999512f, 0.071716f, 0.999512f, 0.066406f, + 0.999512f, 0.061462f, 0.999512f, 0.056885f, 0.999512f, 0.052612f, 0.999512f, 0.048676f, + 0.999512f, 0.044983f, 0.999512f, 0.041534f, 0.999512f, 0.038330f, 0.999512f, 0.035339f, + 0.999512f, 0.032532f, 0.999512f, 0.029938f, 0.999512f, 0.027496f, 0.999512f, 0.025208f, + 0.999512f, 0.023087f, 0.999512f, 0.021088f, 0.999512f, 0.019226f, 0.999512f, 0.017487f, + 0.999512f, 0.015854f, 0.999512f, 0.014351f, 0.999512f, 0.012932f, 0.999512f, 0.011620f, + 0.999512f, 0.010391f, 0.999512f, 0.009254f, 0.999512f, 0.008194f, 0.999512f, 0.007221f, + 0.999512f, 0.006317f, 0.999512f, 0.005486f, 0.999512f, 0.004719f, 0.999512f, 0.004017f, + 0.999512f, 0.003380f, 0.999512f, 0.002802f, 0.999512f, 0.002281f, 0.999512f, 0.001817f, + 0.999512f, 0.001406f, 0.999512f, 0.001047f, 0.999512f, 0.000741f, 0.999512f, 0.000487f, + 0.999512f, 0.000283f, 0.999512f, 0.000132f, 0.999512f, 0.000036f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.958496f, 0.612305f, 0.979980f, 0.492920f, 0.987305f, 0.417236f, + 0.990723f, 0.362305f, 0.993164f, 0.319092f, 0.993652f, 0.284668f, 0.994629f, 0.255615f, + 0.995117f, 0.231079f, 0.996094f, 0.209717f, 0.996582f, 0.190918f, 0.997559f, 0.174072f, + 0.999512f, 0.158569f, 0.999512f, 0.145264f, 0.999512f, 0.133545f, 0.999512f, 0.122925f, + 0.999512f, 0.113281f, 0.999512f, 0.104492f, 0.999512f, 0.096497f, 0.999512f, 0.089172f, + 0.999512f, 0.082397f, 0.999512f, 0.076233f, 0.999512f, 0.070496f, 0.999512f, 0.065186f, + 0.999512f, 0.060272f, 0.999512f, 0.055695f, 0.999512f, 0.051483f, 0.999512f, 0.047546f, + 0.999512f, 0.043884f, 0.999512f, 0.040466f, 0.999512f, 0.037292f, 0.999512f, 0.034332f, + 0.999512f, 0.031555f, 0.999512f, 0.028976f, 0.999512f, 0.026581f, 0.999512f, 0.024323f, + 0.999512f, 0.022232f, 0.999512f, 0.020279f, 0.999512f, 0.018448f, 0.999512f, 0.016739f, + 0.999512f, 0.015160f, 0.999512f, 0.013680f, 0.999512f, 0.012306f, 0.999512f, 0.011024f, + 0.999512f, 0.009834f, 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006779f, + 0.999512f, 0.005913f, 0.999512f, 0.005116f, 0.999512f, 0.004387f, 0.999512f, 0.003721f, + 0.999512f, 0.003119f, 0.999512f, 0.002573f, 0.999512f, 0.002085f, 0.999512f, 0.001652f, + 0.999512f, 0.001270f, 0.999512f, 0.000941f, 0.999512f, 0.000661f, 0.999512f, 0.000430f, + 0.999512f, 0.000248f, 0.999512f, 0.000114f, 0.999512f, 0.000030f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.961914f, 0.611816f, 0.981934f, 0.492676f, 0.988281f, 0.417236f, + 0.992188f, 0.361328f, 0.993164f, 0.318848f, 0.994141f, 0.283936f, 0.995117f, 0.254883f, + 0.995605f, 0.230225f, 0.996582f, 0.208496f, 0.998047f, 0.189331f, 0.999512f, 0.171997f, + 0.999512f, 0.157227f, 0.999512f, 0.144165f, 0.999512f, 0.132446f, 0.999512f, 0.121826f, + 0.999512f, 0.112244f, 0.999512f, 0.103455f, 0.999512f, 0.095459f, 0.999512f, 0.088135f, + 0.999512f, 0.081421f, 0.999512f, 0.075195f, 0.999512f, 0.069458f, 0.999512f, 0.064148f, + 0.999512f, 0.059296f, 0.999512f, 0.054749f, 0.999512f, 0.050537f, 0.999512f, 0.046600f, + 0.999512f, 0.042969f, 0.999512f, 0.039581f, 0.999512f, 0.036438f, 0.999512f, 0.033478f, + 0.999512f, 0.030746f, 0.999512f, 0.028198f, 0.999512f, 0.025818f, 0.999512f, 0.023605f, + 0.999512f, 0.021530f, 0.999512f, 0.019608f, 0.999512f, 0.017807f, 0.999512f, 0.016129f, + 0.999512f, 0.014580f, 0.999512f, 0.013138f, 0.999512f, 0.011787f, 0.999512f, 0.010544f, + 0.999512f, 0.009384f, 0.999512f, 0.008316f, 0.999512f, 0.007332f, 0.999512f, 0.006420f, + 0.999512f, 0.005585f, 0.999512f, 0.004818f, 0.999512f, 0.004120f, 0.999512f, 0.003483f, + 0.999512f, 0.002909f, 0.999512f, 0.002392f, 0.999512f, 0.001929f, 0.999512f, 0.001521f, + 0.999512f, 0.001164f, 0.999512f, 0.000858f, 0.999512f, 0.000599f, 0.999512f, 0.000387f, + 0.999512f, 0.000221f, 0.999512f, 0.000101f, 0.999512f, 0.000026f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.964355f, 0.611816f, 0.984863f, 0.491699f, 0.989258f, 0.416748f, + 0.992676f, 0.361084f, 0.993652f, 0.318359f, 0.994629f, 0.283447f, 0.995605f, 0.254150f, + 0.996582f, 0.229126f, 0.998047f, 0.207153f, 0.999512f, 0.187500f, 0.999512f, 0.171021f, + 0.999512f, 0.156372f, 0.999512f, 0.143311f, 0.999512f, 0.131592f, 0.999512f, 0.120972f, + 0.999512f, 0.111389f, 0.999512f, 0.102600f, 0.999512f, 0.094604f, 0.999512f, 0.087280f, + 0.999512f, 0.080566f, 0.999512f, 0.074341f, 0.999512f, 0.068604f, 0.999512f, 0.063354f, + 0.999512f, 0.058472f, 0.999512f, 0.053955f, 0.999512f, 0.049744f, 0.999512f, 0.045837f, + 0.999512f, 0.042236f, 0.999512f, 0.038849f, 0.999512f, 0.035706f, 0.999512f, 0.032806f, + 0.999512f, 0.030090f, 0.999512f, 0.027557f, 0.999512f, 0.025208f, 0.999512f, 0.023010f, + 0.999512f, 0.020966f, 0.999512f, 0.019058f, 0.999512f, 0.017288f, 0.999512f, 0.015640f, + 0.999512f, 0.014114f, 0.999512f, 0.012695f, 0.999512f, 0.011375f, 0.999512f, 0.010155f, + 0.999512f, 0.009026f, 0.999512f, 0.007980f, 0.999512f, 0.007019f, 0.999512f, 0.006134f, + 0.999512f, 0.005325f, 0.999512f, 0.004581f, 0.999512f, 0.003906f, 0.999512f, 0.003296f, + 0.999512f, 0.002743f, 0.999512f, 0.002247f, 0.999512f, 0.001807f, 0.999512f, 0.001419f, + 0.999512f, 0.001081f, 0.999512f, 0.000793f, 0.999512f, 0.000550f, 0.999512f, 0.000353f, + 0.999512f, 0.000200f, 0.999512f, 0.000090f, 0.999512f, 0.000023f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.967285f, 0.611328f, 0.985352f, 0.491943f, 0.991699f, 0.415527f, + 0.993164f, 0.360840f, 0.994141f, 0.317871f, 0.995117f, 0.282959f, 0.996582f, 0.253418f, + 0.998047f, 0.227905f, 0.999512f, 0.205444f, 0.999512f, 0.186768f, 0.999512f, 0.170288f, + 0.999512f, 0.155640f, 0.999512f, 0.142578f, 0.999512f, 0.130859f, 0.999512f, 0.120300f, + 0.999512f, 0.110718f, 0.999512f, 0.101929f, 0.999512f, 0.093933f, 0.999512f, 0.086609f, + 0.999512f, 0.079834f, 0.999512f, 0.073669f, 0.999512f, 0.067932f, 0.999512f, 0.062683f, + 0.999512f, 0.057800f, 0.999512f, 0.053284f, 0.999512f, 0.049103f, 0.999512f, 0.045227f, + 0.999512f, 0.041626f, 0.999512f, 0.038269f, 0.999512f, 0.035156f, 0.999512f, 0.032257f, + 0.999512f, 0.029556f, 0.999512f, 0.027039f, 0.999512f, 0.024704f, 0.999512f, 0.022537f, + 0.999512f, 0.020508f, 0.999512f, 0.018631f, 0.999512f, 0.016876f, 0.999512f, 0.015251f, + 0.999512f, 0.013748f, 0.999512f, 0.012344f, 0.999512f, 0.011047f, 0.999512f, 0.009850f, + 0.999512f, 0.008736f, 0.999512f, 0.007717f, 0.999512f, 0.006775f, 0.999512f, 0.005909f, + 0.999512f, 0.005119f, 0.999512f, 0.004395f, 0.999512f, 0.003740f, 0.999512f, 0.003147f, + 0.999512f, 0.002613f, 0.999512f, 0.002136f, 0.999512f, 0.001712f, 0.999512f, 0.001340f, + 0.999512f, 0.001018f, 0.999512f, 0.000743f, 0.999512f, 0.000514f, 0.999512f, 0.000328f, + 0.999512f, 0.000184f, 0.999512f, 0.000082f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.969238f, 0.611328f, 0.985840f, 0.491943f, 0.991699f, 0.415527f, + 0.993164f, 0.360840f, 0.994629f, 0.317627f, 0.996094f, 0.282227f, 0.997559f, 0.252197f, + 0.999512f, 0.226318f, 0.999512f, 0.204956f, 0.999512f, 0.186279f, 0.999512f, 0.169800f, + 0.999512f, 0.155151f, 0.999512f, 0.142090f, 0.999512f, 0.130371f, 0.999512f, 0.119751f, + 0.999512f, 0.110107f, 0.999512f, 0.101379f, 0.999512f, 0.093384f, 0.999512f, 0.085999f, + 0.999512f, 0.079285f, 0.999512f, 0.073120f, 0.999512f, 0.067383f, 0.999512f, 0.062164f, + 0.999512f, 0.057281f, 0.999512f, 0.052765f, 0.999512f, 0.048615f, 0.999512f, 0.044739f, + 0.999512f, 0.041138f, 0.999512f, 0.037781f, 0.999512f, 0.034698f, 0.999512f, 0.031799f, + 0.999512f, 0.029129f, 0.999512f, 0.026627f, 0.999512f, 0.024307f, 0.999512f, 0.022156f, + 0.999512f, 0.020142f, 0.999512f, 0.018280f, 0.999512f, 0.016556f, 0.999512f, 0.014946f, + 0.999512f, 0.013451f, 0.999512f, 0.012070f, 0.999512f, 0.010788f, 0.999512f, 0.009605f, + 0.999512f, 0.008514f, 0.999512f, 0.007507f, 0.999512f, 0.006580f, 0.999512f, 0.005733f, + 0.999512f, 0.004959f, 0.999512f, 0.004253f, 0.999512f, 0.003613f, 0.999512f, 0.003033f, + 0.999512f, 0.002512f, 0.999512f, 0.002048f, 0.999512f, 0.001639f, 0.999512f, 0.001280f, + 0.999512f, 0.000969f, 0.999512f, 0.000705f, 0.999512f, 0.000485f, 0.999512f, 0.000308f, + 0.999512f, 0.000173f, 0.999512f, 0.000077f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.971680f, 0.610840f, 0.986816f, 0.491943f, 0.992188f, 0.415771f, + 0.993652f, 0.360596f, 0.995117f, 0.317139f, 0.997070f, 0.281250f, 0.999512f, 0.250732f, + 0.999512f, 0.225952f, 0.999512f, 0.204468f, 0.999512f, 0.185791f, 0.999512f, 0.169434f, + 0.999512f, 0.154785f, 0.999512f, 0.141724f, 0.999512f, 0.129883f, 0.999512f, 0.119324f, + 0.999512f, 0.109680f, 0.999512f, 0.100952f, 0.999512f, 0.092896f, 0.999512f, 0.085571f, + 0.999512f, 0.078857f, 0.999512f, 0.072693f, 0.999512f, 0.066956f, 0.999512f, 0.061737f, + 0.999512f, 0.056854f, 0.999512f, 0.052368f, 0.999512f, 0.048187f, 0.999512f, 0.044342f, + 0.999512f, 0.040741f, 0.999512f, 0.037415f, 0.999512f, 0.034332f, 0.999512f, 0.031464f, + 0.999512f, 0.028793f, 0.999512f, 0.026306f, 0.999512f, 0.024002f, 0.999512f, 0.021866f, + 0.999512f, 0.019867f, 0.999512f, 0.018021f, 0.999512f, 0.016296f, 0.999512f, 0.014702f, + 0.999512f, 0.013222f, 0.999512f, 0.011856f, 0.999512f, 0.010590f, 0.999512f, 0.009415f, + 0.999512f, 0.008339f, 0.999512f, 0.007347f, 0.999512f, 0.006435f, 0.999512f, 0.005600f, + 0.999512f, 0.004837f, 0.999512f, 0.004143f, 0.999512f, 0.003513f, 0.999512f, 0.002945f, + 0.999512f, 0.002438f, 0.999512f, 0.001984f, 0.999512f, 0.001584f, 0.999512f, 0.001234f, + 0.999512f, 0.000932f, 0.999512f, 0.000677f, 0.999512f, 0.000464f, 0.999512f, 0.000294f, + 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.973145f, 0.610840f, 0.989258f, 0.490723f, 0.992188f, 0.415771f, + 0.994141f, 0.360352f, 0.996094f, 0.316406f, 0.999512f, 0.279541f, 0.999512f, 0.250244f, + 0.999512f, 0.225586f, 0.999512f, 0.204224f, 0.999512f, 0.185547f, 0.999512f, 0.169067f, + 0.999512f, 0.154419f, 0.999512f, 0.141357f, 0.999512f, 0.129639f, 0.999512f, 0.119019f, + 0.999512f, 0.109375f, 0.999512f, 0.100586f, 0.999512f, 0.092590f, 0.999512f, 0.085266f, + 0.999512f, 0.078491f, 0.999512f, 0.072327f, 0.999512f, 0.066650f, 0.999512f, 0.061401f, + 0.999512f, 0.056549f, 0.999512f, 0.052063f, 0.999512f, 0.047882f, 0.999512f, 0.044037f, + 0.999512f, 0.040466f, 0.999512f, 0.037140f, 0.999512f, 0.034058f, 0.999512f, 0.031204f, + 0.999512f, 0.028549f, 0.999512f, 0.026062f, 0.999512f, 0.023773f, 0.999512f, 0.021637f, + 0.999512f, 0.019653f, 0.999512f, 0.017807f, 0.999512f, 0.016098f, 0.999512f, 0.014519f, + 0.999512f, 0.013054f, 0.999512f, 0.011696f, 0.999512f, 0.010437f, 0.999512f, 0.009277f, + 0.999512f, 0.008209f, 0.999512f, 0.007225f, 0.999512f, 0.006325f, 0.999512f, 0.005497f, + 0.999512f, 0.004745f, 0.999512f, 0.004059f, 0.999512f, 0.003441f, 0.999512f, 0.002882f, + 0.999512f, 0.002380f, 0.999512f, 0.001936f, 0.999512f, 0.001543f, 0.999512f, 0.001201f, + 0.999512f, 0.000906f, 0.999512f, 0.000656f, 0.999512f, 0.000449f, 0.999512f, 0.000284f, + 0.999512f, 0.000158f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.976074f, 0.609863f, 0.989258f, 0.490967f, 0.992676f, 0.415527f, + 0.995117f, 0.359619f, 0.999512f, 0.314697f, 0.999512f, 0.279297f, 0.999512f, 0.250244f, + 0.999512f, 0.225464f, 0.999512f, 0.203979f, 0.999512f, 0.185303f, 0.999512f, 0.168823f, + 0.999512f, 0.154175f, 0.999512f, 0.141113f, 0.999512f, 0.129395f, 0.999512f, 0.118713f, + 0.999512f, 0.109131f, 0.999512f, 0.100342f, 0.999512f, 0.092346f, 0.999512f, 0.085022f, + 0.999512f, 0.078247f, 0.999512f, 0.072083f, 0.999512f, 0.066406f, 0.999512f, 0.061157f, + 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047668f, 0.999512f, 0.043823f, + 0.999512f, 0.040253f, 0.999512f, 0.036926f, 0.999512f, 0.033875f, 0.999512f, 0.031006f, + 0.999512f, 0.028351f, 0.999512f, 0.025894f, 0.999512f, 0.023605f, 0.999512f, 0.021469f, + 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014389f, + 0.999512f, 0.012932f, 0.999512f, 0.011574f, 0.999512f, 0.010330f, 0.999512f, 0.009178f, + 0.999512f, 0.008118f, 0.999512f, 0.007141f, 0.999512f, 0.006245f, 0.999512f, 0.005428f, + 0.999512f, 0.004681f, 0.999512f, 0.004002f, 0.999512f, 0.003389f, 0.999512f, 0.002836f, + 0.999512f, 0.002342f, 0.999512f, 0.001903f, 0.999512f, 0.001515f, 0.999512f, 0.001178f, + 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000439f, 0.999512f, 0.000277f, + 0.999512f, 0.000153f, 0.999512f, 0.000067f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.977539f, 0.609863f, 0.989258f, 0.491211f, 0.993164f, 0.415283f, + 0.996582f, 0.358887f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225342f, 0.999512f, 0.203857f, 0.999512f, 0.185181f, 0.999512f, 0.168701f, + 0.999512f, 0.154053f, 0.999512f, 0.140991f, 0.999512f, 0.129150f, 0.999512f, 0.118591f, + 0.999512f, 0.108948f, 0.999512f, 0.100159f, 0.999512f, 0.092163f, 0.999512f, 0.084839f, + 0.999512f, 0.078125f, 0.999512f, 0.071899f, 0.999512f, 0.066223f, 0.999512f, 0.061005f, + 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047516f, 0.999512f, 0.043671f, + 0.999512f, 0.040100f, 0.999512f, 0.036804f, 0.999512f, 0.033722f, 0.999512f, 0.030884f, + 0.999512f, 0.028229f, 0.999512f, 0.025772f, 0.999512f, 0.023483f, 0.999512f, 0.021362f, + 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014305f, + 0.999512f, 0.012848f, 0.999512f, 0.011497f, 0.999512f, 0.010254f, 0.999512f, 0.009109f, + 0.999512f, 0.008057f, 0.999512f, 0.007084f, 0.999512f, 0.006195f, 0.999512f, 0.005379f, + 0.999512f, 0.004639f, 0.999512f, 0.003963f, 0.999512f, 0.003355f, 0.999512f, 0.002808f, + 0.999512f, 0.002316f, 0.999512f, 0.001881f, 0.999512f, 0.001497f, 0.999512f, 0.001163f, + 0.999512f, 0.000875f, 0.999512f, 0.000632f, 0.999512f, 0.000432f, 0.999512f, 0.000272f, + 0.999512f, 0.000151f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.978516f, 0.609863f, 0.988281f, 0.491699f, 0.994141f, 0.414795f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 0.999512f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 0.999512f, 0.168579f, + 0.999512f, 0.153931f, 0.999512f, 0.140869f, 0.999512f, 0.129028f, 0.999512f, 0.118469f, + 0.999512f, 0.108826f, 0.999512f, 0.100037f, 0.999512f, 0.092041f, 0.999512f, 0.084717f, + 0.999512f, 0.078003f, 0.999512f, 0.071838f, 0.999512f, 0.066101f, 0.999512f, 0.060883f, + 0.999512f, 0.056061f, 0.999512f, 0.051575f, 0.999512f, 0.047424f, 0.999512f, 0.043579f, + 0.999512f, 0.040009f, 0.999512f, 0.036713f, 0.999512f, 0.033661f, 0.999512f, 0.030807f, + 0.999512f, 0.028168f, 0.999512f, 0.025711f, 0.999512f, 0.023422f, 0.999512f, 0.021301f, + 0.999512f, 0.019333f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f, + 0.999512f, 0.012802f, 0.999512f, 0.011459f, 0.999512f, 0.010216f, 0.999512f, 0.009071f, + 0.999512f, 0.008018f, 0.999512f, 0.007053f, 0.999512f, 0.006165f, 0.999512f, 0.005352f, + 0.999512f, 0.004616f, 0.999512f, 0.003944f, 0.999512f, 0.003336f, 0.999512f, 0.002790f, + 0.999512f, 0.002302f, 0.999512f, 0.001868f, 0.999512f, 0.001487f, 0.999512f, 0.001154f, + 0.999512f, 0.000868f, 0.999512f, 0.000627f, 0.999512f, 0.000428f, 0.999512f, 0.000270f, + 0.999512f, 0.000149f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.980957f, 0.608398f, 0.983887f, 0.494385f, 0.999512f, 0.411377f, + 0.999512f, 0.356934f, 0.999512f, 0.313965f, 0.999512f, 0.279053f, 0.999512f, 0.250000f, + 1.000000f, 0.225220f, 0.999512f, 0.203735f, 0.999512f, 0.185059f, 1.000000f, 0.168579f, + 1.000000f, 0.153931f, 1.000000f, 0.140747f, 1.000000f, 0.129028f, 1.000000f, 0.118408f, + 1.000000f, 0.108765f, 1.000000f, 0.099976f, 1.000000f, 0.091980f, 1.000000f, 0.084656f, + 1.000000f, 0.077942f, 1.000000f, 0.071777f, 1.000000f, 0.066101f, 1.000000f, 0.060852f, + 1.000000f, 0.056030f, 1.000000f, 0.051544f, 1.000000f, 0.047394f, 1.000000f, 0.043549f, + 1.000000f, 0.039978f, 1.000000f, 0.036682f, 1.000000f, 0.033630f, 1.000000f, 0.030777f, + 1.000000f, 0.028137f, 1.000000f, 0.025681f, 1.000000f, 0.023392f, 1.000000f, 0.021286f, + 1.000000f, 0.019318f, 1.000000f, 0.017487f, 1.000000f, 0.015793f, 1.000000f, 0.014236f, + 1.000000f, 0.012787f, 1.000000f, 0.011444f, 1.000000f, 0.010201f, 1.000000f, 0.009056f, + 1.000000f, 0.008003f, 1.000000f, 0.007042f, 1.000000f, 0.006153f, 1.000000f, 0.005344f, + 1.000000f, 0.004604f, 1.000000f, 0.003937f, 1.000000f, 0.003330f, 1.000000f, 0.002785f, + 1.000000f, 0.002296f, 1.000000f, 0.001864f, 1.000000f, 0.001483f, 1.000000f, 0.001151f, + 1.000000f, 0.000866f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.998535f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958008f, 0.000000f, 0.762695f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.958496f, 0.000000f, 0.762207f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, + 0.000000f, 0.985840f, 0.000000f, 0.979492f, 0.000000f, 0.958008f, 0.000004f, 0.761719f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.989746f, + 0.000000f, 0.986328f, 0.000000f, 0.979004f, 0.000000f, 0.957031f, 0.000018f, 0.760742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.989258f, + 0.000000f, 0.986328f, 0.000000f, 0.978516f, 0.000000f, 0.957031f, 0.000067f, 0.758789f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.989258f, + 0.000000f, 0.986328f, 0.000000f, 0.977539f, 0.000117f, 0.956055f, 0.000197f, 0.756348f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.991211f, 0.000000f, 0.988770f, + 0.000000f, 0.985352f, 0.000000f, 0.977051f, 0.000230f, 0.955078f, 0.000445f, 0.753418f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000396f, 0.976074f, 0.000321f, 0.953125f, 0.000923f, 0.750488f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000000f, 0.987793f, + 0.000358f, 0.983887f, 0.000641f, 0.975098f, 0.000618f, 0.951172f, 0.001679f, 0.746094f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000387f, 0.986816f, + 0.000991f, 0.982910f, 0.000816f, 0.974121f, 0.001087f, 0.949219f, 0.002859f, 0.741699f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, + 0.000000f, 0.994141f, 0.000006f, 0.992676f, 0.000530f, 0.989746f, 0.001236f, 0.986328f, + 0.001287f, 0.981934f, 0.000954f, 0.972168f, 0.001658f, 0.947266f, 0.004513f, 0.736816f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000205f, 0.993652f, 0.000805f, 0.992676f, 0.001437f, 0.989258f, 0.001783f, 0.985840f, + 0.001449f, 0.980957f, 0.001559f, 0.971191f, 0.002533f, 0.944336f, 0.006859f, 0.731445f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000081f, 0.995117f, 0.000594f, 0.993652f, + 0.001163f, 0.993164f, 0.001719f, 0.991699f, 0.002253f, 0.988281f, 0.001995f, 0.984375f, + 0.001696f, 0.979004f, 0.002380f, 0.969727f, 0.003784f, 0.940430f, 0.009933f, 0.725586f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000082f, 0.995605f, 0.000549f, 0.995117f, 0.001094f, 0.994141f, 0.001608f, 0.993164f, + 0.002090f, 0.992676f, 0.002542f, 0.990723f, 0.002600f, 0.988281f, 0.002073f, 0.983398f, + 0.002438f, 0.978027f, 0.003592f, 0.967773f, 0.005383f, 0.937012f, 0.013847f, 0.718750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000201f, 0.996094f, 0.000678f, 0.995605f, + 0.001168f, 0.995117f, 0.001616f, 0.994141f, 0.002028f, 0.993164f, 0.002453f, 0.992676f, + 0.002846f, 0.991211f, 0.003202f, 0.989746f, 0.003056f, 0.986816f, 0.003082f, 0.982422f, + 0.003553f, 0.975586f, 0.005165f, 0.964844f, 0.007755f, 0.932617f, 0.018951f, 0.711914f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000058f, 0.996094f, + 0.000488f, 0.996094f, 0.000952f, 0.996094f, 0.001387f, 0.995605f, 0.001765f, 0.995117f, + 0.002134f, 0.994141f, 0.002506f, 0.993164f, 0.002806f, 0.992676f, 0.003134f, 0.991699f, + 0.003462f, 0.990234f, 0.003700f, 0.989258f, 0.004452f, 0.985840f, 0.004211f, 0.980469f, + 0.005016f, 0.973633f, 0.007156f, 0.961426f, 0.010925f, 0.927734f, 0.025650f, 0.703613f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000059f, 0.996582f, 0.000468f, 0.996582f, 0.000903f, 0.996094f, 0.001275f, 0.996094f, + 0.001681f, 0.996094f, 0.002024f, 0.995605f, 0.002304f, 0.994629f, 0.002640f, 0.994141f, + 0.002855f, 0.993164f, 0.003193f, 0.992676f, 0.003401f, 0.992188f, 0.003712f, 0.990234f, + 0.004063f, 0.989258f, 0.005070f, 0.987305f, 0.006126f, 0.984375f, 0.005840f, 0.979004f, + 0.006832f, 0.971191f, 0.009766f, 0.958008f, 0.015457f, 0.922363f, 0.033997f, 0.695312f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000196f, 0.996582f, 0.000625f, 0.996582f, 0.001025f, 0.996582f, + 0.001363f, 0.996094f, 0.001736f, 0.996094f, 0.001995f, 0.996094f, 0.002314f, 0.995605f, + 0.002537f, 0.995117f, 0.002829f, 0.994629f, 0.002998f, 0.993652f, 0.003304f, 0.993164f, + 0.003460f, 0.992676f, 0.003752f, 0.991699f, 0.003918f, 0.990723f, 0.004654f, 0.989746f, + 0.005566f, 0.987793f, 0.006470f, 0.985840f, 0.007542f, 0.982910f, 0.007732f, 0.976562f, + 0.009079f, 0.968262f, 0.013046f, 0.953613f, 0.020752f, 0.915527f, 0.043671f, 0.686035f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000090f, 0.997070f, 0.000474f, 0.997070f, 0.000895f, 0.996582f, + 0.001283f, 0.996582f, 0.001553f, 0.996582f, 0.001886f, 0.996094f, 0.002098f, 0.996094f, + 0.002399f, 0.996094f, 0.002554f, 0.996094f, 0.002850f, 0.995117f, 0.003019f, 0.994629f, + 0.003233f, 0.994141f, 0.003452f, 0.993652f, 0.003563f, 0.993164f, 0.003841f, 0.992676f, + 0.003994f, 0.991699f, 0.004517f, 0.990234f, 0.005398f, 0.989746f, 0.006092f, 0.987793f, + 0.006924f, 0.986328f, 0.007996f, 0.983398f, 0.009567f, 0.979980f, 0.010490f, 0.974121f, + 0.012444f, 0.964355f, 0.017044f, 0.948730f, 0.027420f, 0.907715f, 0.054840f, 0.676270f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000119f, 0.997559f, 0.000519f, 0.997070f, 0.000944f, 0.997070f, + 0.001301f, 0.997070f, 0.001555f, 0.996582f, 0.001870f, 0.996582f, 0.002073f, 0.996582f, + 0.002321f, 0.996094f, 0.002539f, 0.996094f, 0.002649f, 0.996094f, 0.002943f, 0.995605f, + 0.003090f, 0.995117f, 0.003222f, 0.994629f, 0.003479f, 0.994141f, 0.003599f, 0.993652f, + 0.003733f, 0.993164f, 0.003975f, 0.992676f, 0.004086f, 0.992188f, 0.004692f, 0.991211f, + 0.005527f, 0.990234f, 0.006172f, 0.989258f, 0.006809f, 0.987793f, 0.007534f, 0.986328f, + 0.008774f, 0.983887f, 0.010117f, 0.981445f, 0.012115f, 0.977051f, 0.013428f, 0.970703f, + 0.016235f, 0.960449f, 0.022552f, 0.942383f, 0.035095f, 0.898438f, 0.067566f, 0.666016f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000310f, 0.997559f, 0.000725f, 0.997559f, 0.001081f, 0.997070f, + 0.001432f, 0.997070f, 0.001645f, 0.997070f, 0.001943f, 0.997070f, 0.002136f, 0.996582f, + 0.002308f, 0.996582f, 0.002567f, 0.996582f, 0.002684f, 0.996094f, 0.002874f, 0.996094f, + 0.003086f, 0.996094f, 0.003183f, 0.995605f, 0.003325f, 0.995117f, 0.003557f, 0.994629f, + 0.003660f, 0.994141f, 0.003712f, 0.993652f, 0.003983f, 0.993164f, 0.004116f, 0.993164f, + 0.004452f, 0.992676f, 0.005173f, 0.991211f, 0.005871f, 0.990723f, 0.006416f, 0.989746f, + 0.006897f, 0.988770f, 0.007572f, 0.987305f, 0.008537f, 0.985840f, 0.009705f, 0.983887f, + 0.011070f, 0.981445f, 0.012840f, 0.978027f, 0.015175f, 0.973633f, 0.017761f, 0.966797f, + 0.020950f, 0.955078f, 0.028900f, 0.935547f, 0.044983f, 0.888184f, 0.081360f, 0.654785f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000138f, 0.998047f, 0.000599f, 0.997559f, 0.001024f, 0.997559f, 0.001263f, 0.997559f, + 0.001619f, 0.997070f, 0.001754f, 0.997070f, 0.002087f, 0.997070f, 0.002228f, 0.997070f, + 0.002401f, 0.996582f, 0.002644f, 0.996582f, 0.002741f, 0.996582f, 0.002869f, 0.996582f, + 0.003120f, 0.996094f, 0.003220f, 0.996094f, 0.003269f, 0.995605f, 0.003521f, 0.995117f, + 0.003668f, 0.994629f, 0.003733f, 0.994629f, 0.003765f, 0.994141f, 0.004055f, 0.993652f, + 0.004169f, 0.993164f, 0.004597f, 0.993164f, 0.005142f, 0.992188f, 0.005901f, 0.991699f, + 0.006443f, 0.990723f, 0.006851f, 0.989746f, 0.007206f, 0.989258f, 0.007919f, 0.987793f, + 0.008850f, 0.986816f, 0.009880f, 0.984863f, 0.010818f, 0.983398f, 0.012459f, 0.980957f, + 0.013992f, 0.978027f, 0.016190f, 0.974609f, 0.019409f, 0.969727f, 0.023407f, 0.962402f, + 0.027603f, 0.948242f, 0.037109f, 0.926758f, 0.056854f, 0.875488f, 0.096924f, 0.643066f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000534f, 0.998047f, 0.000953f, 0.998047f, 0.001250f, 0.997559f, 0.001594f, 0.997559f, + 0.001774f, 0.997559f, 0.002012f, 0.997070f, 0.002235f, 0.997070f, 0.002312f, 0.997070f, + 0.002581f, 0.997070f, 0.002743f, 0.996582f, 0.002804f, 0.996582f, 0.002975f, 0.996582f, + 0.003197f, 0.996582f, 0.003273f, 0.996094f, 0.003309f, 0.996094f, 0.003540f, 0.995605f, + 0.003704f, 0.995117f, 0.003765f, 0.994629f, 0.003796f, 0.994629f, 0.003983f, 0.994141f, + 0.004169f, 0.993652f, 0.004555f, 0.993164f, 0.005089f, 0.993164f, 0.005577f, 0.992676f, + 0.006222f, 0.991699f, 0.006660f, 0.991211f, 0.007030f, 0.990234f, 0.007286f, 0.989746f, + 0.007843f, 0.989258f, 0.008766f, 0.987793f, 0.009682f, 0.986816f, 0.010422f, 0.985352f, + 0.011269f, 0.983887f, 0.012802f, 0.982422f, 0.014076f, 0.979980f, 0.015961f, 0.977051f, + 0.017990f, 0.974121f, 0.020966f, 0.969727f, 0.024612f, 0.964355f, 0.029800f, 0.955078f, + 0.035370f, 0.940430f, 0.047211f, 0.916016f, 0.071106f, 0.861328f, 0.113159f, 0.630859f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000287f, 0.998535f, + 0.000802f, 0.998047f, 0.001254f, 0.998047f, 0.001492f, 0.997559f, 0.001792f, 0.997559f, + 0.001864f, 0.997559f, 0.002239f, 0.997559f, 0.002335f, 0.997070f, 0.002436f, 0.997070f, + 0.002747f, 0.997070f, 0.002825f, 0.997070f, 0.002855f, 0.996582f, 0.003153f, 0.996582f, + 0.003283f, 0.996582f, 0.003326f, 0.996582f, 0.003345f, 0.996094f, 0.003639f, 0.995605f, + 0.003763f, 0.995117f, 0.003807f, 0.994629f, 0.003828f, 0.994629f, 0.003983f, 0.994141f, + 0.004292f, 0.994141f, 0.004826f, 0.993652f, 0.005314f, 0.993164f, 0.005756f, 0.993164f, + 0.006271f, 0.992188f, 0.006741f, 0.991699f, 0.007065f, 0.991211f, 0.007339f, 0.990723f, + 0.007534f, 0.989746f, 0.008324f, 0.989258f, 0.009163f, 0.988281f, 0.010002f, 0.987305f, + 0.010643f, 0.986816f, 0.011169f, 0.984863f, 0.012535f, 0.983887f, 0.013802f, 0.982422f, + 0.014900f, 0.980469f, 0.016663f, 0.978516f, 0.018265f, 0.975586f, 0.020844f, 0.972656f, + 0.023605f, 0.968262f, 0.027084f, 0.963867f, 0.031891f, 0.956543f, 0.038330f, 0.946777f, + 0.045868f, 0.930176f, 0.060303f, 0.903320f, 0.088989f, 0.844727f, 0.131714f, 0.618652f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000621f, 0.998535f, + 0.001072f, 0.998047f, 0.001372f, 0.998047f, 0.001758f, 0.998047f, 0.001880f, 0.997559f, + 0.002172f, 0.997559f, 0.002350f, 0.997559f, 0.002388f, 0.997559f, 0.002720f, 0.997070f, + 0.002842f, 0.997070f, 0.002872f, 0.997070f, 0.003027f, 0.996582f, 0.003290f, 0.996582f, + 0.003344f, 0.996582f, 0.003365f, 0.996582f, 0.003483f, 0.996094f, 0.003761f, 0.995605f, + 0.003822f, 0.995605f, 0.003843f, 0.994629f, 0.003855f, 0.994629f, 0.004311f, 0.994141f, + 0.004990f, 0.994141f, 0.005428f, 0.993652f, 0.005856f, 0.993164f, 0.006100f, 0.993164f, + 0.006607f, 0.992676f, 0.006943f, 0.991699f, 0.007343f, 0.991699f, 0.007496f, 0.991211f, + 0.007790f, 0.990234f, 0.008484f, 0.989746f, 0.009346f, 0.989258f, 0.010162f, 0.988281f, + 0.010765f, 0.987305f, 0.011093f, 0.986816f, 0.012093f, 0.985352f, 0.013084f, 0.984375f, + 0.014252f, 0.982910f, 0.015282f, 0.981445f, 0.016876f, 0.979980f, 0.017990f, 0.978027f, + 0.019806f, 0.975586f, 0.022079f, 0.973145f, 0.024582f, 0.970215f, 0.027435f, 0.966309f, + 0.030914f, 0.961426f, 0.035553f, 0.955566f, 0.041687f, 0.947266f, 0.050049f, 0.936035f, + 0.059875f, 0.917480f, 0.077820f, 0.887207f, 0.110535f, 0.825195f, 0.149780f, 0.604492f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000407f, 0.998535f, + 0.000981f, 0.998535f, 0.001412f, 0.998535f, 0.001839f, 0.998047f, 0.001915f, 0.998047f, + 0.002306f, 0.998047f, 0.002396f, 0.997559f, 0.002413f, 0.997559f, 0.002840f, 0.997559f, + 0.002886f, 0.997070f, 0.002899f, 0.997070f, 0.003267f, 0.997070f, 0.003359f, 0.996582f, + 0.003378f, 0.996582f, 0.003387f, 0.996094f, 0.003742f, 0.996094f, 0.003838f, 0.995605f, + 0.003860f, 0.995117f, 0.004036f, 0.994629f, 0.004555f, 0.994141f, 0.005417f, 0.994141f, + 0.005867f, 0.994141f, 0.006088f, 0.993652f, 0.006443f, 0.993652f, 0.006603f, 0.992676f, + 0.007149f, 0.992188f, 0.007484f, 0.991699f, 0.007591f, 0.991211f, 0.008156f, 0.990723f, + 0.008858f, 0.990234f, 0.009338f, 0.989746f, 0.010201f, 0.988770f, 0.010872f, 0.988281f, + 0.011177f, 0.987305f, 0.011848f, 0.986816f, 0.012886f, 0.985840f, 0.013748f, 0.984863f, + 0.014511f, 0.983887f, 0.015541f, 0.982422f, 0.017105f, 0.981445f, 0.018051f, 0.979980f, + 0.019440f, 0.978516f, 0.020950f, 0.976562f, 0.022736f, 0.974609f, 0.025009f, 0.972168f, + 0.027405f, 0.969238f, 0.029999f, 0.965820f, 0.033325f, 0.962402f, 0.036957f, 0.957520f, + 0.041565f, 0.951660f, 0.048035f, 0.944336f, 0.055511f, 0.935059f, 0.065552f, 0.921387f, + 0.078369f, 0.900879f, 0.099731f, 0.867676f, 0.136108f, 0.802734f, 0.169189f, 0.590820f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000622f, 0.999023f, 0.001336f, 0.998535f, 0.001448f, 0.998535f, 0.001925f, 0.998535f, + 0.002174f, 0.998047f, 0.002413f, 0.998047f, 0.002424f, 0.997559f, 0.002876f, 0.997559f, + 0.002905f, 0.997559f, 0.002913f, 0.997070f, 0.003349f, 0.997070f, 0.003387f, 0.997070f, + 0.003397f, 0.996582f, 0.003448f, 0.996094f, 0.003845f, 0.995605f, 0.004284f, 0.995117f, + 0.004864f, 0.995117f, 0.005184f, 0.994629f, 0.005962f, 0.994141f, 0.006187f, 0.993652f, + 0.006592f, 0.993652f, 0.006691f, 0.993164f, 0.007015f, 0.992676f, 0.007278f, 0.992188f, + 0.007660f, 0.991699f, 0.008560f, 0.991211f, 0.009201f, 0.990723f, 0.009651f, 0.990234f, + 0.010071f, 0.989746f, 0.010651f, 0.988770f, 0.011253f, 0.988281f, 0.012024f, 0.987793f, + 0.012939f, 0.986816f, 0.013718f, 0.986328f, 0.014351f, 0.985352f, 0.014923f, 0.984375f, + 0.015808f, 0.983398f, 0.017593f, 0.981934f, 0.018402f, 0.980957f, 0.019608f, 0.979492f, + 0.020889f, 0.978516f, 0.022232f, 0.977051f, 0.023972f, 0.975098f, 0.025543f, 0.973145f, + 0.027863f, 0.971680f, 0.029922f, 0.968750f, 0.032166f, 0.966309f, 0.035461f, 0.963379f, + 0.038208f, 0.959961f, 0.041809f, 0.955566f, 0.046082f, 0.950684f, 0.051605f, 0.944824f, + 0.057800f, 0.937988f, 0.065308f, 0.929199f, 0.074890f, 0.917969f, 0.087708f, 0.902344f, + 0.103943f, 0.879395f, 0.127808f, 0.843262f, 0.167114f, 0.776855f, 0.189941f, 0.576660f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000952f, 0.999023f, 0.001452f, 0.999023f, + 0.001934f, 0.998535f, 0.001946f, 0.998047f, 0.002428f, 0.998047f, 0.002434f, 0.997559f, + 0.002913f, 0.997559f, 0.002918f, 0.997559f, 0.003349f, 0.997070f, 0.003401f, 0.996582f, + 0.003405f, 0.996094f, 0.004257f, 0.995605f, 0.005157f, 0.995117f, 0.005558f, 0.994629f, + 0.005756f, 0.994629f, 0.006145f, 0.994141f, 0.006710f, 0.993652f, 0.007019f, 0.993164f, + 0.007206f, 0.992676f, 0.007500f, 0.992188f, 0.008469f, 0.991699f, 0.009399f, 0.991211f, + 0.009903f, 0.990723f, 0.010246f, 0.990234f, 0.010857f, 0.989258f, 0.011108f, 0.988770f, + 0.012054f, 0.988281f, 0.013046f, 0.987305f, 0.014084f, 0.986816f, 0.014648f, 0.985840f, + 0.015289f, 0.985352f, 0.016068f, 0.984375f, 0.017319f, 0.983398f, 0.018158f, 0.982422f, + 0.019470f, 0.981445f, 0.020798f, 0.979980f, 0.021881f, 0.979004f, 0.022995f, 0.977539f, + 0.024689f, 0.976074f, 0.025925f, 0.975098f, 0.027664f, 0.973145f, 0.029327f, 0.972168f, + 0.031372f, 0.969727f, 0.033081f, 0.967285f, 0.036224f, 0.965332f, 0.038635f, 0.962891f, + 0.041077f, 0.960449f, 0.043884f, 0.957031f, 0.047394f, 0.953613f, 0.051422f, 0.949707f, + 0.056061f, 0.945312f, 0.061127f, 0.939941f, 0.066956f, 0.934082f, 0.073730f, 0.926758f, + 0.081543f, 0.918457f, 0.091553f, 0.907715f, 0.103455f, 0.894531f, 0.119080f, 0.876953f, + 0.137817f, 0.851562f, 0.164062f, 0.812988f, 0.202881f, 0.747070f, 0.211182f, 0.562012f, + 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001929f, 0.998535f, 0.001950f, 0.998535f, + 0.002436f, 0.998047f, 0.002913f, 0.997559f, 0.002924f, 0.997559f, 0.003853f, 0.996582f, + 0.004753f, 0.996094f, 0.005226f, 0.995605f, 0.005798f, 0.995117f, 0.006279f, 0.994629f, + 0.006348f, 0.994141f, 0.006870f, 0.993652f, 0.008102f, 0.992676f, 0.009018f, 0.992188f, + 0.009567f, 0.991699f, 0.009888f, 0.990723f, 0.010857f, 0.989746f, 0.011917f, 0.989258f, + 0.012749f, 0.988770f, 0.013237f, 0.987793f, 0.014107f, 0.987305f, 0.014961f, 0.986328f, + 0.016220f, 0.985352f, 0.017273f, 0.984375f, 0.017990f, 0.983398f, 0.019302f, 0.982422f, + 0.020477f, 0.981445f, 0.021515f, 0.980469f, 0.022446f, 0.979492f, 0.024216f, 0.978516f, + 0.025452f, 0.977051f, 0.027023f, 0.975586f, 0.028717f, 0.974121f, 0.030289f, 0.973145f, + 0.031952f, 0.971680f, 0.033173f, 0.970215f, 0.034973f, 0.968262f, 0.037720f, 0.966309f, + 0.040070f, 0.964355f, 0.042511f, 0.962402f, 0.044647f, 0.959961f, 0.047485f, 0.958008f, + 0.050201f, 0.955078f, 0.053345f, 0.952148f, 0.056763f, 0.949219f, 0.060608f, 0.945801f, + 0.064514f, 0.941895f, 0.069336f, 0.937988f, 0.073914f, 0.933105f, 0.079529f, 0.928223f, + 0.085510f, 0.922363f, 0.092224f, 0.916016f, 0.100220f, 0.908203f, 0.109009f, 0.899414f, + 0.119141f, 0.889160f, 0.131104f, 0.876953f, 0.145752f, 0.861328f, 0.163086f, 0.841797f, + 0.184082f, 0.815430f, 0.209839f, 0.776367f, 0.244873f, 0.713867f, 0.232666f, 0.546875f, + 0.000000f, 1.000000f, 0.001464f, 0.999023f, 0.001952f, 0.998535f, 0.003386f, 0.997559f, + 0.004776f, 0.996582f, 0.005711f, 0.996094f, 0.005840f, 0.995117f, 0.007530f, 0.994141f, + 0.008636f, 0.993164f, 0.009453f, 0.992188f, 0.010834f, 0.991211f, 0.012413f, 0.989746f, + 0.013000f, 0.989258f, 0.014084f, 0.988281f, 0.016068f, 0.986816f, 0.017075f, 0.985840f, + 0.018051f, 0.984375f, 0.019699f, 0.983398f, 0.020798f, 0.982422f, 0.022858f, 0.980957f, + 0.024506f, 0.979492f, 0.025665f, 0.978516f, 0.027069f, 0.977539f, 0.028107f, 0.975586f, + 0.031128f, 0.974121f, 0.032806f, 0.973145f, 0.034576f, 0.971191f, 0.036438f, 0.969727f, + 0.038727f, 0.967773f, 0.040405f, 0.966309f, 0.043030f, 0.964355f, 0.044983f, 0.962402f, + 0.047729f, 0.960449f, 0.049713f, 0.958496f, 0.052612f, 0.956543f, 0.055695f, 0.954102f, + 0.058594f, 0.951660f, 0.061584f, 0.949219f, 0.064697f, 0.946777f, 0.068054f, 0.943848f, + 0.071899f, 0.940918f, 0.075439f, 0.937988f, 0.079346f, 0.934570f, 0.083557f, 0.931152f, + 0.088013f, 0.927734f, 0.093018f, 0.923340f, 0.097961f, 0.919434f, 0.103333f, 0.914551f, + 0.109436f, 0.909180f, 0.115845f, 0.903809f, 0.122314f, 0.897949f, 0.129639f, 0.891602f, + 0.137695f, 0.884277f, 0.146240f, 0.875977f, 0.155884f, 0.867188f, 0.166504f, 0.856934f, + 0.178589f, 0.844727f, 0.192139f, 0.831055f, 0.207153f, 0.814453f, 0.224731f, 0.794434f, + 0.244629f, 0.769043f, 0.266357f, 0.731934f, 0.291260f, 0.676758f, 0.255127f, 0.532227f, + 0.000000f, 1.000000f, 0.002438f, 0.998535f, 0.005825f, 0.996582f, 0.008965f, 0.994141f, + 0.011604f, 0.992188f, 0.013985f, 0.990234f, 0.016846f, 0.987793f, 0.019501f, 0.985352f, + 0.022583f, 0.983398f, 0.025314f, 0.980469f, 0.028046f, 0.978516f, 0.031204f, 0.976074f, + 0.033875f, 0.973633f, 0.037201f, 0.971680f, 0.039764f, 0.969238f, 0.043671f, 0.966309f, + 0.046661f, 0.964355f, 0.049591f, 0.961426f, 0.052917f, 0.958984f, 0.055847f, 0.956543f, + 0.059906f, 0.954102f, 0.063477f, 0.951172f, 0.067139f, 0.948730f, 0.070862f, 0.945801f, + 0.074463f, 0.943359f, 0.077759f, 0.940430f, 0.081787f, 0.937500f, 0.085693f, 0.935059f, + 0.089905f, 0.931641f, 0.094482f, 0.928711f, 0.098694f, 0.925781f, 0.103210f, 0.922363f, + 0.107605f, 0.918945f, 0.111816f, 0.916016f, 0.116577f, 0.912598f, 0.121155f, 0.909180f, + 0.125977f, 0.905273f, 0.130981f, 0.901367f, 0.136108f, 0.897949f, 0.141724f, 0.893555f, + 0.147461f, 0.889160f, 0.153198f, 0.884766f, 0.159302f, 0.880371f, 0.165039f, 0.875488f, + 0.171143f, 0.870605f, 0.177612f, 0.865234f, 0.184326f, 0.859863f, 0.191284f, 0.854004f, + 0.198242f, 0.848145f, 0.205688f, 0.841309f, 0.213379f, 0.834473f, 0.221558f, 0.827148f, + 0.230713f, 0.819336f, 0.239624f, 0.810547f, 0.249268f, 0.800781f, 0.259277f, 0.790527f, + 0.270020f, 0.778809f, 0.281250f, 0.765625f, 0.293213f, 0.750488f, 0.306396f, 0.732910f, + 0.320312f, 0.711426f, 0.332031f, 0.680664f, 0.342773f, 0.635742f, 0.278564f, 0.515137f, + 0.000000f, 1.000000f, 0.020798f, 0.990723f, 0.040283f, 0.977539f, 0.057739f, 0.964355f, + 0.075012f, 0.952148f, 0.089172f, 0.941406f, 0.103394f, 0.930664f, 0.115723f, 0.921387f, + 0.128052f, 0.912598f, 0.139526f, 0.903809f, 0.149780f, 0.896484f, 0.159302f, 0.889160f, + 0.168701f, 0.883301f, 0.177612f, 0.876465f, 0.187134f, 0.870605f, 0.195435f, 0.865234f, + 0.202759f, 0.859863f, 0.210083f, 0.854492f, 0.217041f, 0.850098f, 0.223633f, 0.845215f, + 0.229980f, 0.841309f, 0.236084f, 0.836914f, 0.243530f, 0.832520f, 0.250000f, 0.828125f, + 0.255859f, 0.824219f, 0.261475f, 0.820312f, 0.267090f, 0.816895f, 0.272461f, 0.812988f, + 0.277344f, 0.809570f, 0.282471f, 0.805664f, 0.287109f, 0.802246f, 0.291992f, 0.798828f, + 0.297119f, 0.795410f, 0.301514f, 0.791992f, 0.306152f, 0.788574f, 0.310547f, 0.785156f, + 0.314697f, 0.781738f, 0.318604f, 0.778320f, 0.323975f, 0.774414f, 0.328369f, 0.770996f, + 0.333008f, 0.767090f, 0.337158f, 0.763672f, 0.341309f, 0.759766f, 0.345215f, 0.755859f, + 0.349365f, 0.751465f, 0.353516f, 0.747559f, 0.357178f, 0.743652f, 0.361572f, 0.738770f, + 0.365723f, 0.734375f, 0.369629f, 0.729492f, 0.373047f, 0.724609f, 0.376953f, 0.719238f, + 0.380859f, 0.713867f, 0.384521f, 0.708008f, 0.387939f, 0.701660f, 0.391357f, 0.694824f, + 0.395020f, 0.687012f, 0.398438f, 0.678711f, 0.401367f, 0.668945f, 0.404541f, 0.657715f, + 0.407227f, 0.643555f, 0.406250f, 0.621582f, 0.398682f, 0.591309f, 0.302979f, 0.497314f, + 0.000000f, 1.000000f, 0.431641f, 0.809570f, 0.458984f, 0.751953f, 0.473389f, 0.719727f, + 0.483398f, 0.698730f, 0.491455f, 0.684082f, 0.496826f, 0.673340f, 0.500977f, 0.665527f, + 0.505859f, 0.659180f, 0.509277f, 0.654297f, 0.513184f, 0.649902f, 0.516602f, 0.646484f, + 0.520020f, 0.643555f, 0.523926f, 0.640625f, 0.525879f, 0.638184f, 0.527344f, 0.636230f, + 0.530762f, 0.634277f, 0.532715f, 0.632812f, 0.535156f, 0.630859f, 0.536621f, 0.629395f, + 0.539062f, 0.627930f, 0.541016f, 0.626465f, 0.542480f, 0.625000f, 0.544434f, 0.623535f, + 0.546875f, 0.622070f, 0.548340f, 0.620605f, 0.550293f, 0.619141f, 0.552734f, 0.617676f, + 0.554688f, 0.615723f, 0.556641f, 0.614258f, 0.558594f, 0.612305f, 0.561035f, 0.610840f, + 0.562012f, 0.608887f, 0.563965f, 0.606934f, 0.564941f, 0.604980f, 0.566406f, 0.603027f, + 0.568848f, 0.601074f, 0.570801f, 0.598633f, 0.572266f, 0.596191f, 0.574219f, 0.593750f, + 0.576172f, 0.591309f, 0.578125f, 0.588379f, 0.580566f, 0.585449f, 0.582031f, 0.582520f, + 0.583496f, 0.579102f, 0.585449f, 0.575684f, 0.587402f, 0.572266f, 0.589844f, 0.568359f, + 0.590820f, 0.564453f, 0.593750f, 0.560059f, 0.595215f, 0.555176f, 0.597656f, 0.550293f, + 0.599609f, 0.544434f, 0.601074f, 0.538574f, 0.603516f, 0.532227f, 0.605957f, 0.524414f, + 0.608398f, 0.516113f, 0.610352f, 0.506836f, 0.612793f, 0.496094f, 0.614746f, 0.483154f, + 0.616699f, 0.467041f, 0.614258f, 0.444336f, 0.607910f, 0.410889f, 0.540039f, 0.323730f, + 0.000000f, 1.000000f, 0.456787f, 0.798828f, 0.495850f, 0.732422f, 0.516602f, 0.693848f, + 0.535645f, 0.665527f, 0.548340f, 0.645508f, 0.560059f, 0.629883f, 0.569824f, 0.617188f, + 0.579102f, 0.605957f, 0.585938f, 0.597168f, 0.594727f, 0.588867f, 0.601562f, 0.582031f, + 0.608887f, 0.575195f, 0.615723f, 0.568848f, 0.621094f, 0.563477f, 0.626953f, 0.558594f, + 0.632324f, 0.553711f, 0.638672f, 0.548828f, 0.643555f, 0.543945f, 0.649414f, 0.539551f, + 0.654785f, 0.535156f, 0.659180f, 0.530762f, 0.664551f, 0.526855f, 0.668945f, 0.522461f, + 0.672852f, 0.518555f, 0.678711f, 0.514160f, 0.682617f, 0.509766f, 0.687500f, 0.505371f, + 0.690918f, 0.501465f, 0.695801f, 0.497314f, 0.699707f, 0.492920f, 0.704102f, 0.488770f, + 0.708496f, 0.484131f, 0.712891f, 0.479736f, 0.716309f, 0.475098f, 0.721191f, 0.470215f, + 0.725098f, 0.465332f, 0.729004f, 0.460205f, 0.732910f, 0.455322f, 0.736328f, 0.450195f, + 0.740723f, 0.444580f, 0.745117f, 0.439209f, 0.748535f, 0.433350f, 0.752930f, 0.427490f, + 0.756836f, 0.421387f, 0.760254f, 0.415039f, 0.764160f, 0.408203f, 0.767090f, 0.401611f, + 0.772461f, 0.394043f, 0.775879f, 0.386475f, 0.779785f, 0.378418f, 0.784668f, 0.369629f, + 0.789551f, 0.360596f, 0.792969f, 0.350830f, 0.797852f, 0.340332f, 0.802246f, 0.329102f, + 0.806641f, 0.316895f, 0.810547f, 0.303467f, 0.815918f, 0.288330f, 0.820312f, 0.270996f, + 0.826172f, 0.250732f, 0.828125f, 0.224243f, 0.831055f, 0.187866f, 0.804688f, 0.119873f, + 0.000000f, 1.000000f, 0.481445f, 0.788574f, 0.530273f, 0.713867f, 0.561035f, 0.667480f, + 0.584473f, 0.633301f, 0.604492f, 0.607422f, 0.620117f, 0.586914f, 0.633301f, 0.569824f, + 0.646484f, 0.554688f, 0.657715f, 0.541992f, 0.667969f, 0.530273f, 0.679199f, 0.519531f, + 0.687500f, 0.509766f, 0.695801f, 0.500977f, 0.704590f, 0.492676f, 0.711914f, 0.484863f, + 0.720215f, 0.477295f, 0.727539f, 0.469971f, 0.734863f, 0.462891f, 0.741211f, 0.456299f, + 0.747559f, 0.449707f, 0.752930f, 0.443604f, 0.758301f, 0.437500f, 0.765625f, 0.430908f, + 0.770508f, 0.425049f, 0.775391f, 0.419189f, 0.781250f, 0.413086f, 0.785645f, 0.407227f, + 0.791016f, 0.401367f, 0.796387f, 0.395508f, 0.800293f, 0.389648f, 0.805664f, 0.383789f, + 0.810547f, 0.377686f, 0.813477f, 0.371826f, 0.817871f, 0.365967f, 0.822754f, 0.359863f, + 0.825684f, 0.354004f, 0.830078f, 0.347656f, 0.834961f, 0.341553f, 0.838379f, 0.335205f, + 0.842285f, 0.328613f, 0.845215f, 0.322266f, 0.849121f, 0.315674f, 0.853516f, 0.308594f, + 0.857910f, 0.301758f, 0.860840f, 0.294434f, 0.864258f, 0.287109f, 0.867676f, 0.279541f, + 0.871094f, 0.271729f, 0.874512f, 0.263428f, 0.877441f, 0.255127f, 0.880859f, 0.246460f, + 0.884277f, 0.237305f, 0.887207f, 0.227783f, 0.890625f, 0.217529f, 0.895508f, 0.206665f, + 0.897461f, 0.195190f, 0.901855f, 0.182739f, 0.904785f, 0.169189f, 0.908203f, 0.154419f, + 0.912109f, 0.137817f, 0.914551f, 0.118591f, 0.914551f, 0.090881f, 0.900879f, 0.050354f, + 0.000000f, 1.000000f, 0.506348f, 0.778320f, 0.566406f, 0.695312f, 0.603027f, 0.642090f, + 0.632812f, 0.602539f, 0.655273f, 0.571777f, 0.674805f, 0.546387f, 0.691406f, 0.525879f, + 0.705566f, 0.507324f, 0.721191f, 0.490967f, 0.730957f, 0.476807f, 0.743652f, 0.463623f, + 0.753906f, 0.451416f, 0.762695f, 0.440430f, 0.771484f, 0.429932f, 0.780273f, 0.420166f, + 0.789062f, 0.410645f, 0.795410f, 0.401855f, 0.802734f, 0.393555f, 0.809082f, 0.385498f, + 0.815430f, 0.377930f, 0.821777f, 0.370117f, 0.827637f, 0.362793f, 0.833008f, 0.355469f, + 0.837891f, 0.348633f, 0.842285f, 0.342041f, 0.847656f, 0.335205f, 0.852539f, 0.328613f, + 0.856934f, 0.322021f, 0.860352f, 0.315674f, 0.864258f, 0.309326f, 0.869141f, 0.302979f, + 0.872559f, 0.296631f, 0.876465f, 0.290283f, 0.880371f, 0.283936f, 0.882812f, 0.278076f, + 0.887207f, 0.271484f, 0.890137f, 0.265381f, 0.892578f, 0.259033f, 0.895020f, 0.252930f, + 0.899902f, 0.246338f, 0.901855f, 0.239990f, 0.904785f, 0.233643f, 0.908203f, 0.227051f, + 0.911133f, 0.220215f, 0.913086f, 0.213379f, 0.916016f, 0.206543f, 0.918457f, 0.199463f, + 0.919922f, 0.192383f, 0.923828f, 0.184937f, 0.924805f, 0.177612f, 0.928711f, 0.169678f, + 0.929688f, 0.161865f, 0.932617f, 0.153442f, 0.935059f, 0.144775f, 0.938477f, 0.135498f, + 0.939453f, 0.126221f, 0.941406f, 0.116333f, 0.943359f, 0.105835f, 0.944824f, 0.094849f, + 0.949219f, 0.081726f, 0.950195f, 0.067993f, 0.948730f, 0.049408f, 0.941406f, 0.025864f, + 0.000000f, 1.000000f, 0.531738f, 0.768066f, 0.601562f, 0.676758f, 0.642578f, 0.618652f, + 0.676758f, 0.573242f, 0.700684f, 0.539062f, 0.724121f, 0.509766f, 0.740723f, 0.486084f, + 0.755859f, 0.465088f, 0.770996f, 0.446289f, 0.783691f, 0.429932f, 0.794434f, 0.415039f, + 0.805664f, 0.401123f, 0.814941f, 0.388672f, 0.822754f, 0.376953f, 0.831055f, 0.365967f, + 0.838867f, 0.355713f, 0.844727f, 0.346191f, 0.852051f, 0.336914f, 0.857422f, 0.328369f, + 0.864258f, 0.319580f, 0.868164f, 0.311523f, 0.873047f, 0.303955f, 0.879395f, 0.296387f, + 0.881836f, 0.289307f, 0.885254f, 0.282471f, 0.891113f, 0.275391f, 0.895508f, 0.268311f, + 0.897949f, 0.261963f, 0.902344f, 0.255371f, 0.905273f, 0.249146f, 0.908691f, 0.242798f, + 0.911621f, 0.236816f, 0.914062f, 0.230713f, 0.916992f, 0.224854f, 0.919434f, 0.218872f, + 0.923828f, 0.212524f, 0.925781f, 0.206543f, 0.927734f, 0.200684f, 0.929688f, 0.194702f, + 0.932129f, 0.188965f, 0.934570f, 0.182983f, 0.935547f, 0.177246f, 0.937500f, 0.171509f, + 0.939941f, 0.165283f, 0.941406f, 0.159424f, 0.944336f, 0.153076f, 0.946289f, 0.146729f, + 0.947754f, 0.140503f, 0.948730f, 0.134399f, 0.950684f, 0.128174f, 0.952637f, 0.121277f, + 0.954102f, 0.114563f, 0.955566f, 0.107849f, 0.957031f, 0.100891f, 0.958984f, 0.093567f, + 0.960938f, 0.085754f, 0.961914f, 0.078064f, 0.963867f, 0.069824f, 0.965332f, 0.061340f, + 0.966309f, 0.052460f, 0.967773f, 0.042450f, 0.966797f, 0.029526f, 0.960938f, 0.013649f, + 0.000000f, 1.000000f, 0.557617f, 0.757324f, 0.634277f, 0.659668f, 0.678711f, 0.596191f, + 0.717285f, 0.546875f, 0.742676f, 0.508789f, 0.765625f, 0.477295f, 0.783203f, 0.451416f, + 0.799805f, 0.428223f, 0.812988f, 0.407959f, 0.824707f, 0.390381f, 0.835938f, 0.374023f, + 0.845215f, 0.359375f, 0.854004f, 0.345947f, 0.861328f, 0.333740f, 0.868652f, 0.322266f, + 0.875000f, 0.311279f, 0.881348f, 0.301270f, 0.886719f, 0.291748f, 0.892090f, 0.282959f, + 0.896484f, 0.274170f, 0.900879f, 0.266113f, 0.905762f, 0.258057f, 0.909180f, 0.250732f, + 0.913086f, 0.243408f, 0.916992f, 0.236328f, 0.919434f, 0.229614f, 0.922852f, 0.223022f, + 0.924805f, 0.216919f, 0.928223f, 0.210449f, 0.930176f, 0.204346f, 0.934082f, 0.198242f, + 0.935059f, 0.192505f, 0.937500f, 0.186768f, 0.939941f, 0.180908f, 0.941895f, 0.175537f, + 0.943848f, 0.170044f, 0.946777f, 0.164307f, 0.947754f, 0.158936f, 0.949219f, 0.153687f, + 0.950684f, 0.148560f, 0.953125f, 0.143066f, 0.955078f, 0.137695f, 0.957031f, 0.132324f, + 0.958008f, 0.127075f, 0.958984f, 0.121887f, 0.960449f, 0.116638f, 0.961914f, 0.111389f, + 0.962891f, 0.106018f, 0.963867f, 0.100647f, 0.965820f, 0.095093f, 0.967285f, 0.089600f, + 0.968262f, 0.084045f, 0.968750f, 0.078491f, 0.970215f, 0.072632f, 0.971680f, 0.066772f, + 0.972656f, 0.060760f, 0.973633f, 0.054718f, 0.974121f, 0.048645f, 0.975586f, 0.041931f, + 0.976562f, 0.035217f, 0.977539f, 0.028076f, 0.976562f, 0.020004f, 0.973145f, 0.009071f, + 0.000000f, 1.000000f, 0.581543f, 0.747559f, 0.664062f, 0.644043f, 0.713379f, 0.575684f, + 0.750488f, 0.523926f, 0.777832f, 0.482910f, 0.800293f, 0.449463f, 0.817383f, 0.421387f, + 0.832520f, 0.397217f, 0.845703f, 0.375977f, 0.857910f, 0.357178f, 0.866211f, 0.340332f, + 0.875000f, 0.325195f, 0.882324f, 0.311768f, 0.890137f, 0.298584f, 0.895996f, 0.286865f, + 0.901367f, 0.275879f, 0.906250f, 0.265869f, 0.911621f, 0.256104f, 0.916504f, 0.246948f, + 0.919922f, 0.238403f, 0.923828f, 0.230347f, 0.927246f, 0.222656f, 0.930176f, 0.215454f, + 0.934082f, 0.208008f, 0.936035f, 0.201294f, 0.939941f, 0.194580f, 0.940918f, 0.188354f, + 0.942383f, 0.182495f, 0.946289f, 0.176270f, 0.948242f, 0.170288f, 0.949219f, 0.164795f, + 0.951660f, 0.159302f, 0.953125f, 0.154053f, 0.955078f, 0.148682f, 0.957031f, 0.143433f, + 0.958008f, 0.138428f, 0.959473f, 0.133423f, 0.960938f, 0.128540f, 0.962402f, 0.123657f, + 0.963867f, 0.118896f, 0.965332f, 0.114075f, 0.966309f, 0.109375f, 0.967773f, 0.104614f, + 0.968262f, 0.100159f, 0.969727f, 0.095581f, 0.970703f, 0.090881f, 0.971680f, 0.086426f, + 0.973145f, 0.081848f, 0.974609f, 0.077026f, 0.975098f, 0.072388f, 0.975098f, 0.067932f, + 0.976074f, 0.063416f, 0.976562f, 0.058899f, 0.978516f, 0.054138f, 0.979492f, 0.049103f, + 0.980469f, 0.044312f, 0.979980f, 0.039673f, 0.980957f, 0.035004f, 0.982422f, 0.029785f, + 0.982422f, 0.024826f, 0.983398f, 0.019531f, 0.983887f, 0.014717f, 0.979980f, 0.005009f, + 0.000000f, 1.000000f, 0.604980f, 0.738770f, 0.693848f, 0.628906f, 0.744141f, 0.557617f, + 0.781738f, 0.502930f, 0.807129f, 0.460449f, 0.829590f, 0.425293f, 0.847168f, 0.396240f, + 0.861328f, 0.371338f, 0.872070f, 0.349365f, 0.881348f, 0.330322f, 0.891602f, 0.312744f, + 0.898926f, 0.297363f, 0.905273f, 0.283203f, 0.911133f, 0.270264f, 0.916504f, 0.258545f, + 0.921387f, 0.247559f, 0.926758f, 0.237183f, 0.929688f, 0.227783f, 0.933594f, 0.218750f, + 0.936523f, 0.210327f, 0.939941f, 0.202271f, 0.941895f, 0.194824f, 0.946289f, 0.187500f, + 0.947754f, 0.180420f, 0.950195f, 0.173828f, 0.952148f, 0.167603f, 0.953613f, 0.161621f, + 0.956055f, 0.155640f, 0.958008f, 0.149902f, 0.959473f, 0.144531f, 0.960938f, 0.139160f, + 0.962402f, 0.133911f, 0.963867f, 0.129028f, 0.965332f, 0.124146f, 0.966797f, 0.119568f, + 0.968262f, 0.114624f, 0.968750f, 0.110107f, 0.971191f, 0.105408f, 0.971191f, 0.101135f, + 0.971680f, 0.097046f, 0.973145f, 0.092896f, 0.974609f, 0.088501f, 0.976074f, 0.084290f, + 0.976074f, 0.080200f, 0.977051f, 0.076172f, 0.977539f, 0.072266f, 0.978516f, 0.068359f, + 0.979980f, 0.064209f, 0.979980f, 0.060425f, 0.980469f, 0.056519f, 0.980957f, 0.052734f, + 0.981445f, 0.048920f, 0.982910f, 0.044952f, 0.983887f, 0.040863f, 0.983887f, 0.037170f, + 0.984375f, 0.033447f, 0.985840f, 0.029572f, 0.985352f, 0.025757f, 0.985840f, 0.022049f, + 0.987793f, 0.017807f, 0.987305f, 0.014160f, 0.987793f, 0.010384f, 0.983887f, 0.003956f, + 0.000000f, 1.000000f, 0.628418f, 0.729492f, 0.720215f, 0.615723f, 0.771484f, 0.541016f, + 0.809570f, 0.484131f, 0.833496f, 0.440918f, 0.854492f, 0.404785f, 0.870117f, 0.375000f, + 0.882324f, 0.349609f, 0.893066f, 0.327393f, 0.902832f, 0.307617f, 0.910645f, 0.290283f, + 0.915527f, 0.274902f, 0.922852f, 0.260254f, 0.927246f, 0.247437f, 0.932617f, 0.235718f, + 0.936523f, 0.224854f, 0.941406f, 0.214111f, 0.942383f, 0.205078f, 0.946777f, 0.196167f, + 0.948730f, 0.187866f, 0.952148f, 0.179810f, 0.954102f, 0.172485f, 0.956543f, 0.165405f, + 0.958008f, 0.158813f, 0.960449f, 0.152466f, 0.962891f, 0.146118f, 0.963379f, 0.140381f, + 0.965820f, 0.134644f, 0.966797f, 0.129395f, 0.967285f, 0.124451f, 0.969238f, 0.119385f, + 0.971191f, 0.114319f, 0.971680f, 0.109619f, 0.972168f, 0.105225f, 0.973633f, 0.100891f, + 0.975098f, 0.096375f, 0.976074f, 0.092163f, 0.976074f, 0.088318f, 0.977051f, 0.084351f, + 0.978516f, 0.080322f, 0.979492f, 0.076294f, 0.979492f, 0.072632f, 0.980469f, 0.069031f, + 0.980957f, 0.065369f, 0.981445f, 0.061920f, 0.981445f, 0.058655f, 0.983398f, 0.055054f, + 0.984375f, 0.051270f, 0.984375f, 0.047974f, 0.984863f, 0.044708f, 0.984863f, 0.041626f, + 0.985840f, 0.038361f, 0.985840f, 0.035339f, 0.986816f, 0.032013f, 0.987793f, 0.028793f, + 0.988770f, 0.025299f, 0.988281f, 0.022339f, 0.988770f, 0.019379f, 0.989258f, 0.016373f, + 0.989746f, 0.013504f, 0.989746f, 0.010826f, 0.990234f, 0.007904f, 0.987793f, 0.002123f, + 0.000000f, 1.000000f, 0.649902f, 0.721191f, 0.745117f, 0.603027f, 0.796875f, 0.526367f, + 0.832031f, 0.468506f, 0.856934f, 0.423828f, 0.874023f, 0.387939f, 0.889648f, 0.356934f, + 0.900391f, 0.331543f, 0.909668f, 0.309082f, 0.917969f, 0.289307f, 0.925293f, 0.271484f, + 0.930664f, 0.256104f, 0.934082f, 0.242188f, 0.940430f, 0.228638f, 0.942871f, 0.217285f, + 0.947754f, 0.206055f, 0.950684f, 0.196045f, 0.952637f, 0.186768f, 0.956055f, 0.177856f, + 0.958496f, 0.169678f, 0.959961f, 0.161987f, 0.962891f, 0.154785f, 0.964844f, 0.147827f, + 0.965332f, 0.141479f, 0.967285f, 0.135132f, 0.968750f, 0.129395f, 0.971191f, 0.123596f, + 0.971680f, 0.118225f, 0.972168f, 0.113403f, 0.974609f, 0.108337f, 0.975586f, 0.103394f, + 0.975586f, 0.098999f, 0.977051f, 0.094543f, 0.977539f, 0.090393f, 0.979004f, 0.086182f, + 0.979492f, 0.082214f, 0.979980f, 0.078430f, 0.981445f, 0.074524f, 0.981934f, 0.070923f, + 0.981934f, 0.067505f, 0.983398f, 0.064026f, 0.983887f, 0.060547f, 0.984375f, 0.057251f, + 0.985352f, 0.053894f, 0.985352f, 0.050873f, 0.985840f, 0.047913f, 0.986328f, 0.044891f, + 0.986816f, 0.041962f, 0.987305f, 0.039124f, 0.988770f, 0.036102f, 0.989258f, 0.032959f, + 0.988770f, 0.030273f, 0.988770f, 0.027756f, 0.989258f, 0.025116f, 0.989258f, 0.022736f, + 0.990234f, 0.020004f, 0.990234f, 0.017654f, 0.990723f, 0.015228f, 0.991211f, 0.012878f, + 0.992188f, 0.010071f, 0.992676f, 0.007557f, 0.992676f, 0.005527f, 0.989746f, 0.002165f, + 0.000000f, 1.000000f, 0.671387f, 0.713379f, 0.768066f, 0.591797f, 0.817383f, 0.513672f, + 0.851562f, 0.455078f, 0.874023f, 0.409668f, 0.892578f, 0.372803f, 0.904297f, 0.342529f, + 0.914551f, 0.316406f, 0.922852f, 0.293945f, 0.931641f, 0.273682f, 0.934570f, 0.256836f, + 0.940918f, 0.240723f, 0.945312f, 0.226562f, 0.949219f, 0.213623f, 0.952637f, 0.201904f, + 0.956055f, 0.190918f, 0.958984f, 0.180908f, 0.960938f, 0.171753f, 0.962891f, 0.163208f, + 0.965820f, 0.154907f, 0.967285f, 0.147339f, 0.968750f, 0.140381f, 0.970703f, 0.133545f, + 0.972168f, 0.127197f, 0.973145f, 0.121338f, 0.974121f, 0.115601f, 0.975098f, 0.110229f, + 0.976562f, 0.105225f, 0.977539f, 0.100159f, 0.979004f, 0.095337f, 0.979492f, 0.090759f, + 0.979492f, 0.086731f, 0.980469f, 0.082703f, 0.981934f, 0.078491f, 0.982422f, 0.074646f, + 0.983887f, 0.070862f, 0.983887f, 0.067200f, 0.984375f, 0.063782f, 0.984863f, 0.060516f, + 0.984863f, 0.057465f, 0.985840f, 0.054230f, 0.986328f, 0.051208f, 0.986816f, 0.048218f, + 0.987305f, 0.045349f, 0.988281f, 0.042389f, 0.988770f, 0.039551f, 0.989258f, 0.036804f, + 0.989258f, 0.034302f, 0.989746f, 0.031799f, 0.989746f, 0.029480f, 0.990234f, 0.027191f, + 0.990723f, 0.024826f, 0.991211f, 0.022507f, 0.991211f, 0.020325f, 0.991699f, 0.018127f, + 0.992188f, 0.015945f, 0.993652f, 0.013298f, 0.993164f, 0.011261f, 0.993164f, 0.009483f, + 0.993652f, 0.007664f, 0.993652f, 0.006149f, 0.993652f, 0.004696f, 0.992676f, 0.002760f, + 0.000000f, 1.000000f, 0.692383f, 0.705566f, 0.788574f, 0.582031f, 0.835449f, 0.502930f, + 0.868652f, 0.443604f, 0.889160f, 0.397949f, 0.905273f, 0.360840f, 0.917969f, 0.329834f, + 0.925781f, 0.304199f, 0.934082f, 0.281250f, 0.940430f, 0.261230f, 0.945312f, 0.244019f, + 0.950195f, 0.227905f, 0.954590f, 0.213867f, 0.957520f, 0.201172f, 0.960938f, 0.189087f, + 0.962402f, 0.178589f, 0.964844f, 0.168823f, 0.967773f, 0.159180f, 0.969238f, 0.150757f, + 0.971191f, 0.142822f, 0.971680f, 0.135742f, 0.974609f, 0.128296f, 0.975586f, 0.121826f, + 0.976074f, 0.115906f, 0.977051f, 0.110229f, 0.979492f, 0.104492f, 0.979980f, 0.099060f, + 0.980469f, 0.094299f, 0.980957f, 0.089722f, 0.981934f, 0.085205f, 0.982910f, 0.080933f, + 0.984375f, 0.076477f, 0.984375f, 0.072632f, 0.985352f, 0.068848f, 0.985352f, 0.065369f, + 0.985840f, 0.062042f, 0.985840f, 0.058929f, 0.987305f, 0.055420f, 0.987793f, 0.052277f, + 0.988770f, 0.049103f, 0.989258f, 0.046173f, 0.989258f, 0.043457f, 0.989258f, 0.040924f, + 0.990234f, 0.038177f, 0.990234f, 0.035736f, 0.989746f, 0.033478f, 0.990234f, 0.031128f, + 0.990234f, 0.029007f, 0.991211f, 0.026596f, 0.991699f, 0.024445f, 0.991699f, 0.022354f, + 0.992676f, 0.020142f, 0.993164f, 0.017929f, 0.993652f, 0.015808f, 0.993652f, 0.014038f, + 0.993652f, 0.012398f, 0.994141f, 0.010811f, 0.994141f, 0.009163f, 0.994141f, 0.007805f, + 0.994629f, 0.006386f, 0.994141f, 0.005188f, 0.994629f, 0.003971f, 0.994629f, 0.002979f, + 0.000000f, 1.000000f, 0.712402f, 0.698242f, 0.807129f, 0.572754f, 0.853516f, 0.492920f, + 0.882812f, 0.433838f, 0.902344f, 0.387695f, 0.917969f, 0.350342f, 0.928223f, 0.319824f, + 0.936035f, 0.293701f, 0.942871f, 0.270508f, 0.947754f, 0.250977f, 0.953125f, 0.233276f, + 0.957520f, 0.217407f, 0.960449f, 0.203369f, 0.963867f, 0.190308f, 0.965820f, 0.178955f, + 0.968262f, 0.168091f, 0.970703f, 0.158203f, 0.971680f, 0.149292f, 0.974121f, 0.140747f, + 0.975098f, 0.133057f, 0.976562f, 0.125610f, 0.978027f, 0.118835f, 0.979492f, 0.112183f, + 0.979980f, 0.106384f, 0.980469f, 0.100830f, 0.981445f, 0.095459f, 0.982910f, 0.090271f, + 0.983887f, 0.085266f, 0.983887f, 0.080933f, 0.985352f, 0.076477f, 0.985352f, 0.072449f, + 0.985840f, 0.068665f, 0.986328f, 0.065063f, 0.987305f, 0.061401f, 0.988770f, 0.057739f, + 0.988770f, 0.054352f, 0.989258f, 0.051178f, 0.989258f, 0.048309f, 0.989258f, 0.045624f, + 0.990234f, 0.042877f, 0.990234f, 0.040192f, 0.990723f, 0.037659f, 0.990723f, 0.035309f, + 0.991211f, 0.032990f, 0.991211f, 0.030823f, 0.992188f, 0.028397f, 0.992676f, 0.026184f, + 0.993652f, 0.023880f, 0.993652f, 0.021820f, 0.994141f, 0.019882f, 0.994141f, 0.018005f, + 0.994141f, 0.016342f, 0.994141f, 0.014786f, 0.994141f, 0.013229f, 0.994141f, 0.011673f, + 0.994141f, 0.010323f, 0.994141f, 0.009087f, 0.994629f, 0.007652f, 0.994629f, 0.006546f, + 0.995117f, 0.005310f, 0.995117f, 0.004387f, 0.995117f, 0.003315f, 0.996094f, 0.002047f, + 0.000000f, 1.000000f, 0.730469f, 0.691895f, 0.822754f, 0.565430f, 0.868164f, 0.484863f, + 0.894531f, 0.425537f, 0.913086f, 0.379150f, 0.925781f, 0.342285f, 0.936523f, 0.310791f, + 0.944824f, 0.284424f, 0.949707f, 0.261963f, 0.954590f, 0.241943f, 0.958984f, 0.224487f, + 0.963379f, 0.208374f, 0.965332f, 0.194824f, 0.968262f, 0.181641f, 0.970215f, 0.170166f, + 0.973145f, 0.159302f, 0.974121f, 0.149658f, 0.975586f, 0.140747f, 0.977539f, 0.132324f, + 0.979004f, 0.124512f, 0.979980f, 0.117310f, 0.980469f, 0.110901f, 0.981445f, 0.104614f, + 0.983398f, 0.098328f, 0.983887f, 0.092773f, 0.984375f, 0.087769f, 0.984863f, 0.082886f, + 0.985840f, 0.078186f, 0.986328f, 0.073853f, 0.987305f, 0.069641f, 0.988281f, 0.065491f, + 0.988281f, 0.061798f, 0.989258f, 0.058044f, 0.989258f, 0.054749f, 0.989258f, 0.051697f, + 0.989746f, 0.048645f, 0.989746f, 0.045868f, 0.990723f, 0.042908f, 0.990723f, 0.040314f, + 0.991211f, 0.037750f, 0.991211f, 0.035400f, 0.991699f, 0.033020f, 0.992676f, 0.030472f, + 0.993652f, 0.027954f, 0.993652f, 0.025848f, 0.993652f, 0.023926f, 0.994141f, 0.021973f, + 0.994141f, 0.020172f, 0.994141f, 0.018524f, 0.994141f, 0.016983f, 0.994629f, 0.015373f, + 0.994629f, 0.013885f, 0.994629f, 0.012543f, 0.994629f, 0.011292f, 0.995117f, 0.009865f, + 0.995117f, 0.008713f, 0.995605f, 0.007580f, 0.995605f, 0.006413f, 0.995117f, 0.005505f, + 0.995605f, 0.004375f, 0.996094f, 0.003344f, 0.996582f, 0.002335f, 0.998047f, 0.000193f, + 0.000000f, 1.000000f, 0.748047f, 0.685547f, 0.839355f, 0.558105f, 0.880859f, 0.477539f, + 0.906738f, 0.417969f, 0.923340f, 0.371338f, 0.934570f, 0.334473f, 0.943848f, 0.303223f, + 0.950684f, 0.276855f, 0.956543f, 0.254150f, 0.960938f, 0.234375f, 0.963867f, 0.216919f, + 0.967773f, 0.200928f, 0.969727f, 0.187256f, 0.972656f, 0.174072f, 0.973633f, 0.162964f, + 0.976562f, 0.152100f, 0.977539f, 0.142456f, 0.978516f, 0.133667f, 0.979980f, 0.125366f, + 0.981445f, 0.117676f, 0.982910f, 0.110535f, 0.983887f, 0.103699f, 0.984375f, 0.097656f, + 0.984863f, 0.092041f, 0.985352f, 0.086670f, 0.986328f, 0.081543f, 0.987793f, 0.076538f, + 0.988281f, 0.071838f, 0.988281f, 0.067688f, 0.988770f, 0.063721f, 0.989258f, 0.059906f, + 0.989746f, 0.056335f, 0.989746f, 0.053040f, 0.990234f, 0.049896f, 0.990723f, 0.046783f, + 0.991211f, 0.043793f, 0.991211f, 0.041107f, 0.991699f, 0.038422f, 0.992676f, 0.035736f, + 0.993652f, 0.032867f, 0.993652f, 0.030548f, 0.993652f, 0.028412f, 0.993652f, 0.026428f, + 0.994141f, 0.024384f, 0.994141f, 0.022552f, 0.994141f, 0.020844f, 0.994141f, 0.019257f, + 0.994629f, 0.017563f, 0.994629f, 0.016052f, 0.994629f, 0.014679f, 0.994629f, 0.013397f, + 0.995117f, 0.011932f, 0.995117f, 0.010742f, 0.995605f, 0.009621f, 0.995605f, 0.008362f, + 0.995605f, 0.007374f, 0.996094f, 0.006222f, 0.996094f, 0.005341f, 0.996582f, 0.004272f, + 0.997070f, 0.003265f, 0.997070f, 0.002253f, 0.998535f, 0.000515f, 0.998535f, 0.000015f, + 0.000000f, 1.000000f, 0.762695f, 0.680664f, 0.852539f, 0.552246f, 0.892090f, 0.471191f, + 0.913574f, 0.412598f, 0.931641f, 0.365234f, 0.942383f, 0.327881f, 0.950684f, 0.296631f, + 0.956543f, 0.270508f, 0.961914f, 0.247803f, 0.965332f, 0.228027f, 0.968750f, 0.210327f, + 0.971680f, 0.194702f, 0.973633f, 0.180664f, 0.975586f, 0.168213f, 0.978027f, 0.156372f, + 0.979004f, 0.145996f, 0.979980f, 0.136475f, 0.982422f, 0.127319f, 0.983398f, 0.119141f, + 0.983887f, 0.111816f, 0.984863f, 0.104797f, 0.985352f, 0.098267f, 0.985840f, 0.092285f, + 0.987305f, 0.086487f, 0.988281f, 0.080750f, 0.988281f, 0.075928f, 0.988770f, 0.071289f, + 0.988770f, 0.067139f, 0.989746f, 0.062805f, 0.989746f, 0.059113f, 0.990234f, 0.055450f, + 0.990723f, 0.052063f, 0.991211f, 0.048645f, 0.991699f, 0.045441f, 0.992188f, 0.042419f, + 0.993164f, 0.039307f, 0.993652f, 0.036499f, 0.993652f, 0.033966f, 0.993652f, 0.031677f, + 0.993652f, 0.029541f, 0.994141f, 0.027359f, 0.994141f, 0.025360f, 0.994141f, 0.023544f, + 0.994141f, 0.021835f, 0.994629f, 0.020020f, 0.994629f, 0.018433f, 0.994629f, 0.016968f, + 0.995117f, 0.015480f, 0.995117f, 0.014053f, 0.995117f, 0.012802f, 0.995605f, 0.011520f, + 0.995605f, 0.010292f, 0.995605f, 0.009232f, 0.996094f, 0.008034f, 0.996094f, 0.007069f, + 0.996582f, 0.005962f, 0.997070f, 0.005047f, 0.997070f, 0.004066f, 0.998047f, 0.002935f, + 0.999023f, 0.001466f, 0.999023f, 0.000664f, 0.999023f, 0.000200f, 0.998535f, 0.000005f, + 0.000000f, 1.000000f, 0.778809f, 0.675293f, 0.863770f, 0.546875f, 0.901367f, 0.465576f, + 0.922363f, 0.406738f, 0.937988f, 0.359863f, 0.948242f, 0.322510f, 0.956055f, 0.291260f, + 0.962402f, 0.264893f, 0.965820f, 0.242554f, 0.969238f, 0.222656f, 0.972168f, 0.205078f, + 0.974121f, 0.189697f, 0.977539f, 0.175171f, 0.979004f, 0.162720f, 0.980469f, 0.151367f, + 0.982422f, 0.140503f, 0.983398f, 0.130981f, 0.984375f, 0.122314f, 0.984863f, 0.114502f, + 0.986328f, 0.106812f, 0.986816f, 0.099915f, 0.988281f, 0.093140f, 0.988770f, 0.087158f, + 0.989258f, 0.081543f, 0.989258f, 0.076538f, 0.989746f, 0.071777f, 0.990234f, 0.067200f, + 0.990723f, 0.062866f, 0.991211f, 0.058899f, 0.991699f, 0.055145f, 0.992676f, 0.051300f, + 0.993652f, 0.047607f, 0.993652f, 0.044342f, 0.994141f, 0.041351f, 0.994141f, 0.038452f, + 0.994141f, 0.035858f, 0.994141f, 0.033478f, 0.994629f, 0.031082f, 0.994629f, 0.028854f, + 0.994629f, 0.026825f, 0.994629f, 0.024933f, 0.995117f, 0.022949f, 0.995117f, 0.021210f, + 0.994629f, 0.019608f, 0.995117f, 0.017944f, 0.995117f, 0.016434f, 0.995117f, 0.015068f, + 0.995605f, 0.013634f, 0.995605f, 0.012344f, 0.995605f, 0.011200f, 0.996094f, 0.009903f, + 0.996094f, 0.008865f, 0.996582f, 0.007683f, 0.996582f, 0.006748f, 0.997070f, 0.005638f, + 0.997559f, 0.004570f, 0.998535f, 0.003340f, 0.999023f, 0.002111f, 0.999023f, 0.001382f, + 0.999023f, 0.000828f, 0.999023f, 0.000409f, 0.999023f, 0.000123f, 0.999023f, 0.000003f, + 0.000000f, 1.000000f, 0.792480f, 0.670410f, 0.874512f, 0.541992f, 0.910645f, 0.460693f, + 0.930664f, 0.401855f, 0.945312f, 0.354980f, 0.953125f, 0.317871f, 0.960449f, 0.286865f, + 0.965820f, 0.260254f, 0.970703f, 0.237549f, 0.972656f, 0.218018f, 0.976074f, 0.200195f, + 0.978027f, 0.184692f, 0.979492f, 0.170776f, 0.982422f, 0.157837f, 0.982910f, 0.146484f, + 0.983887f, 0.136353f, 0.984863f, 0.126831f, 0.985840f, 0.118164f, 0.987793f, 0.109741f, + 0.988281f, 0.102234f, 0.988281f, 0.095642f, 0.989258f, 0.089172f, 0.989746f, 0.083374f, + 0.989746f, 0.078003f, 0.990723f, 0.072815f, 0.991211f, 0.067993f, 0.991699f, 0.063477f, + 0.992188f, 0.059235f, 0.993652f, 0.054749f, 0.993652f, 0.050995f, 0.993652f, 0.047607f, + 0.994141f, 0.044312f, 0.994141f, 0.041260f, 0.994141f, 0.038483f, 0.994141f, 0.035919f, + 0.994629f, 0.033264f, 0.994629f, 0.030945f, 0.994629f, 0.028778f, 0.995117f, 0.026581f, + 0.995117f, 0.024597f, 0.995117f, 0.022781f, 0.995605f, 0.020935f, 0.995605f, 0.019241f, + 0.995605f, 0.017715f, 0.996094f, 0.016113f, 0.996094f, 0.014709f, 0.996094f, 0.013435f, + 0.996582f, 0.012009f, 0.996582f, 0.010857f, 0.997070f, 0.009560f, 0.997559f, 0.008408f, + 0.997559f, 0.007324f, 0.997559f, 0.006172f, 0.998535f, 0.004894f, 0.999023f, 0.003607f, + 0.999023f, 0.002758f, 0.999023f, 0.002066f, 0.999023f, 0.001485f, 0.999023f, 0.000998f, + 0.999023f, 0.000601f, 0.999023f, 0.000295f, 0.999023f, 0.000086f, 0.999023f, 0.000002f, + 0.000000f, 1.000000f, 0.805664f, 0.666016f, 0.885254f, 0.537598f, 0.917969f, 0.456787f, + 0.935547f, 0.398193f, 0.949707f, 0.351074f, 0.958496f, 0.313721f, 0.964844f, 0.282715f, + 0.969238f, 0.256348f, 0.973145f, 0.233643f, 0.976074f, 0.213745f, 0.978027f, 0.196411f, + 0.979980f, 0.180786f, 0.981934f, 0.166626f, 0.982910f, 0.154297f, 0.984375f, 0.142944f, + 0.985840f, 0.132446f, 0.987305f, 0.122742f, 0.988281f, 0.113953f, 0.988281f, 0.106201f, + 0.988770f, 0.098999f, 0.989746f, 0.092102f, 0.990234f, 0.085938f, 0.990234f, 0.080261f, + 0.991211f, 0.074646f, 0.992188f, 0.069397f, 0.993164f, 0.064331f, 0.993652f, 0.059723f, + 0.993652f, 0.055634f, 0.993652f, 0.051910f, 0.994141f, 0.048248f, 0.994141f, 0.044952f, + 0.994141f, 0.041901f, 0.994629f, 0.038910f, 0.994629f, 0.036163f, 0.994629f, 0.033630f, + 0.995117f, 0.031158f, 0.995117f, 0.028839f, 0.995117f, 0.026749f, 0.995605f, 0.024643f, + 0.995605f, 0.022705f, 0.995605f, 0.020966f, 0.996094f, 0.019135f, 0.996094f, 0.017548f, + 0.996582f, 0.015961f, 0.996582f, 0.014496f, 0.997070f, 0.013092f, 0.997070f, 0.011742f, + 0.997559f, 0.010406f, 0.998047f, 0.009201f, 0.998535f, 0.007942f, 0.999512f, 0.006516f, + 0.999512f, 0.005203f, 0.999512f, 0.004269f, 0.999512f, 0.003471f, 0.999512f, 0.002773f, + 0.999512f, 0.002163f, 0.999512f, 0.001632f, 0.999512f, 0.001172f, 0.999023f, 0.000785f, + 0.999023f, 0.000469f, 0.999023f, 0.000226f, 0.999023f, 0.000064f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.817871f, 0.662109f, 0.894043f, 0.533691f, 0.924805f, 0.453125f, + 0.941406f, 0.394531f, 0.954590f, 0.347656f, 0.962402f, 0.310059f, 0.967773f, 0.279053f, + 0.972168f, 0.252686f, 0.975586f, 0.229980f, 0.978027f, 0.210571f, 0.980957f, 0.192627f, + 0.982422f, 0.177124f, 0.983887f, 0.163452f, 0.984863f, 0.151001f, 0.987305f, 0.139160f, + 0.987793f, 0.128784f, 0.988281f, 0.119751f, 0.988770f, 0.111084f, 0.989258f, 0.103333f, + 0.990234f, 0.095947f, 0.990723f, 0.089233f, 0.991699f, 0.082947f, 0.993164f, 0.076660f, + 0.993164f, 0.071167f, 0.993652f, 0.066101f, 0.993652f, 0.061523f, 0.993652f, 0.057312f, + 0.994141f, 0.053253f, 0.994141f, 0.049561f, 0.994141f, 0.046173f, 0.994629f, 0.042816f, + 0.994629f, 0.039795f, 0.994629f, 0.036987f, 0.995117f, 0.034180f, 0.995117f, 0.031708f, + 0.995605f, 0.029358f, 0.995605f, 0.027039f, 0.995605f, 0.024979f, 0.996094f, 0.022888f, + 0.996094f, 0.021042f, 0.996582f, 0.019211f, 0.996582f, 0.017532f, 0.997070f, 0.015884f, + 0.997070f, 0.014389f, 0.997559f, 0.012848f, 0.998047f, 0.011383f, 0.998535f, 0.009941f, + 0.999512f, 0.008308f, 0.999512f, 0.007061f, 0.999512f, 0.006020f, 0.999512f, 0.005104f, + 0.999512f, 0.004288f, 0.999512f, 0.003557f, 0.999512f, 0.002905f, 0.999512f, 0.002321f, + 0.999512f, 0.001806f, 0.999512f, 0.001356f, 0.999512f, 0.000968f, 0.999512f, 0.000643f, + 0.999512f, 0.000380f, 0.999512f, 0.000181f, 0.999023f, 0.000050f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.829102f, 0.658691f, 0.903320f, 0.530273f, 0.932129f, 0.449463f, + 0.945801f, 0.391357f, 0.957520f, 0.344727f, 0.965820f, 0.307129f, 0.970215f, 0.276367f, + 0.974609f, 0.249756f, 0.978027f, 0.227173f, 0.980957f, 0.206909f, 0.981934f, 0.189941f, + 0.983887f, 0.174438f, 0.985352f, 0.160522f, 0.986816f, 0.147705f, 0.987793f, 0.136353f, + 0.988281f, 0.126343f, 0.989258f, 0.117004f, 0.989746f, 0.108582f, 0.990723f, 0.100525f, + 0.991699f, 0.093201f, 0.993164f, 0.085938f, 0.993164f, 0.079712f, 0.993164f, 0.074158f, + 0.993652f, 0.068787f, 0.993652f, 0.063965f, 0.994141f, 0.059448f, 0.994141f, 0.055237f, + 0.994141f, 0.051422f, 0.994629f, 0.047638f, 0.994629f, 0.044250f, 0.995117f, 0.041046f, + 0.995117f, 0.037994f, 0.995117f, 0.035248f, 0.995605f, 0.032471f, 0.995605f, 0.030045f, + 0.996094f, 0.027618f, 0.996094f, 0.025436f, 0.996582f, 0.023285f, 0.996582f, 0.021332f, + 0.997070f, 0.019394f, 0.997070f, 0.017670f, 0.997559f, 0.015884f, 0.998047f, 0.014183f, + 0.999023f, 0.012512f, 0.999512f, 0.010674f, 0.999512f, 0.009315f, 0.999512f, 0.008133f, + 0.999512f, 0.007080f, 0.999512f, 0.006119f, 0.999512f, 0.005249f, 0.999512f, 0.004463f, + 0.999512f, 0.003748f, 0.999512f, 0.003103f, 0.999512f, 0.002525f, 0.999512f, 0.002010f, + 0.999512f, 0.001557f, 0.999512f, 0.001162f, 0.999512f, 0.000824f, 0.999512f, 0.000542f, + 0.999512f, 0.000317f, 0.999512f, 0.000149f, 0.999512f, 0.000040f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.837891f, 0.656250f, 0.908691f, 0.527344f, 0.937012f, 0.446533f, + 0.950684f, 0.388428f, 0.960938f, 0.342041f, 0.967773f, 0.304688f, 0.973633f, 0.273193f, + 0.977051f, 0.247192f, 0.980469f, 0.224121f, 0.981934f, 0.204712f, 0.984375f, 0.187378f, + 0.986328f, 0.171387f, 0.987305f, 0.157715f, 0.987793f, 0.145386f, 0.988281f, 0.134277f, + 0.989746f, 0.124023f, 0.990234f, 0.114685f, 0.991699f, 0.105896f, 0.992676f, 0.097656f, + 0.993164f, 0.090332f, 0.993164f, 0.083801f, 0.993652f, 0.077759f, 0.993652f, 0.072144f, + 0.993652f, 0.067078f, 0.994141f, 0.062164f, 0.994141f, 0.057800f, 0.994629f, 0.053528f, + 0.994629f, 0.049683f, 0.995117f, 0.045990f, 0.995117f, 0.042633f, 0.995605f, 0.039429f, + 0.995605f, 0.036407f, 0.996094f, 0.033630f, 0.996094f, 0.030945f, 0.996582f, 0.028442f, + 0.996582f, 0.026093f, 0.997070f, 0.023804f, 0.997070f, 0.021790f, 0.997559f, 0.019699f, + 0.998047f, 0.017715f, 0.999512f, 0.015594f, 0.999512f, 0.013680f, 0.999512f, 0.012138f, + 0.999512f, 0.010765f, 0.999512f, 0.009521f, 0.999512f, 0.008385f, 0.999512f, 0.007351f, + 0.999512f, 0.006397f, 0.999512f, 0.005531f, 0.999512f, 0.004738f, 0.999512f, 0.004017f, + 0.999512f, 0.003366f, 0.999512f, 0.002777f, 0.999512f, 0.002251f, 0.999512f, 0.001785f, + 0.999512f, 0.001374f, 0.999512f, 0.001019f, 0.999512f, 0.000718f, 0.999512f, 0.000468f, + 0.999512f, 0.000271f, 0.999512f, 0.000125f, 0.999512f, 0.000033f, 0.999512f, 0.000001f, + 0.000000f, 1.000000f, 0.849609f, 0.652344f, 0.916992f, 0.523926f, 0.941895f, 0.444092f, + 0.955078f, 0.385742f, 0.964355f, 0.339844f, 0.971191f, 0.302002f, 0.975098f, 0.271240f, + 0.979492f, 0.244629f, 0.981934f, 0.222290f, 0.983887f, 0.202393f, 0.986328f, 0.184570f, + 0.987305f, 0.169434f, 0.987793f, 0.155762f, 0.988770f, 0.143311f, 0.989746f, 0.132202f, + 0.990723f, 0.121826f, 0.992676f, 0.111877f, 0.992676f, 0.103455f, 0.993164f, 0.095642f, + 0.993164f, 0.088684f, 0.993652f, 0.082092f, 0.993652f, 0.076172f, 0.994141f, 0.070557f, + 0.994141f, 0.065491f, 0.994629f, 0.060638f, 0.994629f, 0.056244f, 0.995117f, 0.052032f, + 0.995117f, 0.048218f, 0.995605f, 0.044495f, 0.995605f, 0.041168f, 0.996094f, 0.037903f, + 0.996094f, 0.035004f, 0.996582f, 0.032074f, 0.997070f, 0.029388f, 0.997070f, 0.026947f, + 0.997559f, 0.024490f, 0.998535f, 0.022049f, 0.999512f, 0.019547f, 0.999512f, 0.017487f, + 0.999512f, 0.015686f, 0.999512f, 0.014069f, 0.999512f, 0.012589f, 0.999512f, 0.011230f, + 0.999512f, 0.009979f, 0.999512f, 0.008835f, 0.999512f, 0.007778f, 0.999512f, 0.006805f, + 0.999512f, 0.005917f, 0.999512f, 0.005104f, 0.999512f, 0.004364f, 0.999512f, 0.003689f, + 0.999512f, 0.003080f, 0.999512f, 0.002533f, 0.999512f, 0.002047f, 0.999512f, 0.001615f, + 0.999512f, 0.001237f, 0.999512f, 0.000912f, 0.999512f, 0.000638f, 0.999512f, 0.000413f, + 0.999512f, 0.000237f, 0.999512f, 0.000108f, 0.999512f, 0.000028f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.857910f, 0.649902f, 0.921875f, 0.521973f, 0.947266f, 0.441406f, + 0.958008f, 0.383789f, 0.965820f, 0.338379f, 0.972656f, 0.300293f, 0.978027f, 0.268799f, + 0.980469f, 0.242920f, 0.983398f, 0.220215f, 0.985840f, 0.200073f, 0.986816f, 0.182861f, + 0.987793f, 0.167725f, 0.989258f, 0.153931f, 0.990234f, 0.141479f, 0.992188f, 0.129517f, + 0.992676f, 0.119385f, 0.992676f, 0.110229f, 0.993164f, 0.101868f, 0.993164f, 0.094299f, + 0.993652f, 0.087219f, 0.993652f, 0.080872f, 0.994141f, 0.074768f, 0.994629f, 0.069214f, + 0.994629f, 0.064087f, 0.995117f, 0.059296f, 0.995117f, 0.054901f, 0.995605f, 0.050659f, + 0.995605f, 0.046875f, 0.996094f, 0.043152f, 0.996582f, 0.039673f, 0.997070f, 0.036499f, + 0.997070f, 0.033447f, 0.997559f, 0.030548f, 0.998535f, 0.027634f, 0.999512f, 0.024704f, + 0.999512f, 0.022293f, 0.999512f, 0.020157f, 0.999512f, 0.018219f, 0.999512f, 0.016449f, + 0.999512f, 0.014816f, 0.999512f, 0.013306f, 0.999512f, 0.011909f, 0.999512f, 0.010620f, + 0.999512f, 0.009430f, 0.999512f, 0.008339f, 0.999512f, 0.007332f, 0.999512f, 0.006405f, + 0.999512f, 0.005558f, 0.999512f, 0.004784f, 0.999512f, 0.004078f, 0.999512f, 0.003441f, + 0.999512f, 0.002865f, 0.999512f, 0.002348f, 0.999512f, 0.001890f, 0.999512f, 0.001485f, + 0.999512f, 0.001133f, 0.999512f, 0.000831f, 0.999512f, 0.000578f, 0.999512f, 0.000371f, + 0.999512f, 0.000211f, 0.999512f, 0.000095f, 0.999512f, 0.000025f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.864746f, 0.647949f, 0.926758f, 0.520020f, 0.949707f, 0.439697f, + 0.961426f, 0.381592f, 0.967773f, 0.336670f, 0.975586f, 0.298340f, 0.979004f, 0.267334f, + 0.982422f, 0.241211f, 0.984863f, 0.218140f, 0.986328f, 0.198730f, 0.987305f, 0.181641f, + 0.988770f, 0.166138f, 0.990723f, 0.151855f, 0.992188f, 0.139038f, 0.992188f, 0.128052f, + 0.992676f, 0.118042f, 0.993164f, 0.108948f, 0.993164f, 0.100769f, 0.993652f, 0.093018f, + 0.994141f, 0.085999f, 0.994141f, 0.079590f, 0.994629f, 0.073547f, 0.995117f, 0.067993f, + 0.995117f, 0.062866f, 0.995605f, 0.058014f, 0.996094f, 0.053528f, 0.996094f, 0.049408f, + 0.996582f, 0.045441f, 0.997070f, 0.041687f, 0.997559f, 0.038177f, 0.998535f, 0.034729f, + 0.999512f, 0.031250f, 0.999512f, 0.028366f, 0.999512f, 0.025803f, 0.999512f, 0.023468f, + 0.999512f, 0.021317f, 0.999512f, 0.019318f, 0.999512f, 0.017487f, 0.999512f, 0.015793f, + 0.999512f, 0.014221f, 0.999512f, 0.012764f, 0.999512f, 0.011414f, 0.999512f, 0.010170f, + 0.999512f, 0.009026f, 0.999512f, 0.007965f, 0.999512f, 0.006992f, 0.999512f, 0.006100f, + 0.999512f, 0.005283f, 0.999512f, 0.004539f, 0.999512f, 0.003864f, 0.999512f, 0.003250f, + 0.999512f, 0.002701f, 0.999512f, 0.002207f, 0.999512f, 0.001771f, 0.999512f, 0.001387f, + 0.999512f, 0.001054f, 0.999512f, 0.000770f, 0.999512f, 0.000533f, 0.999512f, 0.000340f, + 0.999512f, 0.000192f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.874023f, 0.645020f, 0.931641f, 0.518066f, 0.953125f, 0.437744f, + 0.964355f, 0.379883f, 0.969727f, 0.335205f, 0.976074f, 0.297363f, 0.980469f, 0.266113f, + 0.983887f, 0.239380f, 0.985840f, 0.216919f, 0.987305f, 0.197388f, 0.988770f, 0.180054f, + 0.991211f, 0.163818f, 0.991699f, 0.150146f, 0.992188f, 0.137939f, 0.992676f, 0.126953f, + 0.993164f, 0.116943f, 0.993164f, 0.108032f, 0.993652f, 0.099609f, 0.994141f, 0.091919f, + 0.994629f, 0.084900f, 0.994629f, 0.078491f, 0.995117f, 0.072449f, 0.995605f, 0.066772f, + 0.996094f, 0.061584f, 0.996582f, 0.056732f, 0.997070f, 0.052185f, 0.997559f, 0.047852f, + 0.998047f, 0.043762f, 0.999512f, 0.039520f, 0.999512f, 0.036011f, 0.999512f, 0.032898f, + 0.999512f, 0.030060f, 0.999512f, 0.027435f, 0.999512f, 0.025009f, 0.999512f, 0.022766f, + 0.999512f, 0.020676f, 0.999512f, 0.018753f, 0.999512f, 0.016968f, 0.999512f, 0.015312f, + 0.999512f, 0.013779f, 0.999512f, 0.012360f, 0.999512f, 0.011047f, 0.999512f, 0.009834f, + 0.999512f, 0.008713f, 0.999512f, 0.007687f, 0.999512f, 0.006737f, 0.999512f, 0.005871f, + 0.999512f, 0.005077f, 0.999512f, 0.004353f, 0.999512f, 0.003698f, 0.999512f, 0.003107f, + 0.999512f, 0.002575f, 0.999512f, 0.002100f, 0.999512f, 0.001680f, 0.999512f, 0.001312f, + 0.999512f, 0.000995f, 0.999512f, 0.000724f, 0.999512f, 0.000499f, 0.999512f, 0.000317f, + 0.999512f, 0.000178f, 0.999512f, 0.000079f, 0.999512f, 0.000020f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.880371f, 0.643555f, 0.934570f, 0.517090f, 0.957031f, 0.435791f, + 0.966309f, 0.378174f, 0.972656f, 0.333008f, 0.977539f, 0.296143f, 0.982422f, 0.264160f, + 0.984375f, 0.238403f, 0.986816f, 0.215820f, 0.988770f, 0.195923f, 0.991211f, 0.177856f, + 0.991699f, 0.162598f, 0.992188f, 0.149170f, 0.992676f, 0.136963f, 0.993164f, 0.125977f, + 0.993164f, 0.116150f, 0.993652f, 0.107056f, 0.994141f, 0.098633f, 0.994629f, 0.090942f, + 0.995117f, 0.083862f, 0.995605f, 0.077271f, 0.996094f, 0.071167f, 0.996582f, 0.065552f, + 0.997070f, 0.060242f, 0.998047f, 0.055176f, 0.999512f, 0.050110f, 0.999512f, 0.045685f, + 0.999512f, 0.041840f, 0.999512f, 0.038330f, 0.999512f, 0.035126f, 0.999512f, 0.032135f, + 0.999512f, 0.029388f, 0.999512f, 0.026840f, 0.999512f, 0.024475f, 0.999512f, 0.022278f, + 0.999512f, 0.020233f, 0.999512f, 0.018341f, 0.999512f, 0.016586f, 0.999512f, 0.014961f, + 0.999512f, 0.013458f, 0.999512f, 0.012062f, 0.999512f, 0.010773f, 0.999512f, 0.009575f, + 0.999512f, 0.008484f, 0.999512f, 0.007473f, 0.999512f, 0.006542f, 0.999512f, 0.005695f, + 0.999512f, 0.004917f, 0.999512f, 0.004211f, 0.999512f, 0.003574f, 0.999512f, 0.002998f, + 0.999512f, 0.002480f, 0.999512f, 0.002020f, 0.999512f, 0.001613f, 0.999512f, 0.001257f, + 0.999512f, 0.000950f, 0.999512f, 0.000690f, 0.999512f, 0.000473f, 0.999512f, 0.000300f, + 0.999512f, 0.000167f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.887695f, 0.641113f, 0.938965f, 0.515137f, 0.959473f, 0.434570f, + 0.969727f, 0.376465f, 0.974121f, 0.332031f, 0.979004f, 0.295166f, 0.982910f, 0.263672f, + 0.985352f, 0.237427f, 0.988770f, 0.214233f, 0.990234f, 0.194214f, 0.991211f, 0.177002f, + 0.991699f, 0.161987f, 0.992188f, 0.148438f, 0.992676f, 0.136353f, 0.993164f, 0.125366f, + 0.993652f, 0.115295f, 0.994141f, 0.106140f, 0.995117f, 0.097656f, 0.995605f, 0.089844f, + 0.996094f, 0.082703f, 0.996582f, 0.076050f, 0.997559f, 0.069763f, 0.998535f, 0.063721f, + 0.999512f, 0.057983f, 0.999512f, 0.053162f, 0.999512f, 0.048828f, 0.999512f, 0.044830f, + 0.999512f, 0.041138f, 0.999512f, 0.037720f, 0.999512f, 0.034576f, 0.999512f, 0.031647f, + 0.999512f, 0.028946f, 0.999512f, 0.026428f, 0.999512f, 0.024094f, 0.999512f, 0.021912f, + 0.999512f, 0.019913f, 0.999512f, 0.018036f, 0.999512f, 0.016296f, 0.999512f, 0.014702f, + 0.999512f, 0.013214f, 0.999512f, 0.011833f, 0.999512f, 0.010567f, 0.999512f, 0.009392f, + 0.999512f, 0.008308f, 0.999512f, 0.007313f, 0.999512f, 0.006401f, 0.999512f, 0.005566f, + 0.999512f, 0.004803f, 0.999512f, 0.004108f, 0.999512f, 0.003483f, 0.999512f, 0.002916f, + 0.999512f, 0.002411f, 0.999512f, 0.001961f, 0.999512f, 0.001563f, 0.999512f, 0.001216f, + 0.999512f, 0.000918f, 0.999512f, 0.000665f, 0.999512f, 0.000455f, 0.999512f, 0.000288f, + 0.999512f, 0.000160f, 0.999512f, 0.000070f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.892090f, 0.640137f, 0.942383f, 0.513672f, 0.962891f, 0.432617f, + 0.971191f, 0.375000f, 0.977051f, 0.330078f, 0.979004f, 0.294678f, 0.983398f, 0.263184f, + 0.987793f, 0.235840f, 0.989746f, 0.212891f, 0.990234f, 0.193726f, 0.991211f, 0.176514f, + 0.992188f, 0.161377f, 0.992676f, 0.147827f, 0.993164f, 0.135620f, 0.994141f, 0.124451f, + 0.994629f, 0.114319f, 0.995117f, 0.105103f, 0.996094f, 0.096497f, 0.996582f, 0.088623f, + 0.998047f, 0.081055f, 0.999512f, 0.073669f, 0.999512f, 0.067566f, 0.999512f, 0.062073f, + 0.999512f, 0.057068f, 0.999512f, 0.052460f, 0.999512f, 0.048218f, 0.999512f, 0.044312f, + 0.999512f, 0.040680f, 0.999512f, 0.037323f, 0.999512f, 0.034210f, 0.999512f, 0.031311f, + 0.999512f, 0.028625f, 0.999512f, 0.026123f, 0.999512f, 0.023819f, 0.999512f, 0.021667f, + 0.999512f, 0.019669f, 0.999512f, 0.017822f, 0.999512f, 0.016098f, 0.999512f, 0.014511f, + 0.999512f, 0.013039f, 0.999512f, 0.011673f, 0.999512f, 0.010414f, 0.999512f, 0.009254f, + 0.999512f, 0.008179f, 0.999512f, 0.007198f, 0.999512f, 0.006298f, 0.999512f, 0.005470f, + 0.999512f, 0.004719f, 0.999512f, 0.004036f, 0.999512f, 0.003416f, 0.999512f, 0.002859f, + 0.999512f, 0.002361f, 0.999512f, 0.001919f, 0.999512f, 0.001528f, 0.999512f, 0.001187f, + 0.999512f, 0.000895f, 0.999512f, 0.000647f, 0.999512f, 0.000443f, 0.999512f, 0.000279f, + 0.999512f, 0.000155f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.898926f, 0.637695f, 0.947266f, 0.511230f, 0.965820f, 0.431152f, + 0.973145f, 0.373779f, 0.978027f, 0.329102f, 0.979980f, 0.293701f, 0.984863f, 0.262451f, + 0.987793f, 0.235229f, 0.989258f, 0.212769f, 0.990234f, 0.193359f, 0.991699f, 0.176147f, + 0.992188f, 0.160889f, 0.993164f, 0.147095f, 0.994141f, 0.134766f, 0.995117f, 0.123474f, + 0.996094f, 0.113159f, 0.997070f, 0.103516f, 0.999512f, 0.094177f, 0.999512f, 0.086060f, + 0.999512f, 0.079041f, 0.999512f, 0.072693f, 0.999512f, 0.066833f, 0.999512f, 0.061523f, + 0.999512f, 0.056610f, 0.999512f, 0.052063f, 0.999512f, 0.047852f, 0.999512f, 0.043976f, + 0.999512f, 0.040375f, 0.999512f, 0.037048f, 0.999512f, 0.033936f, 0.999512f, 0.031067f, + 0.999512f, 0.028412f, 0.999512f, 0.025925f, 0.999512f, 0.023621f, 0.999512f, 0.021484f, + 0.999512f, 0.019501f, 0.999512f, 0.017670f, 0.999512f, 0.015961f, 0.999512f, 0.014381f, + 0.999512f, 0.012917f, 0.999512f, 0.011559f, 0.999512f, 0.010315f, 0.999512f, 0.009155f, + 0.999512f, 0.008095f, 0.999512f, 0.007122f, 0.999512f, 0.006226f, 0.999512f, 0.005409f, + 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003372f, 0.999512f, 0.002821f, + 0.999512f, 0.002329f, 0.999512f, 0.001890f, 0.999512f, 0.001505f, 0.999512f, 0.001168f, + 0.999512f, 0.000880f, 0.999512f, 0.000636f, 0.999512f, 0.000434f, 0.999512f, 0.000273f, + 0.999512f, 0.000152f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.905273f, 0.635742f, 0.951660f, 0.509277f, 0.965820f, 0.431152f, + 0.976074f, 0.372070f, 0.979004f, 0.328369f, 0.983887f, 0.291016f, 0.983887f, 0.261963f, + 0.985840f, 0.236572f, 0.988770f, 0.213257f, 0.990234f, 0.193359f, 0.991699f, 0.175903f, + 0.993164f, 0.160156f, 0.994629f, 0.146240f, 0.995605f, 0.133423f, 0.998047f, 0.121338f, + 0.999512f, 0.110107f, 0.999512f, 0.100952f, 0.999512f, 0.092773f, 0.999512f, 0.085327f, + 0.999512f, 0.078491f, 0.999512f, 0.072205f, 0.999512f, 0.066467f, 0.999512f, 0.061218f, + 0.999512f, 0.056305f, 0.999512f, 0.051819f, 0.999512f, 0.047638f, 0.999512f, 0.043762f, + 0.999512f, 0.040192f, 0.999512f, 0.036865f, 0.999512f, 0.033783f, 0.999512f, 0.030914f, + 0.999512f, 0.028259f, 0.999512f, 0.025787f, 0.999512f, 0.023499f, 0.999512f, 0.021378f, + 0.999512f, 0.019394f, 0.999512f, 0.017563f, 0.999512f, 0.015869f, 0.999512f, 0.014297f, + 0.999512f, 0.012840f, 0.999512f, 0.011490f, 0.999512f, 0.010246f, 0.999512f, 0.009102f, + 0.999512f, 0.008041f, 0.999512f, 0.007072f, 0.999512f, 0.006184f, 0.999512f, 0.005367f, + 0.999512f, 0.004627f, 0.999512f, 0.003952f, 0.999512f, 0.003345f, 0.999512f, 0.002798f, + 0.999512f, 0.002308f, 0.999512f, 0.001874f, 0.999512f, 0.001491f, 0.999512f, 0.001158f, + 0.999512f, 0.000871f, 0.999512f, 0.000629f, 0.999512f, 0.000430f, 0.999512f, 0.000270f, + 0.999512f, 0.000150f, 0.999512f, 0.000065f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.907227f, 0.635254f, 0.952637f, 0.509277f, 0.968262f, 0.429688f, + 0.976562f, 0.371826f, 0.983887f, 0.324951f, 0.983887f, 0.290527f, 0.983887f, 0.261719f, + 0.983887f, 0.237427f, 0.983887f, 0.216309f, 0.984863f, 0.197632f, 0.994629f, 0.175171f, + 0.999512f, 0.155884f, 0.999512f, 0.141968f, 0.999512f, 0.129883f, 0.999512f, 0.119080f, + 0.999512f, 0.109314f, 0.999512f, 0.100403f, 0.999512f, 0.092346f, 0.999512f, 0.084961f, + 0.999512f, 0.078186f, 0.999512f, 0.071960f, 0.999512f, 0.066284f, 0.999512f, 0.061005f, + 0.999512f, 0.056152f, 0.999512f, 0.051666f, 0.999512f, 0.047485f, 0.999512f, 0.043640f, + 0.999512f, 0.040070f, 0.999512f, 0.036743f, 0.999512f, 0.033691f, 0.999512f, 0.030838f, + 0.999512f, 0.028183f, 0.999512f, 0.025726f, 0.999512f, 0.023438f, 0.999512f, 0.021317f, + 0.999512f, 0.019348f, 0.999512f, 0.017517f, 0.999512f, 0.015823f, 0.999512f, 0.014252f, + 1.000000f, 0.012802f, 0.999512f, 0.011452f, 1.000000f, 0.010216f, 1.000000f, 0.009071f, + 1.000000f, 0.008018f, 1.000000f, 0.007050f, 1.000000f, 0.006161f, 1.000000f, 0.005348f, + 1.000000f, 0.004612f, 1.000000f, 0.003941f, 1.000000f, 0.003334f, 1.000000f, 0.002787f, + 1.000000f, 0.002298f, 1.000000f, 0.001866f, 1.000000f, 0.001485f, 0.999512f, 0.001152f, + 1.000000f, 0.000867f, 1.000000f, 0.000626f, 1.000000f, 0.000427f, 1.000000f, 0.000269f, + 1.000000f, 0.000149f, 1.000000f, 0.000065f, 1.000000f, 0.000016f, 1.000000f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f, + 0.000000f, 0.984375f, 0.000000f, 0.979980f, 0.000000f, 0.976562f, 0.000000f, 0.969727f, + 0.000000f, 0.958984f, 0.000000f, 0.938477f, 0.000000f, 0.883789f, 0.000000f, 0.555176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991211f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, + 0.000000f, 0.983887f, 0.000000f, 0.979980f, 0.000000f, 0.976074f, 0.000000f, 0.969238f, + 0.000000f, 0.958984f, 0.000000f, 0.937988f, 0.000000f, 0.883789f, 0.000000f, 0.555176f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.983398f, 0.000000f, 0.980469f, 0.000000f, 0.975586f, 0.000000f, 0.968750f, + 0.000000f, 0.958496f, 0.000000f, 0.937988f, 0.000000f, 0.883301f, 0.000004f, 0.554688f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994629f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, + 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.975098f, 0.000000f, 0.969238f, + 0.000000f, 0.957520f, 0.000000f, 0.937012f, 0.000022f, 0.882324f, 0.000029f, 0.553711f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.985840f, + 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975098f, 0.000000f, 0.968750f, + 0.000000f, 0.957031f, 0.000065f, 0.936035f, 0.000051f, 0.880859f, 0.000110f, 0.552734f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.984863f, + 0.000000f, 0.982910f, 0.000000f, 0.979004f, 0.000000f, 0.974121f, 0.000014f, 0.967773f, + 0.000153f, 0.956055f, 0.000141f, 0.935059f, 0.000156f, 0.879395f, 0.000302f, 0.551758f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.984863f, + 0.000000f, 0.981934f, 0.000000f, 0.978516f, 0.000193f, 0.974121f, 0.000303f, 0.966309f, + 0.000277f, 0.955078f, 0.000209f, 0.933594f, 0.000340f, 0.876465f, 0.000677f, 0.549805f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000020f, 0.984375f, + 0.000229f, 0.980957f, 0.000481f, 0.977051f, 0.000519f, 0.973145f, 0.000462f, 0.964844f, + 0.000364f, 0.953125f, 0.000518f, 0.931152f, 0.000634f, 0.874023f, 0.001318f, 0.547852f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.988281f, 0.000118f, 0.986816f, 0.000355f, 0.985352f, 0.000631f, 0.983398f, + 0.000804f, 0.980957f, 0.000780f, 0.976074f, 0.000684f, 0.971680f, 0.000575f, 0.963867f, + 0.000708f, 0.951172f, 0.000806f, 0.928223f, 0.001154f, 0.870117f, 0.002291f, 0.545410f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000097f, 0.990723f, 0.000322f, 0.989258f, + 0.000583f, 0.987793f, 0.000854f, 0.986328f, 0.001122f, 0.984863f, 0.001165f, 0.982422f, + 0.001086f, 0.979980f, 0.000950f, 0.975586f, 0.000796f, 0.970215f, 0.000953f, 0.961914f, + 0.001175f, 0.949707f, 0.001426f, 0.926270f, 0.001970f, 0.866211f, 0.003677f, 0.542480f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000003f, 0.993652f, 0.000153f, 0.993652f, + 0.000380f, 0.992676f, 0.000623f, 0.991699f, 0.000893f, 0.989746f, 0.001161f, 0.988770f, + 0.001406f, 0.986816f, 0.001590f, 0.985352f, 0.001534f, 0.983398f, 0.001380f, 0.981445f, + 0.001233f, 0.978516f, 0.001087f, 0.974121f, 0.001286f, 0.968750f, 0.001590f, 0.960449f, + 0.001768f, 0.947754f, 0.002182f, 0.922363f, 0.003139f, 0.861328f, 0.005543f, 0.539551f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000089f, 0.994629f, + 0.000294f, 0.994141f, 0.000531f, 0.993652f, 0.000763f, 0.993652f, 0.001027f, 0.993164f, + 0.001268f, 0.992676f, 0.001505f, 0.990723f, 0.001743f, 0.989258f, 0.001961f, 0.987793f, + 0.002010f, 0.986328f, 0.001871f, 0.984375f, 0.001698f, 0.982422f, 0.001496f, 0.979492f, + 0.001505f, 0.977051f, 0.001706f, 0.972656f, 0.001982f, 0.966309f, 0.002312f, 0.958496f, + 0.002699f, 0.944824f, 0.003412f, 0.918457f, 0.004868f, 0.856934f, 0.007942f, 0.536133f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000077f, 0.996094f, + 0.000279f, 0.995605f, 0.000498f, 0.995117f, 0.000758f, 0.994629f, 0.000991f, 0.994141f, + 0.001227f, 0.993652f, 0.001451f, 0.993164f, 0.001675f, 0.993164f, 0.001869f, 0.992676f, + 0.002094f, 0.991211f, 0.002260f, 0.990234f, 0.002470f, 0.988770f, 0.002378f, 0.987305f, + 0.002199f, 0.985352f, 0.001993f, 0.983398f, 0.001861f, 0.981445f, 0.002094f, 0.979004f, + 0.002241f, 0.975586f, 0.002480f, 0.971680f, 0.002930f, 0.964355f, 0.003344f, 0.955566f, + 0.003979f, 0.941406f, 0.005020f, 0.914551f, 0.007179f, 0.851074f, 0.010880f, 0.533203f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000116f, 0.996582f, + 0.000329f, 0.996582f, 0.000560f, 0.996094f, 0.000815f, 0.995605f, 0.001021f, 0.995117f, + 0.001272f, 0.994629f, 0.001466f, 0.994141f, 0.001686f, 0.993652f, 0.001883f, 0.993652f, + 0.002045f, 0.993164f, 0.002262f, 0.993164f, 0.002420f, 0.991699f, 0.002590f, 0.991211f, + 0.002779f, 0.990723f, 0.002914f, 0.989746f, 0.002844f, 0.987793f, 0.002581f, 0.985840f, + 0.002447f, 0.984375f, 0.002573f, 0.982422f, 0.002857f, 0.979980f, 0.002949f, 0.976562f, + 0.003170f, 0.973145f, 0.003666f, 0.968750f, 0.004238f, 0.962402f, 0.004742f, 0.952148f, + 0.005692f, 0.937012f, 0.007179f, 0.910156f, 0.010223f, 0.844238f, 0.014442f, 0.529297f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000014f, 0.997070f, 0.000203f, 0.996582f, + 0.000439f, 0.996582f, 0.000669f, 0.996582f, 0.000926f, 0.996582f, 0.001131f, 0.996094f, + 0.001360f, 0.995605f, 0.001561f, 0.995117f, 0.001719f, 0.995117f, 0.001944f, 0.994629f, + 0.002104f, 0.994141f, 0.002251f, 0.993652f, 0.002451f, 0.993164f, 0.002594f, 0.993164f, + 0.002712f, 0.992676f, 0.002911f, 0.991699f, 0.003048f, 0.990723f, 0.003147f, 0.990234f, + 0.003334f, 0.989746f, 0.003483f, 0.988281f, 0.003820f, 0.987305f, 0.003553f, 0.984863f, + 0.003677f, 0.983398f, 0.003727f, 0.980469f, 0.003799f, 0.977539f, 0.004093f, 0.975098f, + 0.004559f, 0.971191f, 0.005211f, 0.966309f, 0.005978f, 0.958496f, 0.006699f, 0.948730f, + 0.008041f, 0.932129f, 0.010391f, 0.904297f, 0.014381f, 0.836914f, 0.018860f, 0.524902f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000081f, 0.997070f, 0.000323f, 0.997070f, + 0.000591f, 0.997070f, 0.000807f, 0.996582f, 0.001072f, 0.996582f, 0.001266f, 0.996582f, + 0.001475f, 0.996582f, 0.001679f, 0.996094f, 0.001820f, 0.995605f, 0.002018f, 0.995117f, + 0.002192f, 0.995117f, 0.002312f, 0.994629f, 0.002470f, 0.994141f, 0.002644f, 0.993652f, + 0.002764f, 0.993652f, 0.002850f, 0.993164f, 0.003048f, 0.993164f, 0.003183f, 0.991699f, + 0.003277f, 0.991211f, 0.003395f, 0.990723f, 0.003565f, 0.989746f, 0.003826f, 0.989258f, + 0.004196f, 0.988281f, 0.004684f, 0.986816f, 0.005169f, 0.985840f, 0.004967f, 0.983887f, + 0.004627f, 0.981445f, 0.004875f, 0.978516f, 0.005257f, 0.976074f, 0.005589f, 0.972656f, + 0.006306f, 0.968750f, 0.007496f, 0.963379f, 0.008354f, 0.955566f, 0.009590f, 0.944336f, + 0.011452f, 0.927246f, 0.014496f, 0.897949f, 0.020004f, 0.828613f, 0.024414f, 0.520996f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000200f, 0.997559f, 0.000453f, 0.997070f, + 0.000755f, 0.997070f, 0.000950f, 0.997070f, 0.001227f, 0.997070f, 0.001406f, 0.996582f, + 0.001596f, 0.996582f, 0.001802f, 0.996582f, 0.001935f, 0.996582f, 0.002087f, 0.996094f, + 0.002279f, 0.995605f, 0.002405f, 0.995117f, 0.002489f, 0.994629f, 0.002682f, 0.994629f, + 0.002827f, 0.994141f, 0.002922f, 0.993652f, 0.002987f, 0.993652f, 0.003185f, 0.993164f, + 0.003313f, 0.993164f, 0.003399f, 0.992188f, 0.003456f, 0.991211f, 0.003641f, 0.990723f, + 0.003933f, 0.990234f, 0.004311f, 0.989746f, 0.004692f, 0.988770f, 0.005169f, 0.987793f, + 0.005581f, 0.986816f, 0.005978f, 0.985352f, 0.006283f, 0.984375f, 0.006916f, 0.982910f, + 0.006577f, 0.979492f, 0.006893f, 0.977051f, 0.007221f, 0.973633f, 0.008026f, 0.969727f, + 0.008850f, 0.965332f, 0.010010f, 0.958984f, 0.011612f, 0.952148f, 0.012985f, 0.939453f, + 0.015762f, 0.921875f, 0.019714f, 0.890137f, 0.027252f, 0.819824f, 0.030869f, 0.516113f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000030f, 0.997559f, 0.000321f, 0.997559f, 0.000576f, 0.997559f, + 0.000901f, 0.997559f, 0.001075f, 0.997070f, 0.001365f, 0.997070f, 0.001530f, 0.997070f, + 0.001694f, 0.997070f, 0.001912f, 0.996582f, 0.002039f, 0.996582f, 0.002123f, 0.996582f, + 0.002354f, 0.996582f, 0.002487f, 0.996094f, 0.002571f, 0.995605f, 0.002680f, 0.995117f, + 0.002871f, 0.994629f, 0.002983f, 0.994629f, 0.003054f, 0.994141f, 0.003117f, 0.993652f, + 0.003319f, 0.993652f, 0.003435f, 0.993164f, 0.003510f, 0.992676f, 0.003557f, 0.992188f, + 0.003742f, 0.991699f, 0.004128f, 0.990723f, 0.004517f, 0.990234f, 0.004894f, 0.989746f, + 0.005226f, 0.988770f, 0.005699f, 0.988281f, 0.006088f, 0.986816f, 0.006390f, 0.986328f, + 0.006721f, 0.984863f, 0.007393f, 0.983398f, 0.008125f, 0.981934f, 0.008812f, 0.979980f, + 0.008667f, 0.977539f, 0.008881f, 0.974121f, 0.009567f, 0.970703f, 0.010544f, 0.966797f, + 0.011612f, 0.960938f, 0.013306f, 0.955078f, 0.015594f, 0.946777f, 0.017487f, 0.933594f, + 0.021103f, 0.915039f, 0.026505f, 0.881836f, 0.036133f, 0.810059f, 0.038300f, 0.510742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000021f, 0.998047f, 0.000372f, 0.998047f, 0.000649f, 0.997559f, + 0.000998f, 0.997559f, 0.001168f, 0.997559f, 0.001455f, 0.997559f, 0.001623f, 0.997070f, + 0.001718f, 0.997070f, 0.001987f, 0.997070f, 0.002121f, 0.997070f, 0.002193f, 0.997070f, + 0.002388f, 0.996582f, 0.002552f, 0.996582f, 0.002640f, 0.996094f, 0.002691f, 0.995605f, + 0.002872f, 0.995117f, 0.003025f, 0.995117f, 0.003109f, 0.994629f, 0.003160f, 0.994629f, + 0.003241f, 0.994141f, 0.003439f, 0.993652f, 0.003544f, 0.993652f, 0.003605f, 0.993164f, + 0.003643f, 0.992676f, 0.003990f, 0.992188f, 0.004463f, 0.991699f, 0.004852f, 0.990723f, + 0.005184f, 0.990234f, 0.005505f, 0.989746f, 0.005848f, 0.988770f, 0.006275f, 0.988281f, + 0.006573f, 0.987305f, 0.006855f, 0.986328f, 0.007393f, 0.985352f, 0.008011f, 0.983887f, + 0.008751f, 0.982910f, 0.009346f, 0.981445f, 0.010017f, 0.979492f, 0.010918f, 0.977539f, + 0.011543f, 0.975098f, 0.011932f, 0.971191f, 0.012405f, 0.967285f, 0.013542f, 0.962402f, + 0.015213f, 0.956543f, 0.017365f, 0.950195f, 0.020126f, 0.941406f, 0.022736f, 0.926758f, + 0.027908f, 0.907227f, 0.034576f, 0.873047f, 0.046539f, 0.798828f, 0.046967f, 0.506836f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000234f, 0.998047f, 0.000661f, 0.998047f, + 0.000992f, 0.998047f, 0.001218f, 0.998047f, 0.001438f, 0.997559f, 0.001673f, 0.997559f, + 0.001766f, 0.997559f, 0.001986f, 0.997070f, 0.002169f, 0.997070f, 0.002247f, 0.997070f, + 0.002300f, 0.997070f, 0.002573f, 0.997070f, 0.002686f, 0.996582f, 0.002741f, 0.996094f, + 0.002773f, 0.996094f, 0.003023f, 0.995605f, 0.003143f, 0.995117f, 0.003204f, 0.994629f, + 0.003239f, 0.994629f, 0.003344f, 0.994141f, 0.003542f, 0.994141f, 0.003633f, 0.993652f, + 0.003704f, 0.993164f, 0.003990f, 0.992676f, 0.004383f, 0.992188f, 0.004871f, 0.991699f, + 0.005257f, 0.991211f, 0.005558f, 0.990723f, 0.005840f, 0.990234f, 0.006039f, 0.989746f, + 0.006508f, 0.988770f, 0.006794f, 0.988281f, 0.007149f, 0.987305f, 0.007702f, 0.986328f, + 0.008194f, 0.985352f, 0.008820f, 0.984375f, 0.009506f, 0.983398f, 0.010025f, 0.981445f, + 0.010864f, 0.980469f, 0.011719f, 0.978516f, 0.012512f, 0.976562f, 0.013802f, 0.974121f, + 0.015038f, 0.971191f, 0.015152f, 0.968262f, 0.016327f, 0.962891f, 0.018005f, 0.958008f, + 0.019684f, 0.951660f, 0.022278f, 0.944336f, 0.026245f, 0.934570f, 0.030212f, 0.919434f, + 0.036438f, 0.898438f, 0.044373f, 0.862305f, 0.058777f, 0.786621f, 0.055878f, 0.500977f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000317f, 0.998535f, + 0.000786f, 0.998535f, 0.001155f, 0.998047f, 0.001323f, 0.998047f, 0.001599f, 0.998047f, + 0.001784f, 0.997559f, 0.001842f, 0.997559f, 0.002129f, 0.997559f, 0.002270f, 0.997559f, + 0.002321f, 0.997070f, 0.002432f, 0.997070f, 0.002687f, 0.997070f, 0.002769f, 0.997070f, + 0.002806f, 0.996094f, 0.002836f, 0.996094f, 0.003128f, 0.995605f, 0.003227f, 0.995605f, + 0.003271f, 0.995117f, 0.003294f, 0.994629f, 0.003408f, 0.994141f, 0.003622f, 0.994141f, + 0.003807f, 0.994141f, 0.004154f, 0.993652f, 0.004520f, 0.993164f, 0.004818f, 0.992676f, + 0.005352f, 0.992188f, 0.005684f, 0.991699f, 0.005978f, 0.991211f, 0.006153f, 0.990723f, + 0.006420f, 0.989746f, 0.006706f, 0.989258f, 0.007057f, 0.988281f, 0.007652f, 0.987793f, + 0.008179f, 0.987305f, 0.008644f, 0.986328f, 0.009148f, 0.984863f, 0.009750f, 0.983887f, + 0.010361f, 0.982910f, 0.011147f, 0.981445f, 0.011955f, 0.980469f, 0.012680f, 0.979004f, + 0.013420f, 0.977051f, 0.014824f, 0.975098f, 0.015915f, 0.972656f, 0.017303f, 0.970215f, + 0.018753f, 0.967285f, 0.019653f, 0.963379f, 0.021011f, 0.958008f, 0.023041f, 0.952637f, + 0.025787f, 0.945801f, 0.028976f, 0.937012f, 0.033325f, 0.926270f, 0.038513f, 0.910645f, + 0.046051f, 0.887695f, 0.057159f, 0.850586f, 0.073120f, 0.773926f, 0.065735f, 0.494873f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000167f, 0.999023f, 0.000779f, 0.998535f, 0.001051f, 0.998535f, 0.001363f, 0.998535f, + 0.001513f, 0.998047f, 0.001830f, 0.998047f, 0.001883f, 0.998047f, 0.002144f, 0.997559f, + 0.002321f, 0.997559f, 0.002363f, 0.997559f, 0.002380f, 0.997559f, 0.002743f, 0.997070f, + 0.002819f, 0.997070f, 0.002848f, 0.996582f, 0.002861f, 0.996094f, 0.003185f, 0.995605f, + 0.003281f, 0.995605f, 0.003315f, 0.995117f, 0.003332f, 0.994629f, 0.003397f, 0.994629f, + 0.004017f, 0.994141f, 0.004440f, 0.994141f, 0.004753f, 0.993652f, 0.005085f, 0.993164f, + 0.005299f, 0.992676f, 0.005798f, 0.991699f, 0.006134f, 0.991699f, 0.006298f, 0.991211f, + 0.006577f, 0.990723f, 0.006744f, 0.990234f, 0.006954f, 0.989258f, 0.007759f, 0.988770f, + 0.008354f, 0.987793f, 0.008827f, 0.987305f, 0.009224f, 0.986328f, 0.009727f, 0.985840f, + 0.010063f, 0.984375f, 0.010925f, 0.983887f, 0.011726f, 0.982422f, 0.012543f, 0.981445f, + 0.013191f, 0.979980f, 0.013908f, 0.978516f, 0.014984f, 0.977051f, 0.016083f, 0.975098f, + 0.017380f, 0.972656f, 0.018677f, 0.970703f, 0.020126f, 0.968750f, 0.021744f, 0.965332f, + 0.023682f, 0.961426f, 0.026016f, 0.957520f, 0.027252f, 0.951660f, 0.029556f, 0.945312f, + 0.032654f, 0.937500f, 0.036835f, 0.928223f, 0.042542f, 0.916504f, 0.049011f, 0.899902f, + 0.057770f, 0.875488f, 0.070984f, 0.836426f, 0.089050f, 0.758789f, 0.076111f, 0.489502f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000865f, 0.999023f, + 0.001151f, 0.999023f, 0.001417f, 0.998535f, 0.001698f, 0.998535f, 0.001896f, 0.998535f, + 0.001918f, 0.998047f, 0.002308f, 0.998047f, 0.002382f, 0.998047f, 0.002399f, 0.997559f, + 0.002682f, 0.997559f, 0.002842f, 0.997070f, 0.002871f, 0.996582f, 0.002882f, 0.996094f, + 0.003136f, 0.995605f, 0.003309f, 0.995605f, 0.003344f, 0.995117f, 0.003592f, 0.995117f, + 0.003952f, 0.994629f, 0.004658f, 0.994141f, 0.005035f, 0.994141f, 0.005337f, 0.993652f, + 0.005501f, 0.993164f, 0.005798f, 0.992676f, 0.006088f, 0.991699f, 0.006474f, 0.991699f, + 0.006756f, 0.991211f, 0.006939f, 0.990723f, 0.007332f, 0.990234f, 0.007942f, 0.989258f, + 0.008514f, 0.988281f, 0.009117f, 0.988281f, 0.009514f, 0.987305f, 0.010002f, 0.986328f, + 0.010384f, 0.985840f, 0.011070f, 0.984863f, 0.011597f, 0.983887f, 0.012650f, 0.982422f, + 0.013374f, 0.981445f, 0.014091f, 0.980469f, 0.014923f, 0.979004f, 0.015884f, 0.977539f, + 0.016754f, 0.976074f, 0.018005f, 0.974609f, 0.019348f, 0.972168f, 0.020615f, 0.970215f, + 0.022125f, 0.968262f, 0.023743f, 0.965332f, 0.025604f, 0.962402f, 0.027588f, 0.958984f, + 0.030212f, 0.955078f, 0.033112f, 0.950195f, 0.034882f, 0.944336f, 0.038055f, 0.937012f, + 0.041779f, 0.928711f, 0.047150f, 0.917969f, 0.053711f, 0.904785f, 0.062439f, 0.887207f, + 0.072510f, 0.860840f, 0.087280f, 0.820312f, 0.106995f, 0.743652f, 0.087158f, 0.482666f, + 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000958f, 0.999023f, 0.001426f, 0.999023f, + 0.001450f, 0.998535f, 0.001913f, 0.998535f, 0.001932f, 0.998535f, 0.002323f, 0.998047f, + 0.002407f, 0.998047f, 0.002417f, 0.998047f, 0.002739f, 0.997070f, 0.002878f, 0.996582f, + 0.002895f, 0.996582f, 0.002901f, 0.996094f, 0.003342f, 0.995605f, 0.003899f, 0.995117f, + 0.004318f, 0.995117f, 0.004570f, 0.994629f, 0.004921f, 0.994629f, 0.005493f, 0.993652f, + 0.005795f, 0.993164f, 0.006001f, 0.992676f, 0.006092f, 0.992676f, 0.006348f, 0.992188f, + 0.006901f, 0.991211f, 0.007431f, 0.990723f, 0.007965f, 0.990234f, 0.008484f, 0.989258f, + 0.008896f, 0.988770f, 0.009163f, 0.988281f, 0.009872f, 0.987793f, 0.010399f, 0.986816f, + 0.011093f, 0.985840f, 0.011719f, 0.985352f, 0.012199f, 0.984375f, 0.012886f, 0.983398f, + 0.013557f, 0.982422f, 0.014618f, 0.981445f, 0.015480f, 0.979980f, 0.016281f, 0.978516f, + 0.017197f, 0.977539f, 0.018295f, 0.976074f, 0.019333f, 0.975098f, 0.020386f, 0.972656f, + 0.022003f, 0.970703f, 0.023407f, 0.969238f, 0.025024f, 0.966797f, 0.026733f, 0.964355f, + 0.028534f, 0.961426f, 0.030258f, 0.958496f, 0.033142f, 0.954590f, 0.035858f, 0.950684f, + 0.038727f, 0.946289f, 0.042053f, 0.940918f, 0.045135f, 0.934570f, 0.048950f, 0.926270f, + 0.054199f, 0.916504f, 0.060120f, 0.904785f, 0.067932f, 0.890625f, 0.078247f, 0.871582f, + 0.089966f, 0.844238f, 0.106812f, 0.802734f, 0.127441f, 0.726074f, 0.099121f, 0.477051f, + 0.000000f, 1.000000f, 0.000968f, 0.999512f, 0.001446f, 0.999023f, 0.001458f, 0.999023f, + 0.001937f, 0.998535f, 0.001944f, 0.998535f, 0.002409f, 0.998047f, 0.002424f, 0.998047f, + 0.002428f, 0.997070f, 0.002890f, 0.996582f, 0.003092f, 0.996582f, 0.003626f, 0.996094f, + 0.004356f, 0.995605f, 0.004761f, 0.995117f, 0.005108f, 0.995117f, 0.005207f, 0.994629f, + 0.005558f, 0.993652f, 0.006115f, 0.993164f, 0.006248f, 0.992676f, 0.006676f, 0.992188f, + 0.007191f, 0.991699f, 0.007652f, 0.991211f, 0.008629f, 0.990723f, 0.009087f, 0.989746f, + 0.009369f, 0.988770f, 0.009666f, 0.988770f, 0.010246f, 0.987793f, 0.011024f, 0.987305f, + 0.012001f, 0.986328f, 0.012520f, 0.985352f, 0.012955f, 0.984375f, 0.013870f, 0.983398f, + 0.014633f, 0.982422f, 0.015305f, 0.981934f, 0.016144f, 0.980469f, 0.017197f, 0.979004f, + 0.018433f, 0.978027f, 0.019287f, 0.976562f, 0.020370f, 0.975586f, 0.021545f, 0.973633f, + 0.022644f, 0.971680f, 0.023865f, 0.970215f, 0.025742f, 0.968262f, 0.027435f, 0.966309f, + 0.029160f, 0.964355f, 0.030624f, 0.961914f, 0.032593f, 0.958984f, 0.034882f, 0.956055f, + 0.037354f, 0.953125f, 0.040192f, 0.949219f, 0.043121f, 0.945312f, 0.046417f, 0.940430f, + 0.050079f, 0.935059f, 0.054443f, 0.929199f, 0.059357f, 0.922363f, 0.063660f, 0.912598f, + 0.069641f, 0.901855f, 0.077087f, 0.889160f, 0.085999f, 0.873535f, 0.097839f, 0.853516f, + 0.111206f, 0.824707f, 0.129272f, 0.782715f, 0.149658f, 0.708008f, 0.111084f, 0.470459f, + 0.000000f, 1.000000f, 0.000975f, 0.999512f, 0.001461f, 0.999023f, 0.001938f, 0.998535f, + 0.001947f, 0.998535f, 0.002417f, 0.997559f, 0.002432f, 0.997070f, 0.003159f, 0.997070f, + 0.004124f, 0.996094f, 0.004288f, 0.996094f, 0.004723f, 0.995605f, 0.005253f, 0.995117f, + 0.005669f, 0.994141f, 0.005749f, 0.993652f, 0.006195f, 0.993164f, 0.007343f, 0.992676f, + 0.007858f, 0.992188f, 0.008270f, 0.991211f, 0.008804f, 0.990723f, 0.009163f, 0.990234f, + 0.009964f, 0.989258f, 0.010559f, 0.988281f, 0.011612f, 0.987305f, 0.012154f, 0.986816f, + 0.012489f, 0.986328f, 0.013168f, 0.985352f, 0.014534f, 0.983887f, 0.015350f, 0.982910f, + 0.016083f, 0.981934f, 0.016830f, 0.981445f, 0.017746f, 0.979980f, 0.018661f, 0.978516f, + 0.019897f, 0.977539f, 0.021240f, 0.976074f, 0.022491f, 0.975098f, 0.023514f, 0.973145f, + 0.024704f, 0.971680f, 0.025787f, 0.970215f, 0.027557f, 0.968262f, 0.029312f, 0.966797f, + 0.031113f, 0.964355f, 0.032654f, 0.962402f, 0.034637f, 0.959961f, 0.036530f, 0.957520f, + 0.038971f, 0.955078f, 0.041229f, 0.951660f, 0.043732f, 0.948730f, 0.046875f, 0.945312f, + 0.049957f, 0.941406f, 0.053345f, 0.937012f, 0.057037f, 0.932129f, 0.061249f, 0.926758f, + 0.065857f, 0.920898f, 0.070984f, 0.914062f, 0.077271f, 0.905762f, 0.082703f, 0.895508f, + 0.089844f, 0.883789f, 0.098755f, 0.869629f, 0.109436f, 0.853027f, 0.122070f, 0.831543f, + 0.137085f, 0.802246f, 0.156006f, 0.760254f, 0.174561f, 0.688477f, 0.123535f, 0.463135f, + 0.000000f, 1.000000f, 0.000976f, 0.999512f, 0.001463f, 0.999023f, 0.001948f, 0.998047f, + 0.002787f, 0.997559f, 0.003792f, 0.997070f, 0.004143f, 0.996582f, 0.004810f, 0.996094f, + 0.005192f, 0.995117f, 0.005463f, 0.994629f, 0.006657f, 0.993652f, 0.007496f, 0.993164f, + 0.007912f, 0.992188f, 0.008186f, 0.991699f, 0.009392f, 0.990723f, 0.010132f, 0.989746f, + 0.010811f, 0.989258f, 0.011658f, 0.988281f, 0.012596f, 0.987305f, 0.013405f, 0.986328f, + 0.014366f, 0.985352f, 0.014893f, 0.984375f, 0.015961f, 0.983398f, 0.016907f, 0.982422f, + 0.018433f, 0.980957f, 0.019257f, 0.980469f, 0.020157f, 0.978516f, 0.021347f, 0.977051f, + 0.022690f, 0.976074f, 0.023911f, 0.975098f, 0.025558f, 0.973145f, 0.026596f, 0.971680f, + 0.027908f, 0.970215f, 0.029877f, 0.968262f, 0.031494f, 0.966797f, 0.032837f, 0.964844f, + 0.034668f, 0.962891f, 0.036407f, 0.960938f, 0.038788f, 0.958496f, 0.040863f, 0.956055f, + 0.043091f, 0.953613f, 0.045471f, 0.950684f, 0.048035f, 0.948242f, 0.050659f, 0.944824f, + 0.053375f, 0.941895f, 0.056519f, 0.937988f, 0.060364f, 0.934082f, 0.063660f, 0.929688f, + 0.067993f, 0.925293f, 0.072205f, 0.920410f, 0.076782f, 0.914551f, 0.082031f, 0.908203f, + 0.087646f, 0.901367f, 0.094360f, 0.893555f, 0.101440f, 0.884277f, 0.108765f, 0.873535f, + 0.116943f, 0.860352f, 0.126465f, 0.845703f, 0.138306f, 0.827637f, 0.152466f, 0.806152f, + 0.167480f, 0.776367f, 0.185669f, 0.735840f, 0.201782f, 0.667969f, 0.136108f, 0.456543f, + 0.000000f, 1.000000f, 0.000488f, 0.999023f, 0.002407f, 0.998535f, 0.002905f, 0.998047f, + 0.003870f, 0.997070f, 0.004910f, 0.995605f, 0.005802f, 0.995117f, 0.007008f, 0.994141f, + 0.007664f, 0.993164f, 0.008270f, 0.992188f, 0.010094f, 0.991211f, 0.010651f, 0.990234f, + 0.011383f, 0.989258f, 0.013062f, 0.987793f, 0.014275f, 0.986816f, 0.014977f, 0.985352f, + 0.015915f, 0.984863f, 0.017532f, 0.982910f, 0.018890f, 0.981445f, 0.020126f, 0.980469f, + 0.021225f, 0.979492f, 0.021942f, 0.978027f, 0.024231f, 0.976074f, 0.026031f, 0.975098f, + 0.027084f, 0.973145f, 0.028320f, 0.971680f, 0.030090f, 0.970215f, 0.031830f, 0.968750f, + 0.033630f, 0.966797f, 0.035858f, 0.964355f, 0.037415f, 0.962402f, 0.039551f, 0.960938f, + 0.041260f, 0.958496f, 0.043640f, 0.956543f, 0.045654f, 0.954102f, 0.048004f, 0.951660f, + 0.050903f, 0.948730f, 0.053650f, 0.946289f, 0.056335f, 0.943359f, 0.058838f, 0.940430f, + 0.062195f, 0.937500f, 0.065186f, 0.934082f, 0.068542f, 0.930664f, 0.072021f, 0.926758f, + 0.076355f, 0.922363f, 0.080444f, 0.917969f, 0.084717f, 0.913086f, 0.089355f, 0.908203f, + 0.094360f, 0.902832f, 0.099609f, 0.896973f, 0.105469f, 0.890137f, 0.111572f, 0.883301f, + 0.118896f, 0.875000f, 0.126465f, 0.866211f, 0.134644f, 0.856445f, 0.143188f, 0.845215f, + 0.151855f, 0.831055f, 0.162231f, 0.815430f, 0.174438f, 0.797363f, 0.188965f, 0.775391f, + 0.203613f, 0.747070f, 0.219482f, 0.708008f, 0.230469f, 0.645508f, 0.149902f, 0.450684f, + 0.000000f, 1.000000f, 0.000973f, 0.999023f, 0.002571f, 0.998047f, 0.004745f, 0.996582f, + 0.006233f, 0.995117f, 0.008202f, 0.993652f, 0.009140f, 0.992676f, 0.011353f, 0.990723f, + 0.012718f, 0.989746f, 0.014008f, 0.987793f, 0.016052f, 0.986328f, 0.017120f, 0.984863f, + 0.019363f, 0.982910f, 0.020996f, 0.981445f, 0.022644f, 0.979492f, 0.024368f, 0.978027f, + 0.026810f, 0.976074f, 0.027985f, 0.974121f, 0.030487f, 0.972168f, 0.032196f, 0.970215f, + 0.034119f, 0.968262f, 0.036682f, 0.966309f, 0.038818f, 0.963867f, 0.040649f, 0.961914f, + 0.043304f, 0.959473f, 0.045502f, 0.957520f, 0.048218f, 0.955078f, 0.050934f, 0.952637f, + 0.053436f, 0.950195f, 0.055725f, 0.947754f, 0.058746f, 0.944824f, 0.061584f, 0.942383f, + 0.064636f, 0.939453f, 0.067444f, 0.936523f, 0.071411f, 0.933105f, 0.074707f, 0.930176f, + 0.077942f, 0.926758f, 0.081604f, 0.923340f, 0.085205f, 0.919434f, 0.088928f, 0.916016f, + 0.093262f, 0.912109f, 0.097412f, 0.907715f, 0.102417f, 0.903320f, 0.107056f, 0.898438f, + 0.111938f, 0.893555f, 0.117065f, 0.888184f, 0.122314f, 0.882812f, 0.127930f, 0.876953f, + 0.133911f, 0.870605f, 0.140381f, 0.863770f, 0.147095f, 0.856445f, 0.154907f, 0.848145f, + 0.162598f, 0.839844f, 0.170654f, 0.830078f, 0.179565f, 0.819824f, 0.188965f, 0.808594f, + 0.197754f, 0.794434f, 0.207764f, 0.778809f, 0.219604f, 0.760742f, 0.232544f, 0.739746f, + 0.245117f, 0.713379f, 0.257080f, 0.678223f, 0.260498f, 0.622559f, 0.163086f, 0.442139f, + 0.000000f, 1.000000f, 0.002867f, 0.998535f, 0.005180f, 0.997070f, 0.007675f, 0.994629f, + 0.011902f, 0.991699f, 0.014618f, 0.988770f, 0.017593f, 0.986328f, 0.020813f, 0.984375f, + 0.023514f, 0.980957f, 0.026474f, 0.978027f, 0.029739f, 0.975586f, 0.032715f, 0.972656f, + 0.035614f, 0.969727f, 0.038605f, 0.967285f, 0.041840f, 0.964355f, 0.045410f, 0.961426f, + 0.048584f, 0.958008f, 0.051514f, 0.955566f, 0.054749f, 0.952637f, 0.058289f, 0.949707f, + 0.062256f, 0.946289f, 0.065491f, 0.943359f, 0.068909f, 0.939941f, 0.072327f, 0.937012f, + 0.076355f, 0.933594f, 0.079651f, 0.930176f, 0.083862f, 0.927246f, 0.087830f, 0.923340f, + 0.091919f, 0.919922f, 0.095886f, 0.916504f, 0.099731f, 0.912598f, 0.104370f, 0.909180f, + 0.108459f, 0.904785f, 0.112732f, 0.901367f, 0.116943f, 0.897461f, 0.121948f, 0.893066f, + 0.126587f, 0.888672f, 0.131470f, 0.884277f, 0.136230f, 0.879883f, 0.141357f, 0.875488f, + 0.146729f, 0.870117f, 0.152100f, 0.865234f, 0.157471f, 0.859863f, 0.162964f, 0.854492f, + 0.168701f, 0.849121f, 0.174805f, 0.843750f, 0.181152f, 0.837402f, 0.187500f, 0.830566f, + 0.194092f, 0.823730f, 0.201172f, 0.816406f, 0.208252f, 0.808594f, 0.215454f, 0.800781f, + 0.223022f, 0.792480f, 0.230835f, 0.783203f, 0.238892f, 0.772949f, 0.247314f, 0.762207f, + 0.255371f, 0.749023f, 0.264160f, 0.733887f, 0.273438f, 0.717773f, 0.282959f, 0.699219f, + 0.291748f, 0.676758f, 0.297607f, 0.646484f, 0.291016f, 0.598145f, 0.177246f, 0.433838f, + 0.000000f, 1.000000f, 0.007290f, 0.996094f, 0.014267f, 0.991699f, 0.021393f, 0.985840f, + 0.028214f, 0.980957f, 0.036194f, 0.974609f, 0.042999f, 0.968262f, 0.050507f, 0.962402f, + 0.056885f, 0.956543f, 0.062500f, 0.951660f, 0.069885f, 0.945801f, 0.075867f, 0.939941f, + 0.082031f, 0.935059f, 0.087646f, 0.930176f, 0.094727f, 0.924805f, 0.100708f, 0.919434f, + 0.106323f, 0.914551f, 0.111755f, 0.909668f, 0.117554f, 0.904785f, 0.123657f, 0.900391f, + 0.129272f, 0.895508f, 0.135254f, 0.890625f, 0.140625f, 0.886230f, 0.146484f, 0.881348f, + 0.151733f, 0.876953f, 0.156982f, 0.872070f, 0.161987f, 0.868164f, 0.167847f, 0.863281f, + 0.173340f, 0.858887f, 0.179688f, 0.854004f, 0.184937f, 0.849609f, 0.190186f, 0.844727f, + 0.195312f, 0.840332f, 0.200317f, 0.835938f, 0.205444f, 0.831543f, 0.210571f, 0.826660f, + 0.215576f, 0.822266f, 0.221069f, 0.817383f, 0.226685f, 0.812500f, 0.232178f, 0.807617f, + 0.238037f, 0.802246f, 0.243408f, 0.797363f, 0.248657f, 0.791992f, 0.253906f, 0.786621f, + 0.259277f, 0.781250f, 0.264404f, 0.775879f, 0.269775f, 0.770020f, 0.275391f, 0.763672f, + 0.280762f, 0.757812f, 0.286133f, 0.751465f, 0.291504f, 0.745117f, 0.296631f, 0.738281f, + 0.302979f, 0.730469f, 0.309326f, 0.722168f, 0.315186f, 0.713867f, 0.321045f, 0.704590f, + 0.326172f, 0.693848f, 0.330566f, 0.681641f, 0.335449f, 0.668457f, 0.339600f, 0.653320f, + 0.342285f, 0.636230f, 0.340088f, 0.612305f, 0.323486f, 0.573242f, 0.191528f, 0.425049f, + 0.000000f, 1.000000f, 0.049133f, 0.978027f, 0.088074f, 0.951660f, 0.118530f, 0.927734f, + 0.143311f, 0.907227f, 0.162598f, 0.890625f, 0.182251f, 0.874512f, 0.198364f, 0.860352f, + 0.212158f, 0.848145f, 0.226196f, 0.836426f, 0.236938f, 0.826660f, 0.246216f, 0.818359f, + 0.254639f, 0.810547f, 0.263672f, 0.803223f, 0.272705f, 0.795898f, 0.279541f, 0.789551f, + 0.286377f, 0.783691f, 0.292725f, 0.778320f, 0.298584f, 0.773438f, 0.302979f, 0.769043f, + 0.307617f, 0.764648f, 0.311768f, 0.760742f, 0.318848f, 0.755859f, 0.323975f, 0.751953f, + 0.328613f, 0.748047f, 0.332764f, 0.744141f, 0.336670f, 0.740723f, 0.340820f, 0.736816f, + 0.344238f, 0.733887f, 0.347412f, 0.730469f, 0.350342f, 0.727539f, 0.353271f, 0.724609f, + 0.355957f, 0.721680f, 0.358887f, 0.718750f, 0.361084f, 0.715820f, 0.364014f, 0.712891f, + 0.366211f, 0.709961f, 0.368408f, 0.707031f, 0.372070f, 0.704102f, 0.375488f, 0.700684f, + 0.378418f, 0.697266f, 0.381104f, 0.694336f, 0.383301f, 0.690918f, 0.385986f, 0.687500f, + 0.388672f, 0.684082f, 0.390869f, 0.680176f, 0.392822f, 0.676758f, 0.394775f, 0.673340f, + 0.396729f, 0.669434f, 0.398193f, 0.665527f, 0.399658f, 0.661621f, 0.400879f, 0.657227f, + 0.401855f, 0.652832f, 0.402832f, 0.648438f, 0.403320f, 0.643555f, 0.404053f, 0.638184f, + 0.403809f, 0.631836f, 0.402100f, 0.624023f, 0.400146f, 0.615723f, 0.398438f, 0.605957f, + 0.396240f, 0.593262f, 0.386230f, 0.574707f, 0.359863f, 0.543945f, 0.205688f, 0.416504f, + 0.000000f, 1.000000f, 0.369141f, 0.840820f, 0.409668f, 0.779785f, 0.429443f, 0.743652f, + 0.441650f, 0.718750f, 0.449219f, 0.701660f, 0.455078f, 0.688477f, 0.461182f, 0.677246f, + 0.467041f, 0.667480f, 0.470459f, 0.660156f, 0.474609f, 0.653809f, 0.477539f, 0.648438f, + 0.479736f, 0.644043f, 0.483398f, 0.640137f, 0.485352f, 0.636230f, 0.487305f, 0.633301f, + 0.489258f, 0.630371f, 0.491211f, 0.627930f, 0.492432f, 0.625488f, 0.494385f, 0.623535f, + 0.496338f, 0.621094f, 0.498291f, 0.619141f, 0.499268f, 0.617188f, 0.500488f, 0.615723f, + 0.501953f, 0.613770f, 0.502930f, 0.612305f, 0.504395f, 0.610352f, 0.505859f, 0.608398f, + 0.507324f, 0.606934f, 0.509277f, 0.604980f, 0.510254f, 0.603516f, 0.511230f, 0.601562f, + 0.512207f, 0.600098f, 0.514160f, 0.598145f, 0.515137f, 0.596191f, 0.515625f, 0.594238f, + 0.516602f, 0.592285f, 0.517090f, 0.590820f, 0.518555f, 0.588867f, 0.519531f, 0.586426f, + 0.520020f, 0.584473f, 0.520996f, 0.582520f, 0.522461f, 0.579590f, 0.522949f, 0.577148f, + 0.523926f, 0.574707f, 0.524414f, 0.572266f, 0.525879f, 0.569336f, 0.525879f, 0.566406f, + 0.526367f, 0.563477f, 0.527344f, 0.560059f, 0.528320f, 0.556152f, 0.528320f, 0.552734f, + 0.528809f, 0.548340f, 0.530273f, 0.543457f, 0.530762f, 0.538574f, 0.530762f, 0.533203f, + 0.530762f, 0.526855f, 0.529297f, 0.518555f, 0.526855f, 0.509277f, 0.524414f, 0.499512f, + 0.520020f, 0.487549f, 0.511719f, 0.469727f, 0.488525f, 0.440674f, 0.360596f, 0.333252f, + 0.000000f, 1.000000f, 0.381592f, 0.835449f, 0.429199f, 0.770020f, 0.453125f, 0.729492f, + 0.471191f, 0.700684f, 0.483643f, 0.679199f, 0.491699f, 0.663086f, 0.500488f, 0.649414f, + 0.508789f, 0.637207f, 0.515137f, 0.626953f, 0.521973f, 0.618164f, 0.527344f, 0.610352f, + 0.533691f, 0.603027f, 0.537598f, 0.597168f, 0.542969f, 0.591309f, 0.546387f, 0.585938f, + 0.550293f, 0.581543f, 0.554199f, 0.576660f, 0.558594f, 0.572266f, 0.562500f, 0.567871f, + 0.566895f, 0.563965f, 0.569824f, 0.560059f, 0.572266f, 0.556641f, 0.576172f, 0.552734f, + 0.579102f, 0.549316f, 0.583008f, 0.545898f, 0.585938f, 0.541992f, 0.589844f, 0.538574f, + 0.592285f, 0.535156f, 0.595215f, 0.531738f, 0.598145f, 0.528320f, 0.602051f, 0.524414f, + 0.604004f, 0.520996f, 0.607910f, 0.517578f, 0.610352f, 0.513672f, 0.613281f, 0.510254f, + 0.616699f, 0.506348f, 0.619141f, 0.502441f, 0.622070f, 0.498535f, 0.625000f, 0.494629f, + 0.627930f, 0.490479f, 0.631836f, 0.485840f, 0.633789f, 0.481689f, 0.636719f, 0.477051f, + 0.640625f, 0.472168f, 0.643066f, 0.467285f, 0.645508f, 0.462158f, 0.649902f, 0.456787f, + 0.651367f, 0.451416f, 0.655273f, 0.445312f, 0.658203f, 0.439209f, 0.662598f, 0.432129f, + 0.665039f, 0.425049f, 0.668457f, 0.417725f, 0.671387f, 0.409424f, 0.674805f, 0.400879f, + 0.678223f, 0.391113f, 0.680664f, 0.379883f, 0.682129f, 0.366455f, 0.685059f, 0.351562f, + 0.687012f, 0.334473f, 0.685547f, 0.311768f, 0.678711f, 0.278320f, 0.605957f, 0.190186f, + 0.000000f, 1.000000f, 0.394043f, 0.830566f, 0.449463f, 0.758789f, 0.477539f, 0.715332f, + 0.499023f, 0.682129f, 0.514648f, 0.657715f, 0.526855f, 0.638184f, 0.539062f, 0.621582f, + 0.550293f, 0.605957f, 0.558594f, 0.593262f, 0.567871f, 0.582031f, 0.575684f, 0.571777f, + 0.583496f, 0.562500f, 0.590820f, 0.554199f, 0.597168f, 0.546387f, 0.602539f, 0.539062f, + 0.609863f, 0.532227f, 0.616211f, 0.525391f, 0.619629f, 0.519531f, 0.626465f, 0.513184f, + 0.631348f, 0.507324f, 0.636230f, 0.501953f, 0.641602f, 0.496582f, 0.645996f, 0.491455f, + 0.651367f, 0.486084f, 0.655273f, 0.480713f, 0.661133f, 0.475342f, 0.665039f, 0.470459f, + 0.668457f, 0.465576f, 0.673340f, 0.460449f, 0.678223f, 0.455322f, 0.682617f, 0.450439f, + 0.686035f, 0.445068f, 0.690430f, 0.439941f, 0.694824f, 0.434814f, 0.698242f, 0.429688f, + 0.703125f, 0.424316f, 0.707031f, 0.418945f, 0.710449f, 0.413818f, 0.714844f, 0.407959f, + 0.719238f, 0.402344f, 0.722656f, 0.396729f, 0.726562f, 0.390869f, 0.730957f, 0.384766f, + 0.733887f, 0.378662f, 0.738770f, 0.372314f, 0.743164f, 0.365723f, 0.746582f, 0.358887f, + 0.750977f, 0.351562f, 0.753906f, 0.344482f, 0.759766f, 0.336670f, 0.763184f, 0.328613f, + 0.767578f, 0.320312f, 0.771484f, 0.311279f, 0.773926f, 0.302246f, 0.779297f, 0.291992f, + 0.784180f, 0.281250f, 0.789062f, 0.269287f, 0.790527f, 0.254639f, 0.793945f, 0.239136f, + 0.797852f, 0.221680f, 0.799316f, 0.200806f, 0.797852f, 0.170166f, 0.754395f, 0.103760f, + 0.000000f, 1.000000f, 0.409668f, 0.823730f, 0.468018f, 0.749512f, 0.502930f, 0.700195f, + 0.527832f, 0.663574f, 0.546387f, 0.635742f, 0.562012f, 0.612793f, 0.576660f, 0.593262f, + 0.589844f, 0.575684f, 0.602051f, 0.560059f, 0.612305f, 0.546387f, 0.621582f, 0.534180f, + 0.632324f, 0.522461f, 0.640137f, 0.512207f, 0.647949f, 0.502441f, 0.655273f, 0.493652f, + 0.663574f, 0.484863f, 0.670898f, 0.476318f, 0.677246f, 0.468750f, 0.683105f, 0.461426f, + 0.690430f, 0.453857f, 0.695312f, 0.447021f, 0.702148f, 0.439697f, 0.707520f, 0.433105f, + 0.712891f, 0.426514f, 0.719238f, 0.419922f, 0.724121f, 0.413574f, 0.729492f, 0.407471f, + 0.733887f, 0.401367f, 0.738770f, 0.395020f, 0.745117f, 0.388672f, 0.749512f, 0.382568f, + 0.754883f, 0.376465f, 0.758789f, 0.370361f, 0.762695f, 0.364258f, 0.767578f, 0.358398f, + 0.770996f, 0.352295f, 0.776855f, 0.345947f, 0.779785f, 0.339600f, 0.784180f, 0.333252f, + 0.790039f, 0.326904f, 0.791992f, 0.320557f, 0.797363f, 0.313965f, 0.800781f, 0.307373f, + 0.804688f, 0.300537f, 0.809082f, 0.293457f, 0.812988f, 0.286621f, 0.817383f, 0.279297f, + 0.821777f, 0.271729f, 0.824219f, 0.264404f, 0.828613f, 0.256348f, 0.832520f, 0.248291f, + 0.836426f, 0.239868f, 0.839844f, 0.230957f, 0.843750f, 0.221924f, 0.849121f, 0.211670f, + 0.852539f, 0.201416f, 0.856445f, 0.190674f, 0.858398f, 0.177979f, 0.860840f, 0.163818f, + 0.864746f, 0.148438f, 0.868164f, 0.130615f, 0.866211f, 0.106384f, 0.838867f, 0.061279f, + 0.000000f, 1.000000f, 0.422363f, 0.818848f, 0.489502f, 0.738281f, 0.526855f, 0.686035f, + 0.556152f, 0.645508f, 0.579102f, 0.613770f, 0.597168f, 0.587891f, 0.611816f, 0.566406f, + 0.627930f, 0.545898f, 0.642578f, 0.527832f, 0.654297f, 0.512207f, 0.665527f, 0.497803f, + 0.675293f, 0.484619f, 0.685547f, 0.472656f, 0.694336f, 0.461182f, 0.704590f, 0.450439f, + 0.712402f, 0.440186f, 0.719727f, 0.430664f, 0.727051f, 0.421631f, 0.732910f, 0.413086f, + 0.740723f, 0.404297f, 0.747070f, 0.395996f, 0.752441f, 0.388428f, 0.759277f, 0.380371f, + 0.765625f, 0.372803f, 0.771484f, 0.365479f, 0.777832f, 0.358643f, 0.781250f, 0.351562f, + 0.787109f, 0.344482f, 0.791992f, 0.337646f, 0.797363f, 0.330811f, 0.801758f, 0.324219f, + 0.806152f, 0.317383f, 0.811035f, 0.311035f, 0.814453f, 0.304688f, 0.819336f, 0.298096f, + 0.823730f, 0.291504f, 0.827637f, 0.284912f, 0.833008f, 0.278320f, 0.835449f, 0.271973f, + 0.839844f, 0.265381f, 0.843262f, 0.259033f, 0.848145f, 0.252197f, 0.851074f, 0.245605f, + 0.854492f, 0.238892f, 0.857422f, 0.232178f, 0.861816f, 0.225220f, 0.865234f, 0.218140f, + 0.868652f, 0.210815f, 0.873047f, 0.203491f, 0.874512f, 0.196411f, 0.879395f, 0.188599f, + 0.881836f, 0.180908f, 0.885254f, 0.172607f, 0.888672f, 0.164551f, 0.892090f, 0.155640f, + 0.894531f, 0.146973f, 0.898438f, 0.137207f, 0.900879f, 0.127197f, 0.902344f, 0.114807f, + 0.904785f, 0.101868f, 0.906250f, 0.087952f, 0.906250f, 0.069458f, 0.888184f, 0.036011f, + 0.000000f, 1.000000f, 0.438232f, 0.812012f, 0.507324f, 0.728516f, 0.552246f, 0.670898f, + 0.583496f, 0.627441f, 0.609375f, 0.592773f, 0.629395f, 0.564453f, 0.646484f, 0.540039f, + 0.665527f, 0.517090f, 0.679199f, 0.497803f, 0.691895f, 0.479736f, 0.705078f, 0.463867f, + 0.715820f, 0.448975f, 0.726562f, 0.435547f, 0.735352f, 0.422852f, 0.745117f, 0.410889f, + 0.753906f, 0.399658f, 0.761230f, 0.389160f, 0.769043f, 0.379150f, 0.777832f, 0.369141f, + 0.783203f, 0.359863f, 0.790039f, 0.351074f, 0.795898f, 0.342773f, 0.802246f, 0.334229f, + 0.807129f, 0.326416f, 0.812988f, 0.318359f, 0.819336f, 0.310791f, 0.823730f, 0.303467f, + 0.829102f, 0.295898f, 0.833008f, 0.289062f, 0.838379f, 0.281982f, 0.842285f, 0.275146f, + 0.845703f, 0.268555f, 0.850098f, 0.261719f, 0.854004f, 0.255127f, 0.859375f, 0.248535f, + 0.862793f, 0.241821f, 0.865723f, 0.235596f, 0.869141f, 0.229248f, 0.874512f, 0.222778f, + 0.875977f, 0.216553f, 0.879883f, 0.210327f, 0.882324f, 0.204224f, 0.887695f, 0.197388f, + 0.889648f, 0.190918f, 0.891602f, 0.184692f, 0.896484f, 0.178101f, 0.897949f, 0.171753f, + 0.901367f, 0.165283f, 0.903809f, 0.158813f, 0.907227f, 0.152100f, 0.909180f, 0.145386f, + 0.912598f, 0.138184f, 0.915039f, 0.130981f, 0.917480f, 0.123840f, 0.919922f, 0.116577f, + 0.922852f, 0.108826f, 0.925293f, 0.101257f, 0.927246f, 0.092834f, 0.930176f, 0.082581f, + 0.930176f, 0.071960f, 0.931152f, 0.060883f, 0.930664f, 0.047760f, 0.918457f, 0.024490f, + 0.000000f, 1.000000f, 0.449463f, 0.807617f, 0.528809f, 0.717773f, 0.575684f, 0.656738f, + 0.611328f, 0.609863f, 0.638184f, 0.572754f, 0.660645f, 0.541504f, 0.678711f, 0.515137f, + 0.697754f, 0.490723f, 0.712891f, 0.469238f, 0.727539f, 0.449463f, 0.740723f, 0.432129f, + 0.750977f, 0.416504f, 0.761719f, 0.401611f, 0.772461f, 0.387695f, 0.781738f, 0.375000f, + 0.789062f, 0.363281f, 0.797363f, 0.351807f, 0.803711f, 0.341309f, 0.812500f, 0.330811f, + 0.818359f, 0.321045f, 0.823242f, 0.312012f, 0.830566f, 0.303223f, 0.836914f, 0.294434f, + 0.842285f, 0.285889f, 0.846680f, 0.278076f, 0.851562f, 0.270264f, 0.855957f, 0.262939f, + 0.861328f, 0.255371f, 0.864258f, 0.248535f, 0.868652f, 0.241455f, 0.873535f, 0.234497f, + 0.876953f, 0.227905f, 0.881348f, 0.221313f, 0.884766f, 0.214600f, 0.886719f, 0.208618f, + 0.891113f, 0.202271f, 0.894043f, 0.196289f, 0.896484f, 0.190186f, 0.900879f, 0.183960f, + 0.903320f, 0.177979f, 0.906250f, 0.171875f, 0.909180f, 0.165894f, 0.911621f, 0.160278f, + 0.914551f, 0.154297f, 0.915527f, 0.148926f, 0.918945f, 0.142822f, 0.920898f, 0.137207f, + 0.924805f, 0.130981f, 0.926270f, 0.125000f, 0.929688f, 0.119019f, 0.930664f, 0.113159f, + 0.932617f, 0.107483f, 0.934570f, 0.101440f, 0.937500f, 0.095215f, 0.939453f, 0.088989f, + 0.941895f, 0.082092f, 0.942871f, 0.075867f, 0.945312f, 0.069397f, 0.947266f, 0.061920f, + 0.946289f, 0.052948f, 0.948242f, 0.043701f, 0.948242f, 0.034393f, 0.938965f, 0.016373f, + 0.000000f, 1.000000f, 0.463867f, 0.801758f, 0.547852f, 0.708008f, 0.599609f, 0.642578f, + 0.638184f, 0.592773f, 0.665039f, 0.553223f, 0.689941f, 0.519531f, 0.710449f, 0.490967f, + 0.728027f, 0.465820f, 0.744629f, 0.442383f, 0.758301f, 0.422119f, 0.771484f, 0.403564f, + 0.782715f, 0.386719f, 0.792969f, 0.371094f, 0.802734f, 0.356689f, 0.812012f, 0.343506f, + 0.820801f, 0.330811f, 0.828125f, 0.319092f, 0.834473f, 0.308105f, 0.841797f, 0.297607f, + 0.847656f, 0.287598f, 0.853027f, 0.278076f, 0.858398f, 0.269287f, 0.863770f, 0.260254f, + 0.867676f, 0.252197f, 0.873535f, 0.244141f, 0.876465f, 0.236694f, 0.883301f, 0.228882f, + 0.885742f, 0.221680f, 0.890137f, 0.214478f, 0.893066f, 0.207764f, 0.896484f, 0.201172f, + 0.899902f, 0.194946f, 0.903320f, 0.188599f, 0.907715f, 0.182251f, 0.909180f, 0.176392f, + 0.913574f, 0.170166f, 0.916016f, 0.164429f, 0.917969f, 0.158813f, 0.920410f, 0.153076f, + 0.921875f, 0.147827f, 0.924316f, 0.142212f, 0.927734f, 0.136841f, 0.930664f, 0.131226f, + 0.932129f, 0.125977f, 0.934082f, 0.120850f, 0.936523f, 0.115540f, 0.937988f, 0.110474f, + 0.939453f, 0.105469f, 0.942871f, 0.099854f, 0.944336f, 0.094666f, 0.945312f, 0.089844f, + 0.947266f, 0.084778f, 0.949219f, 0.079468f, 0.951172f, 0.074036f, 0.953125f, 0.068726f, + 0.954102f, 0.063660f, 0.955566f, 0.058319f, 0.957520f, 0.052643f, 0.958984f, 0.047333f, + 0.958496f, 0.039642f, 0.958984f, 0.032715f, 0.958496f, 0.024780f, 0.951660f, 0.011436f, + 0.000000f, 1.000000f, 0.478760f, 0.795898f, 0.568359f, 0.697266f, 0.622559f, 0.629395f, + 0.663574f, 0.576172f, 0.692871f, 0.534180f, 0.716309f, 0.499512f, 0.738281f, 0.468994f, + 0.753906f, 0.443359f, 0.772461f, 0.417969f, 0.786621f, 0.396973f, 0.798828f, 0.377686f, + 0.809570f, 0.360107f, 0.819824f, 0.343994f, 0.828613f, 0.329590f, 0.838867f, 0.315186f, + 0.844727f, 0.302734f, 0.853027f, 0.290527f, 0.858398f, 0.279785f, 0.865234f, 0.268799f, + 0.870117f, 0.259033f, 0.876465f, 0.249268f, 0.880859f, 0.240479f, 0.885254f, 0.231812f, + 0.890625f, 0.223511f, 0.895020f, 0.215576f, 0.897461f, 0.208130f, 0.902832f, 0.200439f, + 0.905762f, 0.193604f, 0.908691f, 0.186890f, 0.912598f, 0.180420f, 0.915039f, 0.173950f, + 0.918945f, 0.167480f, 0.920898f, 0.161621f, 0.924316f, 0.155640f, 0.925293f, 0.150146f, + 0.927246f, 0.144897f, 0.930664f, 0.139282f, 0.933594f, 0.133911f, 0.935059f, 0.128662f, + 0.937500f, 0.123474f, 0.938965f, 0.118591f, 0.940430f, 0.114014f, 0.944336f, 0.108765f, + 0.945312f, 0.104004f, 0.946777f, 0.099304f, 0.948730f, 0.094604f, 0.949707f, 0.090149f, + 0.951660f, 0.085510f, 0.953613f, 0.080872f, 0.954590f, 0.076599f, 0.956543f, 0.072083f, + 0.958008f, 0.067444f, 0.958984f, 0.063171f, 0.960938f, 0.058807f, 0.962402f, 0.054291f, + 0.963867f, 0.049805f, 0.964844f, 0.045593f, 0.966797f, 0.040741f, 0.967285f, 0.036530f, + 0.967773f, 0.031097f, 0.966797f, 0.024765f, 0.967285f, 0.018341f, 0.962402f, 0.008820f, + 0.000000f, 1.000000f, 0.492676f, 0.790039f, 0.588379f, 0.687500f, 0.645020f, 0.616211f, + 0.687500f, 0.560547f, 0.718750f, 0.516602f, 0.742188f, 0.480469f, 0.762207f, 0.449219f, + 0.778320f, 0.422119f, 0.796875f, 0.396240f, 0.809570f, 0.374756f, 0.822266f, 0.354492f, + 0.832031f, 0.336914f, 0.843750f, 0.320068f, 0.852051f, 0.304932f, 0.859375f, 0.291016f, + 0.867188f, 0.278076f, 0.872070f, 0.266357f, 0.878906f, 0.254883f, 0.884277f, 0.244263f, + 0.890137f, 0.234375f, 0.894043f, 0.224976f, 0.899902f, 0.215820f, 0.903320f, 0.207397f, + 0.906250f, 0.199463f, 0.911621f, 0.191650f, 0.914062f, 0.184326f, 0.918457f, 0.177124f, + 0.920898f, 0.170288f, 0.924316f, 0.163574f, 0.926270f, 0.157715f, 0.930176f, 0.151367f, + 0.931152f, 0.145752f, 0.934082f, 0.140015f, 0.937500f, 0.134155f, 0.938965f, 0.128906f, + 0.939941f, 0.124146f, 0.942871f, 0.119141f, 0.945312f, 0.113770f, 0.946777f, 0.109009f, + 0.948242f, 0.104431f, 0.949707f, 0.099915f, 0.951172f, 0.095520f, 0.953613f, 0.091064f, + 0.955078f, 0.086731f, 0.956543f, 0.082520f, 0.958496f, 0.078186f, 0.959961f, 0.074097f, + 0.960449f, 0.070374f, 0.962402f, 0.066345f, 0.962891f, 0.062439f, 0.964844f, 0.058472f, + 0.965820f, 0.054626f, 0.967773f, 0.050842f, 0.968262f, 0.047089f, 0.968262f, 0.043762f, + 0.971191f, 0.039612f, 0.972168f, 0.035767f, 0.972168f, 0.032410f, 0.973633f, 0.028854f, + 0.975586f, 0.025055f, 0.973633f, 0.019211f, 0.972656f, 0.014503f, 0.969727f, 0.006020f, + 0.000000f, 1.000000f, 0.505859f, 0.785156f, 0.607422f, 0.677734f, 0.666016f, 0.604004f, + 0.708496f, 0.546387f, 0.739746f, 0.500488f, 0.764648f, 0.463135f, 0.785645f, 0.430664f, + 0.802734f, 0.402344f, 0.818359f, 0.376953f, 0.831543f, 0.354248f, 0.842773f, 0.333984f, + 0.852051f, 0.316162f, 0.861328f, 0.299072f, 0.870117f, 0.283936f, 0.876953f, 0.270264f, + 0.884766f, 0.257080f, 0.890137f, 0.244873f, 0.894531f, 0.234009f, 0.900391f, 0.223267f, + 0.905273f, 0.213379f, 0.910645f, 0.203857f, 0.912598f, 0.195435f, 0.917480f, 0.187012f, + 0.920898f, 0.179199f, 0.924805f, 0.171509f, 0.927734f, 0.164185f, 0.930176f, 0.157349f, + 0.931641f, 0.151367f, 0.936523f, 0.144897f, 0.938965f, 0.138428f, 0.940430f, 0.132812f, + 0.942871f, 0.127319f, 0.944336f, 0.122131f, 0.946289f, 0.117065f, 0.948730f, 0.111877f, + 0.950684f, 0.107056f, 0.952637f, 0.102173f, 0.954590f, 0.097595f, 0.955078f, 0.093506f, + 0.957031f, 0.089172f, 0.958496f, 0.085022f, 0.960449f, 0.080627f, 0.960938f, 0.076782f, + 0.963379f, 0.072754f, 0.963379f, 0.069153f, 0.964844f, 0.065613f, 0.965820f, 0.062195f, + 0.968262f, 0.058228f, 0.969238f, 0.054504f, 0.969727f, 0.051331f, 0.970703f, 0.048309f, + 0.971680f, 0.044830f, 0.973145f, 0.041443f, 0.973633f, 0.038269f, 0.974609f, 0.035187f, + 0.975586f, 0.032166f, 0.977051f, 0.028854f, 0.977051f, 0.026123f, 0.978027f, 0.022934f, + 0.978516f, 0.020386f, 0.979004f, 0.015579f, 0.977051f, 0.010773f, 0.974121f, 0.005226f, + 0.000000f, 1.000000f, 0.520020f, 0.779297f, 0.625488f, 0.668457f, 0.686035f, 0.591797f, + 0.730469f, 0.532227f, 0.761719f, 0.485596f, 0.785645f, 0.447021f, 0.805664f, 0.414062f, + 0.822266f, 0.385010f, 0.836914f, 0.359375f, 0.850586f, 0.335938f, 0.860352f, 0.316162f, + 0.871094f, 0.297363f, 0.878418f, 0.280762f, 0.884766f, 0.266113f, 0.893066f, 0.251465f, + 0.898926f, 0.238647f, 0.903809f, 0.226807f, 0.910156f, 0.215576f, 0.914551f, 0.204956f, + 0.917969f, 0.195435f, 0.921875f, 0.186523f, 0.926270f, 0.177612f, 0.930176f, 0.169312f, + 0.931641f, 0.161865f, 0.934570f, 0.155029f, 0.938477f, 0.147461f, 0.940918f, 0.141113f, + 0.943359f, 0.134766f, 0.945312f, 0.128784f, 0.947754f, 0.122986f, 0.949219f, 0.117615f, + 0.951172f, 0.112488f, 0.953613f, 0.107239f, 0.954590f, 0.102478f, 0.957031f, 0.097656f, + 0.958496f, 0.093018f, 0.959473f, 0.088867f, 0.960938f, 0.084839f, 0.963379f, 0.080444f, + 0.964355f, 0.076538f, 0.964844f, 0.072693f, 0.965820f, 0.069031f, 0.967285f, 0.065613f, + 0.969238f, 0.061798f, 0.969727f, 0.058472f, 0.970215f, 0.055420f, 0.971680f, 0.052094f, + 0.973145f, 0.048706f, 0.973633f, 0.045746f, 0.975098f, 0.042938f, 0.975098f, 0.040100f, + 0.976562f, 0.037048f, 0.977539f, 0.033997f, 0.978027f, 0.031433f, 0.979004f, 0.028717f, + 0.979492f, 0.026321f, 0.979980f, 0.023834f, 0.981934f, 0.020721f, 0.982422f, 0.018433f, + 0.981934f, 0.016449f, 0.983398f, 0.013855f, 0.980957f, 0.008705f, 0.980469f, 0.004063f, + 0.000000f, 1.000000f, 0.535156f, 0.773438f, 0.644043f, 0.659180f, 0.706055f, 0.580078f, + 0.750000f, 0.519531f, 0.780273f, 0.471680f, 0.804199f, 0.432129f, 0.823242f, 0.398682f, + 0.838867f, 0.369629f, 0.852539f, 0.343994f, 0.866211f, 0.320312f, 0.875977f, 0.299805f, + 0.884766f, 0.281494f, 0.893066f, 0.264893f, 0.900391f, 0.249756f, 0.906250f, 0.235596f, + 0.911621f, 0.223022f, 0.916504f, 0.211060f, 0.921875f, 0.199829f, 0.923828f, 0.190063f, + 0.929688f, 0.179932f, 0.932129f, 0.171387f, 0.936523f, 0.162720f, 0.938965f, 0.154785f, + 0.941895f, 0.147339f, 0.944336f, 0.140381f, 0.947266f, 0.133423f, 0.948730f, 0.127197f, + 0.951172f, 0.121277f, 0.953613f, 0.115417f, 0.955078f, 0.110168f, 0.957520f, 0.104614f, + 0.958984f, 0.099731f, 0.959473f, 0.095154f, 0.961426f, 0.090515f, 0.962891f, 0.085938f, + 0.964355f, 0.081665f, 0.965820f, 0.077637f, 0.966309f, 0.073914f, 0.967773f, 0.070068f, + 0.969238f, 0.066284f, 0.970215f, 0.062805f, 0.971191f, 0.059540f, 0.972656f, 0.056152f, + 0.973633f, 0.053009f, 0.974121f, 0.049957f, 0.975586f, 0.046997f, 0.976074f, 0.044128f, + 0.977539f, 0.041229f, 0.978027f, 0.038483f, 0.978516f, 0.036041f, 0.979980f, 0.033295f, + 0.979980f, 0.030838f, 0.980469f, 0.028625f, 0.981934f, 0.026169f, 0.982910f, 0.023605f, + 0.983398f, 0.021332f, 0.983398f, 0.019470f, 0.983887f, 0.017426f, 0.984863f, 0.015488f, + 0.985840f, 0.013283f, 0.986328f, 0.010986f, 0.984375f, 0.006939f, 0.981934f, 0.003538f, + 0.000000f, 1.000000f, 0.548828f, 0.768555f, 0.661621f, 0.650391f, 0.725586f, 0.569336f, + 0.766602f, 0.508301f, 0.797363f, 0.459473f, 0.820801f, 0.418945f, 0.839844f, 0.385010f, + 0.854980f, 0.355957f, 0.867676f, 0.330078f, 0.879883f, 0.306396f, 0.889160f, 0.285889f, + 0.898438f, 0.267334f, 0.904785f, 0.250732f, 0.910645f, 0.235718f, 0.916992f, 0.221680f, + 0.921875f, 0.209106f, 0.926270f, 0.197754f, 0.931152f, 0.186401f, 0.934082f, 0.176514f, + 0.937988f, 0.166992f, 0.941406f, 0.158081f, 0.943848f, 0.150024f, 0.946289f, 0.142334f, + 0.948730f, 0.135132f, 0.951660f, 0.128052f, 0.953125f, 0.121704f, 0.955566f, 0.115723f, + 0.957520f, 0.109985f, 0.959473f, 0.104126f, 0.960938f, 0.099060f, 0.962402f, 0.094055f, + 0.963379f, 0.089600f, 0.966309f, 0.084717f, 0.967285f, 0.080261f, 0.967773f, 0.076294f, + 0.969727f, 0.072327f, 0.969727f, 0.068726f, 0.972168f, 0.064880f, 0.973145f, 0.061188f, + 0.974121f, 0.057922f, 0.974121f, 0.054871f, 0.975098f, 0.051880f, 0.976562f, 0.048798f, + 0.978027f, 0.045563f, 0.978516f, 0.042725f, 0.978516f, 0.040375f, 0.979004f, 0.037994f, + 0.980469f, 0.035339f, 0.980957f, 0.032776f, 0.982422f, 0.030334f, 0.982422f, 0.028046f, + 0.982910f, 0.025955f, 0.983398f, 0.023926f, 0.983887f, 0.021973f, 0.984863f, 0.019989f, + 0.985352f, 0.018112f, 0.985352f, 0.016388f, 0.987305f, 0.013885f, 0.987305f, 0.012360f, + 0.987793f, 0.010902f, 0.988281f, 0.009369f, 0.986816f, 0.006710f, 0.985840f, 0.001877f, + 0.000000f, 1.000000f, 0.562988f, 0.762695f, 0.678223f, 0.642090f, 0.741699f, 0.559570f, + 0.783203f, 0.497314f, 0.812988f, 0.447998f, 0.835449f, 0.407227f, 0.854004f, 0.372803f, + 0.868164f, 0.343262f, 0.880859f, 0.317871f, 0.891602f, 0.293945f, 0.900879f, 0.273682f, + 0.908691f, 0.254883f, 0.914551f, 0.238892f, 0.921875f, 0.223022f, 0.926270f, 0.210083f, + 0.931152f, 0.197144f, 0.934570f, 0.185669f, 0.938477f, 0.175049f, 0.942871f, 0.164917f, + 0.945801f, 0.155640f, 0.947754f, 0.147339f, 0.950684f, 0.139160f, 0.953613f, 0.131592f, + 0.956543f, 0.124329f, 0.957520f, 0.117981f, 0.959473f, 0.111755f, 0.961914f, 0.105652f, + 0.962891f, 0.100098f, 0.964844f, 0.095093f, 0.966797f, 0.089722f, 0.967773f, 0.085022f, + 0.968750f, 0.080566f, 0.970215f, 0.076233f, 0.971680f, 0.072083f, 0.972168f, 0.068298f, + 0.973633f, 0.064453f, 0.974609f, 0.060883f, 0.975586f, 0.057495f, 0.976562f, 0.054291f, + 0.977539f, 0.051178f, 0.978027f, 0.047974f, 0.978516f, 0.045166f, 0.979004f, 0.042542f, + 0.979980f, 0.039948f, 0.980957f, 0.037354f, 0.981934f, 0.034882f, 0.982910f, 0.032227f, + 0.982910f, 0.030167f, 0.983887f, 0.027924f, 0.983887f, 0.026093f, 0.984375f, 0.024246f, + 0.985840f, 0.022125f, 0.986328f, 0.020248f, 0.987305f, 0.018341f, 0.987793f, 0.016449f, + 0.987793f, 0.014763f, 0.988281f, 0.013397f, 0.988281f, 0.012009f, 0.988770f, 0.010773f, + 0.989258f, 0.009399f, 0.989746f, 0.008026f, 0.991699f, 0.005917f, 0.987793f, 0.001071f, + 0.000000f, 1.000000f, 0.575684f, 0.758301f, 0.693359f, 0.634766f, 0.759766f, 0.549316f, + 0.798828f, 0.487305f, 0.828613f, 0.436768f, 0.850098f, 0.395996f, 0.866211f, 0.362061f, + 0.879883f, 0.332275f, 0.892090f, 0.306396f, 0.902344f, 0.283447f, 0.911621f, 0.262207f, + 0.919434f, 0.244019f, 0.923828f, 0.227783f, 0.929199f, 0.212891f, 0.934082f, 0.199341f, + 0.938477f, 0.186768f, 0.942871f, 0.175293f, 0.945801f, 0.165039f, 0.949219f, 0.154907f, + 0.951172f, 0.146240f, 0.955078f, 0.137451f, 0.956543f, 0.129639f, 0.958008f, 0.122681f, + 0.961426f, 0.115417f, 0.962891f, 0.109009f, 0.963867f, 0.103271f, 0.966797f, 0.097107f, + 0.967285f, 0.091858f, 0.968750f, 0.086914f, 0.969727f, 0.082153f, 0.972168f, 0.077209f, + 0.973145f, 0.072998f, 0.973145f, 0.069153f, 0.974609f, 0.065186f, 0.975586f, 0.061493f, + 0.977051f, 0.057739f, 0.978027f, 0.054382f, 0.978516f, 0.051208f, 0.979004f, 0.048309f, + 0.980469f, 0.045410f, 0.980957f, 0.042603f, 0.982422f, 0.039703f, 0.982910f, 0.037048f, + 0.982910f, 0.034851f, 0.983887f, 0.032562f, 0.984375f, 0.030258f, 0.984863f, 0.028229f, + 0.984863f, 0.026443f, 0.985840f, 0.024445f, 0.987305f, 0.022339f, 0.987305f, 0.020264f, + 0.987793f, 0.018524f, 0.987793f, 0.017059f, 0.988281f, 0.015625f, 0.988770f, 0.014076f, + 0.988770f, 0.012947f, 0.989258f, 0.011665f, 0.990234f, 0.010193f, 0.990723f, 0.008965f, + 0.991211f, 0.007645f, 0.992188f, 0.005848f, 0.992188f, 0.005161f, 0.988770f, 0.001506f, + 0.000000f, 1.000000f, 0.589844f, 0.752441f, 0.709961f, 0.626953f, 0.773438f, 0.541016f, + 0.813477f, 0.478271f, 0.841797f, 0.427002f, 0.863281f, 0.385742f, 0.878418f, 0.351562f, + 0.891602f, 0.322266f, 0.900391f, 0.296875f, 0.911621f, 0.273438f, 0.919434f, 0.252686f, + 0.926270f, 0.234741f, 0.931641f, 0.218384f, 0.937500f, 0.203369f, 0.941895f, 0.189941f, + 0.944824f, 0.177979f, 0.948242f, 0.166626f, 0.951172f, 0.156372f, 0.955078f, 0.146362f, + 0.957520f, 0.137817f, 0.959473f, 0.129395f, 0.961914f, 0.121643f, 0.962891f, 0.114868f, + 0.966309f, 0.107666f, 0.967285f, 0.101440f, 0.968262f, 0.095825f, 0.970215f, 0.090271f, + 0.972168f, 0.084656f, 0.973145f, 0.079895f, 0.973633f, 0.075623f, 0.976074f, 0.070984f, + 0.977051f, 0.066589f, 0.977539f, 0.062805f, 0.978027f, 0.059235f, 0.979492f, 0.055542f, + 0.979492f, 0.052399f, 0.979980f, 0.049225f, 0.980957f, 0.046204f, 0.982910f, 0.042938f, + 0.982910f, 0.040192f, 0.982910f, 0.037842f, 0.983398f, 0.035522f, 0.984375f, 0.033234f, + 0.984863f, 0.030853f, 0.985352f, 0.028793f, 0.986328f, 0.026642f, 0.987305f, 0.024460f, + 0.987793f, 0.022522f, 0.988281f, 0.020676f, 0.988281f, 0.019165f, 0.988770f, 0.017807f, + 0.989258f, 0.016266f, 0.989258f, 0.014915f, 0.989746f, 0.013550f, 0.990234f, 0.012337f, + 0.990723f, 0.011070f, 0.991211f, 0.009644f, 0.992188f, 0.008110f, 0.992676f, 0.006832f, + 0.992676f, 0.005985f, 0.993164f, 0.005234f, 0.992676f, 0.004589f, 0.990234f, 0.001586f, + 0.000000f, 1.000000f, 0.604492f, 0.747070f, 0.725586f, 0.618652f, 0.786621f, 0.533203f, + 0.825684f, 0.469482f, 0.853516f, 0.418701f, 0.874512f, 0.376953f, 0.889648f, 0.342773f, + 0.899902f, 0.313477f, 0.910156f, 0.288086f, 0.919434f, 0.265137f, 0.927734f, 0.244629f, + 0.933594f, 0.226318f, 0.939453f, 0.209961f, 0.943359f, 0.195435f, 0.947754f, 0.181885f, + 0.950195f, 0.170044f, 0.953613f, 0.158813f, 0.957031f, 0.148560f, 0.958984f, 0.139282f, + 0.961914f, 0.130371f, 0.964355f, 0.122192f, 0.965820f, 0.114807f, 0.968262f, 0.107727f, + 0.969727f, 0.101196f, 0.970703f, 0.095093f, 0.972656f, 0.089294f, 0.973633f, 0.083923f, + 0.974121f, 0.079163f, 0.976562f, 0.074036f, 0.977539f, 0.069397f, 0.978027f, 0.065369f, + 0.978516f, 0.061584f, 0.979492f, 0.057892f, 0.980957f, 0.054077f, 0.981934f, 0.050568f, + 0.982910f, 0.047394f, 0.982910f, 0.044495f, 0.983887f, 0.041565f, 0.983887f, 0.039093f, + 0.984863f, 0.036469f, 0.985352f, 0.034149f, 0.986328f, 0.031769f, 0.987305f, 0.029266f, + 0.987793f, 0.027008f, 0.987793f, 0.025208f, 0.988770f, 0.023285f, 0.988770f, 0.021530f, + 0.989258f, 0.019943f, 0.989258f, 0.018494f, 0.989258f, 0.017151f, 0.989746f, 0.015549f, + 0.990234f, 0.014198f, 0.990723f, 0.013031f, 0.991699f, 0.011574f, 0.992676f, 0.009941f, + 0.992676f, 0.008720f, 0.993164f, 0.007805f, 0.993164f, 0.006783f, 0.993164f, 0.006134f, + 0.993652f, 0.005295f, 0.993164f, 0.004807f, 0.993652f, 0.004078f, 0.992188f, 0.002140f, + 0.000000f, 1.000000f, 0.615723f, 0.742676f, 0.740234f, 0.611816f, 0.800293f, 0.525879f, + 0.838379f, 0.461670f, 0.865234f, 0.410400f, 0.884277f, 0.368896f, 0.898438f, 0.334229f, + 0.909668f, 0.305176f, 0.918457f, 0.280029f, 0.924805f, 0.258057f, 0.933594f, 0.237061f, + 0.939453f, 0.219116f, 0.944824f, 0.202637f, 0.949219f, 0.188232f, 0.952637f, 0.174927f, + 0.956055f, 0.163086f, 0.958496f, 0.151978f, 0.960938f, 0.142212f, 0.963867f, 0.132446f, + 0.965332f, 0.124207f, 0.968262f, 0.116150f, 0.970215f, 0.108582f, 0.970703f, 0.101929f, + 0.972656f, 0.095459f, 0.973633f, 0.089661f, 0.976074f, 0.083679f, 0.976562f, 0.078613f, + 0.977051f, 0.073792f, 0.978516f, 0.069153f, 0.979004f, 0.064941f, 0.980957f, 0.060699f, + 0.981445f, 0.056763f, 0.982422f, 0.053040f, 0.982910f, 0.049683f, 0.983398f, 0.046600f, + 0.983398f, 0.043884f, 0.984863f, 0.040741f, 0.985352f, 0.038025f, 0.985840f, 0.035522f, + 0.987305f, 0.032745f, 0.987793f, 0.030273f, 0.987793f, 0.028259f, 0.988281f, 0.026230f, + 0.988281f, 0.024521f, 0.989258f, 0.022552f, 0.989258f, 0.020935f, 0.989746f, 0.019379f, + 0.989746f, 0.017990f, 0.990723f, 0.016296f, 0.991211f, 0.014885f, 0.991699f, 0.013512f, + 0.993164f, 0.011826f, 0.993164f, 0.010445f, 0.993164f, 0.009438f, 0.993164f, 0.008598f, + 0.993652f, 0.007557f, 0.993164f, 0.006863f, 0.993652f, 0.006081f, 0.993652f, 0.005436f, + 0.994141f, 0.004818f, 0.994141f, 0.004261f, 0.994629f, 0.003578f, 0.995117f, 0.002644f, + 0.000000f, 1.000000f, 0.629395f, 0.737793f, 0.752930f, 0.605469f, 0.813965f, 0.518555f, + 0.849121f, 0.454590f, 0.875488f, 0.403076f, 0.892578f, 0.362061f, 0.906738f, 0.327393f, + 0.916504f, 0.298340f, 0.924805f, 0.273193f, 0.931152f, 0.251465f, 0.938477f, 0.230835f, + 0.944824f, 0.212524f, 0.949707f, 0.196533f, 0.953613f, 0.182129f, 0.957031f, 0.169067f, + 0.960449f, 0.157104f, 0.962891f, 0.146118f, 0.965332f, 0.136353f, 0.967285f, 0.127075f, + 0.970215f, 0.118469f, 0.971191f, 0.110779f, 0.972656f, 0.103638f, 0.975098f, 0.096741f, + 0.976074f, 0.090332f, 0.976562f, 0.084778f, 0.978516f, 0.079163f, 0.979004f, 0.074158f, + 0.980469f, 0.069519f, 0.981934f, 0.064453f, 0.982422f, 0.060425f, 0.982422f, 0.056763f, + 0.983887f, 0.052856f, 0.983887f, 0.049622f, 0.984375f, 0.046478f, 0.985352f, 0.043304f, + 0.986328f, 0.040039f, 0.987305f, 0.037018f, 0.987305f, 0.034515f, 0.987793f, 0.032166f, + 0.988281f, 0.029816f, 0.988281f, 0.027847f, 0.988770f, 0.025894f, 0.989258f, 0.023972f, + 0.989746f, 0.022125f, 0.989746f, 0.020569f, 0.990234f, 0.018951f, 0.991211f, 0.017181f, + 0.991699f, 0.015602f, 0.992676f, 0.013878f, 0.993164f, 0.012512f, 0.993164f, 0.011253f, + 0.993164f, 0.010269f, 0.993164f, 0.009407f, 0.993652f, 0.008347f, 0.993652f, 0.007614f, + 0.994141f, 0.006866f, 0.994141f, 0.006104f, 0.994141f, 0.005589f, 0.994629f, 0.004826f, + 0.994629f, 0.004421f, 0.994629f, 0.003727f, 0.995117f, 0.003061f, 0.996094f, 0.001978f, + 0.000000f, 1.000000f, 0.642578f, 0.732422f, 0.764648f, 0.600098f, 0.824707f, 0.511719f, + 0.859375f, 0.447510f, 0.884766f, 0.396240f, 0.900879f, 0.355225f, 0.913574f, 0.320801f, + 0.923828f, 0.292236f, 0.932129f, 0.266846f, 0.937988f, 0.244995f, 0.944824f, 0.225098f, + 0.950684f, 0.206787f, 0.954590f, 0.190918f, 0.957520f, 0.176758f, 0.961914f, 0.163330f, + 0.963867f, 0.151855f, 0.966797f, 0.140991f, 0.969238f, 0.131104f, 0.970703f, 0.122192f, + 0.972168f, 0.114014f, 0.974609f, 0.105957f, 0.975586f, 0.098938f, 0.976562f, 0.092407f, + 0.978027f, 0.086365f, 0.979492f, 0.080505f, 0.980957f, 0.074890f, 0.981445f, 0.070007f, + 0.982422f, 0.065308f, 0.982910f, 0.061188f, 0.983398f, 0.057220f, 0.984375f, 0.053375f, + 0.985352f, 0.049652f, 0.986816f, 0.046021f, 0.987305f, 0.042847f, 0.987793f, 0.039642f, + 0.987793f, 0.037048f, 0.988281f, 0.034515f, 0.988770f, 0.032074f, 0.989258f, 0.029770f, + 0.989258f, 0.027756f, 0.989746f, 0.025757f, 0.990723f, 0.023697f, 0.990723f, 0.021866f, + 0.991211f, 0.020111f, 0.992676f, 0.018082f, 0.993164f, 0.016220f, 0.993164f, 0.014832f, + 0.993652f, 0.013557f, 0.993652f, 0.012260f, 0.993164f, 0.011230f, 0.993164f, 0.010330f, + 0.993652f, 0.009224f, 0.993652f, 0.008430f, 0.994141f, 0.007618f, 0.994141f, 0.006821f, + 0.994141f, 0.006241f, 0.994629f, 0.005444f, 0.994629f, 0.004955f, 0.995117f, 0.004230f, + 0.995605f, 0.003597f, 0.996094f, 0.002962f, 0.996582f, 0.002153f, 0.998047f, 0.000076f, + 0.000000f, 1.000000f, 0.656250f, 0.727539f, 0.777832f, 0.593750f, 0.834961f, 0.505859f, + 0.867188f, 0.442139f, 0.892578f, 0.390625f, 0.909180f, 0.349121f, 0.920898f, 0.314941f, + 0.930176f, 0.286133f, 0.937988f, 0.261230f, 0.943848f, 0.239380f, 0.947754f, 0.220459f, + 0.954102f, 0.201904f, 0.958008f, 0.186035f, 0.961426f, 0.171753f, 0.964355f, 0.159058f, + 0.967285f, 0.147217f, 0.969727f, 0.136475f, 0.971680f, 0.127075f, 0.974121f, 0.117554f, + 0.974609f, 0.109863f, 0.976562f, 0.102051f, 0.977539f, 0.095276f, 0.979980f, 0.088318f, + 0.980469f, 0.082275f, 0.981934f, 0.076599f, 0.981934f, 0.071655f, 0.982422f, 0.067078f, + 0.983887f, 0.062256f, 0.984375f, 0.058136f, 0.986816f, 0.053680f, 0.986816f, 0.049805f, + 0.987305f, 0.046387f, 0.987793f, 0.043274f, 0.988281f, 0.040161f, 0.988281f, 0.037445f, + 0.988770f, 0.034882f, 0.989258f, 0.032318f, 0.989746f, 0.029938f, 0.990234f, 0.027786f, + 0.990723f, 0.025589f, 0.991699f, 0.023407f, 0.992676f, 0.021225f, 0.993164f, 0.019241f, + 0.993164f, 0.017578f, 0.993164f, 0.016159f, 0.993164f, 0.014908f, 0.993652f, 0.013474f, + 0.993652f, 0.012375f, 0.993652f, 0.011398f, 0.994141f, 0.010223f, 0.994141f, 0.009369f, + 0.994629f, 0.008430f, 0.994629f, 0.007622f, 0.994629f, 0.006977f, 0.995117f, 0.006115f, + 0.995117f, 0.005562f, 0.995605f, 0.004791f, 0.995605f, 0.004181f, 0.995605f, 0.003626f, + 0.996094f, 0.002935f, 0.997070f, 0.002024f, 0.998535f, 0.000397f, 0.998535f, 0.000006f, + 0.000000f, 1.000000f, 0.666504f, 0.724121f, 0.788574f, 0.588379f, 0.843262f, 0.500977f, + 0.877930f, 0.436035f, 0.899414f, 0.385498f, 0.916504f, 0.343506f, 0.926758f, 0.309814f, + 0.935059f, 0.281006f, 0.942871f, 0.256104f, 0.948242f, 0.234741f, 0.951660f, 0.215820f, + 0.957520f, 0.197632f, 0.961426f, 0.181763f, 0.965820f, 0.167236f, 0.967285f, 0.154785f, + 0.969727f, 0.143188f, 0.972168f, 0.132690f, 0.973633f, 0.123047f, 0.975586f, 0.114258f, + 0.977051f, 0.106201f, 0.979004f, 0.098389f, 0.979980f, 0.091492f, 0.980957f, 0.085144f, + 0.981934f, 0.079346f, 0.982910f, 0.073853f, 0.983887f, 0.068665f, 0.985352f, 0.063660f, + 0.986328f, 0.058899f, 0.986328f, 0.054962f, 0.987305f, 0.050934f, 0.987305f, 0.047577f, + 0.987793f, 0.044281f, 0.988770f, 0.041046f, 0.988770f, 0.038208f, 0.989746f, 0.035400f, + 0.990234f, 0.032684f, 0.990723f, 0.030228f, 0.991211f, 0.027832f, 0.992676f, 0.025070f, + 0.992676f, 0.023010f, 0.992676f, 0.021240f, 0.993164f, 0.019363f, 0.993164f, 0.017838f, + 0.993164f, 0.016464f, 0.993652f, 0.014946f, 0.993652f, 0.013748f, 0.994141f, 0.012566f, + 0.994141f, 0.011406f, 0.994141f, 0.010460f, 0.994629f, 0.009399f, 0.994629f, 0.008545f, + 0.995117f, 0.007713f, 0.995117f, 0.006878f, 0.995605f, 0.006264f, 0.995605f, 0.005421f, + 0.996094f, 0.004692f, 0.996094f, 0.004135f, 0.996582f, 0.003399f, 0.997070f, 0.002676f, + 0.998047f, 0.001649f, 0.999023f, 0.000408f, 0.998535f, 0.000095f, 0.998535f, 0.000002f, + 0.000000f, 1.000000f, 0.678711f, 0.719727f, 0.797852f, 0.583984f, 0.852539f, 0.495850f, + 0.885254f, 0.430664f, 0.905273f, 0.381104f, 0.920898f, 0.339111f, 0.933594f, 0.304688f, + 0.940430f, 0.276123f, 0.947266f, 0.251465f, 0.951660f, 0.230225f, 0.956055f, 0.211060f, + 0.959473f, 0.194458f, 0.964355f, 0.178223f, 0.966797f, 0.164062f, 0.970703f, 0.150879f, + 0.972168f, 0.139648f, 0.974609f, 0.129395f, 0.975586f, 0.119934f, 0.978516f, 0.110535f, + 0.979492f, 0.102722f, 0.980469f, 0.095398f, 0.981934f, 0.088684f, 0.982422f, 0.082458f, + 0.984375f, 0.076416f, 0.985352f, 0.070618f, 0.985840f, 0.065613f, 0.986328f, 0.061005f, + 0.986816f, 0.056763f, 0.987793f, 0.052643f, 0.987793f, 0.049042f, 0.988281f, 0.045593f, + 0.989258f, 0.042145f, 0.989746f, 0.039093f, 0.990723f, 0.036041f, 0.991211f, 0.033112f, + 0.992188f, 0.030197f, 0.992676f, 0.027649f, 0.992676f, 0.025482f, 0.992676f, 0.023560f, + 0.993164f, 0.021576f, 0.993164f, 0.019882f, 0.993164f, 0.018372f, 0.993652f, 0.016724f, + 0.993652f, 0.015396f, 0.994141f, 0.014038f, 0.994141f, 0.012810f, 0.994141f, 0.011765f, + 0.994629f, 0.010559f, 0.994629f, 0.009636f, 0.995117f, 0.008606f, 0.995117f, 0.007786f, + 0.995605f, 0.006866f, 0.995605f, 0.006161f, 0.996094f, 0.005302f, 0.996582f, 0.004539f, + 0.997070f, 0.003866f, 0.997559f, 0.002981f, 0.998535f, 0.002029f, 0.999023f, 0.000865f, + 0.999023f, 0.000441f, 0.999023f, 0.000191f, 0.999023f, 0.000049f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.690430f, 0.715332f, 0.810547f, 0.578125f, 0.862793f, 0.490479f, + 0.893066f, 0.425781f, 0.912109f, 0.375977f, 0.926758f, 0.334717f, 0.937988f, 0.300537f, + 0.944824f, 0.271973f, 0.950684f, 0.247803f, 0.955566f, 0.226196f, 0.959473f, 0.207275f, + 0.962402f, 0.190918f, 0.966797f, 0.175171f, 0.970703f, 0.160767f, 0.972656f, 0.148071f, + 0.975098f, 0.136597f, 0.977539f, 0.125854f, 0.979004f, 0.116455f, 0.980469f, 0.107910f, + 0.980957f, 0.100342f, 0.982422f, 0.092896f, 0.984863f, 0.085815f, 0.985352f, 0.079346f, + 0.986328f, 0.073547f, 0.986328f, 0.068542f, 0.987305f, 0.063538f, 0.987793f, 0.059021f, + 0.988770f, 0.054810f, 0.988770f, 0.050903f, 0.989258f, 0.047211f, 0.990723f, 0.043518f, + 0.991211f, 0.040039f, 0.992676f, 0.036438f, 0.992676f, 0.033600f, 0.992676f, 0.031097f, + 0.993164f, 0.028549f, 0.993164f, 0.026398f, 0.993652f, 0.024277f, 0.993652f, 0.022354f, + 0.993652f, 0.020660f, 0.994141f, 0.018860f, 0.994141f, 0.017365f, 0.994629f, 0.015823f, + 0.994629f, 0.014488f, 0.995117f, 0.013275f, 0.995117f, 0.011963f, 0.994629f, 0.010948f, + 0.995117f, 0.009758f, 0.995117f, 0.008873f, 0.995605f, 0.007801f, 0.996094f, 0.006859f, + 0.996094f, 0.006077f, 0.996582f, 0.005161f, 0.997070f, 0.004276f, 0.997559f, 0.003401f, + 0.999023f, 0.001995f, 0.999023f, 0.001288f, 0.999023f, 0.000843f, 0.999023f, 0.000522f, + 0.999023f, 0.000289f, 0.999023f, 0.000129f, 0.999023f, 0.000033f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.701172f, 0.711426f, 0.819824f, 0.573730f, 0.870605f, 0.485840f, + 0.899902f, 0.421143f, 0.918457f, 0.371582f, 0.931641f, 0.330811f, 0.941895f, 0.296631f, + 0.949219f, 0.268311f, 0.955078f, 0.243896f, 0.959961f, 0.222290f, 0.962402f, 0.204102f, + 0.966309f, 0.187256f, 0.967773f, 0.172729f, 0.972168f, 0.158203f, 0.975586f, 0.145142f, + 0.977051f, 0.133789f, 0.978516f, 0.123657f, 0.980469f, 0.114197f, 0.982422f, 0.105774f, + 0.983887f, 0.097412f, 0.984863f, 0.089966f, 0.985840f, 0.083374f, 0.985840f, 0.077515f, + 0.986816f, 0.071838f, 0.987305f, 0.066711f, 0.988281f, 0.061737f, 0.988770f, 0.057281f, + 0.989746f, 0.052856f, 0.990723f, 0.048767f, 0.992188f, 0.044464f, 0.992188f, 0.041077f, + 0.992676f, 0.037842f, 0.992676f, 0.035034f, 0.993164f, 0.032318f, 0.993164f, 0.029831f, + 0.993164f, 0.027634f, 0.993652f, 0.025330f, 0.993652f, 0.023407f, 0.994141f, 0.021408f, + 0.994141f, 0.019714f, 0.994629f, 0.017975f, 0.994629f, 0.016479f, 0.995117f, 0.014969f, + 0.995117f, 0.013657f, 0.995605f, 0.012306f, 0.995605f, 0.011162f, 0.996094f, 0.009933f, + 0.996094f, 0.008965f, 0.996582f, 0.007835f, 0.997070f, 0.006775f, 0.997559f, 0.005753f, + 0.998047f, 0.004738f, 0.999512f, 0.003304f, 0.999512f, 0.002398f, 0.999512f, 0.001793f, + 0.999512f, 0.001323f, 0.999512f, 0.000946f, 0.999512f, 0.000644f, 0.999023f, 0.000407f, + 0.999023f, 0.000228f, 0.999023f, 0.000102f, 0.999023f, 0.000026f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.710938f, 0.708008f, 0.827148f, 0.570312f, 0.877930f, 0.481689f, + 0.906738f, 0.416992f, 0.923340f, 0.367920f, 0.936035f, 0.327637f, 0.945312f, 0.293701f, + 0.953125f, 0.264893f, 0.958008f, 0.240601f, 0.962402f, 0.219482f, 0.965820f, 0.200684f, + 0.967773f, 0.184570f, 0.970215f, 0.170044f, 0.974121f, 0.155762f, 0.976074f, 0.143188f, + 0.978027f, 0.131836f, 0.979980f, 0.121582f, 0.982910f, 0.111572f, 0.983887f, 0.103027f, + 0.984375f, 0.095459f, 0.985352f, 0.088318f, 0.986328f, 0.081848f, 0.986816f, 0.075867f, + 0.987793f, 0.070190f, 0.989258f, 0.064880f, 0.989746f, 0.059814f, 0.991699f, 0.054657f, + 0.991699f, 0.050476f, 0.992188f, 0.046570f, 0.992188f, 0.043121f, 0.992676f, 0.039795f, + 0.992676f, 0.036835f, 0.993164f, 0.033936f, 0.993164f, 0.031403f, 0.993652f, 0.028870f, + 0.993652f, 0.026672f, 0.994141f, 0.024445f, 0.994141f, 0.022522f, 0.994629f, 0.020538f, + 0.994629f, 0.018875f, 0.995117f, 0.017120f, 0.995117f, 0.015671f, 0.995605f, 0.014099f, + 0.996094f, 0.012665f, 0.996094f, 0.011436f, 0.996582f, 0.010109f, 0.997070f, 0.008842f, + 0.997559f, 0.007633f, 0.998535f, 0.006374f, 0.999512f, 0.004787f, 0.999512f, 0.003801f, + 0.999512f, 0.003057f, 0.999512f, 0.002445f, 0.999512f, 0.001927f, 0.999512f, 0.001488f, + 0.999512f, 0.001117f, 0.999512f, 0.000807f, 0.999512f, 0.000552f, 0.999512f, 0.000350f, + 0.999512f, 0.000195f, 0.999512f, 0.000086f, 0.999512f, 0.000022f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.723633f, 0.703125f, 0.836426f, 0.565918f, 0.885254f, 0.477539f, + 0.911621f, 0.414062f, 0.928223f, 0.364258f, 0.939453f, 0.324707f, 0.949219f, 0.290283f, + 0.956055f, 0.261719f, 0.960938f, 0.237671f, 0.964844f, 0.216431f, 0.967773f, 0.198242f, + 0.971191f, 0.181396f, 0.972656f, 0.167114f, 0.974121f, 0.154297f, 0.977539f, 0.141602f, + 0.980957f, 0.129395f, 0.982422f, 0.119141f, 0.983398f, 0.109924f, 0.984375f, 0.101562f, + 0.985352f, 0.093933f, 0.986328f, 0.086853f, 0.987793f, 0.080200f, 0.988281f, 0.074097f, + 0.990723f, 0.067688f, 0.991211f, 0.062347f, 0.991211f, 0.057709f, 0.991699f, 0.053284f, + 0.992188f, 0.049255f, 0.992188f, 0.045624f, 0.992676f, 0.042114f, 0.992676f, 0.039001f, + 0.993164f, 0.035919f, 0.993652f, 0.033112f, 0.993652f, 0.030533f, 0.994141f, 0.028030f, + 0.994141f, 0.025833f, 0.994629f, 0.023590f, 0.995117f, 0.021576f, 0.995117f, 0.019699f, + 0.995605f, 0.017838f, 0.996094f, 0.016129f, 0.996094f, 0.014595f, 0.996582f, 0.013008f, + 0.997070f, 0.011490f, 0.998047f, 0.009964f, 0.999023f, 0.008308f, 0.999512f, 0.006680f, + 0.999512f, 0.005608f, 0.999512f, 0.004719f, 0.999512f, 0.003952f, 0.999512f, 0.003284f, + 0.999512f, 0.002697f, 0.999512f, 0.002180f, 0.999512f, 0.001732f, 0.999512f, 0.001344f, + 0.999512f, 0.001011f, 0.999512f, 0.000731f, 0.999512f, 0.000501f, 0.999512f, 0.000316f, + 0.999512f, 0.000176f, 0.999512f, 0.000078f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.732422f, 0.700195f, 0.843750f, 0.562500f, 0.891113f, 0.474854f, + 0.915527f, 0.411133f, 0.933105f, 0.360840f, 0.943359f, 0.321533f, 0.953125f, 0.287354f, + 0.959961f, 0.259033f, 0.963867f, 0.234863f, 0.967773f, 0.213867f, 0.971191f, 0.195190f, + 0.972656f, 0.179321f, 0.974121f, 0.165161f, 0.977539f, 0.151367f, 0.978027f, 0.139893f, + 0.980469f, 0.128662f, 0.982422f, 0.118286f, 0.983887f, 0.108887f, 0.984863f, 0.100525f, + 0.986328f, 0.092590f, 0.988281f, 0.085022f, 0.989746f, 0.077881f, 0.990234f, 0.071838f, + 0.990723f, 0.066345f, 0.991211f, 0.061340f, 0.991699f, 0.056702f, 0.991699f, 0.052582f, + 0.992188f, 0.048523f, 0.992676f, 0.044769f, 0.993164f, 0.041321f, 0.993164f, 0.038177f, + 0.993652f, 0.035095f, 0.994141f, 0.032257f, 0.994141f, 0.029739f, 0.994629f, 0.027176f, + 0.995117f, 0.024796f, 0.995605f, 0.022568f, 0.996094f, 0.020493f, 0.996582f, 0.018524f, + 0.997070f, 0.016556f, 0.997559f, 0.014664f, 0.998535f, 0.012726f, 0.999512f, 0.010612f, + 0.999512f, 0.009163f, 0.999512f, 0.007950f, 0.999512f, 0.006893f, 0.999512f, 0.005947f, + 0.999512f, 0.005100f, 0.999512f, 0.004341f, 0.999512f, 0.003664f, 0.999512f, 0.003057f, + 0.999512f, 0.002520f, 0.999512f, 0.002043f, 0.999512f, 0.001624f, 0.999512f, 0.001261f, + 0.999512f, 0.000949f, 0.999512f, 0.000686f, 0.999512f, 0.000469f, 0.999512f, 0.000296f, + 0.999512f, 0.000164f, 0.999512f, 0.000072f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.740234f, 0.697754f, 0.851074f, 0.559082f, 0.896973f, 0.471191f, + 0.921387f, 0.407471f, 0.937988f, 0.357666f, 0.947754f, 0.318115f, 0.955078f, 0.285645f, + 0.961426f, 0.256836f, 0.967285f, 0.231934f, 0.970215f, 0.211304f, 0.972656f, 0.193237f, + 0.976074f, 0.176636f, 0.977051f, 0.162231f, 0.978027f, 0.149658f, 0.979004f, 0.138306f, + 0.979980f, 0.128052f, 0.982422f, 0.117981f, 0.984863f, 0.107910f, 0.987793f, 0.098267f, + 0.988770f, 0.090393f, 0.989258f, 0.083374f, 0.989746f, 0.077026f, 0.990234f, 0.071167f, + 0.990723f, 0.065796f, 0.991211f, 0.060822f, 0.991699f, 0.056152f, 0.992188f, 0.051849f, + 0.992676f, 0.047821f, 0.993164f, 0.044037f, 0.993652f, 0.040527f, 0.994141f, 0.037231f, + 0.994629f, 0.034149f, 0.995117f, 0.031250f, 0.995605f, 0.028503f, 0.996094f, 0.025894f, + 0.996582f, 0.023407f, 0.997559f, 0.020950f, 0.998535f, 0.018417f, 0.999512f, 0.015823f, + 0.999512f, 0.013985f, 0.999512f, 0.012398f, 0.999512f, 0.010979f, 0.999512f, 0.009697f, + 0.999512f, 0.008537f, 0.999512f, 0.007484f, 0.999512f, 0.006527f, 0.999512f, 0.005657f, + 0.999512f, 0.004868f, 0.999512f, 0.004150f, 0.999512f, 0.003510f, 0.999512f, 0.002932f, + 0.999512f, 0.002417f, 0.999512f, 0.001961f, 0.999512f, 0.001559f, 0.999512f, 0.001210f, + 0.999512f, 0.000911f, 0.999512f, 0.000658f, 0.999512f, 0.000449f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000069f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.751465f, 0.693359f, 0.859863f, 0.555176f, 0.903320f, 0.467529f, + 0.927246f, 0.403809f, 0.939453f, 0.355957f, 0.951660f, 0.314941f, 0.957031f, 0.283203f, + 0.961914f, 0.255859f, 0.968262f, 0.230835f, 0.972656f, 0.209229f, 0.975586f, 0.190430f, + 0.977051f, 0.174683f, 0.978027f, 0.160767f, 0.979492f, 0.148071f, 0.981445f, 0.136230f, + 0.983887f, 0.124878f, 0.983887f, 0.115601f, 0.983887f, 0.107361f, 0.985840f, 0.099121f, + 0.987305f, 0.090942f, 0.988281f, 0.083740f, 0.989258f, 0.077148f, 0.990234f, 0.071106f, + 0.990723f, 0.065613f, 0.991699f, 0.060394f, 0.992188f, 0.055634f, 0.992676f, 0.051239f, + 0.993652f, 0.046967f, 0.994141f, 0.043091f, 0.995117f, 0.039368f, 0.995605f, 0.035858f, + 0.996582f, 0.032440f, 0.998047f, 0.029053f, 0.999512f, 0.025375f, 0.999512f, 0.022705f, + 0.999512f, 0.020432f, 0.999512f, 0.018387f, 0.999512f, 0.016541f, 0.999512f, 0.014847f, + 0.999512f, 0.013298f, 0.999512f, 0.011871f, 0.999512f, 0.010567f, 0.999512f, 0.009369f, + 0.999512f, 0.008263f, 0.999512f, 0.007259f, 0.999512f, 0.006340f, 0.999512f, 0.005501f, + 0.999512f, 0.004734f, 0.999512f, 0.004044f, 0.999512f, 0.003420f, 0.999512f, 0.002857f, + 0.999512f, 0.002356f, 0.999512f, 0.001912f, 0.999512f, 0.001520f, 0.999512f, 0.001180f, + 0.999512f, 0.000887f, 0.999512f, 0.000641f, 0.999512f, 0.000437f, 0.999512f, 0.000275f, + 0.999512f, 0.000152f, 0.999512f, 0.000067f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.756836f, 0.691406f, 0.863770f, 0.553711f, 0.907715f, 0.465332f, + 0.929688f, 0.402100f, 0.943848f, 0.353027f, 0.952637f, 0.313721f, 0.960449f, 0.281006f, + 0.968262f, 0.250977f, 0.968262f, 0.229614f, 0.968262f, 0.211304f, 0.976074f, 0.190552f, + 0.983887f, 0.170166f, 0.983887f, 0.156006f, 0.983887f, 0.143921f, 0.983887f, 0.133179f, + 0.983887f, 0.123535f, 0.983887f, 0.114746f, 0.983887f, 0.106750f, 0.983887f, 0.099426f, + 0.983887f, 0.092773f, 0.983887f, 0.086609f, 0.983887f, 0.080994f, 0.983887f, 0.075806f, + 0.987793f, 0.069763f, 0.993652f, 0.060974f, 0.999512f, 0.051910f, 0.999512f, 0.046509f, + 0.999512f, 0.042175f, 0.999512f, 0.038361f, 0.999512f, 0.034943f, 0.999512f, 0.031860f, + 0.999512f, 0.029022f, 0.999512f, 0.026413f, 0.999512f, 0.024017f, 0.999512f, 0.021790f, + 0.999512f, 0.019745f, 0.999512f, 0.017853f, 0.999512f, 0.016113f, 0.999512f, 0.014496f, + 0.999512f, 0.013008f, 0.999512f, 0.011635f, 0.999512f, 0.010361f, 0.999512f, 0.009193f, + 0.999512f, 0.008125f, 0.999512f, 0.007137f, 0.999512f, 0.006237f, 0.999512f, 0.005413f, + 0.999512f, 0.004662f, 0.999512f, 0.003983f, 0.999512f, 0.003368f, 0.999512f, 0.002815f, + 0.999512f, 0.002321f, 0.999512f, 0.001884f, 0.999512f, 0.001498f, 0.999512f, 0.001163f, + 0.999512f, 0.000875f, 0.999512f, 0.000631f, 0.999512f, 0.000431f, 0.999512f, 0.000271f, + 0.999512f, 0.000150f, 0.999512f, 0.000066f, 0.999512f, 0.000016f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.987305f, + 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.981934f, 0.000000f, 0.980957f, + 0.000000f, 0.978516f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f, + 0.000000f, 0.961426f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.931641f, + 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.773438f, 0.000000f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, + 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.980469f, + 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.967285f, + 0.000000f, 0.961914f, 0.000000f, 0.954590f, 0.000000f, 0.944824f, 0.000000f, 0.930176f, + 0.000000f, 0.908203f, 0.000000f, 0.867188f, 0.000000f, 0.772461f, 0.000000f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.982910f, 0.000000f, 0.979980f, + 0.000000f, 0.978027f, 0.000000f, 0.975098f, 0.000000f, 0.971191f, 0.000000f, 0.966797f, + 0.000000f, 0.961426f, 0.000000f, 0.954102f, 0.000000f, 0.944336f, 0.000000f, 0.929688f, + 0.000000f, 0.907227f, 0.000000f, 0.866699f, 0.000007f, 0.771973f, 0.000007f, 0.395020f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971191f, 0.000000f, 0.966309f, + 0.000000f, 0.960938f, 0.000000f, 0.953613f, 0.000000f, 0.943848f, 0.000000f, 0.929199f, + 0.000027f, 0.906250f, 0.000030f, 0.865723f, 0.000028f, 0.770508f, 0.000042f, 0.395264f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.980469f, + 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000000f, 0.970703f, 0.000000f, 0.965820f, + 0.000000f, 0.960449f, 0.000011f, 0.952637f, 0.000085f, 0.942871f, 0.000094f, 0.928223f, + 0.000083f, 0.904785f, 0.000068f, 0.864746f, 0.000085f, 0.769043f, 0.000143f, 0.394531f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, + 0.000000f, 0.984863f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979004f, + 0.000000f, 0.976562f, 0.000000f, 0.973633f, 0.000036f, 0.969727f, 0.000143f, 0.964844f, + 0.000211f, 0.959473f, 0.000218f, 0.951660f, 0.000199f, 0.940918f, 0.000170f, 0.926758f, + 0.000165f, 0.903320f, 0.000172f, 0.862305f, 0.000219f, 0.767090f, 0.000369f, 0.394043f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000035f, 0.980469f, 0.000132f, 0.978027f, + 0.000258f, 0.976074f, 0.000380f, 0.972168f, 0.000413f, 0.968750f, 0.000406f, 0.964355f, + 0.000374f, 0.958008f, 0.000326f, 0.951172f, 0.000273f, 0.939453f, 0.000341f, 0.924805f, + 0.000342f, 0.901855f, 0.000384f, 0.859863f, 0.000487f, 0.764160f, 0.000772f, 0.392578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f, + 0.000000f, 0.988281f, 0.000006f, 0.987305f, 0.000080f, 0.986328f, 0.000190f, 0.984863f, + 0.000316f, 0.983887f, 0.000461f, 0.981934f, 0.000606f, 0.979004f, 0.000681f, 0.977051f, + 0.000690f, 0.974609f, 0.000648f, 0.971680f, 0.000608f, 0.967285f, 0.000543f, 0.962891f, + 0.000481f, 0.956055f, 0.000492f, 0.949219f, 0.000596f, 0.937988f, 0.000579f, 0.922363f, + 0.000662f, 0.898438f, 0.000751f, 0.856445f, 0.000961f, 0.760254f, 0.001400f, 0.392578f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000005f, 0.991211f, 0.000077f, 0.990234f, 0.000188f, 0.989258f, 0.000316f, 0.988281f, + 0.000443f, 0.987793f, 0.000595f, 0.986328f, 0.000732f, 0.984863f, 0.000886f, 0.984375f, + 0.001008f, 0.982910f, 0.001045f, 0.980957f, 0.001004f, 0.978516f, 0.000961f, 0.976074f, + 0.000883f, 0.973633f, 0.000809f, 0.970215f, 0.000729f, 0.965820f, 0.000723f, 0.960938f, + 0.000833f, 0.955078f, 0.000936f, 0.946777f, 0.000917f, 0.935059f, 0.001021f, 0.920410f, + 0.001133f, 0.895508f, 0.001343f, 0.853027f, 0.001729f, 0.756348f, 0.002285f, 0.390869f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000017f, 0.994141f, + 0.000104f, 0.994141f, 0.000227f, 0.993652f, 0.000355f, 0.992676f, 0.000498f, 0.991211f, + 0.000638f, 0.990234f, 0.000788f, 0.989746f, 0.000919f, 0.988770f, 0.001076f, 0.988281f, + 0.001208f, 0.986816f, 0.001350f, 0.985352f, 0.001450f, 0.984375f, 0.001418f, 0.983398f, + 0.001376f, 0.981934f, 0.001293f, 0.979980f, 0.001182f, 0.977539f, 0.001104f, 0.974609f, + 0.001014f, 0.972168f, 0.001039f, 0.968750f, 0.001159f, 0.964844f, 0.001252f, 0.958984f, + 0.001333f, 0.953125f, 0.001381f, 0.943848f, 0.001481f, 0.932617f, 0.001649f, 0.916992f, + 0.001859f, 0.891602f, 0.002237f, 0.848633f, 0.002926f, 0.751953f, 0.003462f, 0.389648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000040f, 0.995605f, 0.000153f, 0.995117f, + 0.000294f, 0.994629f, 0.000424f, 0.994141f, 0.000585f, 0.994141f, 0.000718f, 0.994141f, + 0.000878f, 0.993652f, 0.001019f, 0.993164f, 0.001146f, 0.991699f, 0.001303f, 0.990723f, + 0.001431f, 0.989746f, 0.001550f, 0.989258f, 0.001698f, 0.988281f, 0.001820f, 0.986816f, + 0.001854f, 0.985840f, 0.001832f, 0.984863f, 0.001750f, 0.983398f, 0.001624f, 0.981934f, + 0.001518f, 0.980469f, 0.001418f, 0.978516f, 0.001394f, 0.976562f, 0.001472f, 0.973633f, + 0.001552f, 0.970703f, 0.001670f, 0.966797f, 0.001740f, 0.962402f, 0.001901f, 0.957031f, + 0.001957f, 0.950684f, 0.002113f, 0.941406f, 0.002382f, 0.930176f, 0.002567f, 0.913086f, + 0.002966f, 0.887695f, 0.003582f, 0.843750f, 0.004570f, 0.747559f, 0.004940f, 0.388672f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000081f, 0.996582f, 0.000211f, 0.996094f, 0.000374f, 0.995605f, + 0.000513f, 0.995605f, 0.000685f, 0.995117f, 0.000832f, 0.995117f, 0.000972f, 0.994629f, + 0.001134f, 0.994141f, 0.001264f, 0.994141f, 0.001389f, 0.994141f, 0.001542f, 0.993164f, + 0.001665f, 0.992676f, 0.001765f, 0.992188f, 0.001908f, 0.991211f, 0.002033f, 0.990723f, + 0.002134f, 0.989746f, 0.002230f, 0.988770f, 0.002295f, 0.986816f, 0.002226f, 0.985840f, + 0.002102f, 0.985352f, 0.001965f, 0.983398f, 0.001889f, 0.982422f, 0.001858f, 0.980469f, + 0.001908f, 0.979004f, 0.002033f, 0.977051f, 0.002071f, 0.975098f, 0.002214f, 0.972168f, + 0.002205f, 0.968262f, 0.002514f, 0.964355f, 0.002605f, 0.960449f, 0.002708f, 0.954590f, + 0.003017f, 0.947754f, 0.003201f, 0.937988f, 0.003536f, 0.926758f, 0.003925f, 0.908691f, + 0.004589f, 0.883301f, 0.005409f, 0.838379f, 0.006878f, 0.741699f, 0.006737f, 0.386963f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000099f, 0.997070f, 0.000259f, 0.997070f, 0.000438f, 0.997070f, 0.000601f, 0.997070f, + 0.000766f, 0.996582f, 0.000938f, 0.995605f, 0.001068f, 0.995605f, 0.001227f, 0.995117f, + 0.001379f, 0.995117f, 0.001497f, 0.995117f, 0.001614f, 0.994141f, 0.001767f, 0.994141f, + 0.001886f, 0.994141f, 0.001980f, 0.993164f, 0.002094f, 0.992676f, 0.002230f, 0.992188f, + 0.002335f, 0.991699f, 0.002417f, 0.991211f, 0.002512f, 0.990723f, 0.002642f, 0.990234f, + 0.002687f, 0.988770f, 0.002605f, 0.987305f, 0.002457f, 0.986328f, 0.002497f, 0.985352f, + 0.002485f, 0.983398f, 0.002590f, 0.982422f, 0.002542f, 0.980957f, 0.002718f, 0.979004f, + 0.002718f, 0.977051f, 0.002857f, 0.975098f, 0.002832f, 0.973145f, 0.003160f, 0.970215f, + 0.003370f, 0.965820f, 0.003563f, 0.962402f, 0.003788f, 0.958008f, 0.003960f, 0.951660f, + 0.004429f, 0.944336f, 0.004601f, 0.935059f, 0.005222f, 0.922363f, 0.005749f, 0.904785f, + 0.006695f, 0.877930f, 0.007942f, 0.832031f, 0.009933f, 0.735352f, 0.008850f, 0.385742f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000068f, 0.997559f, + 0.000257f, 0.997559f, 0.000426f, 0.997559f, 0.000647f, 0.997559f, 0.000798f, 0.997070f, + 0.000993f, 0.997070f, 0.001156f, 0.996582f, 0.001273f, 0.996582f, 0.001439f, 0.996094f, + 0.001589f, 0.995605f, 0.001698f, 0.995117f, 0.001786f, 0.995117f, 0.001953f, 0.995117f, + 0.002075f, 0.994629f, 0.002165f, 0.994141f, 0.002235f, 0.994141f, 0.002382f, 0.993164f, + 0.002499f, 0.992676f, 0.002586f, 0.992676f, 0.002653f, 0.992188f, 0.002747f, 0.991211f, + 0.002876f, 0.990723f, 0.002972f, 0.990234f, 0.003042f, 0.989746f, 0.003130f, 0.988770f, + 0.003382f, 0.987793f, 0.003345f, 0.986816f, 0.003380f, 0.985352f, 0.003344f, 0.983887f, + 0.003481f, 0.982422f, 0.003477f, 0.980957f, 0.003448f, 0.979004f, 0.003578f, 0.977051f, + 0.003624f, 0.975098f, 0.003941f, 0.973145f, 0.004395f, 0.971191f, 0.004524f, 0.967773f, + 0.004875f, 0.963867f, 0.004910f, 0.959473f, 0.005322f, 0.954590f, 0.005699f, 0.948242f, + 0.006184f, 0.940430f, 0.006596f, 0.930664f, 0.007393f, 0.916992f, 0.008186f, 0.898926f, + 0.009514f, 0.871582f, 0.011200f, 0.825195f, 0.013855f, 0.728516f, 0.011299f, 0.384277f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000107f, 0.998047f, + 0.000353f, 0.998047f, 0.000538f, 0.998047f, 0.000793f, 0.997559f, 0.000947f, 0.997559f, + 0.001143f, 0.997559f, 0.001317f, 0.997559f, 0.001431f, 0.997070f, 0.001572f, 0.996582f, + 0.001741f, 0.996582f, 0.001854f, 0.996094f, 0.001932f, 0.995605f, 0.002066f, 0.995117f, + 0.002211f, 0.995117f, 0.002310f, 0.995117f, 0.002380f, 0.994629f, 0.002445f, 0.994629f, + 0.002605f, 0.994141f, 0.002712f, 0.993164f, 0.002789f, 0.992676f, 0.002844f, 0.992676f, + 0.002920f, 0.992188f, 0.003061f, 0.991699f, 0.003157f, 0.990723f, 0.003262f, 0.990234f, + 0.003454f, 0.989746f, 0.003700f, 0.988770f, 0.004036f, 0.988281f, 0.004314f, 0.987793f, + 0.004581f, 0.986328f, 0.004810f, 0.985840f, 0.004524f, 0.983887f, 0.004539f, 0.982422f, + 0.004456f, 0.980957f, 0.004501f, 0.979004f, 0.004814f, 0.977051f, 0.004860f, 0.975098f, + 0.005329f, 0.973145f, 0.005432f, 0.970703f, 0.005981f, 0.967773f, 0.006279f, 0.964844f, + 0.006725f, 0.961426f, 0.006977f, 0.956543f, 0.007427f, 0.950684f, 0.007912f, 0.944336f, + 0.008675f, 0.936035f, 0.009331f, 0.925781f, 0.010490f, 0.912109f, 0.011497f, 0.892578f, + 0.013527f, 0.864746f, 0.015991f, 0.818848f, 0.019104f, 0.721191f, 0.014259f, 0.382324f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000003f, 0.998535f, + 0.000276f, 0.998535f, 0.000565f, 0.998047f, 0.000811f, 0.998047f, 0.001026f, 0.998047f, + 0.001139f, 0.998047f, 0.001387f, 0.997559f, 0.001530f, 0.997559f, 0.001613f, 0.997559f, + 0.001790f, 0.997070f, 0.001945f, 0.996582f, 0.002035f, 0.996582f, 0.002094f, 0.996094f, + 0.002249f, 0.996094f, 0.002392f, 0.995605f, 0.002478f, 0.995117f, 0.002535f, 0.995117f, + 0.002573f, 0.994629f, 0.002760f, 0.994629f, 0.002871f, 0.994141f, 0.002941f, 0.993164f, + 0.002987f, 0.992676f, 0.003021f, 0.992676f, 0.003185f, 0.992188f, 0.003370f, 0.991699f, + 0.003599f, 0.991211f, 0.003851f, 0.990234f, 0.004078f, 0.989746f, 0.004379f, 0.989258f, + 0.004696f, 0.988281f, 0.004971f, 0.987793f, 0.005173f, 0.986816f, 0.005405f, 0.985840f, + 0.005592f, 0.984863f, 0.005917f, 0.983887f, 0.006077f, 0.982422f, 0.006153f, 0.980957f, + 0.006176f, 0.979004f, 0.006241f, 0.977051f, 0.006302f, 0.974609f, 0.006836f, 0.972656f, + 0.007092f, 0.970703f, 0.007355f, 0.967773f, 0.007927f, 0.964844f, 0.008453f, 0.961426f, + 0.009369f, 0.958008f, 0.009750f, 0.952637f, 0.010284f, 0.946777f, 0.011345f, 0.939941f, + 0.012329f, 0.931641f, 0.013527f, 0.920410f, 0.014748f, 0.906250f, 0.016464f, 0.886230f, + 0.018951f, 0.857422f, 0.021957f, 0.810059f, 0.025940f, 0.713379f, 0.017838f, 0.380371f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000270f, 0.998535f, 0.000660f, 0.998535f, 0.000873f, 0.998535f, + 0.001148f, 0.998047f, 0.001250f, 0.998047f, 0.001494f, 0.998047f, 0.001652f, 0.998047f, + 0.001724f, 0.997559f, 0.001864f, 0.997559f, 0.002062f, 0.997559f, 0.002151f, 0.996582f, + 0.002199f, 0.996582f, 0.002304f, 0.996094f, 0.002497f, 0.996094f, 0.002590f, 0.995605f, + 0.002642f, 0.995117f, 0.002674f, 0.995117f, 0.002823f, 0.994629f, 0.002970f, 0.994629f, + 0.003046f, 0.994141f, 0.003092f, 0.993652f, 0.003122f, 0.992676f, 0.003353f, 0.992676f, + 0.003710f, 0.992188f, 0.004009f, 0.991699f, 0.004265f, 0.991211f, 0.004498f, 0.990234f, + 0.004688f, 0.989746f, 0.005035f, 0.989258f, 0.005318f, 0.988281f, 0.005550f, 0.987793f, + 0.005772f, 0.986816f, 0.005943f, 0.985840f, 0.006241f, 0.984863f, 0.006775f, 0.984375f, + 0.007229f, 0.982910f, 0.007591f, 0.981934f, 0.008018f, 0.980957f, 0.008026f, 0.979004f, + 0.007790f, 0.976562f, 0.008087f, 0.974121f, 0.008736f, 0.972656f, 0.008942f, 0.970215f, + 0.009209f, 0.967285f, 0.010017f, 0.964844f, 0.010544f, 0.960938f, 0.011604f, 0.957520f, + 0.012337f, 0.953613f, 0.013107f, 0.948242f, 0.013680f, 0.941895f, 0.015160f, 0.934570f, + 0.016724f, 0.925781f, 0.018051f, 0.914062f, 0.019882f, 0.898926f, 0.022644f, 0.878418f, + 0.025635f, 0.848633f, 0.029648f, 0.800781f, 0.034180f, 0.704590f, 0.022018f, 0.378418f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000373f, 0.999023f, + 0.000812f, 0.999023f, 0.001059f, 0.998535f, 0.001294f, 0.998535f, 0.001351f, 0.998535f, + 0.001667f, 0.998047f, 0.001781f, 0.998047f, 0.001822f, 0.998047f, 0.002035f, 0.997559f, + 0.002205f, 0.997559f, 0.002264f, 0.997070f, 0.002293f, 0.996582f, 0.002464f, 0.996094f, + 0.002642f, 0.996094f, 0.002708f, 0.995605f, 0.002741f, 0.995605f, 0.002760f, 0.995117f, + 0.002972f, 0.994629f, 0.003103f, 0.994629f, 0.003208f, 0.994141f, 0.003435f, 0.993164f, + 0.003674f, 0.992676f, 0.004002f, 0.992188f, 0.004398f, 0.992188f, 0.004677f, 0.991699f, + 0.004868f, 0.991211f, 0.005108f, 0.990234f, 0.005276f, 0.989746f, 0.005554f, 0.988770f, + 0.005890f, 0.988281f, 0.006107f, 0.987793f, 0.006401f, 0.986816f, 0.006790f, 0.986328f, + 0.007160f, 0.985352f, 0.007626f, 0.984375f, 0.008057f, 0.982910f, 0.008499f, 0.981934f, + 0.008881f, 0.980957f, 0.009407f, 0.979492f, 0.009865f, 0.978516f, 0.010544f, 0.976074f, + 0.010498f, 0.974121f, 0.010765f, 0.972168f, 0.011108f, 0.969238f, 0.011467f, 0.966797f, + 0.012344f, 0.963867f, 0.013023f, 0.960938f, 0.013771f, 0.957031f, 0.015007f, 0.953125f, + 0.016052f, 0.948242f, 0.017639f, 0.943359f, 0.018082f, 0.936523f, 0.019928f, 0.928223f, + 0.021805f, 0.918457f, 0.023819f, 0.906738f, 0.026581f, 0.891113f, 0.029816f, 0.870117f, + 0.033569f, 0.839355f, 0.038696f, 0.790527f, 0.044037f, 0.695312f, 0.026749f, 0.376465f, + 0.000000f, 1.000000f, 0.000245f, 0.999512f, 0.000803f, 0.999023f, 0.000926f, 0.999023f, + 0.001336f, 0.999023f, 0.001398f, 0.998535f, 0.001638f, 0.998535f, 0.001838f, 0.998535f, + 0.001872f, 0.998047f, 0.001908f, 0.998047f, 0.002268f, 0.997559f, 0.002325f, 0.997070f, + 0.002344f, 0.996582f, 0.002382f, 0.996094f, 0.002712f, 0.996094f, 0.002777f, 0.995605f, + 0.002802f, 0.995605f, 0.002815f, 0.995117f, 0.003098f, 0.994629f, 0.003525f, 0.994141f, + 0.003832f, 0.994141f, 0.004070f, 0.993164f, 0.004311f, 0.993164f, 0.004520f, 0.992188f, + 0.004959f, 0.992188f, 0.005264f, 0.991211f, 0.005451f, 0.990723f, 0.005577f, 0.990234f, + 0.005775f, 0.989746f, 0.006027f, 0.988770f, 0.006561f, 0.988281f, 0.006958f, 0.987305f, + 0.007374f, 0.986328f, 0.007751f, 0.985840f, 0.008026f, 0.985352f, 0.008339f, 0.983887f, + 0.008965f, 0.982910f, 0.009529f, 0.981934f, 0.010063f, 0.980469f, 0.010513f, 0.979492f, + 0.011055f, 0.978027f, 0.011642f, 0.976562f, 0.012451f, 0.974609f, 0.013245f, 0.973633f, + 0.013947f, 0.971191f, 0.014046f, 0.968750f, 0.014503f, 0.965820f, 0.015038f, 0.962891f, + 0.015869f, 0.959473f, 0.016739f, 0.956055f, 0.018143f, 0.952148f, 0.019302f, 0.947754f, + 0.020859f, 0.942871f, 0.022507f, 0.937500f, 0.024368f, 0.930176f, 0.025970f, 0.920898f, + 0.028061f, 0.911133f, 0.031021f, 0.898438f, 0.034332f, 0.881836f, 0.038513f, 0.859375f, + 0.043457f, 0.828613f, 0.049591f, 0.779785f, 0.055145f, 0.685547f, 0.031860f, 0.373779f, + 0.000000f, 1.000000f, 0.000577f, 0.999512f, 0.000956f, 0.999023f, 0.001399f, 0.999023f, + 0.001432f, 0.999023f, 0.001722f, 0.998535f, 0.001894f, 0.998535f, 0.001909f, 0.998535f, + 0.002020f, 0.997559f, 0.002350f, 0.997070f, 0.002375f, 0.996582f, 0.002384f, 0.996582f, + 0.002625f, 0.996094f, 0.002811f, 0.995605f, 0.002958f, 0.995605f, 0.003267f, 0.995117f, + 0.003553f, 0.994629f, 0.004128f, 0.994141f, 0.004436f, 0.993652f, 0.004669f, 0.993164f, + 0.004810f, 0.992676f, 0.005035f, 0.992676f, 0.005444f, 0.991699f, 0.005692f, 0.990723f, + 0.005886f, 0.990234f, 0.006180f, 0.990234f, 0.006512f, 0.989258f, 0.006855f, 0.989258f, + 0.007500f, 0.987793f, 0.007988f, 0.986816f, 0.008286f, 0.986328f, 0.008606f, 0.985352f, + 0.008919f, 0.984863f, 0.009438f, 0.983398f, 0.010124f, 0.982422f, 0.010773f, 0.981445f, + 0.011215f, 0.980469f, 0.011795f, 0.979492f, 0.012459f, 0.978027f, 0.013077f, 0.976074f, + 0.013763f, 0.974609f, 0.014641f, 0.973145f, 0.015617f, 0.971191f, 0.016464f, 0.969238f, + 0.017410f, 0.967285f, 0.018036f, 0.964844f, 0.018204f, 0.961426f, 0.019211f, 0.958496f, + 0.020309f, 0.954590f, 0.021881f, 0.950684f, 0.022934f, 0.946289f, 0.024429f, 0.941406f, + 0.026596f, 0.936035f, 0.028809f, 0.929688f, 0.031281f, 0.922363f, 0.033020f, 0.912598f, + 0.036499f, 0.902344f, 0.039734f, 0.889160f, 0.043915f, 0.871094f, 0.048889f, 0.848633f, + 0.055298f, 0.816895f, 0.061951f, 0.767578f, 0.068115f, 0.675293f, 0.037598f, 0.372070f, + 0.000000f, 1.000000f, 0.000963f, 0.999512f, 0.000969f, 0.999023f, 0.001447f, 0.999023f, + 0.001451f, 0.999023f, 0.001914f, 0.998535f, 0.001927f, 0.998047f, 0.001930f, 0.997559f, + 0.002380f, 0.997070f, 0.002399f, 0.996582f, 0.002466f, 0.996582f, 0.002817f, 0.996094f, + 0.003546f, 0.995605f, 0.003870f, 0.995117f, 0.004055f, 0.994629f, 0.004333f, 0.994141f, + 0.004875f, 0.993652f, 0.005100f, 0.993164f, 0.005310f, 0.992676f, 0.005421f, 0.992188f, + 0.005520f, 0.991699f, 0.006332f, 0.990723f, 0.006786f, 0.990234f, 0.007133f, 0.989746f, + 0.007454f, 0.989258f, 0.007881f, 0.988281f, 0.008163f, 0.987305f, 0.008827f, 0.986328f, + 0.009216f, 0.985840f, 0.009750f, 0.984863f, 0.010353f, 0.983887f, 0.010826f, 0.982910f, + 0.011192f, 0.981934f, 0.011971f, 0.980469f, 0.012756f, 0.979492f, 0.013428f, 0.978516f, + 0.014076f, 0.977051f, 0.014725f, 0.975586f, 0.015457f, 0.974121f, 0.016266f, 0.972656f, + 0.017441f, 0.970703f, 0.018463f, 0.968750f, 0.019501f, 0.966797f, 0.020523f, 0.964844f, + 0.021591f, 0.961914f, 0.022903f, 0.959473f, 0.023834f, 0.956055f, 0.024933f, 0.952148f, + 0.026093f, 0.948242f, 0.027512f, 0.943848f, 0.029205f, 0.939453f, 0.031494f, 0.934082f, + 0.033783f, 0.928223f, 0.036377f, 0.921387f, 0.039734f, 0.913574f, 0.042084f, 0.903320f, + 0.045929f, 0.891602f, 0.050568f, 0.877930f, 0.055298f, 0.859863f, 0.061310f, 0.835938f, + 0.068359f, 0.803223f, 0.076477f, 0.754395f, 0.081848f, 0.663574f, 0.043427f, 0.369141f, + 0.000000f, 1.000000f, 0.000971f, 0.999512f, 0.000973f, 0.999023f, 0.001456f, 0.999023f, + 0.001457f, 0.998535f, 0.001935f, 0.997559f, 0.001939f, 0.997559f, 0.002092f, 0.997070f, + 0.003004f, 0.996582f, 0.003340f, 0.996582f, 0.003593f, 0.996094f, 0.004284f, 0.995117f, + 0.004524f, 0.994629f, 0.004623f, 0.994141f, 0.004879f, 0.993652f, 0.005444f, 0.993164f, + 0.005650f, 0.992676f, 0.006119f, 0.991699f, 0.006615f, 0.991211f, 0.006943f, 0.990723f, + 0.007660f, 0.989746f, 0.008049f, 0.989258f, 0.008415f, 0.988281f, 0.008781f, 0.987793f, + 0.009216f, 0.986816f, 0.009674f, 0.985840f, 0.010689f, 0.984863f, 0.011253f, 0.983887f, + 0.011597f, 0.983398f, 0.012230f, 0.981934f, 0.012833f, 0.980957f, 0.013466f, 0.979980f, + 0.014526f, 0.979004f, 0.015244f, 0.977051f, 0.016022f, 0.976074f, 0.016800f, 0.974609f, + 0.017502f, 0.973145f, 0.018478f, 0.971191f, 0.019547f, 0.969727f, 0.020920f, 0.967285f, + 0.022003f, 0.965820f, 0.022995f, 0.963379f, 0.024261f, 0.960938f, 0.025864f, 0.958496f, + 0.027252f, 0.956055f, 0.028931f, 0.953125f, 0.030823f, 0.949707f, 0.031403f, 0.945312f, + 0.032990f, 0.940918f, 0.034912f, 0.936035f, 0.037384f, 0.930664f, 0.039673f, 0.925293f, + 0.042664f, 0.917969f, 0.046173f, 0.911133f, 0.049896f, 0.902344f, 0.053223f, 0.892090f, + 0.057831f, 0.879883f, 0.063171f, 0.864746f, 0.069031f, 0.846191f, 0.076172f, 0.821777f, + 0.083740f, 0.788574f, 0.092651f, 0.740234f, 0.097351f, 0.652832f, 0.050079f, 0.366699f, + 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000975f, 0.999023f, 0.001460f, 0.998535f, + 0.001460f, 0.998047f, 0.002518f, 0.997559f, 0.002815f, 0.997070f, 0.003202f, 0.997070f, + 0.003866f, 0.996094f, 0.004158f, 0.995605f, 0.004234f, 0.994629f, 0.004986f, 0.994141f, + 0.005264f, 0.993652f, 0.005692f, 0.993164f, 0.006222f, 0.992188f, 0.007107f, 0.991699f, + 0.007488f, 0.991211f, 0.007702f, 0.990234f, 0.008072f, 0.989258f, 0.008713f, 0.988770f, + 0.009651f, 0.987793f, 0.010132f, 0.986816f, 0.010620f, 0.985840f, 0.011185f, 0.984863f, + 0.011688f, 0.984375f, 0.012856f, 0.983398f, 0.013496f, 0.981934f, 0.014046f, 0.980469f, + 0.014732f, 0.979492f, 0.015579f, 0.979004f, 0.016418f, 0.977051f, 0.017563f, 0.975586f, + 0.018387f, 0.974609f, 0.019180f, 0.972656f, 0.020233f, 0.971191f, 0.021393f, 0.969727f, + 0.022507f, 0.967773f, 0.023453f, 0.966309f, 0.024918f, 0.963867f, 0.026398f, 0.961914f, + 0.027878f, 0.958984f, 0.029266f, 0.957031f, 0.030899f, 0.954102f, 0.032440f, 0.951172f, + 0.034302f, 0.948730f, 0.036621f, 0.944824f, 0.038757f, 0.941406f, 0.040710f, 0.937012f, + 0.042358f, 0.931641f, 0.044586f, 0.926270f, 0.047211f, 0.920410f, 0.050385f, 0.914062f, + 0.053802f, 0.906738f, 0.058014f, 0.898926f, 0.062286f, 0.889160f, 0.067322f, 0.878906f, + 0.071838f, 0.865234f, 0.078125f, 0.849609f, 0.085205f, 0.830566f, 0.093201f, 0.806152f, + 0.101746f, 0.773438f, 0.111084f, 0.725098f, 0.114075f, 0.639648f, 0.056793f, 0.364014f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000976f, 0.998535f, 0.002205f, 0.998535f, + 0.002550f, 0.998047f, 0.003315f, 0.997070f, 0.003639f, 0.996582f, 0.003796f, 0.996094f, + 0.004322f, 0.995117f, 0.005199f, 0.994629f, 0.005642f, 0.994141f, 0.006428f, 0.993164f, + 0.007088f, 0.992188f, 0.007362f, 0.991699f, 0.008125f, 0.991211f, 0.008850f, 0.989746f, + 0.009590f, 0.988770f, 0.010017f, 0.988281f, 0.010590f, 0.987305f, 0.011436f, 0.985840f, + 0.012314f, 0.984863f, 0.013145f, 0.983887f, 0.013710f, 0.983398f, 0.014374f, 0.981934f, + 0.015480f, 0.980469f, 0.016418f, 0.979492f, 0.017349f, 0.978027f, 0.018265f, 0.976562f, + 0.019119f, 0.975098f, 0.019897f, 0.974121f, 0.021240f, 0.972168f, 0.022629f, 0.970703f, + 0.023834f, 0.968750f, 0.024841f, 0.967285f, 0.025955f, 0.965332f, 0.027298f, 0.963379f, + 0.028702f, 0.961426f, 0.030472f, 0.958984f, 0.032257f, 0.956543f, 0.033752f, 0.954102f, + 0.035583f, 0.951172f, 0.037323f, 0.948730f, 0.039307f, 0.945312f, 0.041382f, 0.942383f, + 0.044037f, 0.938477f, 0.046600f, 0.934570f, 0.049225f, 0.930176f, 0.051971f, 0.925781f, + 0.054230f, 0.920410f, 0.056580f, 0.914551f, 0.060120f, 0.907715f, 0.064270f, 0.900879f, + 0.068237f, 0.892578f, 0.072754f, 0.883789f, 0.077759f, 0.874512f, 0.083923f, 0.863281f, + 0.089172f, 0.848633f, 0.096558f, 0.832520f, 0.104370f, 0.812988f, 0.113342f, 0.788574f, + 0.122498f, 0.756348f, 0.130859f, 0.708984f, 0.131836f, 0.626953f, 0.063965f, 0.361572f, + 0.000000f, 1.000000f, 0.000395f, 0.999512f, 0.001424f, 0.999023f, 0.002377f, 0.998535f, + 0.002939f, 0.997070f, 0.003412f, 0.996582f, 0.004543f, 0.995605f, 0.005405f, 0.995117f, + 0.006119f, 0.994141f, 0.006512f, 0.993164f, 0.007229f, 0.992676f, 0.008499f, 0.991211f, + 0.009064f, 0.990234f, 0.009689f, 0.989258f, 0.010941f, 0.988281f, 0.011620f, 0.987305f, + 0.012344f, 0.985840f, 0.012970f, 0.984863f, 0.014038f, 0.983887f, 0.015350f, 0.982422f, + 0.016159f, 0.980957f, 0.016708f, 0.979980f, 0.017883f, 0.979004f, 0.019211f, 0.977051f, + 0.020493f, 0.975586f, 0.021347f, 0.974121f, 0.022568f, 0.972656f, 0.023804f, 0.971191f, + 0.024948f, 0.969238f, 0.026688f, 0.967773f, 0.028137f, 0.965820f, 0.029465f, 0.963379f, + 0.030838f, 0.961426f, 0.032440f, 0.959961f, 0.033844f, 0.957520f, 0.035675f, 0.955078f, + 0.037903f, 0.952148f, 0.039825f, 0.949707f, 0.041687f, 0.947266f, 0.043823f, 0.943848f, + 0.045959f, 0.940918f, 0.048126f, 0.937988f, 0.050842f, 0.934082f, 0.053833f, 0.930176f, + 0.056641f, 0.925781f, 0.059662f, 0.921875f, 0.062805f, 0.916992f, 0.066223f, 0.912109f, + 0.069458f, 0.906250f, 0.072571f, 0.899414f, 0.076965f, 0.892090f, 0.081360f, 0.884277f, + 0.085938f, 0.875488f, 0.091248f, 0.866211f, 0.097473f, 0.856445f, 0.103882f, 0.844238f, + 0.110474f, 0.829590f, 0.118530f, 0.812988f, 0.126831f, 0.793457f, 0.135620f, 0.768555f, + 0.145020f, 0.736816f, 0.153198f, 0.691406f, 0.151123f, 0.614258f, 0.071289f, 0.359131f, + 0.000000f, 1.000000f, 0.000962f, 0.999512f, 0.001439f, 0.998535f, 0.002554f, 0.997559f, + 0.003811f, 0.997070f, 0.005028f, 0.995117f, 0.006145f, 0.994141f, 0.006886f, 0.993652f, + 0.008606f, 0.992188f, 0.009026f, 0.991211f, 0.009689f, 0.990234f, 0.011497f, 0.988281f, + 0.012352f, 0.987793f, 0.012962f, 0.986328f, 0.014587f, 0.984863f, 0.015854f, 0.983398f, + 0.016708f, 0.981934f, 0.017578f, 0.980469f, 0.019485f, 0.979004f, 0.020477f, 0.977539f, + 0.021667f, 0.976074f, 0.022995f, 0.974121f, 0.024353f, 0.972656f, 0.026062f, 0.970703f, + 0.027344f, 0.969238f, 0.028809f, 0.967285f, 0.030365f, 0.965332f, 0.032043f, 0.963379f, + 0.033508f, 0.960938f, 0.035767f, 0.958984f, 0.037415f, 0.956543f, 0.039124f, 0.954102f, + 0.041016f, 0.951660f, 0.043274f, 0.949219f, 0.045135f, 0.946289f, 0.048004f, 0.943359f, + 0.050171f, 0.940430f, 0.052429f, 0.937500f, 0.054993f, 0.934082f, 0.057465f, 0.930664f, + 0.060394f, 0.927246f, 0.063293f, 0.923340f, 0.066895f, 0.918945f, 0.070129f, 0.914551f, + 0.073547f, 0.910156f, 0.077148f, 0.905273f, 0.080933f, 0.899902f, 0.085022f, 0.894531f, + 0.089539f, 0.888184f, 0.093933f, 0.880371f, 0.098022f, 0.872559f, 0.103088f, 0.864258f, + 0.108459f, 0.855469f, 0.114746f, 0.845703f, 0.121277f, 0.834473f, 0.128906f, 0.821777f, + 0.136108f, 0.807617f, 0.144043f, 0.790527f, 0.153198f, 0.771484f, 0.161133f, 0.747070f, + 0.170654f, 0.716309f, 0.177002f, 0.673340f, 0.171265f, 0.600098f, 0.078857f, 0.355957f, + 0.000000f, 1.000000f, 0.001053f, 0.999023f, 0.002396f, 0.998047f, 0.003359f, 0.997070f, + 0.005081f, 0.996094f, 0.006599f, 0.994141f, 0.008163f, 0.992676f, 0.009956f, 0.991211f, + 0.011086f, 0.989746f, 0.012733f, 0.988281f, 0.013992f, 0.986328f, 0.015976f, 0.984863f, + 0.017044f, 0.982910f, 0.018158f, 0.981934f, 0.020569f, 0.979492f, 0.021790f, 0.978027f, + 0.023392f, 0.976074f, 0.024780f, 0.974121f, 0.026947f, 0.972168f, 0.028748f, 0.969727f, + 0.030258f, 0.968262f, 0.031952f, 0.965820f, 0.034058f, 0.963867f, 0.035858f, 0.961426f, + 0.037933f, 0.958984f, 0.040161f, 0.956543f, 0.041992f, 0.954590f, 0.044159f, 0.951660f, + 0.046661f, 0.949219f, 0.048737f, 0.946777f, 0.051392f, 0.943848f, 0.053741f, 0.940430f, + 0.056427f, 0.937988f, 0.058868f, 0.934570f, 0.062012f, 0.931152f, 0.064697f, 0.927734f, + 0.067566f, 0.924316f, 0.070435f, 0.920898f, 0.073975f, 0.916992f, 0.077271f, 0.913086f, + 0.080750f, 0.908691f, 0.084717f, 0.903809f, 0.088440f, 0.899414f, 0.092346f, 0.894531f, + 0.096375f, 0.889160f, 0.100769f, 0.883789f, 0.105652f, 0.877930f, 0.110413f, 0.871582f, + 0.115967f, 0.864746f, 0.120972f, 0.856934f, 0.125610f, 0.849121f, 0.131226f, 0.839844f, + 0.137085f, 0.830566f, 0.143677f, 0.820312f, 0.150757f, 0.808594f, 0.158813f, 0.795898f, + 0.166870f, 0.781738f, 0.174194f, 0.765137f, 0.182739f, 0.746094f, 0.190308f, 0.723145f, + 0.198608f, 0.693359f, 0.202637f, 0.653320f, 0.191772f, 0.585938f, 0.086670f, 0.351562f, + 0.000000f, 1.000000f, 0.001943f, 0.998535f, 0.003834f, 0.997559f, 0.005642f, 0.996094f, + 0.007874f, 0.994141f, 0.009254f, 0.992676f, 0.012169f, 0.989746f, 0.014473f, 0.987793f, + 0.016052f, 0.985352f, 0.018738f, 0.983398f, 0.020691f, 0.980957f, 0.022552f, 0.979004f, + 0.025436f, 0.976074f, 0.027466f, 0.973633f, 0.029816f, 0.971191f, 0.031769f, 0.969238f, + 0.034424f, 0.966309f, 0.036652f, 0.963867f, 0.039337f, 0.960938f, 0.041473f, 0.958496f, + 0.043732f, 0.956055f, 0.046631f, 0.953125f, 0.049469f, 0.950195f, 0.052277f, 0.947266f, + 0.054626f, 0.944336f, 0.057281f, 0.941406f, 0.059906f, 0.938477f, 0.063171f, 0.935059f, + 0.066528f, 0.931641f, 0.069580f, 0.928223f, 0.072571f, 0.924805f, 0.075806f, 0.921387f, + 0.078918f, 0.917480f, 0.082520f, 0.913574f, 0.085876f, 0.910156f, 0.089905f, 0.905762f, + 0.093689f, 0.901367f, 0.097412f, 0.897461f, 0.101440f, 0.893066f, 0.105408f, 0.888184f, + 0.109924f, 0.883301f, 0.114136f, 0.878418f, 0.118469f, 0.873047f, 0.123413f, 0.867676f, + 0.128418f, 0.861816f, 0.133423f, 0.855469f, 0.138672f, 0.849121f, 0.144531f, 0.842285f, + 0.150024f, 0.835449f, 0.155762f, 0.827637f, 0.160522f, 0.819336f, 0.166260f, 0.810059f, + 0.173096f, 0.799805f, 0.179810f, 0.789551f, 0.187134f, 0.777832f, 0.194458f, 0.765625f, + 0.202515f, 0.752441f, 0.208740f, 0.736328f, 0.215942f, 0.718750f, 0.222900f, 0.696777f, + 0.229248f, 0.668945f, 0.229858f, 0.632324f, 0.213501f, 0.571289f, 0.094788f, 0.347900f, + 0.000000f, 1.000000f, 0.003086f, 0.998047f, 0.007225f, 0.995605f, 0.009949f, 0.993164f, + 0.012535f, 0.991211f, 0.015930f, 0.987793f, 0.018707f, 0.984863f, 0.022659f, 0.981445f, + 0.026367f, 0.977539f, 0.029541f, 0.974609f, 0.033234f, 0.970703f, 0.036530f, 0.967285f, + 0.039795f, 0.964355f, 0.042908f, 0.960938f, 0.046173f, 0.957520f, 0.050262f, 0.953613f, + 0.053436f, 0.950195f, 0.056366f, 0.946777f, 0.060455f, 0.942871f, 0.064270f, 0.939453f, + 0.067749f, 0.935547f, 0.071045f, 0.932129f, 0.074890f, 0.928223f, 0.078186f, 0.924805f, + 0.082153f, 0.920898f, 0.086365f, 0.916992f, 0.090088f, 0.912598f, 0.094238f, 0.908691f, + 0.098083f, 0.904785f, 0.101868f, 0.900879f, 0.105530f, 0.896484f, 0.109924f, 0.892090f, + 0.114990f, 0.887695f, 0.119324f, 0.882812f, 0.123535f, 0.878418f, 0.127808f, 0.873535f, + 0.132202f, 0.869141f, 0.136475f, 0.864258f, 0.140869f, 0.859375f, 0.145874f, 0.854492f, + 0.151123f, 0.848633f, 0.156494f, 0.843262f, 0.161621f, 0.837402f, 0.166748f, 0.831055f, + 0.171875f, 0.825195f, 0.177124f, 0.818848f, 0.182983f, 0.812500f, 0.188477f, 0.805664f, + 0.193970f, 0.798828f, 0.200195f, 0.791016f, 0.205811f, 0.782715f, 0.211670f, 0.772949f, + 0.217163f, 0.763184f, 0.223633f, 0.753418f, 0.229858f, 0.742676f, 0.236572f, 0.731445f, + 0.242920f, 0.719238f, 0.247925f, 0.704590f, 0.254150f, 0.687500f, 0.259033f, 0.667969f, + 0.261230f, 0.643066f, 0.257812f, 0.610840f, 0.235962f, 0.556152f, 0.103333f, 0.343750f, + 0.000000f, 1.000000f, 0.006245f, 0.997070f, 0.011818f, 0.993164f, 0.018555f, 0.987793f, + 0.024384f, 0.982422f, 0.029861f, 0.978027f, 0.035645f, 0.972168f, 0.039703f, 0.968262f, + 0.046875f, 0.961914f, 0.052338f, 0.956543f, 0.058197f, 0.951660f, 0.064209f, 0.945801f, + 0.068970f, 0.940918f, 0.073914f, 0.935547f, 0.079529f, 0.930664f, 0.085510f, 0.925293f, + 0.090149f, 0.920410f, 0.094788f, 0.915527f, 0.100220f, 0.910645f, 0.105225f, 0.905762f, + 0.110718f, 0.900391f, 0.115540f, 0.895508f, 0.120728f, 0.890625f, 0.125732f, 0.885742f, + 0.130249f, 0.881348f, 0.134766f, 0.876953f, 0.140381f, 0.871582f, 0.145874f, 0.866699f, + 0.150757f, 0.861816f, 0.155396f, 0.856934f, 0.160522f, 0.852051f, 0.165161f, 0.847168f, + 0.170166f, 0.842285f, 0.174805f, 0.837402f, 0.179321f, 0.832520f, 0.184692f, 0.827637f, + 0.190063f, 0.822266f, 0.194946f, 0.816895f, 0.200806f, 0.811523f, 0.205566f, 0.806152f, + 0.210449f, 0.800781f, 0.215210f, 0.794922f, 0.219971f, 0.789551f, 0.224731f, 0.784180f, + 0.229370f, 0.778320f, 0.235107f, 0.772461f, 0.240723f, 0.765625f, 0.246094f, 0.758789f, + 0.251465f, 0.751953f, 0.256836f, 0.745117f, 0.261719f, 0.737793f, 0.265381f, 0.729492f, + 0.270020f, 0.720703f, 0.275146f, 0.711914f, 0.279297f, 0.702637f, 0.283691f, 0.692871f, + 0.289062f, 0.681641f, 0.292480f, 0.668457f, 0.295654f, 0.653809f, 0.297363f, 0.637207f, + 0.295654f, 0.616211f, 0.286865f, 0.588867f, 0.256836f, 0.541992f, 0.112183f, 0.339355f, + 0.000000f, 1.000000f, 0.015884f, 0.992676f, 0.029770f, 0.982910f, 0.042358f, 0.972656f, + 0.056458f, 0.961426f, 0.068359f, 0.950684f, 0.078735f, 0.941406f, 0.090088f, 0.931641f, + 0.099548f, 0.922363f, 0.107239f, 0.914551f, 0.119019f, 0.905273f, 0.127930f, 0.896484f, + 0.135010f, 0.889160f, 0.143433f, 0.881836f, 0.152466f, 0.874023f, 0.159546f, 0.866699f, + 0.166870f, 0.860352f, 0.173340f, 0.854004f, 0.179443f, 0.848145f, 0.186035f, 0.841797f, + 0.192749f, 0.835938f, 0.199341f, 0.829590f, 0.205322f, 0.824219f, 0.210938f, 0.818359f, + 0.215820f, 0.813477f, 0.220581f, 0.809082f, 0.225708f, 0.803711f, 0.231567f, 0.798828f, + 0.237183f, 0.793457f, 0.242310f, 0.788086f, 0.247192f, 0.783691f, 0.252441f, 0.778320f, + 0.256592f, 0.773926f, 0.260742f, 0.769043f, 0.264893f, 0.764648f, 0.269287f, 0.760254f, + 0.272949f, 0.755859f, 0.277100f, 0.751465f, 0.281494f, 0.747070f, 0.286133f, 0.741699f, + 0.290527f, 0.736816f, 0.294678f, 0.731934f, 0.298584f, 0.727051f, 0.302490f, 0.722168f, + 0.306396f, 0.717285f, 0.310059f, 0.711914f, 0.313477f, 0.707031f, 0.316895f, 0.702148f, + 0.319824f, 0.696777f, 0.322754f, 0.691406f, 0.325439f, 0.686035f, 0.327393f, 0.680176f, + 0.330811f, 0.671875f, 0.333984f, 0.664062f, 0.336670f, 0.656250f, 0.338623f, 0.648438f, + 0.340576f, 0.639160f, 0.340576f, 0.629395f, 0.340088f, 0.618164f, 0.337402f, 0.604980f, + 0.330811f, 0.589844f, 0.316650f, 0.567871f, 0.280762f, 0.523438f, 0.121033f, 0.335205f, + 0.000000f, 1.000000f, 0.076538f, 0.966309f, 0.127197f, 0.929688f, 0.163330f, 0.899902f, + 0.191895f, 0.874512f, 0.210693f, 0.855469f, 0.232666f, 0.834961f, 0.246704f, 0.820312f, + 0.258301f, 0.808105f, 0.271729f, 0.794922f, 0.281250f, 0.784668f, 0.288330f, 0.776367f, + 0.296387f, 0.767578f, 0.304932f, 0.759277f, 0.313477f, 0.751465f, 0.320312f, 0.744141f, + 0.325195f, 0.738281f, 0.330078f, 0.732910f, 0.333740f, 0.728516f, 0.338135f, 0.723633f, + 0.341064f, 0.719727f, 0.343262f, 0.716309f, 0.349365f, 0.711426f, 0.354248f, 0.706543f, + 0.358154f, 0.702637f, 0.361816f, 0.698730f, 0.364746f, 0.695312f, 0.367188f, 0.691895f, + 0.369141f, 0.688965f, 0.371094f, 0.686035f, 0.373535f, 0.683105f, 0.375244f, 0.680176f, + 0.376953f, 0.677734f, 0.378906f, 0.675293f, 0.380127f, 0.672852f, 0.381104f, 0.670410f, + 0.382324f, 0.667969f, 0.383545f, 0.665527f, 0.386475f, 0.662109f, 0.389160f, 0.659180f, + 0.391113f, 0.656250f, 0.392822f, 0.653320f, 0.394775f, 0.649902f, 0.396484f, 0.646973f, + 0.397705f, 0.643555f, 0.398193f, 0.640625f, 0.399170f, 0.637695f, 0.399902f, 0.634277f, + 0.400635f, 0.631348f, 0.400879f, 0.627930f, 0.401123f, 0.624512f, 0.401123f, 0.620605f, + 0.399414f, 0.615723f, 0.397949f, 0.611328f, 0.396729f, 0.606445f, 0.394531f, 0.602051f, + 0.391846f, 0.596680f, 0.388428f, 0.591309f, 0.383057f, 0.583984f, 0.376953f, 0.574707f, + 0.368408f, 0.560059f, 0.349609f, 0.540039f, 0.305664f, 0.502930f, 0.130005f, 0.332275f, + 0.000000f, 1.000000f, 0.301025f, 0.870605f, 0.355713f, 0.809082f, 0.382324f, 0.770508f, + 0.398438f, 0.743164f, 0.410156f, 0.722168f, 0.418701f, 0.706055f, 0.426514f, 0.692383f, + 0.432861f, 0.681152f, 0.437256f, 0.672363f, 0.440674f, 0.664551f, 0.443848f, 0.658203f, + 0.447266f, 0.652344f, 0.450928f, 0.645996f, 0.453613f, 0.641113f, 0.455811f, 0.636719f, + 0.458008f, 0.632812f, 0.460449f, 0.628906f, 0.462402f, 0.625977f, 0.464355f, 0.622559f, + 0.465332f, 0.619629f, 0.466553f, 0.617188f, 0.468018f, 0.614746f, 0.469727f, 0.612305f, + 0.470703f, 0.610352f, 0.471924f, 0.607910f, 0.472656f, 0.605957f, 0.473877f, 0.604004f, + 0.474609f, 0.602051f, 0.475586f, 0.600098f, 0.476807f, 0.598145f, 0.477539f, 0.596191f, + 0.478516f, 0.594238f, 0.479004f, 0.592285f, 0.479736f, 0.590820f, 0.480469f, 0.588867f, + 0.480957f, 0.586914f, 0.481445f, 0.584961f, 0.481689f, 0.583008f, 0.482666f, 0.581055f, + 0.482910f, 0.579102f, 0.483643f, 0.576660f, 0.484375f, 0.574707f, 0.484375f, 0.572266f, + 0.484619f, 0.569824f, 0.484619f, 0.567871f, 0.485107f, 0.564941f, 0.484863f, 0.562500f, + 0.485107f, 0.559570f, 0.485107f, 0.557129f, 0.485352f, 0.553711f, 0.485596f, 0.550293f, + 0.483643f, 0.545898f, 0.482422f, 0.541016f, 0.480957f, 0.536133f, 0.479248f, 0.531250f, + 0.476318f, 0.525879f, 0.473633f, 0.520020f, 0.468750f, 0.511719f, 0.462891f, 0.502441f, + 0.451904f, 0.490723f, 0.433838f, 0.472900f, 0.395508f, 0.440918f, 0.231323f, 0.295410f, + 0.000000f, 1.000000f, 0.307861f, 0.868164f, 0.365967f, 0.803711f, 0.396973f, 0.761719f, + 0.414551f, 0.732910f, 0.429932f, 0.708984f, 0.440186f, 0.691406f, 0.450928f, 0.674805f, + 0.458252f, 0.662109f, 0.465088f, 0.650879f, 0.471436f, 0.641602f, 0.476807f, 0.632812f, + 0.480469f, 0.625977f, 0.486328f, 0.618164f, 0.490234f, 0.611816f, 0.494873f, 0.605469f, + 0.498535f, 0.600098f, 0.500977f, 0.595215f, 0.504883f, 0.590332f, 0.507812f, 0.585938f, + 0.510742f, 0.582031f, 0.513184f, 0.578613f, 0.516602f, 0.574219f, 0.519043f, 0.570801f, + 0.520996f, 0.567383f, 0.524902f, 0.563477f, 0.527344f, 0.560059f, 0.528809f, 0.557129f, + 0.531250f, 0.553711f, 0.533691f, 0.550293f, 0.536133f, 0.546875f, 0.538086f, 0.543945f, + 0.540527f, 0.541016f, 0.541992f, 0.537598f, 0.543945f, 0.534668f, 0.546387f, 0.531250f, + 0.549316f, 0.528320f, 0.550293f, 0.524902f, 0.553223f, 0.521484f, 0.555176f, 0.518066f, + 0.556152f, 0.514648f, 0.558105f, 0.511230f, 0.561035f, 0.507324f, 0.562500f, 0.503906f, + 0.564453f, 0.500000f, 0.566406f, 0.495850f, 0.567871f, 0.491943f, 0.569824f, 0.487793f, + 0.572266f, 0.483154f, 0.573730f, 0.478271f, 0.575195f, 0.473389f, 0.577637f, 0.468262f, + 0.578613f, 0.462158f, 0.579102f, 0.455322f, 0.580078f, 0.448242f, 0.581543f, 0.440918f, + 0.582031f, 0.432861f, 0.583008f, 0.423828f, 0.582031f, 0.413330f, 0.580566f, 0.400635f, + 0.576172f, 0.385254f, 0.566895f, 0.364746f, 0.542969f, 0.330078f, 0.425049f, 0.213257f, + 0.000000f, 1.000000f, 0.313721f, 0.865723f, 0.377930f, 0.797852f, 0.411865f, 0.752930f, + 0.434570f, 0.720703f, 0.452148f, 0.694336f, 0.464111f, 0.674805f, 0.475342f, 0.656738f, + 0.485352f, 0.642090f, 0.493652f, 0.628906f, 0.501465f, 0.617676f, 0.507812f, 0.607910f, + 0.513672f, 0.599121f, 0.521484f, 0.589844f, 0.526367f, 0.582031f, 0.532227f, 0.574219f, + 0.537598f, 0.567383f, 0.542480f, 0.561035f, 0.547363f, 0.554688f, 0.551270f, 0.549316f, + 0.555664f, 0.543945f, 0.560059f, 0.538574f, 0.564453f, 0.533203f, 0.568848f, 0.527832f, + 0.571289f, 0.523438f, 0.575195f, 0.518555f, 0.578125f, 0.514160f, 0.582031f, 0.509766f, + 0.585938f, 0.505371f, 0.590332f, 0.500488f, 0.593262f, 0.496338f, 0.596191f, 0.491943f, + 0.599609f, 0.487793f, 0.602539f, 0.483398f, 0.606445f, 0.479004f, 0.608887f, 0.474609f, + 0.612793f, 0.469971f, 0.616699f, 0.465576f, 0.619141f, 0.460938f, 0.621582f, 0.456543f, + 0.625977f, 0.451660f, 0.628906f, 0.446777f, 0.631348f, 0.441895f, 0.635254f, 0.436768f, + 0.637695f, 0.431885f, 0.641113f, 0.426514f, 0.645508f, 0.420898f, 0.646484f, 0.415527f, + 0.651855f, 0.409180f, 0.653809f, 0.403320f, 0.657715f, 0.396729f, 0.660645f, 0.390137f, + 0.663574f, 0.383301f, 0.664551f, 0.375000f, 0.667480f, 0.366455f, 0.670898f, 0.356934f, + 0.673340f, 0.347168f, 0.675781f, 0.336670f, 0.678223f, 0.324951f, 0.678711f, 0.310791f, + 0.679688f, 0.294434f, 0.675781f, 0.271973f, 0.661133f, 0.238037f, 0.580566f, 0.145752f, + 0.000000f, 1.000000f, 0.321289f, 0.862793f, 0.390869f, 0.791016f, 0.428467f, 0.743164f, + 0.450928f, 0.709473f, 0.471924f, 0.680664f, 0.486816f, 0.658691f, 0.500977f, 0.638184f, + 0.511230f, 0.622070f, 0.522461f, 0.607422f, 0.531738f, 0.593750f, 0.539062f, 0.582520f, + 0.548340f, 0.571777f, 0.555664f, 0.561523f, 0.562988f, 0.551758f, 0.568848f, 0.542969f, + 0.576660f, 0.534180f, 0.581543f, 0.526855f, 0.588379f, 0.519043f, 0.593750f, 0.512207f, + 0.599121f, 0.505371f, 0.604004f, 0.499268f, 0.609375f, 0.492676f, 0.614746f, 0.486328f, + 0.618652f, 0.480713f, 0.624023f, 0.474854f, 0.627930f, 0.469238f, 0.632812f, 0.463379f, + 0.637695f, 0.457764f, 0.642090f, 0.452393f, 0.646484f, 0.446777f, 0.649902f, 0.441406f, + 0.654297f, 0.436035f, 0.657227f, 0.430908f, 0.663574f, 0.425293f, 0.666504f, 0.419922f, + 0.671387f, 0.414307f, 0.674805f, 0.408936f, 0.678711f, 0.403564f, 0.681641f, 0.397949f, + 0.686523f, 0.392334f, 0.690918f, 0.386475f, 0.693848f, 0.380615f, 0.698730f, 0.374512f, + 0.702148f, 0.368652f, 0.706543f, 0.362305f, 0.709961f, 0.355957f, 0.714355f, 0.349365f, + 0.718262f, 0.342529f, 0.721191f, 0.335693f, 0.726074f, 0.328369f, 0.729004f, 0.321289f, + 0.732910f, 0.313477f, 0.737793f, 0.304688f, 0.739746f, 0.294922f, 0.742676f, 0.285156f, + 0.747559f, 0.274658f, 0.750488f, 0.263672f, 0.753418f, 0.251953f, 0.755371f, 0.237793f, + 0.757324f, 0.221313f, 0.756836f, 0.200439f, 0.749023f, 0.171509f, 0.693359f, 0.097595f, + 0.000000f, 1.000000f, 0.328613f, 0.859863f, 0.403076f, 0.784668f, 0.442627f, 0.734863f, + 0.469971f, 0.697266f, 0.492432f, 0.666992f, 0.509766f, 0.642090f, 0.525391f, 0.620605f, + 0.538574f, 0.601562f, 0.549805f, 0.585449f, 0.561523f, 0.570312f, 0.569824f, 0.557129f, + 0.580078f, 0.544922f, 0.588867f, 0.533203f, 0.597168f, 0.522461f, 0.606934f, 0.511719f, + 0.613281f, 0.501953f, 0.620605f, 0.493164f, 0.626953f, 0.484619f, 0.633301f, 0.476562f, + 0.639160f, 0.468506f, 0.645996f, 0.460693f, 0.651855f, 0.453369f, 0.657227f, 0.446289f, + 0.662109f, 0.439453f, 0.669922f, 0.432373f, 0.673828f, 0.425781f, 0.679688f, 0.419189f, + 0.684082f, 0.412842f, 0.689941f, 0.406250f, 0.693848f, 0.400146f, 0.698242f, 0.394043f, + 0.702637f, 0.387939f, 0.708496f, 0.381348f, 0.713379f, 0.375244f, 0.717285f, 0.368896f, + 0.722168f, 0.363037f, 0.726074f, 0.356934f, 0.730469f, 0.350830f, 0.734375f, 0.344727f, + 0.739258f, 0.338135f, 0.743164f, 0.331787f, 0.747559f, 0.325684f, 0.752441f, 0.318848f, + 0.755371f, 0.312500f, 0.760254f, 0.305908f, 0.764648f, 0.299072f, 0.768555f, 0.291992f, + 0.772461f, 0.284912f, 0.776367f, 0.277832f, 0.780273f, 0.270020f, 0.785156f, 0.262451f, + 0.788574f, 0.254639f, 0.792480f, 0.246216f, 0.795410f, 0.236572f, 0.799805f, 0.226807f, + 0.802734f, 0.216675f, 0.805664f, 0.206177f, 0.809570f, 0.194580f, 0.812988f, 0.182251f, + 0.814941f, 0.166016f, 0.815430f, 0.148193f, 0.809082f, 0.123413f, 0.770508f, 0.067139f, + 0.000000f, 1.000000f, 0.338135f, 0.855469f, 0.415039f, 0.778320f, 0.458496f, 0.725586f, + 0.489014f, 0.685547f, 0.512695f, 0.652832f, 0.533203f, 0.625488f, 0.549805f, 0.602051f, + 0.564941f, 0.581543f, 0.578613f, 0.563477f, 0.589844f, 0.546875f, 0.600098f, 0.532715f, + 0.611816f, 0.518555f, 0.620605f, 0.505859f, 0.630859f, 0.493408f, 0.640137f, 0.481445f, + 0.647949f, 0.470947f, 0.656250f, 0.460449f, 0.664062f, 0.450928f, 0.671387f, 0.441650f, + 0.678223f, 0.432617f, 0.685059f, 0.424072f, 0.691895f, 0.416016f, 0.696289f, 0.408203f, + 0.703125f, 0.400146f, 0.708984f, 0.392822f, 0.715332f, 0.384766f, 0.720703f, 0.377686f, + 0.726074f, 0.370850f, 0.730957f, 0.363770f, 0.736328f, 0.356934f, 0.742188f, 0.350098f, + 0.746582f, 0.343262f, 0.750488f, 0.336670f, 0.757324f, 0.329590f, 0.760254f, 0.323242f, + 0.765137f, 0.316650f, 0.769043f, 0.310303f, 0.773926f, 0.303955f, 0.778320f, 0.297363f, + 0.783691f, 0.290283f, 0.787109f, 0.283936f, 0.791504f, 0.277344f, 0.795898f, 0.270752f, + 0.799805f, 0.263916f, 0.803223f, 0.257324f, 0.808594f, 0.250244f, 0.811523f, 0.243652f, + 0.815918f, 0.236450f, 0.820312f, 0.229126f, 0.823730f, 0.221802f, 0.828613f, 0.214600f, + 0.831543f, 0.206787f, 0.835938f, 0.198730f, 0.838867f, 0.190552f, 0.840820f, 0.181152f, + 0.844727f, 0.171387f, 0.847656f, 0.161499f, 0.850586f, 0.151001f, 0.854980f, 0.139893f, + 0.855957f, 0.126343f, 0.856934f, 0.111694f, 0.852539f, 0.089539f, 0.823730f, 0.046478f, + 0.000000f, 1.000000f, 0.344971f, 0.853027f, 0.427490f, 0.771973f, 0.474121f, 0.716309f, + 0.506836f, 0.673828f, 0.534668f, 0.638184f, 0.555176f, 0.609375f, 0.573730f, 0.584473f, + 0.590820f, 0.561523f, 0.604980f, 0.541992f, 0.618164f, 0.523926f, 0.630371f, 0.507812f, + 0.641602f, 0.492676f, 0.650879f, 0.479492f, 0.662109f, 0.465576f, 0.672852f, 0.452393f, + 0.681152f, 0.440674f, 0.689941f, 0.429443f, 0.698730f, 0.418945f, 0.705078f, 0.408936f, + 0.713379f, 0.399170f, 0.719727f, 0.389893f, 0.726074f, 0.380859f, 0.733398f, 0.372070f, + 0.739258f, 0.364014f, 0.746094f, 0.355469f, 0.751953f, 0.347656f, 0.756348f, 0.339844f, + 0.762695f, 0.332275f, 0.768555f, 0.324951f, 0.772949f, 0.317871f, 0.778809f, 0.310303f, + 0.783691f, 0.303223f, 0.788086f, 0.296387f, 0.791992f, 0.289551f, 0.798340f, 0.282715f, + 0.801270f, 0.276123f, 0.806152f, 0.269531f, 0.811035f, 0.262695f, 0.815430f, 0.255859f, + 0.819824f, 0.249146f, 0.822754f, 0.242798f, 0.827148f, 0.236328f, 0.830566f, 0.229858f, + 0.834473f, 0.223511f, 0.838379f, 0.216797f, 0.843262f, 0.209717f, 0.846680f, 0.203247f, + 0.850098f, 0.196411f, 0.854492f, 0.189453f, 0.855957f, 0.182983f, 0.860840f, 0.175781f, + 0.864746f, 0.168457f, 0.867676f, 0.161377f, 0.871094f, 0.153809f, 0.874023f, 0.145386f, + 0.875977f, 0.136475f, 0.878418f, 0.127563f, 0.881348f, 0.118164f, 0.884766f, 0.108826f, + 0.885742f, 0.097717f, 0.887207f, 0.084412f, 0.884766f, 0.067688f, 0.862793f, 0.033691f, + 0.000000f, 1.000000f, 0.353516f, 0.849121f, 0.440674f, 0.765137f, 0.490723f, 0.707031f, + 0.525879f, 0.661621f, 0.555176f, 0.624023f, 0.577148f, 0.593750f, 0.597656f, 0.566406f, + 0.616211f, 0.541992f, 0.630859f, 0.520996f, 0.645508f, 0.501465f, 0.659668f, 0.483887f, + 0.669922f, 0.468018f, 0.680176f, 0.453369f, 0.692871f, 0.438477f, 0.702148f, 0.424561f, + 0.711426f, 0.412354f, 0.720703f, 0.400146f, 0.729492f, 0.388916f, 0.736816f, 0.378174f, + 0.744141f, 0.367676f, 0.750977f, 0.357910f, 0.758789f, 0.348633f, 0.764648f, 0.339355f, + 0.771484f, 0.330566f, 0.776855f, 0.321777f, 0.783691f, 0.313477f, 0.787598f, 0.305908f, + 0.793945f, 0.297852f, 0.799805f, 0.290039f, 0.804688f, 0.282471f, 0.810059f, 0.275146f, + 0.814453f, 0.268066f, 0.818359f, 0.260986f, 0.823730f, 0.254150f, 0.828125f, 0.247437f, + 0.832520f, 0.240601f, 0.836914f, 0.233765f, 0.839844f, 0.227539f, 0.844238f, 0.220703f, + 0.848633f, 0.214233f, 0.851074f, 0.208130f, 0.854980f, 0.201904f, 0.859375f, 0.195679f, + 0.863770f, 0.188843f, 0.867188f, 0.182495f, 0.869629f, 0.176392f, 0.873535f, 0.170044f, + 0.876465f, 0.163818f, 0.878418f, 0.158081f, 0.883301f, 0.151123f, 0.886230f, 0.144653f, + 0.890137f, 0.137939f, 0.892578f, 0.131470f, 0.895508f, 0.124878f, 0.898438f, 0.118225f, + 0.899414f, 0.109985f, 0.902832f, 0.101685f, 0.904785f, 0.093628f, 0.906250f, 0.085205f, + 0.908691f, 0.076538f, 0.908691f, 0.064941f, 0.907715f, 0.050476f, 0.891602f, 0.025284f, + 0.000000f, 1.000000f, 0.361816f, 0.845703f, 0.453125f, 0.758789f, 0.507324f, 0.697266f, + 0.544434f, 0.649902f, 0.576172f, 0.609863f, 0.600098f, 0.577637f, 0.620605f, 0.548828f, + 0.640625f, 0.522949f, 0.656738f, 0.500000f, 0.671875f, 0.479980f, 0.684570f, 0.461426f, + 0.697266f, 0.444092f, 0.706543f, 0.428955f, 0.719238f, 0.413330f, 0.730957f, 0.398682f, + 0.739258f, 0.385498f, 0.748535f, 0.372803f, 0.756348f, 0.360840f, 0.764160f, 0.349854f, + 0.771973f, 0.338867f, 0.779297f, 0.328613f, 0.786133f, 0.318848f, 0.793457f, 0.309082f, + 0.799805f, 0.300049f, 0.804688f, 0.291748f, 0.810059f, 0.283203f, 0.815918f, 0.274902f, + 0.821777f, 0.267090f, 0.826660f, 0.259033f, 0.830566f, 0.251465f, 0.835449f, 0.244507f, + 0.840332f, 0.237427f, 0.844727f, 0.230347f, 0.849121f, 0.223389f, 0.853027f, 0.216675f, + 0.856934f, 0.209961f, 0.860840f, 0.203613f, 0.864746f, 0.197266f, 0.868652f, 0.190918f, + 0.872070f, 0.184814f, 0.875488f, 0.178955f, 0.878906f, 0.172363f, 0.882324f, 0.166626f, + 0.885742f, 0.160522f, 0.888672f, 0.154785f, 0.890625f, 0.149048f, 0.894043f, 0.143433f, + 0.897461f, 0.137329f, 0.900879f, 0.131348f, 0.903809f, 0.125366f, 0.906738f, 0.119751f, + 0.909180f, 0.113953f, 0.912109f, 0.108276f, 0.913574f, 0.102600f, 0.917969f, 0.096008f, + 0.918457f, 0.089355f, 0.920410f, 0.081970f, 0.920898f, 0.075317f, 0.923828f, 0.068115f, + 0.925781f, 0.060333f, 0.925781f, 0.051239f, 0.924805f, 0.039886f, 0.913086f, 0.018799f, + 0.000000f, 1.000000f, 0.369385f, 0.842773f, 0.466553f, 0.751953f, 0.522949f, 0.687988f, + 0.562500f, 0.638184f, 0.594727f, 0.596680f, 0.621582f, 0.562012f, 0.642578f, 0.532227f, + 0.663086f, 0.504883f, 0.680176f, 0.480713f, 0.694824f, 0.459473f, 0.709961f, 0.439697f, + 0.721191f, 0.422363f, 0.733398f, 0.405273f, 0.744141f, 0.389893f, 0.753906f, 0.375000f, + 0.765137f, 0.360840f, 0.775391f, 0.347168f, 0.783203f, 0.334961f, 0.789062f, 0.323730f, + 0.797363f, 0.312744f, 0.805664f, 0.301758f, 0.811035f, 0.291992f, 0.817871f, 0.282227f, + 0.822754f, 0.273193f, 0.828613f, 0.264648f, 0.834961f, 0.255615f, 0.839844f, 0.247559f, + 0.843750f, 0.239868f, 0.849121f, 0.231812f, 0.853027f, 0.224731f, 0.858398f, 0.217407f, + 0.862793f, 0.210327f, 0.866211f, 0.203491f, 0.871582f, 0.196533f, 0.874512f, 0.190186f, + 0.877441f, 0.184082f, 0.880371f, 0.178101f, 0.885254f, 0.171509f, 0.888184f, 0.165649f, + 0.891602f, 0.159546f, 0.894531f, 0.153931f, 0.897461f, 0.148193f, 0.899902f, 0.142822f, + 0.903320f, 0.137207f, 0.905762f, 0.131836f, 0.908691f, 0.126221f, 0.911133f, 0.121033f, + 0.915039f, 0.115417f, 0.916016f, 0.110413f, 0.919434f, 0.105103f, 0.921387f, 0.100159f, + 0.924805f, 0.094727f, 0.926270f, 0.089539f, 0.929199f, 0.084167f, 0.930664f, 0.078979f, + 0.932617f, 0.074280f, 0.935059f, 0.067139f, 0.935547f, 0.060852f, 0.935547f, 0.054871f, + 0.938477f, 0.048035f, 0.938965f, 0.041412f, 0.937500f, 0.031342f, 0.929199f, 0.014694f, + 0.000000f, 1.000000f, 0.377686f, 0.839844f, 0.479004f, 0.745605f, 0.538574f, 0.678711f, + 0.581543f, 0.626465f, 0.614746f, 0.583008f, 0.641602f, 0.546875f, 0.664551f, 0.515625f, + 0.684570f, 0.487549f, 0.703125f, 0.462158f, 0.717773f, 0.439941f, 0.731445f, 0.419434f, + 0.744629f, 0.400879f, 0.755859f, 0.383789f, 0.766602f, 0.367920f, 0.777832f, 0.352051f, + 0.787109f, 0.337891f, 0.795898f, 0.324219f, 0.803711f, 0.312012f, 0.812500f, 0.299805f, + 0.818848f, 0.288574f, 0.826660f, 0.277588f, 0.832031f, 0.268066f, 0.838379f, 0.258301f, + 0.844238f, 0.249023f, 0.849609f, 0.240234f, 0.855469f, 0.231567f, 0.858887f, 0.223755f, + 0.864258f, 0.215698f, 0.868164f, 0.208374f, 0.873535f, 0.200684f, 0.876465f, 0.193848f, + 0.880859f, 0.187012f, 0.884277f, 0.180298f, 0.887695f, 0.174072f, 0.891113f, 0.167847f, + 0.895020f, 0.161743f, 0.897949f, 0.155640f, 0.902344f, 0.149658f, 0.904785f, 0.144043f, + 0.907227f, 0.138794f, 0.909180f, 0.133545f, 0.913574f, 0.127930f, 0.916016f, 0.122620f, + 0.917480f, 0.117737f, 0.920410f, 0.112427f, 0.921875f, 0.107910f, 0.925293f, 0.103149f, + 0.927734f, 0.098022f, 0.929688f, 0.093140f, 0.932617f, 0.088318f, 0.934570f, 0.083740f, + 0.935059f, 0.079712f, 0.939453f, 0.074524f, 0.940430f, 0.069824f, 0.941895f, 0.065674f, + 0.944336f, 0.061157f, 0.944824f, 0.055939f, 0.946289f, 0.049988f, 0.946777f, 0.044495f, + 0.948242f, 0.039276f, 0.949219f, 0.033264f, 0.947754f, 0.024719f, 0.940918f, 0.010834f, + 0.000000f, 1.000000f, 0.385010f, 0.836914f, 0.491211f, 0.739258f, 0.553711f, 0.669434f, + 0.599121f, 0.614746f, 0.632812f, 0.570312f, 0.660645f, 0.532715f, 0.684570f, 0.500000f, + 0.705078f, 0.470703f, 0.724121f, 0.444336f, 0.740234f, 0.421143f, 0.752930f, 0.400391f, + 0.766113f, 0.381104f, 0.776855f, 0.363525f, 0.788574f, 0.347168f, 0.798828f, 0.331543f, + 0.808594f, 0.316406f, 0.816895f, 0.302979f, 0.824219f, 0.290527f, 0.833496f, 0.278076f, + 0.839355f, 0.266846f, 0.845703f, 0.256348f, 0.850098f, 0.246826f, 0.857910f, 0.236328f, + 0.861816f, 0.227539f, 0.866699f, 0.218994f, 0.871582f, 0.210571f, 0.875977f, 0.202637f, + 0.880859f, 0.194824f, 0.885254f, 0.187256f, 0.888672f, 0.180298f, 0.892090f, 0.173584f, + 0.895508f, 0.167114f, 0.899902f, 0.160645f, 0.903320f, 0.154175f, 0.906250f, 0.148315f, + 0.909180f, 0.142578f, 0.912109f, 0.136963f, 0.914551f, 0.131470f, 0.916992f, 0.126343f, + 0.920410f, 0.120789f, 0.922363f, 0.116028f, 0.924805f, 0.111023f, 0.927246f, 0.106140f, + 0.929199f, 0.101746f, 0.932129f, 0.096924f, 0.935059f, 0.092041f, 0.936035f, 0.087830f, + 0.937500f, 0.083923f, 0.941406f, 0.079102f, 0.942383f, 0.074890f, 0.944336f, 0.070923f, + 0.946289f, 0.066711f, 0.947266f, 0.062805f, 0.949707f, 0.058777f, 0.951172f, 0.054810f, + 0.953125f, 0.050873f, 0.955078f, 0.046661f, 0.955078f, 0.041931f, 0.955566f, 0.036743f, + 0.956055f, 0.031860f, 0.958008f, 0.026825f, 0.955078f, 0.020111f, 0.951172f, 0.008820f, + 0.000000f, 1.000000f, 0.394775f, 0.832520f, 0.503418f, 0.732910f, 0.569336f, 0.660645f, + 0.614746f, 0.604492f, 0.651367f, 0.557617f, 0.681641f, 0.518066f, 0.704102f, 0.484863f, + 0.726074f, 0.454590f, 0.743652f, 0.427734f, 0.759766f, 0.403564f, 0.772949f, 0.382568f, + 0.785156f, 0.362793f, 0.797363f, 0.344727f, 0.806152f, 0.328613f, 0.816406f, 0.312988f, + 0.826172f, 0.297607f, 0.833496f, 0.283936f, 0.840820f, 0.271240f, 0.848633f, 0.259033f, + 0.855957f, 0.247681f, 0.861328f, 0.237427f, 0.868164f, 0.226929f, 0.873535f, 0.217407f, + 0.877441f, 0.208496f, 0.881348f, 0.200317f, 0.887695f, 0.191650f, 0.890625f, 0.183838f, + 0.895020f, 0.176392f, 0.898926f, 0.169312f, 0.902344f, 0.162598f, 0.906738f, 0.155884f, + 0.910156f, 0.149292f, 0.913086f, 0.143066f, 0.915039f, 0.137451f, 0.916992f, 0.132202f, + 0.921387f, 0.126221f, 0.923828f, 0.120789f, 0.927246f, 0.115417f, 0.928711f, 0.110657f, + 0.929688f, 0.106506f, 0.934570f, 0.101257f, 0.936035f, 0.096313f, 0.937500f, 0.092102f, + 0.939453f, 0.088013f, 0.940918f, 0.083862f, 0.942871f, 0.079712f, 0.945801f, 0.075317f, + 0.946777f, 0.071716f, 0.949219f, 0.067688f, 0.950684f, 0.063965f, 0.952148f, 0.060364f, + 0.954590f, 0.056610f, 0.955566f, 0.053101f, 0.956543f, 0.049561f, 0.958984f, 0.046234f, + 0.959473f, 0.042725f, 0.961914f, 0.039185f, 0.961914f, 0.035492f, 0.961914f, 0.030777f, + 0.962402f, 0.026779f, 0.963379f, 0.021698f, 0.963867f, 0.017212f, 0.958496f, 0.006859f, + 0.000000f, 1.000000f, 0.404297f, 0.828613f, 0.517090f, 0.726074f, 0.583984f, 0.652344f, + 0.631348f, 0.593750f, 0.667480f, 0.545898f, 0.698730f, 0.504883f, 0.723145f, 0.470215f, + 0.744141f, 0.439453f, 0.761719f, 0.412109f, 0.777344f, 0.387695f, 0.790527f, 0.365967f, + 0.803711f, 0.345703f, 0.813965f, 0.327637f, 0.824707f, 0.310791f, 0.833008f, 0.295654f, + 0.841797f, 0.280518f, 0.850098f, 0.266357f, 0.858398f, 0.253662f, 0.864746f, 0.241577f, + 0.871582f, 0.230469f, 0.875977f, 0.220215f, 0.881348f, 0.209839f, 0.886230f, 0.200684f, + 0.892090f, 0.191772f, 0.895020f, 0.183472f, 0.900391f, 0.174927f, 0.903809f, 0.167725f, + 0.906250f, 0.160767f, 0.911621f, 0.153564f, 0.914551f, 0.146606f, 0.917480f, 0.140381f, + 0.919922f, 0.134399f, 0.922363f, 0.128784f, 0.927246f, 0.122803f, 0.929199f, 0.117249f, + 0.930664f, 0.112366f, 0.933105f, 0.107544f, 0.935547f, 0.102478f, 0.937988f, 0.097961f, + 0.939453f, 0.093384f, 0.942383f, 0.088806f, 0.944336f, 0.084595f, 0.945312f, 0.080566f, + 0.946777f, 0.076843f, 0.950195f, 0.072693f, 0.951660f, 0.068726f, 0.953125f, 0.065186f, + 0.954102f, 0.061737f, 0.955078f, 0.058441f, 0.957520f, 0.054932f, 0.958496f, 0.051636f, + 0.960938f, 0.048065f, 0.961426f, 0.045227f, 0.962402f, 0.042389f, 0.964844f, 0.039001f, + 0.965820f, 0.035736f, 0.966309f, 0.033325f, 0.968262f, 0.030426f, 0.968750f, 0.025787f, + 0.968262f, 0.022202f, 0.967773f, 0.018677f, 0.969238f, 0.013779f, 0.965332f, 0.005775f, + 0.000000f, 1.000000f, 0.411865f, 0.825684f, 0.530762f, 0.718750f, 0.599121f, 0.643066f, + 0.647949f, 0.583008f, 0.686523f, 0.533691f, 0.716797f, 0.491699f, 0.740234f, 0.456543f, + 0.760742f, 0.425293f, 0.778809f, 0.397461f, 0.794434f, 0.372314f, 0.808105f, 0.350098f, + 0.819336f, 0.330078f, 0.830078f, 0.311768f, 0.839355f, 0.294922f, 0.847656f, 0.279785f, + 0.856934f, 0.264893f, 0.864258f, 0.250732f, 0.871094f, 0.238159f, 0.877930f, 0.226074f, + 0.883789f, 0.214844f, 0.889648f, 0.204590f, 0.893555f, 0.195068f, 0.898926f, 0.185425f, + 0.902832f, 0.176880f, 0.906738f, 0.168579f, 0.911133f, 0.160889f, 0.915039f, 0.153320f, + 0.918457f, 0.146484f, 0.921387f, 0.139404f, 0.922852f, 0.133667f, 0.927734f, 0.126953f, + 0.929688f, 0.121277f, 0.932617f, 0.115906f, 0.934570f, 0.110474f, 0.937012f, 0.105347f, + 0.939941f, 0.100220f, 0.941406f, 0.095764f, 0.944336f, 0.091064f, 0.945801f, 0.086609f, + 0.947266f, 0.082581f, 0.949707f, 0.078308f, 0.951172f, 0.074463f, 0.953125f, 0.070801f, + 0.954590f, 0.066956f, 0.956055f, 0.063293f, 0.957031f, 0.060059f, 0.958008f, 0.057037f, + 0.960938f, 0.053375f, 0.962402f, 0.050232f, 0.963379f, 0.047211f, 0.963867f, 0.044464f, + 0.965332f, 0.041626f, 0.966797f, 0.038666f, 0.967773f, 0.036041f, 0.969727f, 0.033325f, + 0.970703f, 0.030609f, 0.971191f, 0.028290f, 0.972168f, 0.025726f, 0.974121f, 0.022797f, + 0.972656f, 0.018906f, 0.972656f, 0.015373f, 0.973633f, 0.011444f, 0.969727f, 0.004612f, + 0.000000f, 1.000000f, 0.421631f, 0.821777f, 0.542969f, 0.712891f, 0.614746f, 0.634277f, + 0.664062f, 0.573242f, 0.702148f, 0.521973f, 0.732422f, 0.479736f, 0.756348f, 0.443848f, + 0.777832f, 0.411865f, 0.795898f, 0.383301f, 0.810547f, 0.358154f, 0.822754f, 0.335938f, + 0.833984f, 0.315918f, 0.844727f, 0.297119f, 0.852539f, 0.280762f, 0.860840f, 0.265625f, + 0.869629f, 0.250732f, 0.876953f, 0.236938f, 0.883789f, 0.224243f, 0.890137f, 0.211914f, + 0.895508f, 0.201172f, 0.900391f, 0.191040f, 0.905273f, 0.181030f, 0.909180f, 0.172485f, + 0.913086f, 0.163818f, 0.917480f, 0.155640f, 0.920898f, 0.147827f, 0.922852f, 0.141357f, + 0.927246f, 0.134033f, 0.929688f, 0.127563f, 0.932129f, 0.121521f, 0.934570f, 0.115906f, + 0.938965f, 0.109802f, 0.939941f, 0.104736f, 0.942871f, 0.099609f, 0.944336f, 0.094849f, + 0.946777f, 0.090149f, 0.949219f, 0.085388f, 0.950684f, 0.081238f, 0.951660f, 0.077454f, + 0.954590f, 0.073242f, 0.955566f, 0.069519f, 0.957520f, 0.065735f, 0.958496f, 0.062500f, + 0.960938f, 0.058777f, 0.961426f, 0.055817f, 0.962402f, 0.052673f, 0.964355f, 0.049438f, + 0.965332f, 0.046661f, 0.967285f, 0.043732f, 0.967773f, 0.040985f, 0.969238f, 0.038422f, + 0.970703f, 0.035736f, 0.971680f, 0.033020f, 0.971680f, 0.031021f, 0.973145f, 0.028625f, + 0.974609f, 0.026321f, 0.975586f, 0.023727f, 0.976562f, 0.021774f, 0.977539f, 0.019760f, + 0.977051f, 0.016510f, 0.976562f, 0.012489f, 0.976562f, 0.009476f, 0.974121f, 0.003717f, + 0.000000f, 1.000000f, 0.428711f, 0.819336f, 0.556641f, 0.706055f, 0.628906f, 0.625977f, + 0.680176f, 0.562988f, 0.717773f, 0.511230f, 0.748047f, 0.468018f, 0.771973f, 0.431396f, + 0.791016f, 0.399902f, 0.809570f, 0.370605f, 0.824219f, 0.345459f, 0.837402f, 0.322754f, + 0.847168f, 0.302734f, 0.857422f, 0.284180f, 0.864258f, 0.268066f, 0.873535f, 0.251953f, + 0.879883f, 0.238281f, 0.887695f, 0.224243f, 0.894531f, 0.211304f, 0.899902f, 0.200073f, + 0.904785f, 0.188965f, 0.911133f, 0.178345f, 0.913086f, 0.169800f, 0.918945f, 0.160156f, + 0.922363f, 0.151978f, 0.925293f, 0.144409f, 0.929199f, 0.136963f, 0.931641f, 0.129883f, + 0.934570f, 0.123413f, 0.937500f, 0.117065f, 0.939941f, 0.111328f, 0.942383f, 0.105652f, + 0.944824f, 0.100098f, 0.946777f, 0.095215f, 0.948730f, 0.090393f, 0.951660f, 0.085693f, + 0.953125f, 0.081177f, 0.954590f, 0.076904f, 0.955566f, 0.073242f, 0.958008f, 0.069214f, + 0.960449f, 0.065125f, 0.960938f, 0.061737f, 0.961426f, 0.058807f, 0.964355f, 0.055267f, + 0.965820f, 0.051849f, 0.966309f, 0.049011f, 0.967773f, 0.046265f, 0.968262f, 0.043579f, + 0.970215f, 0.040680f, 0.971191f, 0.037964f, 0.972168f, 0.035614f, 0.972656f, 0.033478f, + 0.974121f, 0.031097f, 0.975586f, 0.028687f, 0.976562f, 0.026352f, 0.976562f, 0.024750f, + 0.978027f, 0.022507f, 0.978516f, 0.020660f, 0.979980f, 0.018646f, 0.980957f, 0.016479f, + 0.981445f, 0.014877f, 0.979492f, 0.011246f, 0.979492f, 0.007957f, 0.979004f, 0.003407f, + 0.000000f, 1.000000f, 0.437500f, 0.815918f, 0.569824f, 0.699707f, 0.643066f, 0.617676f, + 0.694824f, 0.553223f, 0.732910f, 0.500977f, 0.762695f, 0.457031f, 0.785645f, 0.420166f, + 0.804688f, 0.388184f, 0.822266f, 0.358887f, 0.837891f, 0.333252f, 0.850098f, 0.310547f, + 0.860352f, 0.290283f, 0.868652f, 0.272217f, 0.876953f, 0.255615f, 0.883789f, 0.240356f, + 0.891113f, 0.226318f, 0.898438f, 0.212769f, 0.903809f, 0.200562f, 0.909668f, 0.188354f, + 0.913574f, 0.178223f, 0.918945f, 0.167847f, 0.922363f, 0.158813f, 0.926758f, 0.150024f, + 0.930176f, 0.141846f, 0.933105f, 0.134277f, 0.936035f, 0.127197f, 0.938965f, 0.120361f, + 0.940918f, 0.114136f, 0.943848f, 0.108093f, 0.947266f, 0.101990f, 0.948730f, 0.096802f, + 0.950684f, 0.091858f, 0.953613f, 0.086609f, 0.954590f, 0.082153f, 0.956543f, 0.077759f, + 0.958008f, 0.073730f, 0.960449f, 0.069458f, 0.961426f, 0.065735f, 0.962402f, 0.062317f, + 0.965332f, 0.058472f, 0.965820f, 0.055237f, 0.966309f, 0.052521f, 0.968262f, 0.049133f, + 0.969727f, 0.046234f, 0.970703f, 0.043335f, 0.971680f, 0.040924f, 0.972168f, 0.038269f, + 0.973145f, 0.035858f, 0.974121f, 0.033569f, 0.975098f, 0.031372f, 0.977051f, 0.028717f, + 0.977539f, 0.026886f, 0.977539f, 0.025299f, 0.979004f, 0.023254f, 0.979980f, 0.021149f, + 0.980957f, 0.019135f, 0.981445f, 0.017670f, 0.982422f, 0.016006f, 0.982422f, 0.014641f, + 0.983398f, 0.013092f, 0.983887f, 0.009377f, 0.982910f, 0.006584f, 0.981445f, 0.003464f, + 0.000000f, 1.000000f, 0.447021f, 0.812012f, 0.582031f, 0.693848f, 0.657227f, 0.609375f, + 0.709473f, 0.543945f, 0.748047f, 0.490967f, 0.777344f, 0.446533f, 0.799316f, 0.409180f, + 0.817871f, 0.377197f, 0.834473f, 0.348145f, 0.849609f, 0.322021f, 0.861816f, 0.299561f, + 0.871094f, 0.279541f, 0.881348f, 0.260986f, 0.888184f, 0.244629f, 0.894043f, 0.229736f, + 0.899902f, 0.215820f, 0.906250f, 0.202881f, 0.912109f, 0.190430f, 0.917969f, 0.178589f, + 0.921875f, 0.168335f, 0.926270f, 0.158447f, 0.929688f, 0.149414f, 0.934082f, 0.140747f, + 0.936523f, 0.133057f, 0.939941f, 0.125366f, 0.942383f, 0.118530f, 0.946289f, 0.111755f, + 0.947754f, 0.105713f, 0.950195f, 0.099854f, 0.952637f, 0.094238f, 0.954102f, 0.089233f, + 0.956543f, 0.084167f, 0.958008f, 0.079529f, 0.960449f, 0.075134f, 0.961426f, 0.070801f, + 0.962402f, 0.067139f, 0.964844f, 0.063049f, 0.965820f, 0.059509f, 0.967285f, 0.056091f, + 0.968262f, 0.053009f, 0.970215f, 0.049683f, 0.971191f, 0.046600f, 0.972168f, 0.043793f, + 0.972656f, 0.041473f, 0.974121f, 0.038757f, 0.975586f, 0.036011f, 0.975586f, 0.033783f, + 0.976562f, 0.031586f, 0.977539f, 0.029465f, 0.978027f, 0.027603f, 0.979004f, 0.025604f, + 0.980469f, 0.023544f, 0.981445f, 0.021545f, 0.981934f, 0.019913f, 0.982422f, 0.018250f, + 0.982910f, 0.016953f, 0.983398f, 0.015610f, 0.984863f, 0.013802f, 0.985840f, 0.012192f, + 0.986328f, 0.010574f, 0.986816f, 0.009506f, 0.984863f, 0.005833f, 0.984375f, 0.002514f, + 0.000000f, 1.000000f, 0.456543f, 0.808105f, 0.593262f, 0.687988f, 0.671387f, 0.601562f, + 0.723633f, 0.535156f, 0.761230f, 0.481201f, 0.789062f, 0.437256f, 0.812012f, 0.399170f, + 0.831055f, 0.366455f, 0.845215f, 0.338623f, 0.860840f, 0.312012f, 0.872559f, 0.289062f, + 0.880859f, 0.269531f, 0.888184f, 0.251221f, 0.896973f, 0.234497f, 0.902344f, 0.220093f, + 0.909180f, 0.205933f, 0.914062f, 0.193726f, 0.919922f, 0.181396f, 0.925293f, 0.169800f, + 0.929199f, 0.159790f, 0.933105f, 0.149780f, 0.937012f, 0.140991f, 0.940918f, 0.132446f, + 0.942871f, 0.124939f, 0.945801f, 0.117615f, 0.948730f, 0.110779f, 0.951660f, 0.104248f, + 0.953125f, 0.098511f, 0.956055f, 0.092773f, 0.957520f, 0.087280f, 0.958496f, 0.082764f, + 0.960938f, 0.077698f, 0.962891f, 0.073120f, 0.963867f, 0.069092f, 0.965820f, 0.064941f, + 0.967285f, 0.061127f, 0.967773f, 0.057831f, 0.969727f, 0.054016f, 0.970703f, 0.050781f, + 0.971680f, 0.047760f, 0.972168f, 0.045135f, 0.974121f, 0.042206f, 0.975586f, 0.039154f, + 0.976074f, 0.036804f, 0.977051f, 0.034576f, 0.978027f, 0.032227f, 0.978516f, 0.030182f, + 0.979492f, 0.028137f, 0.980957f, 0.025925f, 0.981934f, 0.023773f, 0.981934f, 0.022247f, + 0.982422f, 0.020798f, 0.983398f, 0.019073f, 0.983887f, 0.017639f, 0.984375f, 0.016296f, + 0.985840f, 0.014397f, 0.986328f, 0.012909f, 0.986816f, 0.011711f, 0.987793f, 0.010468f, + 0.987305f, 0.009644f, 0.988281f, 0.008430f, 0.986816f, 0.005436f, 0.986328f, 0.001083f, + 0.000000f, 1.000000f, 0.464844f, 0.805176f, 0.605957f, 0.681641f, 0.683594f, 0.594238f, + 0.736328f, 0.526367f, 0.772949f, 0.472656f, 0.802246f, 0.427734f, 0.824219f, 0.389404f, + 0.841797f, 0.356934f, 0.857422f, 0.328613f, 0.869629f, 0.302979f, 0.879395f, 0.280762f, + 0.889648f, 0.260254f, 0.897949f, 0.242188f, 0.905273f, 0.225708f, 0.911133f, 0.211060f, + 0.916504f, 0.197388f, 0.921387f, 0.185181f, 0.926270f, 0.173462f, 0.930176f, 0.162476f, + 0.936035f, 0.151489f, 0.938965f, 0.142334f, 0.943848f, 0.133301f, 0.944824f, 0.125488f, + 0.947754f, 0.118042f, 0.951660f, 0.110413f, 0.952637f, 0.104309f, 0.956055f, 0.097778f, + 0.957520f, 0.091919f, 0.959473f, 0.086731f, 0.961426f, 0.081482f, 0.963379f, 0.076477f, + 0.964844f, 0.071899f, 0.965820f, 0.067871f, 0.967773f, 0.063721f, 0.969727f, 0.059448f, + 0.969727f, 0.056274f, 0.971680f, 0.052887f, 0.972656f, 0.049469f, 0.974121f, 0.046417f, + 0.975098f, 0.043365f, 0.976562f, 0.040466f, 0.976562f, 0.038116f, 0.977539f, 0.035675f, + 0.978516f, 0.033478f, 0.979980f, 0.030914f, 0.980957f, 0.028610f, 0.981445f, 0.026749f, + 0.982422f, 0.024734f, 0.982910f, 0.023010f, 0.982910f, 0.021652f, 0.983887f, 0.019958f, + 0.984375f, 0.018295f, 0.985840f, 0.016586f, 0.986328f, 0.014992f, 0.987305f, 0.013573f, + 0.987305f, 0.012466f, 0.987793f, 0.011497f, 0.988281f, 0.010406f, 0.988770f, 0.009445f, + 0.989258f, 0.008270f, 0.990234f, 0.007000f, 0.991211f, 0.004940f, 0.988281f, 0.001047f, + 0.000000f, 1.000000f, 0.473633f, 0.801758f, 0.616699f, 0.675781f, 0.695801f, 0.586914f, + 0.748535f, 0.518066f, 0.786133f, 0.463867f, 0.812500f, 0.419434f, 0.835449f, 0.380859f, + 0.852051f, 0.348389f, 0.864746f, 0.320557f, 0.877930f, 0.294678f, 0.889648f, 0.271729f, + 0.897949f, 0.251709f, 0.905273f, 0.234009f, 0.912598f, 0.217651f, 0.918945f, 0.202759f, + 0.924316f, 0.189697f, 0.927734f, 0.177490f, 0.931641f, 0.166260f, 0.936523f, 0.155396f, + 0.940918f, 0.144897f, 0.944824f, 0.135742f, 0.947754f, 0.126953f, 0.950684f, 0.118896f, + 0.953613f, 0.111450f, 0.956055f, 0.104492f, 0.958008f, 0.098206f, 0.959961f, 0.092163f, + 0.961914f, 0.086243f, 0.963379f, 0.081238f, 0.965332f, 0.076111f, 0.966797f, 0.071533f, + 0.969238f, 0.066833f, 0.969727f, 0.062805f, 0.970215f, 0.059326f, 0.972168f, 0.055359f, + 0.974609f, 0.051636f, 0.975098f, 0.048370f, 0.976074f, 0.045227f, 0.976562f, 0.042542f, + 0.977539f, 0.039825f, 0.978516f, 0.037170f, 0.980469f, 0.034485f, 0.980957f, 0.031982f, + 0.981934f, 0.029755f, 0.982422f, 0.027771f, 0.982422f, 0.025894f, 0.982910f, 0.024261f, + 0.983887f, 0.022324f, 0.984375f, 0.020706f, 0.985352f, 0.019089f, 0.986816f, 0.016953f, + 0.986816f, 0.015732f, 0.987305f, 0.014519f, 0.987793f, 0.013290f, 0.988281f, 0.012192f, + 0.988281f, 0.011436f, 0.989258f, 0.010147f, 0.989746f, 0.009201f, 0.990723f, 0.007805f, + 0.991699f, 0.006325f, 0.992188f, 0.005371f, 0.992676f, 0.004707f, 0.989746f, 0.001203f, + 0.000000f, 1.000000f, 0.483154f, 0.797852f, 0.629883f, 0.669434f, 0.708984f, 0.579590f, + 0.761230f, 0.510254f, 0.796387f, 0.456299f, 0.823242f, 0.411377f, 0.845215f, 0.372559f, + 0.862305f, 0.339600f, 0.875488f, 0.311768f, 0.886230f, 0.287354f, 0.897949f, 0.263916f, + 0.906738f, 0.244141f, 0.913574f, 0.226318f, 0.919434f, 0.210327f, 0.924805f, 0.195679f, + 0.930176f, 0.182495f, 0.933594f, 0.170654f, 0.937988f, 0.159302f, 0.939941f, 0.149780f, + 0.945312f, 0.139038f, 0.948730f, 0.129883f, 0.952148f, 0.121033f, 0.954590f, 0.113281f, + 0.957031f, 0.106079f, 0.959961f, 0.098999f, 0.961914f, 0.092712f, 0.962891f, 0.087158f, + 0.965820f, 0.081360f, 0.966797f, 0.076233f, 0.968750f, 0.071289f, 0.969238f, 0.067139f, + 0.971191f, 0.062744f, 0.973145f, 0.058472f, 0.974121f, 0.054840f, 0.975586f, 0.051025f, + 0.975586f, 0.048096f, 0.977539f, 0.044922f, 0.978027f, 0.041870f, 0.979980f, 0.038940f, + 0.980957f, 0.036041f, 0.981445f, 0.033600f, 0.981445f, 0.031525f, 0.982910f, 0.029282f, + 0.982910f, 0.027328f, 0.983398f, 0.025513f, 0.984375f, 0.023590f, 0.986328f, 0.021347f, + 0.986816f, 0.019516f, 0.986816f, 0.018127f, 0.987793f, 0.016678f, 0.987793f, 0.015381f, + 0.988281f, 0.014320f, 0.988770f, 0.013016f, 0.989258f, 0.011940f, 0.990234f, 0.010872f, + 0.990723f, 0.009674f, 0.990723f, 0.008629f, 0.992188f, 0.006966f, 0.992188f, 0.006294f, + 0.992676f, 0.005501f, 0.992676f, 0.005138f, 0.993164f, 0.004486f, 0.991699f, 0.001573f, + 0.000000f, 1.000000f, 0.491211f, 0.794922f, 0.641602f, 0.663574f, 0.721191f, 0.572266f, + 0.771973f, 0.503906f, 0.807129f, 0.448730f, 0.835449f, 0.403076f, 0.853027f, 0.365723f, + 0.871582f, 0.332031f, 0.883789f, 0.304199f, 0.894043f, 0.279785f, 0.904785f, 0.257080f, + 0.912109f, 0.237427f, 0.919922f, 0.219360f, 0.925781f, 0.203491f, 0.931152f, 0.189209f, + 0.935059f, 0.176270f, 0.938965f, 0.164307f, 0.943359f, 0.153198f, 0.945312f, 0.143799f, + 0.949219f, 0.134033f, 0.953125f, 0.124817f, 0.956543f, 0.116089f, 0.958984f, 0.108215f, + 0.961426f, 0.101074f, 0.962891f, 0.094666f, 0.965820f, 0.088013f, 0.966797f, 0.082458f, + 0.969238f, 0.076965f, 0.969727f, 0.072205f, 0.972656f, 0.067200f, 0.973633f, 0.062622f, + 0.974609f, 0.058777f, 0.975586f, 0.054871f, 0.976074f, 0.051514f, 0.978027f, 0.047882f, + 0.979492f, 0.044373f, 0.980469f, 0.041199f, 0.980957f, 0.038574f, 0.981445f, 0.035980f, + 0.982422f, 0.033478f, 0.983398f, 0.031204f, 0.983398f, 0.029175f, 0.985352f, 0.026779f, + 0.986328f, 0.024384f, 0.986328f, 0.022659f, 0.987305f, 0.020706f, 0.987305f, 0.019318f, + 0.987793f, 0.017899f, 0.987793f, 0.016479f, 0.988281f, 0.015190f, 0.989258f, 0.013985f, + 0.989258f, 0.012787f, 0.989746f, 0.011673f, 0.991211f, 0.010223f, 0.992188f, 0.008713f, + 0.992188f, 0.007851f, 0.992676f, 0.006889f, 0.992676f, 0.006378f, 0.993164f, 0.005615f, + 0.993652f, 0.005020f, 0.993652f, 0.004612f, 0.993652f, 0.003990f, 0.994629f, 0.002947f, + 0.000000f, 1.000000f, 0.500488f, 0.791504f, 0.651855f, 0.658203f, 0.732422f, 0.566406f, + 0.781738f, 0.497070f, 0.816895f, 0.442139f, 0.843750f, 0.396240f, 0.862305f, 0.358398f, + 0.879395f, 0.325195f, 0.891602f, 0.297363f, 0.902344f, 0.272705f, 0.910645f, 0.250977f, + 0.918945f, 0.230957f, 0.925293f, 0.213379f, 0.932129f, 0.197510f, 0.935547f, 0.183472f, + 0.940430f, 0.170288f, 0.943359f, 0.158813f, 0.947754f, 0.147705f, 0.950195f, 0.138184f, + 0.953125f, 0.128906f, 0.956543f, 0.120117f, 0.958984f, 0.112061f, 0.961914f, 0.104004f, + 0.963867f, 0.096863f, 0.965820f, 0.090332f, 0.967773f, 0.084351f, 0.970703f, 0.078308f, + 0.971191f, 0.073181f, 0.973145f, 0.068115f, 0.974121f, 0.063782f, 0.975098f, 0.059570f, + 0.977539f, 0.055420f, 0.978516f, 0.051300f, 0.979492f, 0.047791f, 0.979980f, 0.044556f, + 0.980469f, 0.041718f, 0.981934f, 0.038635f, 0.982422f, 0.036133f, 0.983887f, 0.033539f, + 0.984375f, 0.030914f, 0.985840f, 0.028259f, 0.986328f, 0.026077f, 0.986816f, 0.024139f, + 0.986816f, 0.022522f, 0.987793f, 0.020676f, 0.987793f, 0.019257f, 0.988281f, 0.017822f, + 0.989258f, 0.016281f, 0.989258f, 0.015053f, 0.990234f, 0.013611f, 0.991211f, 0.012207f, + 0.992188f, 0.010643f, 0.992676f, 0.009323f, 0.992676f, 0.008507f, 0.993164f, 0.007610f, + 0.993164f, 0.006977f, 0.993652f, 0.006245f, 0.993652f, 0.005745f, 0.993652f, 0.005070f, + 0.994141f, 0.004536f, 0.994141f, 0.004101f, 0.995117f, 0.003157f, 0.996094f, 0.001987f, + 0.000000f, 1.000000f, 0.510742f, 0.787109f, 0.663574f, 0.652344f, 0.743652f, 0.560059f, + 0.794922f, 0.489502f, 0.827148f, 0.434570f, 0.852051f, 0.389648f, 0.871094f, 0.351562f, + 0.886719f, 0.318848f, 0.898926f, 0.290771f, 0.908203f, 0.266602f, 0.915039f, 0.245850f, + 0.924316f, 0.225464f, 0.930664f, 0.207764f, 0.937012f, 0.191772f, 0.940430f, 0.178101f, + 0.945312f, 0.164917f, 0.948242f, 0.153442f, 0.952148f, 0.142700f, 0.954590f, 0.133423f, + 0.956543f, 0.124512f, 0.959473f, 0.116028f, 0.961914f, 0.108215f, 0.964844f, 0.100403f, + 0.967773f, 0.093201f, 0.970215f, 0.086243f, 0.971680f, 0.080444f, 0.972656f, 0.075012f, + 0.974121f, 0.069946f, 0.975586f, 0.065063f, 0.978027f, 0.060211f, 0.978516f, 0.056000f, + 0.979004f, 0.052399f, 0.980469f, 0.048584f, 0.980957f, 0.045502f, 0.982422f, 0.042084f, + 0.982910f, 0.039246f, 0.984863f, 0.035950f, 0.985352f, 0.033173f, 0.986328f, 0.030548f, + 0.986328f, 0.028473f, 0.986816f, 0.026428f, 0.987793f, 0.024429f, 0.987793f, 0.022659f, + 0.988770f, 0.020782f, 0.988770f, 0.019257f, 0.988770f, 0.017807f, 0.989746f, 0.016083f, + 0.990723f, 0.014519f, 0.992188f, 0.012581f, 0.992188f, 0.011375f, 0.992676f, 0.010284f, + 0.992676f, 0.009338f, 0.992676f, 0.008629f, 0.993164f, 0.007706f, 0.993164f, 0.007145f, + 0.993652f, 0.006336f, 0.994141f, 0.005703f, 0.994141f, 0.005177f, 0.994629f, 0.004509f, + 0.995117f, 0.003876f, 0.995605f, 0.003214f, 0.996582f, 0.002230f, 0.998047f, 0.000039f, + 0.000000f, 1.000000f, 0.519043f, 0.784180f, 0.675293f, 0.646973f, 0.755371f, 0.553223f, + 0.802734f, 0.483643f, 0.837402f, 0.428223f, 0.860352f, 0.383301f, 0.879395f, 0.345215f, + 0.892090f, 0.313721f, 0.905762f, 0.284912f, 0.914551f, 0.260498f, 0.921875f, 0.239624f, + 0.928711f, 0.220703f, 0.936035f, 0.202759f, 0.941895f, 0.186890f, 0.945312f, 0.172974f, + 0.949707f, 0.160156f, 0.952637f, 0.148682f, 0.955566f, 0.138428f, 0.958496f, 0.128784f, + 0.959961f, 0.120239f, 0.961914f, 0.112183f, 0.965332f, 0.104431f, 0.966797f, 0.097229f, + 0.969238f, 0.090088f, 0.971191f, 0.083740f, 0.973145f, 0.077698f, 0.976074f, 0.071655f, + 0.977051f, 0.066528f, 0.978027f, 0.061951f, 0.979004f, 0.057739f, 0.979980f, 0.053680f, + 0.980957f, 0.050018f, 0.982422f, 0.046143f, 0.983887f, 0.042603f, 0.984863f, 0.039093f, + 0.985352f, 0.036469f, 0.985840f, 0.033661f, 0.986328f, 0.031281f, 0.986816f, 0.028976f, + 0.987305f, 0.026855f, 0.988281f, 0.024704f, 0.988770f, 0.022858f, 0.989746f, 0.020950f, + 0.990234f, 0.019073f, 0.991699f, 0.017212f, 0.992188f, 0.015175f, 0.992188f, 0.013878f, + 0.992676f, 0.012512f, 0.992676f, 0.011513f, 0.993164f, 0.010384f, 0.993164f, 0.009560f, + 0.993652f, 0.008598f, 0.993652f, 0.007912f, 0.994141f, 0.007061f, 0.994141f, 0.006516f, + 0.994629f, 0.005733f, 0.995117f, 0.005028f, 0.995605f, 0.004395f, 0.996094f, 0.003757f, + 0.996094f, 0.002979f, 0.997070f, 0.002041f, 0.998535f, 0.000240f, 0.998535f, 0.000003f, + 0.000000f, 1.000000f, 0.527832f, 0.780762f, 0.684082f, 0.642578f, 0.764160f, 0.547852f, + 0.812500f, 0.477783f, 0.843750f, 0.422852f, 0.868164f, 0.377441f, 0.886230f, 0.339355f, + 0.899902f, 0.307617f, 0.911621f, 0.279541f, 0.920898f, 0.255127f, 0.927734f, 0.234253f, + 0.933105f, 0.215942f, 0.939941f, 0.198242f, 0.945312f, 0.182617f, 0.949219f, 0.168579f, + 0.953125f, 0.156128f, 0.957031f, 0.144409f, 0.958984f, 0.134399f, 0.960938f, 0.125122f, + 0.963867f, 0.116028f, 0.965332f, 0.108154f, 0.966797f, 0.101074f, 0.968750f, 0.094421f, + 0.970703f, 0.087952f, 0.973633f, 0.080750f, 0.975586f, 0.074829f, 0.976562f, 0.069458f, + 0.978027f, 0.064453f, 0.979492f, 0.059937f, 0.980957f, 0.055389f, 0.982910f, 0.050812f, + 0.983398f, 0.046997f, 0.984375f, 0.043518f, 0.984863f, 0.040405f, 0.985352f, 0.037506f, + 0.985840f, 0.034821f, 0.986816f, 0.032104f, 0.987305f, 0.029785f, 0.988281f, 0.027313f, + 0.989258f, 0.025101f, 0.989746f, 0.022873f, 0.991699f, 0.020355f, 0.991699f, 0.018433f, + 0.992188f, 0.016846f, 0.992188f, 0.015388f, 0.992676f, 0.014084f, 0.992676f, 0.012863f, + 0.993164f, 0.011726f, 0.993164f, 0.010712f, 0.993652f, 0.009682f, 0.993652f, 0.008865f, + 0.994141f, 0.007927f, 0.994141f, 0.007278f, 0.994629f, 0.006413f, 0.995117f, 0.005615f, + 0.995605f, 0.004871f, 0.996094f, 0.004139f, 0.996582f, 0.003366f, 0.997070f, 0.002584f, + 0.999023f, 0.000851f, 0.999023f, 0.000255f, 0.999023f, 0.000056f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.536621f, 0.777344f, 0.695801f, 0.636719f, 0.774414f, 0.542480f, + 0.821289f, 0.471924f, 0.851562f, 0.416992f, 0.875488f, 0.371826f, 0.893066f, 0.334229f, + 0.905762f, 0.302490f, 0.916504f, 0.275146f, 0.926270f, 0.250244f, 0.932617f, 0.229370f, + 0.937500f, 0.211182f, 0.942383f, 0.194824f, 0.948730f, 0.178955f, 0.953613f, 0.164429f, + 0.956055f, 0.152222f, 0.958984f, 0.141113f, 0.962402f, 0.130371f, 0.964355f, 0.121338f, + 0.966309f, 0.112976f, 0.968262f, 0.105103f, 0.970703f, 0.097351f, 0.971680f, 0.090881f, + 0.972656f, 0.084961f, 0.974121f, 0.079407f, 0.976074f, 0.073608f, 0.978516f, 0.067688f, + 0.981445f, 0.061859f, 0.982422f, 0.057129f, 0.982910f, 0.053009f, 0.983887f, 0.049103f, + 0.984375f, 0.045593f, 0.985352f, 0.042145f, 0.986328f, 0.038910f, 0.987305f, 0.035889f, + 0.987793f, 0.033142f, 0.989258f, 0.030258f, 0.991211f, 0.027222f, 0.991211f, 0.024750f, + 0.991699f, 0.022583f, 0.991699f, 0.020828f, 0.992188f, 0.019012f, 0.992676f, 0.017410f, + 0.992676f, 0.015991f, 0.993164f, 0.014557f, 0.993164f, 0.013405f, 0.993652f, 0.012123f, + 0.994141f, 0.010986f, 0.994141f, 0.010017f, 0.994629f, 0.008949f, 0.995117f, 0.007988f, + 0.995117f, 0.007233f, 0.995605f, 0.006310f, 0.996094f, 0.005432f, 0.996582f, 0.004585f, + 0.997070f, 0.003532f, 0.998047f, 0.002377f, 0.999023f, 0.001024f, 0.999023f, 0.000561f, + 0.999023f, 0.000288f, 0.999023f, 0.000121f, 0.999023f, 0.000029f, 0.999023f, 0.000000f, + 0.000000f, 1.000000f, 0.546875f, 0.773438f, 0.705566f, 0.632324f, 0.782227f, 0.537598f, + 0.827637f, 0.467285f, 0.860352f, 0.411377f, 0.882812f, 0.366455f, 0.897949f, 0.329834f, + 0.912109f, 0.297363f, 0.920410f, 0.270752f, 0.929688f, 0.246704f, 0.937500f, 0.224854f, + 0.941895f, 0.207031f, 0.947754f, 0.190063f, 0.950684f, 0.175903f, 0.956055f, 0.161865f, + 0.959961f, 0.148682f, 0.962402f, 0.137695f, 0.965332f, 0.127441f, 0.968750f, 0.117493f, + 0.969727f, 0.109253f, 0.970703f, 0.101868f, 0.972656f, 0.094788f, 0.974121f, 0.088257f, + 0.976074f, 0.081970f, 0.977539f, 0.075928f, 0.978027f, 0.070923f, 0.978516f, 0.066406f, + 0.980957f, 0.061340f, 0.982422f, 0.056458f, 0.983398f, 0.052124f, 0.984375f, 0.048096f, + 0.985840f, 0.044220f, 0.987305f, 0.040497f, 0.989258f, 0.036713f, 0.989746f, 0.033386f, + 0.990234f, 0.030594f, 0.990723f, 0.028076f, 0.991211f, 0.025787f, 0.991699f, 0.023804f, + 0.991699f, 0.021835f, 0.992188f, 0.019974f, 0.992676f, 0.018265f, 0.992676f, 0.016815f, + 0.993164f, 0.015274f, 0.993652f, 0.013832f, 0.994141f, 0.012505f, 0.994629f, 0.011330f, + 0.994629f, 0.010185f, 0.995117f, 0.009026f, 0.995605f, 0.007919f, 0.996094f, 0.006863f, + 0.997070f, 0.005650f, 0.998047f, 0.004478f, 0.999512f, 0.002747f, 0.999512f, 0.001852f, + 0.999512f, 0.001303f, 0.999512f, 0.000901f, 0.999512f, 0.000597f, 0.999512f, 0.000368f, + 0.999512f, 0.000201f, 0.999512f, 0.000087f, 0.999512f, 0.000021f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.555664f, 0.770020f, 0.714844f, 0.627930f, 0.791992f, 0.531738f, + 0.837402f, 0.461670f, 0.868164f, 0.406250f, 0.888184f, 0.362061f, 0.905273f, 0.324219f, + 0.916016f, 0.293457f, 0.927734f, 0.265625f, 0.933594f, 0.242798f, 0.940918f, 0.221802f, + 0.946777f, 0.203003f, 0.952148f, 0.185913f, 0.955078f, 0.171753f, 0.957520f, 0.159058f, + 0.961426f, 0.146851f, 0.965332f, 0.134766f, 0.967773f, 0.124573f, 0.969727f, 0.115417f, + 0.972168f, 0.106750f, 0.975586f, 0.098083f, 0.976074f, 0.091064f, 0.977051f, 0.084839f, + 0.977539f, 0.079163f, 0.978516f, 0.073914f, 0.979004f, 0.069031f, 0.979980f, 0.064392f, + 0.980957f, 0.059998f, 0.982422f, 0.055725f, 0.983887f, 0.051178f, 0.986328f, 0.046539f, + 0.987305f, 0.042542f, 0.988281f, 0.039032f, 0.988770f, 0.035858f, 0.989258f, 0.033020f, + 0.990234f, 0.030258f, 0.990723f, 0.027756f, 0.991211f, 0.025452f, 0.991699f, 0.023285f, + 0.992188f, 0.021271f, 0.992676f, 0.019379f, 0.993164f, 0.017578f, 0.993652f, 0.015900f, + 0.994141f, 0.014305f, 0.995117f, 0.012695f, 0.995605f, 0.011139f, 0.996094f, 0.009712f, + 0.997070f, 0.008133f, 0.999023f, 0.006161f, 0.999512f, 0.004524f, 0.999512f, 0.003595f, + 0.999512f, 0.002872f, 0.999512f, 0.002279f, 0.999512f, 0.001782f, 0.999512f, 0.001365f, + 0.999512f, 0.001016f, 0.999512f, 0.000727f, 0.999512f, 0.000493f, 0.999512f, 0.000308f, + 0.999512f, 0.000170f, 0.999512f, 0.000074f, 0.999512f, 0.000018f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.561523f, 0.768066f, 0.722168f, 0.624512f, 0.799316f, 0.527832f, + 0.844238f, 0.457275f, 0.873047f, 0.402588f, 0.895508f, 0.356934f, 0.910645f, 0.320068f, + 0.921387f, 0.289307f, 0.930176f, 0.262451f, 0.937012f, 0.239136f, 0.944336f, 0.218628f, + 0.952637f, 0.197998f, 0.952637f, 0.183838f, 0.954590f, 0.171387f, 0.962402f, 0.155518f, + 0.968262f, 0.140869f, 0.968262f, 0.130981f, 0.968262f, 0.122559f, 0.968262f, 0.115051f, + 0.968262f, 0.108215f, 0.973633f, 0.099670f, 0.979980f, 0.089417f, 0.983887f, 0.079895f, + 0.983887f, 0.073853f, 0.983887f, 0.068726f, 0.983887f, 0.064148f, 0.983887f, 0.060028f, + 0.983887f, 0.056274f, 0.983887f, 0.052795f, 0.983887f, 0.049622f, 0.983887f, 0.046692f, + 0.983887f, 0.043976f, 0.983887f, 0.041443f, 0.983887f, 0.039124f, 0.983887f, 0.036987f, + 0.983887f, 0.034973f, 0.983887f, 0.033142f, 0.988770f, 0.029465f, 0.995117f, 0.023483f, + 0.999512f, 0.017349f, 0.999512f, 0.014488f, 0.999512f, 0.012405f, 0.999512f, 0.010712f, + 0.999512f, 0.009277f, 0.999512f, 0.008026f, 0.999512f, 0.006931f, 0.999512f, 0.005959f, + 0.999512f, 0.005089f, 0.999512f, 0.004318f, 0.999512f, 0.003630f, 0.999512f, 0.003019f, + 0.999512f, 0.002478f, 0.999512f, 0.002003f, 0.999512f, 0.001587f, 0.999512f, 0.001227f, + 0.999512f, 0.000921f, 0.999512f, 0.000663f, 0.999512f, 0.000452f, 0.999512f, 0.000283f, + 0.999512f, 0.000157f, 0.999512f, 0.000068f, 0.999512f, 0.000017f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.981934f, + 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.974609f, + 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965332f, 0.000000f, 0.961426f, + 0.000000f, 0.956543f, 0.000000f, 0.951172f, 0.000000f, 0.945801f, 0.000000f, 0.935547f, + 0.000000f, 0.925781f, 0.000000f, 0.914062f, 0.000000f, 0.895508f, 0.000000f, 0.871094f, + 0.000000f, 0.834961f, 0.000000f, 0.773438f, 0.000000f, 0.648926f, 0.000000f, 0.289062f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.986328f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, + 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.973633f, + 0.000000f, 0.971680f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f, + 0.000000f, 0.956543f, 0.000000f, 0.950684f, 0.000000f, 0.944336f, 0.000000f, 0.936035f, + 0.000000f, 0.926758f, 0.000000f, 0.913086f, 0.000000f, 0.895508f, 0.000000f, 0.871582f, + 0.000000f, 0.834473f, 0.000000f, 0.773438f, 0.000000f, 0.649414f, 0.000000f, 0.288818f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f, 0.000000f, 0.981445f, + 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, 0.000000f, 0.973633f, + 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.964844f, 0.000000f, 0.960938f, + 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.943359f, 0.000000f, 0.936035f, + 0.000000f, 0.925293f, 0.000000f, 0.912598f, 0.000000f, 0.894531f, 0.000000f, 0.870605f, + 0.000006f, 0.833496f, 0.000010f, 0.772461f, 0.000008f, 0.648438f, 0.000008f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.983887f, 0.000000f, 0.983398f, 0.000000f, 0.981445f, + 0.000000f, 0.979980f, 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, + 0.000000f, 0.970215f, 0.000000f, 0.967773f, 0.000000f, 0.963867f, 0.000000f, 0.959961f, + 0.000000f, 0.955566f, 0.000000f, 0.950195f, 0.000000f, 0.943359f, 0.000000f, 0.935059f, + 0.000002f, 0.924316f, 0.000040f, 0.911621f, 0.000050f, 0.894531f, 0.000046f, 0.869629f, + 0.000037f, 0.832520f, 0.000038f, 0.771484f, 0.000034f, 0.647461f, 0.000048f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f, + 0.000000f, 0.984863f, 0.000000f, 0.983398f, 0.000000f, 0.982422f, 0.000000f, 0.981445f, + 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.972656f, + 0.000000f, 0.970215f, 0.000000f, 0.966797f, 0.000000f, 0.963867f, 0.000004f, 0.958984f, + 0.000046f, 0.955078f, 0.000106f, 0.948730f, 0.000137f, 0.941895f, 0.000143f, 0.934082f, + 0.000137f, 0.923340f, 0.000123f, 0.910156f, 0.000104f, 0.892090f, 0.000097f, 0.867676f, + 0.000106f, 0.830566f, 0.000104f, 0.770020f, 0.000115f, 0.645996f, 0.000159f, 0.288574f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.984375f, 0.000000f, 0.982910f, 0.000000f, 0.981934f, 0.000000f, 0.980469f, + 0.000000f, 0.979004f, 0.000006f, 0.976562f, 0.000049f, 0.974121f, 0.000107f, 0.972168f, + 0.000173f, 0.969727f, 0.000252f, 0.965820f, 0.000304f, 0.961914f, 0.000314f, 0.958496f, + 0.000311f, 0.953613f, 0.000291f, 0.947754f, 0.000272f, 0.940918f, 0.000242f, 0.932617f, + 0.000210f, 0.922363f, 0.000218f, 0.908203f, 0.000246f, 0.891602f, 0.000224f, 0.865723f, + 0.000236f, 0.828613f, 0.000253f, 0.767090f, 0.000292f, 0.643555f, 0.000375f, 0.287598f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, 0.000000f, 0.989258f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000035f, 0.985352f, + 0.000091f, 0.983887f, 0.000156f, 0.982422f, 0.000232f, 0.980957f, 0.000312f, 0.979492f, + 0.000395f, 0.978027f, 0.000480f, 0.975586f, 0.000554f, 0.973145f, 0.000570f, 0.970703f, + 0.000570f, 0.968750f, 0.000544f, 0.964844f, 0.000521f, 0.960938f, 0.000485f, 0.957520f, + 0.000441f, 0.952148f, 0.000400f, 0.945801f, 0.000381f, 0.938965f, 0.000429f, 0.930664f, + 0.000463f, 0.919922f, 0.000434f, 0.905762f, 0.000452f, 0.888672f, 0.000465f, 0.862793f, + 0.000487f, 0.825684f, 0.000551f, 0.764648f, 0.000658f, 0.641602f, 0.000727f, 0.287598f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000034f, 0.990234f, 0.000091f, 0.989746f, 0.000167f, 0.989746f, 0.000245f, 0.988281f, + 0.000331f, 0.987793f, 0.000414f, 0.986816f, 0.000508f, 0.985840f, 0.000592f, 0.984863f, + 0.000685f, 0.982910f, 0.000777f, 0.981445f, 0.000857f, 0.979980f, 0.000911f, 0.978516f, + 0.000914f, 0.976562f, 0.000883f, 0.975098f, 0.000852f, 0.972656f, 0.000809f, 0.970215f, + 0.000752f, 0.966309f, 0.000697f, 0.963867f, 0.000645f, 0.959961f, 0.000637f, 0.955566f, + 0.000673f, 0.950684f, 0.000732f, 0.943848f, 0.000761f, 0.937012f, 0.000726f, 0.928711f, + 0.000751f, 0.917480f, 0.000775f, 0.903320f, 0.000820f, 0.885254f, 0.000855f, 0.859863f, + 0.000935f, 0.822754f, 0.001027f, 0.761230f, 0.001259f, 0.638672f, 0.001232f, 0.287109f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995605f, 0.000024f, 0.995117f, 0.000093f, 0.994629f, 0.000174f, 0.994141f, + 0.000262f, 0.993164f, 0.000355f, 0.992188f, 0.000454f, 0.991699f, 0.000539f, 0.990723f, + 0.000645f, 0.990234f, 0.000741f, 0.989746f, 0.000824f, 0.988281f, 0.000926f, 0.987793f, + 0.001020f, 0.986816f, 0.001103f, 0.985840f, 0.001187f, 0.984863f, 0.001285f, 0.983887f, + 0.001313f, 0.982422f, 0.001288f, 0.980957f, 0.001254f, 0.979004f, 0.001206f, 0.977051f, + 0.001139f, 0.975586f, 0.001061f, 0.973633f, 0.000997f, 0.972168f, 0.000975f, 0.967773f, + 0.000974f, 0.965332f, 0.001003f, 0.961914f, 0.001057f, 0.958496f, 0.001117f, 0.953125f, + 0.001145f, 0.948730f, 0.001167f, 0.942383f, 0.001165f, 0.934570f, 0.001213f, 0.925781f, + 0.001296f, 0.915039f, 0.001301f, 0.900879f, 0.001404f, 0.882324f, 0.001483f, 0.855957f, + 0.001650f, 0.818848f, 0.001833f, 0.757812f, 0.002214f, 0.635742f, 0.001906f, 0.287109f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000047f, 0.996094f, + 0.000143f, 0.996094f, 0.000244f, 0.995605f, 0.000353f, 0.995605f, 0.000449f, 0.995605f, + 0.000572f, 0.994629f, 0.000674f, 0.994629f, 0.000766f, 0.994141f, 0.000885f, 0.993652f, + 0.000984f, 0.992676f, 0.001068f, 0.991699f, 0.001168f, 0.991211f, 0.001270f, 0.990723f, + 0.001357f, 0.989258f, 0.001431f, 0.988281f, 0.001523f, 0.987793f, 0.001617f, 0.986816f, + 0.001698f, 0.985840f, 0.001721f, 0.984375f, 0.001691f, 0.983398f, 0.001654f, 0.982910f, + 0.001585f, 0.981445f, 0.001496f, 0.979980f, 0.001397f, 0.978027f, 0.001406f, 0.976074f, + 0.001396f, 0.973633f, 0.001430f, 0.972168f, 0.001470f, 0.969238f, 0.001474f, 0.966797f, + 0.001557f, 0.963379f, 0.001629f, 0.959961f, 0.001714f, 0.956055f, 0.001678f, 0.951660f, + 0.001768f, 0.945801f, 0.001828f, 0.939941f, 0.001842f, 0.932129f, 0.001952f, 0.922852f, + 0.002094f, 0.911133f, 0.002110f, 0.896973f, 0.002304f, 0.878418f, 0.002434f, 0.852539f, + 0.002714f, 0.814453f, 0.003059f, 0.752930f, 0.003597f, 0.632324f, 0.002754f, 0.286865f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000027f, 0.997559f, 0.000131f, 0.997559f, 0.000248f, 0.997070f, + 0.000387f, 0.997070f, 0.000514f, 0.996582f, 0.000621f, 0.996094f, 0.000764f, 0.995605f, + 0.000876f, 0.995605f, 0.000966f, 0.995605f, 0.001093f, 0.995605f, 0.001204f, 0.994629f, + 0.001294f, 0.994141f, 0.001368f, 0.993652f, 0.001486f, 0.993164f, 0.001585f, 0.992676f, + 0.001666f, 0.992188f, 0.001733f, 0.991699f, 0.001820f, 0.990723f, 0.001919f, 0.989258f, + 0.001999f, 0.988770f, 0.002064f, 0.987793f, 0.002108f, 0.987305f, 0.002106f, 0.985840f, + 0.002058f, 0.984375f, 0.001984f, 0.983887f, 0.001900f, 0.982422f, 0.001882f, 0.981445f, + 0.001940f, 0.979980f, 0.001935f, 0.978516f, 0.001980f, 0.976562f, 0.002047f, 0.974609f, + 0.001980f, 0.972656f, 0.002090f, 0.969727f, 0.002176f, 0.967285f, 0.002317f, 0.964844f, + 0.002331f, 0.961426f, 0.002422f, 0.957520f, 0.002544f, 0.953613f, 0.002468f, 0.949219f, + 0.002621f, 0.942871f, 0.002783f, 0.937012f, 0.002794f, 0.928711f, 0.002975f, 0.919922f, + 0.003170f, 0.907715f, 0.003275f, 0.893066f, 0.003574f, 0.873535f, 0.003830f, 0.847656f, + 0.004234f, 0.809570f, 0.004757f, 0.747559f, 0.005520f, 0.628418f, 0.003780f, 0.285889f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000102f, 0.998047f, 0.000284f, 0.998047f, 0.000417f, 0.998047f, + 0.000606f, 0.997559f, 0.000735f, 0.997070f, 0.000863f, 0.997070f, 0.001017f, 0.996582f, + 0.001127f, 0.996582f, 0.001209f, 0.996094f, 0.001348f, 0.995605f, 0.001465f, 0.995605f, + 0.001553f, 0.995605f, 0.001619f, 0.995117f, 0.001728f, 0.994141f, 0.001839f, 0.993652f, + 0.001923f, 0.993164f, 0.001987f, 0.993164f, 0.002039f, 0.992676f, 0.002150f, 0.992188f, + 0.002245f, 0.991211f, 0.002316f, 0.990723f, 0.002371f, 0.989746f, 0.002415f, 0.989258f, + 0.002478f, 0.987793f, 0.002478f, 0.987305f, 0.002476f, 0.985352f, 0.002516f, 0.984375f, + 0.002474f, 0.983398f, 0.002546f, 0.982422f, 0.002649f, 0.981445f, 0.002626f, 0.979980f, + 0.002687f, 0.978027f, 0.002762f, 0.976562f, 0.002665f, 0.975098f, 0.002789f, 0.973145f, + 0.003000f, 0.970703f, 0.003017f, 0.968262f, 0.003206f, 0.965332f, 0.003342f, 0.962402f, + 0.003263f, 0.958984f, 0.003431f, 0.955078f, 0.003626f, 0.950684f, 0.003599f, 0.945801f, + 0.003780f, 0.939941f, 0.004051f, 0.933105f, 0.004108f, 0.924805f, 0.004383f, 0.915527f, + 0.004662f, 0.903320f, 0.004910f, 0.888184f, 0.005352f, 0.868164f, 0.005867f, 0.842285f, + 0.006401f, 0.803711f, 0.007095f, 0.742188f, 0.008057f, 0.624023f, 0.004993f, 0.285156f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000081f, 0.998535f, 0.000302f, 0.998535f, 0.000503f, 0.998535f, + 0.000695f, 0.998047f, 0.000876f, 0.998047f, 0.000982f, 0.998047f, 0.001150f, 0.997559f, + 0.001296f, 0.997070f, 0.001388f, 0.996582f, 0.001451f, 0.996582f, 0.001623f, 0.996582f, + 0.001734f, 0.995605f, 0.001808f, 0.995605f, 0.001862f, 0.995605f, 0.001980f, 0.995117f, + 0.002098f, 0.994629f, 0.002176f, 0.994141f, 0.002234f, 0.993652f, 0.002275f, 0.993164f, + 0.002382f, 0.992676f, 0.002489f, 0.992188f, 0.002562f, 0.991699f, 0.002615f, 0.991211f, + 0.002659f, 0.990234f, 0.002787f, 0.989746f, 0.003012f, 0.989258f, 0.003216f, 0.988281f, + 0.003222f, 0.987305f, 0.003229f, 0.985840f, 0.003298f, 0.984375f, 0.003304f, 0.982910f, + 0.003435f, 0.981934f, 0.003376f, 0.980957f, 0.003464f, 0.979492f, 0.003538f, 0.978027f, + 0.003477f, 0.976074f, 0.003742f, 0.975098f, 0.003778f, 0.972656f, 0.003975f, 0.970703f, + 0.004223f, 0.968750f, 0.004154f, 0.965332f, 0.004326f, 0.962891f, 0.004601f, 0.959473f, + 0.004822f, 0.956055f, 0.004776f, 0.952637f, 0.005104f, 0.947754f, 0.005302f, 0.942383f, + 0.005474f, 0.936523f, 0.005756f, 0.928711f, 0.006172f, 0.921387f, 0.006298f, 0.910645f, + 0.006702f, 0.898438f, 0.007130f, 0.882812f, 0.007660f, 0.863281f, 0.008499f, 0.836426f, + 0.009254f, 0.797363f, 0.010170f, 0.736816f, 0.011246f, 0.618652f, 0.006378f, 0.284424f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000264f, 0.999023f, + 0.000602f, 0.999023f, 0.000731f, 0.998535f, 0.001012f, 0.998535f, 0.001136f, 0.998535f, + 0.001204f, 0.998047f, 0.001447f, 0.998047f, 0.001554f, 0.997559f, 0.001611f, 0.997070f, + 0.001727f, 0.996582f, 0.001894f, 0.996582f, 0.001978f, 0.996094f, 0.002029f, 0.996094f, + 0.002062f, 0.995605f, 0.002239f, 0.995117f, 0.002346f, 0.994629f, 0.002407f, 0.994141f, + 0.002447f, 0.993652f, 0.002476f, 0.993652f, 0.002623f, 0.992676f, 0.002729f, 0.992676f, + 0.002857f, 0.991699f, 0.003014f, 0.991211f, 0.003183f, 0.990234f, 0.003355f, 0.989746f, + 0.003656f, 0.989258f, 0.003870f, 0.988281f, 0.004047f, 0.987793f, 0.004227f, 0.987305f, + 0.004368f, 0.986328f, 0.004185f, 0.984375f, 0.004223f, 0.983398f, 0.004368f, 0.981934f, + 0.004330f, 0.980957f, 0.004547f, 0.979004f, 0.004528f, 0.977539f, 0.004745f, 0.976074f, + 0.004795f, 0.974121f, 0.005066f, 0.972168f, 0.005344f, 0.970703f, 0.005402f, 0.968262f, + 0.005703f, 0.966309f, 0.005959f, 0.963379f, 0.006004f, 0.959961f, 0.006271f, 0.956055f, + 0.006565f, 0.952637f, 0.006737f, 0.949219f, 0.007008f, 0.943848f, 0.007416f, 0.938477f, + 0.007626f, 0.931641f, 0.008102f, 0.924805f, 0.008652f, 0.916016f, 0.008797f, 0.905273f, + 0.009682f, 0.893555f, 0.010048f, 0.876953f, 0.010895f, 0.856934f, 0.012062f, 0.830078f, + 0.012970f, 0.790527f, 0.014359f, 0.729980f, 0.015228f, 0.614258f, 0.007942f, 0.284424f, + 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000668f, 0.999023f, 0.000844f, 0.999023f, + 0.001106f, 0.999023f, 0.001267f, 0.998535f, 0.001311f, 0.998535f, 0.001565f, 0.998047f, + 0.001694f, 0.997559f, 0.001740f, 0.997559f, 0.001763f, 0.997070f, 0.002033f, 0.996582f, + 0.002125f, 0.996582f, 0.002167f, 0.996094f, 0.002190f, 0.996094f, 0.002348f, 0.995605f, + 0.002499f, 0.994629f, 0.002560f, 0.994141f, 0.002592f, 0.994141f, 0.002647f, 0.993652f, + 0.002880f, 0.993164f, 0.003187f, 0.992676f, 0.003418f, 0.991699f, 0.003588f, 0.991211f, + 0.003782f, 0.990723f, 0.003929f, 0.990234f, 0.004223f, 0.989258f, 0.004486f, 0.988281f, + 0.004658f, 0.987793f, 0.004787f, 0.987305f, 0.004955f, 0.986328f, 0.005135f, 0.985352f, + 0.005482f, 0.984375f, 0.005833f, 0.983398f, 0.005672f, 0.982422f, 0.005924f, 0.980469f, + 0.005871f, 0.978516f, 0.005802f, 0.977051f, 0.006145f, 0.975586f, 0.006302f, 0.973633f, + 0.006660f, 0.971680f, 0.006687f, 0.969727f, 0.007061f, 0.967285f, 0.007484f, 0.965820f, + 0.007687f, 0.962891f, 0.008286f, 0.960449f, 0.008484f, 0.957031f, 0.008606f, 0.952637f, + 0.009003f, 0.949219f, 0.009155f, 0.944824f, 0.009781f, 0.939453f, 0.010323f, 0.933594f, + 0.010620f, 0.926758f, 0.011230f, 0.919434f, 0.011917f, 0.910645f, 0.012451f, 0.899414f, + 0.013443f, 0.886230f, 0.014389f, 0.870605f, 0.015373f, 0.849609f, 0.016815f, 0.822266f, + 0.018066f, 0.782715f, 0.019653f, 0.722656f, 0.020294f, 0.608398f, 0.009796f, 0.283691f, + 0.000000f, 1.000000f, 0.000468f, 0.999512f, 0.000923f, 0.999023f, 0.001113f, 0.999023f, + 0.001366f, 0.999023f, 0.001387f, 0.998535f, 0.001693f, 0.998047f, 0.001807f, 0.997559f, + 0.001831f, 0.997559f, 0.001842f, 0.997070f, 0.002182f, 0.996582f, 0.002247f, 0.996094f, + 0.002270f, 0.996094f, 0.002281f, 0.995605f, 0.002510f, 0.995117f, 0.002722f, 0.994141f, + 0.002935f, 0.994141f, 0.003124f, 0.993652f, 0.003315f, 0.993652f, 0.003624f, 0.992676f, + 0.003979f, 0.992188f, 0.004162f, 0.991211f, 0.004307f, 0.990723f, 0.004482f, 0.990234f, + 0.004616f, 0.989746f, 0.004944f, 0.988770f, 0.005177f, 0.987793f, 0.005447f, 0.987305f, + 0.005699f, 0.986816f, 0.005943f, 0.985352f, 0.006218f, 0.984375f, 0.006699f, 0.983398f, + 0.007027f, 0.982422f, 0.007305f, 0.981445f, 0.007561f, 0.979980f, 0.007656f, 0.978516f, + 0.007450f, 0.977051f, 0.007889f, 0.974609f, 0.008018f, 0.972656f, 0.008438f, 0.971191f, + 0.008598f, 0.968750f, 0.009048f, 0.967285f, 0.009216f, 0.964355f, 0.009689f, 0.962402f, + 0.010208f, 0.958984f, 0.010872f, 0.956543f, 0.011383f, 0.953125f, 0.011360f, 0.948730f, + 0.011871f, 0.944336f, 0.012604f, 0.939941f, 0.013451f, 0.934570f, 0.013954f, 0.928223f, + 0.014702f, 0.921875f, 0.015388f, 0.913574f, 0.016068f, 0.904297f, 0.017151f, 0.893066f, + 0.018478f, 0.879395f, 0.019714f, 0.862793f, 0.021103f, 0.841797f, 0.022858f, 0.813477f, + 0.024536f, 0.773926f, 0.026413f, 0.714844f, 0.026642f, 0.602051f, 0.012016f, 0.282227f, + 0.000000f, 1.000000f, 0.000483f, 0.999512f, 0.000957f, 0.999023f, 0.001391f, 0.999023f, + 0.001421f, 0.999023f, 0.001425f, 0.998535f, 0.001857f, 0.997559f, 0.001879f, 0.997070f, + 0.001884f, 0.997070f, 0.001886f, 0.997070f, 0.002312f, 0.996582f, 0.002407f, 0.996094f, + 0.002625f, 0.995605f, 0.002810f, 0.994629f, 0.003429f, 0.994141f, 0.003607f, 0.994141f, + 0.003820f, 0.993652f, 0.003983f, 0.992676f, 0.004093f, 0.992188f, 0.004627f, 0.991211f, + 0.004807f, 0.990723f, 0.004925f, 0.990723f, 0.005051f, 0.989258f, 0.005360f, 0.988770f, + 0.005894f, 0.987793f, 0.006252f, 0.987305f, 0.006512f, 0.986328f, 0.006821f, 0.985352f, + 0.007072f, 0.984375f, 0.007339f, 0.983398f, 0.007820f, 0.982422f, 0.008232f, 0.981445f, + 0.008728f, 0.979980f, 0.009132f, 0.978516f, 0.009483f, 0.977539f, 0.009834f, 0.976074f, + 0.009956f, 0.974609f, 0.010094f, 0.972168f, 0.010612f, 0.970215f, 0.010773f, 0.967773f, + 0.011314f, 0.965332f, 0.011551f, 0.963379f, 0.012169f, 0.960938f, 0.012779f, 0.958008f, + 0.013603f, 0.955078f, 0.014061f, 0.951660f, 0.014893f, 0.948730f, 0.015343f, 0.944336f, + 0.015854f, 0.939453f, 0.016876f, 0.934570f, 0.017548f, 0.928711f, 0.018661f, 0.922363f, + 0.019592f, 0.915039f, 0.020508f, 0.906738f, 0.021973f, 0.897461f, 0.023499f, 0.885742f, + 0.024612f, 0.871094f, 0.026230f, 0.854492f, 0.028091f, 0.833008f, 0.030380f, 0.804199f, + 0.032776f, 0.765137f, 0.034912f, 0.706543f, 0.034424f, 0.596191f, 0.014549f, 0.281494f, + 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000968f, 0.999023f, 0.001431f, 0.998535f, + 0.001442f, 0.998047f, 0.001442f, 0.998047f, 0.001902f, 0.997559f, 0.001909f, 0.997070f, + 0.002071f, 0.997070f, 0.002789f, 0.996094f, 0.003050f, 0.995605f, 0.003273f, 0.995117f, + 0.003405f, 0.994629f, 0.004002f, 0.994629f, 0.004215f, 0.993652f, 0.004314f, 0.993164f, + 0.004517f, 0.992676f, 0.004650f, 0.991699f, 0.005188f, 0.991211f, 0.005501f, 0.990234f, + 0.005878f, 0.989746f, 0.006168f, 0.988770f, 0.006428f, 0.987793f, 0.006653f, 0.987305f, + 0.007305f, 0.986328f, 0.007641f, 0.985352f, 0.007996f, 0.984375f, 0.008316f, 0.983398f, + 0.008682f, 0.982422f, 0.009125f, 0.981445f, 0.009880f, 0.979980f, 0.010239f, 0.979004f, + 0.010757f, 0.977539f, 0.011223f, 0.975586f, 0.011703f, 0.974609f, 0.012230f, 0.973145f, + 0.013145f, 0.971191f, 0.013092f, 0.969238f, 0.013313f, 0.966309f, 0.013916f, 0.964355f, + 0.014297f, 0.961914f, 0.014717f, 0.959473f, 0.015808f, 0.956543f, 0.016357f, 0.953125f, + 0.017151f, 0.950195f, 0.018295f, 0.946777f, 0.019104f, 0.942871f, 0.020248f, 0.938965f, + 0.020508f, 0.933594f, 0.021713f, 0.927734f, 0.022949f, 0.921875f, 0.024399f, 0.915527f, + 0.025558f, 0.907715f, 0.026520f, 0.898926f, 0.028717f, 0.889160f, 0.030579f, 0.876953f, + 0.032135f, 0.861816f, 0.035004f, 0.845215f, 0.037018f, 0.823242f, 0.039978f, 0.794922f, + 0.042419f, 0.755371f, 0.044800f, 0.697266f, 0.043121f, 0.589844f, 0.017395f, 0.280273f, + 0.000000f, 1.000000f, 0.000488f, 0.999512f, 0.000972f, 0.999023f, 0.000971f, 0.998535f, + 0.001451f, 0.998047f, 0.001614f, 0.997559f, 0.002438f, 0.997559f, 0.002659f, 0.996582f, + 0.002949f, 0.996094f, 0.003531f, 0.995605f, 0.003788f, 0.995117f, 0.003937f, 0.994629f, + 0.004017f, 0.994141f, 0.004654f, 0.993164f, 0.004913f, 0.992676f, 0.005222f, 0.991699f, + 0.005497f, 0.991211f, 0.005886f, 0.990723f, 0.006630f, 0.989746f, 0.006908f, 0.988770f, + 0.007088f, 0.988281f, 0.007408f, 0.986816f, 0.007881f, 0.986328f, 0.008659f, 0.985352f, + 0.009048f, 0.983887f, 0.009445f, 0.982910f, 0.009811f, 0.982422f, 0.010262f, 0.980957f, + 0.010788f, 0.979492f, 0.011696f, 0.978516f, 0.012161f, 0.977051f, 0.012642f, 0.975586f, + 0.013237f, 0.974609f, 0.013939f, 0.972656f, 0.014565f, 0.971191f, 0.015205f, 0.969238f, + 0.016235f, 0.967285f, 0.016907f, 0.965332f, 0.017075f, 0.962891f, 0.017609f, 0.959961f, + 0.018082f, 0.957031f, 0.018890f, 0.954590f, 0.019913f, 0.951172f, 0.021042f, 0.947754f, + 0.021851f, 0.944336f, 0.023163f, 0.940430f, 0.024094f, 0.936523f, 0.025558f, 0.932129f, + 0.026855f, 0.926758f, 0.027924f, 0.920410f, 0.029587f, 0.914551f, 0.031021f, 0.907227f, + 0.033051f, 0.899414f, 0.034515f, 0.890137f, 0.036804f, 0.879395f, 0.038910f, 0.866699f, + 0.041595f, 0.852051f, 0.044312f, 0.834473f, 0.047272f, 0.812012f, 0.050568f, 0.783691f, + 0.053680f, 0.745117f, 0.056000f, 0.687988f, 0.053253f, 0.582520f, 0.020523f, 0.279541f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000972f, 0.998535f, 0.001241f, 0.998535f, + 0.002151f, 0.998047f, 0.002401f, 0.997559f, 0.003136f, 0.996582f, 0.003218f, 0.996094f, + 0.003532f, 0.995605f, 0.004105f, 0.995117f, 0.004219f, 0.994141f, 0.004749f, 0.993652f, + 0.005089f, 0.993164f, 0.005863f, 0.992188f, 0.006104f, 0.991211f, 0.006577f, 0.990723f, + 0.006821f, 0.989746f, 0.007076f, 0.989258f, 0.007965f, 0.987793f, 0.008492f, 0.986816f, + 0.008896f, 0.986328f, 0.009338f, 0.984863f, 0.009697f, 0.983887f, 0.010536f, 0.982910f, + 0.011124f, 0.981934f, 0.011749f, 0.980469f, 0.012245f, 0.979492f, 0.012779f, 0.978027f, + 0.013306f, 0.976562f, 0.014290f, 0.975098f, 0.015060f, 0.973145f, 0.015808f, 0.971680f, + 0.016525f, 0.970215f, 0.017227f, 0.968750f, 0.017853f, 0.966797f, 0.019196f, 0.964355f, + 0.020248f, 0.962402f, 0.021164f, 0.959961f, 0.022064f, 0.958008f, 0.022339f, 0.955078f, + 0.023056f, 0.951660f, 0.024124f, 0.948730f, 0.025513f, 0.944824f, 0.026443f, 0.940918f, + 0.027924f, 0.937500f, 0.029053f, 0.933105f, 0.030701f, 0.929199f, 0.032074f, 0.924316f, + 0.034454f, 0.918945f, 0.035583f, 0.912109f, 0.037170f, 0.905762f, 0.039062f, 0.897949f, + 0.041504f, 0.890137f, 0.044312f, 0.880371f, 0.046631f, 0.868652f, 0.049683f, 0.855957f, + 0.052673f, 0.841309f, 0.055847f, 0.822754f, 0.059631f, 0.800293f, 0.063293f, 0.771484f, + 0.066772f, 0.733398f, 0.068726f, 0.677246f, 0.064270f, 0.575684f, 0.023956f, 0.278564f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.001137f, 0.999023f, 0.001858f, 0.998535f, + 0.002251f, 0.998047f, 0.002815f, 0.997070f, 0.003128f, 0.996094f, 0.003851f, 0.995605f, + 0.004227f, 0.994629f, 0.004791f, 0.994141f, 0.005646f, 0.993164f, 0.005867f, 0.992676f, + 0.006126f, 0.991211f, 0.007118f, 0.990723f, 0.007629f, 0.990234f, 0.008102f, 0.988770f, + 0.008438f, 0.987793f, 0.008934f, 0.987305f, 0.009979f, 0.985840f, 0.010483f, 0.984375f, + 0.011017f, 0.983887f, 0.011444f, 0.982910f, 0.012100f, 0.980957f, 0.013298f, 0.979980f, + 0.013916f, 0.978516f, 0.014526f, 0.977051f, 0.014999f, 0.976074f, 0.015808f, 0.974121f, + 0.017197f, 0.972656f, 0.017990f, 0.971191f, 0.018692f, 0.969238f, 0.019516f, 0.967285f, + 0.020493f, 0.965820f, 0.021423f, 0.963867f, 0.022812f, 0.961426f, 0.023941f, 0.958984f, + 0.025085f, 0.956543f, 0.026123f, 0.954590f, 0.027451f, 0.951660f, 0.028641f, 0.949219f, + 0.029221f, 0.945312f, 0.030762f, 0.941406f, 0.031921f, 0.937500f, 0.033142f, 0.933594f, + 0.034912f, 0.929199f, 0.036346f, 0.924805f, 0.038330f, 0.920410f, 0.040619f, 0.914551f, + 0.042999f, 0.909180f, 0.044800f, 0.902832f, 0.046875f, 0.895020f, 0.049530f, 0.887695f, + 0.052032f, 0.878906f, 0.055542f, 0.868652f, 0.057953f, 0.856445f, 0.061829f, 0.843750f, + 0.065002f, 0.828125f, 0.068970f, 0.810059f, 0.073425f, 0.787109f, 0.077759f, 0.758789f, + 0.081726f, 0.721680f, 0.083008f, 0.666016f, 0.075928f, 0.567383f, 0.027557f, 0.277832f, + 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.000938f, 0.999023f, 0.001864f, 0.998047f, + 0.002388f, 0.997559f, 0.003700f, 0.996582f, 0.004051f, 0.995605f, 0.004917f, 0.994629f, + 0.005440f, 0.994141f, 0.005817f, 0.993164f, 0.006748f, 0.991699f, 0.007397f, 0.991211f, + 0.008080f, 0.990234f, 0.008881f, 0.988770f, 0.009285f, 0.987793f, 0.009972f, 0.987305f, + 0.010849f, 0.985352f, 0.011360f, 0.984375f, 0.012276f, 0.983398f, 0.012993f, 0.981934f, + 0.013771f, 0.980469f, 0.014633f, 0.979492f, 0.015686f, 0.977539f, 0.016388f, 0.976074f, + 0.017349f, 0.974609f, 0.018112f, 0.973145f, 0.019073f, 0.971680f, 0.019943f, 0.969727f, + 0.021378f, 0.967773f, 0.022430f, 0.965820f, 0.023331f, 0.963867f, 0.024429f, 0.961914f, + 0.025589f, 0.959961f, 0.026825f, 0.957520f, 0.028534f, 0.955078f, 0.029800f, 0.952637f, + 0.031235f, 0.949707f, 0.032562f, 0.947266f, 0.034027f, 0.944336f, 0.035767f, 0.941406f, + 0.037903f, 0.937500f, 0.038879f, 0.933105f, 0.040375f, 0.929199f, 0.041870f, 0.924316f, + 0.043610f, 0.920410f, 0.045807f, 0.915527f, 0.047943f, 0.909668f, 0.051025f, 0.903809f, + 0.053436f, 0.897461f, 0.056458f, 0.891602f, 0.058563f, 0.883301f, 0.061310f, 0.875000f, + 0.064819f, 0.865234f, 0.068787f, 0.854980f, 0.071655f, 0.842773f, 0.076111f, 0.829590f, + 0.080139f, 0.813965f, 0.084229f, 0.795898f, 0.089355f, 0.772949f, 0.093872f, 0.744629f, + 0.097778f, 0.708496f, 0.098633f, 0.654785f, 0.088623f, 0.559082f, 0.031372f, 0.277344f, + 0.000000f, 1.000000f, 0.000956f, 0.999512f, 0.001315f, 0.998535f, 0.002008f, 0.998535f, + 0.003145f, 0.997070f, 0.004131f, 0.996094f, 0.004803f, 0.995117f, 0.005970f, 0.993652f, + 0.006893f, 0.992676f, 0.007431f, 0.991699f, 0.008705f, 0.990234f, 0.009399f, 0.988770f, + 0.009949f, 0.988281f, 0.010689f, 0.986816f, 0.012024f, 0.985352f, 0.012749f, 0.984375f, + 0.013504f, 0.982910f, 0.014328f, 0.981445f, 0.015587f, 0.979980f, 0.016495f, 0.978516f, + 0.017456f, 0.976562f, 0.018494f, 0.975098f, 0.019836f, 0.973633f, 0.020660f, 0.971680f, + 0.021729f, 0.970215f, 0.023041f, 0.968262f, 0.023987f, 0.965820f, 0.025314f, 0.964355f, + 0.026886f, 0.961914f, 0.028061f, 0.959473f, 0.029327f, 0.957520f, 0.030899f, 0.955078f, + 0.032257f, 0.952637f, 0.034271f, 0.950195f, 0.035797f, 0.947266f, 0.037323f, 0.944336f, + 0.039032f, 0.941406f, 0.040649f, 0.938477f, 0.042786f, 0.934570f, 0.044800f, 0.931152f, + 0.047302f, 0.927734f, 0.048981f, 0.923340f, 0.050446f, 0.918457f, 0.052338f, 0.914062f, + 0.054993f, 0.908691f, 0.057343f, 0.903320f, 0.060303f, 0.896973f, 0.063416f, 0.891113f, + 0.066162f, 0.884277f, 0.069702f, 0.877441f, 0.072632f, 0.870117f, 0.076050f, 0.860840f, + 0.079773f, 0.850586f, 0.084595f, 0.839844f, 0.088684f, 0.828125f, 0.092834f, 0.813965f, + 0.097168f, 0.798340f, 0.102417f, 0.779297f, 0.107727f, 0.757324f, 0.111877f, 0.729492f, + 0.115051f, 0.694336f, 0.114868f, 0.642090f, 0.102417f, 0.551270f, 0.035492f, 0.275635f, + 0.000000f, 1.000000f, 0.001254f, 0.999023f, 0.002310f, 0.998535f, 0.002735f, 0.997559f, + 0.003590f, 0.996582f, 0.004944f, 0.995117f, 0.005917f, 0.994141f, 0.007446f, 0.992188f, + 0.008385f, 0.991211f, 0.009384f, 0.989746f, 0.010559f, 0.988281f, 0.012100f, 0.986816f, + 0.012695f, 0.985352f, 0.013489f, 0.984375f, 0.015533f, 0.981934f, 0.016342f, 0.980469f, + 0.017181f, 0.979004f, 0.018341f, 0.977539f, 0.019989f, 0.975098f, 0.021271f, 0.973633f, + 0.022461f, 0.971680f, 0.023422f, 0.970215f, 0.025162f, 0.967773f, 0.026550f, 0.965820f, + 0.028046f, 0.963379f, 0.029434f, 0.961426f, 0.030701f, 0.958984f, 0.032684f, 0.956543f, + 0.034027f, 0.954590f, 0.035553f, 0.952148f, 0.037598f, 0.949219f, 0.039246f, 0.946289f, + 0.041046f, 0.943848f, 0.043304f, 0.939941f, 0.045135f, 0.937500f, 0.047028f, 0.934570f, + 0.049347f, 0.930664f, 0.051636f, 0.927246f, 0.053894f, 0.923340f, 0.056763f, 0.919434f, + 0.059143f, 0.915039f, 0.061768f, 0.911133f, 0.063477f, 0.906250f, 0.066162f, 0.900391f, + 0.068909f, 0.894531f, 0.071655f, 0.888672f, 0.075439f, 0.882324f, 0.078613f, 0.875977f, + 0.082336f, 0.869141f, 0.085876f, 0.861816f, 0.090393f, 0.853516f, 0.093445f, 0.843750f, + 0.098389f, 0.833496f, 0.102844f, 0.822266f, 0.107727f, 0.810547f, 0.111816f, 0.796387f, + 0.117432f, 0.781250f, 0.122375f, 0.761719f, 0.127686f, 0.740234f, 0.131958f, 0.713867f, + 0.134033f, 0.679199f, 0.132446f, 0.629395f, 0.116150f, 0.541504f, 0.039612f, 0.273438f, + 0.000000f, 1.000000f, 0.001420f, 0.999023f, 0.002686f, 0.998047f, 0.003748f, 0.997070f, + 0.005245f, 0.995605f, 0.006062f, 0.994141f, 0.008064f, 0.992676f, 0.009239f, 0.990723f, + 0.010887f, 0.989258f, 0.012329f, 0.987305f, 0.014015f, 0.985352f, 0.014992f, 0.983887f, + 0.016495f, 0.981934f, 0.018387f, 0.979492f, 0.019455f, 0.978027f, 0.021225f, 0.976074f, + 0.022354f, 0.974121f, 0.024307f, 0.972168f, 0.026154f, 0.969238f, 0.027573f, 0.967285f, + 0.028946f, 0.965332f, 0.030380f, 0.962891f, 0.032928f, 0.960449f, 0.034576f, 0.957520f, + 0.036285f, 0.955078f, 0.037872f, 0.953125f, 0.039703f, 0.950195f, 0.041748f, 0.947754f, + 0.044281f, 0.944824f, 0.046265f, 0.941406f, 0.048309f, 0.937988f, 0.050415f, 0.935059f, + 0.052521f, 0.932129f, 0.055115f, 0.928711f, 0.057343f, 0.924805f, 0.060333f, 0.920898f, + 0.062927f, 0.916992f, 0.065552f, 0.913086f, 0.068176f, 0.909180f, 0.071533f, 0.904297f, + 0.074402f, 0.899902f, 0.077332f, 0.895508f, 0.081055f, 0.890137f, 0.083618f, 0.884277f, + 0.086792f, 0.877930f, 0.090393f, 0.871582f, 0.093811f, 0.864746f, 0.097351f, 0.857910f, + 0.101562f, 0.851074f, 0.105957f, 0.842285f, 0.110840f, 0.834473f, 0.115051f, 0.824219f, + 0.119568f, 0.813965f, 0.124329f, 0.802734f, 0.129761f, 0.791016f, 0.134155f, 0.776855f, + 0.140015f, 0.761230f, 0.145264f, 0.742676f, 0.149780f, 0.722168f, 0.153320f, 0.696289f, + 0.154541f, 0.663574f, 0.151978f, 0.616211f, 0.131470f, 0.533203f, 0.044464f, 0.272461f, + 0.000000f, 1.000000f, 0.001528f, 0.999023f, 0.003845f, 0.997070f, 0.005600f, 0.995605f, + 0.006886f, 0.994141f, 0.008682f, 0.992676f, 0.010101f, 0.990723f, 0.011734f, 0.988770f, + 0.014336f, 0.986328f, 0.016708f, 0.983398f, 0.018539f, 0.981445f, 0.020187f, 0.979004f, + 0.022797f, 0.976562f, 0.024429f, 0.974121f, 0.025803f, 0.972168f, 0.028259f, 0.969238f, + 0.030441f, 0.967285f, 0.032379f, 0.963867f, 0.034424f, 0.961426f, 0.036316f, 0.958984f, + 0.038300f, 0.956055f, 0.040894f, 0.953125f, 0.043427f, 0.950195f, 0.045441f, 0.947266f, + 0.047516f, 0.944336f, 0.049561f, 0.941406f, 0.052124f, 0.938477f, 0.055328f, 0.934570f, + 0.057892f, 0.931152f, 0.060272f, 0.927734f, 0.062622f, 0.924316f, 0.065247f, 0.920898f, + 0.068298f, 0.916992f, 0.071350f, 0.913086f, 0.074707f, 0.908691f, 0.077576f, 0.904297f, + 0.080627f, 0.899902f, 0.083740f, 0.895996f, 0.087280f, 0.891113f, 0.090576f, 0.886719f, + 0.094360f, 0.881348f, 0.098389f, 0.875977f, 0.102173f, 0.870117f, 0.105530f, 0.864746f, + 0.108582f, 0.857910f, 0.112732f, 0.851074f, 0.116455f, 0.844238f, 0.120972f, 0.836914f, + 0.125732f, 0.828613f, 0.130737f, 0.820801f, 0.135376f, 0.812012f, 0.140625f, 0.802734f, + 0.144897f, 0.791992f, 0.149658f, 0.781250f, 0.154785f, 0.769531f, 0.159668f, 0.755371f, + 0.165405f, 0.739746f, 0.170166f, 0.722168f, 0.174316f, 0.702148f, 0.176758f, 0.678711f, + 0.177368f, 0.646973f, 0.171387f, 0.602051f, 0.146118f, 0.523926f, 0.048859f, 0.270020f, + 0.000000f, 1.000000f, 0.002544f, 0.998535f, 0.004772f, 0.997070f, 0.007710f, 0.994141f, + 0.009491f, 0.992188f, 0.012726f, 0.989258f, 0.014473f, 0.987305f, 0.017151f, 0.983887f, + 0.019028f, 0.981934f, 0.022507f, 0.979004f, 0.025543f, 0.975098f, 0.027527f, 0.972656f, + 0.030655f, 0.969238f, 0.033142f, 0.966309f, 0.036011f, 0.962891f, 0.038300f, 0.959961f, + 0.041534f, 0.956543f, 0.043701f, 0.953613f, 0.046478f, 0.950195f, 0.049713f, 0.946777f, + 0.052704f, 0.943359f, 0.055176f, 0.939941f, 0.057617f, 0.936523f, 0.060699f, 0.933105f, + 0.064087f, 0.929199f, 0.066895f, 0.925293f, 0.070190f, 0.921387f, 0.073608f, 0.917480f, + 0.076477f, 0.913574f, 0.079346f, 0.909668f, 0.082764f, 0.905762f, 0.086243f, 0.901367f, + 0.090454f, 0.896484f, 0.093811f, 0.892090f, 0.097168f, 0.887695f, 0.100525f, 0.883301f, + 0.104004f, 0.878906f, 0.107483f, 0.874023f, 0.112305f, 0.868652f, 0.116699f, 0.862793f, + 0.120728f, 0.857422f, 0.124756f, 0.851562f, 0.128784f, 0.845703f, 0.133057f, 0.840332f, + 0.136841f, 0.833496f, 0.140747f, 0.826660f, 0.145386f, 0.818848f, 0.150269f, 0.811035f, + 0.154785f, 0.802734f, 0.159790f, 0.794922f, 0.164917f, 0.786133f, 0.170166f, 0.777344f, + 0.174194f, 0.767578f, 0.179199f, 0.756348f, 0.184692f, 0.744141f, 0.189453f, 0.730957f, + 0.194214f, 0.716309f, 0.197632f, 0.699707f, 0.200562f, 0.681641f, 0.201538f, 0.658691f, + 0.200317f, 0.628906f, 0.192017f, 0.587402f, 0.162109f, 0.514648f, 0.053925f, 0.268311f, + 0.000000f, 1.000000f, 0.003534f, 0.998047f, 0.007156f, 0.995605f, 0.010788f, 0.992188f, + 0.014999f, 0.988281f, 0.018341f, 0.984863f, 0.022064f, 0.980957f, 0.025620f, 0.977539f, + 0.028030f, 0.974609f, 0.032074f, 0.970215f, 0.035797f, 0.966309f, 0.039429f, 0.962402f, + 0.043579f, 0.958008f, 0.047577f, 0.953613f, 0.051056f, 0.949707f, 0.054382f, 0.945801f, + 0.058167f, 0.941406f, 0.062408f, 0.937012f, 0.065552f, 0.933105f, 0.069153f, 0.929199f, + 0.072632f, 0.924805f, 0.076477f, 0.920410f, 0.080505f, 0.916016f, 0.084473f, 0.911621f, + 0.087891f, 0.907227f, 0.091736f, 0.903320f, 0.095093f, 0.898926f, 0.099365f, 0.894531f, + 0.103699f, 0.889648f, 0.107544f, 0.884766f, 0.111267f, 0.880371f, 0.115479f, 0.875488f, + 0.119690f, 0.870605f, 0.123413f, 0.865723f, 0.127075f, 0.860840f, 0.131592f, 0.855957f, + 0.136230f, 0.850098f, 0.140381f, 0.844727f, 0.145508f, 0.838867f, 0.149658f, 0.833496f, + 0.153809f, 0.828125f, 0.158081f, 0.822266f, 0.162231f, 0.816895f, 0.167114f, 0.810547f, + 0.172607f, 0.803711f, 0.176514f, 0.796387f, 0.180786f, 0.788574f, 0.185547f, 0.781250f, + 0.189819f, 0.773438f, 0.194214f, 0.765625f, 0.198853f, 0.757324f, 0.203735f, 0.749023f, + 0.208740f, 0.738770f, 0.213501f, 0.728027f, 0.217529f, 0.716309f, 0.222168f, 0.705078f, + 0.224854f, 0.690918f, 0.228149f, 0.676758f, 0.228882f, 0.659668f, 0.228638f, 0.637695f, + 0.225342f, 0.610840f, 0.213379f, 0.572754f, 0.178833f, 0.505859f, 0.058899f, 0.265869f, + 0.000000f, 1.000000f, 0.006603f, 0.996582f, 0.011757f, 0.992188f, 0.017883f, 0.987793f, + 0.022705f, 0.982910f, 0.029099f, 0.977051f, 0.033783f, 0.972168f, 0.039734f, 0.966309f, + 0.044830f, 0.961426f, 0.049103f, 0.956543f, 0.054657f, 0.950684f, 0.059479f, 0.945801f, + 0.065430f, 0.939941f, 0.070129f, 0.934570f, 0.076050f, 0.928711f, 0.081177f, 0.922852f, + 0.085632f, 0.917969f, 0.090088f, 0.913086f, 0.095093f, 0.907715f, 0.100403f, 0.902344f, + 0.105591f, 0.896973f, 0.109741f, 0.892090f, 0.113770f, 0.887207f, 0.118225f, 0.882324f, + 0.123718f, 0.876465f, 0.128540f, 0.871094f, 0.133301f, 0.866211f, 0.137939f, 0.860840f, + 0.142090f, 0.855957f, 0.146118f, 0.851562f, 0.150635f, 0.846191f, 0.155273f, 0.840820f, + 0.160767f, 0.834961f, 0.165527f, 0.829590f, 0.169922f, 0.824219f, 0.174072f, 0.819336f, + 0.178223f, 0.813965f, 0.183350f, 0.808594f, 0.187378f, 0.803223f, 0.191406f, 0.797852f, + 0.196655f, 0.791992f, 0.201294f, 0.785645f, 0.206177f, 0.779785f, 0.210938f, 0.773438f, + 0.215698f, 0.767090f, 0.219482f, 0.760742f, 0.222778f, 0.753418f, 0.226440f, 0.746582f, + 0.230103f, 0.739746f, 0.234253f, 0.732422f, 0.239868f, 0.723633f, 0.244019f, 0.715332f, + 0.248169f, 0.706543f, 0.250977f, 0.696777f, 0.253418f, 0.687012f, 0.256592f, 0.676758f, + 0.258057f, 0.664551f, 0.259521f, 0.652344f, 0.259766f, 0.635254f, 0.258057f, 0.615723f, + 0.251465f, 0.591797f, 0.235229f, 0.557129f, 0.194702f, 0.497559f, 0.064148f, 0.263428f, + 0.000000f, 1.000000f, 0.010880f, 0.994629f, 0.020630f, 0.987793f, 0.031250f, 0.979492f, + 0.041138f, 0.970703f, 0.048767f, 0.962891f, 0.059021f, 0.953613f, 0.066284f, 0.946289f, + 0.075073f, 0.937500f, 0.082520f, 0.930176f, 0.089600f, 0.923340f, 0.097046f, 0.915527f, + 0.103821f, 0.908203f, 0.111206f, 0.901367f, 0.117798f, 0.894531f, 0.126099f, 0.886230f, + 0.132202f, 0.879883f, 0.137817f, 0.873535f, 0.143188f, 0.867676f, 0.149536f, 0.861328f, + 0.155640f, 0.854980f, 0.161621f, 0.848633f, 0.166992f, 0.842773f, 0.172119f, 0.837402f, + 0.177490f, 0.831543f, 0.181763f, 0.826660f, 0.187012f, 0.820801f, 0.192993f, 0.814941f, + 0.198242f, 0.809570f, 0.203003f, 0.803711f, 0.207275f, 0.798828f, 0.211792f, 0.793945f, + 0.216309f, 0.788574f, 0.220093f, 0.783691f, 0.223755f, 0.779297f, 0.229370f, 0.773438f, + 0.234009f, 0.768066f, 0.239014f, 0.762207f, 0.243042f, 0.756836f, 0.247192f, 0.751465f, + 0.250977f, 0.746582f, 0.254395f, 0.741211f, 0.257812f, 0.736328f, 0.262207f, 0.730957f, + 0.265381f, 0.725586f, 0.269043f, 0.720215f, 0.272461f, 0.712891f, 0.275635f, 0.706055f, + 0.278564f, 0.699707f, 0.282715f, 0.692383f, 0.285400f, 0.685547f, 0.288086f, 0.678711f, + 0.290771f, 0.671875f, 0.291748f, 0.664062f, 0.292480f, 0.655762f, 0.293701f, 0.646973f, + 0.294189f, 0.635254f, 0.294678f, 0.623047f, 0.292236f, 0.608887f, 0.287354f, 0.592773f, + 0.277344f, 0.572266f, 0.256348f, 0.542969f, 0.210449f, 0.488037f, 0.069641f, 0.261475f, + 0.000000f, 1.000000f, 0.025513f, 0.987793f, 0.045685f, 0.974121f, 0.065308f, 0.958008f, + 0.083191f, 0.942383f, 0.100220f, 0.927246f, 0.112793f, 0.915039f, 0.126465f, 0.902344f, + 0.138916f, 0.890137f, 0.148438f, 0.879883f, 0.160400f, 0.868164f, 0.170044f, 0.858887f, + 0.177612f, 0.850098f, 0.184937f, 0.842285f, 0.194336f, 0.833496f, 0.203857f, 0.824219f, + 0.210571f, 0.816895f, 0.215820f, 0.810547f, 0.222412f, 0.803711f, 0.229126f, 0.796875f, + 0.236084f, 0.790039f, 0.241821f, 0.783691f, 0.247314f, 0.777832f, 0.251709f, 0.771973f, + 0.256592f, 0.766602f, 0.260010f, 0.762207f, 0.263916f, 0.757324f, 0.269531f, 0.752441f, + 0.274414f, 0.746582f, 0.279297f, 0.741211f, 0.283203f, 0.736816f, 0.286621f, 0.731934f, + 0.290527f, 0.727539f, 0.293457f, 0.723145f, 0.296875f, 0.718750f, 0.299561f, 0.714844f, + 0.302002f, 0.710938f, 0.305176f, 0.707031f, 0.308105f, 0.702637f, 0.312012f, 0.697754f, + 0.315430f, 0.693359f, 0.318848f, 0.688477f, 0.321777f, 0.684082f, 0.324219f, 0.679688f, + 0.326660f, 0.674805f, 0.328613f, 0.670410f, 0.330078f, 0.666504f, 0.330811f, 0.661133f, + 0.331543f, 0.656250f, 0.332520f, 0.651367f, 0.333252f, 0.646484f, 0.333496f, 0.641602f, + 0.335938f, 0.634766f, 0.336914f, 0.627441f, 0.336426f, 0.619629f, 0.336426f, 0.611816f, + 0.334229f, 0.603516f, 0.331055f, 0.594238f, 0.325439f, 0.583496f, 0.316406f, 0.570801f, + 0.302979f, 0.553711f, 0.277588f, 0.528809f, 0.228516f, 0.474121f, 0.075195f, 0.259521f, + 0.000000f, 1.000000f, 0.089172f, 0.960449f, 0.145508f, 0.919434f, 0.182373f, 0.887695f, + 0.211060f, 0.859863f, 0.229858f, 0.839844f, 0.251465f, 0.818848f, 0.264648f, 0.802734f, + 0.275879f, 0.789551f, 0.289551f, 0.774902f, 0.298584f, 0.763672f, 0.304932f, 0.754883f, + 0.310791f, 0.747070f, 0.318115f, 0.738770f, 0.325928f, 0.729980f, 0.331055f, 0.723145f, + 0.336670f, 0.716797f, 0.340576f, 0.710938f, 0.344727f, 0.705566f, 0.347412f, 0.700684f, + 0.350342f, 0.696289f, 0.352051f, 0.692871f, 0.357910f, 0.687500f, 0.362305f, 0.682129f, + 0.364990f, 0.678711f, 0.368164f, 0.674316f, 0.370605f, 0.670898f, 0.373047f, 0.667480f, + 0.375000f, 0.664062f, 0.376221f, 0.661133f, 0.377686f, 0.658691f, 0.378174f, 0.656250f, + 0.379883f, 0.653320f, 0.380371f, 0.650879f, 0.381348f, 0.648438f, 0.381592f, 0.646484f, + 0.382568f, 0.644043f, 0.382812f, 0.641602f, 0.385254f, 0.638184f, 0.386963f, 0.635254f, + 0.389160f, 0.631836f, 0.390625f, 0.628906f, 0.391846f, 0.625488f, 0.392578f, 0.622559f, + 0.393311f, 0.619629f, 0.393555f, 0.616699f, 0.393555f, 0.613770f, 0.392578f, 0.610352f, + 0.391602f, 0.606934f, 0.390869f, 0.603027f, 0.389893f, 0.599609f, 0.388184f, 0.596191f, + 0.385986f, 0.592773f, 0.383789f, 0.588867f, 0.379883f, 0.584473f, 0.376221f, 0.579102f, + 0.371826f, 0.574707f, 0.364746f, 0.567871f, 0.355469f, 0.560547f, 0.345215f, 0.549805f, + 0.330566f, 0.533203f, 0.303223f, 0.508301f, 0.248047f, 0.460205f, 0.080750f, 0.259033f, + 0.000000f, 1.000000f, 0.232544f, 0.900391f, 0.298096f, 0.839844f, 0.331299f, 0.799805f, + 0.352295f, 0.770508f, 0.368896f, 0.747070f, 0.380371f, 0.728027f, 0.389404f, 0.713379f, + 0.397217f, 0.700195f, 0.403076f, 0.689453f, 0.407715f, 0.680176f, 0.413574f, 0.670898f, + 0.417480f, 0.663574f, 0.420410f, 0.657227f, 0.423828f, 0.651367f, 0.425537f, 0.646484f, + 0.428223f, 0.641602f, 0.431152f, 0.636719f, 0.434570f, 0.631836f, 0.436523f, 0.627930f, + 0.437500f, 0.624512f, 0.439697f, 0.621094f, 0.441406f, 0.617676f, 0.442383f, 0.614746f, + 0.443848f, 0.612305f, 0.445312f, 0.609375f, 0.446533f, 0.606445f, 0.446777f, 0.604004f, + 0.448486f, 0.601562f, 0.448975f, 0.599609f, 0.448975f, 0.597168f, 0.450439f, 0.595215f, + 0.451172f, 0.592773f, 0.451660f, 0.590820f, 0.452393f, 0.588379f, 0.452393f, 0.586426f, + 0.452881f, 0.584473f, 0.453125f, 0.582520f, 0.453613f, 0.580566f, 0.453857f, 0.578125f, + 0.453613f, 0.576172f, 0.453369f, 0.574219f, 0.454590f, 0.571777f, 0.454102f, 0.569824f, + 0.454102f, 0.567383f, 0.453613f, 0.564941f, 0.452881f, 0.562988f, 0.452881f, 0.560547f, + 0.450928f, 0.556641f, 0.449707f, 0.553223f, 0.448486f, 0.549805f, 0.446533f, 0.546387f, + 0.444580f, 0.542969f, 0.443115f, 0.539551f, 0.439941f, 0.534668f, 0.436279f, 0.529297f, + 0.432617f, 0.523926f, 0.426025f, 0.517090f, 0.418701f, 0.509766f, 0.407959f, 0.499756f, + 0.392334f, 0.485596f, 0.367188f, 0.464844f, 0.314209f, 0.421631f, 0.146484f, 0.244019f, + 0.000000f, 1.000000f, 0.236572f, 0.898438f, 0.304443f, 0.836426f, 0.340576f, 0.794434f, + 0.363770f, 0.763184f, 0.382080f, 0.737793f, 0.394287f, 0.718262f, 0.403809f, 0.702148f, + 0.414551f, 0.687012f, 0.420898f, 0.675293f, 0.428223f, 0.664551f, 0.434082f, 0.654785f, + 0.439453f, 0.645996f, 0.443848f, 0.638672f, 0.448486f, 0.631348f, 0.451904f, 0.625000f, + 0.456055f, 0.619141f, 0.459717f, 0.613281f, 0.463623f, 0.607910f, 0.466797f, 0.602539f, + 0.469971f, 0.597656f, 0.473389f, 0.592773f, 0.475586f, 0.588867f, 0.478027f, 0.584961f, + 0.479980f, 0.581055f, 0.482422f, 0.577637f, 0.484619f, 0.573730f, 0.486572f, 0.570312f, + 0.487793f, 0.567383f, 0.489990f, 0.563965f, 0.490723f, 0.561035f, 0.493652f, 0.558105f, + 0.495605f, 0.554688f, 0.496826f, 0.551270f, 0.497803f, 0.548828f, 0.499023f, 0.545898f, + 0.500977f, 0.542480f, 0.502441f, 0.539551f, 0.503906f, 0.536621f, 0.504883f, 0.533691f, + 0.506836f, 0.530273f, 0.508301f, 0.526855f, 0.509766f, 0.523438f, 0.510254f, 0.520508f, + 0.511719f, 0.517090f, 0.512207f, 0.513672f, 0.514160f, 0.509766f, 0.514648f, 0.506348f, + 0.514648f, 0.501465f, 0.514160f, 0.497070f, 0.514160f, 0.492432f, 0.514648f, 0.487549f, + 0.515137f, 0.482666f, 0.515137f, 0.477295f, 0.515137f, 0.471436f, 0.513184f, 0.464355f, + 0.511230f, 0.456787f, 0.507812f, 0.448730f, 0.503906f, 0.438965f, 0.497803f, 0.426514f, + 0.488037f, 0.411133f, 0.469727f, 0.388428f, 0.429199f, 0.347900f, 0.287354f, 0.201904f, + 0.000000f, 1.000000f, 0.240356f, 0.896973f, 0.311523f, 0.833008f, 0.349609f, 0.789062f, + 0.375732f, 0.755859f, 0.395020f, 0.729004f, 0.409668f, 0.707520f, 0.422119f, 0.689453f, + 0.434082f, 0.672852f, 0.442383f, 0.659668f, 0.449463f, 0.647949f, 0.457520f, 0.636719f, + 0.463379f, 0.626953f, 0.468750f, 0.618164f, 0.474121f, 0.610352f, 0.478760f, 0.603027f, + 0.483643f, 0.595703f, 0.488281f, 0.589355f, 0.492920f, 0.583008f, 0.497314f, 0.576660f, + 0.502441f, 0.570312f, 0.505371f, 0.564941f, 0.509277f, 0.560059f, 0.512695f, 0.554688f, + 0.515137f, 0.550293f, 0.518555f, 0.545898f, 0.521973f, 0.541016f, 0.524414f, 0.537109f, + 0.526855f, 0.532715f, 0.529785f, 0.528320f, 0.532227f, 0.524414f, 0.536133f, 0.520020f, + 0.539062f, 0.516113f, 0.540527f, 0.512207f, 0.542969f, 0.508301f, 0.545898f, 0.504395f, + 0.547852f, 0.500488f, 0.550781f, 0.496338f, 0.554199f, 0.492188f, 0.555176f, 0.488281f, + 0.558105f, 0.484131f, 0.561035f, 0.479736f, 0.562012f, 0.475830f, 0.563965f, 0.471680f, + 0.566895f, 0.467285f, 0.569336f, 0.462402f, 0.571289f, 0.457764f, 0.573730f, 0.453125f, + 0.576172f, 0.447998f, 0.576660f, 0.441650f, 0.577637f, 0.436035f, 0.579590f, 0.429932f, + 0.580566f, 0.423584f, 0.582520f, 0.416748f, 0.584961f, 0.409668f, 0.584473f, 0.401611f, + 0.584473f, 0.392578f, 0.584473f, 0.383057f, 0.583008f, 0.371338f, 0.581055f, 0.358154f, + 0.574219f, 0.341309f, 0.562500f, 0.318604f, 0.534668f, 0.279541f, 0.420898f, 0.158325f, + 0.000000f, 1.000000f, 0.244019f, 0.895508f, 0.317871f, 0.829590f, 0.360596f, 0.782715f, + 0.389648f, 0.747070f, 0.410156f, 0.718750f, 0.425781f, 0.696289f, 0.438477f, 0.677246f, + 0.451660f, 0.659668f, 0.460693f, 0.645020f, 0.469727f, 0.631836f, 0.479980f, 0.619141f, + 0.487061f, 0.607910f, 0.494141f, 0.598145f, 0.499756f, 0.588867f, 0.505371f, 0.580566f, + 0.511719f, 0.572754f, 0.517090f, 0.564941f, 0.522461f, 0.557129f, 0.528320f, 0.549805f, + 0.533203f, 0.542969f, 0.536621f, 0.537109f, 0.541992f, 0.530762f, 0.545898f, 0.524902f, + 0.550781f, 0.519043f, 0.555176f, 0.513672f, 0.559082f, 0.507812f, 0.561523f, 0.502930f, + 0.565918f, 0.498047f, 0.569824f, 0.492920f, 0.573730f, 0.487793f, 0.577148f, 0.482910f, + 0.581055f, 0.477783f, 0.583008f, 0.473145f, 0.587402f, 0.468262f, 0.590332f, 0.463623f, + 0.593750f, 0.458740f, 0.597168f, 0.453613f, 0.601074f, 0.448730f, 0.604004f, 0.443848f, + 0.605957f, 0.439209f, 0.609863f, 0.434082f, 0.613770f, 0.428711f, 0.615723f, 0.423828f, + 0.619629f, 0.418213f, 0.623047f, 0.412842f, 0.625488f, 0.407471f, 0.628906f, 0.401611f, + 0.631836f, 0.395752f, 0.634277f, 0.389160f, 0.635254f, 0.382324f, 0.639160f, 0.375000f, + 0.642090f, 0.367432f, 0.644531f, 0.360107f, 0.646484f, 0.352295f, 0.648926f, 0.343750f, + 0.649902f, 0.333252f, 0.652344f, 0.322998f, 0.652344f, 0.310547f, 0.652344f, 0.296631f, + 0.649414f, 0.280029f, 0.642090f, 0.257324f, 0.621094f, 0.220337f, 0.536621f, 0.121216f, + 0.000000f, 1.000000f, 0.247437f, 0.894043f, 0.325684f, 0.825195f, 0.371338f, 0.776367f, + 0.401855f, 0.739746f, 0.422363f, 0.710449f, 0.441650f, 0.685547f, 0.456543f, 0.664062f, + 0.469971f, 0.645508f, 0.480957f, 0.629395f, 0.490234f, 0.615723f, 0.501953f, 0.601074f, + 0.510254f, 0.589355f, 0.518066f, 0.578125f, 0.525391f, 0.567871f, 0.532227f, 0.558105f, + 0.539551f, 0.548828f, 0.544922f, 0.540527f, 0.551270f, 0.532227f, 0.559570f, 0.523438f, + 0.563965f, 0.515625f, 0.569336f, 0.508789f, 0.575195f, 0.501465f, 0.579590f, 0.495117f, + 0.584961f, 0.488281f, 0.589844f, 0.481934f, 0.594238f, 0.475586f, 0.599121f, 0.469482f, + 0.603027f, 0.463867f, 0.607910f, 0.457764f, 0.612305f, 0.451904f, 0.616699f, 0.446289f, + 0.620605f, 0.440430f, 0.625488f, 0.434570f, 0.628418f, 0.429443f, 0.632324f, 0.423828f, + 0.637695f, 0.417969f, 0.641113f, 0.412354f, 0.644531f, 0.406982f, 0.648926f, 0.401123f, + 0.651367f, 0.395752f, 0.656250f, 0.389893f, 0.660156f, 0.384033f, 0.663574f, 0.378174f, + 0.667969f, 0.372070f, 0.670898f, 0.366211f, 0.675781f, 0.359863f, 0.678711f, 0.353516f, + 0.683105f, 0.347168f, 0.686035f, 0.340576f, 0.688965f, 0.332520f, 0.692383f, 0.324951f, + 0.695312f, 0.316650f, 0.698242f, 0.308594f, 0.701660f, 0.300049f, 0.704590f, 0.291260f, + 0.708008f, 0.281494f, 0.709961f, 0.269775f, 0.711914f, 0.258057f, 0.713867f, 0.244141f, + 0.711914f, 0.227661f, 0.707520f, 0.206665f, 0.694336f, 0.173340f, 0.628906f, 0.092407f, + 0.000000f, 1.000000f, 0.251709f, 0.892090f, 0.334229f, 0.820801f, 0.380615f, 0.770996f, + 0.413330f, 0.731934f, 0.438232f, 0.700195f, 0.457275f, 0.674316f, 0.473389f, 0.651855f, + 0.488770f, 0.631836f, 0.501465f, 0.614258f, 0.511719f, 0.598633f, 0.524414f, 0.583496f, + 0.533203f, 0.569824f, 0.541992f, 0.557617f, 0.551270f, 0.545898f, 0.557617f, 0.535645f, + 0.566895f, 0.525391f, 0.572754f, 0.516113f, 0.580078f, 0.506836f, 0.587891f, 0.497559f, + 0.594238f, 0.488770f, 0.600586f, 0.480713f, 0.605957f, 0.472656f, 0.611816f, 0.465332f, + 0.618652f, 0.457520f, 0.623535f, 0.450684f, 0.628906f, 0.443604f, 0.633789f, 0.436768f, + 0.639160f, 0.430176f, 0.644531f, 0.423584f, 0.649902f, 0.416748f, 0.652344f, 0.410889f, + 0.658691f, 0.404053f, 0.662598f, 0.398193f, 0.666992f, 0.392090f, 0.671875f, 0.385742f, + 0.677246f, 0.379150f, 0.680664f, 0.373291f, 0.685059f, 0.367188f, 0.689453f, 0.361084f, + 0.693359f, 0.354980f, 0.698730f, 0.348633f, 0.703125f, 0.342041f, 0.706543f, 0.335938f, + 0.710449f, 0.329346f, 0.714355f, 0.323242f, 0.718262f, 0.316406f, 0.723145f, 0.309570f, + 0.727051f, 0.302979f, 0.730469f, 0.295898f, 0.734375f, 0.288330f, 0.738770f, 0.279785f, + 0.741699f, 0.271484f, 0.743652f, 0.263428f, 0.748535f, 0.254883f, 0.752441f, 0.245850f, + 0.756836f, 0.236206f, 0.757812f, 0.224976f, 0.761719f, 0.213501f, 0.762207f, 0.200195f, + 0.762695f, 0.185181f, 0.760742f, 0.164429f, 0.749512f, 0.136719f, 0.702148f, 0.069824f, + 0.000000f, 1.000000f, 0.256592f, 0.890137f, 0.341309f, 0.817383f, 0.389893f, 0.765625f, + 0.425049f, 0.724609f, 0.451172f, 0.691406f, 0.473145f, 0.663086f, 0.491211f, 0.638672f, + 0.506836f, 0.617676f, 0.520508f, 0.598633f, 0.533691f, 0.581543f, 0.545410f, 0.565430f, + 0.555664f, 0.550781f, 0.566406f, 0.537598f, 0.575684f, 0.524902f, 0.583496f, 0.513672f, + 0.592773f, 0.502441f, 0.600586f, 0.492188f, 0.606445f, 0.482666f, 0.616699f, 0.471680f, + 0.623535f, 0.462158f, 0.630859f, 0.453369f, 0.637207f, 0.444580f, 0.644043f, 0.436035f, + 0.649414f, 0.428223f, 0.655762f, 0.420166f, 0.661133f, 0.412598f, 0.666016f, 0.405518f, + 0.673340f, 0.397949f, 0.679199f, 0.390381f, 0.683594f, 0.383545f, 0.687500f, 0.376953f, + 0.693848f, 0.369873f, 0.697754f, 0.363281f, 0.702637f, 0.356689f, 0.708984f, 0.349854f, + 0.712891f, 0.343018f, 0.718262f, 0.336426f, 0.721680f, 0.330322f, 0.726562f, 0.323730f, + 0.730469f, 0.317383f, 0.735840f, 0.310303f, 0.740234f, 0.303711f, 0.744629f, 0.297363f, + 0.748047f, 0.290771f, 0.753418f, 0.283936f, 0.757324f, 0.277344f, 0.761719f, 0.270264f, + 0.765625f, 0.263428f, 0.770508f, 0.256104f, 0.773926f, 0.249268f, 0.776855f, 0.240845f, + 0.780762f, 0.232422f, 0.783691f, 0.224487f, 0.787598f, 0.215942f, 0.791992f, 0.207031f, + 0.795410f, 0.197632f, 0.798340f, 0.187744f, 0.800293f, 0.176392f, 0.802734f, 0.164917f, + 0.803223f, 0.149902f, 0.802246f, 0.132690f, 0.793457f, 0.107910f, 0.758301f, 0.053741f, + 0.000000f, 1.000000f, 0.261963f, 0.887695f, 0.349365f, 0.812988f, 0.400391f, 0.759277f, + 0.437256f, 0.716309f, 0.466309f, 0.681641f, 0.488770f, 0.651855f, 0.507812f, 0.626465f, + 0.526367f, 0.603516f, 0.541016f, 0.583008f, 0.554688f, 0.564941f, 0.566895f, 0.547852f, + 0.579590f, 0.531738f, 0.589355f, 0.517578f, 0.599609f, 0.503906f, 0.609863f, 0.491211f, + 0.618164f, 0.479736f, 0.626465f, 0.468262f, 0.634766f, 0.458008f, 0.643555f, 0.446777f, + 0.650391f, 0.436768f, 0.658691f, 0.426758f, 0.666504f, 0.417480f, 0.672852f, 0.408447f, + 0.679199f, 0.399414f, 0.685547f, 0.391357f, 0.692383f, 0.383057f, 0.699219f, 0.375000f, + 0.702637f, 0.367432f, 0.708496f, 0.359619f, 0.715332f, 0.351807f, 0.719238f, 0.344971f, + 0.724609f, 0.337891f, 0.730957f, 0.330566f, 0.735352f, 0.323486f, 0.740723f, 0.316406f, + 0.745605f, 0.309570f, 0.750000f, 0.302979f, 0.754883f, 0.296143f, 0.758789f, 0.289795f, + 0.764648f, 0.282715f, 0.769043f, 0.275635f, 0.772949f, 0.269287f, 0.776367f, 0.262695f, + 0.780762f, 0.256104f, 0.785645f, 0.249512f, 0.790527f, 0.242432f, 0.794434f, 0.235596f, + 0.798340f, 0.228882f, 0.802246f, 0.221924f, 0.808105f, 0.214722f, 0.809570f, 0.207520f, + 0.813477f, 0.199341f, 0.816895f, 0.190918f, 0.820312f, 0.182739f, 0.823242f, 0.174683f, + 0.827148f, 0.165894f, 0.830566f, 0.157104f, 0.832520f, 0.146240f, 0.835449f, 0.135132f, + 0.836426f, 0.122559f, 0.835938f, 0.107117f, 0.829590f, 0.086182f, 0.802734f, 0.041168f, + 0.000000f, 1.000000f, 0.266357f, 0.885742f, 0.358154f, 0.808594f, 0.411377f, 0.752930f, + 0.449951f, 0.708496f, 0.480957f, 0.671875f, 0.504883f, 0.640137f, 0.525879f, 0.613281f, + 0.544434f, 0.589355f, 0.561035f, 0.567383f, 0.575684f, 0.547852f, 0.589355f, 0.530273f, + 0.600098f, 0.513672f, 0.613281f, 0.497559f, 0.624023f, 0.483154f, 0.633789f, 0.469971f, + 0.642578f, 0.457275f, 0.651367f, 0.445312f, 0.660156f, 0.434082f, 0.669922f, 0.422363f, + 0.677246f, 0.411621f, 0.685059f, 0.401611f, 0.693848f, 0.391113f, 0.701172f, 0.381348f, + 0.706055f, 0.372803f, 0.713379f, 0.363770f, 0.719727f, 0.355225f, 0.725586f, 0.346680f, + 0.731934f, 0.338623f, 0.738281f, 0.330322f, 0.743652f, 0.322754f, 0.747559f, 0.315674f, + 0.754883f, 0.307617f, 0.760254f, 0.300293f, 0.764160f, 0.293213f, 0.769531f, 0.285889f, + 0.774902f, 0.279053f, 0.778809f, 0.272217f, 0.783203f, 0.265625f, 0.789062f, 0.258301f, + 0.792969f, 0.251465f, 0.797363f, 0.244995f, 0.801758f, 0.238403f, 0.805664f, 0.231934f, + 0.809082f, 0.225586f, 0.815430f, 0.218506f, 0.818359f, 0.211914f, 0.822266f, 0.205078f, + 0.826660f, 0.198730f, 0.830566f, 0.192139f, 0.834473f, 0.185181f, 0.838379f, 0.178589f, + 0.840332f, 0.171021f, 0.843750f, 0.162842f, 0.847656f, 0.155151f, 0.849609f, 0.147583f, + 0.853516f, 0.139404f, 0.857422f, 0.131104f, 0.859375f, 0.121948f, 0.861328f, 0.111755f, + 0.862305f, 0.100891f, 0.862793f, 0.088318f, 0.858887f, 0.068481f, 0.835449f, 0.032043f, + 0.000000f, 1.000000f, 0.270020f, 0.884766f, 0.364746f, 0.805176f, 0.421631f, 0.746582f, + 0.463379f, 0.700195f, 0.493652f, 0.662598f, 0.520996f, 0.628906f, 0.543945f, 0.600098f, + 0.562012f, 0.575195f, 0.579590f, 0.552246f, 0.594727f, 0.531738f, 0.610840f, 0.512695f, + 0.622559f, 0.495361f, 0.635742f, 0.478516f, 0.646973f, 0.463135f, 0.656738f, 0.449219f, + 0.666992f, 0.435547f, 0.675781f, 0.422852f, 0.685059f, 0.411133f, 0.693848f, 0.399414f, + 0.702148f, 0.387939f, 0.709961f, 0.377197f, 0.718262f, 0.366211f, 0.725586f, 0.356445f, + 0.732422f, 0.346924f, 0.739746f, 0.337646f, 0.746094f, 0.328857f, 0.752441f, 0.319824f, + 0.757324f, 0.311768f, 0.764648f, 0.303467f, 0.769043f, 0.295654f, 0.774902f, 0.287842f, + 0.780273f, 0.280273f, 0.787109f, 0.272461f, 0.789551f, 0.265625f, 0.794922f, 0.258301f, + 0.799805f, 0.251465f, 0.805176f, 0.244385f, 0.809082f, 0.237427f, 0.813965f, 0.230835f, + 0.818359f, 0.223999f, 0.822754f, 0.217407f, 0.825195f, 0.211426f, 0.830078f, 0.204712f, + 0.835449f, 0.197998f, 0.838379f, 0.191650f, 0.842285f, 0.185303f, 0.846680f, 0.178955f, + 0.849121f, 0.172974f, 0.853516f, 0.166748f, 0.857422f, 0.159912f, 0.861328f, 0.153320f, + 0.864746f, 0.147217f, 0.867188f, 0.139404f, 0.868652f, 0.132812f, 0.872070f, 0.125000f, + 0.875000f, 0.117737f, 0.878906f, 0.110168f, 0.881348f, 0.102722f, 0.882324f, 0.093018f, + 0.884766f, 0.083496f, 0.883301f, 0.071716f, 0.882812f, 0.056458f, 0.862793f, 0.025955f, + 0.000000f, 1.000000f, 0.274414f, 0.882812f, 0.373779f, 0.800293f, 0.433594f, 0.739746f, + 0.476318f, 0.691895f, 0.507812f, 0.652832f, 0.537109f, 0.617676f, 0.560547f, 0.587891f, + 0.581055f, 0.561035f, 0.599121f, 0.537109f, 0.614746f, 0.515625f, 0.629883f, 0.495850f, + 0.644043f, 0.477295f, 0.656738f, 0.459717f, 0.668457f, 0.443848f, 0.679199f, 0.428711f, + 0.689941f, 0.414551f, 0.699219f, 0.401611f, 0.708496f, 0.389160f, 0.716309f, 0.377197f, + 0.725586f, 0.365479f, 0.734375f, 0.354004f, 0.741211f, 0.343018f, 0.749023f, 0.332764f, + 0.755371f, 0.323242f, 0.763184f, 0.313232f, 0.770508f, 0.303955f, 0.774902f, 0.295654f, + 0.781738f, 0.286621f, 0.786621f, 0.278809f, 0.793457f, 0.270508f, 0.798340f, 0.262695f, + 0.803223f, 0.255127f, 0.808594f, 0.247559f, 0.813965f, 0.240356f, 0.816895f, 0.233643f, + 0.823242f, 0.226318f, 0.827637f, 0.219482f, 0.831543f, 0.212646f, 0.834961f, 0.206299f, + 0.839844f, 0.199707f, 0.843262f, 0.193359f, 0.847656f, 0.187134f, 0.852051f, 0.180542f, + 0.856934f, 0.174316f, 0.858887f, 0.168335f, 0.863770f, 0.162231f, 0.865234f, 0.156616f, + 0.870117f, 0.150879f, 0.874023f, 0.144043f, 0.877441f, 0.138306f, 0.880371f, 0.132324f, + 0.883789f, 0.126587f, 0.884766f, 0.120605f, 0.888672f, 0.113098f, 0.891113f, 0.106262f, + 0.893066f, 0.099670f, 0.895996f, 0.092957f, 0.897949f, 0.086548f, 0.899414f, 0.077881f, + 0.901367f, 0.069031f, 0.901855f, 0.058929f, 0.898926f, 0.045105f, 0.885742f, 0.021057f, + 0.000000f, 1.000000f, 0.280029f, 0.880371f, 0.381104f, 0.796875f, 0.444336f, 0.733887f, + 0.489014f, 0.684082f, 0.522461f, 0.642578f, 0.551758f, 0.606445f, 0.577148f, 0.575195f, + 0.598145f, 0.547363f, 0.618652f, 0.521973f, 0.634766f, 0.499756f, 0.648926f, 0.479248f, + 0.663086f, 0.460205f, 0.677734f, 0.441406f, 0.689453f, 0.425049f, 0.700195f, 0.409424f, + 0.710449f, 0.394775f, 0.721191f, 0.381104f, 0.729492f, 0.368164f, 0.738770f, 0.355957f, + 0.746582f, 0.344482f, 0.755859f, 0.332275f, 0.764160f, 0.320801f, 0.770508f, 0.310791f, + 0.777832f, 0.300781f, 0.785156f, 0.290771f, 0.791504f, 0.281250f, 0.797363f, 0.272705f, + 0.802246f, 0.264404f, 0.808594f, 0.255859f, 0.813965f, 0.247437f, 0.819336f, 0.239868f, + 0.823730f, 0.232300f, 0.828125f, 0.224976f, 0.833984f, 0.217773f, 0.837402f, 0.210815f, + 0.842773f, 0.203857f, 0.846680f, 0.197144f, 0.851074f, 0.190430f, 0.853516f, 0.184692f, + 0.860352f, 0.177734f, 0.861816f, 0.171997f, 0.867676f, 0.165527f, 0.869141f, 0.159912f, + 0.873535f, 0.153931f, 0.876465f, 0.148315f, 0.880371f, 0.142456f, 0.883301f, 0.136963f, + 0.887207f, 0.131104f, 0.890625f, 0.125366f, 0.893066f, 0.120178f, 0.895996f, 0.114868f, + 0.898438f, 0.109558f, 0.903320f, 0.103455f, 0.903809f, 0.097290f, 0.905762f, 0.091064f, + 0.907715f, 0.085571f, 0.910156f, 0.079102f, 0.914551f, 0.072266f, 0.914551f, 0.066528f, + 0.915039f, 0.058411f, 0.917480f, 0.049927f, 0.914062f, 0.038879f, 0.903320f, 0.016357f, + 0.000000f, 1.000000f, 0.283447f, 0.879395f, 0.390381f, 0.791992f, 0.454834f, 0.727539f, + 0.501465f, 0.675781f, 0.538086f, 0.632324f, 0.568848f, 0.595215f, 0.593750f, 0.562500f, + 0.615234f, 0.534180f, 0.635742f, 0.507812f, 0.653320f, 0.484131f, 0.668457f, 0.462891f, + 0.682617f, 0.443115f, 0.697266f, 0.424072f, 0.708984f, 0.406982f, 0.720215f, 0.390625f, + 0.730957f, 0.375977f, 0.740234f, 0.362061f, 0.749512f, 0.348633f, 0.757812f, 0.336182f, + 0.766113f, 0.324219f, 0.775879f, 0.312012f, 0.783691f, 0.300537f, 0.789551f, 0.290283f, + 0.797852f, 0.279785f, 0.804688f, 0.269775f, 0.810547f, 0.260742f, 0.815430f, 0.252197f, + 0.820801f, 0.243408f, 0.827637f, 0.234741f, 0.832520f, 0.226807f, 0.837402f, 0.219360f, + 0.842773f, 0.211792f, 0.846191f, 0.204712f, 0.852539f, 0.197021f, 0.854980f, 0.190674f, + 0.860840f, 0.183716f, 0.863770f, 0.177368f, 0.867188f, 0.171265f, 0.872559f, 0.164917f, + 0.875488f, 0.158813f, 0.879395f, 0.152710f, 0.881348f, 0.147217f, 0.885742f, 0.141602f, + 0.888672f, 0.136230f, 0.892578f, 0.130371f, 0.895020f, 0.125366f, 0.897949f, 0.119873f, + 0.901367f, 0.114807f, 0.903809f, 0.109680f, 0.906738f, 0.104797f, 0.910156f, 0.099487f, + 0.912109f, 0.094666f, 0.916016f, 0.089294f, 0.916992f, 0.084778f, 0.919434f, 0.078430f, + 0.920410f, 0.072815f, 0.923340f, 0.066650f, 0.923828f, 0.061829f, 0.927734f, 0.055756f, + 0.927734f, 0.048950f, 0.928223f, 0.041290f, 0.926758f, 0.031555f, 0.917969f, 0.013451f, + 0.000000f, 1.000000f, 0.287109f, 0.877930f, 0.398926f, 0.787598f, 0.465332f, 0.721680f, + 0.513672f, 0.667480f, 0.552246f, 0.622559f, 0.583984f, 0.583984f, 0.610352f, 0.550293f, + 0.632812f, 0.520508f, 0.652832f, 0.493896f, 0.670410f, 0.469727f, 0.687012f, 0.446777f, + 0.700684f, 0.427246f, 0.716797f, 0.406982f, 0.728516f, 0.389404f, 0.739258f, 0.373047f, + 0.750000f, 0.357666f, 0.759766f, 0.343262f, 0.768555f, 0.329834f, 0.776367f, 0.317383f, + 0.785156f, 0.305176f, 0.793945f, 0.293213f, 0.801270f, 0.281738f, 0.809082f, 0.270752f, + 0.814941f, 0.260742f, 0.822266f, 0.250732f, 0.827148f, 0.241821f, 0.833984f, 0.232910f, + 0.838867f, 0.224121f, 0.844238f, 0.215698f, 0.848633f, 0.208252f, 0.853516f, 0.200562f, + 0.858398f, 0.193237f, 0.863770f, 0.185913f, 0.867188f, 0.179077f, 0.871094f, 0.172607f, + 0.874512f, 0.166260f, 0.879395f, 0.159790f, 0.882812f, 0.153809f, 0.885742f, 0.147827f, + 0.890625f, 0.141968f, 0.892578f, 0.136475f, 0.895996f, 0.131226f, 0.898926f, 0.125732f, + 0.903320f, 0.120300f, 0.905273f, 0.115295f, 0.907715f, 0.110413f, 0.910156f, 0.105652f, + 0.914062f, 0.100647f, 0.916992f, 0.095520f, 0.918945f, 0.091248f, 0.921875f, 0.086487f, + 0.923340f, 0.082458f, 0.926270f, 0.077637f, 0.929199f, 0.072815f, 0.929688f, 0.068237f, + 0.930664f, 0.063293f, 0.933105f, 0.057434f, 0.934570f, 0.052734f, 0.936035f, 0.047668f, + 0.938477f, 0.041992f, 0.937012f, 0.034790f, 0.937012f, 0.025848f, 0.929688f, 0.011162f, + 0.000000f, 1.000000f, 0.293945f, 0.874512f, 0.406738f, 0.783691f, 0.476562f, 0.714844f, + 0.527832f, 0.659180f, 0.566895f, 0.612793f, 0.598633f, 0.573242f, 0.626953f, 0.538086f, + 0.649414f, 0.507324f, 0.668945f, 0.480469f, 0.688965f, 0.454590f, 0.704590f, 0.431885f, + 0.719727f, 0.410645f, 0.732422f, 0.391602f, 0.745605f, 0.373291f, 0.757812f, 0.355957f, + 0.768066f, 0.340820f, 0.777344f, 0.325928f, 0.786133f, 0.312500f, 0.794434f, 0.299805f, + 0.802246f, 0.287354f, 0.809082f, 0.276123f, 0.817383f, 0.264404f, 0.825684f, 0.253174f, + 0.831055f, 0.243286f, 0.837402f, 0.233398f, 0.843750f, 0.224365f, 0.849609f, 0.215332f, + 0.855469f, 0.206665f, 0.858398f, 0.198975f, 0.862793f, 0.191528f, 0.869629f, 0.183472f, + 0.872070f, 0.176392f, 0.877441f, 0.169312f, 0.880859f, 0.163086f, 0.884277f, 0.156860f, + 0.889160f, 0.150269f, 0.892578f, 0.143921f, 0.895996f, 0.138306f, 0.897461f, 0.133179f, + 0.902832f, 0.127441f, 0.905273f, 0.121887f, 0.908203f, 0.116760f, 0.910645f, 0.111816f, + 0.913574f, 0.107056f, 0.916504f, 0.102173f, 0.919434f, 0.097473f, 0.922363f, 0.092957f, + 0.923828f, 0.088318f, 0.925781f, 0.084412f, 0.930176f, 0.079895f, 0.931641f, 0.075378f, + 0.933105f, 0.071472f, 0.935547f, 0.067566f, 0.938477f, 0.063354f, 0.939941f, 0.059479f, + 0.940918f, 0.054382f, 0.941406f, 0.049774f, 0.943359f, 0.044891f, 0.945312f, 0.040375f, + 0.946777f, 0.035645f, 0.946777f, 0.029800f, 0.946289f, 0.022919f, 0.940430f, 0.009216f, + 0.000000f, 1.000000f, 0.298584f, 0.873047f, 0.415771f, 0.779297f, 0.487549f, 0.708496f, + 0.539551f, 0.651367f, 0.581055f, 0.603027f, 0.613770f, 0.562500f, 0.642090f, 0.526367f, + 0.666016f, 0.494629f, 0.685547f, 0.466797f, 0.705078f, 0.440674f, 0.722168f, 0.416992f, + 0.736816f, 0.395752f, 0.750000f, 0.376465f, 0.762695f, 0.357422f, 0.772949f, 0.340576f, + 0.783203f, 0.324951f, 0.793945f, 0.309814f, 0.802734f, 0.296143f, 0.811035f, 0.283203f, + 0.818359f, 0.270996f, 0.824707f, 0.259766f, 0.833008f, 0.248169f, 0.839844f, 0.237305f, + 0.846680f, 0.226929f, 0.852539f, 0.217529f, 0.857422f, 0.208496f, 0.863281f, 0.199341f, + 0.867676f, 0.191284f, 0.872070f, 0.183594f, 0.876465f, 0.175903f, 0.881836f, 0.168213f, + 0.885254f, 0.161621f, 0.888672f, 0.155151f, 0.893066f, 0.148560f, 0.897461f, 0.141846f, + 0.900391f, 0.136230f, 0.903320f, 0.130371f, 0.906250f, 0.125366f, 0.910156f, 0.119385f, + 0.913086f, 0.114075f, 0.916504f, 0.109070f, 0.917969f, 0.104614f, 0.920898f, 0.100342f, + 0.924805f, 0.094727f, 0.925781f, 0.090393f, 0.927246f, 0.086670f, 0.931152f, 0.082275f, + 0.934082f, 0.077698f, 0.935547f, 0.073975f, 0.937012f, 0.070129f, 0.938965f, 0.066467f, + 0.942383f, 0.062408f, 0.943359f, 0.058899f, 0.946289f, 0.055145f, 0.947754f, 0.051483f, + 0.948730f, 0.048096f, 0.949219f, 0.043121f, 0.950195f, 0.039001f, 0.952637f, 0.034546f, + 0.952637f, 0.030472f, 0.954590f, 0.026276f, 0.953125f, 0.019043f, 0.948730f, 0.007641f, + 0.000000f, 1.000000f, 0.302246f, 0.871582f, 0.424805f, 0.774414f, 0.500488f, 0.701172f, + 0.553711f, 0.643066f, 0.594727f, 0.593750f, 0.628418f, 0.552246f, 0.657227f, 0.515137f, + 0.682129f, 0.482178f, 0.702637f, 0.453613f, 0.720703f, 0.427246f, 0.737305f, 0.403076f, + 0.752441f, 0.381592f, 0.764648f, 0.362061f, 0.777832f, 0.342773f, 0.788574f, 0.325928f, + 0.798828f, 0.309570f, 0.809082f, 0.294434f, 0.817383f, 0.281006f, 0.825684f, 0.267578f, + 0.832520f, 0.255859f, 0.839844f, 0.244385f, 0.846191f, 0.233521f, 0.852539f, 0.222900f, + 0.858887f, 0.212646f, 0.865234f, 0.202515f, 0.870605f, 0.193726f, 0.875000f, 0.185425f, + 0.880371f, 0.177124f, 0.884766f, 0.169312f, 0.888672f, 0.161987f, 0.893555f, 0.154785f, + 0.896484f, 0.148315f, 0.901367f, 0.141602f, 0.904785f, 0.135254f, 0.906738f, 0.129639f, + 0.910156f, 0.124146f, 0.913574f, 0.118347f, 0.916992f, 0.112732f, 0.918457f, 0.107910f, + 0.920898f, 0.103455f, 0.925293f, 0.097900f, 0.926758f, 0.093689f, 0.930664f, 0.089172f, + 0.932129f, 0.084839f, 0.934570f, 0.080688f, 0.936523f, 0.076660f, 0.938965f, 0.072815f, + 0.941406f, 0.068726f, 0.942871f, 0.065186f, 0.944824f, 0.061890f, 0.947266f, 0.058167f, + 0.948730f, 0.054657f, 0.950684f, 0.051483f, 0.952148f, 0.048157f, 0.954102f, 0.045074f, + 0.956055f, 0.041779f, 0.956543f, 0.037933f, 0.957031f, 0.033966f, 0.958008f, 0.029770f, + 0.958984f, 0.026154f, 0.960938f, 0.022034f, 0.958496f, 0.016129f, 0.956055f, 0.006180f, + 0.000000f, 1.000000f, 0.307617f, 0.869629f, 0.433105f, 0.770020f, 0.510254f, 0.695312f, + 0.565918f, 0.634766f, 0.608887f, 0.584473f, 0.642578f, 0.541504f, 0.672363f, 0.503418f, + 0.696777f, 0.470459f, 0.718262f, 0.440674f, 0.736328f, 0.414307f, 0.751953f, 0.390137f, + 0.767578f, 0.367920f, 0.780762f, 0.348389f, 0.793457f, 0.329102f, 0.804199f, 0.311523f, + 0.813477f, 0.295410f, 0.822754f, 0.280762f, 0.831543f, 0.266602f, 0.839355f, 0.253662f, + 0.845703f, 0.242065f, 0.853516f, 0.230103f, 0.859375f, 0.219604f, 0.864746f, 0.209595f, + 0.871582f, 0.198975f, 0.877441f, 0.189331f, 0.881348f, 0.180908f, 0.886719f, 0.172241f, + 0.892090f, 0.164062f, 0.895020f, 0.156982f, 0.899902f, 0.149658f, 0.903809f, 0.142578f, + 0.907227f, 0.135986f, 0.910156f, 0.130005f, 0.913574f, 0.124207f, 0.917969f, 0.117737f, + 0.918945f, 0.112793f, 0.921875f, 0.107849f, 0.925781f, 0.102234f, 0.927734f, 0.097534f, + 0.930176f, 0.092896f, 0.932617f, 0.088623f, 0.935547f, 0.083984f, 0.937500f, 0.079895f, + 0.939941f, 0.075806f, 0.941895f, 0.072021f, 0.944336f, 0.068237f, 0.946777f, 0.064392f, + 0.948242f, 0.061005f, 0.949219f, 0.057953f, 0.952148f, 0.054352f, 0.953125f, 0.051086f, + 0.954590f, 0.048065f, 0.956055f, 0.045380f, 0.958496f, 0.041901f, 0.959473f, 0.039215f, + 0.961426f, 0.036530f, 0.962402f, 0.033875f, 0.963379f, 0.029465f, 0.962891f, 0.026260f, + 0.965332f, 0.022217f, 0.964844f, 0.018738f, 0.966309f, 0.013618f, 0.961914f, 0.006100f, + 0.000000f, 1.000000f, 0.312988f, 0.867188f, 0.442139f, 0.765625f, 0.521973f, 0.688477f, + 0.579102f, 0.626465f, 0.622070f, 0.575195f, 0.656250f, 0.531250f, 0.687012f, 0.492432f, + 0.710449f, 0.459229f, 0.731934f, 0.428711f, 0.751465f, 0.401611f, 0.765625f, 0.377686f, + 0.782227f, 0.354736f, 0.794922f, 0.334961f, 0.805664f, 0.316162f, 0.817383f, 0.298096f, + 0.826172f, 0.282471f, 0.834961f, 0.267578f, 0.843262f, 0.253662f, 0.850098f, 0.240967f, + 0.857910f, 0.228760f, 0.864746f, 0.217285f, 0.869141f, 0.207520f, 0.875488f, 0.197144f, + 0.881836f, 0.186890f, 0.885742f, 0.178101f, 0.892090f, 0.168701f, 0.896973f, 0.160400f, + 0.900391f, 0.152832f, 0.904785f, 0.145508f, 0.909668f, 0.137817f, 0.911621f, 0.131958f, + 0.916992f, 0.125244f, 0.918945f, 0.119263f, 0.922363f, 0.113464f, 0.925293f, 0.108093f, + 0.928223f, 0.102966f, 0.931152f, 0.097778f, 0.933594f, 0.092896f, 0.935547f, 0.088440f, + 0.937988f, 0.084106f, 0.940430f, 0.079651f, 0.941895f, 0.075623f, 0.943848f, 0.071899f, + 0.946777f, 0.067932f, 0.948242f, 0.064331f, 0.949707f, 0.061005f, 0.952637f, 0.057281f, + 0.954102f, 0.054382f, 0.956055f, 0.051056f, 0.957520f, 0.047974f, 0.958496f, 0.045074f, + 0.959961f, 0.042633f, 0.962402f, 0.039520f, 0.963379f, 0.036713f, 0.964844f, 0.034271f, + 0.966309f, 0.031860f, 0.967773f, 0.029099f, 0.969238f, 0.026581f, 0.968262f, 0.022797f, + 0.969238f, 0.019196f, 0.969727f, 0.016022f, 0.969727f, 0.012421f, 0.968262f, 0.004559f, + 0.000000f, 1.000000f, 0.317871f, 0.865234f, 0.450195f, 0.761719f, 0.533203f, 0.682129f, + 0.589844f, 0.619141f, 0.636230f, 0.565918f, 0.671387f, 0.520996f, 0.701172f, 0.481689f, + 0.725098f, 0.447754f, 0.746582f, 0.417236f, 0.764160f, 0.390137f, 0.781250f, 0.365234f, + 0.793945f, 0.342773f, 0.807129f, 0.322510f, 0.817383f, 0.304199f, 0.829590f, 0.286133f, + 0.837891f, 0.270264f, 0.847656f, 0.254883f, 0.855469f, 0.241455f, 0.863281f, 0.228516f, + 0.868652f, 0.217041f, 0.874512f, 0.206055f, 0.880859f, 0.195312f, 0.886230f, 0.185547f, + 0.891113f, 0.176514f, 0.897949f, 0.166382f, 0.900879f, 0.158203f, 0.906738f, 0.149780f, + 0.910156f, 0.142334f, 0.913574f, 0.135254f, 0.917480f, 0.128296f, 0.920898f, 0.121826f, + 0.923828f, 0.115967f, 0.927246f, 0.109680f, 0.928711f, 0.104614f, 0.932617f, 0.098999f, + 0.935059f, 0.094055f, 0.937988f, 0.089172f, 0.939453f, 0.084778f, 0.941406f, 0.080566f, + 0.945801f, 0.075806f, 0.946777f, 0.072083f, 0.947754f, 0.068542f, 0.950195f, 0.064819f, + 0.952637f, 0.060852f, 0.953613f, 0.057831f, 0.955078f, 0.054840f, 0.957520f, 0.051239f, + 0.958984f, 0.048096f, 0.959473f, 0.045776f, 0.962891f, 0.042450f, 0.964355f, 0.039673f, + 0.964844f, 0.037445f, 0.966309f, 0.034851f, 0.967773f, 0.032349f, 0.969238f, 0.029907f, + 0.970215f, 0.027863f, 0.971191f, 0.025635f, 0.973633f, 0.023224f, 0.973633f, 0.020294f, + 0.973145f, 0.016800f, 0.973633f, 0.014168f, 0.974121f, 0.010277f, 0.972168f, 0.004128f, + 0.000000f, 1.000000f, 0.323975f, 0.862793f, 0.459229f, 0.757324f, 0.543945f, 0.675781f, + 0.604004f, 0.610840f, 0.649414f, 0.557129f, 0.683594f, 0.512207f, 0.714355f, 0.471680f, + 0.737305f, 0.437256f, 0.758789f, 0.406250f, 0.777832f, 0.378662f, 0.793945f, 0.353760f, + 0.806641f, 0.331299f, 0.819336f, 0.311035f, 0.831055f, 0.292725f, 0.840820f, 0.274902f, + 0.850586f, 0.258545f, 0.858887f, 0.243774f, 0.866699f, 0.230469f, 0.872559f, 0.217651f, + 0.879395f, 0.205933f, 0.886719f, 0.194336f, 0.888184f, 0.185303f, 0.895996f, 0.174683f, + 0.898926f, 0.166382f, 0.905762f, 0.156982f, 0.909668f, 0.148315f, 0.913574f, 0.140625f, + 0.918457f, 0.132690f, 0.921387f, 0.126099f, 0.925293f, 0.119263f, 0.928223f, 0.113037f, + 0.930664f, 0.107239f, 0.933594f, 0.101562f, 0.937012f, 0.096191f, 0.939453f, 0.091064f, + 0.941895f, 0.086182f, 0.944336f, 0.081787f, 0.946289f, 0.077332f, 0.948242f, 0.073059f, + 0.950684f, 0.069092f, 0.952148f, 0.065308f, 0.953125f, 0.062042f, 0.956055f, 0.058167f, + 0.957031f, 0.055084f, 0.959473f, 0.051697f, 0.960938f, 0.048889f, 0.962891f, 0.045746f, + 0.964355f, 0.042847f, 0.964355f, 0.040771f, 0.966309f, 0.037872f, 0.968750f, 0.035156f, + 0.968750f, 0.033020f, 0.970703f, 0.030548f, 0.971680f, 0.028488f, 0.972656f, 0.026535f, + 0.974609f, 0.024033f, 0.975098f, 0.022125f, 0.976074f, 0.020737f, 0.977539f, 0.018311f, + 0.977539f, 0.014984f, 0.977051f, 0.011566f, 0.976562f, 0.008926f, 0.976562f, 0.003054f, + 0.000000f, 1.000000f, 0.327881f, 0.861328f, 0.469482f, 0.751953f, 0.553711f, 0.669922f, + 0.614746f, 0.603516f, 0.661133f, 0.548340f, 0.696777f, 0.501953f, 0.726562f, 0.461914f, + 0.750488f, 0.427002f, 0.770020f, 0.396240f, 0.790527f, 0.367676f, 0.803711f, 0.343750f, + 0.818848f, 0.320557f, 0.830566f, 0.300293f, 0.840820f, 0.281494f, 0.849121f, 0.265137f, + 0.859863f, 0.248413f, 0.868164f, 0.233643f, 0.875977f, 0.219727f, 0.883301f, 0.207520f, + 0.888672f, 0.195557f, 0.895020f, 0.184814f, 0.899414f, 0.174683f, 0.904297f, 0.165283f, + 0.907227f, 0.156982f, 0.911621f, 0.148438f, 0.916992f, 0.139893f, 0.921387f, 0.131836f, + 0.924805f, 0.124634f, 0.928223f, 0.117859f, 0.932129f, 0.111084f, 0.935547f, 0.105042f, + 0.937988f, 0.099487f, 0.940430f, 0.093994f, 0.943359f, 0.088562f, 0.945312f, 0.084045f, + 0.947754f, 0.079285f, 0.949707f, 0.074890f, 0.952148f, 0.070740f, 0.953125f, 0.067139f, + 0.956543f, 0.062744f, 0.957031f, 0.059448f, 0.958984f, 0.056000f, 0.960449f, 0.052704f, + 0.961914f, 0.049561f, 0.963867f, 0.046539f, 0.965332f, 0.043732f, 0.966309f, 0.041138f, + 0.968262f, 0.038544f, 0.969727f, 0.035736f, 0.970703f, 0.033447f, 0.971191f, 0.031616f, + 0.973633f, 0.029068f, 0.974121f, 0.026810f, 0.975098f, 0.025009f, 0.976562f, 0.022949f, + 0.977539f, 0.021301f, 0.978516f, 0.019516f, 0.979980f, 0.017151f, 0.980957f, 0.015793f, + 0.981934f, 0.014244f, 0.980469f, 0.010727f, 0.980957f, 0.006546f, 0.980469f, 0.003933f, + 0.000000f, 1.000000f, 0.332764f, 0.859375f, 0.478516f, 0.747559f, 0.565918f, 0.663086f, + 0.626465f, 0.596191f, 0.672852f, 0.540039f, 0.708008f, 0.493652f, 0.738770f, 0.452393f, + 0.763672f, 0.416748f, 0.783203f, 0.385986f, 0.800293f, 0.358154f, 0.815430f, 0.333252f, + 0.829590f, 0.310303f, 0.842285f, 0.290039f, 0.852051f, 0.271240f, 0.861816f, 0.254150f, + 0.869629f, 0.239136f, 0.877441f, 0.223877f, 0.885254f, 0.210205f, 0.891113f, 0.197998f, + 0.897461f, 0.186279f, 0.902344f, 0.175903f, 0.907227f, 0.165771f, 0.911621f, 0.156616f, + 0.916016f, 0.147949f, 0.919434f, 0.139893f, 0.923828f, 0.132324f, 0.928223f, 0.124207f, + 0.931152f, 0.117249f, 0.935059f, 0.110474f, 0.937988f, 0.104004f, 0.940430f, 0.098206f, + 0.943848f, 0.092346f, 0.945801f, 0.087219f, 0.947754f, 0.082458f, 0.951172f, 0.077393f, + 0.952148f, 0.073242f, 0.955078f, 0.068909f, 0.957031f, 0.064697f, 0.958008f, 0.061249f, + 0.959961f, 0.057831f, 0.962402f, 0.053864f, 0.963379f, 0.050842f, 0.964844f, 0.047913f, + 0.966309f, 0.044800f, 0.967773f, 0.041931f, 0.968750f, 0.039337f, 0.970703f, 0.036804f, + 0.971191f, 0.034515f, 0.972656f, 0.032318f, 0.974609f, 0.029572f, 0.975098f, 0.027725f, + 0.976074f, 0.025833f, 0.977051f, 0.024002f, 0.978516f, 0.022171f, 0.979492f, 0.020050f, + 0.980469f, 0.018234f, 0.981445f, 0.016830f, 0.981934f, 0.015442f, 0.982910f, 0.014137f, + 0.984375f, 0.012009f, 0.984863f, 0.009422f, 0.982910f, 0.006298f, 0.982422f, 0.003025f, + 0.000000f, 1.000000f, 0.338135f, 0.856934f, 0.487061f, 0.743164f, 0.576660f, 0.656738f, + 0.638184f, 0.588379f, 0.686035f, 0.531738f, 0.720215f, 0.484619f, 0.750488f, 0.443359f, + 0.774414f, 0.407715f, 0.795410f, 0.376709f, 0.812500f, 0.348633f, 0.826660f, 0.323975f, + 0.838867f, 0.301270f, 0.851074f, 0.280273f, 0.861328f, 0.261719f, 0.870605f, 0.245117f, + 0.877930f, 0.229980f, 0.885254f, 0.215576f, 0.892578f, 0.201660f, 0.898926f, 0.189453f, + 0.905273f, 0.177734f, 0.910156f, 0.167358f, 0.914551f, 0.157471f, 0.918457f, 0.148804f, + 0.922852f, 0.139893f, 0.925781f, 0.132446f, 0.930176f, 0.124695f, 0.932129f, 0.118042f, + 0.936523f, 0.110596f, 0.940918f, 0.103638f, 0.943359f, 0.097717f, 0.946289f, 0.091736f, + 0.948242f, 0.086548f, 0.950684f, 0.081299f, 0.953613f, 0.076416f, 0.955566f, 0.071777f, + 0.957031f, 0.067810f, 0.959473f, 0.063477f, 0.960938f, 0.059662f, 0.962402f, 0.056183f, + 0.964355f, 0.052795f, 0.966309f, 0.049347f, 0.967285f, 0.046387f, 0.969238f, 0.043182f, + 0.969727f, 0.040741f, 0.970703f, 0.038177f, 0.972656f, 0.035431f, 0.974121f, 0.032867f, + 0.974609f, 0.030884f, 0.975586f, 0.028732f, 0.976562f, 0.026794f, 0.978516f, 0.024948f, + 0.979980f, 0.022446f, 0.979980f, 0.021027f, 0.981445f, 0.019119f, 0.981934f, 0.017761f, + 0.982910f, 0.016373f, 0.983398f, 0.014824f, 0.985352f, 0.012970f, 0.985840f, 0.011520f, + 0.986328f, 0.010490f, 0.986816f, 0.009224f, 0.986328f, 0.005840f, 0.986328f, 0.001069f, + 0.000000f, 1.000000f, 0.343994f, 0.854492f, 0.495605f, 0.738281f, 0.586914f, 0.650879f, + 0.651367f, 0.580566f, 0.698730f, 0.523438f, 0.734375f, 0.475342f, 0.761230f, 0.434814f, + 0.786133f, 0.398926f, 0.805176f, 0.367188f, 0.823242f, 0.338867f, 0.836914f, 0.314209f, + 0.848633f, 0.292480f, 0.860840f, 0.271484f, 0.870117f, 0.253174f, 0.877930f, 0.236572f, + 0.886719f, 0.221191f, 0.892578f, 0.207642f, 0.900879f, 0.193604f, 0.906738f, 0.181396f, + 0.911621f, 0.170166f, 0.916504f, 0.159668f, 0.920898f, 0.150391f, 0.925293f, 0.141235f, + 0.928711f, 0.133057f, 0.932617f, 0.125244f, 0.934570f, 0.118225f, 0.938477f, 0.111328f, + 0.941406f, 0.104858f, 0.945312f, 0.098022f, 0.948242f, 0.091980f, 0.951172f, 0.086060f, + 0.953125f, 0.080811f, 0.954590f, 0.076233f, 0.958008f, 0.071106f, 0.959961f, 0.066650f, + 0.961914f, 0.062683f, 0.962891f, 0.058899f, 0.965820f, 0.054993f, 0.966797f, 0.051422f, + 0.968262f, 0.048309f, 0.969238f, 0.045349f, 0.970703f, 0.042419f, 0.972656f, 0.039337f, + 0.973633f, 0.036652f, 0.974609f, 0.034241f, 0.975098f, 0.032104f, 0.976562f, 0.029892f, + 0.978027f, 0.027725f, 0.979492f, 0.025360f, 0.979980f, 0.023514f, 0.980957f, 0.021729f, + 0.981934f, 0.020126f, 0.982422f, 0.018860f, 0.983887f, 0.017105f, 0.984375f, 0.015640f, + 0.986328f, 0.013519f, 0.986328f, 0.012535f, 0.986816f, 0.011215f, 0.987305f, 0.010269f, + 0.988281f, 0.009048f, 0.989746f, 0.007778f, 0.990234f, 0.005577f, 0.988281f, 0.001070f, + 0.000000f, 1.000000f, 0.349854f, 0.852539f, 0.504883f, 0.733887f, 0.597656f, 0.645020f, + 0.662109f, 0.573730f, 0.708496f, 0.516113f, 0.745117f, 0.467529f, 0.773438f, 0.426025f, + 0.795898f, 0.390137f, 0.814453f, 0.359131f, 0.832031f, 0.331055f, 0.845703f, 0.305908f, + 0.858398f, 0.283691f, 0.869141f, 0.263916f, 0.878906f, 0.244995f, 0.887695f, 0.228149f, + 0.894531f, 0.213135f, 0.900391f, 0.199707f, 0.906250f, 0.186890f, 0.913086f, 0.174194f, + 0.917969f, 0.163208f, 0.922363f, 0.152832f, 0.927246f, 0.143066f, 0.931641f, 0.134399f, + 0.934570f, 0.126343f, 0.937988f, 0.118835f, 0.940430f, 0.111694f, 0.942871f, 0.105530f, + 0.946289f, 0.098877f, 0.948242f, 0.093445f, 0.951660f, 0.087158f, 0.955078f, 0.081238f, + 0.957520f, 0.075745f, 0.959473f, 0.071350f, 0.961914f, 0.066650f, 0.963379f, 0.062286f, + 0.965332f, 0.058044f, 0.966309f, 0.054749f, 0.968262f, 0.051086f, 0.970215f, 0.047638f, + 0.971191f, 0.044403f, 0.973145f, 0.041199f, 0.973633f, 0.038696f, 0.975098f, 0.036163f, + 0.976074f, 0.033661f, 0.977051f, 0.031342f, 0.979004f, 0.028595f, 0.979492f, 0.026642f, + 0.980957f, 0.024536f, 0.980957f, 0.023056f, 0.981934f, 0.021393f, 0.982910f, 0.019638f, + 0.984375f, 0.017868f, 0.985840f, 0.015839f, 0.986328f, 0.014481f, 0.986816f, 0.013329f, + 0.987305f, 0.012222f, 0.988281f, 0.011002f, 0.988770f, 0.010025f, 0.989258f, 0.008797f, + 0.990723f, 0.007423f, 0.991699f, 0.005798f, 0.992188f, 0.005005f, 0.990234f, 0.001524f, + 0.000000f, 1.000000f, 0.354492f, 0.850586f, 0.512695f, 0.729980f, 0.608887f, 0.638184f, + 0.672852f, 0.566895f, 0.720215f, 0.507812f, 0.755371f, 0.459473f, 0.783203f, 0.417969f, + 0.806152f, 0.381836f, 0.825195f, 0.350586f, 0.841309f, 0.322510f, 0.855469f, 0.297852f, + 0.867188f, 0.275635f, 0.876465f, 0.255859f, 0.886230f, 0.237793f, 0.894043f, 0.221191f, + 0.901367f, 0.206177f, 0.907715f, 0.192261f, 0.913086f, 0.179932f, 0.919434f, 0.167969f, + 0.924316f, 0.156860f, 0.928711f, 0.146484f, 0.933105f, 0.137085f, 0.936523f, 0.128296f, + 0.939453f, 0.120544f, 0.943848f, 0.112793f, 0.945312f, 0.106079f, 0.948242f, 0.099670f, + 0.951172f, 0.093689f, 0.953125f, 0.087952f, 0.954590f, 0.082947f, 0.958008f, 0.077271f, + 0.960938f, 0.071838f, 0.962891f, 0.066895f, 0.964355f, 0.062622f, 0.966797f, 0.058441f, + 0.967773f, 0.054688f, 0.970703f, 0.050415f, 0.971680f, 0.047180f, 0.972656f, 0.044159f, + 0.974609f, 0.041016f, 0.975098f, 0.038391f, 0.978027f, 0.035156f, 0.978027f, 0.032745f, + 0.979492f, 0.030182f, 0.979980f, 0.028275f, 0.980957f, 0.026199f, 0.981445f, 0.024445f, + 0.983398f, 0.022293f, 0.983887f, 0.020523f, 0.985840f, 0.018219f, 0.985840f, 0.016907f, + 0.986816f, 0.015411f, 0.987305f, 0.014198f, 0.987793f, 0.013115f, 0.988281f, 0.011971f, + 0.989258f, 0.010750f, 0.990234f, 0.009499f, 0.992188f, 0.007675f, 0.991699f, 0.006729f, + 0.992188f, 0.005875f, 0.992676f, 0.005150f, 0.993164f, 0.004486f, 0.992676f, 0.002670f, + 0.000000f, 1.000000f, 0.359863f, 0.848633f, 0.523438f, 0.724609f, 0.617676f, 0.632812f, + 0.682617f, 0.560059f, 0.728516f, 0.501465f, 0.765137f, 0.451904f, 0.793457f, 0.410156f, + 0.816406f, 0.374268f, 0.832520f, 0.343506f, 0.849609f, 0.314941f, 0.862305f, 0.291016f, + 0.875000f, 0.268066f, 0.884277f, 0.248413f, 0.892578f, 0.230835f, 0.901367f, 0.214111f, + 0.907227f, 0.199341f, 0.914062f, 0.185547f, 0.918945f, 0.173340f, 0.924316f, 0.161987f, + 0.929688f, 0.151245f, 0.934082f, 0.140747f, 0.937500f, 0.131714f, 0.941895f, 0.122803f, + 0.944824f, 0.114929f, 0.948730f, 0.107605f, 0.950195f, 0.100891f, 0.952148f, 0.094727f, + 0.955078f, 0.088806f, 0.957031f, 0.083252f, 0.958984f, 0.078064f, 0.960938f, 0.073486f, + 0.962891f, 0.068909f, 0.966797f, 0.063354f, 0.967773f, 0.059082f, 0.970215f, 0.054871f, + 0.971680f, 0.051239f, 0.972656f, 0.047607f, 0.975098f, 0.044067f, 0.976562f, 0.040588f, + 0.977539f, 0.037720f, 0.978516f, 0.034973f, 0.979980f, 0.032471f, 0.980469f, 0.030273f, + 0.981934f, 0.027878f, 0.982422f, 0.025864f, 0.984863f, 0.023132f, 0.984863f, 0.021423f, + 0.985840f, 0.019531f, 0.986328f, 0.018112f, 0.986816f, 0.016693f, 0.987305f, 0.015427f, + 0.988281f, 0.013962f, 0.989258f, 0.012756f, 0.989746f, 0.011421f, 0.991699f, 0.009712f, + 0.992188f, 0.008286f, 0.992676f, 0.007282f, 0.992676f, 0.006523f, 0.992676f, 0.005974f, + 0.993164f, 0.005268f, 0.993652f, 0.004604f, 0.994629f, 0.003599f, 0.996094f, 0.002056f, + 0.000000f, 1.000000f, 0.366699f, 0.845703f, 0.532227f, 0.720215f, 0.628418f, 0.626953f, + 0.693848f, 0.553223f, 0.740234f, 0.494141f, 0.774414f, 0.445068f, 0.801758f, 0.403320f, + 0.823242f, 0.367432f, 0.842285f, 0.335449f, 0.857910f, 0.307861f, 0.871094f, 0.283203f, + 0.880859f, 0.261963f, 0.892090f, 0.241577f, 0.899414f, 0.224121f, 0.905762f, 0.208618f, + 0.915039f, 0.192871f, 0.919922f, 0.179443f, 0.925781f, 0.166870f, 0.929688f, 0.156006f, + 0.934082f, 0.145630f, 0.937500f, 0.136353f, 0.942871f, 0.126709f, 0.946289f, 0.117920f, + 0.948730f, 0.110229f, 0.951660f, 0.103088f, 0.955078f, 0.095886f, 0.957520f, 0.089783f, + 0.958984f, 0.084351f, 0.960938f, 0.079041f, 0.963867f, 0.073486f, 0.965332f, 0.069031f, + 0.965820f, 0.065063f, 0.967285f, 0.061066f, 0.970703f, 0.056763f, 0.973145f, 0.052124f, + 0.974609f, 0.047943f, 0.976074f, 0.044434f, 0.977051f, 0.041290f, 0.978516f, 0.038208f, + 0.979492f, 0.035522f, 0.980957f, 0.032837f, 0.983398f, 0.029755f, 0.983887f, 0.027161f, + 0.984863f, 0.025040f, 0.985352f, 0.023071f, 0.986328f, 0.021347f, 0.986328f, 0.019760f, + 0.987305f, 0.018021f, 0.988281f, 0.016464f, 0.988770f, 0.015030f, 0.990234f, 0.013283f, + 0.991211f, 0.011444f, 0.991699f, 0.010017f, 0.992188f, 0.008942f, 0.992188f, 0.008217f, + 0.992676f, 0.007336f, 0.993164f, 0.006538f, 0.993652f, 0.005810f, 0.994141f, 0.005104f, + 0.994629f, 0.004375f, 0.995117f, 0.003656f, 0.996582f, 0.002283f, 0.998535f, 0.000016f, + 0.000000f, 1.000000f, 0.372559f, 0.843262f, 0.540527f, 0.715820f, 0.638672f, 0.621094f, + 0.704590f, 0.546875f, 0.750000f, 0.487305f, 0.785645f, 0.437500f, 0.812988f, 0.395508f, + 0.833496f, 0.359619f, 0.851074f, 0.328613f, 0.864746f, 0.301514f, 0.877930f, 0.276855f, + 0.888184f, 0.255127f, 0.897461f, 0.235962f, 0.906738f, 0.217529f, 0.913086f, 0.202271f, + 0.918945f, 0.187744f, 0.925293f, 0.174316f, 0.931152f, 0.161621f, 0.934570f, 0.150757f, + 0.939453f, 0.140015f, 0.941895f, 0.131226f, 0.945312f, 0.122803f, 0.950195f, 0.113892f, + 0.953125f, 0.106018f, 0.955566f, 0.098877f, 0.958984f, 0.091980f, 0.960938f, 0.085510f, + 0.962891f, 0.080017f, 0.964355f, 0.074890f, 0.966309f, 0.070007f, 0.968750f, 0.065186f, + 0.970215f, 0.060699f, 0.970703f, 0.057068f, 0.971680f, 0.053589f, 0.972656f, 0.050354f, + 0.974609f, 0.047058f, 0.977051f, 0.043060f, 0.979980f, 0.038910f, 0.980957f, 0.035583f, + 0.981934f, 0.032776f, 0.982910f, 0.030228f, 0.983887f, 0.027878f, 0.984863f, 0.025711f, + 0.985840f, 0.023590f, 0.986816f, 0.021484f, 0.987793f, 0.019531f, 0.988770f, 0.017654f, + 0.990723f, 0.015228f, 0.991211f, 0.013527f, 0.991699f, 0.012215f, 0.991699f, 0.011169f, + 0.992188f, 0.010063f, 0.992676f, 0.009056f, 0.993164f, 0.008133f, 0.993652f, 0.007294f, + 0.994141f, 0.006493f, 0.994629f, 0.005669f, 0.995117f, 0.004833f, 0.995605f, 0.004032f, + 0.996582f, 0.002949f, 0.999023f, 0.000812f, 0.999023f, 0.000101f, 0.999023f, 0.000001f, + 0.000000f, 1.000000f, 0.377686f, 0.841309f, 0.549316f, 0.711426f, 0.649902f, 0.615234f, + 0.712891f, 0.541016f, 0.759766f, 0.480469f, 0.793945f, 0.430908f, 0.820801f, 0.388672f, + 0.841797f, 0.353027f, 0.858887f, 0.321777f, 0.872070f, 0.295166f, 0.883789f, 0.270752f, + 0.895020f, 0.249268f, 0.905273f, 0.229370f, 0.910645f, 0.212891f, 0.919434f, 0.196289f, + 0.924316f, 0.182129f, 0.930176f, 0.168823f, 0.933594f, 0.157715f, 0.939941f, 0.145996f, + 0.943848f, 0.135254f, 0.946777f, 0.126099f, 0.950195f, 0.117737f, 0.953613f, 0.109436f, + 0.955566f, 0.102539f, 0.957031f, 0.096375f, 0.961426f, 0.089172f, 0.965820f, 0.081909f, + 0.966797f, 0.076172f, 0.968750f, 0.070923f, 0.969727f, 0.066345f, 0.971680f, 0.061951f, + 0.973145f, 0.057678f, 0.975098f, 0.053467f, 0.976562f, 0.049377f, 0.977051f, 0.046234f, + 0.977539f, 0.043427f, 0.978027f, 0.040863f, 0.979004f, 0.038330f, 0.979492f, 0.036011f, + 0.981934f, 0.032745f, 0.984375f, 0.029495f, 0.985840f, 0.026550f, 0.988770f, 0.023163f, + 0.989258f, 0.020752f, 0.989746f, 0.018799f, 0.990234f, 0.017090f, 0.990723f, 0.015549f, + 0.991211f, 0.014122f, 0.991699f, 0.012810f, 0.992188f, 0.011581f, 0.992676f, 0.010429f, + 0.993652f, 0.009186f, 0.994141f, 0.008095f, 0.994629f, 0.007080f, 0.995605f, 0.006016f, + 0.996094f, 0.004925f, 0.997559f, 0.003551f, 0.999512f, 0.001453f, 0.999512f, 0.000681f, + 0.999512f, 0.000327f, 0.999512f, 0.000131f, 0.999512f, 0.000030f, 0.999512f, 0.000000f, + 0.000000f, 1.000000f, 0.381104f, 0.839844f, 0.556152f, 0.708496f, 0.657715f, 0.610352f, + 0.722656f, 0.534668f, 0.766602f, 0.475586f, 0.801270f, 0.425537f, 0.828125f, 0.383057f, + 0.849609f, 0.346680f, 0.865723f, 0.315918f, 0.880371f, 0.288330f, 0.891602f, 0.265137f, + 0.900391f, 0.243896f, 0.909180f, 0.224731f, 0.916992f, 0.207275f, 0.921387f, 0.192505f, + 0.929688f, 0.177612f, 0.937012f, 0.162964f, 0.937012f, 0.153320f, 0.942871f, 0.142700f, + 0.949707f, 0.130981f, 0.952637f, 0.120728f, 0.952637f, 0.113953f, 0.952637f, 0.108093f, + 0.958496f, 0.100281f, 0.964844f, 0.091125f, 0.968262f, 0.082703f, 0.968262f, 0.077515f, + 0.968262f, 0.073181f, 0.968262f, 0.069336f, 0.968262f, 0.065918f, 0.968262f, 0.062805f, + 0.973145f, 0.058167f, 0.979004f, 0.051331f, 0.983887f, 0.044220f, 0.983887f, 0.040466f, + 0.983887f, 0.037598f, 0.983887f, 0.035156f, 0.983887f, 0.033020f, 0.983887f, 0.031143f, + 0.983887f, 0.029434f, 0.983887f, 0.027908f, 0.983887f, 0.026505f, 0.983887f, 0.025238f, + 0.983887f, 0.024078f, 0.983887f, 0.023026f, 0.983887f, 0.022079f, 0.983887f, 0.021210f, + 0.990723f, 0.017212f, 0.999512f, 0.010246f, 0.999512f, 0.006580f, 0.999512f, 0.004841f, + 0.999512f, 0.003675f, 0.999512f, 0.002810f, 0.999512f, 0.002134f, 0.999512f, 0.001597f, + 0.999512f, 0.001167f, 0.999512f, 0.000822f, 0.999512f, 0.000550f, 0.999512f, 0.000340f, + 0.999512f, 0.000185f, 0.999512f, 0.000080f, 0.999512f, 0.000019f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.979004f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f, + 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954590f, + 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.937988f, 0.000000f, 0.932617f, + 0.000000f, 0.925293f, 0.000000f, 0.916016f, 0.000000f, 0.904785f, 0.000000f, 0.892090f, + 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000000f, 0.830566f, 0.000000f, 0.797363f, + 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000000f, 0.535645f, 0.000000f, 0.219482f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, + 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, + 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.982910f, + 0.000000f, 0.981445f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.970215f, 0.000000f, 0.967773f, + 0.000000f, 0.964355f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.954102f, + 0.000000f, 0.949707f, 0.000000f, 0.944336f, 0.000000f, 0.938965f, 0.000000f, 0.932129f, + 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904785f, 0.000000f, 0.892090f, + 0.000000f, 0.875977f, 0.000000f, 0.856445f, 0.000000f, 0.830566f, 0.000000f, 0.796387f, + 0.000000f, 0.747070f, 0.000000f, 0.670898f, 0.000001f, 0.535156f, 0.000001f, 0.218628f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.989746f, 0.000000f, 0.989258f, 0.000000f, 0.988281f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, + 0.000000f, 0.980957f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.974609f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966797f, + 0.000000f, 0.963867f, 0.000000f, 0.960938f, 0.000000f, 0.957520f, 0.000000f, 0.953125f, + 0.000000f, 0.949219f, 0.000000f, 0.943848f, 0.000000f, 0.937500f, 0.000000f, 0.931641f, + 0.000000f, 0.924316f, 0.000000f, 0.915039f, 0.000000f, 0.904297f, 0.000000f, 0.891113f, + 0.000000f, 0.875977f, 0.000000f, 0.855957f, 0.000014f, 0.829590f, 0.000017f, 0.795898f, + 0.000014f, 0.746094f, 0.000009f, 0.669922f, 0.000010f, 0.535156f, 0.000010f, 0.218384f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, + 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.983887f, 0.000000f, 0.982422f, + 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.978027f, 0.000000f, 0.975586f, + 0.000000f, 0.973633f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.966309f, + 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.956543f, 0.000000f, 0.953125f, + 0.000000f, 0.948242f, 0.000000f, 0.943359f, 0.000000f, 0.937012f, 0.000008f, 0.930664f, + 0.000034f, 0.922852f, 0.000065f, 0.914062f, 0.000075f, 0.902832f, 0.000074f, 0.890625f, + 0.000069f, 0.875000f, 0.000061f, 0.854492f, 0.000051f, 0.828125f, 0.000052f, 0.793945f, + 0.000049f, 0.745605f, 0.000045f, 0.668945f, 0.000046f, 0.534180f, 0.000053f, 0.218262f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993652f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.991211f, + 0.000000f, 0.989258f, 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, + 0.000000f, 0.985352f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, 0.000000f, 0.981934f, + 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, 0.000000f, 0.975098f, + 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000013f, 0.965820f, + 0.000042f, 0.962891f, 0.000078f, 0.959473f, 0.000117f, 0.956055f, 0.000164f, 0.951660f, + 0.000198f, 0.946777f, 0.000209f, 0.942383f, 0.000209f, 0.937012f, 0.000202f, 0.929199f, + 0.000189f, 0.922363f, 0.000174f, 0.912598f, 0.000156f, 0.901855f, 0.000138f, 0.889160f, + 0.000139f, 0.873047f, 0.000157f, 0.852539f, 0.000139f, 0.826660f, 0.000142f, 0.792480f, + 0.000139f, 0.744141f, 0.000136f, 0.667969f, 0.000144f, 0.532715f, 0.000154f, 0.218384f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, + 0.000000f, 0.989746f, 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.986328f, + 0.000000f, 0.985352f, 0.000000f, 0.983398f, 0.000013f, 0.982422f, 0.000042f, 0.981934f, + 0.000083f, 0.979980f, 0.000126f, 0.978027f, 0.000174f, 0.976074f, 0.000223f, 0.974609f, + 0.000277f, 0.972656f, 0.000325f, 0.970215f, 0.000384f, 0.967285f, 0.000425f, 0.964844f, + 0.000434f, 0.961914f, 0.000435f, 0.958984f, 0.000422f, 0.955078f, 0.000404f, 0.950684f, + 0.000386f, 0.945801f, 0.000355f, 0.940430f, 0.000329f, 0.935059f, 0.000301f, 0.927734f, + 0.000294f, 0.919922f, 0.000316f, 0.911133f, 0.000342f, 0.899414f, 0.000317f, 0.886719f, + 0.000304f, 0.871094f, 0.000316f, 0.850586f, 0.000306f, 0.824219f, 0.000306f, 0.790039f, + 0.000317f, 0.741699f, 0.000325f, 0.665527f, 0.000368f, 0.531738f, 0.000336f, 0.218750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, + 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000009f, 0.991211f, 0.000045f, 0.990234f, 0.000088f, 0.989258f, + 0.000141f, 0.988770f, 0.000193f, 0.988281f, 0.000254f, 0.986816f, 0.000309f, 0.985352f, + 0.000371f, 0.984375f, 0.000433f, 0.983398f, 0.000489f, 0.981934f, 0.000550f, 0.980469f, + 0.000613f, 0.978516f, 0.000669f, 0.977539f, 0.000721f, 0.975586f, 0.000754f, 0.973145f, + 0.000756f, 0.971191f, 0.000737f, 0.969238f, 0.000710f, 0.966309f, 0.000686f, 0.963379f, + 0.000653f, 0.960449f, 0.000606f, 0.957031f, 0.000570f, 0.953125f, 0.000548f, 0.949219f, + 0.000551f, 0.944336f, 0.000556f, 0.938965f, 0.000592f, 0.933105f, 0.000615f, 0.926758f, + 0.000588f, 0.917480f, 0.000569f, 0.908691f, 0.000591f, 0.897949f, 0.000594f, 0.884277f, + 0.000582f, 0.868164f, 0.000609f, 0.848145f, 0.000600f, 0.822266f, 0.000624f, 0.787598f, + 0.000664f, 0.738770f, 0.000690f, 0.664062f, 0.000762f, 0.530273f, 0.000609f, 0.218628f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, + 0.000000f, 0.996094f, 0.000009f, 0.996094f, 0.000054f, 0.995605f, 0.000109f, 0.994629f, + 0.000180f, 0.993652f, 0.000247f, 0.993164f, 0.000314f, 0.992676f, 0.000393f, 0.992188f, + 0.000460f, 0.990723f, 0.000523f, 0.990234f, 0.000603f, 0.989258f, 0.000671f, 0.988770f, + 0.000731f, 0.988281f, 0.000796f, 0.987305f, 0.000869f, 0.985840f, 0.000931f, 0.984863f, + 0.000986f, 0.983887f, 0.001042f, 0.982422f, 0.001111f, 0.980957f, 0.001141f, 0.979004f, + 0.001129f, 0.977539f, 0.001094f, 0.976562f, 0.001068f, 0.974609f, 0.001030f, 0.971680f, + 0.000982f, 0.970215f, 0.000919f, 0.967285f, 0.000896f, 0.965332f, 0.000896f, 0.961914f, + 0.000907f, 0.958496f, 0.000920f, 0.955566f, 0.000946f, 0.952148f, 0.000954f, 0.946777f, + 0.000996f, 0.942383f, 0.000986f, 0.937012f, 0.000992f, 0.930664f, 0.000962f, 0.923828f, + 0.000999f, 0.915039f, 0.001023f, 0.906250f, 0.001049f, 0.895020f, 0.001014f, 0.880859f, + 0.001073f, 0.864746f, 0.001107f, 0.844727f, 0.001101f, 0.818359f, 0.001165f, 0.784668f, + 0.001243f, 0.735352f, 0.001321f, 0.661133f, 0.001458f, 0.528320f, 0.000982f, 0.218750f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000040f, 0.997559f, + 0.000125f, 0.997070f, 0.000202f, 0.996582f, 0.000307f, 0.996582f, 0.000395f, 0.996094f, + 0.000472f, 0.996094f, 0.000576f, 0.995117f, 0.000659f, 0.994629f, 0.000728f, 0.994141f, + 0.000812f, 0.993652f, 0.000898f, 0.993164f, 0.000970f, 0.992188f, 0.001029f, 0.991211f, + 0.001099f, 0.990723f, 0.001179f, 0.989258f, 0.001245f, 0.988770f, 0.001302f, 0.988281f, + 0.001349f, 0.986816f, 0.001421f, 0.985840f, 0.001489f, 0.984863f, 0.001543f, 0.984375f, + 0.001539f, 0.983398f, 0.001496f, 0.981445f, 0.001463f, 0.979980f, 0.001421f, 0.978027f, + 0.001372f, 0.976562f, 0.001354f, 0.974609f, 0.001354f, 0.972656f, 0.001341f, 0.971191f, + 0.001372f, 0.968262f, 0.001408f, 0.965820f, 0.001438f, 0.962891f, 0.001471f, 0.960938f, + 0.001439f, 0.956543f, 0.001493f, 0.953613f, 0.001564f, 0.949219f, 0.001599f, 0.944824f, + 0.001520f, 0.940430f, 0.001563f, 0.934570f, 0.001614f, 0.928223f, 0.001697f, 0.920898f, + 0.001627f, 0.912598f, 0.001644f, 0.902832f, 0.001767f, 0.892090f, 0.001718f, 0.877930f, + 0.001780f, 0.861328f, 0.001869f, 0.840820f, 0.001884f, 0.814941f, 0.002008f, 0.780273f, + 0.002163f, 0.731934f, 0.002293f, 0.658203f, 0.002483f, 0.526367f, 0.001459f, 0.218140f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000059f, 0.998535f, 0.000189f, 0.998535f, + 0.000311f, 0.998047f, 0.000439f, 0.997559f, 0.000566f, 0.997559f, 0.000655f, 0.997070f, + 0.000767f, 0.996582f, 0.000879f, 0.996582f, 0.000962f, 0.996094f, 0.001024f, 0.995605f, + 0.001130f, 0.995117f, 0.001223f, 0.994629f, 0.001292f, 0.994141f, 0.001348f, 0.993652f, + 0.001412f, 0.993164f, 0.001506f, 0.992676f, 0.001577f, 0.991699f, 0.001634f, 0.990234f, + 0.001678f, 0.989746f, 0.001728f, 0.988770f, 0.001814f, 0.988281f, 0.001879f, 0.986816f, + 0.001928f, 0.985840f, 0.001916f, 0.984863f, 0.001863f, 0.983887f, 0.001880f, 0.982910f, + 0.001885f, 0.981445f, 0.001899f, 0.979980f, 0.001921f, 0.978516f, 0.001940f, 0.977051f, + 0.001894f, 0.974609f, 0.001963f, 0.973145f, 0.002008f, 0.971191f, 0.002060f, 0.969238f, + 0.001989f, 0.967285f, 0.002029f, 0.963867f, 0.002153f, 0.961426f, 0.002289f, 0.958008f, + 0.002226f, 0.955078f, 0.002268f, 0.951172f, 0.002287f, 0.946777f, 0.002346f, 0.942871f, + 0.002325f, 0.937012f, 0.002436f, 0.931641f, 0.002487f, 0.925293f, 0.002548f, 0.917969f, + 0.002508f, 0.909180f, 0.002623f, 0.898926f, 0.002729f, 0.888184f, 0.002832f, 0.874512f, + 0.002817f, 0.857422f, 0.002996f, 0.836426f, 0.003170f, 0.811035f, 0.003237f, 0.775391f, + 0.003504f, 0.727539f, 0.003695f, 0.654297f, 0.003901f, 0.523926f, 0.002045f, 0.217896f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000162f, 0.999023f, + 0.000390f, 0.999023f, 0.000528f, 0.998535f, 0.000705f, 0.998535f, 0.000843f, 0.998047f, + 0.000922f, 0.997559f, 0.001056f, 0.997559f, 0.001181f, 0.997070f, 0.001257f, 0.996582f, + 0.001308f, 0.996582f, 0.001427f, 0.995605f, 0.001532f, 0.995605f, 0.001599f, 0.995117f, + 0.001647f, 0.994141f, 0.001682f, 0.994141f, 0.001808f, 0.993652f, 0.001889f, 0.992676f, + 0.001945f, 0.992676f, 0.001984f, 0.991699f, 0.002012f, 0.991211f, 0.002106f, 0.990234f, + 0.002188f, 0.989258f, 0.002283f, 0.988281f, 0.002369f, 0.986816f, 0.002407f, 0.986328f, + 0.002399f, 0.984375f, 0.002512f, 0.983887f, 0.002523f, 0.982422f, 0.002562f, 0.980957f, + 0.002609f, 0.979980f, 0.002539f, 0.979004f, 0.002550f, 0.977051f, 0.002666f, 0.975098f, + 0.002747f, 0.973633f, 0.002701f, 0.971191f, 0.002817f, 0.969238f, 0.002935f, 0.967285f, + 0.003052f, 0.964844f, 0.003050f, 0.961914f, 0.003138f, 0.958984f, 0.003212f, 0.955566f, + 0.003294f, 0.952637f, 0.003185f, 0.948242f, 0.003323f, 0.944336f, 0.003508f, 0.939453f, + 0.003599f, 0.934570f, 0.003523f, 0.928223f, 0.003628f, 0.921875f, 0.003771f, 0.914062f, + 0.003790f, 0.905273f, 0.003918f, 0.895508f, 0.004101f, 0.883789f, 0.004288f, 0.869629f, + 0.004326f, 0.852051f, 0.004604f, 0.832031f, 0.004807f, 0.805664f, 0.004974f, 0.770508f, + 0.005367f, 0.722656f, 0.005646f, 0.649902f, 0.005753f, 0.521484f, 0.002733f, 0.217651f, + 0.000000f, 1.000000f, 0.000283f, 0.999512f, 0.000583f, 0.999023f, 0.000735f, 0.999023f, + 0.000912f, 0.999023f, 0.001087f, 0.998535f, 0.001146f, 0.998047f, 0.001266f, 0.997559f, + 0.001438f, 0.997070f, 0.001505f, 0.997070f, 0.001540f, 0.997070f, 0.001649f, 0.996094f, + 0.001796f, 0.995605f, 0.001860f, 0.995117f, 0.001897f, 0.995117f, 0.001920f, 0.994629f, + 0.002056f, 0.994141f, 0.002159f, 0.993164f, 0.002211f, 0.992676f, 0.002254f, 0.992188f, + 0.002344f, 0.991211f, 0.002481f, 0.990723f, 0.002724f, 0.989746f, 0.002876f, 0.989258f, + 0.003019f, 0.988281f, 0.003061f, 0.987305f, 0.003113f, 0.985840f, 0.003176f, 0.984863f, + 0.003315f, 0.983887f, 0.003281f, 0.981934f, 0.003330f, 0.980957f, 0.003260f, 0.979980f, + 0.003338f, 0.978027f, 0.003477f, 0.976562f, 0.003523f, 0.975586f, 0.003693f, 0.973145f, + 0.003826f, 0.971680f, 0.003952f, 0.969727f, 0.003883f, 0.966797f, 0.004040f, 0.964355f, + 0.004261f, 0.962402f, 0.004181f, 0.959473f, 0.004276f, 0.956055f, 0.004398f, 0.953125f, + 0.004566f, 0.949219f, 0.004517f, 0.945312f, 0.004738f, 0.940430f, 0.004936f, 0.935547f, + 0.005054f, 0.930664f, 0.005051f, 0.924316f, 0.005234f, 0.917969f, 0.005444f, 0.910156f, + 0.005726f, 0.900879f, 0.005711f, 0.890625f, 0.005913f, 0.878418f, 0.006268f, 0.865234f, + 0.006367f, 0.847168f, 0.006763f, 0.826172f, 0.007072f, 0.799805f, 0.007370f, 0.765137f, + 0.007851f, 0.717285f, 0.008171f, 0.645508f, 0.008095f, 0.519043f, 0.003527f, 0.217285f, + 0.000000f, 1.000000f, 0.000454f, 0.999512f, 0.000876f, 0.999023f, 0.000887f, 0.999023f, + 0.001265f, 0.998535f, 0.001296f, 0.998047f, 0.001307f, 0.998047f, 0.001639f, 0.997070f, + 0.001685f, 0.997070f, 0.001702f, 0.997070f, 0.001711f, 0.996094f, 0.002014f, 0.995605f, + 0.002060f, 0.995117f, 0.002081f, 0.995117f, 0.002098f, 0.994629f, 0.002354f, 0.993652f, + 0.002579f, 0.992676f, 0.002739f, 0.992188f, 0.002876f, 0.991699f, 0.002989f, 0.991211f, + 0.003126f, 0.990234f, 0.003471f, 0.989746f, 0.003611f, 0.988770f, 0.003761f, 0.987793f, + 0.003876f, 0.986816f, 0.003967f, 0.986328f, 0.003990f, 0.985352f, 0.004181f, 0.983398f, + 0.004204f, 0.981934f, 0.004349f, 0.980957f, 0.004303f, 0.979492f, 0.004467f, 0.978027f, + 0.004406f, 0.976562f, 0.004726f, 0.974609f, 0.004894f, 0.973145f, 0.004879f, 0.971191f, + 0.005127f, 0.969238f, 0.005325f, 0.967285f, 0.005226f, 0.964355f, 0.005489f, 0.961914f, + 0.005699f, 0.958984f, 0.005936f, 0.956543f, 0.005852f, 0.953125f, 0.006084f, 0.949707f, + 0.006226f, 0.945801f, 0.006596f, 0.941895f, 0.006546f, 0.937012f, 0.006844f, 0.931641f, + 0.007099f, 0.926270f, 0.006989f, 0.920410f, 0.007378f, 0.913086f, 0.007694f, 0.904785f, + 0.008011f, 0.895996f, 0.008156f, 0.885254f, 0.008377f, 0.873047f, 0.008972f, 0.859375f, + 0.009071f, 0.840820f, 0.009613f, 0.820312f, 0.010048f, 0.793945f, 0.010605f, 0.759277f, + 0.011101f, 0.711426f, 0.011467f, 0.641602f, 0.010971f, 0.515137f, 0.004417f, 0.216675f, + 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000937f, 0.999023f, 0.000935f, 0.999023f, + 0.001370f, 0.998047f, 0.001376f, 0.998047f, 0.001375f, 0.997559f, 0.001784f, 0.997070f, + 0.001797f, 0.997070f, 0.001800f, 0.996094f, 0.002129f, 0.995605f, 0.002331f, 0.995117f, + 0.002481f, 0.995117f, 0.002640f, 0.994141f, 0.002777f, 0.993164f, 0.003212f, 0.992676f, + 0.003407f, 0.992188f, 0.003534f, 0.991211f, 0.003628f, 0.990234f, 0.003759f, 0.990234f, + 0.004135f, 0.989258f, 0.004288f, 0.988281f, 0.004436f, 0.986816f, 0.004650f, 0.986328f, + 0.004868f, 0.985840f, 0.005051f, 0.984375f, 0.005493f, 0.983398f, 0.005547f, 0.982422f, + 0.005554f, 0.980469f, 0.005535f, 0.978516f, 0.005722f, 0.977539f, 0.005684f, 0.975586f, + 0.006145f, 0.974121f, 0.006226f, 0.972656f, 0.006470f, 0.970215f, 0.006695f, 0.968750f, + 0.006741f, 0.966309f, 0.007027f, 0.964355f, 0.007431f, 0.961914f, 0.007450f, 0.958984f, + 0.007687f, 0.955566f, 0.007912f, 0.952637f, 0.008232f, 0.949707f, 0.008224f, 0.945801f, + 0.008514f, 0.942383f, 0.008972f, 0.937500f, 0.009079f, 0.932617f, 0.009254f, 0.927246f, + 0.009735f, 0.921875f, 0.009949f, 0.915039f, 0.010292f, 0.907227f, 0.010796f, 0.899414f, + 0.011063f, 0.890137f, 0.011391f, 0.879395f, 0.011749f, 0.867188f, 0.012482f, 0.852539f, + 0.012627f, 0.834473f, 0.013458f, 0.813477f, 0.014153f, 0.787109f, 0.014656f, 0.751953f, + 0.015251f, 0.705566f, 0.015533f, 0.635742f, 0.014473f, 0.512207f, 0.005421f, 0.216675f, + 0.000000f, 1.000000f, 0.000485f, 0.999512f, 0.000958f, 0.999023f, 0.000955f, 0.998535f, + 0.001413f, 0.998047f, 0.001412f, 0.997559f, 0.001410f, 0.997559f, 0.001955f, 0.996582f, + 0.002161f, 0.996094f, 0.002302f, 0.995605f, 0.002899f, 0.995117f, 0.003059f, 0.994629f, + 0.003204f, 0.993652f, 0.003359f, 0.993164f, 0.003462f, 0.992676f, 0.003925f, 0.991699f, + 0.004097f, 0.990723f, 0.004242f, 0.990234f, 0.004421f, 0.989746f, 0.004589f, 0.988770f, + 0.005215f, 0.987305f, 0.005451f, 0.986816f, 0.005676f, 0.985840f, 0.005856f, 0.984375f, + 0.006008f, 0.983398f, 0.006287f, 0.982910f, 0.006908f, 0.981445f, 0.007187f, 0.979980f, + 0.007233f, 0.978516f, 0.007252f, 0.976562f, 0.007294f, 0.975098f, 0.007553f, 0.973633f, + 0.007935f, 0.971191f, 0.008286f, 0.969238f, 0.008316f, 0.967285f, 0.008659f, 0.965332f, + 0.009064f, 0.963379f, 0.009216f, 0.960938f, 0.009903f, 0.958496f, 0.010216f, 0.955566f, + 0.010025f, 0.951660f, 0.010536f, 0.948730f, 0.010933f, 0.945312f, 0.011009f, 0.941406f, + 0.011765f, 0.937500f, 0.012001f, 0.932617f, 0.012581f, 0.927246f, 0.012665f, 0.921875f, + 0.013222f, 0.916016f, 0.013664f, 0.909668f, 0.014168f, 0.901855f, 0.014641f, 0.892578f, + 0.015327f, 0.883789f, 0.015610f, 0.872559f, 0.016205f, 0.859863f, 0.017136f, 0.844727f, + 0.017776f, 0.827148f, 0.018494f, 0.805664f, 0.019348f, 0.779785f, 0.020172f, 0.744629f, + 0.020935f, 0.698242f, 0.020721f, 0.629395f, 0.018860f, 0.508789f, 0.006603f, 0.216309f, + 0.000000f, 1.000000f, 0.000487f, 0.999512f, 0.000967f, 0.999023f, 0.000965f, 0.998535f, + 0.001539f, 0.998047f, 0.001799f, 0.997559f, 0.001986f, 0.997070f, 0.002672f, 0.996094f, + 0.002831f, 0.995605f, 0.002928f, 0.995117f, 0.003559f, 0.994141f, 0.003691f, 0.993652f, + 0.003765f, 0.993164f, 0.003956f, 0.992676f, 0.004223f, 0.991699f, 0.004860f, 0.990234f, + 0.005089f, 0.989746f, 0.005314f, 0.989258f, 0.005600f, 0.987793f, 0.005814f, 0.987305f, + 0.006371f, 0.986328f, 0.006638f, 0.984863f, 0.006969f, 0.983887f, 0.007313f, 0.982910f, + 0.007584f, 0.981445f, 0.008240f, 0.980469f, 0.008545f, 0.979004f, 0.008865f, 0.977539f, + 0.009293f, 0.976074f, 0.009712f, 0.974609f, 0.009514f, 0.972656f, 0.009903f, 0.970703f, + 0.010307f, 0.968262f, 0.010475f, 0.966309f, 0.010971f, 0.963867f, 0.011154f, 0.961914f, + 0.011650f, 0.959473f, 0.012138f, 0.957520f, 0.012650f, 0.953613f, 0.013351f, 0.951172f, + 0.013626f, 0.947754f, 0.013710f, 0.943848f, 0.014153f, 0.940430f, 0.014900f, 0.936523f, + 0.015396f, 0.931641f, 0.016159f, 0.927246f, 0.016464f, 0.921875f, 0.016968f, 0.916016f, + 0.017761f, 0.910156f, 0.018387f, 0.902832f, 0.018799f, 0.895020f, 0.019791f, 0.886230f, + 0.020660f, 0.876465f, 0.021423f, 0.865234f, 0.022202f, 0.852539f, 0.023148f, 0.836914f, + 0.024643f, 0.819336f, 0.025253f, 0.797852f, 0.026154f, 0.771484f, 0.026993f, 0.736816f, + 0.028061f, 0.691406f, 0.027481f, 0.624023f, 0.024109f, 0.504395f, 0.007988f, 0.216431f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000641f, 0.999023f, 0.001480f, 0.998535f, + 0.002151f, 0.997559f, 0.002422f, 0.997070f, 0.002567f, 0.996582f, 0.003101f, 0.995605f, + 0.003361f, 0.995117f, 0.003481f, 0.994629f, 0.003693f, 0.993652f, 0.004490f, 0.992676f, + 0.004822f, 0.991699f, 0.005047f, 0.991211f, 0.005234f, 0.990234f, 0.005955f, 0.989258f, + 0.006237f, 0.988281f, 0.006535f, 0.987305f, 0.006855f, 0.986816f, 0.007160f, 0.985352f, + 0.007912f, 0.983887f, 0.008301f, 0.982910f, 0.008652f, 0.981934f, 0.009003f, 0.980469f, + 0.009377f, 0.979492f, 0.010094f, 0.977539f, 0.010635f, 0.976562f, 0.011108f, 0.974609f, + 0.011559f, 0.973145f, 0.012016f, 0.971680f, 0.012405f, 0.969727f, 0.012703f, 0.967773f, + 0.013062f, 0.964844f, 0.013649f, 0.962891f, 0.013824f, 0.959961f, 0.014381f, 0.958008f, + 0.014755f, 0.955078f, 0.015732f, 0.952148f, 0.016190f, 0.949219f, 0.016968f, 0.946289f, + 0.017807f, 0.942871f, 0.017776f, 0.938965f, 0.018433f, 0.935059f, 0.019348f, 0.930664f, + 0.020157f, 0.925781f, 0.020996f, 0.920898f, 0.021469f, 0.915527f, 0.022171f, 0.909668f, + 0.022995f, 0.902832f, 0.024292f, 0.895508f, 0.025345f, 0.887207f, 0.026260f, 0.878418f, + 0.027206f, 0.868164f, 0.028427f, 0.856934f, 0.029480f, 0.843262f, 0.030853f, 0.828125f, + 0.032440f, 0.810547f, 0.033112f, 0.788086f, 0.034393f, 0.762695f, 0.035583f, 0.728027f, + 0.036316f, 0.682617f, 0.035217f, 0.617188f, 0.030334f, 0.500000f, 0.009575f, 0.216064f, + 0.000000f, 1.000000f, 0.000355f, 0.999512f, 0.001255f, 0.999023f, 0.001830f, 0.998047f, + 0.002186f, 0.997559f, 0.002739f, 0.996582f, 0.002975f, 0.996094f, 0.003380f, 0.995605f, + 0.004112f, 0.994141f, 0.004375f, 0.993652f, 0.004822f, 0.992676f, 0.005524f, 0.991699f, + 0.005753f, 0.990723f, 0.006027f, 0.990234f, 0.006519f, 0.988770f, 0.007431f, 0.987793f, + 0.007736f, 0.986816f, 0.008003f, 0.985840f, 0.008316f, 0.984375f, 0.008934f, 0.983398f, + 0.009850f, 0.981934f, 0.010246f, 0.980469f, 0.010574f, 0.979492f, 0.011040f, 0.978027f, + 0.011658f, 0.976562f, 0.012680f, 0.974609f, 0.013138f, 0.973145f, 0.013611f, 0.971191f, + 0.014229f, 0.969727f, 0.014847f, 0.968262f, 0.015526f, 0.965820f, 0.016571f, 0.963867f, + 0.016586f, 0.960938f, 0.016968f, 0.958496f, 0.017715f, 0.956055f, 0.018051f, 0.953125f, + 0.018951f, 0.950195f, 0.019867f, 0.946777f, 0.020782f, 0.943848f, 0.021393f, 0.939941f, + 0.022385f, 0.937012f, 0.023422f, 0.933594f, 0.023590f, 0.928711f, 0.024963f, 0.923828f, + 0.025940f, 0.918945f, 0.026672f, 0.913574f, 0.028107f, 0.908203f, 0.028854f, 0.901855f, + 0.029846f, 0.895020f, 0.031525f, 0.887207f, 0.032776f, 0.878418f, 0.033539f, 0.869141f, + 0.034943f, 0.858887f, 0.036438f, 0.847656f, 0.038147f, 0.833496f, 0.039795f, 0.818359f, + 0.041443f, 0.800293f, 0.042603f, 0.778320f, 0.044464f, 0.752930f, 0.045349f, 0.718750f, + 0.045929f, 0.674316f, 0.044189f, 0.610352f, 0.037537f, 0.496582f, 0.011375f, 0.216064f, + 0.000000f, 1.000000f, 0.000735f, 0.999512f, 0.000921f, 0.999023f, 0.001794f, 0.998047f, + 0.002518f, 0.997070f, 0.002863f, 0.996582f, 0.003952f, 0.995605f, 0.004242f, 0.994629f, + 0.004845f, 0.993652f, 0.005505f, 0.992676f, 0.005920f, 0.991699f, 0.006683f, 0.990723f, + 0.007084f, 0.989258f, 0.007664f, 0.988281f, 0.008087f, 0.987305f, 0.008934f, 0.985840f, + 0.009399f, 0.984375f, 0.009872f, 0.983887f, 0.010544f, 0.982422f, 0.011024f, 0.980957f, + 0.011963f, 0.979004f, 0.012581f, 0.977539f, 0.013084f, 0.976562f, 0.013832f, 0.974609f, + 0.014404f, 0.973145f, 0.015488f, 0.971191f, 0.016220f, 0.969238f, 0.016861f, 0.967285f, + 0.017471f, 0.965820f, 0.018417f, 0.963379f, 0.019241f, 0.961426f, 0.020401f, 0.958984f, + 0.021332f, 0.956543f, 0.021469f, 0.953613f, 0.021942f, 0.950684f, 0.023056f, 0.947754f, + 0.023697f, 0.944336f, 0.025192f, 0.940430f, 0.025955f, 0.937012f, 0.027100f, 0.933594f, + 0.027939f, 0.930176f, 0.029221f, 0.926270f, 0.030334f, 0.921875f, 0.031616f, 0.916016f, + 0.032837f, 0.911133f, 0.033813f, 0.905273f, 0.035217f, 0.899414f, 0.036774f, 0.893555f, + 0.037659f, 0.885742f, 0.039612f, 0.877441f, 0.041382f, 0.869141f, 0.042450f, 0.859375f, + 0.044891f, 0.849121f, 0.046265f, 0.837402f, 0.048096f, 0.823242f, 0.050262f, 0.807617f, + 0.052155f, 0.789551f, 0.053284f, 0.768066f, 0.055817f, 0.742188f, 0.056824f, 0.708984f, + 0.057190f, 0.665527f, 0.054596f, 0.603516f, 0.045319f, 0.492188f, 0.013229f, 0.215332f, + 0.000000f, 1.000000f, 0.000934f, 0.999023f, 0.001148f, 0.998535f, 0.002024f, 0.998047f, + 0.002687f, 0.997070f, 0.003914f, 0.996094f, 0.004650f, 0.994141f, 0.005211f, 0.994141f, + 0.005894f, 0.992676f, 0.006775f, 0.991211f, 0.007172f, 0.990234f, 0.007748f, 0.989258f, + 0.008934f, 0.987793f, 0.009369f, 0.986328f, 0.009979f, 0.985352f, 0.011055f, 0.983398f, + 0.011513f, 0.982422f, 0.012329f, 0.980957f, 0.013000f, 0.979004f, 0.013741f, 0.978027f, + 0.014748f, 0.976074f, 0.015320f, 0.974609f, 0.016357f, 0.972656f, 0.017105f, 0.970703f, + 0.017838f, 0.968750f, 0.019135f, 0.966797f, 0.019913f, 0.964844f, 0.020676f, 0.962891f, + 0.021820f, 0.960449f, 0.022766f, 0.958008f, 0.024200f, 0.955566f, 0.025208f, 0.953125f, + 0.026184f, 0.950684f, 0.027283f, 0.947754f, 0.027756f, 0.944336f, 0.028671f, 0.940918f, + 0.030365f, 0.937500f, 0.031235f, 0.933594f, 0.032257f, 0.929688f, 0.033600f, 0.925781f, + 0.035065f, 0.922363f, 0.036407f, 0.917480f, 0.038574f, 0.912598f, 0.039642f, 0.907227f, + 0.040833f, 0.901367f, 0.042450f, 0.895508f, 0.044098f, 0.889648f, 0.046112f, 0.882812f, + 0.047974f, 0.875488f, 0.049896f, 0.866699f, 0.051941f, 0.857910f, 0.053986f, 0.848633f, + 0.055481f, 0.837402f, 0.057922f, 0.825195f, 0.060852f, 0.811523f, 0.062683f, 0.795410f, + 0.064941f, 0.777832f, 0.067017f, 0.757324f, 0.068665f, 0.730957f, 0.069763f, 0.698242f, + 0.069580f, 0.656250f, 0.065613f, 0.595215f, 0.053711f, 0.486572f, 0.015366f, 0.214600f, + 0.000000f, 1.000000f, 0.000858f, 0.999512f, 0.001794f, 0.998535f, 0.002520f, 0.997559f, + 0.002977f, 0.996582f, 0.004337f, 0.995117f, 0.005489f, 0.993652f, 0.006302f, 0.992676f, + 0.007290f, 0.991211f, 0.008499f, 0.989746f, 0.008911f, 0.988770f, 0.009445f, 0.987305f, + 0.011124f, 0.985840f, 0.011757f, 0.983887f, 0.012253f, 0.982910f, 0.013069f, 0.980957f, + 0.014503f, 0.979492f, 0.015312f, 0.977051f, 0.016159f, 0.976074f, 0.016953f, 0.974121f, + 0.018097f, 0.972168f, 0.019211f, 0.970215f, 0.020325f, 0.968262f, 0.021149f, 0.965820f, + 0.022156f, 0.964355f, 0.023560f, 0.961426f, 0.024460f, 0.959473f, 0.025833f, 0.957031f, + 0.027039f, 0.954102f, 0.028168f, 0.952148f, 0.029831f, 0.949219f, 0.030991f, 0.946289f, + 0.032227f, 0.943848f, 0.033722f, 0.940430f, 0.035248f, 0.937012f, 0.035980f, 0.933594f, + 0.037506f, 0.929199f, 0.039062f, 0.925293f, 0.040283f, 0.921387f, 0.041504f, 0.916992f, + 0.043640f, 0.912598f, 0.045135f, 0.907715f, 0.047607f, 0.902344f, 0.049683f, 0.897461f, + 0.050781f, 0.891113f, 0.052704f, 0.885254f, 0.054474f, 0.878418f, 0.056885f, 0.871094f, + 0.060059f, 0.863770f, 0.061310f, 0.854492f, 0.063721f, 0.845703f, 0.066345f, 0.836426f, + 0.068298f, 0.824707f, 0.071350f, 0.812988f, 0.074036f, 0.798340f, 0.076355f, 0.782715f, + 0.078796f, 0.765137f, 0.081299f, 0.745117f, 0.083557f, 0.718750f, 0.084473f, 0.687500f, + 0.083252f, 0.646484f, 0.077881f, 0.586914f, 0.063232f, 0.482422f, 0.017685f, 0.213745f, + 0.000000f, 1.000000f, 0.001359f, 0.999023f, 0.002169f, 0.998047f, 0.003540f, 0.996582f, + 0.003876f, 0.996094f, 0.005264f, 0.994141f, 0.006310f, 0.993164f, 0.007359f, 0.991699f, + 0.009186f, 0.989258f, 0.009979f, 0.988281f, 0.011093f, 0.986328f, 0.011971f, 0.984863f, + 0.013268f, 0.982910f, 0.014565f, 0.980957f, 0.015312f, 0.979492f, 0.016327f, 0.978027f, + 0.018097f, 0.975586f, 0.019119f, 0.973633f, 0.020050f, 0.971680f, 0.020950f, 0.970215f, + 0.022568f, 0.967285f, 0.024017f, 0.964844f, 0.025223f, 0.962402f, 0.026306f, 0.960449f, + 0.027466f, 0.958496f, 0.029068f, 0.955566f, 0.030731f, 0.953125f, 0.032196f, 0.950195f, + 0.033478f, 0.947266f, 0.034943f, 0.944336f, 0.036713f, 0.941406f, 0.038208f, 0.938477f, + 0.039795f, 0.935059f, 0.041840f, 0.931152f, 0.043579f, 0.927734f, 0.045319f, 0.924316f, + 0.046722f, 0.919922f, 0.048157f, 0.915527f, 0.049622f, 0.911133f, 0.052094f, 0.906250f, + 0.053894f, 0.900879f, 0.056152f, 0.895996f, 0.058502f, 0.890625f, 0.060913f, 0.885254f, + 0.062988f, 0.879395f, 0.064880f, 0.873047f, 0.067749f, 0.865723f, 0.070068f, 0.857910f, + 0.073242f, 0.850098f, 0.075073f, 0.841309f, 0.078125f, 0.832031f, 0.080688f, 0.822266f, + 0.083252f, 0.810547f, 0.087158f, 0.797852f, 0.089722f, 0.784180f, 0.092163f, 0.768555f, + 0.094910f, 0.751465f, 0.097168f, 0.730957f, 0.099060f, 0.705566f, 0.099915f, 0.675293f, + 0.097839f, 0.635742f, 0.091858f, 0.579102f, 0.073059f, 0.477051f, 0.019882f, 0.212280f, + 0.000000f, 1.000000f, 0.001362f, 0.999023f, 0.002325f, 0.998047f, 0.004128f, 0.996582f, + 0.005375f, 0.995117f, 0.006443f, 0.993652f, 0.007488f, 0.991699f, 0.009224f, 0.989746f, + 0.011116f, 0.987305f, 0.012489f, 0.986328f, 0.013626f, 0.983887f, 0.015244f, 0.981934f, + 0.016678f, 0.979492f, 0.017624f, 0.978027f, 0.019348f, 0.975586f, 0.020630f, 0.973145f, + 0.022202f, 0.971191f, 0.023865f, 0.968262f, 0.024963f, 0.966309f, 0.026428f, 0.964355f, + 0.028244f, 0.961426f, 0.030136f, 0.958496f, 0.031403f, 0.956055f, 0.032806f, 0.953613f, + 0.034119f, 0.950684f, 0.036438f, 0.947754f, 0.038391f, 0.944336f, 0.040070f, 0.941406f, + 0.041656f, 0.938477f, 0.043335f, 0.935547f, 0.045410f, 0.932129f, 0.047516f, 0.928223f, + 0.049835f, 0.924316f, 0.051788f, 0.920898f, 0.053864f, 0.916992f, 0.055847f, 0.913086f, + 0.058380f, 0.908691f, 0.059692f, 0.904297f, 0.062195f, 0.898926f, 0.064331f, 0.893555f, + 0.066833f, 0.888184f, 0.068970f, 0.882812f, 0.072083f, 0.877441f, 0.074402f, 0.871582f, + 0.077332f, 0.865723f, 0.080078f, 0.858398f, 0.082642f, 0.850586f, 0.085205f, 0.842773f, + 0.088684f, 0.834473f, 0.092224f, 0.826660f, 0.094116f, 0.816895f, 0.097839f, 0.806152f, + 0.101135f, 0.795410f, 0.104187f, 0.782227f, 0.107483f, 0.768555f, 0.109863f, 0.753906f, + 0.112488f, 0.737305f, 0.114929f, 0.716309f, 0.116516f, 0.691406f, 0.116882f, 0.663086f, + 0.113464f, 0.625000f, 0.105530f, 0.569336f, 0.083435f, 0.471436f, 0.022491f, 0.211182f, + 0.000000f, 1.000000f, 0.002094f, 0.998535f, 0.003090f, 0.997559f, 0.005455f, 0.995605f, + 0.007267f, 0.993652f, 0.008560f, 0.991699f, 0.009834f, 0.989746f, 0.011719f, 0.987793f, + 0.012741f, 0.986328f, 0.015282f, 0.983398f, 0.017609f, 0.980469f, 0.018875f, 0.978516f, + 0.021103f, 0.975586f, 0.022339f, 0.973145f, 0.024857f, 0.970703f, 0.026581f, 0.967773f, + 0.028137f, 0.964844f, 0.029907f, 0.962402f, 0.031952f, 0.959473f, 0.033630f, 0.956543f, + 0.035675f, 0.953613f, 0.037811f, 0.950684f, 0.039337f, 0.947754f, 0.041168f, 0.944824f, + 0.043427f, 0.941406f, 0.046204f, 0.937988f, 0.048157f, 0.934570f, 0.050018f, 0.931152f, + 0.051910f, 0.927734f, 0.053955f, 0.924316f, 0.057037f, 0.919922f, 0.059662f, 0.916016f, + 0.061920f, 0.912109f, 0.064270f, 0.908203f, 0.066528f, 0.903809f, 0.068848f, 0.899902f, + 0.072144f, 0.895020f, 0.074951f, 0.890137f, 0.077271f, 0.884277f, 0.079651f, 0.878906f, + 0.082031f, 0.873047f, 0.084961f, 0.867676f, 0.087891f, 0.861816f, 0.090881f, 0.855469f, + 0.094727f, 0.848633f, 0.097778f, 0.841797f, 0.100586f, 0.833984f, 0.104187f, 0.826172f, + 0.107117f, 0.817871f, 0.110535f, 0.809570f, 0.113342f, 0.799316f, 0.117310f, 0.789062f, + 0.121033f, 0.777832f, 0.123718f, 0.765137f, 0.126953f, 0.752441f, 0.129517f, 0.737793f, + 0.132568f, 0.720703f, 0.134521f, 0.700684f, 0.134888f, 0.676758f, 0.135010f, 0.649902f, + 0.130249f, 0.614258f, 0.120850f, 0.560059f, 0.094421f, 0.466797f, 0.025146f, 0.210083f, + 0.000000f, 1.000000f, 0.002527f, 0.998535f, 0.004539f, 0.996582f, 0.006218f, 0.994629f, + 0.008965f, 0.992188f, 0.011086f, 0.989746f, 0.013046f, 0.987305f, 0.015526f, 0.984375f, + 0.016754f, 0.982422f, 0.019302f, 0.979492f, 0.022369f, 0.975586f, 0.024353f, 0.973145f, + 0.026764f, 0.970215f, 0.029572f, 0.966797f, 0.031311f, 0.963867f, 0.034027f, 0.960449f, + 0.035706f, 0.958008f, 0.038391f, 0.954102f, 0.040985f, 0.950684f, 0.042938f, 0.947266f, + 0.045349f, 0.943848f, 0.047760f, 0.940918f, 0.050201f, 0.937012f, 0.052917f, 0.933105f, + 0.055176f, 0.929688f, 0.057831f, 0.925781f, 0.060547f, 0.921875f, 0.062744f, 0.918457f, + 0.065796f, 0.914062f, 0.068481f, 0.910156f, 0.071960f, 0.905762f, 0.074524f, 0.900879f, + 0.077148f, 0.896973f, 0.079712f, 0.892578f, 0.082458f, 0.888184f, 0.086426f, 0.882812f, + 0.089478f, 0.877930f, 0.092957f, 0.872559f, 0.095581f, 0.867188f, 0.098267f, 0.861816f, + 0.100952f, 0.855957f, 0.104126f, 0.850098f, 0.107727f, 0.843262f, 0.111694f, 0.836426f, + 0.114990f, 0.829102f, 0.118652f, 0.822754f, 0.121948f, 0.815430f, 0.125000f, 0.807129f, + 0.127930f, 0.798828f, 0.132202f, 0.789551f, 0.136475f, 0.780273f, 0.139404f, 0.769531f, + 0.142944f, 0.758789f, 0.145874f, 0.747070f, 0.149170f, 0.734375f, 0.151611f, 0.720215f, + 0.154175f, 0.703125f, 0.155396f, 0.684082f, 0.156128f, 0.662598f, 0.153809f, 0.636230f, + 0.147827f, 0.602051f, 0.135620f, 0.549805f, 0.105591f, 0.460693f, 0.027939f, 0.209229f, + 0.000000f, 1.000000f, 0.003227f, 0.998047f, 0.006054f, 0.995605f, 0.008911f, 0.993164f, + 0.011330f, 0.990234f, 0.014748f, 0.986816f, 0.017776f, 0.983398f, 0.020035f, 0.980469f, + 0.023392f, 0.977051f, 0.025986f, 0.973633f, 0.028366f, 0.970215f, 0.031219f, 0.966797f, + 0.034973f, 0.962402f, 0.038177f, 0.958496f, 0.040833f, 0.955078f, 0.043762f, 0.951172f, + 0.047180f, 0.946777f, 0.050049f, 0.942871f, 0.052460f, 0.939453f, 0.055725f, 0.935547f, + 0.058777f, 0.931641f, 0.061584f, 0.927246f, 0.065125f, 0.922852f, 0.067749f, 0.918945f, + 0.070801f, 0.915039f, 0.073425f, 0.910645f, 0.077271f, 0.905762f, 0.080688f, 0.901367f, + 0.083679f, 0.896484f, 0.086609f, 0.892578f, 0.090393f, 0.887695f, 0.093262f, 0.883301f, + 0.096252f, 0.878906f, 0.100037f, 0.873535f, 0.103760f, 0.868164f, 0.107483f, 0.862793f, + 0.111206f, 0.857422f, 0.114502f, 0.852539f, 0.117798f, 0.847168f, 0.120667f, 0.841797f, + 0.123901f, 0.834961f, 0.128052f, 0.828125f, 0.131836f, 0.821289f, 0.135498f, 0.814453f, + 0.138794f, 0.807617f, 0.142578f, 0.800781f, 0.145874f, 0.793945f, 0.149536f, 0.786133f, + 0.153931f, 0.776855f, 0.157715f, 0.768066f, 0.161499f, 0.758789f, 0.164062f, 0.748535f, + 0.167480f, 0.737793f, 0.170410f, 0.727539f, 0.172607f, 0.714844f, 0.175659f, 0.700684f, + 0.177246f, 0.684570f, 0.178467f, 0.666992f, 0.177979f, 0.646973f, 0.173706f, 0.622559f, + 0.166504f, 0.588867f, 0.151367f, 0.540039f, 0.117126f, 0.455078f, 0.030991f, 0.207886f, + 0.000000f, 1.000000f, 0.003941f, 0.998047f, 0.007965f, 0.994629f, 0.012810f, 0.990234f, + 0.015900f, 0.987305f, 0.020020f, 0.982422f, 0.023926f, 0.978516f, 0.028427f, 0.974121f, + 0.032104f, 0.969727f, 0.034668f, 0.965820f, 0.039307f, 0.960938f, 0.042694f, 0.956543f, + 0.045502f, 0.952637f, 0.050079f, 0.947754f, 0.054504f, 0.942383f, 0.058533f, 0.937988f, + 0.062378f, 0.933105f, 0.065735f, 0.928711f, 0.069275f, 0.924316f, 0.073608f, 0.918945f, + 0.077271f, 0.914062f, 0.080750f, 0.909668f, 0.083801f, 0.905273f, 0.087280f, 0.900879f, + 0.091797f, 0.895508f, 0.095703f, 0.890137f, 0.099915f, 0.885254f, 0.103210f, 0.880371f, + 0.106445f, 0.875488f, 0.110046f, 0.871094f, 0.114319f, 0.865723f, 0.118469f, 0.860352f, + 0.122131f, 0.854980f, 0.126099f, 0.849609f, 0.129517f, 0.844238f, 0.133911f, 0.838867f, + 0.137329f, 0.833984f, 0.140747f, 0.828613f, 0.145386f, 0.822266f, 0.149292f, 0.816406f, + 0.152588f, 0.809570f, 0.156372f, 0.802734f, 0.160156f, 0.796387f, 0.163330f, 0.790039f, + 0.166992f, 0.783691f, 0.170288f, 0.776855f, 0.175415f, 0.769043f, 0.179443f, 0.760742f, + 0.182251f, 0.752441f, 0.185669f, 0.743652f, 0.189087f, 0.735352f, 0.191528f, 0.726074f, + 0.194702f, 0.716309f, 0.197510f, 0.706055f, 0.199585f, 0.692383f, 0.202026f, 0.679688f, + 0.202515f, 0.665039f, 0.202271f, 0.648926f, 0.199585f, 0.630371f, 0.194946f, 0.608398f, + 0.185913f, 0.574707f, 0.168701f, 0.530273f, 0.128662f, 0.450195f, 0.033966f, 0.206177f, + 0.000000f, 1.000000f, 0.005634f, 0.997070f, 0.011589f, 0.992676f, 0.017899f, 0.987305f, + 0.024048f, 0.981445f, 0.028473f, 0.976562f, 0.034271f, 0.970703f, 0.039368f, 0.964844f, + 0.044189f, 0.959961f, 0.049896f, 0.953613f, 0.054504f, 0.947754f, 0.058929f, 0.942871f, + 0.063904f, 0.937012f, 0.069275f, 0.931152f, 0.074341f, 0.925293f, 0.078308f, 0.920410f, + 0.084534f, 0.913574f, 0.089050f, 0.907715f, 0.093750f, 0.902344f, 0.097900f, 0.896973f, + 0.102356f, 0.892090f, 0.106873f, 0.886230f, 0.111450f, 0.880859f, 0.116272f, 0.875000f, + 0.120483f, 0.869629f, 0.124512f, 0.864258f, 0.128052f, 0.859375f, 0.132446f, 0.854492f, + 0.137207f, 0.848633f, 0.142090f, 0.842773f, 0.145874f, 0.837402f, 0.150513f, 0.831543f, + 0.154053f, 0.826660f, 0.157593f, 0.821777f, 0.161133f, 0.816895f, 0.166504f, 0.810059f, + 0.170898f, 0.804199f, 0.175049f, 0.798340f, 0.179199f, 0.792480f, 0.182861f, 0.786621f, + 0.186401f, 0.781250f, 0.189941f, 0.774902f, 0.192871f, 0.768555f, 0.196533f, 0.761719f, + 0.200439f, 0.754883f, 0.204468f, 0.747559f, 0.208496f, 0.740234f, 0.211670f, 0.733398f, + 0.214600f, 0.725586f, 0.216919f, 0.717773f, 0.219604f, 0.710449f, 0.222168f, 0.702637f, + 0.224731f, 0.691406f, 0.227661f, 0.681152f, 0.228516f, 0.669922f, 0.230103f, 0.658691f, + 0.228516f, 0.645020f, 0.227051f, 0.630859f, 0.222534f, 0.613770f, 0.217285f, 0.590820f, + 0.205688f, 0.561035f, 0.185181f, 0.519531f, 0.140747f, 0.444824f, 0.037323f, 0.205322f, + 0.000000f, 1.000000f, 0.009445f, 0.995117f, 0.018661f, 0.988281f, 0.026978f, 0.980957f, + 0.035095f, 0.973633f, 0.043243f, 0.965820f, 0.050293f, 0.958496f, 0.058136f, 0.950195f, + 0.065308f, 0.942871f, 0.071960f, 0.935547f, 0.079224f, 0.927734f, 0.085815f, 0.920410f, + 0.091431f, 0.914062f, 0.096924f, 0.907715f, 0.104065f, 0.899902f, 0.109802f, 0.893066f, + 0.116577f, 0.886230f, 0.121277f, 0.880371f, 0.127319f, 0.873047f, 0.133301f, 0.866699f, + 0.139160f, 0.859863f, 0.143921f, 0.854492f, 0.148315f, 0.848633f, 0.152588f, 0.843262f, + 0.158691f, 0.836426f, 0.163940f, 0.830566f, 0.168457f, 0.824707f, 0.172852f, 0.818848f, + 0.177490f, 0.813477f, 0.181152f, 0.808105f, 0.185181f, 0.803223f, 0.190063f, 0.797363f, + 0.194824f, 0.791504f, 0.199097f, 0.785645f, 0.203369f, 0.780273f, 0.207764f, 0.774902f, + 0.211182f, 0.769531f, 0.214844f, 0.764160f, 0.218018f, 0.759277f, 0.221069f, 0.754395f, + 0.226440f, 0.748047f, 0.230347f, 0.741699f, 0.232788f, 0.734863f, 0.235962f, 0.728516f, + 0.239014f, 0.722656f, 0.241821f, 0.716309f, 0.244629f, 0.709961f, 0.247559f, 0.704102f, + 0.249634f, 0.697754f, 0.251465f, 0.689941f, 0.254150f, 0.681641f, 0.256592f, 0.673828f, + 0.257812f, 0.664551f, 0.258545f, 0.655273f, 0.259277f, 0.646484f, 0.258057f, 0.635742f, + 0.255615f, 0.625000f, 0.252441f, 0.612793f, 0.248169f, 0.594727f, 0.240601f, 0.573730f, + 0.226685f, 0.547363f, 0.202026f, 0.510254f, 0.152832f, 0.439941f, 0.040558f, 0.203491f, + 0.000000f, 1.000000f, 0.016251f, 0.992188f, 0.029617f, 0.982422f, 0.044098f, 0.970215f, + 0.057495f, 0.958008f, 0.069092f, 0.947266f, 0.080139f, 0.936523f, 0.090027f, 0.926758f, + 0.101013f, 0.915039f, 0.109863f, 0.906250f, 0.117981f, 0.896973f, 0.127808f, 0.886719f, + 0.135620f, 0.878418f, 0.142822f, 0.870117f, 0.149292f, 0.862305f, 0.157104f, 0.854004f, + 0.163696f, 0.846680f, 0.170532f, 0.838867f, 0.175903f, 0.832520f, 0.182251f, 0.825684f, + 0.189575f, 0.817383f, 0.195190f, 0.811035f, 0.200317f, 0.804688f, 0.205322f, 0.798828f, + 0.209839f, 0.793457f, 0.213867f, 0.787598f, 0.218872f, 0.782227f, 0.223877f, 0.775879f, + 0.229126f, 0.770020f, 0.233521f, 0.764160f, 0.237427f, 0.758789f, 0.241333f, 0.753906f, + 0.244385f, 0.749023f, 0.248047f, 0.744629f, 0.250732f, 0.740234f, 0.255127f, 0.734375f, + 0.259766f, 0.728516f, 0.263184f, 0.723145f, 0.266357f, 0.718262f, 0.269531f, 0.713379f, + 0.272949f, 0.708496f, 0.275391f, 0.703613f, 0.277100f, 0.698730f, 0.278564f, 0.693359f, + 0.280029f, 0.688477f, 0.281982f, 0.683105f, 0.285645f, 0.676270f, 0.288086f, 0.669922f, + 0.290039f, 0.664062f, 0.291016f, 0.657227f, 0.291260f, 0.650879f, 0.292236f, 0.644043f, + 0.292480f, 0.637207f, 0.291260f, 0.630371f, 0.289551f, 0.622559f, 0.286621f, 0.614258f, + 0.284668f, 0.602051f, 0.281494f, 0.589355f, 0.274414f, 0.574707f, 0.263184f, 0.556641f, + 0.246582f, 0.534180f, 0.219238f, 0.500488f, 0.164551f, 0.435059f, 0.044220f, 0.202881f, + 0.000000f, 1.000000f, 0.033203f, 0.984375f, 0.058105f, 0.966797f, 0.081970f, 0.947266f, + 0.102905f, 0.928223f, 0.121643f, 0.911133f, 0.136230f, 0.895996f, 0.151611f, 0.880859f, + 0.164185f, 0.867676f, 0.173218f, 0.856934f, 0.186157f, 0.843750f, 0.196167f, 0.833008f, + 0.204224f, 0.823730f, 0.211060f, 0.815430f, 0.221313f, 0.804199f, 0.228027f, 0.796387f, + 0.235229f, 0.788574f, 0.239746f, 0.782227f, 0.245605f, 0.775391f, 0.252197f, 0.768066f, + 0.259277f, 0.760254f, 0.264404f, 0.753418f, 0.268799f, 0.747559f, 0.273438f, 0.741699f, + 0.277100f, 0.736816f, 0.281006f, 0.731934f, 0.283203f, 0.727539f, 0.287109f, 0.722656f, + 0.292725f, 0.716797f, 0.296631f, 0.710938f, 0.299805f, 0.706543f, 0.303223f, 0.702148f, + 0.305664f, 0.697754f, 0.308105f, 0.693848f, 0.310059f, 0.689941f, 0.312256f, 0.686035f, + 0.314209f, 0.682129f, 0.315674f, 0.679199f, 0.317627f, 0.675293f, 0.321289f, 0.669922f, + 0.324219f, 0.665527f, 0.326172f, 0.661133f, 0.328125f, 0.656738f, 0.328613f, 0.651855f, + 0.329346f, 0.647461f, 0.329834f, 0.643066f, 0.330811f, 0.638672f, 0.330811f, 0.634277f, + 0.331055f, 0.630371f, 0.330322f, 0.626465f, 0.328369f, 0.621582f, 0.327637f, 0.616699f, + 0.327393f, 0.609863f, 0.326416f, 0.602051f, 0.324219f, 0.594727f, 0.320312f, 0.585938f, + 0.315674f, 0.577637f, 0.310059f, 0.567383f, 0.300293f, 0.555176f, 0.286621f, 0.540527f, + 0.266113f, 0.520996f, 0.235718f, 0.492432f, 0.179077f, 0.423584f, 0.047668f, 0.202271f, + 0.000000f, 1.000000f, 0.087769f, 0.961426f, 0.142700f, 0.920898f, 0.180664f, 0.887695f, + 0.209106f, 0.859863f, 0.227783f, 0.838867f, 0.248413f, 0.817383f, 0.261963f, 0.801270f, + 0.273926f, 0.786621f, 0.285889f, 0.771973f, 0.295898f, 0.759766f, 0.302002f, 0.750488f, + 0.308350f, 0.741699f, 0.316162f, 0.732422f, 0.324463f, 0.722656f, 0.329346f, 0.714844f, + 0.333984f, 0.708496f, 0.337891f, 0.702637f, 0.340332f, 0.697266f, 0.344238f, 0.692383f, + 0.346436f, 0.687500f, 0.349121f, 0.683105f, 0.353271f, 0.677734f, 0.356689f, 0.672363f, + 0.360840f, 0.667480f, 0.362793f, 0.663574f, 0.364990f, 0.659668f, 0.367188f, 0.655762f, + 0.368896f, 0.652344f, 0.370361f, 0.648926f, 0.371826f, 0.645996f, 0.372314f, 0.643066f, + 0.374023f, 0.640137f, 0.374756f, 0.637207f, 0.375244f, 0.634766f, 0.375000f, 0.632812f, + 0.375488f, 0.630371f, 0.375977f, 0.627930f, 0.377686f, 0.624512f, 0.378662f, 0.621094f, + 0.379883f, 0.618164f, 0.380859f, 0.614746f, 0.381348f, 0.611816f, 0.381104f, 0.608887f, + 0.380127f, 0.605469f, 0.380127f, 0.601562f, 0.378906f, 0.598145f, 0.378418f, 0.595215f, + 0.376709f, 0.591797f, 0.375244f, 0.588867f, 0.372559f, 0.584961f, 0.369873f, 0.580566f, + 0.367188f, 0.577148f, 0.362549f, 0.572266f, 0.357666f, 0.567871f, 0.351562f, 0.562500f, + 0.345459f, 0.557129f, 0.335693f, 0.549316f, 0.323242f, 0.540527f, 0.308594f, 0.527344f, + 0.288574f, 0.507324f, 0.255859f, 0.475830f, 0.193481f, 0.413818f, 0.051056f, 0.202271f, + 0.000000f, 1.000000f, 0.172485f, 0.925293f, 0.241333f, 0.869629f, 0.279541f, 0.829590f, + 0.305664f, 0.798828f, 0.324463f, 0.774414f, 0.339844f, 0.754395f, 0.350586f, 0.737305f, + 0.359619f, 0.723145f, 0.367676f, 0.710449f, 0.374756f, 0.699707f, 0.380371f, 0.689453f, + 0.385742f, 0.680664f, 0.389160f, 0.673340f, 0.394775f, 0.666016f, 0.397705f, 0.659180f, + 0.401367f, 0.653320f, 0.404053f, 0.647949f, 0.405762f, 0.643066f, 0.408691f, 0.638184f, + 0.410889f, 0.634277f, 0.413330f, 0.629395f, 0.414795f, 0.625488f, 0.417480f, 0.621582f, + 0.418457f, 0.618164f, 0.420166f, 0.614746f, 0.420654f, 0.611816f, 0.422852f, 0.608398f, + 0.423584f, 0.605469f, 0.424561f, 0.602539f, 0.425049f, 0.600098f, 0.425293f, 0.597656f, + 0.427002f, 0.595215f, 0.427246f, 0.592285f, 0.427002f, 0.590332f, 0.427246f, 0.587891f, + 0.427979f, 0.585449f, 0.428223f, 0.583496f, 0.427979f, 0.581055f, 0.427979f, 0.579102f, + 0.428467f, 0.576172f, 0.427979f, 0.574219f, 0.427734f, 0.571777f, 0.427002f, 0.569824f, + 0.426025f, 0.566895f, 0.425293f, 0.563477f, 0.424072f, 0.560547f, 0.422363f, 0.557617f, + 0.420898f, 0.554688f, 0.418945f, 0.552246f, 0.417236f, 0.548828f, 0.414062f, 0.544434f, + 0.411133f, 0.540527f, 0.407715f, 0.536133f, 0.403076f, 0.531250f, 0.397949f, 0.525879f, + 0.391602f, 0.519531f, 0.383301f, 0.511719f, 0.372803f, 0.502441f, 0.357910f, 0.490479f, + 0.337646f, 0.473633f, 0.305420f, 0.446533f, 0.244385f, 0.391846f, 0.092896f, 0.199219f, + 0.000000f, 1.000000f, 0.175415f, 0.923828f, 0.244263f, 0.868164f, 0.284668f, 0.826660f, + 0.313232f, 0.794434f, 0.332764f, 0.769043f, 0.348145f, 0.748047f, 0.361816f, 0.729492f, + 0.371582f, 0.714355f, 0.380859f, 0.700684f, 0.388428f, 0.688965f, 0.395508f, 0.677734f, + 0.401855f, 0.667969f, 0.406006f, 0.659668f, 0.411865f, 0.651367f, 0.416260f, 0.644043f, + 0.420410f, 0.637207f, 0.423828f, 0.631348f, 0.427246f, 0.625488f, 0.430420f, 0.620117f, + 0.432861f, 0.615234f, 0.436768f, 0.609863f, 0.439697f, 0.604980f, 0.442139f, 0.600098f, + 0.444336f, 0.595703f, 0.447021f, 0.591797f, 0.448242f, 0.587891f, 0.451172f, 0.583984f, + 0.452637f, 0.580566f, 0.454834f, 0.576660f, 0.456299f, 0.573242f, 0.457520f, 0.570312f, + 0.459717f, 0.566406f, 0.460938f, 0.563477f, 0.461670f, 0.560547f, 0.462891f, 0.557129f, + 0.464111f, 0.554199f, 0.465576f, 0.551270f, 0.466064f, 0.548340f, 0.467041f, 0.544922f, + 0.468506f, 0.541992f, 0.468750f, 0.539062f, 0.469238f, 0.536133f, 0.469727f, 0.532715f, + 0.470459f, 0.529785f, 0.469482f, 0.525391f, 0.469238f, 0.521484f, 0.469238f, 0.517578f, + 0.468750f, 0.513672f, 0.467773f, 0.510254f, 0.467773f, 0.505859f, 0.466797f, 0.500977f, + 0.465088f, 0.495605f, 0.462891f, 0.490479f, 0.460205f, 0.484619f, 0.457031f, 0.477539f, + 0.452637f, 0.469727f, 0.446777f, 0.460693f, 0.440186f, 0.450439f, 0.428711f, 0.437500f, + 0.413330f, 0.419678f, 0.387695f, 0.393311f, 0.335938f, 0.341797f, 0.192627f, 0.175903f, + 0.000000f, 1.000000f, 0.176514f, 0.923828f, 0.248413f, 0.865723f, 0.291016f, 0.823242f, + 0.320068f, 0.789551f, 0.342529f, 0.762695f, 0.357666f, 0.741211f, 0.373047f, 0.721191f, + 0.384521f, 0.704590f, 0.395020f, 0.689941f, 0.403076f, 0.677246f, 0.411377f, 0.665527f, + 0.417969f, 0.654785f, 0.424561f, 0.645020f, 0.431641f, 0.635742f, 0.436279f, 0.627441f, + 0.441895f, 0.619629f, 0.445557f, 0.612793f, 0.449707f, 0.606445f, 0.453369f, 0.600586f, + 0.457031f, 0.594727f, 0.461426f, 0.588867f, 0.464600f, 0.583008f, 0.467529f, 0.578125f, + 0.471436f, 0.572754f, 0.474365f, 0.567871f, 0.476562f, 0.563477f, 0.480225f, 0.559082f, + 0.482178f, 0.554199f, 0.483887f, 0.550293f, 0.487061f, 0.546387f, 0.489258f, 0.542480f, + 0.492188f, 0.538086f, 0.494385f, 0.533691f, 0.495850f, 0.530273f, 0.497314f, 0.526855f, + 0.500000f, 0.522461f, 0.501465f, 0.519043f, 0.503418f, 0.515137f, 0.505371f, 0.511230f, + 0.506836f, 0.507812f, 0.508301f, 0.503906f, 0.509766f, 0.500000f, 0.511719f, 0.496094f, + 0.512695f, 0.492188f, 0.514648f, 0.487305f, 0.514648f, 0.482422f, 0.515625f, 0.477539f, + 0.515625f, 0.472900f, 0.515625f, 0.468262f, 0.518066f, 0.462891f, 0.518066f, 0.457520f, + 0.517090f, 0.450928f, 0.517090f, 0.444580f, 0.516113f, 0.437988f, 0.515137f, 0.429932f, + 0.513184f, 0.421631f, 0.509766f, 0.411865f, 0.504395f, 0.399902f, 0.496826f, 0.385986f, + 0.484863f, 0.367676f, 0.465576f, 0.340820f, 0.424072f, 0.293701f, 0.297119f, 0.152222f, + 0.000000f, 1.000000f, 0.178955f, 0.922852f, 0.252930f, 0.863281f, 0.296875f, 0.819336f, + 0.328125f, 0.784668f, 0.350830f, 0.756836f, 0.369629f, 0.732910f, 0.385986f, 0.711914f, + 0.399170f, 0.694336f, 0.409912f, 0.678711f, 0.418213f, 0.665527f, 0.427734f, 0.652344f, + 0.435791f, 0.640625f, 0.442139f, 0.630859f, 0.448730f, 0.621094f, 0.456299f, 0.611328f, + 0.461670f, 0.603027f, 0.466797f, 0.595215f, 0.470947f, 0.587891f, 0.476562f, 0.581055f, + 0.480713f, 0.574219f, 0.485352f, 0.567871f, 0.490479f, 0.561035f, 0.493896f, 0.555176f, + 0.498047f, 0.549316f, 0.501465f, 0.543945f, 0.504395f, 0.539062f, 0.508789f, 0.533203f, + 0.511719f, 0.528320f, 0.514648f, 0.523438f, 0.518555f, 0.518555f, 0.520996f, 0.513672f, + 0.523926f, 0.509277f, 0.526855f, 0.504395f, 0.529785f, 0.500000f, 0.532227f, 0.495850f, + 0.534668f, 0.491211f, 0.538574f, 0.486328f, 0.540527f, 0.481934f, 0.542969f, 0.477539f, + 0.545898f, 0.473145f, 0.547852f, 0.468506f, 0.549805f, 0.464111f, 0.553223f, 0.458984f, + 0.555176f, 0.454346f, 0.557129f, 0.449463f, 0.558594f, 0.443604f, 0.559570f, 0.437988f, + 0.561523f, 0.432617f, 0.562988f, 0.426514f, 0.566406f, 0.420410f, 0.566406f, 0.414551f, + 0.567871f, 0.407715f, 0.568359f, 0.400146f, 0.568359f, 0.392822f, 0.569336f, 0.384277f, + 0.568848f, 0.374512f, 0.566406f, 0.364014f, 0.563965f, 0.351807f, 0.559082f, 0.337402f, + 0.550781f, 0.319092f, 0.536133f, 0.292480f, 0.504395f, 0.249023f, 0.398926f, 0.127197f, + 0.000000f, 1.000000f, 0.180176f, 0.922363f, 0.257812f, 0.860840f, 0.304443f, 0.815430f, + 0.337402f, 0.778809f, 0.361328f, 0.749512f, 0.380859f, 0.725098f, 0.397217f, 0.703613f, + 0.410645f, 0.685059f, 0.423096f, 0.668457f, 0.433350f, 0.653809f, 0.443359f, 0.640137f, + 0.453857f, 0.626953f, 0.460205f, 0.615723f, 0.468018f, 0.605469f, 0.476074f, 0.595215f, + 0.481934f, 0.585938f, 0.488037f, 0.577148f, 0.493652f, 0.568848f, 0.499756f, 0.561523f, + 0.503906f, 0.553711f, 0.508301f, 0.547363f, 0.515137f, 0.539551f, 0.519531f, 0.532715f, + 0.524902f, 0.525879f, 0.528809f, 0.520020f, 0.533203f, 0.513672f, 0.536621f, 0.507812f, + 0.540527f, 0.501953f, 0.543945f, 0.496826f, 0.547852f, 0.491211f, 0.552734f, 0.485840f, + 0.556152f, 0.480225f, 0.559570f, 0.475098f, 0.562500f, 0.469971f, 0.565430f, 0.465088f, + 0.570801f, 0.459473f, 0.573730f, 0.454102f, 0.576172f, 0.449219f, 0.579590f, 0.443848f, + 0.582520f, 0.438965f, 0.586426f, 0.433350f, 0.588867f, 0.428467f, 0.591797f, 0.423096f, + 0.595703f, 0.417480f, 0.598145f, 0.412109f, 0.600586f, 0.406250f, 0.603027f, 0.399902f, + 0.605469f, 0.393311f, 0.607422f, 0.386963f, 0.610352f, 0.380127f, 0.613281f, 0.373047f, + 0.615723f, 0.366455f, 0.615723f, 0.358154f, 0.617676f, 0.350098f, 0.620117f, 0.340820f, + 0.620117f, 0.330566f, 0.620605f, 0.320068f, 0.619141f, 0.307373f, 0.618164f, 0.292725f, + 0.612305f, 0.273926f, 0.601562f, 0.249756f, 0.576660f, 0.209717f, 0.489502f, 0.105347f, + 0.000000f, 1.000000f, 0.182373f, 0.921387f, 0.262695f, 0.858398f, 0.311768f, 0.810547f, + 0.345947f, 0.773438f, 0.371094f, 0.743164f, 0.391602f, 0.717285f, 0.408936f, 0.695312f, + 0.424561f, 0.674805f, 0.437744f, 0.657715f, 0.448975f, 0.641113f, 0.459717f, 0.626953f, + 0.469482f, 0.613770f, 0.479004f, 0.601074f, 0.487305f, 0.589355f, 0.494873f, 0.578613f, + 0.502441f, 0.568359f, 0.508789f, 0.559082f, 0.516113f, 0.549805f, 0.521484f, 0.541504f, + 0.527344f, 0.533203f, 0.532715f, 0.525879f, 0.538574f, 0.518066f, 0.545898f, 0.509766f, + 0.550293f, 0.502930f, 0.554688f, 0.496094f, 0.561035f, 0.489014f, 0.564453f, 0.482666f, + 0.570312f, 0.476074f, 0.574219f, 0.469727f, 0.578613f, 0.463867f, 0.583496f, 0.457764f, + 0.587402f, 0.451416f, 0.590820f, 0.445801f, 0.595703f, 0.439941f, 0.599121f, 0.434326f, + 0.604004f, 0.428467f, 0.607422f, 0.422607f, 0.611816f, 0.416748f, 0.614746f, 0.411377f, + 0.618652f, 0.405518f, 0.622070f, 0.399902f, 0.626953f, 0.393799f, 0.629883f, 0.387939f, + 0.633789f, 0.382324f, 0.636719f, 0.376221f, 0.641113f, 0.369873f, 0.642090f, 0.363525f, + 0.645508f, 0.356201f, 0.649414f, 0.348877f, 0.651855f, 0.341797f, 0.655273f, 0.334473f, + 0.658203f, 0.327148f, 0.661133f, 0.318848f, 0.662598f, 0.310059f, 0.665039f, 0.300781f, + 0.667480f, 0.290527f, 0.668945f, 0.279541f, 0.668457f, 0.267334f, 0.668457f, 0.252441f, + 0.663574f, 0.234863f, 0.657715f, 0.211548f, 0.638184f, 0.175049f, 0.567871f, 0.086548f, + 0.000000f, 1.000000f, 0.185059f, 0.919922f, 0.267822f, 0.855469f, 0.317627f, 0.807129f, + 0.353760f, 0.769043f, 0.380859f, 0.736816f, 0.404053f, 0.708984f, 0.420654f, 0.686035f, + 0.437500f, 0.665527f, 0.451904f, 0.646484f, 0.465088f, 0.628906f, 0.476074f, 0.613770f, + 0.487305f, 0.599121f, 0.496826f, 0.586426f, 0.505371f, 0.574219f, 0.514648f, 0.562012f, + 0.523438f, 0.550781f, 0.531250f, 0.540527f, 0.536621f, 0.531250f, 0.543945f, 0.521973f, + 0.551758f, 0.512207f, 0.556152f, 0.504883f, 0.563965f, 0.496094f, 0.570312f, 0.487549f, + 0.575684f, 0.479736f, 0.581543f, 0.471924f, 0.587402f, 0.464600f, 0.592285f, 0.457520f, + 0.598145f, 0.450195f, 0.602051f, 0.443604f, 0.607910f, 0.436768f, 0.613770f, 0.429932f, + 0.617676f, 0.423584f, 0.622070f, 0.417236f, 0.626465f, 0.410889f, 0.630859f, 0.404785f, + 0.635254f, 0.398438f, 0.640137f, 0.392090f, 0.645020f, 0.385498f, 0.646973f, 0.380127f, + 0.652832f, 0.373779f, 0.657227f, 0.367432f, 0.661133f, 0.361084f, 0.664551f, 0.354736f, + 0.668945f, 0.348633f, 0.672852f, 0.342041f, 0.676270f, 0.335693f, 0.680176f, 0.328857f, + 0.684570f, 0.321289f, 0.687012f, 0.313721f, 0.690918f, 0.306152f, 0.693848f, 0.298828f, + 0.697266f, 0.291016f, 0.701660f, 0.282959f, 0.704102f, 0.273438f, 0.706055f, 0.264160f, + 0.709473f, 0.254395f, 0.709473f, 0.243408f, 0.712891f, 0.231323f, 0.711914f, 0.217041f, + 0.709961f, 0.200317f, 0.706055f, 0.178955f, 0.690430f, 0.145874f, 0.636719f, 0.071045f, + 0.000000f, 1.000000f, 0.187134f, 0.918945f, 0.273193f, 0.852539f, 0.324707f, 0.803223f, + 0.360840f, 0.764160f, 0.391357f, 0.729980f, 0.414307f, 0.701660f, 0.434814f, 0.676758f, + 0.451172f, 0.654785f, 0.465820f, 0.635254f, 0.481201f, 0.616699f, 0.492920f, 0.600098f, + 0.503906f, 0.584961f, 0.515625f, 0.570801f, 0.524414f, 0.558105f, 0.533203f, 0.545898f, + 0.542969f, 0.533691f, 0.551270f, 0.522461f, 0.559082f, 0.511719f, 0.566895f, 0.501465f, + 0.573730f, 0.492188f, 0.580566f, 0.483398f, 0.587402f, 0.474609f, 0.595215f, 0.465088f, + 0.602051f, 0.456787f, 0.606445f, 0.448730f, 0.613281f, 0.440430f, 0.620117f, 0.432373f, + 0.624512f, 0.425293f, 0.629883f, 0.417725f, 0.635742f, 0.410645f, 0.642090f, 0.403076f, + 0.644531f, 0.396729f, 0.651855f, 0.389404f, 0.655762f, 0.382812f, 0.660645f, 0.376221f, + 0.666016f, 0.369141f, 0.670898f, 0.362549f, 0.674805f, 0.356201f, 0.679199f, 0.349609f, + 0.683594f, 0.343506f, 0.689453f, 0.336182f, 0.692383f, 0.330078f, 0.697754f, 0.323242f, + 0.701172f, 0.316895f, 0.706543f, 0.310059f, 0.709961f, 0.303467f, 0.714355f, 0.296387f, + 0.718262f, 0.289062f, 0.721191f, 0.281250f, 0.724609f, 0.273682f, 0.729004f, 0.265869f, + 0.732910f, 0.258301f, 0.735840f, 0.250244f, 0.739746f, 0.240845f, 0.742676f, 0.231689f, + 0.745605f, 0.222168f, 0.748535f, 0.211792f, 0.750488f, 0.199585f, 0.751953f, 0.186157f, + 0.750488f, 0.171021f, 0.746094f, 0.151123f, 0.734375f, 0.120911f, 0.691406f, 0.058105f, + 0.000000f, 1.000000f, 0.189819f, 0.917969f, 0.275879f, 0.851562f, 0.331055f, 0.799805f, + 0.370117f, 0.758301f, 0.400879f, 0.723633f, 0.426025f, 0.693359f, 0.446533f, 0.667480f, + 0.465332f, 0.644531f, 0.480225f, 0.624023f, 0.496582f, 0.604492f, 0.509766f, 0.586914f, + 0.521973f, 0.570801f, 0.533203f, 0.555664f, 0.542969f, 0.541992f, 0.553223f, 0.528809f, + 0.562988f, 0.516113f, 0.572266f, 0.503906f, 0.580566f, 0.492920f, 0.589355f, 0.481934f, + 0.597168f, 0.471924f, 0.603516f, 0.462646f, 0.611328f, 0.452881f, 0.618652f, 0.443359f, + 0.625977f, 0.434326f, 0.632324f, 0.425537f, 0.638672f, 0.416748f, 0.644531f, 0.408447f, + 0.649902f, 0.400635f, 0.657715f, 0.392334f, 0.662598f, 0.385010f, 0.667969f, 0.377441f, + 0.673340f, 0.369873f, 0.678711f, 0.363037f, 0.684082f, 0.355957f, 0.688965f, 0.348633f, + 0.694336f, 0.341553f, 0.698730f, 0.334717f, 0.704590f, 0.327881f, 0.708496f, 0.321289f, + 0.713867f, 0.314453f, 0.718750f, 0.307373f, 0.722656f, 0.300537f, 0.728027f, 0.293945f, + 0.730469f, 0.287842f, 0.735840f, 0.280518f, 0.741211f, 0.273438f, 0.745117f, 0.266846f, + 0.750000f, 0.259766f, 0.752930f, 0.251709f, 0.756348f, 0.244263f, 0.760742f, 0.236328f, + 0.764160f, 0.228516f, 0.768066f, 0.220459f, 0.770996f, 0.212646f, 0.774902f, 0.202881f, + 0.776855f, 0.193726f, 0.780762f, 0.184082f, 0.782715f, 0.171997f, 0.782227f, 0.160522f, + 0.783691f, 0.146240f, 0.781738f, 0.127808f, 0.773438f, 0.101501f, 0.738281f, 0.046478f, + 0.000000f, 1.000000f, 0.193359f, 0.916016f, 0.280273f, 0.849121f, 0.338867f, 0.795410f, + 0.378906f, 0.752930f, 0.411377f, 0.716309f, 0.437012f, 0.686035f, 0.459473f, 0.658203f, + 0.478760f, 0.634277f, 0.495605f, 0.612305f, 0.511719f, 0.591797f, 0.525879f, 0.573730f, + 0.538574f, 0.557129f, 0.552246f, 0.540527f, 0.562500f, 0.525879f, 0.572754f, 0.512207f, + 0.583008f, 0.499023f, 0.593262f, 0.485840f, 0.601562f, 0.474365f, 0.611328f, 0.462646f, + 0.617676f, 0.452393f, 0.626465f, 0.441895f, 0.633301f, 0.432373f, 0.641113f, 0.422119f, + 0.648926f, 0.412354f, 0.655762f, 0.403076f, 0.663574f, 0.393555f, 0.668945f, 0.385498f, + 0.675781f, 0.376709f, 0.682617f, 0.368652f, 0.687988f, 0.360352f, 0.695312f, 0.352539f, + 0.698730f, 0.345215f, 0.704102f, 0.337646f, 0.711426f, 0.329834f, 0.715332f, 0.322754f, + 0.720215f, 0.315430f, 0.725586f, 0.308350f, 0.730469f, 0.301270f, 0.735352f, 0.294434f, + 0.740723f, 0.287598f, 0.745605f, 0.280273f, 0.750000f, 0.273682f, 0.754883f, 0.266846f, + 0.758301f, 0.260254f, 0.764160f, 0.253174f, 0.768066f, 0.246460f, 0.773438f, 0.239380f, + 0.776855f, 0.232788f, 0.779785f, 0.225586f, 0.784180f, 0.217529f, 0.787598f, 0.209961f, + 0.791504f, 0.202271f, 0.795898f, 0.194336f, 0.799316f, 0.186279f, 0.802734f, 0.178345f, + 0.805176f, 0.168945f, 0.808594f, 0.159424f, 0.811035f, 0.149048f, 0.812012f, 0.137939f, + 0.812988f, 0.124817f, 0.811523f, 0.108582f, 0.805176f, 0.085022f, 0.776855f, 0.038177f, + 0.000000f, 1.000000f, 0.195190f, 0.915527f, 0.286133f, 0.846191f, 0.344727f, 0.791992f, + 0.388428f, 0.746582f, 0.420898f, 0.709961f, 0.447754f, 0.677734f, 0.470703f, 0.649414f, + 0.492676f, 0.623535f, 0.511230f, 0.600586f, 0.526855f, 0.580078f, 0.541992f, 0.560547f, + 0.555176f, 0.542969f, 0.568848f, 0.525391f, 0.581543f, 0.509766f, 0.591797f, 0.495605f, + 0.602051f, 0.482422f, 0.613281f, 0.468262f, 0.622559f, 0.456055f, 0.630859f, 0.443848f, + 0.640137f, 0.432373f, 0.647461f, 0.421875f, 0.655273f, 0.411621f, 0.663574f, 0.401123f, + 0.670898f, 0.391602f, 0.678223f, 0.381348f, 0.686035f, 0.371826f, 0.692383f, 0.362793f, + 0.699707f, 0.354004f, 0.705078f, 0.345703f, 0.711914f, 0.336914f, 0.717773f, 0.329102f, + 0.724121f, 0.321045f, 0.727539f, 0.313721f, 0.734863f, 0.305664f, 0.741211f, 0.298096f, + 0.745117f, 0.290771f, 0.749512f, 0.283691f, 0.755859f, 0.276611f, 0.759277f, 0.269775f, + 0.765137f, 0.262451f, 0.770996f, 0.255371f, 0.774414f, 0.248779f, 0.778809f, 0.242065f, + 0.784668f, 0.235474f, 0.788574f, 0.228271f, 0.793945f, 0.221191f, 0.796875f, 0.215210f, + 0.801270f, 0.208374f, 0.806152f, 0.201416f, 0.809082f, 0.193970f, 0.812012f, 0.186279f, + 0.816406f, 0.178589f, 0.819824f, 0.171387f, 0.822754f, 0.163940f, 0.827148f, 0.156128f, + 0.829590f, 0.147339f, 0.833008f, 0.138184f, 0.834473f, 0.129883f, 0.836426f, 0.118469f, + 0.837891f, 0.106628f, 0.836426f, 0.092163f, 0.831055f, 0.071899f, 0.808105f, 0.031708f, + 0.000000f, 1.000000f, 0.196777f, 0.915039f, 0.291260f, 0.843750f, 0.351074f, 0.787598f, + 0.397217f, 0.741699f, 0.431152f, 0.703125f, 0.458984f, 0.669922f, 0.484375f, 0.639648f, + 0.507324f, 0.612793f, 0.525879f, 0.588867f, 0.541992f, 0.567871f, 0.559082f, 0.546875f, + 0.571289f, 0.529297f, 0.586914f, 0.510742f, 0.598633f, 0.494629f, 0.610840f, 0.479248f, + 0.621094f, 0.465332f, 0.631836f, 0.450928f, 0.642090f, 0.437988f, 0.651367f, 0.425293f, + 0.660645f, 0.413330f, 0.669922f, 0.402344f, 0.676758f, 0.391357f, 0.684082f, 0.381104f, + 0.692383f, 0.371094f, 0.700684f, 0.360596f, 0.708496f, 0.350342f, 0.714355f, 0.341309f, + 0.722168f, 0.332275f, 0.728027f, 0.323486f, 0.732910f, 0.314941f, 0.740234f, 0.306641f, + 0.746094f, 0.298584f, 0.750977f, 0.290771f, 0.757324f, 0.282959f, 0.764160f, 0.275146f, + 0.766602f, 0.268311f, 0.772461f, 0.260742f, 0.778320f, 0.253418f, 0.783203f, 0.246460f, + 0.787598f, 0.239380f, 0.792969f, 0.232422f, 0.796387f, 0.226196f, 0.801270f, 0.219238f, + 0.806641f, 0.212402f, 0.810547f, 0.205811f, 0.814941f, 0.198975f, 0.819336f, 0.192749f, + 0.822266f, 0.186768f, 0.828125f, 0.179321f, 0.831543f, 0.172974f, 0.833984f, 0.165649f, + 0.837402f, 0.158203f, 0.840332f, 0.151489f, 0.845215f, 0.143799f, 0.848633f, 0.136353f, + 0.851074f, 0.129517f, 0.853027f, 0.120483f, 0.856934f, 0.112244f, 0.856445f, 0.102600f, + 0.858887f, 0.091309f, 0.858398f, 0.079041f, 0.854980f, 0.060913f, 0.836426f, 0.027008f, + 0.000000f, 1.000000f, 0.197632f, 0.915039f, 0.295654f, 0.841309f, 0.357666f, 0.784180f, + 0.405273f, 0.735840f, 0.441895f, 0.695801f, 0.471924f, 0.661133f, 0.497803f, 0.630371f, + 0.521973f, 0.602051f, 0.541016f, 0.577148f, 0.558594f, 0.554688f, 0.575684f, 0.533203f, + 0.589355f, 0.514648f, 0.603516f, 0.496582f, 0.617188f, 0.479248f, 0.627930f, 0.463379f, + 0.640137f, 0.448486f, 0.651855f, 0.433838f, 0.662598f, 0.420166f, 0.671875f, 0.406982f, + 0.679688f, 0.395020f, 0.688965f, 0.383301f, 0.696777f, 0.372070f, 0.705566f, 0.361084f, + 0.712402f, 0.351562f, 0.721191f, 0.340820f, 0.728027f, 0.330322f, 0.735840f, 0.321045f, + 0.741699f, 0.311768f, 0.749023f, 0.302490f, 0.754883f, 0.293945f, 0.761230f, 0.285400f, + 0.767578f, 0.277588f, 0.772461f, 0.269287f, 0.777832f, 0.261719f, 0.784668f, 0.253662f, + 0.788086f, 0.246704f, 0.792969f, 0.239746f, 0.798828f, 0.232178f, 0.803223f, 0.225098f, + 0.807617f, 0.218384f, 0.813477f, 0.211548f, 0.816406f, 0.205200f, 0.822266f, 0.198364f, + 0.826172f, 0.191895f, 0.830078f, 0.185303f, 0.833984f, 0.179199f, 0.837402f, 0.172974f, + 0.842285f, 0.166748f, 0.846680f, 0.160034f, 0.850586f, 0.153687f, 0.852539f, 0.147705f, + 0.855957f, 0.140381f, 0.858887f, 0.133667f, 0.863281f, 0.126221f, 0.865723f, 0.119873f, + 0.869141f, 0.113281f, 0.871094f, 0.105591f, 0.874023f, 0.096863f, 0.875977f, 0.088867f, + 0.876953f, 0.079041f, 0.877441f, 0.067261f, 0.875000f, 0.051941f, 0.858887f, 0.023010f, + 0.000000f, 1.000000f, 0.200562f, 0.914062f, 0.301758f, 0.837891f, 0.366699f, 0.778809f, + 0.414307f, 0.730469f, 0.452148f, 0.688965f, 0.483154f, 0.652832f, 0.511719f, 0.620605f, + 0.534180f, 0.592285f, 0.554688f, 0.566406f, 0.574219f, 0.542480f, 0.591309f, 0.520508f, + 0.606445f, 0.500488f, 0.621094f, 0.481689f, 0.634766f, 0.464111f, 0.645996f, 0.447754f, + 0.657715f, 0.432129f, 0.669434f, 0.417480f, 0.679199f, 0.403564f, 0.690430f, 0.389404f, + 0.698730f, 0.377197f, 0.708008f, 0.365234f, 0.716309f, 0.353516f, 0.723145f, 0.342773f, + 0.732422f, 0.332031f, 0.740723f, 0.321777f, 0.748047f, 0.311279f, 0.753906f, 0.301758f, + 0.762207f, 0.291992f, 0.768555f, 0.282715f, 0.773926f, 0.274414f, 0.780273f, 0.265869f, + 0.786133f, 0.257812f, 0.792480f, 0.249268f, 0.796875f, 0.241821f, 0.801758f, 0.234375f, + 0.807129f, 0.226929f, 0.812012f, 0.219849f, 0.817383f, 0.212769f, 0.822754f, 0.205444f, + 0.825684f, 0.199219f, 0.831055f, 0.192627f, 0.834961f, 0.186035f, 0.839355f, 0.179565f, + 0.843750f, 0.173340f, 0.847656f, 0.166992f, 0.851562f, 0.161255f, 0.855469f, 0.154907f, + 0.860352f, 0.148926f, 0.862793f, 0.142822f, 0.867188f, 0.137085f, 0.870117f, 0.131592f, + 0.873535f, 0.124878f, 0.876465f, 0.117676f, 0.877930f, 0.111755f, 0.881348f, 0.105347f, + 0.884766f, 0.098877f, 0.887695f, 0.092346f, 0.889160f, 0.084900f, 0.892090f, 0.076965f, + 0.893066f, 0.068054f, 0.893555f, 0.058258f, 0.888672f, 0.044098f, 0.879395f, 0.018127f, + 0.000000f, 1.000000f, 0.203247f, 0.912598f, 0.306396f, 0.835938f, 0.373047f, 0.775391f, + 0.423096f, 0.724609f, 0.463379f, 0.681641f, 0.495605f, 0.644531f, 0.523438f, 0.611328f, + 0.548340f, 0.581543f, 0.569336f, 0.555176f, 0.589844f, 0.530273f, 0.606445f, 0.507812f, + 0.622559f, 0.487061f, 0.637207f, 0.467529f, 0.651367f, 0.449219f, 0.664062f, 0.432129f, + 0.675293f, 0.416504f, 0.686523f, 0.401611f, 0.698242f, 0.386719f, 0.708008f, 0.372803f, + 0.716797f, 0.360107f, 0.727051f, 0.347168f, 0.734375f, 0.335938f, 0.742676f, 0.324707f, + 0.750488f, 0.313965f, 0.757812f, 0.303955f, 0.765625f, 0.293213f, 0.772461f, 0.283447f, + 0.780762f, 0.273682f, 0.786133f, 0.264648f, 0.791992f, 0.255859f, 0.798340f, 0.247559f, + 0.804688f, 0.239014f, 0.809082f, 0.231079f, 0.814941f, 0.223511f, 0.818848f, 0.216309f, + 0.825684f, 0.208740f, 0.830078f, 0.201538f, 0.833496f, 0.194946f, 0.839355f, 0.187744f, + 0.841309f, 0.181885f, 0.848633f, 0.174927f, 0.851074f, 0.168701f, 0.855957f, 0.162354f, + 0.859375f, 0.156616f, 0.862793f, 0.150757f, 0.867676f, 0.144775f, 0.871094f, 0.139038f, + 0.875000f, 0.133179f, 0.878906f, 0.127563f, 0.880371f, 0.122559f, 0.885254f, 0.116638f, + 0.888184f, 0.111267f, 0.890137f, 0.104492f, 0.892578f, 0.098938f, 0.895508f, 0.092896f, + 0.899902f, 0.086243f, 0.900391f, 0.080933f, 0.902832f, 0.074402f, 0.905273f, 0.066711f, + 0.906250f, 0.059174f, 0.905273f, 0.050293f, 0.905762f, 0.036987f, 0.895996f, 0.014900f, + 0.000000f, 1.000000f, 0.206665f, 0.911133f, 0.309814f, 0.833984f, 0.380127f, 0.770996f, + 0.432861f, 0.718750f, 0.473145f, 0.674805f, 0.506836f, 0.636230f, 0.536621f, 0.602051f, + 0.562012f, 0.571289f, 0.583984f, 0.543457f, 0.603516f, 0.518066f, 0.622070f, 0.495361f, + 0.637695f, 0.473877f, 0.653320f, 0.453613f, 0.666504f, 0.435303f, 0.681152f, 0.417236f, + 0.693848f, 0.400635f, 0.704102f, 0.385498f, 0.714844f, 0.370850f, 0.726562f, 0.356201f, + 0.733887f, 0.343506f, 0.744629f, 0.330322f, 0.751953f, 0.319092f, 0.759766f, 0.307617f, + 0.768555f, 0.296631f, 0.774414f, 0.286621f, 0.782227f, 0.276367f, 0.789062f, 0.266357f, + 0.797363f, 0.256348f, 0.802246f, 0.247437f, 0.808105f, 0.238770f, 0.814453f, 0.230347f, + 0.820801f, 0.221802f, 0.825195f, 0.214233f, 0.830566f, 0.206665f, 0.835449f, 0.199341f, + 0.841797f, 0.191650f, 0.844727f, 0.185059f, 0.848633f, 0.178711f, 0.853516f, 0.171997f, + 0.858887f, 0.165405f, 0.862305f, 0.159180f, 0.867676f, 0.153076f, 0.869629f, 0.147339f, + 0.873535f, 0.141602f, 0.877930f, 0.135742f, 0.881348f, 0.130005f, 0.885742f, 0.124634f, + 0.887695f, 0.119629f, 0.892090f, 0.114075f, 0.894531f, 0.108948f, 0.898438f, 0.103516f, + 0.899902f, 0.098877f, 0.903320f, 0.093567f, 0.905762f, 0.087585f, 0.908691f, 0.081299f, + 0.910156f, 0.076050f, 0.912598f, 0.070740f, 0.914551f, 0.065125f, 0.916504f, 0.057892f, + 0.916504f, 0.052368f, 0.917969f, 0.042908f, 0.916992f, 0.032013f, 0.909180f, 0.013008f, + 0.000000f, 1.000000f, 0.208984f, 0.910156f, 0.316895f, 0.830078f, 0.388916f, 0.766113f, + 0.442871f, 0.712402f, 0.485840f, 0.666992f, 0.520508f, 0.627441f, 0.547363f, 0.593262f, + 0.575195f, 0.561035f, 0.598633f, 0.532227f, 0.619141f, 0.505859f, 0.636719f, 0.482666f, + 0.654297f, 0.460449f, 0.668457f, 0.439941f, 0.684082f, 0.420898f, 0.697266f, 0.402588f, + 0.709961f, 0.385742f, 0.719727f, 0.370361f, 0.730957f, 0.355469f, 0.741211f, 0.341064f, + 0.750488f, 0.327881f, 0.760742f, 0.314697f, 0.767578f, 0.302979f, 0.776855f, 0.291260f, + 0.784180f, 0.280518f, 0.791504f, 0.270264f, 0.795898f, 0.260986f, 0.804688f, 0.250000f, + 0.812988f, 0.240234f, 0.817871f, 0.231323f, 0.823242f, 0.222900f, 0.829590f, 0.214478f, + 0.835938f, 0.205688f, 0.839844f, 0.198608f, 0.845215f, 0.191162f, 0.851074f, 0.183472f, + 0.854980f, 0.176636f, 0.859375f, 0.170044f, 0.863281f, 0.163696f, 0.868164f, 0.156982f, + 0.872070f, 0.150757f, 0.874512f, 0.145264f, 0.879395f, 0.138916f, 0.883301f, 0.133545f, + 0.886719f, 0.127808f, 0.889648f, 0.122498f, 0.893555f, 0.117065f, 0.896484f, 0.112427f, + 0.900879f, 0.106750f, 0.903320f, 0.101929f, 0.906250f, 0.096985f, 0.908691f, 0.092651f, + 0.912598f, 0.087524f, 0.915039f, 0.082886f, 0.917480f, 0.077515f, 0.917969f, 0.072449f, + 0.921875f, 0.067017f, 0.922852f, 0.061737f, 0.924805f, 0.057281f, 0.927734f, 0.051392f, + 0.927246f, 0.044800f, 0.929199f, 0.037720f, 0.928223f, 0.028305f, 0.922363f, 0.011879f, + 0.000000f, 1.000000f, 0.210205f, 0.910156f, 0.322754f, 0.827637f, 0.395996f, 0.761719f, + 0.452148f, 0.707031f, 0.495361f, 0.660156f, 0.531250f, 0.619141f, 0.561523f, 0.583008f, + 0.588867f, 0.550781f, 0.612305f, 0.520996f, 0.632812f, 0.494629f, 0.651855f, 0.469971f, + 0.668457f, 0.447510f, 0.685059f, 0.426270f, 0.698730f, 0.407227f, 0.712891f, 0.388428f, + 0.725586f, 0.371338f, 0.734863f, 0.355957f, 0.745117f, 0.341064f, 0.756348f, 0.326416f, + 0.765625f, 0.312744f, 0.775391f, 0.299805f, 0.783203f, 0.287354f, 0.792969f, 0.275879f, + 0.797852f, 0.265381f, 0.805664f, 0.254883f, 0.812988f, 0.244995f, 0.818359f, 0.235596f, + 0.826172f, 0.225708f, 0.832031f, 0.216553f, 0.838379f, 0.207764f, 0.843262f, 0.199707f, + 0.848633f, 0.191528f, 0.854492f, 0.183960f, 0.857910f, 0.176880f, 0.863770f, 0.169189f, + 0.867188f, 0.162964f, 0.871582f, 0.156372f, 0.876953f, 0.149780f, 0.880371f, 0.143433f, + 0.884766f, 0.137573f, 0.886230f, 0.132568f, 0.892090f, 0.126099f, 0.894531f, 0.120911f, + 0.898438f, 0.115662f, 0.900879f, 0.110901f, 0.904785f, 0.105591f, 0.907715f, 0.100586f, + 0.910645f, 0.096008f, 0.913086f, 0.091370f, 0.916016f, 0.087036f, 0.920410f, 0.082031f, + 0.921875f, 0.077637f, 0.922852f, 0.074280f, 0.928223f, 0.068970f, 0.928223f, 0.064087f, + 0.930176f, 0.059387f, 0.932129f, 0.054382f, 0.934570f, 0.049408f, 0.936035f, 0.044891f, + 0.936523f, 0.038910f, 0.937988f, 0.032257f, 0.936523f, 0.024109f, 0.932129f, 0.010178f, + 0.000000f, 1.000000f, 0.214600f, 0.907715f, 0.327393f, 0.825195f, 0.404297f, 0.757324f, + 0.460693f, 0.701172f, 0.506348f, 0.652832f, 0.543457f, 0.610840f, 0.575195f, 0.573242f, + 0.602051f, 0.540527f, 0.625488f, 0.510742f, 0.646484f, 0.483398f, 0.666016f, 0.458008f, + 0.681152f, 0.435791f, 0.700195f, 0.413086f, 0.713379f, 0.394043f, 0.726562f, 0.375488f, + 0.739746f, 0.357910f, 0.750488f, 0.341797f, 0.762207f, 0.326172f, 0.770996f, 0.312500f, + 0.782227f, 0.298096f, 0.790527f, 0.285400f, 0.797363f, 0.273438f, 0.805176f, 0.261719f, + 0.812988f, 0.250732f, 0.819336f, 0.240723f, 0.826660f, 0.230469f, 0.833496f, 0.221191f, + 0.837891f, 0.212280f, 0.845703f, 0.202759f, 0.851562f, 0.193970f, 0.855957f, 0.186157f, + 0.861816f, 0.178101f, 0.867676f, 0.170410f, 0.869629f, 0.163696f, 0.875977f, 0.156372f, + 0.879395f, 0.150146f, 0.884277f, 0.143433f, 0.888184f, 0.137207f, 0.891113f, 0.131470f, + 0.894531f, 0.125977f, 0.899414f, 0.120056f, 0.902344f, 0.114685f, 0.905762f, 0.109619f, + 0.908203f, 0.105042f, 0.912109f, 0.099854f, 0.915527f, 0.094604f, 0.916504f, 0.090820f, + 0.921387f, 0.086182f, 0.922852f, 0.081482f, 0.925293f, 0.077515f, 0.927734f, 0.073608f, + 0.930176f, 0.069397f, 0.933594f, 0.065125f, 0.935547f, 0.061493f, 0.938477f, 0.057404f, + 0.938965f, 0.052643f, 0.940430f, 0.047821f, 0.941895f, 0.043549f, 0.944824f, 0.038879f, + 0.945801f, 0.034454f, 0.945801f, 0.028198f, 0.945801f, 0.021210f, 0.942383f, 0.007812f, + 0.000000f, 1.000000f, 0.215454f, 0.907715f, 0.333008f, 0.822266f, 0.411133f, 0.752930f, + 0.470459f, 0.694824f, 0.516602f, 0.645508f, 0.554199f, 0.602539f, 0.587891f, 0.563965f, + 0.614746f, 0.530273f, 0.638672f, 0.499756f, 0.660156f, 0.472168f, 0.681152f, 0.446045f, + 0.696777f, 0.423096f, 0.714355f, 0.400635f, 0.728027f, 0.380615f, 0.738770f, 0.363037f, + 0.753418f, 0.344727f, 0.764648f, 0.328125f, 0.776367f, 0.312500f, 0.784180f, 0.298828f, + 0.795410f, 0.284668f, 0.803711f, 0.271729f, 0.812500f, 0.259521f, 0.819336f, 0.248291f, + 0.825684f, 0.237305f, 0.832520f, 0.227051f, 0.839844f, 0.216919f, 0.845215f, 0.208130f, + 0.851074f, 0.199219f, 0.857422f, 0.190063f, 0.863281f, 0.181641f, 0.867676f, 0.173828f, + 0.874512f, 0.165405f, 0.877441f, 0.158447f, 0.881836f, 0.151367f, 0.885742f, 0.144775f, + 0.890625f, 0.137939f, 0.893066f, 0.132446f, 0.897949f, 0.126099f, 0.900879f, 0.120605f, + 0.906250f, 0.114685f, 0.908203f, 0.109619f, 0.910645f, 0.105225f, 0.915527f, 0.099243f, + 0.916504f, 0.095093f, 0.920898f, 0.090454f, 0.924316f, 0.085571f, 0.925781f, 0.081482f, + 0.928223f, 0.077515f, 0.931641f, 0.073120f, 0.933594f, 0.069214f, 0.935547f, 0.065674f, + 0.938965f, 0.061676f, 0.940918f, 0.057983f, 0.942871f, 0.054504f, 0.945801f, 0.050690f, + 0.946777f, 0.047211f, 0.948242f, 0.042480f, 0.949219f, 0.038391f, 0.951172f, 0.034058f, + 0.952148f, 0.029922f, 0.953613f, 0.024521f, 0.953125f, 0.018356f, 0.950195f, 0.006660f, + 0.000000f, 1.000000f, 0.219482f, 0.905762f, 0.338623f, 0.819336f, 0.420166f, 0.748047f, + 0.480713f, 0.688477f, 0.527344f, 0.638184f, 0.567383f, 0.593750f, 0.599121f, 0.555664f, + 0.628418f, 0.520508f, 0.651855f, 0.489502f, 0.673828f, 0.460938f, 0.692871f, 0.434814f, + 0.711426f, 0.410889f, 0.727539f, 0.388672f, 0.741699f, 0.368408f, 0.752930f, 0.350342f, + 0.768066f, 0.331787f, 0.778320f, 0.315674f, 0.789551f, 0.299805f, 0.797363f, 0.285889f, + 0.807129f, 0.272461f, 0.815918f, 0.259277f, 0.824707f, 0.246826f, 0.832031f, 0.235474f, + 0.837891f, 0.224854f, 0.845215f, 0.214111f, 0.852051f, 0.204468f, 0.856934f, 0.195801f, + 0.862305f, 0.186646f, 0.867188f, 0.178833f, 0.873535f, 0.170288f, 0.879395f, 0.161743f, + 0.883301f, 0.154297f, 0.887695f, 0.147339f, 0.892090f, 0.140503f, 0.897461f, 0.133423f, + 0.899414f, 0.127808f, 0.904297f, 0.121887f, 0.907715f, 0.115662f, 0.910156f, 0.110596f, + 0.914062f, 0.105469f, 0.917480f, 0.099854f, 0.919922f, 0.095276f, 0.922852f, 0.090698f, + 0.926270f, 0.085815f, 0.928223f, 0.081787f, 0.931152f, 0.077393f, 0.933105f, 0.073608f, + 0.936035f, 0.069580f, 0.938965f, 0.065552f, 0.939941f, 0.062225f, 0.944336f, 0.058228f, + 0.945801f, 0.054840f, 0.946777f, 0.051666f, 0.950195f, 0.048096f, 0.952148f, 0.044830f, + 0.953125f, 0.042023f, 0.955566f, 0.037872f, 0.956055f, 0.033844f, 0.956543f, 0.030136f, + 0.958984f, 0.025681f, 0.959961f, 0.022354f, 0.958496f, 0.015495f, 0.957520f, 0.006104f, + 0.000000f, 1.000000f, 0.221680f, 0.904785f, 0.343262f, 0.816895f, 0.427979f, 0.743652f, + 0.489014f, 0.683105f, 0.538574f, 0.630859f, 0.578613f, 0.585938f, 0.612793f, 0.545410f, + 0.640137f, 0.510742f, 0.664062f, 0.479004f, 0.687500f, 0.449951f, 0.706055f, 0.424072f, + 0.724609f, 0.399414f, 0.739258f, 0.377441f, 0.754395f, 0.356445f, 0.767090f, 0.337891f, + 0.779785f, 0.320068f, 0.792480f, 0.302979f, 0.801758f, 0.287598f, 0.810547f, 0.273682f, + 0.820312f, 0.259766f, 0.828125f, 0.247681f, 0.836914f, 0.234741f, 0.843262f, 0.223633f, + 0.850586f, 0.212402f, 0.856445f, 0.202637f, 0.861328f, 0.193359f, 0.868164f, 0.183716f, + 0.873047f, 0.175659f, 0.877930f, 0.167480f, 0.882812f, 0.159790f, 0.887695f, 0.151611f, + 0.893555f, 0.144287f, 0.897949f, 0.136841f, 0.900879f, 0.130493f, 0.906250f, 0.123779f, + 0.908691f, 0.117920f, 0.911621f, 0.112488f, 0.916504f, 0.106506f, 0.918457f, 0.101440f, + 0.921875f, 0.096497f, 0.925781f, 0.091125f, 0.927734f, 0.086975f, 0.931152f, 0.082336f, + 0.933594f, 0.077942f, 0.936035f, 0.073975f, 0.937988f, 0.070068f, 0.940430f, 0.066162f, + 0.943359f, 0.062286f, 0.945312f, 0.058868f, 0.947754f, 0.055481f, 0.950195f, 0.051758f, + 0.951172f, 0.048920f, 0.953613f, 0.045898f, 0.956543f, 0.042297f, 0.957031f, 0.039734f, + 0.959961f, 0.036743f, 0.961914f, 0.033630f, 0.962402f, 0.030350f, 0.962891f, 0.026260f, + 0.964355f, 0.022385f, 0.964844f, 0.018661f, 0.965332f, 0.013443f, 0.963379f, 0.005283f, + 0.000000f, 1.000000f, 0.223877f, 0.904297f, 0.349854f, 0.813477f, 0.434814f, 0.739258f, + 0.498047f, 0.677246f, 0.548340f, 0.624023f, 0.588867f, 0.578125f, 0.624023f, 0.537109f, + 0.653320f, 0.500488f, 0.677734f, 0.468506f, 0.699707f, 0.439453f, 0.719238f, 0.412842f, + 0.737305f, 0.388184f, 0.753906f, 0.365723f, 0.767578f, 0.344971f, 0.780273f, 0.326172f, + 0.791016f, 0.308594f, 0.802734f, 0.291992f, 0.812012f, 0.276611f, 0.822754f, 0.261719f, + 0.830566f, 0.248657f, 0.838379f, 0.236084f, 0.846680f, 0.223877f, 0.854492f, 0.212402f, + 0.860352f, 0.201660f, 0.865234f, 0.192017f, 0.874023f, 0.181885f, 0.876953f, 0.173462f, + 0.883789f, 0.164673f, 0.887695f, 0.156860f, 0.891113f, 0.150146f, 0.896973f, 0.141968f, + 0.900391f, 0.135010f, 0.905762f, 0.127808f, 0.909180f, 0.121338f, 0.913574f, 0.114990f, + 0.916992f, 0.109131f, 0.920410f, 0.103577f, 0.923828f, 0.098083f, 0.927246f, 0.093140f, + 0.929688f, 0.088196f, 0.932617f, 0.083618f, 0.935547f, 0.079041f, 0.937988f, 0.074890f, + 0.940430f, 0.070740f, 0.943359f, 0.066895f, 0.945312f, 0.063049f, 0.946777f, 0.059570f, + 0.949219f, 0.056183f, 0.951172f, 0.052826f, 0.953613f, 0.049438f, 0.955566f, 0.046600f, + 0.957520f, 0.043365f, 0.958496f, 0.040771f, 0.961914f, 0.037384f, 0.962891f, 0.034882f, + 0.963867f, 0.032532f, 0.966797f, 0.029526f, 0.968262f, 0.027039f, 0.967773f, 0.023560f, + 0.969238f, 0.019897f, 0.969238f, 0.016190f, 0.970215f, 0.012489f, 0.969238f, 0.004246f, + 0.000000f, 1.000000f, 0.226807f, 0.902832f, 0.354980f, 0.811035f, 0.444092f, 0.734375f, + 0.508301f, 0.670898f, 0.559570f, 0.616699f, 0.599609f, 0.569824f, 0.634766f, 0.528320f, + 0.666016f, 0.491211f, 0.689941f, 0.458740f, 0.711426f, 0.429688f, 0.731934f, 0.402344f, + 0.749512f, 0.377686f, 0.765625f, 0.354736f, 0.779297f, 0.334473f, 0.792480f, 0.314697f, + 0.802734f, 0.297363f, 0.813477f, 0.281250f, 0.823730f, 0.265625f, 0.833496f, 0.250732f, + 0.842285f, 0.237671f, 0.850586f, 0.224976f, 0.855957f, 0.213989f, 0.863770f, 0.202026f, + 0.872070f, 0.191406f, 0.876465f, 0.181274f, 0.883301f, 0.172119f, 0.886719f, 0.163452f, + 0.892090f, 0.155273f, 0.896484f, 0.147339f, 0.900391f, 0.140137f, 0.905273f, 0.132935f, + 0.908203f, 0.126709f, 0.913574f, 0.119446f, 0.917969f, 0.112915f, 0.920898f, 0.107056f, + 0.924805f, 0.101074f, 0.927734f, 0.095703f, 0.931152f, 0.090576f, 0.934570f, 0.085388f, + 0.936523f, 0.080933f, 0.939453f, 0.076599f, 0.942383f, 0.071960f, 0.943848f, 0.068298f, + 0.947266f, 0.064209f, 0.948730f, 0.060516f, 0.950684f, 0.057098f, 0.953613f, 0.053650f, + 0.954590f, 0.050446f, 0.956543f, 0.047424f, 0.958984f, 0.044250f, 0.960938f, 0.041382f, + 0.962891f, 0.038391f, 0.963867f, 0.036011f, 0.965820f, 0.033325f, 0.967773f, 0.030518f, + 0.969238f, 0.028290f, 0.970215f, 0.026047f, 0.972656f, 0.023544f, 0.974121f, 0.020996f, + 0.973145f, 0.017822f, 0.974121f, 0.013947f, 0.975098f, 0.009872f, 0.974121f, 0.003941f, + 0.000000f, 1.000000f, 0.229126f, 0.901855f, 0.361572f, 0.807617f, 0.450928f, 0.729980f, + 0.518555f, 0.665039f, 0.570801f, 0.609375f, 0.612305f, 0.561523f, 0.646973f, 0.519531f, + 0.678223f, 0.481934f, 0.702148f, 0.449219f, 0.724121f, 0.419189f, 0.743652f, 0.392090f, + 0.760254f, 0.367432f, 0.775391f, 0.344727f, 0.790527f, 0.323975f, 0.804688f, 0.303955f, + 0.815430f, 0.286621f, 0.824707f, 0.270508f, 0.835449f, 0.255371f, 0.843262f, 0.241211f, + 0.852051f, 0.227295f, 0.859863f, 0.214844f, 0.865723f, 0.203735f, 0.871582f, 0.193115f, + 0.878906f, 0.182129f, 0.885254f, 0.172241f, 0.890625f, 0.162720f, 0.895996f, 0.154297f, + 0.900391f, 0.146118f, 0.904785f, 0.138550f, 0.909180f, 0.131348f, 0.913574f, 0.124451f, + 0.916016f, 0.118408f, 0.920898f, 0.112122f, 0.923828f, 0.105774f, 0.928223f, 0.099609f, + 0.931641f, 0.093750f, 0.933594f, 0.089050f, 0.937988f, 0.083374f, 0.939941f, 0.078735f, + 0.942383f, 0.074524f, 0.945801f, 0.069702f, 0.946289f, 0.066467f, 0.950195f, 0.061890f, + 0.951660f, 0.058624f, 0.955078f, 0.054688f, 0.956055f, 0.051697f, 0.958008f, 0.048462f, + 0.960449f, 0.045135f, 0.962402f, 0.042114f, 0.963379f, 0.039734f, 0.965820f, 0.036774f, + 0.967285f, 0.033936f, 0.968750f, 0.031799f, 0.970215f, 0.029282f, 0.971680f, 0.027344f, + 0.973633f, 0.024445f, 0.974609f, 0.022675f, 0.975586f, 0.020599f, 0.977539f, 0.018616f, + 0.979492f, 0.015884f, 0.978516f, 0.012421f, 0.978027f, 0.008774f, 0.979492f, 0.003914f, + 0.000000f, 1.000000f, 0.232178f, 0.900879f, 0.367432f, 0.804688f, 0.460205f, 0.725098f, + 0.526855f, 0.659180f, 0.581543f, 0.602051f, 0.623535f, 0.553223f, 0.658203f, 0.511230f, + 0.689453f, 0.472900f, 0.714844f, 0.439209f, 0.736328f, 0.409424f, 0.754883f, 0.382568f, + 0.773926f, 0.356934f, 0.788574f, 0.334473f, 0.800293f, 0.314209f, 0.812500f, 0.294922f, + 0.825684f, 0.276367f, 0.836426f, 0.260010f, 0.844727f, 0.245483f, 0.853027f, 0.231323f, + 0.861328f, 0.218018f, 0.869141f, 0.205444f, 0.875977f, 0.194092f, 0.881348f, 0.183594f, + 0.887207f, 0.173706f, 0.893066f, 0.163940f, 0.898438f, 0.154419f, 0.904297f, 0.145752f, + 0.908203f, 0.137817f, 0.912598f, 0.130493f, 0.916504f, 0.123413f, 0.919434f, 0.116943f, + 0.923340f, 0.110474f, 0.926270f, 0.104736f, 0.929199f, 0.099243f, 0.934082f, 0.093018f, + 0.937500f, 0.087524f, 0.939941f, 0.082397f, 0.943848f, 0.077271f, 0.945312f, 0.072815f, + 0.948242f, 0.068481f, 0.951172f, 0.064148f, 0.953613f, 0.060181f, 0.955566f, 0.056610f, + 0.957031f, 0.053436f, 0.959961f, 0.049469f, 0.961426f, 0.046600f, 0.963379f, 0.043518f, + 0.965332f, 0.040527f, 0.967285f, 0.037750f, 0.967773f, 0.035156f, 0.969238f, 0.033020f, + 0.971191f, 0.030273f, 0.972656f, 0.027939f, 0.974609f, 0.025482f, 0.975586f, 0.023697f, + 0.977051f, 0.021652f, 0.979004f, 0.019363f, 0.979980f, 0.017212f, 0.980957f, 0.015762f, + 0.981934f, 0.014084f, 0.983887f, 0.011299f, 0.982910f, 0.007217f, 0.982422f, 0.003099f, + 0.000000f, 1.000000f, 0.236328f, 0.898926f, 0.373291f, 0.801758f, 0.466797f, 0.721191f, + 0.538086f, 0.652344f, 0.590332f, 0.595703f, 0.634277f, 0.545898f, 0.670410f, 0.502441f, + 0.699707f, 0.464600f, 0.724121f, 0.430908f, 0.747070f, 0.400146f, 0.768066f, 0.372070f, + 0.783203f, 0.347412f, 0.797852f, 0.324951f, 0.812012f, 0.303955f, 0.824219f, 0.284668f, + 0.834473f, 0.267822f, 0.845703f, 0.250977f, 0.854492f, 0.235840f, 0.861328f, 0.222656f, + 0.869141f, 0.209595f, 0.876953f, 0.196899f, 0.885254f, 0.185303f, 0.889648f, 0.175049f, + 0.895020f, 0.165039f, 0.900391f, 0.156128f, 0.905762f, 0.146729f, 0.912109f, 0.137939f, + 0.915039f, 0.130249f, 0.919434f, 0.122803f, 0.922363f, 0.116150f, 0.926758f, 0.109314f, + 0.929199f, 0.103760f, 0.932617f, 0.097595f, 0.936035f, 0.092468f, 0.938477f, 0.087097f, + 0.941406f, 0.082275f, 0.945312f, 0.076782f, 0.948730f, 0.071716f, 0.951172f, 0.067261f, + 0.953125f, 0.063110f, 0.956543f, 0.058868f, 0.958008f, 0.055115f, 0.959961f, 0.051788f, + 0.961914f, 0.048309f, 0.964844f, 0.044891f, 0.966309f, 0.041840f, 0.967285f, 0.039368f, + 0.968750f, 0.036591f, 0.970703f, 0.033936f, 0.972656f, 0.031036f, 0.974609f, 0.028870f, + 0.975098f, 0.026840f, 0.977051f, 0.024567f, 0.978027f, 0.022522f, 0.979980f, 0.020142f, + 0.979980f, 0.018600f, 0.981445f, 0.016800f, 0.982422f, 0.015289f, 0.985352f, 0.013023f, + 0.985840f, 0.011269f, 0.986328f, 0.009911f, 0.985840f, 0.007294f, 0.986816f, 0.001528f, + 0.000000f, 1.000000f, 0.238525f, 0.897949f, 0.378418f, 0.799316f, 0.475342f, 0.716309f, + 0.546875f, 0.646973f, 0.601562f, 0.588379f, 0.644531f, 0.538086f, 0.681152f, 0.494141f, + 0.710938f, 0.455322f, 0.735840f, 0.421387f, 0.757324f, 0.391113f, 0.777832f, 0.363281f, + 0.793945f, 0.338623f, 0.807617f, 0.315918f, 0.821289f, 0.295410f, 0.834473f, 0.275879f, + 0.844238f, 0.258545f, 0.854004f, 0.242676f, 0.863281f, 0.227173f, 0.870605f, 0.213623f, + 0.878418f, 0.200928f, 0.885254f, 0.188843f, 0.891602f, 0.177246f, 0.898438f, 0.166626f, + 0.901855f, 0.157471f, 0.907227f, 0.148193f, 0.912109f, 0.139771f, 0.916992f, 0.131592f, + 0.921387f, 0.123474f, 0.926270f, 0.115784f, 0.929688f, 0.109314f, 0.933594f, 0.102722f, + 0.937012f, 0.096619f, 0.939453f, 0.091309f, 0.942383f, 0.085938f, 0.944824f, 0.080933f, + 0.947266f, 0.076416f, 0.948730f, 0.072327f, 0.953613f, 0.066895f, 0.955078f, 0.062927f, + 0.958008f, 0.058441f, 0.960449f, 0.054565f, 0.963379f, 0.050385f, 0.964355f, 0.047333f, + 0.966309f, 0.044037f, 0.967773f, 0.041168f, 0.970703f, 0.037689f, 0.972168f, 0.035034f, + 0.973633f, 0.032440f, 0.974609f, 0.030289f, 0.976074f, 0.027878f, 0.977539f, 0.025436f, + 0.979004f, 0.023041f, 0.980469f, 0.021194f, 0.980957f, 0.019592f, 0.982422f, 0.017700f, + 0.983887f, 0.015991f, 0.985352f, 0.013802f, 0.986328f, 0.012321f, 0.986816f, 0.011200f, + 0.988281f, 0.009804f, 0.988770f, 0.008263f, 0.991211f, 0.005661f, 0.988770f, 0.001611f, + 0.000000f, 1.000000f, 0.241333f, 0.896973f, 0.385742f, 0.795410f, 0.485596f, 0.710449f, + 0.557617f, 0.640625f, 0.610840f, 0.582031f, 0.654297f, 0.530762f, 0.691895f, 0.486084f, + 0.720703f, 0.447754f, 0.746094f, 0.413330f, 0.767578f, 0.382568f, 0.788086f, 0.354492f, + 0.803223f, 0.329834f, 0.817871f, 0.307373f, 0.830566f, 0.286377f, 0.842285f, 0.267822f, + 0.854004f, 0.249878f, 0.861816f, 0.234131f, 0.870605f, 0.219849f, 0.880371f, 0.205078f, + 0.887207f, 0.192505f, 0.892578f, 0.181152f, 0.898438f, 0.170410f, 0.904297f, 0.159790f, + 0.909668f, 0.149780f, 0.914062f, 0.140991f, 0.919922f, 0.132202f, 0.923340f, 0.124878f, + 0.927246f, 0.117859f, 0.931641f, 0.110107f, 0.935547f, 0.103210f, 0.940430f, 0.096497f, + 0.941895f, 0.090942f, 0.944824f, 0.085388f, 0.948730f, 0.079956f, 0.949707f, 0.075562f, + 0.952148f, 0.070984f, 0.954102f, 0.066833f, 0.957031f, 0.062500f, 0.958496f, 0.058807f, + 0.961914f, 0.054749f, 0.963867f, 0.050842f, 0.967285f, 0.046600f, 0.968750f, 0.043152f, + 0.970215f, 0.040070f, 0.972168f, 0.037079f, 0.973145f, 0.034576f, 0.976074f, 0.031586f, + 0.977539f, 0.028717f, 0.978516f, 0.026489f, 0.979980f, 0.024384f, 0.980469f, 0.022659f, + 0.981934f, 0.020569f, 0.983887f, 0.018402f, 0.985352f, 0.016235f, 0.985840f, 0.014786f, + 0.986816f, 0.013382f, 0.987305f, 0.012222f, 0.988281f, 0.010643f, 0.989746f, 0.009056f, + 0.991699f, 0.006828f, 0.992188f, 0.005764f, 0.992676f, 0.004990f, 0.993652f, 0.003448f, + 0.000000f, 1.000000f, 0.243042f, 0.896484f, 0.391113f, 0.792480f, 0.492676f, 0.706055f, + 0.565918f, 0.635254f, 0.621582f, 0.574707f, 0.666504f, 0.522949f, 0.702148f, 0.478271f, + 0.730469f, 0.439697f, 0.756836f, 0.404541f, 0.778320f, 0.374023f, 0.795410f, 0.346924f, + 0.812500f, 0.321533f, 0.827637f, 0.298340f, 0.840332f, 0.278320f, 0.851562f, 0.259277f, + 0.860840f, 0.242432f, 0.870605f, 0.226318f, 0.878906f, 0.211426f, 0.886230f, 0.198364f, + 0.893066f, 0.185791f, 0.899902f, 0.173584f, 0.905762f, 0.163086f, 0.910645f, 0.152954f, + 0.916504f, 0.143677f, 0.921875f, 0.134033f, 0.925781f, 0.125977f, 0.929688f, 0.118408f, + 0.933594f, 0.111023f, 0.936523f, 0.104736f, 0.939453f, 0.098572f, 0.943848f, 0.091736f, + 0.946777f, 0.085815f, 0.949707f, 0.080322f, 0.953125f, 0.074768f, 0.955566f, 0.070190f, + 0.957031f, 0.065918f, 0.958496f, 0.061981f, 0.961914f, 0.057526f, 0.963379f, 0.053833f, + 0.964844f, 0.050659f, 0.966309f, 0.047791f, 0.968262f, 0.044586f, 0.972168f, 0.040314f, + 0.974121f, 0.036652f, 0.975098f, 0.033936f, 0.976562f, 0.031250f, 0.978027f, 0.028748f, + 0.979980f, 0.026230f, 0.981445f, 0.023804f, 0.983398f, 0.021057f, 0.984375f, 0.019104f, + 0.985352f, 0.017395f, 0.986328f, 0.015854f, 0.986816f, 0.014481f, 0.988281f, 0.012825f, + 0.989746f, 0.011124f, 0.991699f, 0.008858f, 0.992188f, 0.007614f, 0.992676f, 0.006672f, + 0.993164f, 0.005848f, 0.994141f, 0.004837f, 0.995117f, 0.003674f, 0.997070f, 0.001191f, + 0.000000f, 1.000000f, 0.246826f, 0.895020f, 0.397217f, 0.789551f, 0.500000f, 0.701660f, + 0.575195f, 0.628906f, 0.631836f, 0.567871f, 0.675293f, 0.516113f, 0.711914f, 0.470947f, + 0.742188f, 0.431152f, 0.766602f, 0.396729f, 0.787109f, 0.366211f, 0.805664f, 0.338379f, + 0.821289f, 0.313477f, 0.835938f, 0.290527f, 0.847168f, 0.270752f, 0.859375f, 0.251465f, + 0.869141f, 0.234863f, 0.877441f, 0.218872f, 0.885742f, 0.204712f, 0.894531f, 0.190918f, + 0.899902f, 0.178589f, 0.905762f, 0.167358f, 0.912109f, 0.156616f, 0.917480f, 0.146362f, + 0.922852f, 0.136841f, 0.926270f, 0.128784f, 0.931152f, 0.120789f, 0.935059f, 0.112854f, + 0.938965f, 0.105469f, 0.942871f, 0.098572f, 0.945312f, 0.092285f, 0.947754f, 0.086792f, + 0.950195f, 0.081665f, 0.953125f, 0.076660f, 0.957031f, 0.070801f, 0.959961f, 0.065796f, + 0.961426f, 0.061523f, 0.963867f, 0.057251f, 0.967285f, 0.052887f, 0.968262f, 0.049133f, + 0.969238f, 0.046051f, 0.971191f, 0.043121f, 0.972168f, 0.040375f, 0.973633f, 0.037689f, + 0.975586f, 0.034943f, 0.977051f, 0.032074f, 0.979492f, 0.028976f, 0.980957f, 0.026245f, + 0.982422f, 0.023773f, 0.983887f, 0.021606f, 0.985352f, 0.019318f, 0.986816f, 0.017227f, + 0.988281f, 0.015045f, 0.990234f, 0.012520f, 0.991211f, 0.010956f, 0.991699f, 0.009674f, + 0.992188f, 0.008583f, 0.992676f, 0.007614f, 0.993652f, 0.006512f, 0.994141f, 0.005569f, + 0.995117f, 0.004410f, 0.996582f, 0.002855f, 0.999023f, 0.000214f, 0.999023f, 0.000002f, + 0.000000f, 1.000000f, 0.249512f, 0.893555f, 0.403564f, 0.786621f, 0.508301f, 0.697266f, + 0.583496f, 0.624023f, 0.641113f, 0.561523f, 0.685059f, 0.509277f, 0.720215f, 0.464600f, + 0.749512f, 0.424561f, 0.776367f, 0.389160f, 0.796387f, 0.358398f, 0.816895f, 0.330078f, + 0.832031f, 0.305176f, 0.846191f, 0.282959f, 0.854004f, 0.263916f, 0.866211f, 0.244507f, + 0.876953f, 0.227539f, 0.884277f, 0.212402f, 0.893066f, 0.197998f, 0.899902f, 0.184692f, + 0.905273f, 0.172485f, 0.912109f, 0.161255f, 0.920898f, 0.149536f, 0.920898f, 0.141113f, + 0.927246f, 0.132202f, 0.933594f, 0.122498f, 0.937012f, 0.114014f, 0.937012f, 0.108704f, + 0.942383f, 0.101929f, 0.948730f, 0.093689f, 0.952637f, 0.085876f, 0.952637f, 0.081421f, + 0.952637f, 0.077759f, 0.952637f, 0.074646f, 0.960938f, 0.067627f, 0.968262f, 0.059875f, + 0.968262f, 0.055359f, 0.968262f, 0.052246f, 0.968262f, 0.049744f, 0.968262f, 0.047577f, + 0.968262f, 0.045715f, 0.969238f, 0.043945f, 0.977051f, 0.037750f, 0.983887f, 0.030899f, + 0.983887f, 0.027618f, 0.983887f, 0.025513f, 0.983887f, 0.023895f, 0.983887f, 0.022568f, + 0.983887f, 0.021454f, 0.983887f, 0.020508f, 0.983887f, 0.019684f, 0.983887f, 0.018967f, + 0.983887f, 0.018341f, 0.983887f, 0.017807f, 0.991211f, 0.013176f, 0.999512f, 0.005295f, + 0.999512f, 0.002834f, 0.999512f, 0.001688f, 0.999512f, 0.001009f, 0.999512f, 0.000575f, + 0.999512f, 0.000294f, 0.999512f, 0.000121f, 0.999512f, 0.000028f, 0.999512f, 0.000000f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, 0.000000f, 0.993164f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.988281f, 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.981934f, 0.000000f, 0.981445f, 0.000000f, 0.979980f, + 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.974121f, 0.000000f, 0.971680f, + 0.000000f, 0.970215f, 0.000000f, 0.967285f, 0.000000f, 0.963867f, 0.000000f, 0.962402f, + 0.000000f, 0.958008f, 0.000000f, 0.955566f, 0.000000f, 0.951172f, 0.000000f, 0.947266f, + 0.000000f, 0.942871f, 0.000000f, 0.937988f, 0.000000f, 0.932617f, 0.000000f, 0.926758f, + 0.000000f, 0.919922f, 0.000000f, 0.912109f, 0.000000f, 0.903809f, 0.000000f, 0.894531f, + 0.000000f, 0.882812f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f, + 0.000000f, 0.815430f, 0.000000f, 0.789551f, 0.000000f, 0.756348f, 0.000000f, 0.714844f, + 0.000000f, 0.657715f, 0.000000f, 0.574707f, 0.000000f, 0.441650f, 0.000000f, 0.173096f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.997070f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, + 0.000000f, 0.988770f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.979492f, + 0.000000f, 0.977539f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, 0.000000f, 0.972168f, + 0.000000f, 0.969238f, 0.000000f, 0.967285f, 0.000000f, 0.964355f, 0.000000f, 0.960938f, + 0.000000f, 0.958984f, 0.000000f, 0.954590f, 0.000000f, 0.951660f, 0.000000f, 0.946777f, + 0.000000f, 0.942871f, 0.000000f, 0.937500f, 0.000000f, 0.932617f, 0.000000f, 0.926270f, + 0.000000f, 0.918945f, 0.000000f, 0.911621f, 0.000000f, 0.902832f, 0.000000f, 0.893066f, + 0.000000f, 0.882324f, 0.000000f, 0.869629f, 0.000000f, 0.854492f, 0.000000f, 0.836426f, + 0.000000f, 0.815430f, 0.000000f, 0.789062f, 0.000000f, 0.756348f, 0.000000f, 0.714844f, + 0.000000f, 0.657715f, 0.000002f, 0.574707f, 0.000001f, 0.441162f, 0.000001f, 0.172607f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984863f, + 0.000000f, 0.983887f, 0.000000f, 0.982422f, 0.000000f, 0.980469f, 0.000000f, 0.979004f, + 0.000000f, 0.977051f, 0.000000f, 0.976074f, 0.000000f, 0.973633f, 0.000000f, 0.971191f, + 0.000000f, 0.969238f, 0.000000f, 0.966797f, 0.000000f, 0.964355f, 0.000000f, 0.960938f, + 0.000000f, 0.957520f, 0.000000f, 0.955078f, 0.000000f, 0.950684f, 0.000000f, 0.946777f, + 0.000000f, 0.941895f, 0.000000f, 0.937500f, 0.000000f, 0.931641f, 0.000000f, 0.925781f, + 0.000000f, 0.918945f, 0.000000f, 0.911133f, 0.000000f, 0.902344f, 0.000000f, 0.893066f, + 0.000000f, 0.881836f, 0.000000f, 0.868652f, 0.000006f, 0.853516f, 0.000021f, 0.835449f, + 0.000025f, 0.814941f, 0.000024f, 0.788086f, 0.000022f, 0.755371f, 0.000017f, 0.713379f, + 0.000017f, 0.656738f, 0.000013f, 0.574219f, 0.000012f, 0.441406f, 0.000011f, 0.172363f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.989258f, + 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.984375f, + 0.000000f, 0.983398f, 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f, + 0.000000f, 0.977051f, 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.971191f, + 0.000000f, 0.968262f, 0.000000f, 0.965820f, 0.000000f, 0.963867f, 0.000000f, 0.960449f, + 0.000000f, 0.957031f, 0.000000f, 0.953613f, 0.000000f, 0.950195f, 0.000000f, 0.945801f, + 0.000009f, 0.941406f, 0.000026f, 0.936035f, 0.000048f, 0.931152f, 0.000073f, 0.924316f, + 0.000097f, 0.917480f, 0.000107f, 0.910645f, 0.000108f, 0.901367f, 0.000107f, 0.892090f, + 0.000100f, 0.880371f, 0.000094f, 0.867676f, 0.000084f, 0.852051f, 0.000074f, 0.834473f, + 0.000066f, 0.813965f, 0.000078f, 0.787109f, 0.000069f, 0.754395f, 0.000066f, 0.712402f, + 0.000062f, 0.655762f, 0.000056f, 0.573730f, 0.000055f, 0.440918f, 0.000051f, 0.171875f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992188f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, + 0.000000f, 0.982910f, 0.000000f, 0.980957f, 0.000000f, 0.979492f, 0.000000f, 0.978516f, + 0.000003f, 0.976074f, 0.000018f, 0.974609f, 0.000040f, 0.972656f, 0.000065f, 0.970215f, + 0.000095f, 0.967773f, 0.000124f, 0.965332f, 0.000157f, 0.962402f, 0.000191f, 0.959961f, + 0.000222f, 0.956055f, 0.000260f, 0.953125f, 0.000280f, 0.948730f, 0.000285f, 0.945312f, + 0.000286f, 0.939941f, 0.000278f, 0.935059f, 0.000265f, 0.929199f, 0.000256f, 0.923828f, + 0.000238f, 0.916504f, 0.000219f, 0.908691f, 0.000203f, 0.899902f, 0.000193f, 0.890625f, + 0.000199f, 0.878906f, 0.000218f, 0.866211f, 0.000208f, 0.851074f, 0.000190f, 0.833008f, + 0.000186f, 0.812012f, 0.000184f, 0.785156f, 0.000179f, 0.752930f, 0.000172f, 0.710938f, + 0.000172f, 0.654297f, 0.000162f, 0.572754f, 0.000171f, 0.439697f, 0.000136f, 0.171265f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991699f, + 0.000000f, 0.991211f, 0.000001f, 0.990234f, 0.000020f, 0.989746f, 0.000047f, 0.988281f, + 0.000083f, 0.986816f, 0.000118f, 0.985840f, 0.000156f, 0.984863f, 0.000199f, 0.983398f, + 0.000236f, 0.981934f, 0.000278f, 0.980957f, 0.000322f, 0.979004f, 0.000361f, 0.977051f, + 0.000398f, 0.975586f, 0.000444f, 0.973633f, 0.000485f, 0.971680f, 0.000521f, 0.969238f, + 0.000553f, 0.966797f, 0.000566f, 0.964355f, 0.000563f, 0.961426f, 0.000548f, 0.958496f, + 0.000531f, 0.955566f, 0.000514f, 0.951172f, 0.000490f, 0.947266f, 0.000461f, 0.943359f, + 0.000429f, 0.938965f, 0.000421f, 0.933105f, 0.000422f, 0.928711f, 0.000425f, 0.921875f, + 0.000435f, 0.915039f, 0.000459f, 0.907227f, 0.000445f, 0.897949f, 0.000417f, 0.888672f, + 0.000412f, 0.877441f, 0.000429f, 0.863770f, 0.000413f, 0.848145f, 0.000400f, 0.831055f, + 0.000413f, 0.809570f, 0.000418f, 0.783203f, 0.000386f, 0.750488f, 0.000401f, 0.708984f, + 0.000384f, 0.652832f, 0.000400f, 0.571777f, 0.000402f, 0.438965f, 0.000273f, 0.171997f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000026f, 0.995605f, 0.000076f, 0.995117f, 0.000120f, 0.994141f, + 0.000180f, 0.993652f, 0.000231f, 0.992676f, 0.000284f, 0.991699f, 0.000344f, 0.991211f, + 0.000395f, 0.990723f, 0.000439f, 0.989746f, 0.000499f, 0.988770f, 0.000552f, 0.987793f, + 0.000598f, 0.986328f, 0.000638f, 0.985352f, 0.000692f, 0.983398f, 0.000742f, 0.982422f, + 0.000785f, 0.981445f, 0.000823f, 0.979492f, 0.000862f, 0.978027f, 0.000911f, 0.976074f, + 0.000926f, 0.974121f, 0.000916f, 0.972656f, 0.000890f, 0.970703f, 0.000864f, 0.967773f, + 0.000838f, 0.965332f, 0.000805f, 0.962891f, 0.000776f, 0.959961f, 0.000764f, 0.957031f, + 0.000768f, 0.953613f, 0.000766f, 0.949707f, 0.000777f, 0.945801f, 0.000794f, 0.941406f, + 0.000806f, 0.937012f, 0.000798f, 0.931641f, 0.000804f, 0.925781f, 0.000805f, 0.919434f, + 0.000810f, 0.912598f, 0.000813f, 0.904785f, 0.000785f, 0.895508f, 0.000799f, 0.886230f, + 0.000808f, 0.874512f, 0.000813f, 0.861328f, 0.000775f, 0.846191f, 0.000789f, 0.828125f, + 0.000801f, 0.806641f, 0.000812f, 0.780762f, 0.000786f, 0.747559f, 0.000817f, 0.706055f, + 0.000783f, 0.649902f, 0.000838f, 0.569824f, 0.000832f, 0.438477f, 0.000481f, 0.171509f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000021f, 0.998535f, 0.000090f, 0.998047f, + 0.000177f, 0.997559f, 0.000250f, 0.997070f, 0.000344f, 0.997070f, 0.000415f, 0.996582f, + 0.000479f, 0.995605f, 0.000565f, 0.995117f, 0.000632f, 0.995117f, 0.000685f, 0.994141f, + 0.000743f, 0.993164f, 0.000816f, 0.992188f, 0.000875f, 0.991211f, 0.000922f, 0.990723f, + 0.000961f, 0.989746f, 0.001023f, 0.988770f, 0.001081f, 0.987793f, 0.001128f, 0.987305f, + 0.001166f, 0.985352f, 0.001198f, 0.984375f, 0.001249f, 0.982910f, 0.001302f, 0.981445f, + 0.001317f, 0.979980f, 0.001296f, 0.978516f, 0.001256f, 0.977051f, 0.001225f, 0.975098f, + 0.001225f, 0.972656f, 0.001233f, 0.971191f, 0.001237f, 0.968750f, 0.001248f, 0.966309f, + 0.001211f, 0.963867f, 0.001237f, 0.960938f, 0.001268f, 0.958008f, 0.001292f, 0.955078f, + 0.001320f, 0.951660f, 0.001269f, 0.947754f, 0.001301f, 0.943848f, 0.001354f, 0.938965f, + 0.001381f, 0.935059f, 0.001392f, 0.929688f, 0.001324f, 0.923340f, 0.001329f, 0.916992f, + 0.001383f, 0.909668f, 0.001422f, 0.902344f, 0.001340f, 0.893066f, 0.001359f, 0.882812f, + 0.001376f, 0.871582f, 0.001421f, 0.858398f, 0.001361f, 0.842773f, 0.001387f, 0.824707f, + 0.001410f, 0.803223f, 0.001449f, 0.777344f, 0.001432f, 0.744629f, 0.001457f, 0.703613f, + 0.001539f, 0.647461f, 0.001521f, 0.567871f, 0.001505f, 0.437256f, 0.000751f, 0.171509f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000033f, 0.999023f, 0.000168f, 0.999023f, + 0.000345f, 0.998535f, 0.000432f, 0.998535f, 0.000581f, 0.998047f, 0.000674f, 0.997559f, + 0.000732f, 0.997070f, 0.000844f, 0.996582f, 0.000932f, 0.996582f, 0.000991f, 0.996094f, + 0.001032f, 0.995117f, 0.001120f, 0.995117f, 0.001198f, 0.994629f, 0.001252f, 0.993652f, + 0.001290f, 0.992676f, 0.001320f, 0.991699f, 0.001404f, 0.991211f, 0.001468f, 0.989258f, + 0.001512f, 0.988770f, 0.001544f, 0.988281f, 0.001569f, 0.986816f, 0.001620f, 0.985352f, + 0.001697f, 0.984863f, 0.001737f, 0.983398f, 0.001743f, 0.981934f, 0.001749f, 0.980469f, + 0.001726f, 0.978516f, 0.001767f, 0.977051f, 0.001804f, 0.975098f, 0.001835f, 0.973633f, + 0.001862f, 0.972168f, 0.001804f, 0.969238f, 0.001812f, 0.966797f, 0.001865f, 0.964844f, + 0.001929f, 0.961914f, 0.001898f, 0.959473f, 0.001972f, 0.956055f, 0.002037f, 0.953125f, + 0.002056f, 0.949707f, 0.002104f, 0.945801f, 0.002031f, 0.941406f, 0.002075f, 0.937012f, + 0.002115f, 0.931641f, 0.002157f, 0.926758f, 0.002066f, 0.920410f, 0.002131f, 0.913574f, + 0.002180f, 0.907227f, 0.002230f, 0.898438f, 0.002258f, 0.889648f, 0.002159f, 0.879395f, + 0.002251f, 0.867676f, 0.002285f, 0.854492f, 0.002348f, 0.838867f, 0.002274f, 0.821289f, + 0.002338f, 0.799316f, 0.002428f, 0.773438f, 0.002401f, 0.741699f, 0.002459f, 0.699707f, + 0.002590f, 0.644531f, 0.002565f, 0.564941f, 0.002457f, 0.436035f, 0.001085f, 0.171509f, + 0.000000f, 1.000000f, 0.000326f, 0.999512f, 0.000606f, 0.999023f, 0.000679f, 0.999023f, + 0.000867f, 0.998535f, 0.000974f, 0.998047f, 0.001014f, 0.998047f, 0.001128f, 0.997070f, + 0.001255f, 0.997070f, 0.001306f, 0.996582f, 0.001332f, 0.996094f, 0.001404f, 0.995117f, + 0.001533f, 0.994629f, 0.001585f, 0.994141f, 0.001615f, 0.993164f, 0.001633f, 0.992676f, + 0.001713f, 0.992188f, 0.001810f, 0.991211f, 0.001877f, 0.990234f, 0.001957f, 0.989258f, + 0.002033f, 0.987793f, 0.002115f, 0.986816f, 0.002268f, 0.985840f, 0.002331f, 0.984375f, + 0.002363f, 0.982910f, 0.002380f, 0.981934f, 0.002356f, 0.980957f, 0.002365f, 0.979492f, + 0.002472f, 0.977539f, 0.002438f, 0.975586f, 0.002480f, 0.973633f, 0.002535f, 0.971680f, + 0.002594f, 0.969727f, 0.002539f, 0.967773f, 0.002703f, 0.965332f, 0.002815f, 0.962402f, + 0.002903f, 0.960449f, 0.002934f, 0.957031f, 0.002836f, 0.954102f, 0.002890f, 0.950684f, + 0.002998f, 0.946777f, 0.003069f, 0.942871f, 0.002993f, 0.938477f, 0.003071f, 0.934082f, + 0.003115f, 0.929199f, 0.003164f, 0.923340f, 0.003290f, 0.917480f, 0.003218f, 0.910156f, + 0.003286f, 0.903320f, 0.003365f, 0.895020f, 0.003380f, 0.886230f, 0.003332f, 0.875488f, + 0.003494f, 0.863770f, 0.003576f, 0.850098f, 0.003597f, 0.834961f, 0.003561f, 0.816895f, + 0.003735f, 0.795410f, 0.003809f, 0.769531f, 0.003807f, 0.736816f, 0.003897f, 0.696289f, + 0.004066f, 0.641602f, 0.004017f, 0.562500f, 0.003731f, 0.434814f, 0.001482f, 0.172119f, + 0.000000f, 1.000000f, 0.000448f, 0.999512f, 0.000846f, 0.999023f, 0.000846f, 0.999023f, + 0.001189f, 0.998047f, 0.001211f, 0.998047f, 0.001214f, 0.997559f, 0.001500f, 0.996582f, + 0.001541f, 0.996582f, 0.001554f, 0.995605f, 0.001558f, 0.995117f, 0.001799f, 0.994629f, + 0.001853f, 0.994141f, 0.001926f, 0.993164f, 0.002012f, 0.992676f, 0.002098f, 0.992188f, + 0.002409f, 0.991211f, 0.002525f, 0.990234f, 0.002636f, 0.989258f, 0.002729f, 0.988281f, + 0.002769f, 0.986816f, 0.002920f, 0.985840f, 0.003025f, 0.984375f, 0.003069f, 0.982910f, + 0.003019f, 0.981445f, 0.003075f, 0.980469f, 0.003147f, 0.979004f, 0.003260f, 0.977539f, + 0.003376f, 0.976074f, 0.003471f, 0.973633f, 0.003443f, 0.972168f, 0.003523f, 0.969727f, + 0.003605f, 0.967773f, 0.003799f, 0.965332f, 0.003809f, 0.962891f, 0.003918f, 0.959961f, + 0.003990f, 0.957520f, 0.004040f, 0.954590f, 0.003922f, 0.951172f, 0.004013f, 0.947754f, + 0.004292f, 0.943848f, 0.004372f, 0.939453f, 0.004467f, 0.935547f, 0.004387f, 0.931152f, + 0.004406f, 0.925781f, 0.004528f, 0.919922f, 0.004787f, 0.913574f, 0.004635f, 0.906738f, + 0.004753f, 0.898926f, 0.004871f, 0.891113f, 0.005024f, 0.881348f, 0.004959f, 0.871094f, + 0.005142f, 0.858887f, 0.005264f, 0.845703f, 0.005363f, 0.830078f, 0.005356f, 0.812012f, + 0.005600f, 0.790039f, 0.005707f, 0.763672f, 0.005745f, 0.731934f, 0.005917f, 0.691895f, + 0.006096f, 0.637695f, 0.005943f, 0.560059f, 0.005348f, 0.432861f, 0.001945f, 0.172241f, + 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.000919f, 0.999023f, 0.000911f, 0.998535f, + 0.001319f, 0.998047f, 0.001321f, 0.997559f, 0.001315f, 0.997070f, 0.001681f, 0.996582f, + 0.001736f, 0.995605f, 0.001840f, 0.995117f, 0.001937f, 0.994629f, 0.002386f, 0.994141f, + 0.002514f, 0.993164f, 0.002598f, 0.992188f, 0.002716f, 0.991699f, 0.002808f, 0.990723f, + 0.003187f, 0.990234f, 0.003286f, 0.989258f, 0.003387f, 0.987793f, 0.003479f, 0.986816f, + 0.003534f, 0.986328f, 0.003813f, 0.984375f, 0.003986f, 0.982910f, 0.004002f, 0.981445f, + 0.004108f, 0.979980f, 0.004066f, 0.978516f, 0.004135f, 0.977539f, 0.004498f, 0.975586f, + 0.004513f, 0.973633f, 0.004650f, 0.971680f, 0.004791f, 0.969727f, 0.004761f, 0.967285f, + 0.004883f, 0.964844f, 0.005177f, 0.962891f, 0.005322f, 0.959961f, 0.005276f, 0.957520f, + 0.005344f, 0.954102f, 0.005501f, 0.951660f, 0.005692f, 0.948242f, 0.005737f, 0.944336f, + 0.005913f, 0.940430f, 0.005962f, 0.935547f, 0.006123f, 0.931641f, 0.006100f, 0.926758f, + 0.006302f, 0.921387f, 0.006462f, 0.916016f, 0.006653f, 0.909180f, 0.006672f, 0.902344f, + 0.006710f, 0.894043f, 0.006927f, 0.885742f, 0.007126f, 0.876953f, 0.007107f, 0.866211f, + 0.007381f, 0.853516f, 0.007553f, 0.839844f, 0.007690f, 0.824707f, 0.007744f, 0.806641f, + 0.008064f, 0.784668f, 0.008255f, 0.759277f, 0.008331f, 0.727051f, 0.008553f, 0.686523f, + 0.008720f, 0.633301f, 0.008400f, 0.557129f, 0.007336f, 0.431152f, 0.002468f, 0.171631f, + 0.000000f, 1.000000f, 0.000484f, 0.999512f, 0.000948f, 0.998535f, 0.000941f, 0.998535f, + 0.001380f, 0.997559f, 0.001490f, 0.997070f, 0.001662f, 0.997070f, 0.002186f, 0.995605f, + 0.002361f, 0.995117f, 0.002472f, 0.994629f, 0.002554f, 0.994141f, 0.003077f, 0.993164f, + 0.003181f, 0.992188f, 0.003248f, 0.991699f, 0.003347f, 0.990723f, 0.003517f, 0.989746f, + 0.004032f, 0.988770f, 0.004196f, 0.987305f, 0.004333f, 0.986816f, 0.004528f, 0.985352f, + 0.004707f, 0.984863f, 0.005169f, 0.983398f, 0.005051f, 0.981445f, 0.005215f, 0.979492f, + 0.005272f, 0.978516f, 0.005455f, 0.976562f, 0.005444f, 0.975098f, 0.005920f, 0.972656f, + 0.006084f, 0.971191f, 0.006104f, 0.968750f, 0.006344f, 0.967285f, 0.006546f, 0.964844f, + 0.006474f, 0.962402f, 0.006859f, 0.959473f, 0.007065f, 0.957031f, 0.007252f, 0.954102f, + 0.007290f, 0.951172f, 0.007435f, 0.948242f, 0.007648f, 0.944336f, 0.007698f, 0.940430f, + 0.007927f, 0.936035f, 0.008286f, 0.932129f, 0.008354f, 0.927246f, 0.008583f, 0.922363f, + 0.008568f, 0.916992f, 0.008904f, 0.910645f, 0.009140f, 0.904297f, 0.009460f, 0.896973f, + 0.009415f, 0.889160f, 0.009567f, 0.880371f, 0.009941f, 0.871582f, 0.010284f, 0.859863f, + 0.010338f, 0.847656f, 0.010643f, 0.834473f, 0.010971f, 0.818848f, 0.011017f, 0.799805f, + 0.011360f, 0.778320f, 0.011566f, 0.752441f, 0.011681f, 0.721680f, 0.012024f, 0.681641f, + 0.012032f, 0.627930f, 0.011436f, 0.553711f, 0.009796f, 0.429932f, 0.003063f, 0.171631f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000536f, 0.999023f, 0.001241f, 0.998535f, + 0.001919f, 0.997559f, 0.002066f, 0.997070f, 0.002249f, 0.996094f, 0.002773f, 0.995117f, + 0.002897f, 0.995117f, 0.003038f, 0.993652f, 0.003145f, 0.993164f, 0.003710f, 0.992188f, + 0.003944f, 0.991211f, 0.004177f, 0.990234f, 0.004353f, 0.989746f, 0.004490f, 0.988281f, + 0.005058f, 0.987305f, 0.005283f, 0.985840f, 0.005486f, 0.984863f, 0.005726f, 0.983887f, + 0.005947f, 0.982422f, 0.006504f, 0.980957f, 0.006786f, 0.979492f, 0.006882f, 0.978027f, + 0.006939f, 0.976074f, 0.006973f, 0.974121f, 0.007202f, 0.972656f, 0.007584f, 0.970215f, + 0.007896f, 0.968262f, 0.008217f, 0.966309f, 0.008278f, 0.964355f, 0.008560f, 0.961914f, + 0.008827f, 0.959961f, 0.009064f, 0.956055f, 0.009338f, 0.953125f, 0.009682f, 0.950195f, + 0.009605f, 0.946777f, 0.009979f, 0.943848f, 0.010170f, 0.940430f, 0.010704f, 0.936035f, + 0.010712f, 0.931641f, 0.011086f, 0.927246f, 0.011314f, 0.922363f, 0.011543f, 0.916992f, + 0.011566f, 0.911621f, 0.012276f, 0.905273f, 0.012535f, 0.898438f, 0.012772f, 0.891113f, + 0.013008f, 0.883301f, 0.013107f, 0.874512f, 0.013748f, 0.864746f, 0.014168f, 0.853516f, + 0.014252f, 0.841309f, 0.014610f, 0.827637f, 0.015007f, 0.812012f, 0.015266f, 0.793457f, + 0.015625f, 0.771484f, 0.016022f, 0.746582f, 0.016068f, 0.715332f, 0.016403f, 0.676270f, + 0.016129f, 0.623047f, 0.015282f, 0.549316f, 0.012604f, 0.427490f, 0.003716f, 0.171753f, + 0.000000f, 1.000000f, 0.000288f, 0.999512f, 0.001102f, 0.998535f, 0.001709f, 0.998047f, + 0.001948f, 0.997559f, 0.002539f, 0.996582f, 0.002581f, 0.995605f, 0.002890f, 0.995117f, + 0.003614f, 0.993652f, 0.003788f, 0.993164f, 0.003986f, 0.992188f, 0.004730f, 0.991211f, + 0.004944f, 0.990234f, 0.005127f, 0.989258f, 0.005333f, 0.988281f, 0.005642f, 0.987305f, + 0.006416f, 0.985352f, 0.006668f, 0.984375f, 0.006882f, 0.982910f, 0.007092f, 0.981934f, + 0.007473f, 0.980469f, 0.008240f, 0.978516f, 0.008575f, 0.977539f, 0.008842f, 0.975586f, + 0.008911f, 0.974121f, 0.009033f, 0.971680f, 0.009590f, 0.969727f, 0.009995f, 0.966797f, + 0.010078f, 0.965332f, 0.010414f, 0.962402f, 0.010857f, 0.960938f, 0.010994f, 0.958008f, + 0.011803f, 0.955566f, 0.012283f, 0.953125f, 0.012177f, 0.948730f, 0.012512f, 0.945801f, + 0.012978f, 0.942871f, 0.013008f, 0.938965f, 0.013618f, 0.935547f, 0.014084f, 0.931152f, + 0.014565f, 0.926270f, 0.014694f, 0.921387f, 0.015221f, 0.916992f, 0.015495f, 0.912109f, + 0.015930f, 0.906250f, 0.016449f, 0.898926f, 0.016724f, 0.892090f, 0.017242f, 0.884766f, + 0.017517f, 0.876465f, 0.017975f, 0.868164f, 0.018616f, 0.857422f, 0.019424f, 0.847168f, + 0.019226f, 0.833496f, 0.019821f, 0.819824f, 0.020325f, 0.804688f, 0.021072f, 0.786133f, + 0.021332f, 0.764160f, 0.021835f, 0.739258f, 0.021790f, 0.708984f, 0.021942f, 0.669434f, + 0.021606f, 0.618652f, 0.020065f, 0.545898f, 0.016052f, 0.425293f, 0.004490f, 0.171631f, + 0.000000f, 1.000000f, 0.000446f, 0.999512f, 0.000862f, 0.999023f, 0.001550f, 0.998047f, + 0.002325f, 0.996582f, 0.003046f, 0.996094f, 0.003458f, 0.995117f, 0.003769f, 0.994141f, + 0.004398f, 0.993164f, 0.004520f, 0.992188f, 0.005066f, 0.991211f, 0.005371f, 0.989746f, + 0.006062f, 0.988770f, 0.006344f, 0.987793f, 0.006741f, 0.986328f, 0.007118f, 0.985352f, + 0.007866f, 0.983398f, 0.008179f, 0.981934f, 0.008545f, 0.980957f, 0.008957f, 0.979492f, + 0.009407f, 0.978027f, 0.010155f, 0.976074f, 0.010597f, 0.974609f, 0.011009f, 0.972656f, + 0.011414f, 0.971191f, 0.011948f, 0.968750f, 0.012283f, 0.966309f, 0.012512f, 0.963379f, + 0.013039f, 0.961426f, 0.013199f, 0.958984f, 0.013664f, 0.956543f, 0.014351f, 0.954102f, + 0.014992f, 0.950684f, 0.015579f, 0.947754f, 0.015945f, 0.944824f, 0.016144f, 0.941406f, + 0.016571f, 0.937500f, 0.017303f, 0.934082f, 0.017868f, 0.929688f, 0.018448f, 0.925293f, + 0.018921f, 0.920898f, 0.019226f, 0.915527f, 0.019669f, 0.910645f, 0.020538f, 0.905762f, + 0.021179f, 0.898926f, 0.021774f, 0.892090f, 0.022369f, 0.885254f, 0.022797f, 0.876953f, + 0.023514f, 0.869629f, 0.023956f, 0.860352f, 0.024673f, 0.849121f, 0.025650f, 0.838867f, + 0.025833f, 0.825684f, 0.026703f, 0.812500f, 0.027405f, 0.797363f, 0.027893f, 0.777832f, + 0.028412f, 0.756348f, 0.028931f, 0.731445f, 0.028992f, 0.701660f, 0.029083f, 0.662598f, + 0.028183f, 0.612305f, 0.025726f, 0.541992f, 0.020248f, 0.422852f, 0.005386f, 0.170776f, + 0.000000f, 1.000000f, 0.000475f, 0.999512f, 0.001075f, 0.998535f, 0.001766f, 0.998047f, + 0.002970f, 0.996582f, 0.003218f, 0.995605f, 0.004227f, 0.994141f, 0.004513f, 0.993164f, + 0.004906f, 0.992188f, 0.005661f, 0.991211f, 0.006229f, 0.989746f, 0.006573f, 0.988770f, + 0.007462f, 0.986816f, 0.007774f, 0.986328f, 0.008362f, 0.984375f, 0.008781f, 0.982910f, + 0.009712f, 0.981445f, 0.010094f, 0.979980f, 0.010437f, 0.978516f, 0.011124f, 0.976562f, + 0.011696f, 0.974609f, 0.012619f, 0.972656f, 0.013031f, 0.971191f, 0.013542f, 0.969238f, + 0.014267f, 0.967285f, 0.014839f, 0.965332f, 0.015839f, 0.962891f, 0.015930f, 0.959961f, + 0.016495f, 0.957520f, 0.016785f, 0.954590f, 0.017273f, 0.952148f, 0.017990f, 0.949219f, + 0.019150f, 0.945801f, 0.019592f, 0.942383f, 0.020325f, 0.939453f, 0.020813f, 0.936035f, + 0.021103f, 0.932129f, 0.021927f, 0.927734f, 0.022690f, 0.923340f, 0.023621f, 0.918945f, + 0.024399f, 0.914062f, 0.024979f, 0.909180f, 0.025269f, 0.903809f, 0.026291f, 0.897949f, + 0.027725f, 0.891602f, 0.027832f, 0.884277f, 0.028778f, 0.876953f, 0.029572f, 0.869141f, + 0.030411f, 0.861328f, 0.031143f, 0.851562f, 0.032379f, 0.840820f, 0.033051f, 0.829590f, + 0.034546f, 0.817871f, 0.034546f, 0.803223f, 0.035492f, 0.787598f, 0.036530f, 0.769043f, + 0.036896f, 0.747559f, 0.037354f, 0.723145f, 0.037445f, 0.693848f, 0.037262f, 0.655273f, + 0.035919f, 0.605957f, 0.032410f, 0.537598f, 0.025040f, 0.420166f, 0.006405f, 0.169922f, + 0.000000f, 1.000000f, 0.000810f, 0.999512f, 0.001663f, 0.998535f, 0.002178f, 0.997070f, + 0.003160f, 0.996094f, 0.003994f, 0.995117f, 0.004765f, 0.993652f, 0.005657f, 0.992188f, + 0.005947f, 0.991211f, 0.007175f, 0.989746f, 0.007793f, 0.987793f, 0.008133f, 0.987305f, + 0.008522f, 0.985352f, 0.009468f, 0.984375f, 0.010422f, 0.981934f, 0.010834f, 0.980957f, + 0.011375f, 0.979004f, 0.012360f, 0.977539f, 0.013077f, 0.975098f, 0.013786f, 0.973145f, + 0.014420f, 0.971191f, 0.015457f, 0.969238f, 0.016006f, 0.967285f, 0.016632f, 0.965332f, + 0.017654f, 0.962891f, 0.018356f, 0.960449f, 0.019516f, 0.958008f, 0.020264f, 0.955566f, + 0.020676f, 0.952637f, 0.021103f, 0.950195f, 0.021927f, 0.946289f, 0.022476f, 0.942871f, + 0.023788f, 0.939941f, 0.024689f, 0.936523f, 0.025269f, 0.932617f, 0.026245f, 0.929688f, + 0.027145f, 0.925293f, 0.027786f, 0.920898f, 0.029022f, 0.916016f, 0.029602f, 0.911133f, + 0.030792f, 0.906738f, 0.031738f, 0.901855f, 0.032379f, 0.895996f, 0.033386f, 0.889160f, + 0.035004f, 0.882812f, 0.035614f, 0.875488f, 0.036652f, 0.868164f, 0.037872f, 0.860352f, + 0.038635f, 0.851562f, 0.039917f, 0.842285f, 0.041046f, 0.831055f, 0.042206f, 0.819824f, + 0.043549f, 0.807617f, 0.043823f, 0.793945f, 0.045197f, 0.777832f, 0.046478f, 0.759277f, + 0.046997f, 0.738770f, 0.047516f, 0.714844f, 0.047272f, 0.685547f, 0.046875f, 0.647949f, + 0.044891f, 0.600098f, 0.040253f, 0.532715f, 0.030396f, 0.418213f, 0.007557f, 0.169556f, + 0.000000f, 1.000000f, 0.001188f, 0.999023f, 0.002018f, 0.998047f, 0.002728f, 0.997070f, + 0.003435f, 0.996094f, 0.004341f, 0.994629f, 0.005997f, 0.992676f, 0.006424f, 0.991699f, + 0.007351f, 0.989746f, 0.008430f, 0.988281f, 0.009476f, 0.986328f, 0.010025f, 0.984863f, + 0.010468f, 0.983398f, 0.012100f, 0.981445f, 0.012764f, 0.979492f, 0.013359f, 0.978027f, + 0.013947f, 0.976074f, 0.015038f, 0.974121f, 0.016205f, 0.971680f, 0.016998f, 0.969238f, + 0.017731f, 0.967773f, 0.018860f, 0.965332f, 0.019608f, 0.962891f, 0.020798f, 0.960938f, + 0.021729f, 0.958008f, 0.022629f, 0.955566f, 0.023453f, 0.953125f, 0.024811f, 0.950195f, + 0.025650f, 0.947266f, 0.026718f, 0.944336f, 0.027481f, 0.940430f, 0.028198f, 0.936523f, + 0.029358f, 0.933105f, 0.030426f, 0.929688f, 0.031189f, 0.925781f, 0.032440f, 0.921875f, + 0.034058f, 0.917480f, 0.035034f, 0.913086f, 0.036224f, 0.907715f, 0.037323f, 0.902832f, + 0.038116f, 0.897461f, 0.039551f, 0.892578f, 0.040955f, 0.886230f, 0.042114f, 0.879883f, + 0.043701f, 0.873047f, 0.045258f, 0.866211f, 0.045715f, 0.858398f, 0.047424f, 0.850586f, + 0.048584f, 0.841797f, 0.050507f, 0.831543f, 0.051636f, 0.820801f, 0.052887f, 0.809570f, + 0.054169f, 0.796875f, 0.054565f, 0.783203f, 0.057098f, 0.767578f, 0.058075f, 0.749512f, + 0.058228f, 0.728516f, 0.058594f, 0.705078f, 0.058472f, 0.676270f, 0.057526f, 0.639648f, + 0.054688f, 0.593262f, 0.048767f, 0.528320f, 0.036438f, 0.414551f, 0.008743f, 0.169189f, + 0.000000f, 1.000000f, 0.001243f, 0.999023f, 0.002176f, 0.998047f, 0.003443f, 0.996582f, + 0.004551f, 0.995117f, 0.005215f, 0.993652f, 0.006969f, 0.992188f, 0.007889f, 0.990234f, + 0.008766f, 0.988770f, 0.010063f, 0.986328f, 0.011078f, 0.984375f, 0.012253f, 0.982910f, + 0.013084f, 0.980957f, 0.014412f, 0.978516f, 0.015640f, 0.976562f, 0.016357f, 0.974609f, + 0.017090f, 0.972656f, 0.018646f, 0.970215f, 0.019958f, 0.967285f, 0.020889f, 0.965332f, + 0.021698f, 0.962891f, 0.022583f, 0.960449f, 0.024109f, 0.958008f, 0.025620f, 0.954590f, + 0.026688f, 0.951660f, 0.027710f, 0.949219f, 0.028763f, 0.946777f, 0.030243f, 0.943359f, + 0.031555f, 0.940430f, 0.033203f, 0.937012f, 0.034119f, 0.933594f, 0.035004f, 0.929199f, + 0.036377f, 0.925293f, 0.037292f, 0.921387f, 0.038788f, 0.917480f, 0.040314f, 0.913086f, + 0.041870f, 0.908203f, 0.043457f, 0.903809f, 0.045105f, 0.898926f, 0.046112f, 0.893555f, + 0.047058f, 0.888184f, 0.049011f, 0.881836f, 0.050690f, 0.875977f, 0.052032f, 0.869629f, + 0.053558f, 0.862305f, 0.055359f, 0.854980f, 0.056946f, 0.848145f, 0.058167f, 0.839355f, + 0.060425f, 0.829590f, 0.062256f, 0.819824f, 0.063782f, 0.809570f, 0.065002f, 0.797852f, + 0.066345f, 0.785645f, 0.068237f, 0.771973f, 0.069458f, 0.755371f, 0.070862f, 0.738281f, + 0.071411f, 0.718262f, 0.071350f, 0.695312f, 0.071289f, 0.666992f, 0.069702f, 0.631348f, + 0.065674f, 0.585938f, 0.058075f, 0.522461f, 0.042969f, 0.412109f, 0.010139f, 0.168335f, + 0.000000f, 1.000000f, 0.001281f, 0.999023f, 0.002378f, 0.998047f, 0.004543f, 0.995605f, + 0.005272f, 0.994629f, 0.006863f, 0.992188f, 0.007767f, 0.990723f, 0.008728f, 0.989258f, + 0.011147f, 0.986328f, 0.011955f, 0.984375f, 0.013680f, 0.981934f, 0.014473f, 0.980469f, + 0.016312f, 0.977539f, 0.017792f, 0.975098f, 0.018646f, 0.972656f, 0.020065f, 0.970703f, + 0.021378f, 0.968262f, 0.022583f, 0.965332f, 0.024460f, 0.962402f, 0.025589f, 0.959961f, + 0.026550f, 0.957520f, 0.028015f, 0.955078f, 0.029785f, 0.951660f, 0.031433f, 0.948242f, + 0.032684f, 0.944824f, 0.033905f, 0.942383f, 0.035126f, 0.939453f, 0.037231f, 0.936035f, + 0.039124f, 0.932129f, 0.040619f, 0.928223f, 0.042084f, 0.924805f, 0.043213f, 0.921387f, + 0.044739f, 0.916992f, 0.046173f, 0.912598f, 0.047668f, 0.907715f, 0.049805f, 0.902832f, + 0.051178f, 0.897949f, 0.053009f, 0.893066f, 0.054901f, 0.888184f, 0.056427f, 0.883301f, + 0.058411f, 0.876953f, 0.060242f, 0.870605f, 0.062134f, 0.864258f, 0.064392f, 0.857422f, + 0.065735f, 0.850586f, 0.067444f, 0.843262f, 0.069702f, 0.835449f, 0.071228f, 0.826172f, + 0.073730f, 0.817383f, 0.075745f, 0.807617f, 0.077148f, 0.796875f, 0.078979f, 0.786133f, + 0.080261f, 0.773438f, 0.082642f, 0.759277f, 0.083801f, 0.743164f, 0.085144f, 0.726562f, + 0.085022f, 0.707031f, 0.085144f, 0.685059f, 0.084473f, 0.656250f, 0.082336f, 0.622070f, + 0.077576f, 0.578613f, 0.068237f, 0.516113f, 0.049774f, 0.409424f, 0.011513f, 0.166992f, + 0.000000f, 1.000000f, 0.001935f, 0.998535f, 0.003147f, 0.997559f, 0.005421f, 0.995117f, + 0.006699f, 0.993652f, 0.008888f, 0.990723f, 0.009850f, 0.989258f, 0.011070f, 0.987305f, + 0.012955f, 0.984375f, 0.015015f, 0.981934f, 0.016357f, 0.979492f, 0.018280f, 0.976562f, + 0.019836f, 0.973633f, 0.021439f, 0.971191f, 0.022964f, 0.968262f, 0.024841f, 0.965820f, + 0.026581f, 0.962891f, 0.027924f, 0.959473f, 0.029587f, 0.956543f, 0.031311f, 0.953613f, + 0.032776f, 0.951172f, 0.034698f, 0.947266f, 0.036194f, 0.943848f, 0.038544f, 0.940430f, + 0.039978f, 0.937500f, 0.041412f, 0.934082f, 0.043518f, 0.930664f, 0.045776f, 0.926270f, + 0.047852f, 0.922363f, 0.049561f, 0.918945f, 0.051270f, 0.915039f, 0.052979f, 0.911133f, + 0.055023f, 0.906738f, 0.057007f, 0.901367f, 0.059021f, 0.895996f, 0.060638f, 0.891113f, + 0.062683f, 0.886230f, 0.064331f, 0.881348f, 0.066833f, 0.876465f, 0.069153f, 0.870605f, + 0.071594f, 0.864258f, 0.073364f, 0.857422f, 0.075134f, 0.851074f, 0.078003f, 0.844727f, + 0.079773f, 0.837891f, 0.081787f, 0.830566f, 0.083984f, 0.821289f, 0.087280f, 0.812988f, + 0.088318f, 0.803223f, 0.091064f, 0.793457f, 0.092896f, 0.783691f, 0.094116f, 0.772461f, + 0.096375f, 0.759766f, 0.098450f, 0.745605f, 0.099182f, 0.729980f, 0.100830f, 0.714355f, + 0.100647f, 0.695312f, 0.100586f, 0.673340f, 0.100037f, 0.645996f, 0.096619f, 0.613281f, + 0.089966f, 0.571289f, 0.078857f, 0.510254f, 0.057251f, 0.405762f, 0.013077f, 0.166992f, + 0.000000f, 1.000000f, 0.001826f, 0.998535f, 0.003975f, 0.997070f, 0.006042f, 0.994629f, + 0.008217f, 0.992188f, 0.010422f, 0.989746f, 0.012428f, 0.987305f, 0.014282f, 0.984375f, + 0.016586f, 0.980957f, 0.017685f, 0.979004f, 0.019562f, 0.976074f, 0.022491f, 0.972168f, + 0.024750f, 0.968750f, 0.026108f, 0.966309f, 0.028549f, 0.962891f, 0.030518f, 0.959473f, + 0.033020f, 0.956055f, 0.034546f, 0.952637f, 0.036438f, 0.949707f, 0.038910f, 0.946289f, + 0.041168f, 0.941895f, 0.042938f, 0.938477f, 0.045044f, 0.935059f, 0.047211f, 0.931641f, + 0.048889f, 0.928223f, 0.051270f, 0.923828f, 0.053650f, 0.919922f, 0.056091f, 0.915527f, + 0.058472f, 0.911133f, 0.060394f, 0.907227f, 0.062347f, 0.903809f, 0.064819f, 0.898926f, + 0.067932f, 0.893555f, 0.069824f, 0.888672f, 0.072083f, 0.883301f, 0.073975f, 0.877930f, + 0.075867f, 0.873047f, 0.078125f, 0.868164f, 0.081421f, 0.861816f, 0.084106f, 0.855957f, + 0.086670f, 0.849609f, 0.088623f, 0.843262f, 0.090515f, 0.836426f, 0.093262f, 0.829590f, + 0.095703f, 0.822754f, 0.098572f, 0.814453f, 0.100952f, 0.805664f, 0.103760f, 0.797363f, + 0.105103f, 0.788086f, 0.108276f, 0.778809f, 0.110046f, 0.769043f, 0.112244f, 0.757324f, + 0.114197f, 0.744629f, 0.115601f, 0.730957f, 0.117188f, 0.716797f, 0.117920f, 0.700684f, + 0.117981f, 0.683594f, 0.117432f, 0.660645f, 0.115784f, 0.634766f, 0.111145f, 0.603516f, + 0.103088f, 0.563965f, 0.090149f, 0.503418f, 0.065125f, 0.402832f, 0.014748f, 0.165771f, + 0.000000f, 1.000000f, 0.002945f, 0.998047f, 0.005276f, 0.995605f, 0.008133f, 0.993164f, + 0.010643f, 0.990234f, 0.013069f, 0.987305f, 0.015381f, 0.984375f, 0.018494f, 0.980469f, + 0.020065f, 0.978027f, 0.022415f, 0.975098f, 0.025131f, 0.970703f, 0.027893f, 0.967285f, + 0.030487f, 0.963379f, 0.032684f, 0.960449f, 0.035889f, 0.956055f, 0.038727f, 0.951660f, + 0.040588f, 0.948242f, 0.042786f, 0.944824f, 0.045593f, 0.940918f, 0.048126f, 0.936523f, + 0.051117f, 0.932129f, 0.053101f, 0.928223f, 0.055481f, 0.924805f, 0.058197f, 0.920898f, + 0.061066f, 0.915527f, 0.063782f, 0.911133f, 0.065979f, 0.907227f, 0.068176f, 0.902832f, + 0.071289f, 0.898438f, 0.073547f, 0.894043f, 0.076721f, 0.888672f, 0.079651f, 0.883789f, + 0.082642f, 0.878906f, 0.085510f, 0.874023f, 0.087585f, 0.869141f, 0.089661f, 0.863770f, + 0.092163f, 0.857910f, 0.094971f, 0.851562f, 0.098633f, 0.845215f, 0.101440f, 0.838867f, + 0.104248f, 0.833496f, 0.106628f, 0.827148f, 0.108704f, 0.820801f, 0.111511f, 0.812988f, + 0.114929f, 0.805176f, 0.117371f, 0.797363f, 0.120239f, 0.789062f, 0.122620f, 0.780762f, + 0.124634f, 0.772461f, 0.126709f, 0.762695f, 0.129395f, 0.752441f, 0.131104f, 0.740723f, + 0.133789f, 0.729004f, 0.134888f, 0.716309f, 0.136353f, 0.702148f, 0.135986f, 0.687012f, + 0.136108f, 0.669434f, 0.134888f, 0.647461f, 0.132324f, 0.623047f, 0.126709f, 0.593750f, + 0.117493f, 0.556641f, 0.102234f, 0.497070f, 0.073120f, 0.399658f, 0.016556f, 0.165283f, + 0.000000f, 1.000000f, 0.003525f, 0.997559f, 0.006729f, 0.995117f, 0.009232f, 0.992188f, + 0.013802f, 0.987793f, 0.016479f, 0.984863f, 0.019440f, 0.980469f, 0.023453f, 0.976074f, + 0.025757f, 0.973145f, 0.029373f, 0.968750f, 0.032471f, 0.964355f, 0.034485f, 0.960938f, + 0.037811f, 0.956543f, 0.041779f, 0.951660f, 0.044952f, 0.947266f, 0.048035f, 0.942871f, + 0.050629f, 0.938965f, 0.053925f, 0.933594f, 0.057800f, 0.928711f, 0.060211f, 0.924805f, + 0.062927f, 0.920410f, 0.065674f, 0.916504f, 0.069397f, 0.911133f, 0.072510f, 0.906250f, + 0.075623f, 0.901367f, 0.078552f, 0.896973f, 0.081055f, 0.892578f, 0.083923f, 0.888184f, + 0.087830f, 0.882324f, 0.091064f, 0.876953f, 0.094238f, 0.872070f, 0.097046f, 0.867188f, + 0.099731f, 0.862305f, 0.103333f, 0.856934f, 0.106018f, 0.852051f, 0.109253f, 0.845703f, + 0.112244f, 0.839355f, 0.115234f, 0.833496f, 0.118225f, 0.827148f, 0.121155f, 0.820801f, + 0.124023f, 0.814941f, 0.126465f, 0.809082f, 0.130249f, 0.801758f, 0.132690f, 0.793945f, + 0.135864f, 0.786133f, 0.139404f, 0.778809f, 0.141724f, 0.770996f, 0.143311f, 0.762695f, + 0.146240f, 0.754883f, 0.148315f, 0.744141f, 0.151367f, 0.734375f, 0.153076f, 0.723633f, + 0.154785f, 0.712402f, 0.155273f, 0.700195f, 0.156006f, 0.687012f, 0.155640f, 0.672363f, + 0.155762f, 0.654785f, 0.153687f, 0.634277f, 0.149902f, 0.611328f, 0.142578f, 0.583008f, + 0.132080f, 0.547363f, 0.114807f, 0.490479f, 0.081726f, 0.396973f, 0.018372f, 0.164429f, + 0.000000f, 1.000000f, 0.004353f, 0.997559f, 0.009270f, 0.993164f, 0.013527f, 0.989258f, + 0.017075f, 0.985352f, 0.021469f, 0.980957f, 0.025726f, 0.975586f, 0.028534f, 0.972168f, + 0.034210f, 0.965820f, 0.037933f, 0.960938f, 0.041351f, 0.956543f, 0.045013f, 0.951660f, + 0.049316f, 0.946289f, 0.052612f, 0.941406f, 0.056610f, 0.936523f, 0.061157f, 0.931152f, + 0.065063f, 0.925293f, 0.068542f, 0.919922f, 0.071716f, 0.915527f, 0.075745f, 0.910645f, + 0.079102f, 0.905273f, 0.083496f, 0.899414f, 0.086914f, 0.894531f, 0.090271f, 0.889160f, + 0.093506f, 0.884766f, 0.096741f, 0.879883f, 0.100525f, 0.874512f, 0.104614f, 0.868652f, + 0.108521f, 0.862793f, 0.111572f, 0.857910f, 0.114868f, 0.852539f, 0.117798f, 0.847656f, + 0.120667f, 0.843262f, 0.125488f, 0.836426f, 0.129395f, 0.830566f, 0.132568f, 0.824707f, + 0.135620f, 0.818848f, 0.137817f, 0.812500f, 0.141602f, 0.806641f, 0.144165f, 0.800781f, + 0.147461f, 0.793945f, 0.151489f, 0.787109f, 0.154297f, 0.780273f, 0.157837f, 0.772949f, + 0.159668f, 0.765625f, 0.162720f, 0.758301f, 0.164673f, 0.751465f, 0.166992f, 0.743652f, + 0.170532f, 0.734375f, 0.172729f, 0.724609f, 0.174561f, 0.714844f, 0.176636f, 0.705078f, + 0.177002f, 0.694336f, 0.177856f, 0.684082f, 0.177002f, 0.671387f, 0.177124f, 0.655762f, + 0.177002f, 0.639648f, 0.172607f, 0.620117f, 0.168457f, 0.599121f, 0.159668f, 0.573730f, + 0.148071f, 0.537598f, 0.127197f, 0.482666f, 0.089905f, 0.394287f, 0.020325f, 0.162964f, + 0.000000f, 1.000000f, 0.005520f, 0.997070f, 0.011871f, 0.991699f, 0.017593f, 0.986328f, + 0.023010f, 0.980957f, 0.028946f, 0.974609f, 0.034088f, 0.969238f, 0.039368f, 0.962891f, + 0.044708f, 0.957031f, 0.049316f, 0.951660f, 0.054657f, 0.945312f, 0.059570f, 0.938477f, + 0.063782f, 0.933105f, 0.067322f, 0.928223f, 0.073242f, 0.921387f, 0.077698f, 0.915527f, + 0.082825f, 0.909180f, 0.086914f, 0.903809f, 0.091370f, 0.897949f, 0.096802f, 0.891113f, + 0.101196f, 0.885254f, 0.104492f, 0.879883f, 0.108582f, 0.874512f, 0.112061f, 0.869629f, + 0.117065f, 0.863281f, 0.121521f, 0.857422f, 0.125244f, 0.851562f, 0.129272f, 0.845703f, + 0.132446f, 0.840820f, 0.136353f, 0.835938f, 0.140015f, 0.830078f, 0.144287f, 0.823730f, + 0.148438f, 0.817871f, 0.152588f, 0.812012f, 0.155762f, 0.806641f, 0.159180f, 0.801270f, + 0.162109f, 0.795898f, 0.164062f, 0.790527f, 0.168701f, 0.782715f, 0.172241f, 0.775879f, + 0.175781f, 0.769531f, 0.178467f, 0.763184f, 0.181274f, 0.757324f, 0.184570f, 0.750977f, + 0.186768f, 0.744141f, 0.188599f, 0.737305f, 0.192139f, 0.729004f, 0.194580f, 0.720703f, + 0.196533f, 0.711914f, 0.198608f, 0.703613f, 0.199463f, 0.694824f, 0.200806f, 0.686035f, + 0.200684f, 0.676758f, 0.201172f, 0.665527f, 0.201538f, 0.652832f, 0.200684f, 0.638672f, + 0.198242f, 0.623535f, 0.193604f, 0.606934f, 0.187256f, 0.587402f, 0.176758f, 0.563477f, + 0.163208f, 0.526367f, 0.140381f, 0.476318f, 0.098877f, 0.390625f, 0.022156f, 0.161621f, + 0.000000f, 1.000000f, 0.008011f, 0.995605f, 0.015991f, 0.989258f, 0.024277f, 0.982422f, + 0.032227f, 0.974609f, 0.039429f, 0.967285f, 0.046875f, 0.958984f, 0.053802f, 0.951660f, + 0.059113f, 0.945312f, 0.067200f, 0.936523f, 0.072510f, 0.930176f, 0.078186f, 0.923340f, + 0.084900f, 0.915039f, 0.091064f, 0.907715f, 0.095947f, 0.901367f, 0.100586f, 0.895508f, + 0.106262f, 0.888184f, 0.112976f, 0.880371f, 0.118164f, 0.874023f, 0.122742f, 0.868164f, + 0.127075f, 0.862305f, 0.132446f, 0.855469f, 0.137329f, 0.848633f, 0.142456f, 0.842285f, + 0.146851f, 0.836426f, 0.150513f, 0.831055f, 0.154663f, 0.825684f, 0.158813f, 0.819824f, + 0.163452f, 0.813477f, 0.168335f, 0.807129f, 0.172119f, 0.801270f, 0.175659f, 0.795898f, + 0.179565f, 0.790527f, 0.182983f, 0.785645f, 0.185669f, 0.780762f, 0.190186f, 0.773926f, + 0.194214f, 0.768066f, 0.197632f, 0.762207f, 0.201050f, 0.755371f, 0.203735f, 0.749023f, + 0.206055f, 0.743652f, 0.208374f, 0.738281f, 0.210815f, 0.732422f, 0.213989f, 0.726074f, + 0.217773f, 0.718750f, 0.219116f, 0.710938f, 0.221558f, 0.703613f, 0.223145f, 0.696777f, + 0.225220f, 0.689453f, 0.226074f, 0.682129f, 0.226685f, 0.674805f, 0.226562f, 0.666992f, + 0.227173f, 0.656250f, 0.227661f, 0.645020f, 0.226318f, 0.633789f, 0.223999f, 0.621094f, + 0.220337f, 0.607910f, 0.213867f, 0.593750f, 0.205811f, 0.575684f, 0.196045f, 0.549316f, + 0.180542f, 0.517090f, 0.153687f, 0.469971f, 0.107910f, 0.387939f, 0.024536f, 0.161499f, + 0.000000f, 1.000000f, 0.013008f, 0.993164f, 0.024948f, 0.984375f, 0.035583f, 0.974609f, + 0.045288f, 0.965820f, 0.056854f, 0.954590f, 0.064941f, 0.945801f, 0.074707f, 0.935547f, + 0.083252f, 0.926270f, 0.090027f, 0.917969f, 0.099426f, 0.907715f, 0.106506f, 0.899414f, + 0.114075f, 0.891113f, 0.119995f, 0.883789f, 0.128662f, 0.874023f, 0.134277f, 0.866699f, + 0.140259f, 0.859863f, 0.144653f, 0.853516f, 0.151978f, 0.845215f, 0.158203f, 0.837402f, + 0.164551f, 0.830078f, 0.169189f, 0.823730f, 0.173584f, 0.817871f, 0.177246f, 0.812500f, + 0.183716f, 0.805176f, 0.188354f, 0.798340f, 0.192871f, 0.792480f, 0.197510f, 0.786133f, + 0.201416f, 0.780762f, 0.204346f, 0.775879f, 0.207886f, 0.770996f, 0.212036f, 0.765137f, + 0.216553f, 0.758789f, 0.220337f, 0.752930f, 0.224487f, 0.747070f, 0.227539f, 0.741699f, + 0.230103f, 0.736816f, 0.233154f, 0.731934f, 0.236206f, 0.727051f, 0.237305f, 0.722168f, + 0.240723f, 0.715332f, 0.243530f, 0.708984f, 0.245972f, 0.702637f, 0.249268f, 0.696777f, + 0.250977f, 0.690430f, 0.251709f, 0.685059f, 0.252686f, 0.678711f, 0.253662f, 0.673340f, + 0.254395f, 0.666992f, 0.254639f, 0.659668f, 0.256104f, 0.650879f, 0.256104f, 0.642090f, + 0.255371f, 0.633789f, 0.253906f, 0.624023f, 0.251465f, 0.615234f, 0.247437f, 0.604492f, + 0.241943f, 0.592773f, 0.233765f, 0.580078f, 0.227051f, 0.560059f, 0.215332f, 0.536621f, + 0.196411f, 0.506836f, 0.167358f, 0.463135f, 0.116577f, 0.385254f, 0.026627f, 0.160400f, + 0.000000f, 1.000000f, 0.020325f, 0.990234f, 0.037689f, 0.977539f, 0.054382f, 0.963379f, + 0.070068f, 0.948730f, 0.082825f, 0.936035f, 0.096680f, 0.922363f, 0.105896f, 0.912109f, + 0.119446f, 0.897949f, 0.129272f, 0.887207f, 0.137817f, 0.877441f, 0.148438f, 0.865723f, + 0.156494f, 0.856445f, 0.163086f, 0.848145f, 0.171021f, 0.839355f, 0.179810f, 0.829102f, + 0.185669f, 0.821777f, 0.192017f, 0.813965f, 0.196533f, 0.807617f, 0.202026f, 0.800781f, + 0.209717f, 0.791992f, 0.216187f, 0.784668f, 0.220459f, 0.777832f, 0.224854f, 0.771973f, + 0.229004f, 0.766113f, 0.233032f, 0.761230f, 0.236694f, 0.755371f, 0.242554f, 0.748535f, + 0.247070f, 0.742188f, 0.250244f, 0.736816f, 0.253418f, 0.731934f, 0.256592f, 0.727051f, + 0.259277f, 0.722168f, 0.261963f, 0.717773f, 0.264160f, 0.713867f, 0.267822f, 0.708496f, + 0.270996f, 0.702637f, 0.274170f, 0.697266f, 0.277344f, 0.691895f, 0.279053f, 0.687500f, + 0.280518f, 0.682129f, 0.281250f, 0.677734f, 0.281982f, 0.672852f, 0.283691f, 0.667969f, + 0.283936f, 0.664062f, 0.285645f, 0.658691f, 0.286377f, 0.651855f, 0.287354f, 0.645508f, + 0.287842f, 0.639160f, 0.288330f, 0.632812f, 0.286865f, 0.625977f, 0.285400f, 0.619141f, + 0.283691f, 0.612793f, 0.280273f, 0.604980f, 0.276367f, 0.597656f, 0.270752f, 0.589355f, + 0.265625f, 0.575684f, 0.258789f, 0.562012f, 0.249146f, 0.544434f, 0.234009f, 0.523926f, + 0.212524f, 0.496826f, 0.180420f, 0.457275f, 0.125854f, 0.384766f, 0.028809f, 0.160034f, + 0.000000f, 1.000000f, 0.036621f, 0.982910f, 0.065308f, 0.962402f, 0.089172f, 0.941895f, + 0.112122f, 0.920898f, 0.131836f, 0.902344f, 0.146484f, 0.887207f, 0.161621f, 0.870605f, + 0.175415f, 0.856445f, 0.184570f, 0.845215f, 0.197998f, 0.830566f, 0.207642f, 0.819336f, + 0.215698f, 0.809570f, 0.222412f, 0.801270f, 0.231323f, 0.790039f, 0.240112f, 0.780762f, + 0.245728f, 0.772461f, 0.250488f, 0.765625f, 0.255615f, 0.758789f, 0.261230f, 0.751953f, + 0.266846f, 0.744141f, 0.272705f, 0.736816f, 0.277832f, 0.730469f, 0.280762f, 0.725098f, + 0.285156f, 0.719238f, 0.287842f, 0.714844f, 0.290039f, 0.710449f, 0.293457f, 0.705078f, + 0.298340f, 0.698730f, 0.301514f, 0.693848f, 0.304199f, 0.688965f, 0.306885f, 0.684570f, + 0.309326f, 0.680176f, 0.311035f, 0.676270f, 0.312988f, 0.672363f, 0.313721f, 0.668945f, + 0.314941f, 0.665527f, 0.316162f, 0.662109f, 0.318115f, 0.658203f, 0.320557f, 0.652832f, + 0.322021f, 0.647949f, 0.322510f, 0.643066f, 0.322998f, 0.638672f, 0.324219f, 0.634277f, + 0.324463f, 0.629883f, 0.324219f, 0.625977f, 0.323730f, 0.622070f, 0.322021f, 0.617676f, + 0.320801f, 0.613770f, 0.319092f, 0.609375f, 0.316162f, 0.604492f, 0.313232f, 0.599609f, + 0.311279f, 0.591309f, 0.309082f, 0.583008f, 0.304443f, 0.574707f, 0.299072f, 0.565430f, + 0.291992f, 0.555664f, 0.283691f, 0.544434f, 0.269775f, 0.529785f, 0.253174f, 0.513184f, + 0.229248f, 0.489746f, 0.194092f, 0.453857f, 0.136475f, 0.373291f, 0.031067f, 0.160278f, + 0.000000f, 1.000000f, 0.077332f, 0.965332f, 0.129028f, 0.927734f, 0.164673f, 0.896973f, + 0.193481f, 0.869141f, 0.213257f, 0.847656f, 0.234131f, 0.825684f, 0.247192f, 0.809082f, + 0.260010f, 0.793457f, 0.272949f, 0.778320f, 0.282471f, 0.766113f, 0.290527f, 0.755371f, + 0.296875f, 0.746094f, 0.303955f, 0.735840f, 0.311768f, 0.726074f, 0.316650f, 0.718262f, + 0.322021f, 0.710938f, 0.326172f, 0.704102f, 0.330078f, 0.697754f, 0.333252f, 0.691895f, + 0.335693f, 0.687012f, 0.338135f, 0.682129f, 0.343262f, 0.675781f, 0.346436f, 0.670410f, + 0.349854f, 0.665039f, 0.352783f, 0.660156f, 0.354980f, 0.655762f, 0.356201f, 0.651855f, + 0.358398f, 0.647949f, 0.359863f, 0.644043f, 0.360840f, 0.640625f, 0.362061f, 0.637695f, + 0.363525f, 0.634766f, 0.363281f, 0.631836f, 0.363525f, 0.629395f, 0.364014f, 0.626465f, + 0.364014f, 0.624023f, 0.363770f, 0.621582f, 0.365479f, 0.618164f, 0.365723f, 0.614258f, + 0.366455f, 0.611328f, 0.365479f, 0.607910f, 0.365234f, 0.604004f, 0.364990f, 0.600586f, + 0.364014f, 0.597168f, 0.363037f, 0.593750f, 0.361816f, 0.590820f, 0.359375f, 0.586914f, + 0.357666f, 0.583008f, 0.354980f, 0.578613f, 0.351807f, 0.574707f, 0.347656f, 0.570312f, + 0.343262f, 0.565918f, 0.337891f, 0.560059f, 0.331543f, 0.554688f, 0.323975f, 0.548340f, + 0.314697f, 0.540527f, 0.303711f, 0.531738f, 0.288330f, 0.520020f, 0.270264f, 0.503906f, + 0.245972f, 0.479248f, 0.209229f, 0.440430f, 0.148438f, 0.366943f, 0.033234f, 0.160889f, + 0.000000f, 1.000000f, 0.124634f, 0.945312f, 0.188721f, 0.896973f, 0.229736f, 0.858887f, + 0.258301f, 0.828125f, 0.279541f, 0.803223f, 0.296387f, 0.782227f, 0.311035f, 0.763672f, + 0.322021f, 0.748047f, 0.332275f, 0.733887f, 0.339844f, 0.722168f, 0.347412f, 0.710938f, + 0.353516f, 0.701172f, 0.358643f, 0.692383f, 0.363770f, 0.683594f, 0.368652f, 0.675781f, + 0.372559f, 0.668945f, 0.376465f, 0.662598f, 0.379883f, 0.656738f, 0.382080f, 0.650879f, + 0.384521f, 0.645996f, 0.386719f, 0.641113f, 0.389160f, 0.636719f, 0.391846f, 0.631836f, + 0.394287f, 0.627441f, 0.395752f, 0.623535f, 0.397217f, 0.619629f, 0.398193f, 0.616211f, + 0.399414f, 0.612793f, 0.401123f, 0.608887f, 0.401611f, 0.605957f, 0.402100f, 0.603516f, + 0.403809f, 0.600098f, 0.403320f, 0.597656f, 0.404053f, 0.594727f, 0.404297f, 0.591797f, + 0.404541f, 0.589355f, 0.404297f, 0.586914f, 0.404297f, 0.584473f, 0.404541f, 0.581543f, + 0.404053f, 0.579102f, 0.403320f, 0.577148f, 0.401855f, 0.573730f, 0.401123f, 0.570312f, + 0.399658f, 0.567383f, 0.398682f, 0.564453f, 0.396729f, 0.561523f, 0.394531f, 0.558594f, + 0.392578f, 0.554688f, 0.390137f, 0.550781f, 0.386963f, 0.547363f, 0.382568f, 0.542969f, + 0.379150f, 0.538574f, 0.373535f, 0.533203f, 0.367676f, 0.526855f, 0.360840f, 0.520508f, + 0.352051f, 0.512695f, 0.341309f, 0.502930f, 0.327881f, 0.491211f, 0.310303f, 0.476807f, + 0.285156f, 0.454590f, 0.249146f, 0.420654f, 0.187378f, 0.354736f, 0.060944f, 0.163208f, + 0.000000f, 1.000000f, 0.125732f, 0.944824f, 0.191284f, 0.895508f, 0.233521f, 0.856445f, + 0.263184f, 0.825195f, 0.285645f, 0.799316f, 0.303711f, 0.777344f, 0.318848f, 0.758301f, + 0.329834f, 0.742676f, 0.341309f, 0.727539f, 0.349609f, 0.714355f, 0.357910f, 0.702637f, + 0.365234f, 0.691895f, 0.370605f, 0.682617f, 0.376709f, 0.673340f, 0.382568f, 0.665039f, + 0.387207f, 0.657227f, 0.390381f, 0.650879f, 0.394775f, 0.643555f, 0.398926f, 0.637207f, + 0.401611f, 0.631836f, 0.405029f, 0.626465f, 0.407227f, 0.621094f, 0.410889f, 0.616211f, + 0.413574f, 0.610840f, 0.415771f, 0.606445f, 0.418457f, 0.601562f, 0.418701f, 0.598145f, + 0.421631f, 0.593750f, 0.423096f, 0.589844f, 0.424561f, 0.585938f, 0.425781f, 0.583008f, + 0.427734f, 0.579102f, 0.428955f, 0.575684f, 0.429688f, 0.572266f, 0.431152f, 0.568848f, + 0.432129f, 0.565918f, 0.432617f, 0.562500f, 0.433105f, 0.559570f, 0.433838f, 0.556152f, + 0.434082f, 0.553223f, 0.434326f, 0.550293f, 0.434326f, 0.546387f, 0.434326f, 0.542480f, + 0.434326f, 0.538574f, 0.433350f, 0.535156f, 0.432861f, 0.531250f, 0.432129f, 0.527832f, + 0.431396f, 0.522949f, 0.429199f, 0.518555f, 0.427002f, 0.514160f, 0.424805f, 0.509277f, + 0.421631f, 0.503906f, 0.418701f, 0.498047f, 0.414551f, 0.491211f, 0.408936f, 0.484375f, + 0.401611f, 0.475586f, 0.393799f, 0.465576f, 0.382324f, 0.453125f, 0.368652f, 0.437988f, + 0.347168f, 0.416260f, 0.315430f, 0.383789f, 0.259033f, 0.322510f, 0.129639f, 0.150024f, + 0.000000f, 1.000000f, 0.126465f, 0.944824f, 0.193848f, 0.894043f, 0.237061f, 0.854492f, + 0.268311f, 0.822266f, 0.291748f, 0.795410f, 0.310303f, 0.772949f, 0.327148f, 0.752441f, + 0.339111f, 0.735352f, 0.350342f, 0.720215f, 0.360107f, 0.706543f, 0.368652f, 0.694336f, + 0.376953f, 0.682617f, 0.384033f, 0.671875f, 0.389893f, 0.663086f, 0.396973f, 0.653320f, + 0.401367f, 0.645508f, 0.405762f, 0.637695f, 0.411133f, 0.629883f, 0.417236f, 0.622559f, + 0.419922f, 0.616211f, 0.424072f, 0.610352f, 0.427734f, 0.604004f, 0.430908f, 0.599121f, + 0.434570f, 0.592773f, 0.437500f, 0.587891f, 0.440186f, 0.582520f, 0.442139f, 0.578125f, + 0.446289f, 0.573242f, 0.447510f, 0.568848f, 0.449219f, 0.564941f, 0.451416f, 0.560547f, + 0.453857f, 0.556641f, 0.454834f, 0.552734f, 0.457275f, 0.548828f, 0.458740f, 0.544922f, + 0.460205f, 0.541016f, 0.461914f, 0.537109f, 0.462891f, 0.533691f, 0.464111f, 0.529785f, + 0.465820f, 0.526367f, 0.466553f, 0.522461f, 0.467285f, 0.519043f, 0.467529f, 0.514160f, + 0.468262f, 0.509277f, 0.468506f, 0.504883f, 0.468506f, 0.500977f, 0.469238f, 0.496826f, + 0.468994f, 0.491699f, 0.468262f, 0.486328f, 0.467041f, 0.481445f, 0.466309f, 0.476318f, + 0.464111f, 0.469727f, 0.462158f, 0.463135f, 0.458740f, 0.455811f, 0.455322f, 0.447754f, + 0.450684f, 0.438721f, 0.444824f, 0.427734f, 0.437012f, 0.415039f, 0.424316f, 0.399414f, + 0.407227f, 0.378174f, 0.381592f, 0.346680f, 0.332275f, 0.290283f, 0.208618f, 0.136841f, + 0.000000f, 1.000000f, 0.127686f, 0.943848f, 0.196655f, 0.892578f, 0.240479f, 0.852539f, + 0.272949f, 0.819336f, 0.297607f, 0.791504f, 0.317627f, 0.767578f, 0.334229f, 0.747070f, + 0.348145f, 0.729004f, 0.360107f, 0.712891f, 0.370605f, 0.698242f, 0.380859f, 0.684570f, + 0.391357f, 0.671875f, 0.398193f, 0.660645f, 0.404297f, 0.650879f, 0.411865f, 0.640625f, + 0.417725f, 0.631836f, 0.422607f, 0.623535f, 0.427979f, 0.615723f, 0.433838f, 0.607910f, + 0.437744f, 0.601074f, 0.441650f, 0.594727f, 0.445557f, 0.588379f, 0.449219f, 0.582520f, + 0.454102f, 0.575684f, 0.458008f, 0.570312f, 0.460938f, 0.564453f, 0.463867f, 0.559570f, + 0.468018f, 0.553711f, 0.471191f, 0.548340f, 0.473877f, 0.543457f, 0.476562f, 0.539062f, + 0.479004f, 0.534180f, 0.481934f, 0.529297f, 0.483887f, 0.524902f, 0.485352f, 0.520996f, + 0.488037f, 0.516602f, 0.490479f, 0.511719f, 0.492432f, 0.507812f, 0.494873f, 0.503418f, + 0.496582f, 0.499268f, 0.498291f, 0.494873f, 0.499512f, 0.490723f, 0.501465f, 0.485596f, + 0.501953f, 0.480469f, 0.502930f, 0.475586f, 0.503906f, 0.470947f, 0.505859f, 0.465576f, + 0.506348f, 0.460449f, 0.506836f, 0.454346f, 0.506836f, 0.448242f, 0.505859f, 0.442627f, + 0.505859f, 0.435547f, 0.505371f, 0.427979f, 0.503906f, 0.420654f, 0.501953f, 0.412109f, + 0.498291f, 0.402100f, 0.494385f, 0.391113f, 0.487549f, 0.377686f, 0.478516f, 0.361084f, + 0.466064f, 0.340576f, 0.442871f, 0.310547f, 0.402588f, 0.258301f, 0.290527f, 0.122314f, + 0.000000f, 1.000000f, 0.127686f, 0.944336f, 0.198120f, 0.892090f, 0.244385f, 0.850098f, + 0.277100f, 0.816895f, 0.303711f, 0.787598f, 0.325195f, 0.762695f, 0.344238f, 0.740234f, + 0.357666f, 0.721680f, 0.371582f, 0.704102f, 0.383057f, 0.688965f, 0.393311f, 0.674805f, + 0.401367f, 0.662598f, 0.410889f, 0.650391f, 0.417725f, 0.639648f, 0.426514f, 0.628906f, + 0.432373f, 0.619629f, 0.438232f, 0.610352f, 0.444580f, 0.602051f, 0.451904f, 0.593262f, + 0.456055f, 0.585449f, 0.461182f, 0.578125f, 0.465576f, 0.571289f, 0.469727f, 0.564941f, + 0.474854f, 0.558105f, 0.479736f, 0.551270f, 0.482666f, 0.545410f, 0.486816f, 0.539551f, + 0.491211f, 0.533691f, 0.494629f, 0.527832f, 0.497559f, 0.522461f, 0.500977f, 0.517090f, + 0.503906f, 0.511719f, 0.507812f, 0.506348f, 0.509766f, 0.501465f, 0.512207f, 0.497314f, + 0.517090f, 0.491699f, 0.519531f, 0.486572f, 0.521973f, 0.481934f, 0.523926f, 0.477051f, + 0.526855f, 0.472168f, 0.529297f, 0.467529f, 0.531738f, 0.462646f, 0.534668f, 0.457275f, + 0.536133f, 0.451416f, 0.537109f, 0.446045f, 0.538574f, 0.440430f, 0.541504f, 0.434814f, + 0.542480f, 0.428955f, 0.543945f, 0.422607f, 0.544922f, 0.416260f, 0.545898f, 0.409424f, + 0.547363f, 0.402588f, 0.546387f, 0.394287f, 0.546387f, 0.385986f, 0.544922f, 0.376709f, + 0.544434f, 0.366699f, 0.541504f, 0.354492f, 0.537109f, 0.341309f, 0.531250f, 0.325684f, + 0.520996f, 0.304932f, 0.503906f, 0.276123f, 0.468750f, 0.228271f, 0.369873f, 0.107666f, + 0.000000f, 1.000000f, 0.128662f, 0.943848f, 0.200928f, 0.890625f, 0.248047f, 0.848145f, + 0.283447f, 0.812500f, 0.311523f, 0.782227f, 0.333252f, 0.756836f, 0.351074f, 0.734375f, + 0.367920f, 0.714355f, 0.382080f, 0.696289f, 0.393555f, 0.680664f, 0.404785f, 0.665527f, + 0.415039f, 0.651855f, 0.425293f, 0.639160f, 0.432861f, 0.627441f, 0.441406f, 0.616211f, + 0.448242f, 0.605957f, 0.455811f, 0.596191f, 0.461426f, 0.587891f, 0.468018f, 0.578613f, + 0.473877f, 0.570312f, 0.480225f, 0.562012f, 0.485352f, 0.554199f, 0.489258f, 0.547363f, + 0.494873f, 0.540527f, 0.500488f, 0.532715f, 0.504883f, 0.525879f, 0.509766f, 0.519531f, + 0.513672f, 0.513184f, 0.518066f, 0.506836f, 0.522461f, 0.500977f, 0.524902f, 0.495361f, + 0.529785f, 0.489258f, 0.533203f, 0.483643f, 0.537598f, 0.477783f, 0.540039f, 0.472656f, + 0.543945f, 0.467041f, 0.546875f, 0.461670f, 0.550781f, 0.456055f, 0.553711f, 0.450928f, + 0.556641f, 0.445557f, 0.560059f, 0.439941f, 0.562988f, 0.434570f, 0.565918f, 0.428955f, + 0.569336f, 0.423096f, 0.569824f, 0.416992f, 0.573242f, 0.410645f, 0.576172f, 0.404297f, + 0.577637f, 0.397949f, 0.580078f, 0.391846f, 0.581543f, 0.384766f, 0.582520f, 0.377441f, + 0.585938f, 0.369385f, 0.585449f, 0.361572f, 0.586914f, 0.352783f, 0.586914f, 0.343506f, + 0.587891f, 0.333008f, 0.585938f, 0.320557f, 0.583984f, 0.307617f, 0.578613f, 0.291504f, + 0.571777f, 0.271729f, 0.557129f, 0.243896f, 0.527832f, 0.199463f, 0.445557f, 0.093689f, + 0.000000f, 1.000000f, 0.129517f, 0.943359f, 0.203003f, 0.889648f, 0.252930f, 0.845215f, + 0.290039f, 0.808105f, 0.318115f, 0.777832f, 0.339844f, 0.751953f, 0.360107f, 0.728516f, + 0.377197f, 0.707520f, 0.392090f, 0.688477f, 0.405518f, 0.671387f, 0.417725f, 0.655762f, + 0.428223f, 0.641602f, 0.437988f, 0.628418f, 0.446533f, 0.616211f, 0.456543f, 0.604004f, + 0.464355f, 0.592773f, 0.472656f, 0.582031f, 0.478271f, 0.573242f, 0.487305f, 0.562988f, + 0.492188f, 0.554199f, 0.499268f, 0.545410f, 0.504883f, 0.537109f, 0.509766f, 0.529785f, + 0.515625f, 0.521973f, 0.521973f, 0.514160f, 0.526367f, 0.506836f, 0.531738f, 0.500000f, + 0.536133f, 0.492676f, 0.542480f, 0.485840f, 0.545898f, 0.479492f, 0.550293f, 0.473145f, + 0.554688f, 0.466797f, 0.558594f, 0.460693f, 0.563477f, 0.454346f, 0.566406f, 0.448730f, + 0.571777f, 0.442383f, 0.574219f, 0.436768f, 0.578613f, 0.430664f, 0.582031f, 0.424805f, + 0.585938f, 0.419189f, 0.590332f, 0.413086f, 0.593262f, 0.406982f, 0.596680f, 0.401367f, + 0.600098f, 0.395264f, 0.602539f, 0.388916f, 0.605469f, 0.381836f, 0.609375f, 0.375000f, + 0.611816f, 0.368408f, 0.614258f, 0.361572f, 0.617188f, 0.354736f, 0.619629f, 0.346436f, + 0.622559f, 0.338379f, 0.624512f, 0.330566f, 0.624512f, 0.321045f, 0.626465f, 0.311768f, + 0.626953f, 0.300537f, 0.626953f, 0.288818f, 0.626465f, 0.275391f, 0.623047f, 0.260254f, + 0.617188f, 0.240234f, 0.606934f, 0.214233f, 0.584473f, 0.173584f, 0.513672f, 0.080017f, + 0.000000f, 1.000000f, 0.130615f, 0.942871f, 0.206787f, 0.887207f, 0.257568f, 0.842285f, + 0.295166f, 0.805176f, 0.323975f, 0.773926f, 0.347656f, 0.746582f, 0.368896f, 0.722168f, + 0.387939f, 0.699707f, 0.403320f, 0.680176f, 0.417236f, 0.662598f, 0.428955f, 0.646484f, + 0.442139f, 0.630859f, 0.452393f, 0.617188f, 0.461670f, 0.603516f, 0.471191f, 0.591309f, + 0.480713f, 0.579590f, 0.488525f, 0.568359f, 0.495361f, 0.558594f, 0.503906f, 0.547852f, + 0.512207f, 0.538086f, 0.518066f, 0.529297f, 0.524414f, 0.520020f, 0.530273f, 0.511719f, + 0.535645f, 0.503906f, 0.541992f, 0.495850f, 0.548340f, 0.488037f, 0.553223f, 0.480225f, + 0.559082f, 0.472412f, 0.564941f, 0.465088f, 0.569336f, 0.458008f, 0.574219f, 0.451660f, + 0.580566f, 0.444092f, 0.583008f, 0.437988f, 0.588867f, 0.431152f, 0.592773f, 0.424805f, + 0.597168f, 0.418701f, 0.602539f, 0.411865f, 0.605469f, 0.405762f, 0.609375f, 0.399658f, + 0.614258f, 0.393311f, 0.618164f, 0.386719f, 0.622559f, 0.380615f, 0.626953f, 0.374268f, + 0.630371f, 0.367920f, 0.633301f, 0.361816f, 0.637695f, 0.353760f, 0.641113f, 0.346924f, + 0.643555f, 0.339844f, 0.647461f, 0.332520f, 0.650879f, 0.325684f, 0.652832f, 0.317627f, + 0.656250f, 0.308838f, 0.658691f, 0.300537f, 0.660156f, 0.291504f, 0.663086f, 0.281738f, + 0.665039f, 0.270996f, 0.666016f, 0.260010f, 0.665527f, 0.246460f, 0.664062f, 0.231323f, + 0.660645f, 0.212646f, 0.651855f, 0.188354f, 0.633301f, 0.151489f, 0.574219f, 0.069397f, + 0.000000f, 1.000000f, 0.132568f, 0.941895f, 0.209839f, 0.885742f, 0.261719f, 0.840332f, + 0.300293f, 0.802246f, 0.330322f, 0.769531f, 0.357178f, 0.740234f, 0.378174f, 0.715332f, + 0.396729f, 0.692871f, 0.414307f, 0.671875f, 0.429688f, 0.653320f, 0.442139f, 0.636230f, + 0.454590f, 0.620605f, 0.466064f, 0.605469f, 0.477295f, 0.591309f, 0.487305f, 0.578613f, + 0.496338f, 0.565918f, 0.505371f, 0.554199f, 0.512695f, 0.543457f, 0.521484f, 0.533203f, + 0.529297f, 0.521973f, 0.536133f, 0.512695f, 0.543457f, 0.503418f, 0.549805f, 0.494385f, + 0.556152f, 0.485840f, 0.562012f, 0.477539f, 0.568848f, 0.468750f, 0.575684f, 0.460449f, + 0.582031f, 0.452393f, 0.586914f, 0.444580f, 0.592773f, 0.437256f, 0.598145f, 0.429932f, + 0.603516f, 0.422363f, 0.609375f, 0.415283f, 0.613770f, 0.408447f, 0.618164f, 0.401611f, + 0.622559f, 0.395020f, 0.627930f, 0.387695f, 0.632812f, 0.381104f, 0.636719f, 0.375000f, + 0.641602f, 0.368164f, 0.646484f, 0.361328f, 0.650391f, 0.354736f, 0.653809f, 0.348633f, + 0.659180f, 0.341553f, 0.663086f, 0.335205f, 0.667480f, 0.327393f, 0.670410f, 0.320312f, + 0.674316f, 0.312744f, 0.677734f, 0.305420f, 0.681152f, 0.297852f, 0.685547f, 0.290283f, + 0.687988f, 0.281494f, 0.690918f, 0.272705f, 0.694824f, 0.264160f, 0.696777f, 0.254150f, + 0.698242f, 0.244019f, 0.699707f, 0.232178f, 0.699707f, 0.219727f, 0.700684f, 0.204956f, + 0.698730f, 0.187744f, 0.692383f, 0.165527f, 0.677734f, 0.130981f, 0.627441f, 0.059204f, + 0.000000f, 1.000000f, 0.133301f, 0.941895f, 0.213013f, 0.883789f, 0.265381f, 0.837891f, + 0.305420f, 0.798828f, 0.337158f, 0.765137f, 0.364990f, 0.734863f, 0.386475f, 0.708984f, + 0.406006f, 0.685547f, 0.424072f, 0.664062f, 0.439941f, 0.644531f, 0.454590f, 0.626465f, + 0.468506f, 0.609375f, 0.479492f, 0.594238f, 0.492188f, 0.579102f, 0.501465f, 0.565918f, + 0.511719f, 0.552734f, 0.522461f, 0.540039f, 0.531738f, 0.528320f, 0.538574f, 0.517578f, + 0.547363f, 0.506348f, 0.554199f, 0.496338f, 0.563477f, 0.485840f, 0.570312f, 0.476807f, + 0.576660f, 0.467529f, 0.583496f, 0.458740f, 0.590332f, 0.449951f, 0.596680f, 0.441406f, + 0.603516f, 0.432373f, 0.608887f, 0.424316f, 0.615723f, 0.416260f, 0.621094f, 0.408691f, + 0.627441f, 0.400879f, 0.632324f, 0.393311f, 0.637695f, 0.386230f, 0.642090f, 0.379150f, + 0.648926f, 0.371338f, 0.652344f, 0.364746f, 0.657715f, 0.357666f, 0.662109f, 0.350830f, + 0.668457f, 0.343750f, 0.672363f, 0.336914f, 0.677246f, 0.330078f, 0.681152f, 0.323486f, + 0.685547f, 0.316650f, 0.690918f, 0.309570f, 0.694824f, 0.302734f, 0.698730f, 0.294678f, + 0.702148f, 0.287109f, 0.705566f, 0.279785f, 0.709961f, 0.271973f, 0.714844f, 0.264404f, + 0.716797f, 0.256348f, 0.721191f, 0.247192f, 0.724121f, 0.238525f, 0.727539f, 0.229248f, + 0.729004f, 0.218506f, 0.731445f, 0.207642f, 0.733887f, 0.196533f, 0.733887f, 0.181641f, + 0.732910f, 0.165039f, 0.727539f, 0.144409f, 0.716797f, 0.114136f, 0.676758f, 0.050964f, + 0.000000f, 1.000000f, 0.134399f, 0.941406f, 0.215210f, 0.882812f, 0.270264f, 0.835449f, + 0.312256f, 0.794434f, 0.344238f, 0.760254f, 0.372803f, 0.729492f, 0.396240f, 0.702637f, + 0.416748f, 0.677734f, 0.435303f, 0.655762f, 0.451660f, 0.635254f, 0.467529f, 0.616211f, + 0.480713f, 0.599121f, 0.493896f, 0.582520f, 0.506348f, 0.566895f, 0.517578f, 0.552734f, + 0.526855f, 0.539551f, 0.537598f, 0.526367f, 0.547852f, 0.513672f, 0.555664f, 0.502441f, + 0.564941f, 0.490723f, 0.573242f, 0.479980f, 0.581543f, 0.469238f, 0.588867f, 0.459229f, + 0.596191f, 0.449707f, 0.603516f, 0.440430f, 0.609863f, 0.431396f, 0.617676f, 0.422363f, + 0.625000f, 0.412842f, 0.631348f, 0.404541f, 0.637207f, 0.395996f, 0.644043f, 0.387695f, + 0.648926f, 0.380127f, 0.655273f, 0.371826f, 0.660156f, 0.364746f, 0.666016f, 0.356934f, + 0.671875f, 0.349365f, 0.677734f, 0.342041f, 0.681152f, 0.334961f, 0.686523f, 0.327881f, + 0.692871f, 0.320801f, 0.697266f, 0.313477f, 0.701660f, 0.306396f, 0.707031f, 0.299805f, + 0.710938f, 0.292725f, 0.716309f, 0.285400f, 0.721191f, 0.278564f, 0.725586f, 0.271240f, + 0.729004f, 0.263428f, 0.732910f, 0.255859f, 0.737305f, 0.247803f, 0.741211f, 0.240356f, + 0.745117f, 0.232300f, 0.748047f, 0.224121f, 0.751953f, 0.214844f, 0.756348f, 0.205933f, + 0.756836f, 0.196167f, 0.760254f, 0.185547f, 0.762207f, 0.174072f, 0.762695f, 0.160645f, + 0.762207f, 0.145752f, 0.759277f, 0.127075f, 0.750977f, 0.098389f, 0.716797f, 0.042633f, + 0.000000f, 1.000000f, 0.136841f, 0.939941f, 0.216919f, 0.882324f, 0.274414f, 0.832520f, + 0.317383f, 0.791016f, 0.353027f, 0.754883f, 0.380127f, 0.724121f, 0.405273f, 0.695801f, + 0.426758f, 0.670410f, 0.447021f, 0.646973f, 0.463867f, 0.625977f, 0.479980f, 0.606445f, + 0.494385f, 0.587891f, 0.507812f, 0.570801f, 0.521973f, 0.554688f, 0.532715f, 0.540039f, + 0.542480f, 0.525879f, 0.554688f, 0.511719f, 0.564453f, 0.499023f, 0.573730f, 0.486816f, + 0.583008f, 0.475098f, 0.591309f, 0.463623f, 0.600098f, 0.452393f, 0.609375f, 0.441650f, + 0.616211f, 0.432129f, 0.624023f, 0.422119f, 0.630371f, 0.412842f, 0.636719f, 0.403809f, + 0.645996f, 0.393799f, 0.651855f, 0.384766f, 0.659180f, 0.375977f, 0.665039f, 0.367920f, + 0.670898f, 0.359131f, 0.677246f, 0.351074f, 0.682617f, 0.343506f, 0.688965f, 0.335693f, + 0.694336f, 0.327881f, 0.700684f, 0.320312f, 0.704102f, 0.313232f, 0.709961f, 0.305908f, + 0.716309f, 0.298340f, 0.720703f, 0.291260f, 0.726074f, 0.283936f, 0.730469f, 0.277344f, + 0.734863f, 0.270264f, 0.740234f, 0.262939f, 0.745117f, 0.255859f, 0.749023f, 0.249268f, + 0.753418f, 0.241333f, 0.757812f, 0.233398f, 0.760742f, 0.225952f, 0.766113f, 0.218140f, + 0.769531f, 0.210449f, 0.773926f, 0.202759f, 0.775391f, 0.193970f, 0.780273f, 0.184814f, + 0.783691f, 0.175537f, 0.785156f, 0.165771f, 0.787598f, 0.154907f, 0.789551f, 0.142700f, + 0.790039f, 0.128906f, 0.788086f, 0.110474f, 0.780273f, 0.086975f, 0.752930f, 0.036133f, + 0.000000f, 1.000000f, 0.138306f, 0.939453f, 0.219360f, 0.881348f, 0.279053f, 0.830078f, + 0.323486f, 0.787598f, 0.359863f, 0.750488f, 0.389893f, 0.717285f, 0.415039f, 0.688965f, + 0.438232f, 0.662109f, 0.457275f, 0.638672f, 0.475098f, 0.616699f, 0.492676f, 0.596191f, + 0.508301f, 0.577148f, 0.522949f, 0.559082f, 0.536133f, 0.542480f, 0.546875f, 0.526855f, + 0.559570f, 0.512207f, 0.569824f, 0.498535f, 0.581543f, 0.484131f, 0.592285f, 0.471436f, + 0.601562f, 0.459229f, 0.609863f, 0.447510f, 0.619629f, 0.435791f, 0.627930f, 0.424805f, + 0.635254f, 0.414795f, 0.642578f, 0.404297f, 0.650879f, 0.394287f, 0.656250f, 0.385498f, + 0.665039f, 0.375244f, 0.672852f, 0.365723f, 0.679199f, 0.357178f, 0.686035f, 0.348145f, + 0.692383f, 0.339355f, 0.698242f, 0.331299f, 0.703613f, 0.323242f, 0.709961f, 0.315430f, + 0.716797f, 0.307129f, 0.721191f, 0.299805f, 0.726074f, 0.292236f, 0.733398f, 0.284668f, + 0.736328f, 0.277588f, 0.742676f, 0.270020f, 0.748047f, 0.262939f, 0.751465f, 0.256348f, + 0.757324f, 0.249023f, 0.763672f, 0.241333f, 0.766113f, 0.235352f, 0.771484f, 0.228027f, + 0.776855f, 0.221191f, 0.778809f, 0.213257f, 0.783691f, 0.205322f, 0.787598f, 0.197876f, + 0.792480f, 0.190186f, 0.796387f, 0.182739f, 0.798828f, 0.174805f, 0.803223f, 0.165405f, + 0.805664f, 0.157227f, 0.809082f, 0.147827f, 0.811035f, 0.137695f, 0.813477f, 0.125977f, + 0.813477f, 0.113586f, 0.812012f, 0.096863f, 0.805664f, 0.073975f, 0.784668f, 0.031372f, + 0.000000f, 1.000000f, 0.138794f, 0.939453f, 0.224365f, 0.878418f, 0.282959f, 0.827637f, + 0.329102f, 0.783691f, 0.366699f, 0.745605f, 0.397461f, 0.712402f, 0.424316f, 0.682129f, + 0.447510f, 0.654785f, 0.470459f, 0.629395f, 0.489014f, 0.606934f, 0.505859f, 0.585938f, + 0.521484f, 0.565918f, 0.536133f, 0.547363f, 0.550293f, 0.530273f, 0.563477f, 0.513672f, + 0.575684f, 0.498535f, 0.585938f, 0.484619f, 0.598145f, 0.469727f, 0.607910f, 0.456787f, + 0.617676f, 0.443848f, 0.626465f, 0.431885f, 0.637207f, 0.419434f, 0.645508f, 0.408203f, + 0.654785f, 0.397461f, 0.660645f, 0.386963f, 0.669434f, 0.376709f, 0.675781f, 0.367432f, + 0.684570f, 0.357422f, 0.691406f, 0.347412f, 0.698730f, 0.338623f, 0.705566f, 0.329346f, + 0.712402f, 0.320312f, 0.718262f, 0.312012f, 0.723633f, 0.303955f, 0.730469f, 0.295654f, + 0.736328f, 0.287842f, 0.742676f, 0.279785f, 0.746094f, 0.272705f, 0.752930f, 0.264893f, + 0.757812f, 0.257812f, 0.763184f, 0.250000f, 0.769043f, 0.243286f, 0.772949f, 0.236450f, + 0.778809f, 0.229004f, 0.783691f, 0.222168f, 0.787598f, 0.215210f, 0.791016f, 0.208862f, + 0.797852f, 0.201538f, 0.801270f, 0.194458f, 0.804199f, 0.186890f, 0.809570f, 0.179443f, + 0.812012f, 0.172485f, 0.816895f, 0.164429f, 0.820801f, 0.156982f, 0.823242f, 0.148804f, + 0.826172f, 0.140747f, 0.829590f, 0.131836f, 0.832031f, 0.121643f, 0.833984f, 0.111877f, + 0.834473f, 0.100220f, 0.833008f, 0.084961f, 0.828613f, 0.065186f, 0.809570f, 0.026352f, + 0.000000f, 1.000000f, 0.140015f, 0.938965f, 0.226318f, 0.877441f, 0.288818f, 0.824219f, + 0.335449f, 0.779785f, 0.373779f, 0.741211f, 0.406006f, 0.706543f, 0.435059f, 0.674805f, + 0.458740f, 0.646973f, 0.481445f, 0.620605f, 0.500000f, 0.597656f, 0.517578f, 0.575684f, + 0.535156f, 0.554688f, 0.550781f, 0.535645f, 0.563965f, 0.518066f, 0.577637f, 0.500977f, + 0.589844f, 0.485352f, 0.602051f, 0.470459f, 0.613770f, 0.455566f, 0.623535f, 0.441895f, + 0.634277f, 0.428467f, 0.643555f, 0.416260f, 0.654297f, 0.403809f, 0.663086f, 0.391846f, + 0.671875f, 0.380615f, 0.681152f, 0.369629f, 0.686523f, 0.359619f, 0.695312f, 0.349854f, + 0.701172f, 0.340088f, 0.710449f, 0.329834f, 0.717773f, 0.320557f, 0.724121f, 0.311523f, + 0.730957f, 0.302246f, 0.737305f, 0.293945f, 0.743164f, 0.285645f, 0.749512f, 0.277100f, + 0.754883f, 0.269287f, 0.761230f, 0.261230f, 0.766113f, 0.254150f, 0.771973f, 0.246216f, + 0.777832f, 0.238770f, 0.782715f, 0.231812f, 0.787109f, 0.224731f, 0.792480f, 0.217773f, + 0.797852f, 0.210693f, 0.801758f, 0.203735f, 0.807617f, 0.197021f, 0.811035f, 0.190674f, + 0.815430f, 0.183716f, 0.820801f, 0.176880f, 0.823730f, 0.170044f, 0.827148f, 0.162720f, + 0.830566f, 0.155273f, 0.834961f, 0.148071f, 0.839355f, 0.141113f, 0.842285f, 0.134399f, + 0.845215f, 0.125366f, 0.848633f, 0.117004f, 0.850098f, 0.108765f, 0.852051f, 0.099304f, + 0.853516f, 0.087769f, 0.853516f, 0.074890f, 0.850098f, 0.056458f, 0.834473f, 0.023911f, + 0.000000f, 1.000000f, 0.141235f, 0.938477f, 0.229614f, 0.875977f, 0.292725f, 0.822266f, + 0.341797f, 0.775879f, 0.381836f, 0.735840f, 0.414062f, 0.700195f, 0.444092f, 0.667969f, + 0.468994f, 0.638672f, 0.492432f, 0.612305f, 0.512207f, 0.587891f, 0.530762f, 0.565430f, + 0.548828f, 0.543945f, 0.563965f, 0.524414f, 0.578613f, 0.505859f, 0.592285f, 0.488525f, + 0.605957f, 0.471924f, 0.618164f, 0.456299f, 0.630371f, 0.441406f, 0.640625f, 0.427002f, + 0.652344f, 0.413086f, 0.662109f, 0.400635f, 0.670410f, 0.388428f, 0.680176f, 0.375977f, + 0.688477f, 0.364990f, 0.697266f, 0.353271f, 0.705566f, 0.342773f, 0.712891f, 0.332764f, + 0.719727f, 0.322998f, 0.728027f, 0.312988f, 0.734863f, 0.303711f, 0.742188f, 0.293945f, + 0.749023f, 0.284912f, 0.755859f, 0.276123f, 0.761230f, 0.267822f, 0.768066f, 0.259277f, + 0.772461f, 0.251709f, 0.779297f, 0.243652f, 0.785156f, 0.236206f, 0.789551f, 0.228882f, + 0.795410f, 0.221191f, 0.799805f, 0.214355f, 0.804688f, 0.207520f, 0.810059f, 0.200317f, + 0.815430f, 0.193604f, 0.819336f, 0.186646f, 0.823242f, 0.180542f, 0.828613f, 0.173828f, + 0.833496f, 0.166992f, 0.837891f, 0.160889f, 0.841309f, 0.154663f, 0.845703f, 0.147705f, + 0.847656f, 0.140381f, 0.852051f, 0.133301f, 0.854980f, 0.126831f, 0.858398f, 0.120117f, + 0.861328f, 0.112610f, 0.864258f, 0.104553f, 0.867676f, 0.096863f, 0.868652f, 0.087402f, + 0.870117f, 0.078186f, 0.869141f, 0.066406f, 0.868652f, 0.049530f, 0.854004f, 0.019684f, + 0.000000f, 1.000000f, 0.141724f, 0.938477f, 0.232910f, 0.874023f, 0.298096f, 0.819336f, + 0.347656f, 0.771973f, 0.388184f, 0.730957f, 0.423340f, 0.694336f, 0.453613f, 0.660645f, + 0.479492f, 0.630859f, 0.503906f, 0.603516f, 0.524902f, 0.578125f, 0.543457f, 0.554688f, + 0.562500f, 0.532715f, 0.577148f, 0.513184f, 0.592773f, 0.493896f, 0.607910f, 0.475586f, + 0.621094f, 0.458496f, 0.633301f, 0.442871f, 0.644043f, 0.427979f, 0.656250f, 0.413086f, + 0.667480f, 0.398682f, 0.677734f, 0.385498f, 0.687988f, 0.373047f, 0.696777f, 0.360596f, + 0.704590f, 0.349121f, 0.714355f, 0.337158f, 0.721680f, 0.326660f, 0.729980f, 0.316406f, + 0.737793f, 0.306152f, 0.743652f, 0.297119f, 0.751953f, 0.287109f, 0.759277f, 0.277588f, + 0.766113f, 0.268311f, 0.770996f, 0.260010f, 0.778809f, 0.250977f, 0.784180f, 0.242920f, + 0.790039f, 0.234985f, 0.794922f, 0.227539f, 0.802734f, 0.219360f, 0.806152f, 0.212280f, + 0.812012f, 0.204956f, 0.816895f, 0.197998f, 0.820801f, 0.191406f, 0.826660f, 0.184082f, + 0.830078f, 0.177979f, 0.835938f, 0.171021f, 0.839844f, 0.164917f, 0.844238f, 0.158569f, + 0.849121f, 0.152100f, 0.853516f, 0.145996f, 0.856445f, 0.140381f, 0.861816f, 0.133911f, + 0.863770f, 0.126953f, 0.866699f, 0.120483f, 0.870605f, 0.114136f, 0.874023f, 0.107361f, + 0.876953f, 0.100830f, 0.878418f, 0.093567f, 0.882324f, 0.085754f, 0.884277f, 0.078369f, + 0.885254f, 0.068787f, 0.887207f, 0.057587f, 0.884277f, 0.043793f, 0.875000f, 0.016937f, + 0.000000f, 1.000000f, 0.143066f, 0.937500f, 0.235352f, 0.872559f, 0.302002f, 0.816895f, + 0.354004f, 0.768066f, 0.395996f, 0.726074f, 0.432373f, 0.687500f, 0.463623f, 0.653809f, + 0.490479f, 0.622559f, 0.514648f, 0.594727f, 0.535645f, 0.569336f, 0.557617f, 0.544434f, + 0.575195f, 0.522461f, 0.591309f, 0.501465f, 0.606445f, 0.481934f, 0.621582f, 0.463379f, + 0.635254f, 0.446289f, 0.647461f, 0.429443f, 0.660156f, 0.413818f, 0.672363f, 0.398682f, + 0.684082f, 0.384033f, 0.693359f, 0.370850f, 0.704102f, 0.357910f, 0.712891f, 0.345703f, + 0.721680f, 0.333984f, 0.729492f, 0.322021f, 0.737305f, 0.311279f, 0.746094f, 0.300537f, + 0.754883f, 0.290283f, 0.760254f, 0.281006f, 0.766602f, 0.271973f, 0.774414f, 0.261963f, + 0.783203f, 0.252197f, 0.788086f, 0.244141f, 0.794434f, 0.235596f, 0.801758f, 0.226685f, + 0.806152f, 0.219482f, 0.811523f, 0.211548f, 0.818359f, 0.203857f, 0.821777f, 0.196899f, + 0.828125f, 0.189697f, 0.832031f, 0.182861f, 0.835938f, 0.176270f, 0.841309f, 0.169434f, + 0.846191f, 0.162964f, 0.850098f, 0.157104f, 0.854980f, 0.150269f, 0.858887f, 0.144409f, + 0.863281f, 0.138428f, 0.866699f, 0.132812f, 0.870605f, 0.126953f, 0.875000f, 0.120972f, + 0.878418f, 0.115234f, 0.879883f, 0.109131f, 0.883789f, 0.102234f, 0.886719f, 0.096008f, + 0.890137f, 0.089905f, 0.894043f, 0.084045f, 0.895996f, 0.076233f, 0.897461f, 0.068970f, + 0.899414f, 0.060028f, 0.899902f, 0.050995f, 0.898438f, 0.037994f, 0.891602f, 0.014374f, + 0.000000f, 1.000000f, 0.145142f, 0.936523f, 0.239258f, 0.870605f, 0.307861f, 0.813477f, + 0.360352f, 0.764160f, 0.404053f, 0.720703f, 0.441650f, 0.681641f, 0.473877f, 0.646484f, + 0.500977f, 0.615234f, 0.526367f, 0.585449f, 0.548828f, 0.559082f, 0.568848f, 0.534668f, + 0.587402f, 0.511719f, 0.604980f, 0.489990f, 0.621582f, 0.469971f, 0.636230f, 0.450684f, + 0.649414f, 0.433594f, 0.662109f, 0.416260f, 0.675293f, 0.400391f, 0.686035f, 0.385498f, + 0.698730f, 0.370361f, 0.708496f, 0.356689f, 0.717773f, 0.343994f, 0.728027f, 0.331299f, + 0.737305f, 0.319092f, 0.746094f, 0.307373f, 0.753906f, 0.296143f, 0.762207f, 0.285400f, + 0.769531f, 0.275146f, 0.776367f, 0.265625f, 0.782715f, 0.256592f, 0.790527f, 0.247070f, + 0.796387f, 0.238159f, 0.803711f, 0.229004f, 0.809082f, 0.220825f, 0.814941f, 0.212280f, + 0.820801f, 0.204590f, 0.825684f, 0.197144f, 0.832031f, 0.189453f, 0.836426f, 0.182373f, + 0.841309f, 0.175903f, 0.846191f, 0.168701f, 0.851074f, 0.162109f, 0.854980f, 0.155762f, + 0.859863f, 0.149414f, 0.863281f, 0.143677f, 0.867676f, 0.137329f, 0.872070f, 0.131592f, + 0.875000f, 0.126221f, 0.881348f, 0.119995f, 0.882812f, 0.114868f, 0.887695f, 0.109253f, + 0.890625f, 0.104370f, 0.894531f, 0.097961f, 0.895996f, 0.091980f, 0.898926f, 0.086060f, + 0.902344f, 0.080261f, 0.905762f, 0.074219f, 0.908203f, 0.067993f, 0.908691f, 0.061157f, + 0.912598f, 0.053375f, 0.913574f, 0.045044f, 0.911133f, 0.033325f, 0.904785f, 0.012718f, + 0.000000f, 1.000000f, 0.146484f, 0.936035f, 0.240601f, 0.870117f, 0.311035f, 0.811523f, + 0.367188f, 0.760254f, 0.412109f, 0.715332f, 0.448975f, 0.675781f, 0.483398f, 0.639160f, + 0.511230f, 0.606934f, 0.537109f, 0.577148f, 0.560059f, 0.549805f, 0.581055f, 0.524414f, + 0.601562f, 0.500488f, 0.619141f, 0.478760f, 0.635254f, 0.458008f, 0.650879f, 0.438232f, + 0.664062f, 0.420654f, 0.677246f, 0.403320f, 0.689453f, 0.387207f, 0.700684f, 0.372070f, + 0.712891f, 0.357422f, 0.722168f, 0.343018f, 0.733398f, 0.329590f, 0.742188f, 0.317139f, + 0.750488f, 0.305420f, 0.760742f, 0.292969f, 0.769531f, 0.281738f, 0.775391f, 0.271729f, + 0.783203f, 0.260742f, 0.791016f, 0.251221f, 0.797852f, 0.241943f, 0.804199f, 0.232910f, + 0.810059f, 0.224365f, 0.817383f, 0.215088f, 0.823242f, 0.206787f, 0.829102f, 0.198486f, + 0.834473f, 0.190796f, 0.840332f, 0.183350f, 0.845703f, 0.175781f, 0.850586f, 0.168945f, + 0.854980f, 0.162476f, 0.860352f, 0.155151f, 0.863770f, 0.149170f, 0.867676f, 0.143433f, + 0.874023f, 0.136719f, 0.875977f, 0.131104f, 0.880859f, 0.125244f, 0.883789f, 0.120178f, + 0.888672f, 0.114197f, 0.892090f, 0.108887f, 0.895996f, 0.103577f, 0.898438f, 0.098999f, + 0.902832f, 0.093079f, 0.905273f, 0.088623f, 0.907715f, 0.083313f, 0.910645f, 0.077087f, + 0.913574f, 0.071411f, 0.915527f, 0.066528f, 0.919922f, 0.059998f, 0.918945f, 0.054810f, + 0.921875f, 0.047058f, 0.922363f, 0.039581f, 0.922852f, 0.028900f, 0.917480f, 0.011467f, + 0.000000f, 1.000000f, 0.146973f, 0.936035f, 0.245117f, 0.867676f, 0.316650f, 0.808594f, + 0.372559f, 0.756348f, 0.419434f, 0.710449f, 0.458740f, 0.669434f, 0.492676f, 0.632324f, + 0.522461f, 0.598633f, 0.549316f, 0.567871f, 0.573242f, 0.539551f, 0.594727f, 0.513672f, + 0.613770f, 0.489990f, 0.631836f, 0.467529f, 0.648438f, 0.446533f, 0.664062f, 0.427002f, + 0.677734f, 0.408447f, 0.690918f, 0.391357f, 0.703125f, 0.374512f, 0.714844f, 0.358887f, + 0.726562f, 0.343994f, 0.737305f, 0.329590f, 0.747070f, 0.316162f, 0.757324f, 0.303467f, + 0.765137f, 0.291748f, 0.774414f, 0.279541f, 0.783203f, 0.268311f, 0.791016f, 0.257568f, + 0.797852f, 0.247192f, 0.804688f, 0.237915f, 0.812500f, 0.227905f, 0.817871f, 0.219360f, + 0.822266f, 0.211304f, 0.831055f, 0.201904f, 0.835938f, 0.193970f, 0.841309f, 0.185913f, + 0.848145f, 0.177734f, 0.852539f, 0.170654f, 0.857422f, 0.163208f, 0.862305f, 0.156738f, + 0.866699f, 0.150024f, 0.872070f, 0.143311f, 0.875488f, 0.137451f, 0.880859f, 0.131226f, + 0.884766f, 0.125244f, 0.887695f, 0.119751f, 0.891113f, 0.114868f, 0.895996f, 0.108765f, + 0.898926f, 0.103760f, 0.902344f, 0.098755f, 0.906250f, 0.093750f, 0.910645f, 0.088501f, + 0.912109f, 0.084106f, 0.916016f, 0.079773f, 0.919434f, 0.074585f, 0.920410f, 0.069763f, + 0.923340f, 0.063965f, 0.926270f, 0.058655f, 0.927734f, 0.053741f, 0.930664f, 0.048218f, + 0.931641f, 0.041534f, 0.933105f, 0.034637f, 0.932129f, 0.025131f, 0.928711f, 0.010117f, + 0.000000f, 1.000000f, 0.148193f, 0.935547f, 0.248779f, 0.865723f, 0.322021f, 0.805176f, + 0.379150f, 0.752441f, 0.427734f, 0.705078f, 0.469238f, 0.662598f, 0.503418f, 0.625000f, + 0.534180f, 0.590820f, 0.561035f, 0.559570f, 0.585449f, 0.530273f, 0.606445f, 0.503906f, + 0.626465f, 0.479492f, 0.644531f, 0.456543f, 0.663574f, 0.434326f, 0.677246f, 0.415039f, + 0.690430f, 0.396484f, 0.704590f, 0.378662f, 0.717285f, 0.362061f, 0.729004f, 0.345947f, + 0.740234f, 0.331299f, 0.750488f, 0.317139f, 0.762207f, 0.302979f, 0.769531f, 0.290527f, + 0.779297f, 0.278320f, 0.788086f, 0.266602f, 0.795898f, 0.255859f, 0.804688f, 0.244385f, + 0.811035f, 0.234375f, 0.817871f, 0.224609f, 0.825195f, 0.214966f, 0.830078f, 0.206543f, + 0.835938f, 0.198242f, 0.842285f, 0.189819f, 0.847656f, 0.181885f, 0.854492f, 0.173584f, + 0.860352f, 0.165649f, 0.864258f, 0.158813f, 0.870117f, 0.151733f, 0.874512f, 0.144653f, + 0.878418f, 0.138550f, 0.882324f, 0.132446f, 0.888184f, 0.126099f, 0.890137f, 0.120605f, + 0.895020f, 0.114868f, 0.897949f, 0.109680f, 0.903320f, 0.104126f, 0.905273f, 0.098938f, + 0.908203f, 0.094788f, 0.913086f, 0.089050f, 0.915527f, 0.084595f, 0.918945f, 0.080139f, + 0.922363f, 0.075439f, 0.924316f, 0.071228f, 0.928223f, 0.066833f, 0.931152f, 0.062439f, + 0.932617f, 0.057434f, 0.935059f, 0.052216f, 0.937012f, 0.047180f, 0.939453f, 0.042236f, + 0.941895f, 0.037201f, 0.941406f, 0.030228f, 0.942383f, 0.022018f, 0.938965f, 0.009247f, + 0.000000f, 1.000000f, 0.149658f, 0.935059f, 0.251465f, 0.864746f, 0.327393f, 0.802246f, + 0.386963f, 0.747559f, 0.437500f, 0.699219f, 0.478027f, 0.656250f, 0.512207f, 0.618164f, + 0.545410f, 0.582031f, 0.572266f, 0.550293f, 0.597168f, 0.520996f, 0.617188f, 0.494629f, + 0.639648f, 0.468750f, 0.657715f, 0.445557f, 0.674805f, 0.423828f, 0.690430f, 0.403564f, + 0.705078f, 0.384521f, 0.718750f, 0.366211f, 0.730469f, 0.350098f, 0.743164f, 0.333496f, + 0.754395f, 0.318604f, 0.763672f, 0.304688f, 0.774902f, 0.290771f, 0.783203f, 0.277832f, + 0.791992f, 0.265625f, 0.800781f, 0.253906f, 0.808105f, 0.243652f, 0.815918f, 0.232300f, + 0.822266f, 0.222534f, 0.831055f, 0.212036f, 0.835938f, 0.203369f, 0.842773f, 0.194458f, + 0.848145f, 0.186035f, 0.853516f, 0.178101f, 0.859863f, 0.170532f, 0.865234f, 0.162476f, + 0.870605f, 0.154785f, 0.875977f, 0.147949f, 0.879883f, 0.140869f, 0.885254f, 0.134033f, + 0.888184f, 0.128540f, 0.895508f, 0.121582f, 0.897461f, 0.115967f, 0.900391f, 0.111206f, + 0.905762f, 0.104736f, 0.908203f, 0.099854f, 0.911621f, 0.095276f, 0.916504f, 0.089600f, + 0.917969f, 0.085327f, 0.921387f, 0.080933f, 0.925293f, 0.075928f, 0.927734f, 0.072021f, + 0.931152f, 0.067566f, 0.933594f, 0.063538f, 0.936035f, 0.059662f, 0.939453f, 0.055511f, + 0.941406f, 0.051605f, 0.942871f, 0.046936f, 0.944824f, 0.041626f, 0.946289f, 0.037415f, + 0.949219f, 0.032440f, 0.949219f, 0.026672f, 0.950684f, 0.019394f, 0.947754f, 0.007217f, + 0.000000f, 1.000000f, 0.151489f, 0.934082f, 0.255127f, 0.862793f, 0.331787f, 0.799805f, + 0.393066f, 0.743652f, 0.444336f, 0.693848f, 0.486328f, 0.649902f, 0.522949f, 0.610352f, + 0.554688f, 0.574707f, 0.584473f, 0.541016f, 0.607422f, 0.512207f, 0.631348f, 0.484131f, + 0.652344f, 0.458496f, 0.670410f, 0.434814f, 0.687012f, 0.413086f, 0.702148f, 0.392578f, + 0.717285f, 0.373291f, 0.730957f, 0.354980f, 0.743164f, 0.338135f, 0.754883f, 0.322266f, + 0.766602f, 0.306641f, 0.775879f, 0.292480f, 0.786621f, 0.279053f, 0.794922f, 0.266357f, + 0.805176f, 0.253418f, 0.812988f, 0.242188f, 0.819336f, 0.231567f, 0.826660f, 0.221069f, + 0.834961f, 0.210693f, 0.841797f, 0.200928f, 0.846680f, 0.192139f, 0.854980f, 0.182617f, + 0.858887f, 0.174805f, 0.865234f, 0.166748f, 0.870117f, 0.159302f, 0.874023f, 0.152222f, + 0.880371f, 0.145142f, 0.886230f, 0.137329f, 0.890137f, 0.131104f, 0.895996f, 0.123962f, + 0.898926f, 0.118225f, 0.903320f, 0.112427f, 0.907227f, 0.106445f, 0.909668f, 0.101562f, + 0.914551f, 0.095886f, 0.916992f, 0.091309f, 0.921387f, 0.086060f, 0.923828f, 0.081604f, + 0.927246f, 0.077209f, 0.930176f, 0.072632f, 0.932617f, 0.068604f, 0.935547f, 0.064636f, + 0.938965f, 0.060486f, 0.941406f, 0.056458f, 0.944336f, 0.052948f, 0.946777f, 0.049133f, + 0.948242f, 0.045837f, 0.952148f, 0.041809f, 0.952637f, 0.037231f, 0.954102f, 0.032837f, + 0.955566f, 0.028427f, 0.957520f, 0.023804f, 0.958008f, 0.016418f, 0.956543f, 0.006493f, + 0.000000f, 1.000000f, 0.151978f, 0.934082f, 0.257812f, 0.861328f, 0.337158f, 0.796387f, + 0.401123f, 0.739258f, 0.452148f, 0.688965f, 0.495850f, 0.643555f, 0.532715f, 0.603027f, + 0.565430f, 0.566406f, 0.593750f, 0.533203f, 0.620605f, 0.502441f, 0.642578f, 0.474609f, + 0.662598f, 0.448975f, 0.682617f, 0.424561f, 0.698730f, 0.402588f, 0.714355f, 0.382080f, + 0.730957f, 0.361572f, 0.743652f, 0.343506f, 0.756348f, 0.326416f, 0.766602f, 0.310547f, + 0.778320f, 0.295166f, 0.788574f, 0.281006f, 0.798828f, 0.267090f, 0.807617f, 0.254883f, + 0.816406f, 0.242554f, 0.824219f, 0.231201f, 0.832031f, 0.219727f, 0.838867f, 0.209717f, + 0.845703f, 0.200073f, 0.852539f, 0.190308f, 0.859375f, 0.180908f, 0.863770f, 0.172607f, + 0.871094f, 0.164185f, 0.875977f, 0.156128f, 0.880371f, 0.149292f, 0.885742f, 0.141846f, + 0.889648f, 0.135376f, 0.895020f, 0.128540f, 0.899902f, 0.121704f, 0.904297f, 0.115173f, + 0.908203f, 0.109375f, 0.912109f, 0.103638f, 0.915039f, 0.098206f, 0.919434f, 0.092773f, + 0.922363f, 0.088074f, 0.926270f, 0.082886f, 0.929688f, 0.078186f, 0.932129f, 0.074097f, + 0.934570f, 0.069885f, 0.937500f, 0.065552f, 0.940918f, 0.061493f, 0.943359f, 0.057678f, + 0.945801f, 0.054138f, 0.948242f, 0.050293f, 0.950195f, 0.047058f, 0.953125f, 0.043488f, + 0.956055f, 0.039917f, 0.957520f, 0.037048f, 0.960938f, 0.033264f, 0.960938f, 0.029175f, + 0.963379f, 0.024429f, 0.963379f, 0.020630f, 0.965332f, 0.014359f, 0.963867f, 0.005737f, + 0.000000f, 1.000000f, 0.154053f, 0.933105f, 0.260986f, 0.859863f, 0.342041f, 0.793457f, + 0.406982f, 0.735352f, 0.460693f, 0.683105f, 0.504395f, 0.637207f, 0.543945f, 0.595703f, + 0.575684f, 0.558594f, 0.604004f, 0.524902f, 0.630859f, 0.493408f, 0.654297f, 0.464600f, + 0.673828f, 0.438965f, 0.695312f, 0.414062f, 0.710938f, 0.392334f, 0.726074f, 0.371094f, + 0.742188f, 0.351074f, 0.755859f, 0.332520f, 0.768555f, 0.315430f, 0.778320f, 0.299805f, + 0.790039f, 0.284180f, 0.801758f, 0.269775f, 0.810059f, 0.256348f, 0.818848f, 0.243652f, + 0.825684f, 0.232422f, 0.835938f, 0.219849f, 0.841797f, 0.209595f, 0.850098f, 0.198853f, + 0.854980f, 0.189819f, 0.862793f, 0.180176f, 0.868652f, 0.171265f, 0.874512f, 0.162476f, + 0.880859f, 0.154297f, 0.884766f, 0.146851f, 0.890137f, 0.139160f, 0.894531f, 0.132446f, + 0.899414f, 0.125610f, 0.902832f, 0.119873f, 0.907227f, 0.113647f, 0.912109f, 0.107483f, + 0.916016f, 0.101196f, 0.919922f, 0.095642f, 0.924316f, 0.090027f, 0.927246f, 0.085022f, + 0.930664f, 0.080200f, 0.934082f, 0.075562f, 0.936523f, 0.071167f, 0.940430f, 0.066650f, + 0.941406f, 0.063049f, 0.944824f, 0.058929f, 0.947266f, 0.055206f, 0.949707f, 0.051575f, + 0.953613f, 0.047729f, 0.954590f, 0.044525f, 0.957031f, 0.041412f, 0.959961f, 0.037964f, + 0.961914f, 0.035004f, 0.963867f, 0.032135f, 0.966309f, 0.028809f, 0.968262f, 0.026031f, + 0.968262f, 0.021774f, 0.969238f, 0.017258f, 0.971191f, 0.012901f, 0.971191f, 0.004601f, + 0.000000f, 1.000000f, 0.154663f, 0.933105f, 0.264160f, 0.857910f, 0.348389f, 0.790039f, + 0.415283f, 0.730469f, 0.468750f, 0.677734f, 0.514648f, 0.630371f, 0.552734f, 0.588867f, + 0.586914f, 0.550293f, 0.615723f, 0.515625f, 0.643066f, 0.484375f, 0.666016f, 0.455566f, + 0.685547f, 0.429443f, 0.705078f, 0.404541f, 0.722656f, 0.381592f, 0.737793f, 0.360840f, + 0.752930f, 0.341064f, 0.766602f, 0.322266f, 0.778809f, 0.305176f, 0.790527f, 0.289062f, + 0.800293f, 0.273926f, 0.810547f, 0.259521f, 0.822266f, 0.245728f, 0.829102f, 0.233521f, + 0.837402f, 0.221436f, 0.844727f, 0.210449f, 0.853516f, 0.199219f, 0.860352f, 0.188843f, + 0.866211f, 0.179321f, 0.871582f, 0.170410f, 0.877441f, 0.161987f, 0.884277f, 0.153442f, + 0.889648f, 0.145142f, 0.894531f, 0.137451f, 0.899902f, 0.130249f, 0.903320f, 0.123535f, + 0.907715f, 0.117004f, 0.911621f, 0.111023f, 0.915039f, 0.105286f, 0.918457f, 0.099854f, + 0.923828f, 0.093994f, 0.926758f, 0.088501f, 0.931152f, 0.082947f, 0.934570f, 0.078064f, + 0.937988f, 0.073120f, 0.939941f, 0.068909f, 0.944824f, 0.064209f, 0.945801f, 0.060516f, + 0.949707f, 0.056488f, 0.951660f, 0.052734f, 0.954590f, 0.049194f, 0.956055f, 0.045837f, + 0.958984f, 0.042358f, 0.961426f, 0.039032f, 0.962402f, 0.036591f, 0.965820f, 0.033020f, + 0.966797f, 0.030685f, 0.969238f, 0.027573f, 0.972656f, 0.024414f, 0.973145f, 0.022232f, + 0.975098f, 0.019608f, 0.976562f, 0.014435f, 0.976074f, 0.010353f, 0.976562f, 0.003431f, + 0.000000f, 1.000000f, 0.156128f, 0.932129f, 0.267578f, 0.856445f, 0.353027f, 0.787109f, + 0.419922f, 0.727051f, 0.476074f, 0.672852f, 0.522949f, 0.624512f, 0.562988f, 0.581055f, + 0.597656f, 0.542480f, 0.627930f, 0.506836f, 0.654297f, 0.475342f, 0.676758f, 0.446045f, + 0.697754f, 0.419434f, 0.716797f, 0.394775f, 0.735352f, 0.371582f, 0.751953f, 0.349609f, + 0.765625f, 0.330078f, 0.778320f, 0.312012f, 0.789551f, 0.295166f, 0.800781f, 0.279053f, + 0.811523f, 0.263916f, 0.822266f, 0.249268f, 0.830078f, 0.236328f, 0.839844f, 0.223511f, + 0.847656f, 0.211548f, 0.855469f, 0.200317f, 0.861816f, 0.190063f, 0.868652f, 0.180176f, + 0.875977f, 0.170044f, 0.881348f, 0.161133f, 0.886230f, 0.152710f, 0.892090f, 0.144653f, + 0.895996f, 0.137451f, 0.902832f, 0.129395f, 0.906250f, 0.122375f, 0.912109f, 0.115112f, + 0.915527f, 0.109192f, 0.920410f, 0.102905f, 0.922852f, 0.097534f, 0.926270f, 0.092102f, + 0.930664f, 0.086914f, 0.932129f, 0.082336f, 0.937500f, 0.076965f, 0.940918f, 0.071777f, + 0.944336f, 0.067139f, 0.947266f, 0.062683f, 0.950195f, 0.058319f, 0.951660f, 0.054840f, + 0.955078f, 0.050842f, 0.958008f, 0.046997f, 0.960449f, 0.043640f, 0.961426f, 0.040894f, + 0.965332f, 0.036987f, 0.966797f, 0.034485f, 0.968262f, 0.031738f, 0.970703f, 0.028824f, + 0.972656f, 0.026047f, 0.974121f, 0.023590f, 0.976074f, 0.021194f, 0.978516f, 0.018341f, + 0.979492f, 0.016159f, 0.981445f, 0.013855f, 0.982422f, 0.008255f, 0.982422f, 0.003952f, + 0.000000f, 1.000000f, 0.157715f, 0.931641f, 0.271729f, 0.854492f, 0.358154f, 0.784668f, + 0.428223f, 0.721680f, 0.485840f, 0.666504f, 0.532227f, 0.617676f, 0.574219f, 0.573242f, + 0.606934f, 0.534668f, 0.637695f, 0.499023f, 0.665039f, 0.466309f, 0.688477f, 0.437012f, + 0.708984f, 0.409912f, 0.728027f, 0.385010f, 0.745605f, 0.361816f, 0.760742f, 0.340820f, + 0.774414f, 0.320801f, 0.788574f, 0.302246f, 0.801270f, 0.284912f, 0.812012f, 0.269043f, + 0.822754f, 0.253662f, 0.831055f, 0.240356f, 0.840820f, 0.226562f, 0.849121f, 0.213989f, + 0.856445f, 0.202759f, 0.864746f, 0.191162f, 0.871094f, 0.180664f, 0.876953f, 0.171143f, + 0.883789f, 0.161865f, 0.890137f, 0.152832f, 0.895020f, 0.144165f, 0.900879f, 0.135986f, + 0.906250f, 0.128418f, 0.908691f, 0.122192f, 0.914062f, 0.115112f, 0.918945f, 0.108215f, + 0.922852f, 0.101807f, 0.927734f, 0.095520f, 0.931641f, 0.090149f, 0.934570f, 0.084656f, + 0.937012f, 0.079956f, 0.939453f, 0.075500f, 0.942871f, 0.070679f, 0.945801f, 0.066650f, + 0.948730f, 0.062134f, 0.953613f, 0.056915f, 0.955078f, 0.053375f, 0.958008f, 0.049438f, + 0.961426f, 0.045441f, 0.962891f, 0.042084f, 0.965332f, 0.038757f, 0.967773f, 0.035767f, + 0.970215f, 0.032501f, 0.972168f, 0.029587f, 0.973633f, 0.027298f, 0.975586f, 0.024780f, + 0.978027f, 0.021866f, 0.979492f, 0.019547f, 0.980957f, 0.017548f, 0.982422f, 0.015434f, + 0.985352f, 0.012390f, 0.986328f, 0.010490f, 0.987793f, 0.008591f, 0.987305f, 0.001606f, + 0.000000f, 1.000000f, 0.158203f, 0.931641f, 0.274902f, 0.852539f, 0.364990f, 0.780762f, + 0.436279f, 0.717285f, 0.493408f, 0.661133f, 0.541504f, 0.611328f, 0.582031f, 0.566895f, + 0.618164f, 0.526855f, 0.648926f, 0.490967f, 0.674805f, 0.458008f, 0.698730f, 0.428223f, + 0.719238f, 0.400879f, 0.737793f, 0.375732f, 0.756348f, 0.352295f, 0.770996f, 0.331055f, + 0.785156f, 0.311523f, 0.799316f, 0.292480f, 0.809570f, 0.275879f, 0.822754f, 0.259277f, + 0.832031f, 0.244995f, 0.842285f, 0.230469f, 0.849121f, 0.217651f, 0.858398f, 0.205200f, + 0.865723f, 0.193604f, 0.872559f, 0.182739f, 0.879883f, 0.172607f, 0.886230f, 0.162476f, + 0.892090f, 0.153198f, 0.896973f, 0.144775f, 0.902832f, 0.136719f, 0.908691f, 0.128662f, + 0.914551f, 0.120911f, 0.917480f, 0.113953f, 0.921387f, 0.107544f, 0.925781f, 0.101135f, + 0.929199f, 0.095764f, 0.933105f, 0.089844f, 0.937012f, 0.083679f, 0.940430f, 0.078430f, + 0.944336f, 0.073486f, 0.946777f, 0.068665f, 0.949707f, 0.064392f, 0.951660f, 0.060516f, + 0.955566f, 0.056305f, 0.957031f, 0.052887f, 0.959473f, 0.049347f, 0.962891f, 0.045135f, + 0.966797f, 0.040771f, 0.968262f, 0.037537f, 0.970215f, 0.034515f, 0.972656f, 0.031403f, + 0.975586f, 0.028259f, 0.977051f, 0.025391f, 0.978027f, 0.023224f, 0.979980f, 0.020966f, + 0.981445f, 0.018677f, 0.984375f, 0.015701f, 0.985352f, 0.013809f, 0.986816f, 0.011986f, + 0.988281f, 0.010277f, 0.990723f, 0.007851f, 0.991699f, 0.005585f, 0.992676f, 0.003571f, + 0.000000f, 1.000000f, 0.161133f, 0.929688f, 0.278809f, 0.850586f, 0.370605f, 0.777344f, + 0.442383f, 0.712891f, 0.501465f, 0.655762f, 0.551758f, 0.604980f, 0.591797f, 0.559570f, + 0.628418f, 0.519043f, 0.658691f, 0.482422f, 0.685059f, 0.449707f, 0.709961f, 0.419189f, + 0.729980f, 0.391846f, 0.749512f, 0.366455f, 0.766113f, 0.343262f, 0.782715f, 0.321777f, + 0.795898f, 0.302002f, 0.810059f, 0.283447f, 0.819824f, 0.267090f, 0.830566f, 0.250732f, + 0.840332f, 0.236206f, 0.851074f, 0.221558f, 0.858398f, 0.209595f, 0.866699f, 0.196655f, + 0.874512f, 0.185181f, 0.880371f, 0.175049f, 0.888184f, 0.164062f, 0.893555f, 0.154907f, + 0.899414f, 0.145752f, 0.904785f, 0.137451f, 0.911133f, 0.128784f, 0.915039f, 0.121338f, + 0.919922f, 0.114441f, 0.923828f, 0.107666f, 0.928223f, 0.101013f, 0.932617f, 0.094666f, + 0.937012f, 0.088318f, 0.939941f, 0.083069f, 0.942871f, 0.078186f, 0.946289f, 0.073181f, + 0.949219f, 0.068359f, 0.952637f, 0.063416f, 0.955566f, 0.059052f, 0.959473f, 0.054321f, + 0.961426f, 0.050507f, 0.963379f, 0.047089f, 0.965332f, 0.043854f, 0.967773f, 0.040588f, + 0.969727f, 0.037262f, 0.970703f, 0.034882f, 0.974121f, 0.031403f, 0.976562f, 0.028198f, + 0.979004f, 0.024948f, 0.981934f, 0.021439f, 0.983398f, 0.019058f, 0.984863f, 0.017044f, + 0.986328f, 0.014915f, 0.987793f, 0.012901f, 0.990234f, 0.010391f, 0.991699f, 0.008072f, + 0.992676f, 0.006798f, 0.993652f, 0.005573f, 0.994629f, 0.004089f, 0.998535f, 0.000090f, + 0.000000f, 1.000000f, 0.161743f, 0.929688f, 0.280762f, 0.849609f, 0.374268f, 0.775391f, + 0.449463f, 0.708984f, 0.509277f, 0.650879f, 0.560547f, 0.598633f, 0.601074f, 0.553223f, + 0.636719f, 0.511719f, 0.667969f, 0.474854f, 0.696289f, 0.440918f, 0.718750f, 0.411377f, + 0.739258f, 0.383545f, 0.758789f, 0.358154f, 0.775879f, 0.335205f, 0.789551f, 0.314209f, + 0.803711f, 0.293945f, 0.817871f, 0.274658f, 0.831055f, 0.257324f, 0.838379f, 0.243164f, + 0.849609f, 0.227295f, 0.859375f, 0.213867f, 0.866699f, 0.200928f, 0.874023f, 0.189331f, + 0.882324f, 0.177490f, 0.889160f, 0.166626f, 0.895508f, 0.156982f, 0.901855f, 0.147339f, + 0.905273f, 0.139038f, 0.912109f, 0.130493f, 0.919434f, 0.121643f, 0.920898f, 0.114746f, + 0.925293f, 0.108765f, 0.931152f, 0.101074f, 0.936523f, 0.093201f, 0.936523f, 0.088928f, + 0.939941f, 0.084900f, 0.946289f, 0.077881f, 0.952637f, 0.070312f, 0.952637f, 0.066406f, + 0.952637f, 0.063599f, 0.952637f, 0.061371f, 0.960938f, 0.055145f, 0.968262f, 0.047913f, + 0.968262f, 0.044189f, 0.968262f, 0.041840f, 0.968262f, 0.040070f, 0.968262f, 0.038635f, + 0.971680f, 0.036346f, 0.979004f, 0.030014f, 0.983887f, 0.023743f, 0.983887f, 0.021423f, + 0.983887f, 0.019958f, 0.983887f, 0.018890f, 0.983887f, 0.018082f, 0.983887f, 0.017456f, + 0.983887f, 0.016953f, 0.987305f, 0.015465f, 0.999512f, 0.005238f, 0.999512f, 0.001760f, + 0.999512f, 0.000720f, 0.999512f, 0.000257f, 0.999512f, 0.000054f, 0.999512f, 0.000001f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.993164f, + 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.990234f, 0.000000f, 0.989746f, + 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.985352f, 0.000000f, 0.984375f, + 0.000000f, 0.982910f, 0.000000f, 0.979980f, 0.000000f, 0.978516f, 0.000000f, 0.977539f, + 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, + 0.000000f, 0.965820f, 0.000000f, 0.963379f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, + 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.942383f, + 0.000000f, 0.936523f, 0.000000f, 0.932617f, 0.000000f, 0.926270f, 0.000000f, 0.920410f, + 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f, + 0.000000f, 0.881836f, 0.000000f, 0.871582f, 0.000000f, 0.860352f, 0.000000f, 0.847168f, + 0.000000f, 0.832520f, 0.000000f, 0.816406f, 0.000000f, 0.796875f, 0.000000f, 0.774902f, + 0.000000f, 0.749023f, 0.000000f, 0.717773f, 0.000000f, 0.680664f, 0.000000f, 0.633789f, + 0.000000f, 0.574219f, 0.000000f, 0.492676f, 0.000000f, 0.367188f, 0.000000f, 0.140137f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.985352f, 0.000000f, 0.983887f, + 0.000000f, 0.982422f, 0.000000f, 0.980957f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.975098f, 0.000000f, 0.973145f, 0.000000f, 0.970703f, 0.000000f, 0.968262f, + 0.000000f, 0.965332f, 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, + 0.000000f, 0.953613f, 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941406f, + 0.000000f, 0.937012f, 0.000000f, 0.931641f, 0.000000f, 0.927246f, 0.000000f, 0.920410f, + 0.000000f, 0.914062f, 0.000000f, 0.907227f, 0.000000f, 0.899902f, 0.000000f, 0.891602f, + 0.000000f, 0.881836f, 0.000000f, 0.871094f, 0.000000f, 0.859375f, 0.000000f, 0.847168f, + 0.000000f, 0.832520f, 0.000000f, 0.815918f, 0.000000f, 0.796387f, 0.000000f, 0.774902f, + 0.000000f, 0.749512f, 0.000000f, 0.718262f, 0.000000f, 0.680176f, 0.000000f, 0.633789f, + 0.000002f, 0.574219f, 0.000002f, 0.492432f, 0.000001f, 0.367920f, 0.000001f, 0.139648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.992188f, 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984863f, 0.000000f, 0.983398f, + 0.000000f, 0.981934f, 0.000000f, 0.980469f, 0.000000f, 0.978516f, 0.000000f, 0.976562f, + 0.000000f, 0.974609f, 0.000000f, 0.972656f, 0.000000f, 0.970703f, 0.000000f, 0.967773f, + 0.000000f, 0.965332f, 0.000000f, 0.962402f, 0.000000f, 0.959473f, 0.000000f, 0.957031f, + 0.000000f, 0.952637f, 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940918f, + 0.000000f, 0.936523f, 0.000000f, 0.931641f, 0.000000f, 0.925781f, 0.000000f, 0.919922f, + 0.000000f, 0.913574f, 0.000000f, 0.906738f, 0.000000f, 0.899414f, 0.000000f, 0.890625f, + 0.000000f, 0.880859f, 0.000004f, 0.870605f, 0.000015f, 0.859375f, 0.000028f, 0.846680f, + 0.000034f, 0.832031f, 0.000036f, 0.814941f, 0.000035f, 0.795898f, 0.000032f, 0.773926f, + 0.000029f, 0.748535f, 0.000024f, 0.717285f, 0.000021f, 0.679688f, 0.000022f, 0.633301f, + 0.000019f, 0.573730f, 0.000018f, 0.492188f, 0.000014f, 0.367432f, 0.000011f, 0.139648f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.995117f, 0.000000f, 0.994141f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, + 0.000000f, 0.991699f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.988770f, + 0.000000f, 0.987305f, 0.000000f, 0.985840f, 0.000000f, 0.984375f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978516f, 0.000000f, 0.976074f, + 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969727f, 0.000000f, 0.967773f, + 0.000000f, 0.964355f, 0.000000f, 0.961426f, 0.000000f, 0.959473f, 0.000005f, 0.955566f, + 0.000016f, 0.952148f, 0.000031f, 0.948242f, 0.000048f, 0.943848f, 0.000066f, 0.939941f, + 0.000086f, 0.935547f, 0.000106f, 0.930664f, 0.000126f, 0.924805f, 0.000143f, 0.918945f, + 0.000147f, 0.912598f, 0.000148f, 0.905762f, 0.000146f, 0.897949f, 0.000139f, 0.889648f, + 0.000134f, 0.880371f, 0.000125f, 0.869629f, 0.000114f, 0.858398f, 0.000105f, 0.845215f, + 0.000097f, 0.830566f, 0.000101f, 0.813477f, 0.000109f, 0.794922f, 0.000100f, 0.772949f, + 0.000091f, 0.747070f, 0.000092f, 0.716309f, 0.000082f, 0.679199f, 0.000078f, 0.632324f, + 0.000073f, 0.572266f, 0.000067f, 0.491211f, 0.000064f, 0.367188f, 0.000046f, 0.139771f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, + 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.993164f, 0.000000f, 0.992676f, + 0.000000f, 0.991211f, 0.000000f, 0.990234f, 0.000000f, 0.989258f, 0.000000f, 0.987793f, + 0.000000f, 0.986816f, 0.000003f, 0.985840f, 0.000017f, 0.984375f, 0.000034f, 0.982422f, + 0.000059f, 0.980469f, 0.000081f, 0.979492f, 0.000108f, 0.977051f, 0.000135f, 0.975586f, + 0.000159f, 0.973633f, 0.000188f, 0.970703f, 0.000216f, 0.968750f, 0.000242f, 0.966309f, + 0.000268f, 0.964355f, 0.000298f, 0.960449f, 0.000324f, 0.957520f, 0.000348f, 0.954590f, + 0.000363f, 0.950684f, 0.000369f, 0.947266f, 0.000365f, 0.942871f, 0.000354f, 0.938965f, + 0.000342f, 0.934082f, 0.000332f, 0.929199f, 0.000316f, 0.923828f, 0.000298f, 0.917969f, + 0.000277f, 0.911133f, 0.000274f, 0.904297f, 0.000273f, 0.896973f, 0.000276f, 0.888184f, + 0.000283f, 0.878418f, 0.000287f, 0.868164f, 0.000278f, 0.856445f, 0.000261f, 0.843262f, + 0.000258f, 0.829102f, 0.000255f, 0.812012f, 0.000248f, 0.792969f, 0.000238f, 0.770996f, + 0.000245f, 0.745605f, 0.000226f, 0.714355f, 0.000214f, 0.677246f, 0.000220f, 0.631348f, + 0.000199f, 0.571777f, 0.000197f, 0.490234f, 0.000181f, 0.367188f, 0.000111f, 0.140015f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000018f, 0.995117f, + 0.000054f, 0.994141f, 0.000086f, 0.993164f, 0.000131f, 0.992676f, 0.000169f, 0.991699f, + 0.000204f, 0.990723f, 0.000250f, 0.989746f, 0.000289f, 0.988281f, 0.000323f, 0.987305f, + 0.000360f, 0.985840f, 0.000401f, 0.984863f, 0.000437f, 0.983398f, 0.000468f, 0.981934f, + 0.000498f, 0.979980f, 0.000537f, 0.978027f, 0.000571f, 0.976562f, 0.000600f, 0.974609f, + 0.000626f, 0.972168f, 0.000655f, 0.969727f, 0.000681f, 0.967773f, 0.000682f, 0.964844f, + 0.000671f, 0.962891f, 0.000651f, 0.959961f, 0.000630f, 0.956543f, 0.000613f, 0.952637f, + 0.000592f, 0.950195f, 0.000583f, 0.945312f, 0.000580f, 0.941406f, 0.000566f, 0.937500f, + 0.000577f, 0.932617f, 0.000588f, 0.927246f, 0.000599f, 0.921875f, 0.000609f, 0.916016f, + 0.000589f, 0.909180f, 0.000587f, 0.901855f, 0.000588f, 0.894531f, 0.000590f, 0.885742f, + 0.000592f, 0.876953f, 0.000561f, 0.866211f, 0.000566f, 0.854004f, 0.000570f, 0.841309f, + 0.000570f, 0.826660f, 0.000523f, 0.809570f, 0.000534f, 0.790527f, 0.000535f, 0.768555f, + 0.000530f, 0.743164f, 0.000490f, 0.712402f, 0.000494f, 0.675781f, 0.000496f, 0.629883f, + 0.000460f, 0.569824f, 0.000465f, 0.489746f, 0.000431f, 0.366455f, 0.000215f, 0.140747f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000034f, 0.998535f, 0.000105f, 0.998047f, 0.000179f, 0.998047f, 0.000242f, 0.997559f, + 0.000321f, 0.996582f, 0.000377f, 0.996582f, 0.000422f, 0.995605f, 0.000494f, 0.994629f, + 0.000547f, 0.993652f, 0.000589f, 0.993164f, 0.000623f, 0.991699f, 0.000685f, 0.990723f, + 0.000732f, 0.990723f, 0.000769f, 0.988770f, 0.000799f, 0.987793f, 0.000833f, 0.986816f, + 0.000883f, 0.984863f, 0.000921f, 0.983887f, 0.000951f, 0.982422f, 0.000976f, 0.980957f, + 0.000995f, 0.979004f, 0.001040f, 0.977051f, 0.001049f, 0.975586f, 0.001035f, 0.973633f, + 0.001019f, 0.971191f, 0.001002f, 0.968750f, 0.000999f, 0.965820f, 0.001013f, 0.963867f, + 0.001028f, 0.960938f, 0.001037f, 0.958496f, 0.001012f, 0.955078f, 0.001016f, 0.951172f, + 0.001028f, 0.947754f, 0.001055f, 0.944336f, 0.001077f, 0.939941f, 0.001045f, 0.935547f, + 0.001066f, 0.930664f, 0.001074f, 0.925293f, 0.001094f, 0.919434f, 0.001105f, 0.913574f, + 0.001054f, 0.906738f, 0.001059f, 0.899902f, 0.001075f, 0.892090f, 0.001079f, 0.883301f, + 0.001099f, 0.873535f, 0.001040f, 0.862793f, 0.001047f, 0.851562f, 0.001040f, 0.838867f, + 0.001055f, 0.823730f, 0.001065f, 0.807617f, 0.001009f, 0.787598f, 0.001009f, 0.766113f, + 0.000999f, 0.741211f, 0.000970f, 0.709961f, 0.000968f, 0.672852f, 0.000961f, 0.628418f, + 0.000938f, 0.568848f, 0.000925f, 0.488281f, 0.000850f, 0.365967f, 0.000363f, 0.140503f, + 0.000000f, 1.000000f, 0.000159f, 0.999512f, 0.000322f, 0.999023f, 0.000437f, 0.999023f, + 0.000506f, 0.998047f, 0.000640f, 0.998047f, 0.000697f, 0.997559f, 0.000728f, 0.996582f, + 0.000842f, 0.996582f, 0.000903f, 0.995605f, 0.000939f, 0.995117f, 0.000962f, 0.994629f, + 0.001044f, 0.993652f, 0.001104f, 0.992188f, 0.001141f, 0.991211f, 0.001163f, 0.990234f, + 0.001180f, 0.989258f, 0.001251f, 0.988281f, 0.001302f, 0.986816f, 0.001332f, 0.985352f, + 0.001365f, 0.984863f, 0.001410f, 0.982422f, 0.001454f, 0.980957f, 0.001515f, 0.979492f, + 0.001533f, 0.977539f, 0.001535f, 0.976562f, 0.001536f, 0.973633f, 0.001531f, 0.972168f, + 0.001554f, 0.969238f, 0.001606f, 0.967285f, 0.001576f, 0.964355f, 0.001588f, 0.961914f, + 0.001604f, 0.958984f, 0.001631f, 0.956543f, 0.001665f, 0.953125f, 0.001682f, 0.949219f, + 0.001745f, 0.945801f, 0.001764f, 0.941406f, 0.001770f, 0.937988f, 0.001768f, 0.933105f, + 0.001692f, 0.928223f, 0.001762f, 0.922852f, 0.001799f, 0.917480f, 0.001817f, 0.911133f, + 0.001830f, 0.904297f, 0.001735f, 0.896973f, 0.001764f, 0.889160f, 0.001809f, 0.880371f, + 0.001825f, 0.870605f, 0.001841f, 0.860352f, 0.001757f, 0.848633f, 0.001757f, 0.835449f, + 0.001792f, 0.820801f, 0.001830f, 0.804199f, 0.001735f, 0.785156f, 0.001721f, 0.763184f, + 0.001768f, 0.737793f, 0.001708f, 0.707031f, 0.001700f, 0.670410f, 0.001710f, 0.625488f, + 0.001684f, 0.566895f, 0.001637f, 0.487061f, 0.001467f, 0.365479f, 0.000550f, 0.140625f, + 0.000000f, 1.000000f, 0.000398f, 0.999512f, 0.000719f, 0.999023f, 0.000721f, 0.998535f, + 0.000972f, 0.998047f, 0.001002f, 0.997559f, 0.001008f, 0.997070f, 0.001189f, 0.996582f, + 0.001245f, 0.995605f, 0.001262f, 0.995117f, 0.001267f, 0.994629f, 0.001390f, 0.993652f, + 0.001467f, 0.992676f, 0.001500f, 0.992188f, 0.001550f, 0.990723f, 0.001600f, 0.989258f, + 0.001768f, 0.988770f, 0.001886f, 0.986816f, 0.001955f, 0.985840f, 0.002018f, 0.984375f, + 0.002026f, 0.982910f, 0.002022f, 0.982422f, 0.002131f, 0.979980f, 0.002163f, 0.978027f, + 0.002172f, 0.976074f, 0.002174f, 0.974121f, 0.002144f, 0.972168f, 0.002174f, 0.970215f, + 0.002327f, 0.967773f, 0.002388f, 0.964844f, 0.002445f, 0.962891f, 0.002411f, 0.959961f, + 0.002460f, 0.957031f, 0.002493f, 0.954102f, 0.002602f, 0.950684f, 0.002548f, 0.947266f, + 0.002590f, 0.942871f, 0.002619f, 0.938965f, 0.002628f, 0.935059f, 0.002674f, 0.930664f, + 0.002651f, 0.924805f, 0.002707f, 0.919922f, 0.002745f, 0.914062f, 0.002783f, 0.907715f, + 0.002790f, 0.900879f, 0.002678f, 0.894043f, 0.002783f, 0.885742f, 0.002857f, 0.876465f, + 0.002838f, 0.867188f, 0.002850f, 0.856445f, 0.002769f, 0.844727f, 0.002859f, 0.832031f, + 0.002855f, 0.816895f, 0.002897f, 0.800293f, 0.002804f, 0.781738f, 0.002853f, 0.760254f, + 0.002888f, 0.733887f, 0.002911f, 0.704590f, 0.002857f, 0.667969f, 0.002806f, 0.623047f, + 0.002777f, 0.564453f, 0.002665f, 0.485840f, 0.002314f, 0.364746f, 0.000779f, 0.141357f, + 0.000000f, 1.000000f, 0.000458f, 0.999512f, 0.000860f, 0.999023f, 0.000844f, 0.998535f, + 0.001191f, 0.998047f, 0.001191f, 0.997070f, 0.001182f, 0.997070f, 0.001469f, 0.996094f, + 0.001523f, 0.995117f, 0.001595f, 0.994629f, 0.001656f, 0.993652f, 0.001976f, 0.992676f, + 0.002085f, 0.991699f, 0.002150f, 0.990723f, 0.002230f, 0.990234f, 0.002295f, 0.988770f, + 0.002563f, 0.987305f, 0.002615f, 0.985840f, 0.002647f, 0.984375f, 0.002672f, 0.982910f, + 0.002666f, 0.981445f, 0.002691f, 0.979980f, 0.002972f, 0.978516f, 0.002972f, 0.976074f, + 0.003031f, 0.974609f, 0.003077f, 0.972168f, 0.003109f, 0.970703f, 0.003077f, 0.968262f, + 0.003345f, 0.965820f, 0.003441f, 0.962891f, 0.003519f, 0.960449f, 0.003437f, 0.957520f, + 0.003479f, 0.954590f, 0.003502f, 0.951172f, 0.003717f, 0.947754f, 0.003807f, 0.944336f, + 0.003733f, 0.940430f, 0.003765f, 0.936035f, 0.003820f, 0.932129f, 0.003891f, 0.927246f, + 0.004089f, 0.922363f, 0.003960f, 0.916016f, 0.004005f, 0.910645f, 0.004082f, 0.904297f, + 0.004158f, 0.897949f, 0.003998f, 0.890137f, 0.004150f, 0.881836f, 0.004223f, 0.872559f, + 0.004307f, 0.863281f, 0.004295f, 0.852539f, 0.004208f, 0.840820f, 0.004330f, 0.827637f, + 0.004326f, 0.812500f, 0.004425f, 0.795898f, 0.004318f, 0.776855f, 0.004375f, 0.755859f, + 0.004440f, 0.729980f, 0.004501f, 0.700195f, 0.004417f, 0.664062f, 0.004387f, 0.620117f, + 0.004280f, 0.562012f, 0.004047f, 0.484131f, 0.003397f, 0.363770f, 0.001074f, 0.141235f, + 0.000000f, 1.000000f, 0.000478f, 0.999512f, 0.000919f, 0.998535f, 0.000904f, 0.998535f, + 0.001349f, 0.997070f, 0.001458f, 0.997070f, 0.001559f, 0.996094f, 0.002010f, 0.995117f, + 0.002132f, 0.994629f, 0.002201f, 0.993652f, 0.002274f, 0.993164f, 0.002676f, 0.991699f, + 0.002764f, 0.990723f, 0.002811f, 0.989746f, 0.002909f, 0.988770f, 0.003040f, 0.987793f, + 0.003410f, 0.985840f, 0.003479f, 0.984375f, 0.003542f, 0.982910f, 0.003590f, 0.981445f, + 0.003674f, 0.979980f, 0.003641f, 0.978516f, 0.003983f, 0.976562f, 0.004086f, 0.974609f, + 0.004101f, 0.972656f, 0.004211f, 0.970215f, 0.004318f, 0.968262f, 0.004429f, 0.966309f, + 0.004593f, 0.963379f, 0.004669f, 0.960449f, 0.004787f, 0.957520f, 0.004868f, 0.955078f, + 0.004803f, 0.951660f, 0.004902f, 0.948730f, 0.005169f, 0.944824f, 0.005283f, 0.940918f, + 0.005405f, 0.937012f, 0.005348f, 0.932617f, 0.005363f, 0.928223f, 0.005447f, 0.923828f, + 0.005737f, 0.918457f, 0.005589f, 0.912598f, 0.005718f, 0.906250f, 0.005817f, 0.900391f, + 0.005882f, 0.893066f, 0.005898f, 0.886230f, 0.005989f, 0.877441f, 0.006130f, 0.868164f, + 0.006207f, 0.858398f, 0.006210f, 0.848145f, 0.006134f, 0.835938f, 0.006302f, 0.822754f, + 0.006485f, 0.807617f, 0.006466f, 0.791016f, 0.006367f, 0.772461f, 0.006432f, 0.751465f, + 0.006565f, 0.725586f, 0.006630f, 0.695801f, 0.006512f, 0.660156f, 0.006451f, 0.616699f, + 0.006264f, 0.559570f, 0.005821f, 0.482666f, 0.004738f, 0.363037f, 0.001392f, 0.140747f, + 0.000000f, 1.000000f, 0.000486f, 0.999512f, 0.001115f, 0.998535f, 0.001320f, 0.998047f, + 0.001421f, 0.997070f, 0.002012f, 0.996094f, 0.002111f, 0.996094f, 0.002163f, 0.994629f, + 0.002686f, 0.993652f, 0.002804f, 0.993164f, 0.002930f, 0.991699f, 0.003035f, 0.991211f, + 0.003607f, 0.989258f, 0.003769f, 0.988770f, 0.003878f, 0.987305f, 0.004002f, 0.986328f, + 0.004433f, 0.984863f, 0.004650f, 0.982910f, 0.004658f, 0.981445f, 0.004810f, 0.979492f, + 0.004826f, 0.978027f, 0.004917f, 0.976074f, 0.005276f, 0.974121f, 0.005463f, 0.972168f, + 0.005630f, 0.970215f, 0.005650f, 0.968262f, 0.005741f, 0.965820f, 0.006119f, 0.963379f, + 0.006325f, 0.960449f, 0.006336f, 0.957520f, 0.006454f, 0.954590f, 0.006588f, 0.951660f, + 0.006676f, 0.948730f, 0.006870f, 0.944824f, 0.007099f, 0.941406f, 0.007175f, 0.937012f, + 0.007301f, 0.933105f, 0.007301f, 0.929199f, 0.007362f, 0.924316f, 0.007454f, 0.919434f, + 0.007896f, 0.914062f, 0.008125f, 0.908203f, 0.007851f, 0.901855f, 0.008072f, 0.895020f, + 0.008247f, 0.888672f, 0.008469f, 0.880859f, 0.008415f, 0.872070f, 0.008560f, 0.863281f, + 0.008682f, 0.853027f, 0.008728f, 0.842285f, 0.008667f, 0.831055f, 0.008972f, 0.817383f, + 0.009171f, 0.802734f, 0.009171f, 0.786133f, 0.009056f, 0.767090f, 0.009224f, 0.746094f, + 0.009338f, 0.720703f, 0.009399f, 0.690918f, 0.009277f, 0.656250f, 0.009209f, 0.613281f, + 0.008881f, 0.556152f, 0.008018f, 0.479980f, 0.006344f, 0.361572f, 0.001750f, 0.140137f, + 0.000000f, 1.000000f, 0.000346f, 0.999512f, 0.001137f, 0.998535f, 0.001666f, 0.997559f, + 0.001896f, 0.997070f, 0.002428f, 0.995605f, 0.002546f, 0.995117f, 0.002865f, 0.994141f, + 0.003471f, 0.992676f, 0.003632f, 0.991699f, 0.003733f, 0.991211f, 0.003986f, 0.989746f, + 0.004597f, 0.988281f, 0.004780f, 0.986816f, 0.004925f, 0.985840f, 0.005161f, 0.984375f, + 0.005806f, 0.982910f, 0.006012f, 0.980957f, 0.006207f, 0.979980f, 0.006275f, 0.977539f, + 0.006344f, 0.976074f, 0.006508f, 0.973633f, 0.007065f, 0.971680f, 0.007107f, 0.969238f, + 0.007320f, 0.967285f, 0.007576f, 0.965332f, 0.007610f, 0.962891f, 0.008110f, 0.959961f, + 0.008354f, 0.957031f, 0.008522f, 0.954102f, 0.008598f, 0.951172f, 0.008766f, 0.948242f, + 0.008957f, 0.945312f, 0.009407f, 0.941406f, 0.009468f, 0.937012f, 0.009689f, 0.933105f, + 0.009804f, 0.928711f, 0.009987f, 0.924316f, 0.010010f, 0.920410f, 0.010437f, 0.914551f, + 0.010651f, 0.908691f, 0.010902f, 0.903320f, 0.010994f, 0.896973f, 0.010918f, 0.890137f, + 0.011215f, 0.883301f, 0.011658f, 0.875488f, 0.011513f, 0.866211f, 0.011780f, 0.856934f, + 0.012001f, 0.847656f, 0.012184f, 0.836914f, 0.012245f, 0.825195f, 0.012466f, 0.811523f, + 0.012611f, 0.796387f, 0.012634f, 0.779785f, 0.012840f, 0.761719f, 0.012894f, 0.740723f, + 0.012962f, 0.715332f, 0.012917f, 0.686035f, 0.012718f, 0.651855f, 0.012573f, 0.608887f, + 0.012062f, 0.553223f, 0.010689f, 0.478271f, 0.008224f, 0.360596f, 0.002150f, 0.138794f, + 0.000000f, 1.000000f, 0.000445f, 0.999512f, 0.000841f, 0.998535f, 0.001440f, 0.997559f, + 0.002459f, 0.996094f, 0.003067f, 0.995117f, 0.003235f, 0.994629f, 0.003654f, 0.993164f, + 0.004238f, 0.991699f, 0.004494f, 0.990723f, 0.004860f, 0.989746f, 0.005138f, 0.988281f, + 0.005749f, 0.986816f, 0.005981f, 0.985352f, 0.006237f, 0.984375f, 0.006649f, 0.982422f, + 0.006897f, 0.980957f, 0.007587f, 0.979004f, 0.007866f, 0.977539f, 0.008148f, 0.975586f, + 0.008362f, 0.974121f, 0.008499f, 0.971191f, 0.009018f, 0.968750f, 0.009354f, 0.966309f, + 0.009430f, 0.963867f, 0.009689f, 0.962402f, 0.010170f, 0.959473f, 0.010666f, 0.956543f, + 0.010933f, 0.953613f, 0.011169f, 0.950195f, 0.011406f, 0.947266f, 0.011528f, 0.944336f, + 0.011856f, 0.940430f, 0.012527f, 0.936523f, 0.012489f, 0.932129f, 0.012817f, 0.928223f, + 0.013138f, 0.924316f, 0.013268f, 0.919434f, 0.013329f, 0.914551f, 0.014114f, 0.909180f, + 0.014297f, 0.902832f, 0.014488f, 0.896973f, 0.014915f, 0.891113f, 0.014633f, 0.883789f, + 0.014999f, 0.876953f, 0.015823f, 0.869141f, 0.015915f, 0.859863f, 0.015991f, 0.851074f, + 0.016205f, 0.840820f, 0.016357f, 0.830566f, 0.016586f, 0.818359f, 0.016861f, 0.804199f, + 0.017090f, 0.789551f, 0.017365f, 0.773926f, 0.017380f, 0.755371f, 0.017532f, 0.733887f, + 0.017487f, 0.708984f, 0.017639f, 0.681152f, 0.017044f, 0.646484f, 0.016693f, 0.604492f, + 0.015839f, 0.549316f, 0.013962f, 0.476074f, 0.010414f, 0.359375f, 0.002602f, 0.138428f, + 0.000000f, 1.000000f, 0.000567f, 0.999512f, 0.001287f, 0.998535f, 0.001986f, 0.997559f, + 0.003025f, 0.996094f, 0.003273f, 0.995117f, 0.003963f, 0.993652f, 0.004589f, 0.992188f, + 0.004883f, 0.991211f, 0.005531f, 0.989746f, 0.006042f, 0.987793f, 0.006466f, 0.986328f, + 0.007206f, 0.984863f, 0.007431f, 0.983398f, 0.007710f, 0.981934f, 0.008362f, 0.979980f, + 0.008751f, 0.978516f, 0.009453f, 0.976074f, 0.009796f, 0.974609f, 0.010170f, 0.973145f, + 0.010765f, 0.970703f, 0.010979f, 0.968262f, 0.011597f, 0.965332f, 0.012001f, 0.963379f, + 0.012146f, 0.960449f, 0.012527f, 0.958496f, 0.012993f, 0.955078f, 0.013840f, 0.952148f, + 0.014061f, 0.949219f, 0.014412f, 0.946289f, 0.014709f, 0.942871f, 0.014755f, 0.938965f, + 0.015503f, 0.935547f, 0.016220f, 0.931641f, 0.016678f, 0.927246f, 0.016678f, 0.922852f, + 0.017090f, 0.918457f, 0.017548f, 0.914062f, 0.017929f, 0.908203f, 0.018402f, 0.902344f, + 0.018784f, 0.896973f, 0.019119f, 0.890625f, 0.019592f, 0.884277f, 0.019775f, 0.877930f, + 0.020081f, 0.870117f, 0.020844f, 0.861816f, 0.021286f, 0.853516f, 0.021210f, 0.843750f, + 0.021576f, 0.833496f, 0.022064f, 0.823730f, 0.022598f, 0.811035f, 0.022675f, 0.796875f, + 0.023010f, 0.782715f, 0.023300f, 0.766602f, 0.023331f, 0.748535f, 0.023422f, 0.727051f, + 0.023621f, 0.702637f, 0.023300f, 0.674805f, 0.022552f, 0.641602f, 0.022049f, 0.599609f, + 0.020660f, 0.545898f, 0.017868f, 0.473389f, 0.013100f, 0.357910f, 0.003113f, 0.138184f, + 0.000000f, 1.000000f, 0.000884f, 0.999023f, 0.001711f, 0.998047f, 0.001951f, 0.997070f, + 0.003389f, 0.995605f, 0.004044f, 0.994141f, 0.004463f, 0.993164f, 0.005726f, 0.991211f, + 0.006020f, 0.989746f, 0.006794f, 0.988770f, 0.007607f, 0.986328f, 0.007980f, 0.984375f, + 0.008392f, 0.983398f, 0.009178f, 0.981445f, 0.009590f, 0.979980f, 0.010414f, 0.977539f, + 0.010872f, 0.975586f, 0.011703f, 0.973633f, 0.012115f, 0.971680f, 0.012619f, 0.969727f, + 0.013443f, 0.967285f, 0.013969f, 0.964844f, 0.014908f, 0.962402f, 0.014900f, 0.959473f, + 0.015396f, 0.957031f, 0.016006f, 0.953613f, 0.016602f, 0.950684f, 0.017349f, 0.947266f, + 0.017944f, 0.944336f, 0.018280f, 0.940918f, 0.018692f, 0.937988f, 0.019394f, 0.934082f, + 0.019684f, 0.929688f, 0.020737f, 0.925293f, 0.021286f, 0.921387f, 0.021835f, 0.916992f, + 0.021912f, 0.912109f, 0.022522f, 0.907715f, 0.023224f, 0.901855f, 0.023865f, 0.895996f, + 0.024429f, 0.889648f, 0.024933f, 0.883789f, 0.025391f, 0.877441f, 0.025742f, 0.871094f, + 0.026443f, 0.862305f, 0.027206f, 0.853516f, 0.027985f, 0.845703f, 0.027512f, 0.835938f, + 0.028564f, 0.826172f, 0.028915f, 0.815430f, 0.029648f, 0.802734f, 0.029831f, 0.789062f, + 0.030258f, 0.774414f, 0.030441f, 0.758789f, 0.030350f, 0.741211f, 0.030777f, 0.719727f, + 0.030792f, 0.695801f, 0.030304f, 0.668457f, 0.029510f, 0.635742f, 0.028397f, 0.593750f, + 0.026428f, 0.541016f, 0.022705f, 0.470947f, 0.016251f, 0.356689f, 0.003714f, 0.137451f, + 0.000000f, 1.000000f, 0.000584f, 0.999512f, 0.002298f, 0.997559f, 0.002819f, 0.997070f, + 0.003706f, 0.995117f, 0.004578f, 0.993652f, 0.005592f, 0.991699f, 0.006565f, 0.990234f, + 0.007416f, 0.988281f, 0.007896f, 0.987305f, 0.009377f, 0.984375f, 0.009865f, 0.982422f, + 0.010300f, 0.981445f, 0.011208f, 0.979492f, 0.011887f, 0.977051f, 0.012871f, 0.974609f, + 0.013397f, 0.972656f, 0.013908f, 0.970703f, 0.014862f, 0.968262f, 0.015945f, 0.965820f, + 0.016617f, 0.962891f, 0.017258f, 0.960449f, 0.018311f, 0.958008f, 0.018890f, 0.955566f, + 0.019394f, 0.952637f, 0.020203f, 0.948730f, 0.020676f, 0.945312f, 0.021805f, 0.942383f, + 0.022247f, 0.938477f, 0.022995f, 0.935547f, 0.023529f, 0.932129f, 0.024750f, 0.927734f, + 0.025192f, 0.923340f, 0.025940f, 0.918457f, 0.026810f, 0.914551f, 0.027481f, 0.910156f, + 0.027878f, 0.905762f, 0.028824f, 0.899902f, 0.029724f, 0.894043f, 0.030685f, 0.888184f, + 0.031128f, 0.882324f, 0.031830f, 0.875977f, 0.032349f, 0.869629f, 0.033325f, 0.861816f, + 0.033875f, 0.854004f, 0.034576f, 0.845215f, 0.035461f, 0.836914f, 0.036560f, 0.828125f, + 0.036255f, 0.817871f, 0.037048f, 0.806152f, 0.038361f, 0.793945f, 0.038666f, 0.780762f, + 0.038910f, 0.766602f, 0.039032f, 0.750977f, 0.039368f, 0.732910f, 0.039459f, 0.711914f, + 0.039429f, 0.688477f, 0.038910f, 0.661621f, 0.037628f, 0.630371f, 0.036163f, 0.588867f, + 0.033325f, 0.537598f, 0.028214f, 0.468262f, 0.019897f, 0.354980f, 0.004387f, 0.137207f, + 0.000000f, 1.000000f, 0.000891f, 0.999023f, 0.002415f, 0.997559f, 0.003820f, 0.996094f, + 0.004219f, 0.994629f, 0.005196f, 0.993164f, 0.006588f, 0.990723f, 0.008102f, 0.988770f, + 0.008575f, 0.986816f, 0.009933f, 0.984863f, 0.010605f, 0.982910f, 0.012047f, 0.980469f, + 0.012604f, 0.978516f, 0.013466f, 0.976562f, 0.014641f, 0.973633f, 0.015793f, 0.971191f, + 0.016373f, 0.968750f, 0.017044f, 0.966797f, 0.018417f, 0.964355f, 0.019623f, 0.960938f, + 0.020416f, 0.958008f, 0.021164f, 0.955566f, 0.021912f, 0.953125f, 0.023056f, 0.950195f, + 0.024231f, 0.946777f, 0.025192f, 0.943359f, 0.025818f, 0.939453f, 0.026382f, 0.936035f, + 0.027679f, 0.932617f, 0.028244f, 0.928711f, 0.029495f, 0.924805f, 0.030594f, 0.920410f, + 0.031647f, 0.916504f, 0.032593f, 0.911621f, 0.033081f, 0.906738f, 0.034149f, 0.902344f, + 0.035248f, 0.897461f, 0.036316f, 0.891602f, 0.037109f, 0.885742f, 0.038513f, 0.879883f, + 0.039307f, 0.873535f, 0.039673f, 0.867188f, 0.040680f, 0.860352f, 0.041687f, 0.852539f, + 0.042542f, 0.844727f, 0.043793f, 0.836426f, 0.044586f, 0.827637f, 0.045471f, 0.818359f, + 0.045532f, 0.808594f, 0.047180f, 0.796875f, 0.048004f, 0.784668f, 0.048340f, 0.771484f, + 0.048523f, 0.757324f, 0.049103f, 0.742188f, 0.049530f, 0.724121f, 0.049683f, 0.703125f, + 0.049164f, 0.680664f, 0.048218f, 0.654297f, 0.046448f, 0.623047f, 0.044464f, 0.582520f, + 0.041016f, 0.532715f, 0.034302f, 0.465332f, 0.024048f, 0.353760f, 0.005123f, 0.136719f, + 0.000000f, 1.000000f, 0.001649f, 0.998535f, 0.002653f, 0.997559f, 0.003967f, 0.995605f, + 0.005466f, 0.993652f, 0.006485f, 0.991699f, 0.007828f, 0.989746f, 0.009010f, 0.987793f, + 0.010452f, 0.985352f, 0.012352f, 0.982422f, 0.013054f, 0.979980f, 0.014214f, 0.978027f, + 0.015335f, 0.975586f, 0.016678f, 0.972656f, 0.017548f, 0.970215f, 0.019211f, 0.967285f, + 0.020004f, 0.964844f, 0.020721f, 0.962891f, 0.022217f, 0.958984f, 0.023972f, 0.956055f, + 0.024918f, 0.953125f, 0.025787f, 0.950195f, 0.026688f, 0.947754f, 0.028519f, 0.943848f, + 0.029663f, 0.940430f, 0.031082f, 0.937012f, 0.031830f, 0.933105f, 0.032562f, 0.929688f, + 0.033691f, 0.925781f, 0.035278f, 0.921387f, 0.036530f, 0.916504f, 0.037811f, 0.912109f, + 0.038727f, 0.908203f, 0.040344f, 0.903809f, 0.041077f, 0.898926f, 0.042023f, 0.893555f, + 0.043884f, 0.888184f, 0.045135f, 0.882324f, 0.045746f, 0.876465f, 0.047089f, 0.870117f, + 0.048584f, 0.864746f, 0.049011f, 0.857910f, 0.050323f, 0.850098f, 0.052094f, 0.842773f, + 0.052979f, 0.834473f, 0.054321f, 0.826172f, 0.054962f, 0.817383f, 0.056122f, 0.808594f, + 0.057281f, 0.798340f, 0.057892f, 0.786133f, 0.058990f, 0.773926f, 0.059723f, 0.761719f, + 0.059998f, 0.747559f, 0.060394f, 0.732910f, 0.060944f, 0.714355f, 0.060608f, 0.694336f, + 0.060394f, 0.672363f, 0.058990f, 0.646973f, 0.056885f, 0.615723f, 0.054199f, 0.576660f, + 0.049194f, 0.527832f, 0.041016f, 0.462158f, 0.028503f, 0.352051f, 0.005947f, 0.136230f, + 0.000000f, 1.000000f, 0.001497f, 0.998535f, 0.003502f, 0.997070f, 0.004753f, 0.995117f, + 0.006893f, 0.992676f, 0.008080f, 0.990234f, 0.009911f, 0.987793f, 0.010658f, 0.985840f, + 0.012436f, 0.983398f, 0.014671f, 0.979980f, 0.015594f, 0.978027f, 0.017273f, 0.975098f, + 0.018555f, 0.972168f, 0.020477f, 0.968750f, 0.021515f, 0.965820f, 0.022858f, 0.963379f, + 0.024246f, 0.960449f, 0.025681f, 0.957031f, 0.027191f, 0.953613f, 0.029160f, 0.950195f, + 0.030243f, 0.947266f, 0.031281f, 0.944336f, 0.032684f, 0.940918f, 0.034790f, 0.936523f, + 0.036102f, 0.933105f, 0.037720f, 0.929199f, 0.038940f, 0.925781f, 0.040161f, 0.922363f, + 0.041534f, 0.917480f, 0.043030f, 0.912598f, 0.044830f, 0.907715f, 0.045929f, 0.903320f, + 0.047363f, 0.898926f, 0.048859f, 0.894531f, 0.050537f, 0.889648f, 0.051971f, 0.883301f, + 0.053345f, 0.877441f, 0.054749f, 0.872070f, 0.056091f, 0.866211f, 0.057312f, 0.859863f, + 0.058716f, 0.854004f, 0.060486f, 0.846680f, 0.061951f, 0.838867f, 0.063354f, 0.831055f, + 0.065125f, 0.823730f, 0.066040f, 0.815430f, 0.067017f, 0.807129f, 0.068054f, 0.796875f, + 0.069946f, 0.786621f, 0.070374f, 0.774902f, 0.072144f, 0.763672f, 0.072388f, 0.750977f, + 0.072632f, 0.737793f, 0.073303f, 0.722168f, 0.073547f, 0.704590f, 0.073547f, 0.685059f, + 0.072021f, 0.663086f, 0.070496f, 0.639160f, 0.068604f, 0.608398f, 0.064697f, 0.570312f, + 0.058472f, 0.523438f, 0.048737f, 0.458496f, 0.033386f, 0.349854f, 0.006901f, 0.135986f, + 0.000000f, 1.000000f, 0.002352f, 0.998047f, 0.004051f, 0.996582f, 0.006329f, 0.994141f, + 0.007641f, 0.992188f, 0.009933f, 0.988770f, 0.011406f, 0.986328f, 0.013268f, 0.983887f, + 0.014984f, 0.980957f, 0.016663f, 0.977539f, 0.019104f, 0.974609f, 0.020081f, 0.971680f, + 0.022980f, 0.967285f, 0.024582f, 0.964355f, 0.026245f, 0.960938f, 0.027771f, 0.958008f, + 0.029709f, 0.954590f, 0.031464f, 0.950684f, 0.033142f, 0.947266f, 0.034454f, 0.943848f, + 0.036621f, 0.939941f, 0.038086f, 0.936523f, 0.039948f, 0.932617f, 0.041840f, 0.928223f, + 0.044128f, 0.924316f, 0.045563f, 0.920410f, 0.046997f, 0.916992f, 0.048950f, 0.912598f, + 0.051483f, 0.907715f, 0.052490f, 0.902832f, 0.054199f, 0.897949f, 0.055817f, 0.893066f, + 0.057068f, 0.888672f, 0.059265f, 0.883789f, 0.061432f, 0.877930f, 0.063354f, 0.872559f, + 0.064636f, 0.866211f, 0.066162f, 0.860352f, 0.067749f, 0.854980f, 0.069641f, 0.849121f, + 0.071167f, 0.841309f, 0.073364f, 0.833984f, 0.074890f, 0.826660f, 0.076477f, 0.819336f, + 0.078064f, 0.811523f, 0.079346f, 0.803711f, 0.080505f, 0.794922f, 0.082031f, 0.784180f, + 0.083984f, 0.773926f, 0.085083f, 0.763672f, 0.085693f, 0.751465f, 0.086121f, 0.739746f, + 0.086609f, 0.726562f, 0.087463f, 0.710449f, 0.087646f, 0.693848f, 0.087036f, 0.675293f, + 0.085266f, 0.654785f, 0.083252f, 0.631348f, 0.080750f, 0.600098f, 0.075928f, 0.563965f, + 0.068420f, 0.518555f, 0.056946f, 0.454102f, 0.038483f, 0.347900f, 0.007858f, 0.135254f, + 0.000000f, 1.000000f, 0.002439f, 0.998535f, 0.004707f, 0.996094f, 0.007305f, 0.993164f, + 0.009239f, 0.990723f, 0.011810f, 0.987305f, 0.014412f, 0.983887f, 0.016037f, 0.981445f, + 0.018570f, 0.977051f, 0.020294f, 0.974121f, 0.022430f, 0.971191f, 0.025345f, 0.966797f, + 0.027817f, 0.962891f, 0.030121f, 0.958984f, 0.031433f, 0.955566f, 0.033508f, 0.952148f, + 0.036346f, 0.947266f, 0.038422f, 0.943359f, 0.040344f, 0.939453f, 0.041809f, 0.936523f, + 0.044434f, 0.932129f, 0.046875f, 0.927246f, 0.049011f, 0.923340f, 0.050720f, 0.919434f, + 0.053223f, 0.915039f, 0.054840f, 0.911133f, 0.057068f, 0.906250f, 0.059387f, 0.901367f, + 0.061646f, 0.896973f, 0.063904f, 0.892090f, 0.065430f, 0.886719f, 0.066895f, 0.882324f, + 0.069092f, 0.876953f, 0.071289f, 0.871094f, 0.074158f, 0.865234f, 0.075867f, 0.859375f, + 0.078308f, 0.854004f, 0.079285f, 0.848145f, 0.080994f, 0.842285f, 0.083862f, 0.835449f, + 0.086243f, 0.828125f, 0.087585f, 0.820801f, 0.089966f, 0.813477f, 0.091187f, 0.806152f, + 0.092896f, 0.798340f, 0.094604f, 0.791016f, 0.096069f, 0.780762f, 0.098022f, 0.770996f, + 0.099365f, 0.760742f, 0.100098f, 0.750977f, 0.101135f, 0.739258f, 0.102356f, 0.729004f, + 0.103210f, 0.714355f, 0.103210f, 0.698730f, 0.102417f, 0.682617f, 0.101868f, 0.664551f, + 0.099792f, 0.645508f, 0.097229f, 0.621094f, 0.093933f, 0.591797f, 0.087463f, 0.556641f, + 0.078369f, 0.513184f, 0.065491f, 0.449707f, 0.044067f, 0.346436f, 0.008972f, 0.134521f, + 0.000000f, 1.000000f, 0.003529f, 0.997559f, 0.005974f, 0.995117f, 0.009094f, 0.991699f, + 0.011642f, 0.988770f, 0.014702f, 0.984863f, 0.017014f, 0.981445f, 0.020248f, 0.977539f, + 0.022858f, 0.973145f, 0.025253f, 0.969727f, 0.027954f, 0.965820f, 0.030640f, 0.960938f, + 0.033264f, 0.957031f, 0.035858f, 0.953125f, 0.038605f, 0.948730f, 0.041321f, 0.943848f, + 0.044556f, 0.939453f, 0.046326f, 0.935547f, 0.048950f, 0.931152f, 0.051178f, 0.927246f, + 0.054169f, 0.921875f, 0.057037f, 0.916992f, 0.059387f, 0.912598f, 0.061249f, 0.908691f, + 0.063049f, 0.904785f, 0.066833f, 0.898926f, 0.069458f, 0.893555f, 0.071594f, 0.889160f, + 0.074036f, 0.884277f, 0.076477f, 0.879395f, 0.078918f, 0.875000f, 0.080994f, 0.869141f, + 0.083435f, 0.862793f, 0.086060f, 0.857422f, 0.088440f, 0.851074f, 0.091003f, 0.845703f, + 0.092834f, 0.840332f, 0.094604f, 0.834961f, 0.097046f, 0.827637f, 0.099915f, 0.820312f, + 0.101990f, 0.812988f, 0.104065f, 0.806152f, 0.105774f, 0.799316f, 0.107361f, 0.792480f, + 0.109558f, 0.784668f, 0.111511f, 0.774902f, 0.113464f, 0.766113f, 0.115112f, 0.756348f, + 0.116272f, 0.747070f, 0.117432f, 0.737305f, 0.117615f, 0.727051f, 0.119019f, 0.714355f, + 0.119812f, 0.700684f, 0.119629f, 0.686035f, 0.119202f, 0.671387f, 0.117493f, 0.654297f, + 0.114807f, 0.635742f, 0.112305f, 0.611816f, 0.107849f, 0.583984f, 0.100586f, 0.549805f, + 0.089844f, 0.508301f, 0.074646f, 0.445312f, 0.049500f, 0.344727f, 0.009995f, 0.133423f, + 0.000000f, 1.000000f, 0.004250f, 0.997070f, 0.007221f, 0.994141f, 0.010933f, 0.990723f, + 0.014549f, 0.986328f, 0.017883f, 0.982422f, 0.020493f, 0.978516f, 0.024826f, 0.973145f, + 0.027710f, 0.969238f, 0.030869f, 0.964844f, 0.034729f, 0.958984f, 0.038239f, 0.954102f, + 0.040649f, 0.950195f, 0.043274f, 0.946289f, 0.047821f, 0.939453f, 0.050964f, 0.934570f, + 0.053497f, 0.930664f, 0.056427f, 0.925781f, 0.059631f, 0.920410f, 0.063293f, 0.915039f, + 0.066406f, 0.910156f, 0.068665f, 0.905762f, 0.071655f, 0.900879f, 0.073975f, 0.895996f, + 0.077148f, 0.890625f, 0.080872f, 0.884766f, 0.083618f, 0.879395f, 0.086304f, 0.875000f, + 0.088501f, 0.870117f, 0.091248f, 0.865723f, 0.094971f, 0.858887f, 0.097839f, 0.853516f, + 0.099976f, 0.847656f, 0.102356f, 0.841797f, 0.105164f, 0.835938f, 0.107422f, 0.830566f, + 0.109802f, 0.824219f, 0.113098f, 0.817871f, 0.115723f, 0.811035f, 0.117920f, 0.803711f, + 0.120361f, 0.797363f, 0.122375f, 0.790527f, 0.123962f, 0.784180f, 0.125977f, 0.776367f, + 0.128540f, 0.767578f, 0.130493f, 0.758789f, 0.132568f, 0.750977f, 0.133667f, 0.741699f, + 0.134888f, 0.732910f, 0.135742f, 0.723633f, 0.136719f, 0.712402f, 0.137451f, 0.699707f, + 0.137817f, 0.687500f, 0.137085f, 0.673340f, 0.136108f, 0.659180f, 0.133911f, 0.643555f, + 0.130981f, 0.624023f, 0.127563f, 0.601074f, 0.121948f, 0.574707f, 0.113342f, 0.542969f, + 0.100891f, 0.503418f, 0.083862f, 0.440430f, 0.055878f, 0.343750f, 0.011185f, 0.132202f, + 0.000000f, 1.000000f, 0.005173f, 0.997070f, 0.009926f, 0.992676f, 0.013885f, 0.988770f, + 0.018921f, 0.983398f, 0.022049f, 0.979004f, 0.026917f, 0.973145f, 0.031281f, 0.967773f, + 0.034454f, 0.963379f, 0.038971f, 0.957520f, 0.043365f, 0.951660f, 0.046631f, 0.946777f, + 0.050751f, 0.941406f, 0.054413f, 0.935547f, 0.057861f, 0.930176f, 0.062195f, 0.924316f, + 0.065369f, 0.919434f, 0.069702f, 0.913086f, 0.073853f, 0.907227f, 0.076843f, 0.901855f, + 0.080200f, 0.896973f, 0.083008f, 0.892090f, 0.086792f, 0.886230f, 0.090820f, 0.879883f, + 0.093872f, 0.874512f, 0.097290f, 0.869141f, 0.100220f, 0.864258f, 0.102966f, 0.859375f, + 0.106567f, 0.853027f, 0.109802f, 0.847168f, 0.113708f, 0.841309f, 0.116699f, 0.835938f, + 0.119202f, 0.830566f, 0.121277f, 0.825195f, 0.123718f, 0.819824f, 0.127686f, 0.812500f, + 0.130615f, 0.805176f, 0.133301f, 0.799316f, 0.135864f, 0.793457f, 0.138306f, 0.787109f, + 0.139893f, 0.780273f, 0.142212f, 0.774414f, 0.145264f, 0.766113f, 0.147217f, 0.758301f, + 0.149414f, 0.750488f, 0.151733f, 0.742188f, 0.152222f, 0.734375f, 0.153931f, 0.726562f, + 0.154297f, 0.718262f, 0.156250f, 0.707520f, 0.157349f, 0.696289f, 0.157104f, 0.684570f, + 0.157593f, 0.673340f, 0.155640f, 0.660645f, 0.154419f, 0.647461f, 0.151489f, 0.631836f, + 0.148682f, 0.611816f, 0.143799f, 0.590332f, 0.137329f, 0.565918f, 0.126709f, 0.535645f, + 0.112793f, 0.496826f, 0.093506f, 0.435303f, 0.062134f, 0.342285f, 0.012444f, 0.131714f, + 0.000000f, 1.000000f, 0.006569f, 0.996094f, 0.012505f, 0.991211f, 0.017624f, 0.985352f, + 0.023590f, 0.979980f, 0.028275f, 0.974121f, 0.033844f, 0.967773f, 0.038513f, 0.961914f, + 0.044373f, 0.955078f, 0.049347f, 0.948242f, 0.053589f, 0.942871f, 0.058655f, 0.936035f, + 0.063782f, 0.929199f, 0.068542f, 0.923340f, 0.071411f, 0.917969f, 0.075806f, 0.912109f, + 0.081299f, 0.904785f, 0.085266f, 0.898438f, 0.089966f, 0.892578f, 0.093567f, 0.887207f, + 0.097473f, 0.881348f, 0.102356f, 0.874512f, 0.106567f, 0.868164f, 0.109802f, 0.862793f, + 0.112976f, 0.857422f, 0.116394f, 0.852051f, 0.120117f, 0.845703f, 0.124756f, 0.838867f, + 0.128052f, 0.833496f, 0.131226f, 0.828125f, 0.135132f, 0.822266f, 0.137695f, 0.817383f, + 0.140503f, 0.812500f, 0.144409f, 0.805176f, 0.147095f, 0.798828f, 0.150757f, 0.791504f, + 0.152954f, 0.785645f, 0.155762f, 0.779785f, 0.157959f, 0.774414f, 0.160645f, 0.769043f, + 0.162842f, 0.761230f, 0.166138f, 0.753418f, 0.168213f, 0.746094f, 0.170532f, 0.739258f, + 0.172363f, 0.732422f, 0.173218f, 0.724609f, 0.174683f, 0.717773f, 0.175659f, 0.709961f, + 0.176758f, 0.699707f, 0.178589f, 0.689941f, 0.178589f, 0.679688f, 0.177856f, 0.669434f, + 0.177124f, 0.658691f, 0.174927f, 0.647949f, 0.172729f, 0.634766f, 0.170776f, 0.617676f, + 0.166870f, 0.600098f, 0.160645f, 0.579590f, 0.152466f, 0.557129f, 0.140869f, 0.529785f, + 0.125854f, 0.489014f, 0.104065f, 0.431885f, 0.068237f, 0.339844f, 0.013725f, 0.130493f, + 0.000000f, 1.000000f, 0.007759f, 0.995605f, 0.015671f, 0.989258f, 0.023575f, 0.981445f, + 0.029465f, 0.975586f, 0.037933f, 0.966797f, 0.043427f, 0.960449f, 0.050018f, 0.952148f, + 0.056335f, 0.944824f, 0.062500f, 0.937988f, 0.068481f, 0.930176f, 0.074158f, 0.922363f, + 0.079895f, 0.915527f, 0.084900f, 0.909668f, 0.090332f, 0.901367f, 0.095703f, 0.894043f, + 0.100891f, 0.887695f, 0.104919f, 0.881836f, 0.109680f, 0.875000f, 0.115845f, 0.866699f, + 0.120544f, 0.860352f, 0.124084f, 0.854492f, 0.128784f, 0.848633f, 0.131958f, 0.843262f, + 0.136841f, 0.835938f, 0.141357f, 0.829590f, 0.145264f, 0.823242f, 0.149414f, 0.817383f, + 0.152466f, 0.812012f, 0.155029f, 0.807129f, 0.159058f, 0.800781f, 0.163452f, 0.794434f, + 0.167358f, 0.788086f, 0.170410f, 0.782227f, 0.172974f, 0.776855f, 0.175781f, 0.770508f, + 0.177979f, 0.765137f, 0.179688f, 0.759766f, 0.183594f, 0.752441f, 0.186890f, 0.745605f, + 0.190186f, 0.739258f, 0.191528f, 0.732422f, 0.193237f, 0.726074f, 0.194580f, 0.719727f, + 0.196289f, 0.713867f, 0.196655f, 0.707031f, 0.199219f, 0.698242f, 0.200073f, 0.689453f, + 0.200806f, 0.681152f, 0.201050f, 0.671875f, 0.200928f, 0.663574f, 0.200195f, 0.654785f, + 0.197754f, 0.644531f, 0.195801f, 0.633789f, 0.193848f, 0.619141f, 0.190430f, 0.604004f, + 0.185303f, 0.587891f, 0.177979f, 0.569824f, 0.168091f, 0.548340f, 0.154663f, 0.521973f, + 0.138916f, 0.481201f, 0.114075f, 0.427246f, 0.075012f, 0.338623f, 0.015144f, 0.130371f, + 0.000000f, 1.000000f, 0.009789f, 0.995117f, 0.020401f, 0.986816f, 0.030792f, 0.977539f, + 0.040192f, 0.967773f, 0.048706f, 0.958984f, 0.057617f, 0.949219f, 0.065247f, 0.940430f, + 0.071655f, 0.932617f, 0.080688f, 0.922363f, 0.088257f, 0.914062f, 0.093506f, 0.906738f, + 0.101685f, 0.897461f, 0.107361f, 0.889648f, 0.114380f, 0.881348f, 0.118652f, 0.874512f, + 0.125122f, 0.866699f, 0.131348f, 0.858398f, 0.136230f, 0.851562f, 0.141479f, 0.844727f, + 0.146362f, 0.838379f, 0.151367f, 0.831055f, 0.156128f, 0.823730f, 0.161987f, 0.816895f, + 0.165771f, 0.811035f, 0.169556f, 0.805176f, 0.172974f, 0.799805f, 0.176514f, 0.793945f, + 0.181519f, 0.786621f, 0.185181f, 0.780273f, 0.189453f, 0.774414f, 0.192749f, 0.768555f, + 0.195923f, 0.763184f, 0.198120f, 0.758789f, 0.200439f, 0.754395f, 0.205200f, 0.747070f, + 0.207642f, 0.740234f, 0.210571f, 0.733887f, 0.212524f, 0.728027f, 0.214844f, 0.722168f, + 0.217285f, 0.716797f, 0.218384f, 0.711426f, 0.218872f, 0.706055f, 0.220215f, 0.699219f, + 0.223633f, 0.691406f, 0.224609f, 0.684082f, 0.225464f, 0.676758f, 0.225952f, 0.669922f, + 0.225098f, 0.662109f, 0.224731f, 0.655273f, 0.223755f, 0.647949f, 0.221069f, 0.639160f, + 0.220337f, 0.627441f, 0.219238f, 0.616211f, 0.215454f, 0.603516f, 0.210205f, 0.590820f, + 0.203491f, 0.576172f, 0.195312f, 0.559570f, 0.183350f, 0.540527f, 0.170532f, 0.511230f, + 0.151855f, 0.473877f, 0.124939f, 0.422363f, 0.081238f, 0.337402f, 0.016525f, 0.129395f, + 0.000000f, 1.000000f, 0.015991f, 0.991211f, 0.029984f, 0.980469f, 0.042206f, 0.969727f, + 0.054382f, 0.958496f, 0.067261f, 0.945801f, 0.076294f, 0.935547f, 0.086426f, 0.923828f, + 0.097046f, 0.913086f, 0.104065f, 0.904297f, 0.114136f, 0.892578f, 0.122681f, 0.883301f, + 0.128784f, 0.875000f, 0.135620f, 0.866211f, 0.143311f, 0.856445f, 0.151489f, 0.847168f, + 0.156494f, 0.839844f, 0.162476f, 0.833008f, 0.167847f, 0.825195f, 0.173706f, 0.816895f, + 0.179810f, 0.809570f, 0.185547f, 0.801758f, 0.189575f, 0.796387f, 0.193604f, 0.790039f, + 0.199219f, 0.782715f, 0.203369f, 0.775879f, 0.208008f, 0.769531f, 0.212158f, 0.763184f, + 0.214844f, 0.757812f, 0.218140f, 0.752930f, 0.220947f, 0.748047f, 0.224243f, 0.742188f, + 0.228516f, 0.735352f, 0.231812f, 0.729492f, 0.234497f, 0.724609f, 0.237915f, 0.719238f, + 0.239868f, 0.714355f, 0.241211f, 0.708984f, 0.242310f, 0.704102f, 0.242920f, 0.700195f, + 0.246338f, 0.692383f, 0.249023f, 0.686523f, 0.250000f, 0.680176f, 0.250977f, 0.674316f, + 0.251953f, 0.667969f, 0.251953f, 0.662598f, 0.251709f, 0.656250f, 0.251221f, 0.650879f, + 0.249878f, 0.645020f, 0.249634f, 0.637207f, 0.248657f, 0.627930f, 0.247070f, 0.618652f, + 0.244629f, 0.609375f, 0.241211f, 0.599609f, 0.235840f, 0.588867f, 0.230469f, 0.578125f, + 0.222046f, 0.565918f, 0.212280f, 0.551270f, 0.202393f, 0.528809f, 0.186279f, 0.500488f, + 0.165771f, 0.466797f, 0.135498f, 0.418213f, 0.088379f, 0.337646f, 0.017944f, 0.129150f, + 0.000000f, 1.000000f, 0.022446f, 0.989258f, 0.041748f, 0.974609f, 0.060333f, 0.958984f, + 0.077515f, 0.942871f, 0.090454f, 0.929199f, 0.105896f, 0.914551f, 0.115723f, 0.902832f, + 0.130127f, 0.887695f, 0.140137f, 0.876465f, 0.147583f, 0.866699f, 0.159058f, 0.853516f, + 0.167236f, 0.843750f, 0.174194f, 0.834961f, 0.182129f, 0.825195f, 0.189453f, 0.815430f, + 0.197632f, 0.806152f, 0.202881f, 0.798828f, 0.208008f, 0.791992f, 0.212891f, 0.784668f, + 0.219360f, 0.776367f, 0.225342f, 0.768555f, 0.230591f, 0.761719f, 0.234497f, 0.755859f, + 0.238281f, 0.749512f, 0.241333f, 0.744141f, 0.244507f, 0.738281f, 0.250244f, 0.731445f, + 0.253662f, 0.725098f, 0.257324f, 0.719238f, 0.259766f, 0.714355f, 0.262451f, 0.709961f, + 0.265137f, 0.705078f, 0.266602f, 0.701172f, 0.268066f, 0.697266f, 0.270752f, 0.691406f, + 0.273926f, 0.685547f, 0.276611f, 0.680176f, 0.277344f, 0.675293f, 0.278320f, 0.669922f, + 0.280029f, 0.665039f, 0.280518f, 0.660645f, 0.280518f, 0.656250f, 0.280273f, 0.651855f, + 0.279541f, 0.647461f, 0.280029f, 0.641602f, 0.280273f, 0.634277f, 0.279785f, 0.627441f, + 0.279297f, 0.621582f, 0.277832f, 0.614258f, 0.275391f, 0.607422f, 0.272705f, 0.600586f, + 0.268555f, 0.593750f, 0.262939f, 0.585449f, 0.256592f, 0.577148f, 0.248901f, 0.567383f, + 0.242676f, 0.552246f, 0.232422f, 0.534668f, 0.220215f, 0.515137f, 0.202515f, 0.491211f, + 0.178955f, 0.459961f, 0.145630f, 0.415039f, 0.094482f, 0.337158f, 0.019440f, 0.129517f, + 0.000000f, 1.000000f, 0.036499f, 0.982422f, 0.064636f, 0.962402f, 0.089783f, 0.941406f, + 0.112305f, 0.920410f, 0.131470f, 0.901367f, 0.147095f, 0.885254f, 0.162354f, 0.868652f, + 0.175903f, 0.854004f, 0.186157f, 0.841797f, 0.197632f, 0.828125f, 0.207886f, 0.815430f, + 0.216431f, 0.805176f, 0.222778f, 0.796387f, 0.231812f, 0.785156f, 0.240356f, 0.774902f, + 0.246094f, 0.767090f, 0.251709f, 0.759277f, 0.255859f, 0.752441f, 0.261963f, 0.744141f, + 0.267090f, 0.736328f, 0.272217f, 0.729492f, 0.276367f, 0.723145f, 0.280273f, 0.716797f, + 0.283203f, 0.711426f, 0.286865f, 0.706055f, 0.288574f, 0.702148f, 0.292480f, 0.696289f, + 0.296143f, 0.689941f, 0.298828f, 0.684570f, 0.301758f, 0.679688f, 0.303711f, 0.674805f, + 0.305664f, 0.670410f, 0.307373f, 0.666504f, 0.308594f, 0.662598f, 0.309326f, 0.659180f, + 0.311035f, 0.655273f, 0.311035f, 0.652344f, 0.311523f, 0.648438f, 0.311523f, 0.643066f, + 0.313477f, 0.637695f, 0.313965f, 0.633301f, 0.314453f, 0.628906f, 0.313965f, 0.624512f, + 0.312744f, 0.619629f, 0.312012f, 0.614746f, 0.310791f, 0.610840f, 0.308105f, 0.605957f, + 0.305664f, 0.601074f, 0.302979f, 0.595703f, 0.299561f, 0.591309f, 0.295410f, 0.585449f, + 0.291504f, 0.576660f, 0.286377f, 0.567383f, 0.281494f, 0.558105f, 0.273682f, 0.547363f, + 0.264160f, 0.535156f, 0.251709f, 0.521484f, 0.237427f, 0.505371f, 0.217651f, 0.484375f, + 0.191772f, 0.456299f, 0.155762f, 0.413818f, 0.103394f, 0.327637f, 0.020920f, 0.129517f, + 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.109253f, 0.938477f, 0.143555f, 0.908691f, + 0.170654f, 0.883301f, 0.191650f, 0.861328f, 0.211426f, 0.840332f, 0.226929f, 0.822754f, + 0.239746f, 0.807617f, 0.252197f, 0.791992f, 0.261719f, 0.779297f, 0.270996f, 0.767090f, + 0.278320f, 0.757324f, 0.286133f, 0.746094f, 0.293945f, 0.735840f, 0.299561f, 0.727051f, + 0.305908f, 0.718262f, 0.310547f, 0.710938f, 0.314453f, 0.704102f, 0.318848f, 0.697754f, + 0.321777f, 0.691406f, 0.324463f, 0.686035f, 0.328125f, 0.680176f, 0.331543f, 0.673828f, + 0.335449f, 0.668457f, 0.338379f, 0.663086f, 0.340332f, 0.658203f, 0.342285f, 0.653809f, + 0.343506f, 0.649414f, 0.345703f, 0.645020f, 0.346436f, 0.641602f, 0.348877f, 0.637695f, + 0.348389f, 0.634277f, 0.349854f, 0.631348f, 0.349365f, 0.627930f, 0.349854f, 0.625000f, + 0.350098f, 0.622070f, 0.349854f, 0.619141f, 0.349854f, 0.616211f, 0.349365f, 0.612305f, + 0.349365f, 0.607910f, 0.348633f, 0.604492f, 0.347900f, 0.600586f, 0.346924f, 0.597656f, + 0.345459f, 0.593750f, 0.343506f, 0.589355f, 0.342041f, 0.585449f, 0.338623f, 0.581543f, + 0.335938f, 0.577148f, 0.332764f, 0.572754f, 0.328613f, 0.567871f, 0.323242f, 0.562012f, + 0.317139f, 0.556152f, 0.311035f, 0.550293f, 0.303955f, 0.542969f, 0.293945f, 0.534180f, + 0.283203f, 0.524902f, 0.269287f, 0.513672f, 0.252686f, 0.499023f, 0.231812f, 0.478516f, + 0.205200f, 0.448975f, 0.167847f, 0.403320f, 0.111633f, 0.322510f, 0.022476f, 0.130615f, + 0.000000f, 1.000000f, 0.089050f, 0.959961f, 0.144531f, 0.919922f, 0.183838f, 0.885742f, + 0.213135f, 0.856445f, 0.236572f, 0.831543f, 0.255615f, 0.810059f, 0.270996f, 0.791504f, + 0.284180f, 0.774414f, 0.294434f, 0.760254f, 0.304688f, 0.746582f, 0.313232f, 0.734863f, + 0.320801f, 0.723633f, 0.327881f, 0.713379f, 0.333252f, 0.704102f, 0.339355f, 0.695312f, + 0.343506f, 0.687500f, 0.348633f, 0.680176f, 0.353027f, 0.672852f, 0.355469f, 0.666992f, + 0.358887f, 0.660645f, 0.362305f, 0.654785f, 0.365479f, 0.649414f, 0.367188f, 0.644531f, + 0.368652f, 0.640137f, 0.371582f, 0.634766f, 0.374023f, 0.629883f, 0.375244f, 0.625977f, + 0.376709f, 0.622070f, 0.378662f, 0.617676f, 0.378906f, 0.614746f, 0.380127f, 0.610840f, + 0.380859f, 0.607422f, 0.381104f, 0.604492f, 0.381592f, 0.601074f, 0.381592f, 0.598145f, + 0.382324f, 0.595215f, 0.381836f, 0.592285f, 0.381348f, 0.589355f, 0.381104f, 0.586914f, + 0.379883f, 0.583496f, 0.379639f, 0.580078f, 0.377930f, 0.576660f, 0.376221f, 0.573730f, + 0.374756f, 0.570801f, 0.373047f, 0.566406f, 0.370605f, 0.562988f, 0.367920f, 0.559570f, + 0.364258f, 0.555176f, 0.361816f, 0.550781f, 0.356934f, 0.545898f, 0.353027f, 0.541016f, + 0.347168f, 0.535645f, 0.340576f, 0.529297f, 0.333496f, 0.521973f, 0.323975f, 0.513184f, + 0.314209f, 0.503906f, 0.300781f, 0.491943f, 0.285400f, 0.477295f, 0.265137f, 0.458008f, + 0.238403f, 0.431396f, 0.201050f, 0.390625f, 0.141724f, 0.316162f, 0.040771f, 0.134888f, + 0.000000f, 1.000000f, 0.089539f, 0.959961f, 0.146240f, 0.919434f, 0.186401f, 0.884277f, + 0.216553f, 0.854492f, 0.239990f, 0.829590f, 0.259766f, 0.807129f, 0.275879f, 0.787598f, + 0.290527f, 0.770508f, 0.301270f, 0.755371f, 0.311523f, 0.741211f, 0.321045f, 0.728516f, + 0.328857f, 0.717285f, 0.336914f, 0.706055f, 0.343262f, 0.696289f, 0.350586f, 0.687012f, + 0.354736f, 0.678711f, 0.359619f, 0.670898f, 0.364746f, 0.663086f, 0.367920f, 0.656738f, + 0.372070f, 0.649902f, 0.375488f, 0.643555f, 0.378662f, 0.637695f, 0.381836f, 0.631836f, + 0.383789f, 0.627441f, 0.387451f, 0.621582f, 0.390137f, 0.616699f, 0.391602f, 0.611816f, + 0.394287f, 0.607422f, 0.395508f, 0.603027f, 0.396729f, 0.599121f, 0.397949f, 0.595215f, + 0.400391f, 0.590820f, 0.400879f, 0.587402f, 0.402100f, 0.583496f, 0.402588f, 0.580566f, + 0.403564f, 0.576660f, 0.404297f, 0.573242f, 0.404541f, 0.570312f, 0.404785f, 0.566895f, + 0.404785f, 0.563477f, 0.404297f, 0.559082f, 0.403809f, 0.555176f, 0.402832f, 0.551758f, + 0.402100f, 0.548828f, 0.401367f, 0.543945f, 0.399170f, 0.540039f, 0.398193f, 0.535645f, + 0.395264f, 0.531250f, 0.392822f, 0.526367f, 0.389404f, 0.520996f, 0.386230f, 0.515625f, + 0.382080f, 0.509277f, 0.377197f, 0.501953f, 0.371338f, 0.494141f, 0.365234f, 0.485840f, + 0.356201f, 0.475830f, 0.344238f, 0.463379f, 0.331055f, 0.448242f, 0.313477f, 0.429688f, + 0.289795f, 0.403564f, 0.254395f, 0.364502f, 0.199097f, 0.296631f, 0.088806f, 0.127441f, + 0.000000f, 1.000000f, 0.089294f, 0.960449f, 0.147583f, 0.918945f, 0.188965f, 0.882812f, + 0.219849f, 0.853027f, 0.243652f, 0.827148f, 0.264648f, 0.804199f, 0.281006f, 0.784180f, + 0.295654f, 0.766113f, 0.307861f, 0.750000f, 0.319580f, 0.735352f, 0.328857f, 0.722168f, + 0.337891f, 0.710449f, 0.345703f, 0.698730f, 0.353271f, 0.688477f, 0.359863f, 0.678711f, + 0.364746f, 0.670410f, 0.372070f, 0.661133f, 0.376953f, 0.652832f, 0.380859f, 0.645996f, + 0.385254f, 0.638672f, 0.389648f, 0.631836f, 0.393555f, 0.625488f, 0.396729f, 0.619141f, + 0.399170f, 0.613770f, 0.403564f, 0.607910f, 0.407471f, 0.602051f, 0.409424f, 0.597168f, + 0.412598f, 0.591797f, 0.414307f, 0.586914f, 0.417236f, 0.582031f, 0.418945f, 0.577637f, + 0.421387f, 0.573242f, 0.422607f, 0.568848f, 0.424072f, 0.564941f, 0.425293f, 0.561035f, + 0.427246f, 0.556641f, 0.427734f, 0.553223f, 0.428955f, 0.549316f, 0.429443f, 0.545410f, + 0.430420f, 0.541992f, 0.430664f, 0.537109f, 0.430420f, 0.532715f, 0.429932f, 0.528809f, + 0.430420f, 0.524902f, 0.430420f, 0.520508f, 0.429443f, 0.515625f, 0.428711f, 0.510254f, + 0.427246f, 0.506348f, 0.424805f, 0.500488f, 0.423828f, 0.495361f, 0.420654f, 0.488525f, + 0.417480f, 0.482422f, 0.414551f, 0.474854f, 0.409424f, 0.467041f, 0.404053f, 0.457520f, + 0.395996f, 0.446777f, 0.388184f, 0.435547f, 0.376709f, 0.419922f, 0.360840f, 0.401611f, + 0.339844f, 0.375977f, 0.309570f, 0.339355f, 0.257812f, 0.275879f, 0.147339f, 0.119812f, + 0.000000f, 1.000000f, 0.089600f, 0.960449f, 0.147949f, 0.918457f, 0.189697f, 0.882324f, + 0.222778f, 0.851074f, 0.248657f, 0.824219f, 0.269531f, 0.800781f, 0.286621f, 0.780273f, + 0.301025f, 0.761719f, 0.316406f, 0.744629f, 0.327881f, 0.729492f, 0.336670f, 0.715820f, + 0.347168f, 0.703125f, 0.355469f, 0.690918f, 0.363770f, 0.679688f, 0.370850f, 0.669434f, + 0.376709f, 0.660156f, 0.383545f, 0.650879f, 0.390137f, 0.642090f, 0.395264f, 0.633789f, + 0.399902f, 0.626465f, 0.405518f, 0.618652f, 0.408936f, 0.612305f, 0.413330f, 0.605469f, + 0.416992f, 0.599609f, 0.420166f, 0.593750f, 0.424316f, 0.587402f, 0.427734f, 0.581543f, + 0.430176f, 0.576172f, 0.433350f, 0.570801f, 0.436279f, 0.565430f, 0.437988f, 0.561035f, + 0.441162f, 0.555664f, 0.443359f, 0.551270f, 0.444336f, 0.546875f, 0.447510f, 0.542480f, + 0.449219f, 0.537598f, 0.450684f, 0.533691f, 0.452148f, 0.529297f, 0.454346f, 0.524902f, + 0.455566f, 0.520508f, 0.457275f, 0.515625f, 0.457275f, 0.510742f, 0.457520f, 0.506348f, + 0.458740f, 0.501465f, 0.459229f, 0.496826f, 0.459229f, 0.491699f, 0.458252f, 0.486328f, + 0.458496f, 0.480957f, 0.457520f, 0.475098f, 0.457031f, 0.468750f, 0.454834f, 0.462158f, + 0.453369f, 0.455322f, 0.450439f, 0.447266f, 0.447510f, 0.438965f, 0.442871f, 0.429199f, + 0.436523f, 0.418945f, 0.430176f, 0.406494f, 0.420898f, 0.391357f, 0.408203f, 0.372559f, + 0.390381f, 0.348145f, 0.363281f, 0.313232f, 0.317627f, 0.253662f, 0.211304f, 0.111877f, + 0.000000f, 1.000000f, 0.090027f, 0.959961f, 0.149902f, 0.917480f, 0.192383f, 0.880859f, + 0.224854f, 0.849609f, 0.251953f, 0.821777f, 0.273926f, 0.797363f, 0.292236f, 0.775879f, + 0.309326f, 0.756836f, 0.322510f, 0.739258f, 0.336670f, 0.722656f, 0.347412f, 0.708008f, + 0.357178f, 0.694824f, 0.365967f, 0.682617f, 0.375488f, 0.670410f, 0.382324f, 0.660156f, + 0.388916f, 0.650391f, 0.396484f, 0.640625f, 0.402100f, 0.631836f, 0.408936f, 0.622559f, + 0.413086f, 0.615234f, 0.418457f, 0.606934f, 0.423340f, 0.600098f, 0.428711f, 0.592285f, + 0.432861f, 0.585449f, 0.436035f, 0.580078f, 0.441162f, 0.572754f, 0.445068f, 0.566406f, + 0.449463f, 0.560059f, 0.452637f, 0.554199f, 0.455322f, 0.548828f, 0.458252f, 0.543457f, + 0.461182f, 0.538086f, 0.465088f, 0.532715f, 0.467041f, 0.527832f, 0.469238f, 0.522949f, + 0.472412f, 0.518066f, 0.473389f, 0.513672f, 0.476562f, 0.508301f, 0.478271f, 0.503906f, + 0.480713f, 0.499023f, 0.483398f, 0.493896f, 0.483887f, 0.488770f, 0.485352f, 0.483398f, + 0.486084f, 0.478516f, 0.487305f, 0.472900f, 0.488525f, 0.467529f, 0.489746f, 0.461670f, + 0.488770f, 0.455811f, 0.490967f, 0.449463f, 0.488525f, 0.442627f, 0.489258f, 0.436035f, + 0.487549f, 0.428223f, 0.486084f, 0.420654f, 0.485107f, 0.411377f, 0.481934f, 0.401367f, + 0.477295f, 0.390869f, 0.472168f, 0.377686f, 0.464355f, 0.363037f, 0.454590f, 0.344727f, + 0.439209f, 0.320801f, 0.416748f, 0.287354f, 0.375244f, 0.232056f, 0.277344f, 0.102173f, + 0.000000f, 1.000000f, 0.090820f, 0.959473f, 0.151245f, 0.916504f, 0.194946f, 0.879395f, + 0.228638f, 0.847168f, 0.256592f, 0.818848f, 0.278809f, 0.793945f, 0.299316f, 0.770996f, + 0.316895f, 0.750488f, 0.331055f, 0.732910f, 0.344971f, 0.716309f, 0.356201f, 0.701172f, + 0.366211f, 0.687500f, 0.376709f, 0.674316f, 0.384521f, 0.662598f, 0.393066f, 0.651367f, + 0.400879f, 0.640625f, 0.408691f, 0.630371f, 0.415039f, 0.621094f, 0.422119f, 0.611328f, + 0.427490f, 0.603027f, 0.434082f, 0.594238f, 0.440186f, 0.586426f, 0.444336f, 0.578613f, + 0.449219f, 0.571289f, 0.453125f, 0.564941f, 0.458252f, 0.558105f, 0.463135f, 0.551270f, + 0.466797f, 0.544922f, 0.471436f, 0.538086f, 0.475586f, 0.531738f, 0.478760f, 0.525879f, + 0.482666f, 0.520020f, 0.485840f, 0.514160f, 0.488770f, 0.509277f, 0.491211f, 0.503906f, + 0.494385f, 0.498291f, 0.498047f, 0.492920f, 0.500977f, 0.487549f, 0.502930f, 0.482422f, + 0.505859f, 0.477295f, 0.508301f, 0.472168f, 0.509766f, 0.466797f, 0.511719f, 0.460693f, + 0.513672f, 0.455078f, 0.515625f, 0.448975f, 0.517578f, 0.443115f, 0.518555f, 0.437500f, + 0.519043f, 0.430908f, 0.521484f, 0.424072f, 0.521484f, 0.417236f, 0.521973f, 0.409668f, + 0.520996f, 0.402100f, 0.521484f, 0.393555f, 0.520020f, 0.384277f, 0.518066f, 0.374023f, + 0.514648f, 0.363037f, 0.511230f, 0.349609f, 0.506348f, 0.335205f, 0.497803f, 0.317383f, + 0.485596f, 0.294434f, 0.466064f, 0.262695f, 0.430908f, 0.210815f, 0.341797f, 0.092590f, + 0.000000f, 1.000000f, 0.090942f, 0.959473f, 0.152100f, 0.916504f, 0.197632f, 0.877441f, + 0.232910f, 0.844727f, 0.260498f, 0.815918f, 0.285645f, 0.789062f, 0.305664f, 0.766602f, + 0.323486f, 0.746094f, 0.338379f, 0.727539f, 0.352051f, 0.710449f, 0.364502f, 0.694824f, + 0.376221f, 0.680176f, 0.386230f, 0.666504f, 0.396240f, 0.653809f, 0.405518f, 0.641602f, + 0.414062f, 0.629883f, 0.422119f, 0.619629f, 0.428955f, 0.609375f, 0.435547f, 0.600098f, + 0.441406f, 0.590820f, 0.447998f, 0.582031f, 0.454834f, 0.573242f, 0.461182f, 0.564941f, + 0.466309f, 0.557129f, 0.470459f, 0.550293f, 0.476074f, 0.542480f, 0.480225f, 0.535645f, + 0.485352f, 0.528809f, 0.489990f, 0.521973f, 0.495605f, 0.514648f, 0.499023f, 0.508301f, + 0.502441f, 0.502441f, 0.507324f, 0.495850f, 0.510742f, 0.490234f, 0.513184f, 0.484619f, + 0.517090f, 0.478516f, 0.520996f, 0.472656f, 0.524414f, 0.466797f, 0.526855f, 0.461670f, + 0.530762f, 0.455811f, 0.533691f, 0.450195f, 0.536621f, 0.444336f, 0.538574f, 0.438232f, + 0.541016f, 0.431885f, 0.543945f, 0.425537f, 0.545898f, 0.419189f, 0.547363f, 0.413086f, + 0.549316f, 0.406250f, 0.551758f, 0.398682f, 0.553223f, 0.391602f, 0.553711f, 0.384033f, + 0.555176f, 0.375977f, 0.555176f, 0.367432f, 0.555664f, 0.358154f, 0.555176f, 0.347656f, + 0.553223f, 0.336182f, 0.551758f, 0.323486f, 0.547363f, 0.308838f, 0.539551f, 0.290527f, + 0.531250f, 0.268555f, 0.514648f, 0.238770f, 0.484131f, 0.189941f, 0.405762f, 0.083618f, + 0.000000f, 1.000000f, 0.091248f, 0.959473f, 0.154053f, 0.915039f, 0.199951f, 0.876465f, + 0.236572f, 0.841797f, 0.265869f, 0.812012f, 0.290283f, 0.786133f, 0.311035f, 0.762695f, + 0.329102f, 0.741699f, 0.346436f, 0.721680f, 0.359619f, 0.704590f, 0.373779f, 0.687500f, + 0.386475f, 0.671875f, 0.396973f, 0.658203f, 0.406250f, 0.645508f, 0.416016f, 0.632324f, + 0.425049f, 0.620605f, 0.434570f, 0.609375f, 0.442627f, 0.598145f, 0.450439f, 0.587891f, + 0.456299f, 0.578613f, 0.463867f, 0.568848f, 0.471191f, 0.560059f, 0.476318f, 0.551758f, + 0.483398f, 0.542969f, 0.487305f, 0.535156f, 0.494629f, 0.527344f, 0.498291f, 0.520508f, + 0.503906f, 0.512207f, 0.509277f, 0.504883f, 0.515137f, 0.497559f, 0.518555f, 0.490967f, + 0.523438f, 0.484375f, 0.527344f, 0.477783f, 0.532227f, 0.470947f, 0.536133f, 0.465088f, + 0.539551f, 0.458740f, 0.544434f, 0.452148f, 0.547852f, 0.446533f, 0.550781f, 0.440430f, + 0.555176f, 0.434082f, 0.558105f, 0.428223f, 0.561523f, 0.422119f, 0.565918f, 0.415771f, + 0.566895f, 0.409180f, 0.571289f, 0.402100f, 0.573730f, 0.395508f, 0.576172f, 0.389160f, + 0.579102f, 0.382568f, 0.581543f, 0.374268f, 0.583496f, 0.366943f, 0.584961f, 0.359131f, + 0.586426f, 0.350830f, 0.588867f, 0.341797f, 0.588867f, 0.332520f, 0.588867f, 0.321777f, + 0.587891f, 0.310791f, 0.586914f, 0.297607f, 0.584473f, 0.282715f, 0.578613f, 0.265869f, + 0.572266f, 0.244873f, 0.559082f, 0.216064f, 0.533203f, 0.171753f, 0.463867f, 0.074585f, + 0.000000f, 1.000000f, 0.091492f, 0.959473f, 0.155640f, 0.914062f, 0.203247f, 0.874023f, + 0.241089f, 0.839355f, 0.270264f, 0.809082f, 0.295654f, 0.782715f, 0.316895f, 0.758301f, + 0.337402f, 0.735840f, 0.355225f, 0.715332f, 0.369385f, 0.697266f, 0.382324f, 0.680664f, + 0.395264f, 0.664551f, 0.406494f, 0.650391f, 0.417969f, 0.635742f, 0.429443f, 0.622070f, + 0.437256f, 0.610352f, 0.446777f, 0.598145f, 0.455322f, 0.586914f, 0.464600f, 0.576172f, + 0.471680f, 0.565918f, 0.479004f, 0.556152f, 0.485596f, 0.546875f, 0.491943f, 0.537598f, + 0.500000f, 0.528320f, 0.505859f, 0.520020f, 0.511230f, 0.512207f, 0.515625f, 0.504395f, + 0.522461f, 0.496338f, 0.528320f, 0.488281f, 0.534180f, 0.480713f, 0.538574f, 0.473389f, + 0.544922f, 0.466064f, 0.548340f, 0.459229f, 0.553711f, 0.452148f, 0.557129f, 0.445801f, + 0.562988f, 0.438965f, 0.566895f, 0.431885f, 0.570312f, 0.426025f, 0.575195f, 0.419434f, + 0.579102f, 0.412842f, 0.582520f, 0.406738f, 0.587891f, 0.399902f, 0.590820f, 0.393799f, + 0.594727f, 0.386719f, 0.597168f, 0.379883f, 0.600586f, 0.372559f, 0.604492f, 0.365479f, + 0.607910f, 0.358643f, 0.609863f, 0.351074f, 0.612793f, 0.343018f, 0.614746f, 0.334717f, + 0.617676f, 0.326416f, 0.619629f, 0.317139f, 0.620117f, 0.307861f, 0.622070f, 0.297119f, + 0.623047f, 0.286377f, 0.622559f, 0.273193f, 0.621094f, 0.259277f, 0.618164f, 0.243042f, + 0.611816f, 0.222168f, 0.601562f, 0.194824f, 0.579102f, 0.152832f, 0.520508f, 0.066284f, + 0.000000f, 1.000000f, 0.092529f, 0.958984f, 0.156982f, 0.913574f, 0.205566f, 0.873047f, + 0.243896f, 0.837402f, 0.274414f, 0.806641f, 0.301514f, 0.778809f, 0.323975f, 0.753418f, + 0.343750f, 0.730469f, 0.361816f, 0.709961f, 0.378418f, 0.690918f, 0.392578f, 0.673340f, + 0.406006f, 0.656250f, 0.417480f, 0.641602f, 0.428955f, 0.626953f, 0.440674f, 0.612793f, + 0.450684f, 0.599609f, 0.459717f, 0.587402f, 0.469727f, 0.575684f, 0.478271f, 0.564453f, + 0.486084f, 0.553711f, 0.493896f, 0.542969f, 0.500977f, 0.533691f, 0.508301f, 0.523926f, + 0.516602f, 0.513672f, 0.522461f, 0.505371f, 0.528809f, 0.496826f, 0.535156f, 0.488281f, + 0.541016f, 0.480469f, 0.547363f, 0.471680f, 0.553223f, 0.463379f, 0.559082f, 0.455811f, + 0.563477f, 0.448486f, 0.569336f, 0.440918f, 0.574219f, 0.433350f, 0.578613f, 0.426758f, + 0.584473f, 0.419434f, 0.589844f, 0.412109f, 0.592773f, 0.405762f, 0.598633f, 0.398682f, + 0.602051f, 0.392090f, 0.608398f, 0.385010f, 0.611328f, 0.378662f, 0.615723f, 0.371826f, + 0.620117f, 0.365234f, 0.624023f, 0.357666f, 0.626465f, 0.350098f, 0.631348f, 0.342529f, + 0.634766f, 0.335693f, 0.638672f, 0.328125f, 0.640625f, 0.319580f, 0.643555f, 0.311523f, + 0.645996f, 0.303223f, 0.649414f, 0.293457f, 0.651367f, 0.284424f, 0.653320f, 0.273926f, + 0.654297f, 0.262939f, 0.655762f, 0.250244f, 0.654785f, 0.236572f, 0.652344f, 0.220337f, + 0.648438f, 0.201172f, 0.639160f, 0.175293f, 0.622070f, 0.137085f, 0.569336f, 0.059753f, + 0.000000f, 1.000000f, 0.093201f, 0.958496f, 0.159180f, 0.912109f, 0.208008f, 0.871582f, + 0.246216f, 0.835938f, 0.278320f, 0.804199f, 0.306641f, 0.774902f, 0.330811f, 0.748535f, + 0.351074f, 0.726074f, 0.368896f, 0.704590f, 0.386963f, 0.684082f, 0.401611f, 0.666016f, + 0.415283f, 0.648926f, 0.429199f, 0.632324f, 0.441162f, 0.617188f, 0.451660f, 0.603027f, + 0.462891f, 0.589355f, 0.473389f, 0.576172f, 0.482910f, 0.563965f, 0.491455f, 0.552734f, + 0.500977f, 0.541016f, 0.507812f, 0.530273f, 0.517090f, 0.519531f, 0.524414f, 0.509766f, + 0.533203f, 0.499512f, 0.539062f, 0.490479f, 0.546387f, 0.481201f, 0.553223f, 0.472412f, + 0.557617f, 0.464355f, 0.566895f, 0.454834f, 0.572266f, 0.446533f, 0.579102f, 0.438232f, + 0.583496f, 0.430664f, 0.590332f, 0.422607f, 0.595215f, 0.415039f, 0.600098f, 0.407715f, + 0.605957f, 0.400146f, 0.611328f, 0.392578f, 0.616699f, 0.385498f, 0.620605f, 0.378906f, + 0.625488f, 0.371338f, 0.629883f, 0.364502f, 0.635742f, 0.357422f, 0.639160f, 0.350830f, + 0.645508f, 0.343018f, 0.648438f, 0.336426f, 0.652832f, 0.328369f, 0.655273f, 0.320801f, + 0.659668f, 0.313477f, 0.663574f, 0.305664f, 0.668457f, 0.297607f, 0.669922f, 0.289551f, + 0.673828f, 0.280762f, 0.677734f, 0.271729f, 0.680176f, 0.261719f, 0.681641f, 0.251953f, + 0.683105f, 0.240967f, 0.686035f, 0.228760f, 0.686523f, 0.215088f, 0.684570f, 0.200439f, + 0.681152f, 0.180908f, 0.674316f, 0.157593f, 0.660156f, 0.123230f, 0.616211f, 0.052734f, + 0.000000f, 1.000000f, 0.093262f, 0.958496f, 0.161377f, 0.911133f, 0.211060f, 0.869629f, + 0.250244f, 0.833496f, 0.284424f, 0.799805f, 0.312012f, 0.770996f, 0.335938f, 0.744629f, + 0.357910f, 0.720215f, 0.376953f, 0.698242f, 0.395264f, 0.677246f, 0.411621f, 0.658203f, + 0.426270f, 0.640137f, 0.439697f, 0.623535f, 0.453369f, 0.607422f, 0.464844f, 0.593262f, + 0.475098f, 0.579102f, 0.486328f, 0.565430f, 0.497314f, 0.552246f, 0.506348f, 0.540039f, + 0.515625f, 0.528320f, 0.524414f, 0.517090f, 0.533691f, 0.505859f, 0.540039f, 0.496094f, + 0.549805f, 0.484863f, 0.557129f, 0.475098f, 0.562988f, 0.466064f, 0.571777f, 0.456299f, + 0.576660f, 0.447754f, 0.584473f, 0.438721f, 0.591309f, 0.429688f, 0.597656f, 0.420898f, + 0.604004f, 0.412842f, 0.609375f, 0.404785f, 0.615234f, 0.396484f, 0.621094f, 0.388916f, + 0.626465f, 0.381104f, 0.633301f, 0.373535f, 0.637207f, 0.366211f, 0.643066f, 0.358887f, + 0.647949f, 0.351318f, 0.654297f, 0.343750f, 0.657227f, 0.337158f, 0.663086f, 0.329834f, + 0.667480f, 0.322510f, 0.673828f, 0.315186f, 0.675781f, 0.307861f, 0.680176f, 0.299805f, + 0.685059f, 0.292236f, 0.688965f, 0.284424f, 0.693359f, 0.276367f, 0.696289f, 0.268066f, + 0.699707f, 0.259277f, 0.704590f, 0.250244f, 0.706055f, 0.241089f, 0.708984f, 0.231323f, + 0.711914f, 0.220581f, 0.712402f, 0.209106f, 0.713867f, 0.196167f, 0.714355f, 0.181396f, + 0.713379f, 0.163940f, 0.708008f, 0.141846f, 0.696289f, 0.109558f, 0.657715f, 0.046295f, + 0.000000f, 1.000000f, 0.093384f, 0.958496f, 0.162109f, 0.910645f, 0.212891f, 0.868652f, + 0.255371f, 0.830566f, 0.288818f, 0.797363f, 0.318359f, 0.767090f, 0.343262f, 0.739746f, + 0.365479f, 0.714844f, 0.386719f, 0.691406f, 0.403809f, 0.670410f, 0.421875f, 0.650879f, + 0.436279f, 0.632324f, 0.451416f, 0.614258f, 0.464355f, 0.598633f, 0.477051f, 0.583008f, + 0.488770f, 0.567871f, 0.499756f, 0.554199f, 0.511230f, 0.540527f, 0.520996f, 0.527344f, + 0.530273f, 0.515625f, 0.540039f, 0.503418f, 0.548340f, 0.492432f, 0.556641f, 0.481689f, + 0.565918f, 0.470703f, 0.574219f, 0.460449f, 0.580566f, 0.450684f, 0.588379f, 0.440674f, + 0.595215f, 0.431396f, 0.603027f, 0.422607f, 0.609863f, 0.413086f, 0.616211f, 0.404297f, + 0.621582f, 0.395996f, 0.630371f, 0.386475f, 0.636230f, 0.378418f, 0.640625f, 0.370850f, + 0.647949f, 0.362549f, 0.652832f, 0.354736f, 0.659180f, 0.346924f, 0.663086f, 0.340088f, + 0.670898f, 0.331543f, 0.675781f, 0.324219f, 0.680176f, 0.317139f, 0.685059f, 0.310059f, + 0.691406f, 0.302246f, 0.695312f, 0.295166f, 0.699707f, 0.287842f, 0.704102f, 0.279785f, + 0.708496f, 0.271729f, 0.711914f, 0.264160f, 0.717285f, 0.255859f, 0.721191f, 0.248413f, + 0.724609f, 0.239380f, 0.728027f, 0.230347f, 0.732910f, 0.221680f, 0.734863f, 0.211792f, + 0.737305f, 0.201782f, 0.739746f, 0.189697f, 0.740234f, 0.178223f, 0.741699f, 0.164062f, + 0.741211f, 0.147095f, 0.736328f, 0.127441f, 0.728027f, 0.096802f, 0.696777f, 0.040192f, + 0.000000f, 1.000000f, 0.095032f, 0.957520f, 0.163330f, 0.910156f, 0.215698f, 0.867188f, + 0.258789f, 0.828125f, 0.293213f, 0.794434f, 0.323486f, 0.763184f, 0.349365f, 0.735352f, + 0.373779f, 0.708984f, 0.394287f, 0.685547f, 0.414062f, 0.663086f, 0.430420f, 0.643066f, + 0.447510f, 0.623535f, 0.461914f, 0.605957f, 0.475830f, 0.588867f, 0.488770f, 0.572754f, + 0.502441f, 0.557129f, 0.513672f, 0.542969f, 0.524414f, 0.529297f, 0.535645f, 0.515137f, + 0.545898f, 0.502930f, 0.554199f, 0.490723f, 0.564941f, 0.478516f, 0.572754f, 0.467529f, + 0.581055f, 0.457031f, 0.590820f, 0.445312f, 0.598145f, 0.435303f, 0.607422f, 0.424805f, + 0.613281f, 0.415527f, 0.619141f, 0.406494f, 0.628418f, 0.396973f, 0.635254f, 0.387207f, + 0.642090f, 0.378418f, 0.648926f, 0.369385f, 0.655762f, 0.360840f, 0.661133f, 0.352539f, + 0.667969f, 0.344482f, 0.673828f, 0.336182f, 0.678711f, 0.328613f, 0.685059f, 0.320801f, + 0.690918f, 0.312988f, 0.695801f, 0.305420f, 0.701660f, 0.297607f, 0.705566f, 0.291016f, + 0.711426f, 0.283203f, 0.716309f, 0.275635f, 0.723145f, 0.268311f, 0.726562f, 0.260986f, + 0.730469f, 0.252686f, 0.735840f, 0.244385f, 0.739746f, 0.236938f, 0.743164f, 0.229248f, + 0.747559f, 0.220825f, 0.751953f, 0.211792f, 0.755859f, 0.202637f, 0.757324f, 0.194458f, + 0.761230f, 0.183594f, 0.764160f, 0.172974f, 0.766602f, 0.161621f, 0.768066f, 0.148315f, + 0.767578f, 0.132935f, 0.763672f, 0.114380f, 0.756836f, 0.086060f, 0.730469f, 0.035767f, + 0.000000f, 1.000000f, 0.097534f, 0.956055f, 0.164307f, 0.910156f, 0.219727f, 0.865234f, + 0.261963f, 0.826172f, 0.299316f, 0.790527f, 0.329834f, 0.758789f, 0.357178f, 0.729980f, + 0.380127f, 0.704102f, 0.403076f, 0.679199f, 0.422607f, 0.656738f, 0.439697f, 0.635742f, + 0.457764f, 0.615723f, 0.472168f, 0.597168f, 0.487305f, 0.579102f, 0.500977f, 0.562500f, + 0.513184f, 0.546875f, 0.527344f, 0.531738f, 0.537598f, 0.517090f, 0.549316f, 0.503418f, + 0.558594f, 0.490723f, 0.569336f, 0.478027f, 0.578613f, 0.465576f, 0.589355f, 0.453369f, + 0.596680f, 0.442627f, 0.607422f, 0.430664f, 0.614746f, 0.420166f, 0.623535f, 0.409668f, + 0.631836f, 0.399414f, 0.638184f, 0.390137f, 0.645020f, 0.381104f, 0.652832f, 0.370850f, + 0.661621f, 0.361572f, 0.666992f, 0.352783f, 0.674316f, 0.343506f, 0.680664f, 0.335205f, + 0.687012f, 0.326660f, 0.693359f, 0.318359f, 0.698242f, 0.310791f, 0.705078f, 0.302490f, + 0.710938f, 0.294922f, 0.716309f, 0.286865f, 0.721680f, 0.279297f, 0.726074f, 0.272217f, + 0.732910f, 0.264160f, 0.737305f, 0.257324f, 0.742188f, 0.249756f, 0.748047f, 0.242676f, + 0.751953f, 0.234619f, 0.756348f, 0.226562f, 0.761230f, 0.218872f, 0.765137f, 0.211060f, + 0.770020f, 0.203003f, 0.773926f, 0.194336f, 0.775879f, 0.185913f, 0.780762f, 0.176880f, + 0.784180f, 0.166870f, 0.788574f, 0.156982f, 0.788574f, 0.146240f, 0.791016f, 0.133057f, + 0.791992f, 0.119263f, 0.789062f, 0.101868f, 0.782227f, 0.077637f, 0.762695f, 0.031021f, + 0.000000f, 1.000000f, 0.097351f, 0.956543f, 0.166748f, 0.908691f, 0.221558f, 0.863770f, + 0.266113f, 0.823730f, 0.302734f, 0.788086f, 0.335693f, 0.754883f, 0.363037f, 0.725586f, + 0.388916f, 0.697754f, 0.411621f, 0.672363f, 0.432617f, 0.648926f, 0.450684f, 0.627441f, + 0.468506f, 0.606934f, 0.484863f, 0.587402f, 0.499756f, 0.569336f, 0.513184f, 0.552246f, + 0.527344f, 0.535645f, 0.539551f, 0.520508f, 0.551758f, 0.505371f, 0.563965f, 0.490967f, + 0.574707f, 0.477295f, 0.584473f, 0.464600f, 0.594238f, 0.451904f, 0.604492f, 0.439453f, + 0.613770f, 0.427734f, 0.622559f, 0.416748f, 0.631836f, 0.405029f, 0.640625f, 0.394531f, + 0.648438f, 0.384033f, 0.654785f, 0.374512f, 0.663086f, 0.364746f, 0.669922f, 0.355225f, + 0.678223f, 0.345459f, 0.687012f, 0.335938f, 0.692871f, 0.326904f, 0.697754f, 0.318604f, + 0.706055f, 0.309326f, 0.711914f, 0.301270f, 0.717773f, 0.292969f, 0.723633f, 0.285156f, + 0.730469f, 0.277100f, 0.734863f, 0.269531f, 0.741211f, 0.261719f, 0.747070f, 0.254395f, + 0.751465f, 0.246948f, 0.757324f, 0.239258f, 0.761719f, 0.232300f, 0.767578f, 0.225098f, + 0.772461f, 0.217407f, 0.776367f, 0.209839f, 0.781250f, 0.201660f, 0.785156f, 0.194092f, + 0.790039f, 0.186035f, 0.794922f, 0.178467f, 0.797852f, 0.169800f, 0.800781f, 0.161255f, + 0.806152f, 0.152466f, 0.807129f, 0.142822f, 0.810059f, 0.132080f, 0.813477f, 0.120728f, + 0.812500f, 0.107483f, 0.812012f, 0.090820f, 0.807129f, 0.068665f, 0.789551f, 0.027405f, + 0.000000f, 1.000000f, 0.098022f, 0.956543f, 0.168701f, 0.907227f, 0.224121f, 0.862305f, + 0.269531f, 0.821289f, 0.307861f, 0.784668f, 0.340576f, 0.751465f, 0.370850f, 0.720215f, + 0.396973f, 0.691895f, 0.419678f, 0.666504f, 0.440430f, 0.642578f, 0.461670f, 0.619629f, + 0.479492f, 0.598145f, 0.496582f, 0.578125f, 0.511719f, 0.559570f, 0.526367f, 0.541992f, + 0.539551f, 0.525391f, 0.552246f, 0.509277f, 0.566406f, 0.493408f, 0.577637f, 0.479248f, + 0.589355f, 0.464600f, 0.599609f, 0.451416f, 0.608887f, 0.438965f, 0.620117f, 0.425537f, + 0.629395f, 0.413574f, 0.638184f, 0.402344f, 0.648926f, 0.390381f, 0.657715f, 0.379639f, + 0.664062f, 0.369141f, 0.672363f, 0.358643f, 0.681152f, 0.348389f, 0.687988f, 0.339111f, + 0.694824f, 0.330078f, 0.703613f, 0.319824f, 0.709961f, 0.310791f, 0.716797f, 0.301758f, + 0.723145f, 0.293213f, 0.729492f, 0.284668f, 0.735840f, 0.276367f, 0.741211f, 0.268555f, + 0.748535f, 0.260254f, 0.753906f, 0.252686f, 0.759766f, 0.244873f, 0.764160f, 0.237793f, + 0.770996f, 0.229858f, 0.775391f, 0.222656f, 0.780273f, 0.215454f, 0.785645f, 0.208374f, + 0.791016f, 0.200928f, 0.795898f, 0.193848f, 0.799316f, 0.186157f, 0.804199f, 0.178101f, + 0.808594f, 0.170532f, 0.813477f, 0.162842f, 0.816895f, 0.155762f, 0.820312f, 0.146851f, + 0.823730f, 0.138184f, 0.825684f, 0.129028f, 0.830566f, 0.119080f, 0.831055f, 0.108643f, + 0.831543f, 0.096436f, 0.832031f, 0.081421f, 0.829102f, 0.061523f, 0.813477f, 0.023743f, + 0.000000f, 1.000000f, 0.096558f, 0.957520f, 0.170044f, 0.906738f, 0.227783f, 0.859863f, + 0.273926f, 0.818848f, 0.312988f, 0.781250f, 0.347412f, 0.746582f, 0.377441f, 0.715332f, + 0.405029f, 0.686523f, 0.429199f, 0.659668f, 0.450439f, 0.635254f, 0.470215f, 0.611816f, + 0.489990f, 0.589844f, 0.506836f, 0.569336f, 0.522461f, 0.550293f, 0.538086f, 0.531738f, + 0.552246f, 0.514160f, 0.565430f, 0.498047f, 0.578613f, 0.481934f, 0.590332f, 0.467529f, + 0.602539f, 0.452637f, 0.614746f, 0.438477f, 0.623535f, 0.425537f, 0.634766f, 0.412354f, + 0.645020f, 0.399658f, 0.654297f, 0.387939f, 0.663574f, 0.376221f, 0.672363f, 0.365234f, + 0.681152f, 0.354004f, 0.689453f, 0.343506f, 0.698242f, 0.333252f, 0.705566f, 0.323486f, + 0.711426f, 0.314453f, 0.719238f, 0.304688f, 0.727051f, 0.294922f, 0.733398f, 0.286377f, + 0.741211f, 0.277100f, 0.747559f, 0.268311f, 0.753418f, 0.260498f, 0.758789f, 0.252441f, + 0.765625f, 0.244263f, 0.771973f, 0.236206f, 0.775391f, 0.229248f, 0.782227f, 0.221191f, + 0.787598f, 0.214111f, 0.792969f, 0.206543f, 0.797363f, 0.199829f, 0.803223f, 0.192505f, + 0.808105f, 0.185425f, 0.812988f, 0.178467f, 0.817383f, 0.172119f, 0.821289f, 0.163696f, + 0.825684f, 0.156250f, 0.830566f, 0.148804f, 0.833984f, 0.141846f, 0.837891f, 0.133545f, + 0.840820f, 0.125122f, 0.844238f, 0.117432f, 0.847168f, 0.107483f, 0.849609f, 0.097961f, + 0.850586f, 0.086731f, 0.852539f, 0.072998f, 0.849121f, 0.053864f, 0.836426f, 0.021317f, + 0.000000f, 1.000000f, 0.096985f, 0.957520f, 0.172363f, 0.905762f, 0.229614f, 0.859375f, + 0.277832f, 0.816406f, 0.318115f, 0.777832f, 0.353516f, 0.742676f, 0.384766f, 0.709961f, + 0.411865f, 0.680664f, 0.437500f, 0.653320f, 0.460449f, 0.627441f, 0.480957f, 0.603516f, + 0.499268f, 0.581543f, 0.519043f, 0.560059f, 0.535645f, 0.540039f, 0.550781f, 0.521484f, + 0.564941f, 0.503906f, 0.580078f, 0.486572f, 0.592285f, 0.470703f, 0.604492f, 0.455078f, + 0.617676f, 0.439941f, 0.628906f, 0.425537f, 0.640137f, 0.411865f, 0.649902f, 0.399170f, + 0.660156f, 0.385986f, 0.669922f, 0.374023f, 0.679199f, 0.362305f, 0.687988f, 0.351074f, + 0.697754f, 0.339355f, 0.704102f, 0.329102f, 0.713867f, 0.318359f, 0.722168f, 0.308350f, + 0.727539f, 0.299316f, 0.735352f, 0.289795f, 0.743652f, 0.279785f, 0.750977f, 0.270996f, + 0.756836f, 0.261963f, 0.763672f, 0.253174f, 0.770020f, 0.244873f, 0.775391f, 0.237183f, + 0.781738f, 0.228760f, 0.789062f, 0.220947f, 0.791992f, 0.213867f, 0.799316f, 0.206055f, + 0.805664f, 0.198608f, 0.808105f, 0.192139f, 0.813965f, 0.184692f, 0.819824f, 0.177856f, + 0.824219f, 0.170776f, 0.829590f, 0.164062f, 0.833984f, 0.157593f, 0.838379f, 0.150391f, + 0.841797f, 0.143066f, 0.844727f, 0.136108f, 0.850098f, 0.128418f, 0.854004f, 0.121460f, + 0.857422f, 0.113831f, 0.860840f, 0.105225f, 0.863770f, 0.097351f, 0.864746f, 0.088013f, + 0.867188f, 0.077576f, 0.867676f, 0.065186f, 0.868164f, 0.047791f, 0.855957f, 0.018372f, + 0.000000f, 1.000000f, 0.097534f, 0.957031f, 0.172974f, 0.905273f, 0.233032f, 0.856934f, + 0.282471f, 0.813477f, 0.324219f, 0.773926f, 0.360107f, 0.738281f, 0.391846f, 0.705078f, + 0.419678f, 0.674805f, 0.447021f, 0.645996f, 0.469727f, 0.620605f, 0.491455f, 0.595703f, + 0.511719f, 0.572754f, 0.529297f, 0.550781f, 0.545898f, 0.530762f, 0.562500f, 0.511719f, + 0.579102f, 0.492676f, 0.593750f, 0.474854f, 0.605957f, 0.458984f, 0.619629f, 0.442871f, + 0.630859f, 0.427734f, 0.642090f, 0.413330f, 0.655273f, 0.398682f, 0.665527f, 0.385498f, + 0.675293f, 0.372803f, 0.684570f, 0.360596f, 0.694336f, 0.348145f, 0.702637f, 0.337158f, + 0.711914f, 0.325684f, 0.720703f, 0.314453f, 0.729004f, 0.304199f, 0.736328f, 0.293945f, + 0.743652f, 0.284424f, 0.750488f, 0.274902f, 0.758301f, 0.265869f, 0.765625f, 0.256348f, + 0.773438f, 0.247559f, 0.779785f, 0.238403f, 0.785645f, 0.230347f, 0.791504f, 0.222412f, + 0.798340f, 0.213745f, 0.801758f, 0.206909f, 0.809082f, 0.199097f, 0.813965f, 0.192017f, + 0.819336f, 0.184326f, 0.825195f, 0.177612f, 0.830078f, 0.170654f, 0.835449f, 0.163696f, + 0.839844f, 0.157227f, 0.843750f, 0.150879f, 0.849609f, 0.144043f, 0.854492f, 0.137573f, + 0.857422f, 0.131104f, 0.861328f, 0.124023f, 0.865234f, 0.116577f, 0.867676f, 0.109924f, + 0.872070f, 0.103149f, 0.875488f, 0.094849f, 0.877930f, 0.087708f, 0.880371f, 0.078979f, + 0.882812f, 0.069092f, 0.883789f, 0.058105f, 0.881348f, 0.042664f, 0.875000f, 0.016068f, + 0.000000f, 1.000000f, 0.098633f, 0.956543f, 0.175781f, 0.903809f, 0.235596f, 0.855957f, + 0.286865f, 0.811035f, 0.329346f, 0.770996f, 0.366699f, 0.733887f, 0.398682f, 0.700195f, + 0.428955f, 0.668457f, 0.455566f, 0.639648f, 0.479004f, 0.612793f, 0.500977f, 0.587891f, + 0.522949f, 0.563477f, 0.541504f, 0.541504f, 0.558594f, 0.520508f, 0.576172f, 0.500488f, + 0.591309f, 0.481689f, 0.605957f, 0.464355f, 0.619629f, 0.447266f, 0.633301f, 0.430908f, + 0.646973f, 0.415039f, 0.656738f, 0.400635f, 0.669434f, 0.385986f, 0.679199f, 0.372559f, + 0.688965f, 0.359863f, 0.698730f, 0.347412f, 0.708496f, 0.334717f, 0.718262f, 0.322998f, + 0.727539f, 0.311768f, 0.736328f, 0.300781f, 0.743164f, 0.290527f, 0.751953f, 0.279785f, + 0.758789f, 0.270020f, 0.767090f, 0.260742f, 0.771973f, 0.251953f, 0.779297f, 0.242798f, + 0.788574f, 0.233398f, 0.793945f, 0.224854f, 0.800781f, 0.216187f, 0.807129f, 0.208252f, + 0.812012f, 0.200317f, 0.818359f, 0.192749f, 0.824707f, 0.185181f, 0.828613f, 0.178101f, + 0.833984f, 0.171021f, 0.839355f, 0.164185f, 0.844238f, 0.157471f, 0.848633f, 0.150757f, + 0.853027f, 0.144653f, 0.858887f, 0.137939f, 0.863281f, 0.131470f, 0.867676f, 0.125488f, + 0.871582f, 0.119629f, 0.875977f, 0.112793f, 0.878906f, 0.105774f, 0.881348f, 0.099548f, + 0.886719f, 0.092590f, 0.889160f, 0.086121f, 0.891113f, 0.078796f, 0.895508f, 0.069946f, + 0.895508f, 0.062012f, 0.897949f, 0.051208f, 0.896973f, 0.038055f, 0.893066f, 0.013466f, + 0.000000f, 1.000000f, 0.100159f, 0.955566f, 0.176392f, 0.903320f, 0.239258f, 0.853516f, + 0.291016f, 0.808105f, 0.335693f, 0.766602f, 0.372803f, 0.729492f, 0.405762f, 0.694824f, + 0.436035f, 0.662598f, 0.463623f, 0.633301f, 0.489502f, 0.605469f, 0.511230f, 0.579590f, + 0.532715f, 0.555176f, 0.551758f, 0.532715f, 0.571289f, 0.510742f, 0.588379f, 0.490234f, + 0.604004f, 0.471191f, 0.617188f, 0.453369f, 0.632324f, 0.435791f, 0.645020f, 0.419189f, + 0.658691f, 0.403564f, 0.670410f, 0.388184f, 0.682617f, 0.373779f, 0.693359f, 0.359863f, + 0.703125f, 0.346680f, 0.712402f, 0.334229f, 0.724121f, 0.321289f, 0.732910f, 0.309570f, + 0.740234f, 0.298584f, 0.749512f, 0.287598f, 0.758301f, 0.276855f, 0.765625f, 0.266357f, + 0.772949f, 0.256348f, 0.782227f, 0.246582f, 0.787598f, 0.237915f, 0.793945f, 0.229248f, + 0.801758f, 0.220337f, 0.807617f, 0.211670f, 0.813965f, 0.203247f, 0.821289f, 0.194824f, + 0.826660f, 0.187134f, 0.831543f, 0.179810f, 0.838379f, 0.172241f, 0.843262f, 0.165039f, + 0.847656f, 0.158325f, 0.853516f, 0.151489f, 0.857422f, 0.144897f, 0.862305f, 0.138428f, + 0.866699f, 0.132690f, 0.871582f, 0.125977f, 0.876465f, 0.120117f, 0.879395f, 0.114685f, + 0.885254f, 0.107971f, 0.889160f, 0.102600f, 0.891113f, 0.096558f, 0.895020f, 0.089722f, + 0.898926f, 0.083252f, 0.901367f, 0.077332f, 0.905273f, 0.071045f, 0.906738f, 0.062805f, + 0.910645f, 0.054810f, 0.910156f, 0.046295f, 0.911133f, 0.033295f, 0.906250f, 0.012779f, + 0.000000f, 1.000000f, 0.101318f, 0.955078f, 0.177979f, 0.902832f, 0.242188f, 0.852051f, + 0.294434f, 0.806152f, 0.340088f, 0.763672f, 0.378906f, 0.725098f, 0.414307f, 0.689453f, + 0.445557f, 0.656738f, 0.473633f, 0.625977f, 0.498047f, 0.598145f, 0.521484f, 0.571289f, + 0.543945f, 0.545898f, 0.562988f, 0.523438f, 0.583496f, 0.500977f, 0.598633f, 0.480957f, + 0.614746f, 0.461182f, 0.630371f, 0.442383f, 0.645508f, 0.424561f, 0.660156f, 0.407227f, + 0.671875f, 0.391602f, 0.685547f, 0.375732f, 0.696777f, 0.361572f, 0.706543f, 0.347656f, + 0.718262f, 0.333984f, 0.726562f, 0.321289f, 0.737305f, 0.308838f, 0.746094f, 0.296875f, + 0.756348f, 0.285156f, 0.764160f, 0.274170f, 0.770996f, 0.264404f, 0.779785f, 0.253418f, + 0.787598f, 0.243408f, 0.795410f, 0.233765f, 0.802246f, 0.224609f, 0.807129f, 0.216309f, + 0.815430f, 0.207397f, 0.820312f, 0.199341f, 0.826660f, 0.191162f, 0.834961f, 0.182251f, + 0.839844f, 0.174927f, 0.844238f, 0.167480f, 0.851074f, 0.160034f, 0.856445f, 0.152954f, + 0.860352f, 0.146484f, 0.865723f, 0.139771f, 0.870605f, 0.133179f, 0.874023f, 0.127686f, + 0.879883f, 0.121033f, 0.884766f, 0.114929f, 0.887207f, 0.109680f, 0.892578f, 0.103516f, + 0.895996f, 0.098083f, 0.899902f, 0.092773f, 0.904297f, 0.087219f, 0.907715f, 0.080933f, + 0.909180f, 0.075745f, 0.913574f, 0.068542f, 0.915527f, 0.063354f, 0.919434f, 0.056274f, + 0.920410f, 0.049133f, 0.922852f, 0.040192f, 0.923340f, 0.029037f, 0.918945f, 0.010727f, + 0.000000f, 1.000000f, 0.101074f, 0.955566f, 0.181641f, 0.900879f, 0.244019f, 0.850586f, + 0.299316f, 0.803223f, 0.346680f, 0.759766f, 0.386475f, 0.720215f, 0.422119f, 0.683594f, + 0.453125f, 0.650391f, 0.481689f, 0.619141f, 0.508789f, 0.589844f, 0.532227f, 0.562988f, + 0.555176f, 0.537598f, 0.575195f, 0.513672f, 0.594238f, 0.491455f, 0.611816f, 0.470215f, + 0.627930f, 0.450195f, 0.643555f, 0.431396f, 0.659180f, 0.412842f, 0.672363f, 0.396240f, + 0.684570f, 0.379883f, 0.697266f, 0.364258f, 0.708984f, 0.349609f, 0.720703f, 0.335205f, + 0.731934f, 0.321777f, 0.740723f, 0.308838f, 0.750488f, 0.296387f, 0.759277f, 0.284668f, + 0.768555f, 0.272705f, 0.778809f, 0.261230f, 0.785156f, 0.251465f, 0.793457f, 0.241089f, + 0.800293f, 0.231201f, 0.809082f, 0.221191f, 0.814941f, 0.212280f, 0.821289f, 0.203613f, + 0.829102f, 0.194702f, 0.833496f, 0.187134f, 0.839844f, 0.179321f, 0.846680f, 0.170776f, + 0.852051f, 0.163330f, 0.858398f, 0.155518f, 0.862305f, 0.148560f, 0.868164f, 0.141724f, + 0.873047f, 0.135254f, 0.877930f, 0.128418f, 0.881836f, 0.122742f, 0.887207f, 0.116272f, + 0.891602f, 0.110535f, 0.894043f, 0.105164f, 0.900391f, 0.099365f, 0.903809f, 0.093689f, + 0.907227f, 0.089172f, 0.911621f, 0.082947f, 0.915039f, 0.078430f, 0.918457f, 0.073120f, + 0.920898f, 0.067749f, 0.924316f, 0.061584f, 0.926270f, 0.055939f, 0.930664f, 0.049683f, + 0.932129f, 0.043274f, 0.934082f, 0.035919f, 0.934082f, 0.025879f, 0.931152f, 0.010231f, + 0.000000f, 1.000000f, 0.101440f, 0.955078f, 0.181763f, 0.900879f, 0.247925f, 0.848633f, + 0.303467f, 0.800781f, 0.351562f, 0.756348f, 0.393311f, 0.715820f, 0.429199f, 0.678711f, + 0.462646f, 0.644043f, 0.491455f, 0.612305f, 0.518555f, 0.582520f, 0.542969f, 0.554688f, + 0.564941f, 0.529297f, 0.586914f, 0.504395f, 0.605469f, 0.481689f, 0.624023f, 0.459961f, + 0.639648f, 0.439941f, 0.656738f, 0.420410f, 0.671387f, 0.402344f, 0.683594f, 0.385254f, + 0.698242f, 0.368164f, 0.709961f, 0.352783f, 0.721680f, 0.337891f, 0.733887f, 0.323242f, + 0.743652f, 0.310059f, 0.752930f, 0.296875f, 0.763184f, 0.284180f, 0.772461f, 0.272217f, + 0.782715f, 0.260742f, 0.790527f, 0.249634f, 0.797852f, 0.239136f, 0.805664f, 0.228760f, + 0.812012f, 0.219727f, 0.820801f, 0.209717f, 0.826660f, 0.200562f, 0.834961f, 0.191284f, + 0.839844f, 0.183350f, 0.845703f, 0.175293f, 0.852539f, 0.167358f, 0.856934f, 0.160278f, + 0.864746f, 0.152344f, 0.868652f, 0.145020f, 0.874512f, 0.137695f, 0.880371f, 0.131226f, + 0.885254f, 0.124084f, 0.887207f, 0.119202f, 0.894043f, 0.111816f, 0.897461f, 0.106445f, + 0.903809f, 0.100586f, 0.905762f, 0.095093f, 0.909180f, 0.090454f, 0.915039f, 0.084290f, + 0.916992f, 0.079895f, 0.922363f, 0.074341f, 0.924805f, 0.070007f, 0.928711f, 0.064880f, + 0.931641f, 0.060455f, 0.934570f, 0.055267f, 0.937012f, 0.049316f, 0.938965f, 0.043762f, + 0.942383f, 0.038239f, 0.943359f, 0.031235f, 0.945801f, 0.022858f, 0.943359f, 0.008293f, + 0.000000f, 1.000000f, 0.101990f, 0.955078f, 0.184082f, 0.899414f, 0.251709f, 0.846680f, + 0.308105f, 0.797363f, 0.358398f, 0.751953f, 0.399414f, 0.710938f, 0.436523f, 0.673340f, + 0.469238f, 0.638184f, 0.500000f, 0.605469f, 0.527832f, 0.575195f, 0.553223f, 0.546387f, + 0.575684f, 0.520020f, 0.595703f, 0.496094f, 0.617676f, 0.471924f, 0.635254f, 0.450195f, + 0.652832f, 0.429443f, 0.667480f, 0.410400f, 0.682617f, 0.391846f, 0.697754f, 0.373535f, + 0.710938f, 0.356934f, 0.724121f, 0.341064f, 0.734375f, 0.326416f, 0.745605f, 0.312012f, + 0.755859f, 0.298340f, 0.765625f, 0.285400f, 0.776367f, 0.272461f, 0.785645f, 0.260254f, + 0.794922f, 0.249023f, 0.802246f, 0.238403f, 0.811035f, 0.227417f, 0.818359f, 0.217041f, + 0.825195f, 0.207764f, 0.831543f, 0.198608f, 0.839355f, 0.189331f, 0.846191f, 0.180420f, + 0.851562f, 0.172119f, 0.858887f, 0.163818f, 0.863281f, 0.156372f, 0.870117f, 0.149170f, + 0.874512f, 0.141968f, 0.878906f, 0.135742f, 0.886230f, 0.127563f, 0.890137f, 0.121521f, + 0.895996f, 0.114380f, 0.899414f, 0.108704f, 0.904785f, 0.102539f, 0.908203f, 0.097107f, + 0.913086f, 0.091370f, 0.916016f, 0.086487f, 0.920410f, 0.081055f, 0.923828f, 0.076172f, + 0.926758f, 0.071655f, 0.930664f, 0.066711f, 0.933594f, 0.062225f, 0.937500f, 0.057587f, + 0.939941f, 0.053406f, 0.944336f, 0.048767f, 0.946289f, 0.044495f, 0.949219f, 0.038361f, + 0.951660f, 0.032867f, 0.953125f, 0.027573f, 0.953613f, 0.019714f, 0.954102f, 0.007561f, + 0.000000f, 1.000000f, 0.103210f, 0.954102f, 0.184937f, 0.898926f, 0.254639f, 0.844727f, + 0.312012f, 0.794922f, 0.362549f, 0.749023f, 0.405273f, 0.707031f, 0.444092f, 0.667969f, + 0.479248f, 0.631348f, 0.510742f, 0.598145f, 0.537109f, 0.567383f, 0.562988f, 0.538574f, + 0.586426f, 0.511719f, 0.608398f, 0.486328f, 0.627930f, 0.462891f, 0.645508f, 0.440674f, + 0.662598f, 0.419922f, 0.679688f, 0.399658f, 0.694824f, 0.381104f, 0.709961f, 0.363037f, + 0.723633f, 0.345947f, 0.735352f, 0.330566f, 0.745117f, 0.315430f, 0.757812f, 0.300781f, + 0.768066f, 0.287354f, 0.777832f, 0.273926f, 0.788574f, 0.261230f, 0.797852f, 0.249390f, + 0.806152f, 0.237671f, 0.812988f, 0.227539f, 0.822754f, 0.216431f, 0.829102f, 0.206665f, + 0.837402f, 0.196167f, 0.843262f, 0.187866f, 0.850098f, 0.178345f, 0.856934f, 0.170532f, + 0.863281f, 0.161499f, 0.869141f, 0.153809f, 0.875000f, 0.145874f, 0.880371f, 0.138794f, + 0.885254f, 0.131714f, 0.889648f, 0.125488f, 0.895020f, 0.118896f, 0.899414f, 0.112488f, + 0.904785f, 0.105896f, 0.909668f, 0.099670f, 0.914551f, 0.093872f, 0.917969f, 0.088379f, + 0.922363f, 0.083069f, 0.925781f, 0.077759f, 0.929199f, 0.073120f, 0.932617f, 0.068115f, + 0.936523f, 0.063599f, 0.939941f, 0.058990f, 0.943359f, 0.054779f, 0.946777f, 0.050354f, + 0.948730f, 0.046722f, 0.952148f, 0.042236f, 0.955566f, 0.038208f, 0.958984f, 0.034027f, + 0.959473f, 0.028656f, 0.962402f, 0.022903f, 0.964355f, 0.017456f, 0.962891f, 0.006824f, + 0.000000f, 1.000000f, 0.103149f, 0.954590f, 0.187622f, 0.897949f, 0.257568f, 0.843262f, + 0.317871f, 0.791992f, 0.369629f, 0.744629f, 0.412842f, 0.702148f, 0.453125f, 0.661621f, + 0.487061f, 0.625488f, 0.518066f, 0.591797f, 0.546875f, 0.560059f, 0.573730f, 0.530273f, + 0.596191f, 0.503418f, 0.619141f, 0.477051f, 0.639160f, 0.453125f, 0.659180f, 0.430420f, + 0.674805f, 0.409424f, 0.691406f, 0.389404f, 0.706055f, 0.370361f, 0.720703f, 0.352539f, + 0.733887f, 0.335449f, 0.746582f, 0.319580f, 0.756348f, 0.304932f, 0.770020f, 0.289551f, + 0.781738f, 0.275391f, 0.790527f, 0.263428f, 0.799316f, 0.250488f, 0.809082f, 0.238403f, + 0.817383f, 0.227417f, 0.825684f, 0.215942f, 0.833008f, 0.205811f, 0.839844f, 0.196167f, + 0.848145f, 0.186157f, 0.854492f, 0.177002f, 0.861328f, 0.168213f, 0.867676f, 0.159668f, + 0.873047f, 0.152100f, 0.879395f, 0.144165f, 0.885254f, 0.136353f, 0.890137f, 0.129150f, + 0.895996f, 0.122375f, 0.900391f, 0.115967f, 0.904785f, 0.109680f, 0.909180f, 0.103760f, + 0.913574f, 0.097961f, 0.918945f, 0.091736f, 0.922363f, 0.085876f, 0.926758f, 0.080383f, + 0.930664f, 0.075012f, 0.935059f, 0.070068f, 0.938477f, 0.065186f, 0.942383f, 0.060944f, + 0.944824f, 0.056366f, 0.948730f, 0.051880f, 0.951172f, 0.047943f, 0.953613f, 0.044098f, + 0.957520f, 0.040131f, 0.960449f, 0.036285f, 0.962402f, 0.032806f, 0.965820f, 0.028778f, + 0.968750f, 0.025314f, 0.970215f, 0.019409f, 0.971191f, 0.013916f, 0.971680f, 0.004665f, + 0.000000f, 1.000000f, 0.104492f, 0.953613f, 0.189575f, 0.896973f, 0.261230f, 0.840820f, + 0.322021f, 0.789062f, 0.375244f, 0.741211f, 0.421143f, 0.696777f, 0.459717f, 0.656738f, + 0.496582f, 0.618652f, 0.529297f, 0.583984f, 0.558105f, 0.551758f, 0.583008f, 0.522461f, + 0.607422f, 0.494385f, 0.631348f, 0.468262f, 0.650879f, 0.443604f, 0.667969f, 0.421143f, + 0.685547f, 0.399902f, 0.704102f, 0.379639f, 0.719238f, 0.360352f, 0.733398f, 0.342041f, + 0.746094f, 0.325439f, 0.758301f, 0.309082f, 0.769531f, 0.293945f, 0.781250f, 0.279053f, + 0.791016f, 0.265625f, 0.801758f, 0.252197f, 0.811035f, 0.239746f, 0.819336f, 0.228149f, + 0.828125f, 0.216675f, 0.835449f, 0.206299f, 0.844727f, 0.195557f, 0.852051f, 0.185425f, + 0.858398f, 0.176147f, 0.864258f, 0.167725f, 0.871582f, 0.158569f, 0.877930f, 0.149902f, + 0.883301f, 0.142334f, 0.888672f, 0.134766f, 0.893555f, 0.127930f, 0.899414f, 0.120667f, + 0.905273f, 0.113342f, 0.910645f, 0.106750f, 0.914551f, 0.100708f, 0.919434f, 0.094727f, + 0.921875f, 0.089539f, 0.926270f, 0.084106f, 0.930176f, 0.079163f, 0.935059f, 0.073425f, + 0.939941f, 0.067627f, 0.943359f, 0.063049f, 0.946289f, 0.058472f, 0.950195f, 0.053711f, + 0.952637f, 0.049927f, 0.956055f, 0.045410f, 0.958496f, 0.041595f, 0.961426f, 0.038086f, + 0.964844f, 0.033997f, 0.967285f, 0.030716f, 0.970215f, 0.027283f, 0.972656f, 0.023804f, + 0.974609f, 0.020844f, 0.979004f, 0.016663f, 0.978027f, 0.011475f, 0.979980f, 0.004517f, + 0.000000f, 1.000000f, 0.103699f, 0.954590f, 0.191895f, 0.895508f, 0.263916f, 0.839355f, + 0.325439f, 0.786621f, 0.379150f, 0.737793f, 0.427002f, 0.692383f, 0.467773f, 0.650879f, + 0.503418f, 0.612793f, 0.537109f, 0.577637f, 0.566406f, 0.544434f, 0.594238f, 0.514160f, + 0.618164f, 0.485840f, 0.641113f, 0.459229f, 0.661133f, 0.434814f, 0.680664f, 0.411377f, + 0.698242f, 0.389648f, 0.713379f, 0.369629f, 0.729492f, 0.350098f, 0.743164f, 0.332031f, + 0.757324f, 0.314941f, 0.768555f, 0.298828f, 0.780762f, 0.283447f, 0.791992f, 0.269043f, + 0.802734f, 0.255127f, 0.812500f, 0.242188f, 0.820801f, 0.230103f, 0.830566f, 0.217773f, + 0.839355f, 0.206665f, 0.846680f, 0.196045f, 0.854004f, 0.185669f, 0.860840f, 0.176147f, + 0.867676f, 0.167114f, 0.875488f, 0.157715f, 0.879883f, 0.149658f, 0.886719f, 0.141235f, + 0.892578f, 0.133545f, 0.899414f, 0.125488f, 0.902832f, 0.118835f, 0.909668f, 0.111755f, + 0.913086f, 0.105652f, 0.917969f, 0.099609f, 0.923340f, 0.092896f, 0.926758f, 0.087158f, + 0.931641f, 0.081299f, 0.935059f, 0.076233f, 0.938477f, 0.071289f, 0.942383f, 0.066467f, + 0.944336f, 0.062439f, 0.950195f, 0.057098f, 0.954102f, 0.051971f, 0.957520f, 0.047729f, + 0.960938f, 0.043304f, 0.963379f, 0.039429f, 0.966309f, 0.035736f, 0.970215f, 0.031647f, + 0.972168f, 0.028305f, 0.974609f, 0.025269f, 0.977539f, 0.021774f, 0.979492f, 0.018845f, + 0.981445f, 0.016144f, 0.984863f, 0.012421f, 0.986328f, 0.009705f, 0.987793f, 0.002100f, + 0.000000f, 1.000000f, 0.104919f, 0.953613f, 0.193481f, 0.895020f, 0.266113f, 0.837891f, + 0.330811f, 0.783203f, 0.385986f, 0.733398f, 0.433105f, 0.687988f, 0.476074f, 0.645020f, + 0.513184f, 0.606445f, 0.546387f, 0.570312f, 0.576172f, 0.537109f, 0.604492f, 0.505859f, + 0.628906f, 0.477295f, 0.651855f, 0.450439f, 0.672363f, 0.425537f, 0.690918f, 0.401855f, + 0.708984f, 0.380127f, 0.726074f, 0.359375f, 0.741699f, 0.340088f, 0.754883f, 0.322266f, + 0.767090f, 0.305176f, 0.780762f, 0.288574f, 0.791016f, 0.273926f, 0.803711f, 0.258789f, + 0.813477f, 0.245483f, 0.822754f, 0.232300f, 0.831055f, 0.220459f, 0.841309f, 0.208008f, + 0.848633f, 0.197388f, 0.856934f, 0.186523f, 0.864258f, 0.176392f, 0.870117f, 0.167236f, + 0.878418f, 0.157593f, 0.883789f, 0.148926f, 0.890625f, 0.140747f, 0.896973f, 0.132690f, + 0.902344f, 0.124878f, 0.906738f, 0.117554f, 0.911133f, 0.111084f, 0.916504f, 0.104431f, + 0.922363f, 0.097473f, 0.927246f, 0.091187f, 0.931641f, 0.085327f, 0.935059f, 0.080139f, + 0.938965f, 0.074890f, 0.942871f, 0.069336f, 0.946289f, 0.064331f, 0.950684f, 0.059265f, + 0.954102f, 0.054565f, 0.957031f, 0.050537f, 0.959473f, 0.046753f, 0.962891f, 0.042542f, + 0.965332f, 0.039246f, 0.969238f, 0.034851f, 0.973633f, 0.030243f, 0.976074f, 0.026428f, + 0.978516f, 0.023300f, 0.980469f, 0.020340f, 0.984375f, 0.016403f, 0.985840f, 0.014069f, + 0.987793f, 0.011551f, 0.991211f, 0.008347f, 0.992676f, 0.005676f, 0.994141f, 0.003460f, + 0.000000f, 1.000000f, 0.106079f, 0.953125f, 0.194214f, 0.894531f, 0.270264f, 0.836426f, + 0.335205f, 0.781250f, 0.390625f, 0.729980f, 0.439697f, 0.683105f, 0.483398f, 0.639648f, + 0.521484f, 0.600098f, 0.555664f, 0.563477f, 0.586914f, 0.529297f, 0.615234f, 0.498047f, + 0.637695f, 0.469482f, 0.662598f, 0.441650f, 0.682129f, 0.416748f, 0.701660f, 0.393066f, + 0.720703f, 0.370850f, 0.736816f, 0.349854f, 0.752930f, 0.330322f, 0.767578f, 0.312256f, + 0.778809f, 0.295654f, 0.788086f, 0.280029f, 0.802246f, 0.263672f, 0.814941f, 0.249023f, + 0.821289f, 0.236816f, 0.833008f, 0.222778f, 0.842285f, 0.211182f, 0.849609f, 0.199097f, + 0.858398f, 0.188477f, 0.865723f, 0.177612f, 0.873047f, 0.167603f, 0.880371f, 0.158203f, + 0.888184f, 0.148926f, 0.893066f, 0.140869f, 0.898926f, 0.132446f, 0.904785f, 0.124023f, + 0.909668f, 0.117615f, 0.916016f, 0.109924f, 0.920898f, 0.102356f, 0.922852f, 0.097961f, + 0.930176f, 0.090576f, 0.936523f, 0.082825f, 0.936523f, 0.078857f, 0.940430f, 0.074707f, + 0.947754f, 0.067871f, 0.952637f, 0.061066f, 0.952637f, 0.057983f, 0.952637f, 0.055847f, + 0.960938f, 0.049866f, 0.968262f, 0.042328f, 0.968262f, 0.038971f, 0.968262f, 0.037048f, + 0.968262f, 0.035675f, 0.974609f, 0.031281f, 0.983887f, 0.022980f, 0.983887f, 0.019745f, + 0.983887f, 0.018219f, 0.983887f, 0.017288f, 0.983887f, 0.016663f, 0.985840f, 0.015717f, + 0.999512f, 0.003330f, 0.999512f, 0.000731f, 0.999512f, 0.000126f, 0.999512f, 0.000002f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.994141f, + 0.000000f, 0.993164f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.989258f, + 0.000000f, 0.988281f, 0.000000f, 0.987305f, 0.000000f, 0.985352f, 0.000000f, 0.983398f, + 0.000000f, 0.982422f, 0.000000f, 0.979980f, 0.000000f, 0.978027f, 0.000000f, 0.976562f, + 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.966309f, + 0.000000f, 0.963379f, 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.953613f, + 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.941895f, 0.000000f, 0.937988f, + 0.000000f, 0.932617f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916992f, + 0.000000f, 0.910645f, 0.000000f, 0.904785f, 0.000000f, 0.896484f, 0.000000f, 0.888672f, + 0.000000f, 0.879883f, 0.000000f, 0.870605f, 0.000000f, 0.861328f, 0.000000f, 0.851074f, + 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f, + 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.711426f, + 0.000000f, 0.682617f, 0.000000f, 0.648926f, 0.000000f, 0.608887f, 0.000000f, 0.561523f, + 0.000000f, 0.501465f, 0.000000f, 0.423096f, 0.000000f, 0.310791f, 0.000000f, 0.118774f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, + 0.000000f, 0.999023f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996582f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, 0.000000f, 0.989746f, + 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985840f, 0.000000f, 0.983887f, + 0.000000f, 0.981445f, 0.000000f, 0.980469f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.969238f, 0.000000f, 0.965820f, + 0.000000f, 0.963867f, 0.000000f, 0.960449f, 0.000000f, 0.957520f, 0.000000f, 0.953613f, + 0.000000f, 0.949707f, 0.000000f, 0.945801f, 0.000000f, 0.941895f, 0.000000f, 0.937988f, + 0.000000f, 0.933105f, 0.000000f, 0.927734f, 0.000000f, 0.922363f, 0.000000f, 0.916504f, + 0.000000f, 0.910645f, 0.000000f, 0.903809f, 0.000000f, 0.895996f, 0.000000f, 0.888672f, + 0.000000f, 0.879883f, 0.000000f, 0.871094f, 0.000000f, 0.861328f, 0.000000f, 0.851074f, + 0.000000f, 0.838867f, 0.000000f, 0.825684f, 0.000000f, 0.811523f, 0.000000f, 0.795898f, + 0.000000f, 0.778320f, 0.000000f, 0.758301f, 0.000000f, 0.736328f, 0.000000f, 0.710938f, + 0.000000f, 0.682617f, 0.000000f, 0.648438f, 0.000003f, 0.608887f, 0.000004f, 0.561523f, + 0.000003f, 0.501953f, 0.000002f, 0.423584f, 0.000002f, 0.311523f, 0.000001f, 0.119202f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.994141f, + 0.000000f, 0.992676f, 0.000000f, 0.991699f, 0.000000f, 0.991211f, 0.000000f, 0.989258f, + 0.000000f, 0.987793f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, 0.000000f, 0.983398f, + 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.978027f, 0.000000f, 0.976074f, + 0.000000f, 0.973145f, 0.000000f, 0.971191f, 0.000000f, 0.968262f, 0.000000f, 0.965820f, + 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.953125f, + 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.941406f, 0.000000f, 0.937012f, + 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.921387f, 0.000000f, 0.916016f, + 0.000000f, 0.910156f, 0.000000f, 0.902832f, 0.000000f, 0.895508f, 0.000005f, 0.887695f, + 0.000013f, 0.879395f, 0.000022f, 0.870605f, 0.000033f, 0.860840f, 0.000044f, 0.849609f, + 0.000048f, 0.837891f, 0.000049f, 0.824707f, 0.000049f, 0.810547f, 0.000046f, 0.794922f, + 0.000044f, 0.777832f, 0.000040f, 0.757812f, 0.000035f, 0.735352f, 0.000031f, 0.710449f, + 0.000033f, 0.682129f, 0.000032f, 0.647949f, 0.000028f, 0.608398f, 0.000026f, 0.561035f, + 0.000024f, 0.501465f, 0.000020f, 0.422852f, 0.000016f, 0.311279f, 0.000011f, 0.119324f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.999023f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, + 0.000000f, 0.996094f, 0.000000f, 0.995117f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, + 0.000000f, 0.992188f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.989258f, + 0.000000f, 0.987793f, 0.000000f, 0.985840f, 0.000000f, 0.984863f, 0.000000f, 0.982910f, + 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f, 0.000000f, 0.975098f, + 0.000000f, 0.972656f, 0.000002f, 0.970215f, 0.000010f, 0.967773f, 0.000020f, 0.965332f, + 0.000034f, 0.962402f, 0.000047f, 0.959473f, 0.000064f, 0.956055f, 0.000079f, 0.952148f, + 0.000095f, 0.948730f, 0.000112f, 0.944336f, 0.000129f, 0.940918f, 0.000145f, 0.936035f, + 0.000163f, 0.931152f, 0.000180f, 0.926270f, 0.000187f, 0.920410f, 0.000191f, 0.915039f, + 0.000190f, 0.908691f, 0.000185f, 0.902344f, 0.000178f, 0.894531f, 0.000173f, 0.886719f, + 0.000164f, 0.878418f, 0.000154f, 0.869141f, 0.000142f, 0.859375f, 0.000137f, 0.848633f, + 0.000136f, 0.836914f, 0.000138f, 0.823730f, 0.000144f, 0.809570f, 0.000141f, 0.793945f, + 0.000132f, 0.776855f, 0.000121f, 0.756836f, 0.000122f, 0.734375f, 0.000119f, 0.709473f, + 0.000110f, 0.681152f, 0.000106f, 0.646973f, 0.000101f, 0.607422f, 0.000095f, 0.560547f, + 0.000085f, 0.500977f, 0.000079f, 0.422852f, 0.000066f, 0.310791f, 0.000038f, 0.118713f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, + 0.000000f, 0.995605f, 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000001f, 0.993652f, + 0.000014f, 0.992676f, 0.000038f, 0.990723f, 0.000059f, 0.989746f, 0.000087f, 0.988281f, + 0.000112f, 0.987305f, 0.000136f, 0.985352f, 0.000165f, 0.983398f, 0.000191f, 0.982422f, + 0.000213f, 0.980469f, 0.000240f, 0.979004f, 0.000266f, 0.976074f, 0.000289f, 0.974121f, + 0.000310f, 0.972168f, 0.000333f, 0.969727f, 0.000359f, 0.966797f, 0.000381f, 0.964355f, + 0.000400f, 0.960938f, 0.000417f, 0.958008f, 0.000437f, 0.954590f, 0.000443f, 0.951172f, + 0.000439f, 0.947266f, 0.000429f, 0.943359f, 0.000414f, 0.939453f, 0.000404f, 0.935059f, + 0.000389f, 0.929688f, 0.000377f, 0.924805f, 0.000367f, 0.919434f, 0.000362f, 0.913574f, + 0.000366f, 0.907227f, 0.000373f, 0.900879f, 0.000381f, 0.893555f, 0.000372f, 0.885254f, + 0.000376f, 0.876953f, 0.000374f, 0.867676f, 0.000368f, 0.857910f, 0.000369f, 0.846680f, + 0.000346f, 0.834961f, 0.000344f, 0.821777f, 0.000348f, 0.808105f, 0.000345f, 0.791992f, + 0.000345f, 0.774902f, 0.000314f, 0.754883f, 0.000312f, 0.732910f, 0.000311f, 0.708008f, + 0.000304f, 0.679688f, 0.000272f, 0.645996f, 0.000271f, 0.606445f, 0.000267f, 0.559570f, + 0.000230f, 0.500000f, 0.000226f, 0.422119f, 0.000194f, 0.310547f, 0.000089f, 0.118958f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000004f, 0.999023f, + 0.000049f, 0.998047f, 0.000116f, 0.997559f, 0.000161f, 0.997070f, 0.000219f, 0.997070f, + 0.000268f, 0.995605f, 0.000304f, 0.994141f, 0.000349f, 0.994141f, 0.000395f, 0.992676f, + 0.000430f, 0.991699f, 0.000457f, 0.990723f, 0.000491f, 0.988770f, 0.000532f, 0.987793f, + 0.000563f, 0.986328f, 0.000588f, 0.984863f, 0.000607f, 0.982910f, 0.000638f, 0.980957f, + 0.000672f, 0.979492f, 0.000698f, 0.977539f, 0.000718f, 0.975586f, 0.000734f, 0.972656f, + 0.000751f, 0.970703f, 0.000769f, 0.968262f, 0.000764f, 0.965820f, 0.000755f, 0.962891f, + 0.000746f, 0.959961f, 0.000739f, 0.957031f, 0.000741f, 0.953125f, 0.000755f, 0.949707f, + 0.000765f, 0.946289f, 0.000748f, 0.941895f, 0.000752f, 0.937988f, 0.000752f, 0.933105f, + 0.000764f, 0.928711f, 0.000785f, 0.922852f, 0.000763f, 0.916992f, 0.000774f, 0.911621f, + 0.000782f, 0.905762f, 0.000781f, 0.898438f, 0.000790f, 0.891113f, 0.000754f, 0.883789f, + 0.000756f, 0.875000f, 0.000765f, 0.865723f, 0.000762f, 0.855469f, 0.000761f, 0.845215f, + 0.000772f, 0.833496f, 0.000726f, 0.819824f, 0.000721f, 0.806152f, 0.000715f, 0.790039f, + 0.000713f, 0.772949f, 0.000667f, 0.752930f, 0.000661f, 0.730957f, 0.000654f, 0.706543f, + 0.000633f, 0.678223f, 0.000607f, 0.644043f, 0.000587f, 0.604980f, 0.000575f, 0.558105f, + 0.000537f, 0.499512f, 0.000507f, 0.421875f, 0.000431f, 0.310547f, 0.000169f, 0.118103f, + 0.000000f, 1.000000f, 0.000213f, 0.999512f, 0.000377f, 0.999023f, 0.000426f, 0.998535f, + 0.000521f, 0.998047f, 0.000593f, 0.997070f, 0.000622f, 0.997070f, 0.000648f, 0.996094f, + 0.000748f, 0.995117f, 0.000783f, 0.994141f, 0.000803f, 0.993164f, 0.000814f, 0.992188f, + 0.000896f, 0.990723f, 0.000933f, 0.989746f, 0.000953f, 0.988770f, 0.000966f, 0.986816f, + 0.000974f, 0.985840f, 0.001040f, 0.983887f, 0.001085f, 0.982422f, 0.001128f, 0.979980f, + 0.001166f, 0.978516f, 0.001181f, 0.976074f, 0.001194f, 0.974609f, 0.001233f, 0.971680f, + 0.001244f, 0.969727f, 0.001245f, 0.966309f, 0.001249f, 0.964355f, 0.001251f, 0.961914f, + 0.001231f, 0.958008f, 0.001264f, 0.955078f, 0.001286f, 0.951660f, 0.001309f, 0.947754f, + 0.001332f, 0.944336f, 0.001299f, 0.939941f, 0.001328f, 0.935547f, 0.001386f, 0.931152f, + 0.001400f, 0.926270f, 0.001399f, 0.920898f, 0.001336f, 0.915039f, 0.001348f, 0.909180f, + 0.001355f, 0.903320f, 0.001403f, 0.895996f, 0.001408f, 0.888672f, 0.001418f, 0.880371f, + 0.001347f, 0.872070f, 0.001354f, 0.863770f, 0.001344f, 0.853516f, 0.001376f, 0.842285f, + 0.001389f, 0.830078f, 0.001316f, 0.817383f, 0.001289f, 0.803223f, 0.001275f, 0.787598f, + 0.001319f, 0.770020f, 0.001247f, 0.750488f, 0.001211f, 0.728516f, 0.001207f, 0.704102f, + 0.001219f, 0.675781f, 0.001157f, 0.642090f, 0.001116f, 0.603516f, 0.001091f, 0.557129f, + 0.001042f, 0.498291f, 0.000967f, 0.421631f, 0.000803f, 0.309570f, 0.000277f, 0.117859f, + 0.000000f, 1.000000f, 0.000393f, 0.999512f, 0.000695f, 0.999023f, 0.000679f, 0.998535f, + 0.000913f, 0.997559f, 0.000922f, 0.997070f, 0.000916f, 0.996582f, 0.001082f, 0.995605f, + 0.001120f, 0.994629f, 0.001123f, 0.993652f, 0.001124f, 0.992676f, 0.001147f, 0.991211f, + 0.001364f, 0.989746f, 0.001415f, 0.988770f, 0.001466f, 0.987305f, 0.001504f, 0.986328f, + 0.001543f, 0.984863f, 0.001739f, 0.982422f, 0.001755f, 0.980957f, 0.001754f, 0.979004f, + 0.001742f, 0.977051f, 0.001738f, 0.975098f, 0.001844f, 0.972656f, 0.001879f, 0.970215f, + 0.001865f, 0.967773f, 0.001899f, 0.964844f, 0.001923f, 0.962402f, 0.001947f, 0.959473f, + 0.002068f, 0.957031f, 0.002052f, 0.952637f, 0.002098f, 0.949219f, 0.002125f, 0.945801f, + 0.002134f, 0.941895f, 0.002144f, 0.937988f, 0.002151f, 0.933105f, 0.002190f, 0.928711f, + 0.002205f, 0.923828f, 0.002234f, 0.917969f, 0.002247f, 0.912598f, 0.002159f, 0.906738f, + 0.002224f, 0.899902f, 0.002279f, 0.893555f, 0.002281f, 0.885254f, 0.002283f, 0.877930f, + 0.002186f, 0.869141f, 0.002214f, 0.860352f, 0.002239f, 0.850098f, 0.002266f, 0.838867f, + 0.002253f, 0.827148f, 0.002184f, 0.813965f, 0.002188f, 0.800781f, 0.002146f, 0.784668f, + 0.002188f, 0.767090f, 0.002102f, 0.747559f, 0.002113f, 0.726074f, 0.002066f, 0.701172f, + 0.002077f, 0.672852f, 0.001999f, 0.639648f, 0.001946f, 0.601562f, 0.001884f, 0.555176f, + 0.001818f, 0.496582f, 0.001650f, 0.420898f, 0.001338f, 0.309082f, 0.000412f, 0.117065f, + 0.000000f, 1.000000f, 0.000453f, 0.999512f, 0.000836f, 0.998535f, 0.000809f, 0.998535f, + 0.001129f, 0.997070f, 0.001140f, 0.996582f, 0.001184f, 0.995605f, 0.001510f, 0.995117f, + 0.001587f, 0.993652f, 0.001655f, 0.993164f, 0.001698f, 0.992188f, 0.001737f, 0.991211f, + 0.002052f, 0.989258f, 0.002102f, 0.987793f, 0.002134f, 0.986328f, 0.002151f, 0.984863f, + 0.002186f, 0.983398f, 0.002422f, 0.981445f, 0.002457f, 0.979004f, 0.002485f, 0.977539f, + 0.002527f, 0.975586f, 0.002520f, 0.973145f, 0.002733f, 0.971191f, 0.002773f, 0.968262f, + 0.002817f, 0.965820f, 0.002806f, 0.962891f, 0.002872f, 0.960449f, 0.002928f, 0.957031f, + 0.003124f, 0.954102f, 0.003059f, 0.950684f, 0.003065f, 0.946289f, 0.003115f, 0.942871f, + 0.003168f, 0.939453f, 0.003214f, 0.935547f, 0.003252f, 0.930176f, 0.003292f, 0.925293f, + 0.003325f, 0.920410f, 0.003378f, 0.915527f, 0.003378f, 0.909180f, 0.003294f, 0.903809f, + 0.003424f, 0.896973f, 0.003445f, 0.889648f, 0.003454f, 0.882812f, 0.003500f, 0.874023f, + 0.003395f, 0.865723f, 0.003397f, 0.856445f, 0.003529f, 0.846191f, 0.003490f, 0.835449f, + 0.003540f, 0.823242f, 0.003410f, 0.810547f, 0.003418f, 0.796387f, 0.003439f, 0.780762f, + 0.003439f, 0.763184f, 0.003458f, 0.744141f, 0.003349f, 0.722656f, 0.003296f, 0.698242f, + 0.003302f, 0.669922f, 0.003210f, 0.637695f, 0.003138f, 0.599609f, 0.003012f, 0.553711f, + 0.002899f, 0.495117f, 0.002596f, 0.419678f, 0.002045f, 0.309082f, 0.000576f, 0.116577f, + 0.000000f, 1.000000f, 0.000477f, 0.999512f, 0.000981f, 0.998535f, 0.001089f, 0.997559f, + 0.001572f, 0.997070f, 0.001649f, 0.995605f, 0.001740f, 0.995117f, 0.001783f, 0.994141f, + 0.002174f, 0.992676f, 0.002256f, 0.991699f, 0.002323f, 0.990723f, 0.002399f, 0.989746f, + 0.002783f, 0.987793f, 0.002913f, 0.986328f, 0.002974f, 0.984863f, 0.003019f, 0.983398f, + 0.003029f, 0.981445f, 0.003357f, 0.979492f, 0.003387f, 0.977539f, 0.003469f, 0.975586f, + 0.003550f, 0.973145f, 0.003618f, 0.971680f, 0.003819f, 0.968262f, 0.003937f, 0.966309f, + 0.004044f, 0.963379f, 0.004009f, 0.960449f, 0.004063f, 0.957520f, 0.004089f, 0.955078f, + 0.004349f, 0.951172f, 0.004467f, 0.947754f, 0.004406f, 0.943848f, 0.004490f, 0.939941f, + 0.004532f, 0.936035f, 0.004581f, 0.932617f, 0.004776f, 0.927246f, 0.004749f, 0.921875f, + 0.004829f, 0.916992f, 0.004860f, 0.911621f, 0.004929f, 0.906250f, 0.004925f, 0.899902f, + 0.004986f, 0.893066f, 0.005043f, 0.885742f, 0.005135f, 0.878418f, 0.005077f, 0.870117f, + 0.005157f, 0.861816f, 0.005005f, 0.852539f, 0.005207f, 0.842285f, 0.005173f, 0.831055f, + 0.005226f, 0.819336f, 0.005089f, 0.807129f, 0.005100f, 0.792480f, 0.005142f, 0.777344f, + 0.005219f, 0.759277f, 0.005215f, 0.740234f, 0.005085f, 0.718750f, 0.004978f, 0.694824f, + 0.005047f, 0.666992f, 0.004879f, 0.634277f, 0.004753f, 0.596680f, 0.004562f, 0.552246f, + 0.004345f, 0.493164f, 0.003832f, 0.418701f, 0.002930f, 0.308838f, 0.000769f, 0.116272f, + 0.000000f, 1.000000f, 0.000282f, 0.999512f, 0.000995f, 0.998535f, 0.001504f, 0.997559f, + 0.001652f, 0.996582f, 0.002146f, 0.995605f, 0.002218f, 0.994629f, 0.002407f, 0.993164f, + 0.002937f, 0.992188f, 0.003057f, 0.990723f, 0.003138f, 0.989746f, 0.003263f, 0.988281f, + 0.003778f, 0.986328f, 0.003914f, 0.985352f, 0.003979f, 0.983398f, 0.004017f, 0.981934f, + 0.004196f, 0.979980f, 0.004566f, 0.977051f, 0.004677f, 0.975586f, 0.004684f, 0.973633f, + 0.004791f, 0.971191f, 0.004940f, 0.969238f, 0.005283f, 0.966309f, 0.005383f, 0.963379f, + 0.005474f, 0.960449f, 0.005562f, 0.958008f, 0.005547f, 0.954590f, 0.005672f, 0.951660f, + 0.006042f, 0.948242f, 0.006157f, 0.944336f, 0.006275f, 0.940918f, 0.006168f, 0.937012f, + 0.006260f, 0.932617f, 0.006359f, 0.928711f, 0.006763f, 0.923828f, 0.006607f, 0.917969f, + 0.006710f, 0.912598f, 0.006847f, 0.907715f, 0.006886f, 0.901855f, 0.006866f, 0.895996f, + 0.007076f, 0.888672f, 0.007156f, 0.881348f, 0.007236f, 0.874023f, 0.007214f, 0.865723f, + 0.007278f, 0.856934f, 0.007214f, 0.848145f, 0.007423f, 0.837402f, 0.007500f, 0.826660f, + 0.007488f, 0.814453f, 0.007477f, 0.801758f, 0.007385f, 0.788086f, 0.007580f, 0.772461f, + 0.007542f, 0.754883f, 0.007519f, 0.735840f, 0.007351f, 0.714844f, 0.007244f, 0.691406f, + 0.007301f, 0.663086f, 0.007065f, 0.631348f, 0.006859f, 0.593750f, 0.006638f, 0.548828f, + 0.006199f, 0.491943f, 0.005409f, 0.417969f, 0.004044f, 0.307861f, 0.000988f, 0.116150f, + 0.000000f, 1.000000f, 0.000416f, 0.999512f, 0.001246f, 0.998047f, 0.001812f, 0.997070f, + 0.002235f, 0.996094f, 0.002787f, 0.994629f, 0.002903f, 0.993652f, 0.003218f, 0.992188f, + 0.003752f, 0.990723f, 0.003929f, 0.989258f, 0.004066f, 0.988770f, 0.004398f, 0.986816f, + 0.004913f, 0.984863f, 0.005085f, 0.983398f, 0.005280f, 0.981445f, 0.005344f, 0.980469f, + 0.005562f, 0.977539f, 0.006077f, 0.975586f, 0.006165f, 0.973145f, 0.006344f, 0.970703f, + 0.006363f, 0.968750f, 0.006638f, 0.966797f, 0.007126f, 0.963379f, 0.007183f, 0.960449f, + 0.007305f, 0.957520f, 0.007446f, 0.954590f, 0.007561f, 0.952148f, 0.007690f, 0.948242f, + 0.008148f, 0.944336f, 0.008247f, 0.940430f, 0.008415f, 0.937012f, 0.008415f, 0.932617f, + 0.008461f, 0.928711f, 0.008682f, 0.924316f, 0.009125f, 0.918945f, 0.009361f, 0.914551f, + 0.009125f, 0.908203f, 0.009300f, 0.902832f, 0.009430f, 0.897461f, 0.009567f, 0.891113f, + 0.009903f, 0.883789f, 0.009819f, 0.875977f, 0.009933f, 0.868652f, 0.010048f, 0.860840f, + 0.010078f, 0.852539f, 0.010025f, 0.842773f, 0.010269f, 0.832031f, 0.010483f, 0.821289f, + 0.010399f, 0.809570f, 0.010475f, 0.796875f, 0.010269f, 0.783203f, 0.010544f, 0.767090f, + 0.010506f, 0.749512f, 0.010475f, 0.730957f, 0.010284f, 0.709961f, 0.010139f, 0.687012f, + 0.010170f, 0.658691f, 0.010056f, 0.627441f, 0.009567f, 0.590820f, 0.009186f, 0.546387f, + 0.008476f, 0.489502f, 0.007278f, 0.416260f, 0.005318f, 0.307129f, 0.001243f, 0.115601f, + 0.000000f, 1.000000f, 0.000625f, 0.999023f, 0.001251f, 0.998047f, 0.001865f, 0.997070f, + 0.002825f, 0.995605f, 0.003040f, 0.994141f, 0.003670f, 0.993164f, 0.004150f, 0.991211f, + 0.004387f, 0.989746f, 0.004986f, 0.988281f, 0.005157f, 0.987305f, 0.005672f, 0.984863f, + 0.006329f, 0.982910f, 0.006519f, 0.981445f, 0.006733f, 0.979492f, 0.007145f, 0.978027f, + 0.007488f, 0.975586f, 0.007965f, 0.972656f, 0.008080f, 0.970703f, 0.008194f, 0.968262f, + 0.008408f, 0.965820f, 0.008705f, 0.962891f, 0.009369f, 0.960449f, 0.009583f, 0.957031f, + 0.009590f, 0.954102f, 0.009750f, 0.951172f, 0.009995f, 0.948242f, 0.010399f, 0.944336f, + 0.010735f, 0.939941f, 0.011032f, 0.936523f, 0.011139f, 0.932617f, 0.011307f, 0.928711f, + 0.011345f, 0.924316f, 0.011658f, 0.919434f, 0.012161f, 0.914062f, 0.012413f, 0.908691f, + 0.012482f, 0.903809f, 0.012383f, 0.897461f, 0.012657f, 0.892090f, 0.012939f, 0.885254f, + 0.013252f, 0.877930f, 0.013252f, 0.870605f, 0.013458f, 0.863281f, 0.013542f, 0.854980f, + 0.013565f, 0.846680f, 0.013870f, 0.837402f, 0.014122f, 0.826660f, 0.014137f, 0.814941f, + 0.014069f, 0.803711f, 0.014244f, 0.791504f, 0.014053f, 0.777832f, 0.014359f, 0.761230f, + 0.014397f, 0.744629f, 0.014259f, 0.726074f, 0.013985f, 0.705078f, 0.013992f, 0.682129f, + 0.013863f, 0.654297f, 0.013588f, 0.623535f, 0.012993f, 0.587402f, 0.012375f, 0.543457f, + 0.011284f, 0.487305f, 0.009521f, 0.415283f, 0.006786f, 0.306152f, 0.001522f, 0.115051f, + 0.000000f, 1.000000f, 0.000866f, 0.999023f, 0.001698f, 0.998047f, 0.001885f, 0.997070f, + 0.003201f, 0.995117f, 0.003843f, 0.993652f, 0.004532f, 0.992188f, 0.005310f, 0.990234f, + 0.005554f, 0.988281f, 0.006248f, 0.987305f, 0.006554f, 0.985352f, 0.007202f, 0.982910f, + 0.007526f, 0.980957f, 0.008217f, 0.979004f, 0.008461f, 0.977539f, 0.009148f, 0.975098f, + 0.009514f, 0.972656f, 0.010246f, 0.970215f, 0.010414f, 0.967773f, 0.010567f, 0.965332f, + 0.010765f, 0.962402f, 0.011398f, 0.958984f, 0.012177f, 0.956543f, 0.012344f, 0.953613f, + 0.012703f, 0.950684f, 0.012642f, 0.947266f, 0.013260f, 0.943359f, 0.013603f, 0.939453f, + 0.014374f, 0.936035f, 0.014343f, 0.931641f, 0.014671f, 0.927734f, 0.014786f, 0.923828f, + 0.015388f, 0.919434f, 0.015480f, 0.913574f, 0.016022f, 0.908691f, 0.016312f, 0.903320f, + 0.016617f, 0.897949f, 0.016464f, 0.892578f, 0.016663f, 0.886230f, 0.017334f, 0.879395f, + 0.017639f, 0.872070f, 0.017914f, 0.864746f, 0.017868f, 0.856934f, 0.018188f, 0.849121f, + 0.018311f, 0.840332f, 0.018845f, 0.830566f, 0.018753f, 0.819824f, 0.018906f, 0.809082f, + 0.019180f, 0.797852f, 0.019028f, 0.785156f, 0.018890f, 0.770996f, 0.019348f, 0.754883f, + 0.019165f, 0.738281f, 0.019211f, 0.720703f, 0.018875f, 0.700684f, 0.018753f, 0.676758f, + 0.018509f, 0.649414f, 0.017914f, 0.618652f, 0.017090f, 0.583984f, 0.016174f, 0.540039f, + 0.014565f, 0.484863f, 0.012260f, 0.414062f, 0.008507f, 0.305664f, 0.001861f, 0.115173f, + 0.000000f, 1.000000f, 0.000689f, 0.999023f, 0.001837f, 0.997559f, 0.002485f, 0.996582f, + 0.004116f, 0.994141f, 0.004837f, 0.992676f, 0.005306f, 0.991211f, 0.006657f, 0.988770f, + 0.006920f, 0.986816f, 0.007256f, 0.985840f, 0.008247f, 0.983398f, 0.009026f, 0.980469f, + 0.009415f, 0.978516f, 0.010208f, 0.976562f, 0.010506f, 0.975098f, 0.011497f, 0.971680f, + 0.011940f, 0.969238f, 0.012360f, 0.967285f, 0.013184f, 0.964844f, 0.013390f, 0.961914f, + 0.014107f, 0.958496f, 0.014626f, 0.955566f, 0.014908f, 0.952148f, 0.015747f, 0.948730f, + 0.016006f, 0.945801f, 0.016449f, 0.942871f, 0.017059f, 0.938965f, 0.017471f, 0.934570f, + 0.018219f, 0.930664f, 0.018753f, 0.926758f, 0.018753f, 0.922363f, 0.019150f, 0.918457f, + 0.019821f, 0.913086f, 0.020370f, 0.908203f, 0.020813f, 0.902344f, 0.021149f, 0.896973f, + 0.021500f, 0.892090f, 0.021881f, 0.886719f, 0.021973f, 0.879395f, 0.022507f, 0.872559f, + 0.023361f, 0.865723f, 0.023468f, 0.857910f, 0.023575f, 0.850586f, 0.023666f, 0.842285f, + 0.024216f, 0.833496f, 0.024689f, 0.823242f, 0.024750f, 0.812500f, 0.025024f, 0.802246f, + 0.025116f, 0.790527f, 0.024918f, 0.778320f, 0.025497f, 0.764648f, 0.025543f, 0.749023f, + 0.025467f, 0.731934f, 0.025192f, 0.714355f, 0.024734f, 0.694824f, 0.024826f, 0.670898f, + 0.024200f, 0.644043f, 0.023590f, 0.614746f, 0.022217f, 0.580078f, 0.020889f, 0.536133f, + 0.018845f, 0.482910f, 0.015434f, 0.412354f, 0.010551f, 0.304932f, 0.002214f, 0.114929f, + 0.000000f, 1.000000f, 0.000901f, 0.999023f, 0.002457f, 0.997070f, 0.003334f, 0.995605f, + 0.004200f, 0.993652f, 0.005501f, 0.991699f, 0.006760f, 0.989746f, 0.007309f, 0.987793f, + 0.008553f, 0.985352f, 0.008965f, 0.983887f, 0.009796f, 0.981445f, 0.011185f, 0.978516f, + 0.011658f, 0.976074f, 0.012054f, 0.974121f, 0.013275f, 0.971191f, 0.014259f, 0.968262f, + 0.014786f, 0.965820f, 0.015343f, 0.963379f, 0.016205f, 0.960449f, 0.016830f, 0.958008f, + 0.018005f, 0.954590f, 0.018219f, 0.950684f, 0.018814f, 0.947754f, 0.019562f, 0.943848f, + 0.020126f, 0.941406f, 0.020767f, 0.937012f, 0.021805f, 0.933105f, 0.022095f, 0.929199f, + 0.022949f, 0.924316f, 0.023438f, 0.920410f, 0.024078f, 0.916992f, 0.024429f, 0.911621f, + 0.025360f, 0.906250f, 0.025787f, 0.901367f, 0.026672f, 0.895996f, 0.026978f, 0.890137f, + 0.027405f, 0.885254f, 0.027908f, 0.879395f, 0.028702f, 0.872070f, 0.028824f, 0.864746f, + 0.029800f, 0.857910f, 0.030472f, 0.851074f, 0.030029f, 0.842773f, 0.030579f, 0.835449f, + 0.031372f, 0.825195f, 0.031952f, 0.815430f, 0.032257f, 0.805176f, 0.032318f, 0.794434f, + 0.032440f, 0.783691f, 0.032684f, 0.771484f, 0.033081f, 0.756836f, 0.032959f, 0.741211f, + 0.033051f, 0.725586f, 0.032562f, 0.707520f, 0.032104f, 0.688965f, 0.031982f, 0.665039f, + 0.031219f, 0.638672f, 0.030167f, 0.609863f, 0.028336f, 0.576172f, 0.026566f, 0.532715f, + 0.023865f, 0.479980f, 0.019318f, 0.411133f, 0.012985f, 0.303955f, 0.002634f, 0.114685f, + 0.000000f, 1.000000f, 0.001308f, 0.999023f, 0.002726f, 0.997070f, 0.003922f, 0.995117f, + 0.005405f, 0.992676f, 0.006302f, 0.991211f, 0.007633f, 0.988770f, 0.009079f, 0.986328f, + 0.009987f, 0.983887f, 0.010948f, 0.981934f, 0.012169f, 0.978516f, 0.013710f, 0.975586f, + 0.014236f, 0.973145f, 0.014786f, 0.971191f, 0.015945f, 0.968262f, 0.017136f, 0.964844f, + 0.018158f, 0.961914f, 0.018784f, 0.958984f, 0.019379f, 0.956543f, 0.021011f, 0.953125f, + 0.022156f, 0.949219f, 0.022919f, 0.945801f, 0.023376f, 0.942383f, 0.024261f, 0.938965f, + 0.024841f, 0.935547f, 0.026016f, 0.931152f, 0.026947f, 0.926758f, 0.027771f, 0.922852f, + 0.028519f, 0.918457f, 0.029099f, 0.914062f, 0.029800f, 0.909668f, 0.030807f, 0.904297f, + 0.031677f, 0.898926f, 0.032440f, 0.894043f, 0.033325f, 0.888184f, 0.033783f, 0.883301f, + 0.034363f, 0.877441f, 0.035187f, 0.870605f, 0.036224f, 0.863770f, 0.036743f, 0.856934f, + 0.037384f, 0.849609f, 0.037994f, 0.842773f, 0.038391f, 0.835449f, 0.038879f, 0.826172f, + 0.039673f, 0.816406f, 0.040466f, 0.807129f, 0.040619f, 0.796875f, 0.040741f, 0.786133f, + 0.040985f, 0.775879f, 0.041412f, 0.762695f, 0.041656f, 0.748535f, 0.041656f, 0.733398f, + 0.041534f, 0.718262f, 0.041260f, 0.701172f, 0.040710f, 0.681641f, 0.040253f, 0.658203f, + 0.039368f, 0.632812f, 0.037720f, 0.604492f, 0.035461f, 0.571777f, 0.033234f, 0.528320f, + 0.029312f, 0.476807f, 0.023666f, 0.409912f, 0.015686f, 0.302734f, 0.003113f, 0.114014f, + 0.000000f, 1.000000f, 0.001520f, 0.998535f, 0.003132f, 0.996582f, 0.004364f, 0.994629f, + 0.006840f, 0.992188f, 0.007355f, 0.990234f, 0.009117f, 0.987305f, 0.010681f, 0.984375f, + 0.011765f, 0.981934f, 0.013313f, 0.979004f, 0.015030f, 0.975586f, 0.015717f, 0.973145f, + 0.017303f, 0.970215f, 0.018082f, 0.967285f, 0.019623f, 0.963867f, 0.020920f, 0.960449f, + 0.022079f, 0.957031f, 0.022842f, 0.954590f, 0.023926f, 0.951172f, 0.025742f, 0.947266f, + 0.026627f, 0.943848f, 0.027893f, 0.940430f, 0.028748f, 0.937012f, 0.029297f, 0.933594f, + 0.030792f, 0.928711f, 0.031860f, 0.923828f, 0.033203f, 0.919922f, 0.033936f, 0.915527f, + 0.034882f, 0.911621f, 0.035706f, 0.907227f, 0.037140f, 0.901367f, 0.038086f, 0.895996f, + 0.039246f, 0.890625f, 0.039917f, 0.885742f, 0.041199f, 0.880371f, 0.041809f, 0.875000f, + 0.042755f, 0.868652f, 0.043671f, 0.861328f, 0.044861f, 0.854980f, 0.045258f, 0.848145f, + 0.046417f, 0.840820f, 0.046875f, 0.833984f, 0.047974f, 0.826172f, 0.048035f, 0.816406f, + 0.049469f, 0.807617f, 0.050140f, 0.797852f, 0.050690f, 0.788086f, 0.050751f, 0.777832f, + 0.050964f, 0.767090f, 0.051758f, 0.753418f, 0.052185f, 0.740234f, 0.052185f, 0.725586f, + 0.051666f, 0.710449f, 0.050812f, 0.693848f, 0.050995f, 0.673828f, 0.050201f, 0.651367f, + 0.048279f, 0.626465f, 0.046448f, 0.599609f, 0.043793f, 0.566895f, 0.040619f, 0.524414f, + 0.035828f, 0.473877f, 0.028412f, 0.407959f, 0.018784f, 0.301758f, 0.003656f, 0.113647f, + 0.000000f, 1.000000f, 0.001997f, 0.998047f, 0.004101f, 0.996094f, 0.005878f, 0.993652f, + 0.007580f, 0.991211f, 0.009117f, 0.988770f, 0.010918f, 0.985352f, 0.012657f, 0.982422f, + 0.013374f, 0.979980f, 0.016479f, 0.976074f, 0.017838f, 0.972656f, 0.019165f, 0.969727f, + 0.020401f, 0.966797f, 0.022507f, 0.962891f, 0.023956f, 0.958984f, 0.024918f, 0.955566f, + 0.026688f, 0.952148f, 0.027557f, 0.949219f, 0.029297f, 0.944824f, 0.030762f, 0.941406f, + 0.032288f, 0.937500f, 0.033661f, 0.933594f, 0.034668f, 0.930176f, 0.036285f, 0.925781f, + 0.038025f, 0.920898f, 0.038971f, 0.916504f, 0.040222f, 0.912109f, 0.041351f, 0.907715f, + 0.042145f, 0.903809f, 0.044281f, 0.898438f, 0.045654f, 0.892578f, 0.046814f, 0.887207f, + 0.047852f, 0.881836f, 0.048828f, 0.876953f, 0.050201f, 0.871582f, 0.051270f, 0.865234f, + 0.052460f, 0.858398f, 0.054016f, 0.852051f, 0.054779f, 0.845215f, 0.055725f, 0.838379f, + 0.056549f, 0.831543f, 0.057220f, 0.824219f, 0.058624f, 0.815430f, 0.060364f, 0.807129f, + 0.060150f, 0.796875f, 0.061310f, 0.788574f, 0.061615f, 0.778809f, 0.061951f, 0.769043f, + 0.062347f, 0.756836f, 0.063110f, 0.744141f, 0.063477f, 0.730957f, 0.063110f, 0.716797f, + 0.062622f, 0.701660f, 0.062012f, 0.686035f, 0.061523f, 0.665527f, 0.060364f, 0.643555f, + 0.058685f, 0.620605f, 0.055817f, 0.594238f, 0.052704f, 0.561035f, 0.048828f, 0.520020f, + 0.042694f, 0.470703f, 0.034027f, 0.406982f, 0.022079f, 0.300537f, 0.004261f, 0.112915f, + 0.000000f, 1.000000f, 0.002422f, 0.997559f, 0.004318f, 0.996094f, 0.007160f, 0.992676f, + 0.009003f, 0.990234f, 0.011192f, 0.987305f, 0.013687f, 0.983398f, 0.014633f, 0.980469f, + 0.016739f, 0.977051f, 0.018387f, 0.973145f, 0.020813f, 0.969238f, 0.022720f, 0.966309f, + 0.024506f, 0.962402f, 0.026947f, 0.957520f, 0.028625f, 0.954102f, 0.030121f, 0.950684f, + 0.031158f, 0.947266f, 0.033844f, 0.942383f, 0.035553f, 0.937988f, 0.037201f, 0.934082f, + 0.038849f, 0.930176f, 0.040405f, 0.926270f, 0.041931f, 0.922363f, 0.043945f, 0.917480f, + 0.045715f, 0.913086f, 0.047516f, 0.908203f, 0.048615f, 0.903320f, 0.049561f, 0.898926f, + 0.051392f, 0.894043f, 0.053375f, 0.888184f, 0.055237f, 0.882812f, 0.056763f, 0.877441f, + 0.057678f, 0.872070f, 0.058807f, 0.867188f, 0.060486f, 0.861816f, 0.062134f, 0.854980f, + 0.063843f, 0.847656f, 0.064941f, 0.840820f, 0.066040f, 0.834473f, 0.067078f, 0.828125f, + 0.068176f, 0.821777f, 0.069458f, 0.812988f, 0.070801f, 0.804199f, 0.072205f, 0.795898f, + 0.072144f, 0.787109f, 0.073547f, 0.777832f, 0.073853f, 0.768555f, 0.074646f, 0.758789f, + 0.075439f, 0.746094f, 0.075928f, 0.734375f, 0.076172f, 0.721680f, 0.075806f, 0.708496f, + 0.074463f, 0.693848f, 0.074341f, 0.676758f, 0.073669f, 0.657227f, 0.071838f, 0.636230f, + 0.069824f, 0.614258f, 0.066406f, 0.588379f, 0.062683f, 0.554688f, 0.057495f, 0.515137f, + 0.050079f, 0.467773f, 0.039795f, 0.403809f, 0.025620f, 0.299561f, 0.004860f, 0.112427f, + 0.000000f, 1.000000f, 0.002733f, 0.998047f, 0.005219f, 0.995605f, 0.008324f, 0.991699f, + 0.010338f, 0.988770f, 0.013313f, 0.984863f, 0.015511f, 0.981445f, 0.018005f, 0.977539f, + 0.020462f, 0.973145f, 0.022751f, 0.969238f, 0.024414f, 0.965820f, 0.026947f, 0.961914f, + 0.029602f, 0.957031f, 0.032257f, 0.952637f, 0.034058f, 0.948242f, 0.036194f, 0.944336f, + 0.038116f, 0.939941f, 0.040558f, 0.935059f, 0.042877f, 0.930664f, 0.044708f, 0.926270f, + 0.046051f, 0.922852f, 0.048584f, 0.917969f, 0.050842f, 0.912598f, 0.052826f, 0.907715f, + 0.054749f, 0.903320f, 0.056702f, 0.898926f, 0.058563f, 0.894531f, 0.059937f, 0.888672f, + 0.062317f, 0.883301f, 0.063721f, 0.877930f, 0.065857f, 0.872070f, 0.067810f, 0.867188f, + 0.069092f, 0.862305f, 0.070251f, 0.856445f, 0.072754f, 0.849121f, 0.074585f, 0.842773f, + 0.076111f, 0.836426f, 0.077576f, 0.830078f, 0.078674f, 0.823242f, 0.079773f, 0.817383f, + 0.081726f, 0.809082f, 0.083374f, 0.801270f, 0.084534f, 0.792480f, 0.085632f, 0.784180f, + 0.086670f, 0.776367f, 0.086609f, 0.767090f, 0.088013f, 0.758301f, 0.088806f, 0.746582f, + 0.089233f, 0.735352f, 0.089539f, 0.723633f, 0.089966f, 0.711426f, 0.089172f, 0.698730f, + 0.088257f, 0.684570f, 0.088196f, 0.666992f, 0.086670f, 0.648438f, 0.084778f, 0.628906f, + 0.081238f, 0.606934f, 0.077209f, 0.582520f, 0.073242f, 0.548828f, 0.067078f, 0.510742f, + 0.058258f, 0.464844f, 0.046326f, 0.399902f, 0.029572f, 0.299561f, 0.005589f, 0.111450f, + 0.000000f, 1.000000f, 0.003691f, 0.997070f, 0.006359f, 0.994629f, 0.009880f, 0.990723f, + 0.012497f, 0.987305f, 0.016006f, 0.982422f, 0.018814f, 0.978027f, 0.021103f, 0.975098f, + 0.024994f, 0.969238f, 0.027466f, 0.965332f, 0.029770f, 0.960938f, 0.032043f, 0.956543f, + 0.035645f, 0.951172f, 0.038147f, 0.946289f, 0.040985f, 0.941895f, 0.043304f, 0.937500f, + 0.046326f, 0.931641f, 0.048462f, 0.927246f, 0.050964f, 0.922363f, 0.053406f, 0.917969f, + 0.055298f, 0.913086f, 0.057861f, 0.907715f, 0.060944f, 0.902344f, 0.063049f, 0.897461f, + 0.065125f, 0.893066f, 0.066772f, 0.888672f, 0.069946f, 0.882812f, 0.072571f, 0.876953f, + 0.074524f, 0.871582f, 0.076355f, 0.866211f, 0.078247f, 0.860840f, 0.080017f, 0.855469f, + 0.082214f, 0.849609f, 0.084534f, 0.843262f, 0.086243f, 0.836426f, 0.088623f, 0.830078f, + 0.089783f, 0.823730f, 0.091675f, 0.817871f, 0.092468f, 0.812012f, 0.094727f, 0.804199f, + 0.096558f, 0.795410f, 0.098328f, 0.787598f, 0.099365f, 0.780273f, 0.100342f, 0.771973f, + 0.101074f, 0.764648f, 0.101746f, 0.755859f, 0.103333f, 0.745117f, 0.104065f, 0.734375f, + 0.104736f, 0.723633f, 0.104736f, 0.712891f, 0.104431f, 0.701172f, 0.103455f, 0.689453f, + 0.102905f, 0.673828f, 0.102051f, 0.656738f, 0.100220f, 0.639160f, 0.097534f, 0.620605f, + 0.093872f, 0.600098f, 0.089661f, 0.574707f, 0.084412f, 0.542480f, 0.076843f, 0.505859f, + 0.066467f, 0.461426f, 0.053345f, 0.397217f, 0.033508f, 0.298096f, 0.006302f, 0.110352f, + 0.000000f, 1.000000f, 0.004448f, 0.996582f, 0.007580f, 0.993652f, 0.011833f, 0.989258f, + 0.015114f, 0.985352f, 0.019333f, 0.979492f, 0.022400f, 0.975586f, 0.026123f, 0.970215f, + 0.029907f, 0.964844f, 0.032623f, 0.960449f, 0.035736f, 0.955078f, 0.039642f, 0.949219f, + 0.042419f, 0.944824f, 0.045105f, 0.939941f, 0.048584f, 0.935059f, 0.052551f, 0.928711f, + 0.055420f, 0.922852f, 0.058197f, 0.917969f, 0.060883f, 0.913086f, 0.063110f, 0.908203f, + 0.066895f, 0.901855f, 0.069702f, 0.896484f, 0.072144f, 0.891113f, 0.074890f, 0.886230f, + 0.077087f, 0.881836f, 0.080078f, 0.875977f, 0.083496f, 0.869629f, 0.085938f, 0.863770f, + 0.088318f, 0.858887f, 0.090271f, 0.854004f, 0.092224f, 0.848633f, 0.094849f, 0.841797f, + 0.097290f, 0.834961f, 0.099731f, 0.829102f, 0.101746f, 0.822754f, 0.103821f, 0.816895f, + 0.105042f, 0.811035f, 0.106873f, 0.805176f, 0.109436f, 0.797363f, 0.110840f, 0.789062f, + 0.113586f, 0.782227f, 0.114624f, 0.774414f, 0.115479f, 0.767090f, 0.116394f, 0.759766f, + 0.117371f, 0.751953f, 0.119263f, 0.741699f, 0.119995f, 0.731445f, 0.121216f, 0.722168f, + 0.121033f, 0.711914f, 0.120300f, 0.701660f, 0.120117f, 0.690918f, 0.119629f, 0.677246f, + 0.118835f, 0.662109f, 0.117188f, 0.646973f, 0.114441f, 0.630371f, 0.111694f, 0.612793f, + 0.107605f, 0.593750f, 0.102661f, 0.566406f, 0.096191f, 0.536133f, 0.087524f, 0.500977f, + 0.075256f, 0.458740f, 0.060059f, 0.393066f, 0.038086f, 0.298340f, 0.007027f, 0.109375f, + 0.000000f, 1.000000f, 0.005013f, 0.996582f, 0.009384f, 0.992676f, 0.013985f, 0.987793f, + 0.018478f, 0.982422f, 0.023056f, 0.976562f, 0.026917f, 0.972168f, 0.032440f, 0.964844f, + 0.035583f, 0.959473f, 0.038879f, 0.955078f, 0.043518f, 0.948242f, 0.048096f, 0.941895f, + 0.051117f, 0.937012f, 0.054321f, 0.931641f, 0.058868f, 0.924316f, 0.062134f, 0.918945f, + 0.066101f, 0.913086f, 0.069092f, 0.907715f, 0.073059f, 0.901855f, 0.076721f, 0.895020f, + 0.079895f, 0.889160f, 0.083008f, 0.883789f, 0.085876f, 0.878906f, 0.088623f, 0.873535f, + 0.092407f, 0.866699f, 0.095459f, 0.861328f, 0.098083f, 0.855469f, 0.101135f, 0.850098f, + 0.103516f, 0.845215f, 0.106018f, 0.839844f, 0.108887f, 0.833008f, 0.112366f, 0.826172f, + 0.114563f, 0.819824f, 0.116638f, 0.813965f, 0.118652f, 0.808594f, 0.120972f, 0.802734f, + 0.122803f, 0.796387f, 0.125366f, 0.788086f, 0.127686f, 0.781250f, 0.129395f, 0.774414f, + 0.130737f, 0.767578f, 0.132568f, 0.760742f, 0.133667f, 0.753906f, 0.134888f, 0.746094f, + 0.135986f, 0.736328f, 0.137695f, 0.727539f, 0.137817f, 0.718262f, 0.138184f, 0.708984f, + 0.138184f, 0.700195f, 0.137451f, 0.690430f, 0.137451f, 0.678223f, 0.137085f, 0.665039f, + 0.135376f, 0.650879f, 0.133179f, 0.636719f, 0.130615f, 0.622559f, 0.126343f, 0.605469f, + 0.121338f, 0.583496f, 0.116455f, 0.558594f, 0.108276f, 0.529785f, 0.097961f, 0.496826f, + 0.084595f, 0.455811f, 0.067871f, 0.390381f, 0.042236f, 0.295898f, 0.007912f, 0.108582f, + 0.000000f, 1.000000f, 0.006454f, 0.995605f, 0.011932f, 0.990723f, 0.017227f, 0.985840f, + 0.023407f, 0.979004f, 0.028214f, 0.973145f, 0.033173f, 0.966309f, 0.038757f, 0.959473f, + 0.042969f, 0.953613f, 0.048706f, 0.946289f, 0.053802f, 0.939453f, 0.056763f, 0.934082f, + 0.062012f, 0.927246f, 0.067139f, 0.919922f, 0.070740f, 0.913574f, 0.074524f, 0.907715f, + 0.077759f, 0.902832f, 0.083557f, 0.894531f, 0.087952f, 0.887695f, 0.091370f, 0.881836f, + 0.095032f, 0.875977f, 0.097656f, 0.871094f, 0.101685f, 0.864258f, 0.105957f, 0.856934f, + 0.109802f, 0.851074f, 0.112488f, 0.845703f, 0.115112f, 0.840332f, 0.118469f, 0.835449f, + 0.121765f, 0.828613f, 0.125366f, 0.821777f, 0.128052f, 0.815918f, 0.130737f, 0.810059f, + 0.133179f, 0.804199f, 0.135132f, 0.798340f, 0.136841f, 0.793457f, 0.140869f, 0.785645f, + 0.143311f, 0.778809f, 0.145508f, 0.771484f, 0.147095f, 0.765137f, 0.148804f, 0.758789f, + 0.149902f, 0.752441f, 0.151123f, 0.746094f, 0.153320f, 0.737793f, 0.154419f, 0.729004f, + 0.155762f, 0.720703f, 0.156982f, 0.712402f, 0.156982f, 0.704590f, 0.156616f, 0.696289f, + 0.156616f, 0.687988f, 0.155518f, 0.676270f, 0.155762f, 0.664062f, 0.154785f, 0.651855f, + 0.152832f, 0.639648f, 0.150024f, 0.626465f, 0.145752f, 0.612305f, 0.141602f, 0.596680f, + 0.137085f, 0.573730f, 0.129883f, 0.549805f, 0.121460f, 0.523926f, 0.109680f, 0.492676f, + 0.094177f, 0.450928f, 0.075134f, 0.387207f, 0.047089f, 0.296143f, 0.008751f, 0.107971f, + 0.000000f, 1.000000f, 0.007488f, 0.995605f, 0.015404f, 0.988770f, 0.021408f, 0.982422f, + 0.028671f, 0.975098f, 0.035034f, 0.967773f, 0.041779f, 0.959961f, 0.046570f, 0.953125f, + 0.053497f, 0.944824f, 0.059540f, 0.937012f, 0.064270f, 0.930176f, 0.070251f, 0.922852f, + 0.075256f, 0.915039f, 0.080994f, 0.907715f, 0.085083f, 0.901367f, 0.089844f, 0.894531f, + 0.095093f, 0.886230f, 0.099243f, 0.879883f, 0.104248f, 0.873047f, 0.108032f, 0.867188f, + 0.112305f, 0.860840f, 0.117432f, 0.852539f, 0.120911f, 0.846191f, 0.124756f, 0.840332f, + 0.127930f, 0.834473f, 0.131470f, 0.829102f, 0.135254f, 0.822754f, 0.139526f, 0.815430f, + 0.143188f, 0.809082f, 0.146240f, 0.803711f, 0.148682f, 0.798340f, 0.151123f, 0.793457f, + 0.153564f, 0.787598f, 0.156982f, 0.780273f, 0.159912f, 0.772949f, 0.162231f, 0.767090f, + 0.164673f, 0.760742f, 0.166748f, 0.754883f, 0.167725f, 0.749023f, 0.169067f, 0.743164f, + 0.172241f, 0.735840f, 0.173218f, 0.727539f, 0.175537f, 0.720215f, 0.175903f, 0.712891f, + 0.176392f, 0.705078f, 0.176880f, 0.698242f, 0.177002f, 0.690918f, 0.175781f, 0.682617f, + 0.176636f, 0.671387f, 0.176147f, 0.662109f, 0.175415f, 0.650391f, 0.173584f, 0.640137f, + 0.170166f, 0.628906f, 0.166260f, 0.616699f, 0.162354f, 0.603027f, 0.158569f, 0.583984f, + 0.151978f, 0.564453f, 0.144531f, 0.542969f, 0.133789f, 0.517578f, 0.121094f, 0.488525f, + 0.104858f, 0.445068f, 0.083130f, 0.384033f, 0.051697f, 0.294922f, 0.009659f, 0.107117f, + 0.000000f, 1.000000f, 0.009659f, 0.994629f, 0.018875f, 0.986816f, 0.027817f, 0.978516f, + 0.034943f, 0.971191f, 0.044312f, 0.960449f, 0.050873f, 0.952637f, 0.059174f, 0.943359f, + 0.065857f, 0.934570f, 0.072449f, 0.927246f, 0.079468f, 0.917480f, 0.085876f, 0.909180f, + 0.091919f, 0.901367f, 0.096252f, 0.895020f, 0.103882f, 0.885254f, 0.109009f, 0.877441f, + 0.114685f, 0.870117f, 0.118774f, 0.863770f, 0.123291f, 0.856445f, 0.129883f, 0.848145f, + 0.134521f, 0.840820f, 0.139282f, 0.833984f, 0.142700f, 0.828125f, 0.145752f, 0.822754f, + 0.151245f, 0.814453f, 0.155151f, 0.808105f, 0.159180f, 0.801270f, 0.162354f, 0.795898f, + 0.165527f, 0.790039f, 0.168457f, 0.785156f, 0.171387f, 0.778809f, 0.175293f, 0.771973f, + 0.179443f, 0.765625f, 0.181396f, 0.759277f, 0.183594f, 0.753906f, 0.185181f, 0.748047f, + 0.187134f, 0.742676f, 0.188721f, 0.737793f, 0.191772f, 0.729980f, 0.192993f, 0.722656f, + 0.195068f, 0.715820f, 0.196655f, 0.709473f, 0.197388f, 0.702637f, 0.197876f, 0.696777f, + 0.197876f, 0.690430f, 0.197754f, 0.684082f, 0.198486f, 0.673828f, 0.198608f, 0.665039f, + 0.197998f, 0.655762f, 0.197266f, 0.647461f, 0.194458f, 0.637207f, 0.191772f, 0.627930f, + 0.188477f, 0.618164f, 0.184692f, 0.605469f, 0.180420f, 0.589844f, 0.174927f, 0.572754f, + 0.168091f, 0.555176f, 0.158691f, 0.535156f, 0.147095f, 0.512695f, 0.132202f, 0.483887f, + 0.115540f, 0.439209f, 0.091309f, 0.381348f, 0.056702f, 0.294922f, 0.010612f, 0.106750f, + 0.000000f, 1.000000f, 0.011765f, 0.993652f, 0.023361f, 0.984863f, 0.035400f, 0.973633f, + 0.046143f, 0.962402f, 0.055176f, 0.953125f, 0.065430f, 0.941895f, 0.073853f, 0.932129f, + 0.080811f, 0.923828f, 0.090820f, 0.911621f, 0.098145f, 0.902832f, 0.104797f, 0.894531f, + 0.112366f, 0.884766f, 0.119812f, 0.875000f, 0.125488f, 0.867188f, 0.130737f, 0.859863f, + 0.137207f, 0.851074f, 0.143677f, 0.842285f, 0.148926f, 0.834473f, 0.153320f, 0.828125f, + 0.158081f, 0.821289f, 0.162964f, 0.813965f, 0.168945f, 0.805176f, 0.173706f, 0.798340f, + 0.177246f, 0.791992f, 0.181152f, 0.786133f, 0.183960f, 0.780762f, 0.187622f, 0.774902f, + 0.192017f, 0.767578f, 0.196411f, 0.761230f, 0.198853f, 0.754883f, 0.201660f, 0.749512f, + 0.204468f, 0.744629f, 0.206665f, 0.739258f, 0.208130f, 0.734863f, 0.210449f, 0.727539f, + 0.213745f, 0.720703f, 0.215820f, 0.714355f, 0.217651f, 0.708496f, 0.218262f, 0.703125f, + 0.219116f, 0.697266f, 0.220337f, 0.691895f, 0.219604f, 0.686523f, 0.220825f, 0.679199f, + 0.221802f, 0.671875f, 0.222412f, 0.663574f, 0.222168f, 0.656250f, 0.220947f, 0.648438f, + 0.219482f, 0.641113f, 0.217163f, 0.633301f, 0.213623f, 0.625000f, 0.210449f, 0.616699f, + 0.208130f, 0.604004f, 0.204102f, 0.590820f, 0.199097f, 0.577148f, 0.192993f, 0.562988f, + 0.184082f, 0.546875f, 0.173218f, 0.529297f, 0.160400f, 0.508301f, 0.145996f, 0.474609f, + 0.126465f, 0.432861f, 0.099487f, 0.378174f, 0.061523f, 0.294922f, 0.011581f, 0.106689f, + 0.000000f, 1.000000f, 0.017303f, 0.990723f, 0.031982f, 0.979492f, 0.046143f, 0.966797f, + 0.059052f, 0.954590f, 0.071777f, 0.940918f, 0.082031f, 0.929688f, 0.093140f, 0.917480f, + 0.103699f, 0.905762f, 0.111877f, 0.895996f, 0.121826f, 0.883789f, 0.130615f, 0.873047f, + 0.138306f, 0.864258f, 0.144775f, 0.855469f, 0.153809f, 0.844238f, 0.159302f, 0.835938f, + 0.165405f, 0.827637f, 0.170532f, 0.820801f, 0.177490f, 0.811523f, 0.183350f, 0.803223f, + 0.188965f, 0.795410f, 0.192993f, 0.788574f, 0.196899f, 0.782227f, 0.201660f, 0.776367f, + 0.206543f, 0.768066f, 0.210327f, 0.761230f, 0.215332f, 0.753906f, 0.218628f, 0.748535f, + 0.221313f, 0.742676f, 0.223877f, 0.737793f, 0.226807f, 0.732910f, 0.229248f, 0.727051f, + 0.232666f, 0.720703f, 0.236084f, 0.714355f, 0.238770f, 0.708984f, 0.239990f, 0.704102f, + 0.240723f, 0.698730f, 0.242432f, 0.693848f, 0.243164f, 0.688965f, 0.243530f, 0.685059f, + 0.244507f, 0.677734f, 0.246338f, 0.670898f, 0.247803f, 0.664551f, 0.247314f, 0.657715f, + 0.247192f, 0.652832f, 0.246338f, 0.645996f, 0.244751f, 0.640137f, 0.243042f, 0.633789f, + 0.240479f, 0.627930f, 0.238159f, 0.619141f, 0.236694f, 0.609375f, 0.233643f, 0.599121f, + 0.229492f, 0.589355f, 0.223389f, 0.578125f, 0.217163f, 0.566895f, 0.209351f, 0.554199f, + 0.199463f, 0.540527f, 0.187622f, 0.523438f, 0.174927f, 0.496582f, 0.158691f, 0.465576f, + 0.137207f, 0.427979f, 0.108276f, 0.376709f, 0.066467f, 0.295654f, 0.012627f, 0.106445f, + 0.000000f, 1.000000f, 0.022964f, 0.988281f, 0.042114f, 0.974121f, 0.061371f, 0.957520f, + 0.078979f, 0.940918f, 0.093079f, 0.926758f, 0.106934f, 0.911621f, 0.118469f, 0.899414f, + 0.131714f, 0.884766f, 0.142334f, 0.872559f, 0.150879f, 0.861816f, 0.161987f, 0.849121f, + 0.170288f, 0.838379f, 0.177368f, 0.829590f, 0.184692f, 0.819336f, 0.193359f, 0.808594f, + 0.199829f, 0.799805f, 0.205688f, 0.791504f, 0.210205f, 0.784668f, 0.216675f, 0.776367f, + 0.222534f, 0.767578f, 0.227417f, 0.760254f, 0.231567f, 0.753418f, 0.236206f, 0.746582f, + 0.240479f, 0.740234f, 0.242310f, 0.735352f, 0.247314f, 0.729004f, 0.250488f, 0.721680f, + 0.254395f, 0.715332f, 0.257324f, 0.709473f, 0.260010f, 0.704102f, 0.261963f, 0.699707f, + 0.263672f, 0.695312f, 0.264893f, 0.690918f, 0.266602f, 0.687012f, 0.268799f, 0.681641f, + 0.269531f, 0.675293f, 0.271973f, 0.669434f, 0.272705f, 0.664062f, 0.273682f, 0.659180f, + 0.274170f, 0.654785f, 0.273682f, 0.649414f, 0.272949f, 0.644531f, 0.272705f, 0.640625f, + 0.270264f, 0.635742f, 0.269531f, 0.629883f, 0.268555f, 0.622070f, 0.267578f, 0.615234f, + 0.265137f, 0.607910f, 0.261963f, 0.600586f, 0.259277f, 0.593750f, 0.253906f, 0.584961f, + 0.248901f, 0.576660f, 0.242310f, 0.567871f, 0.234375f, 0.557617f, 0.225952f, 0.546387f, + 0.216797f, 0.528320f, 0.205078f, 0.508789f, 0.190674f, 0.486816f, 0.172241f, 0.459229f, + 0.148315f, 0.424561f, 0.116272f, 0.375488f, 0.071289f, 0.296875f, 0.013588f, 0.106506f, + 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.059143f, 0.964844f, 0.083252f, 0.944824f, + 0.105103f, 0.924316f, 0.124756f, 0.904785f, 0.139648f, 0.889648f, 0.154907f, 0.872559f, + 0.167969f, 0.858398f, 0.178223f, 0.846191f, 0.191162f, 0.831055f, 0.201294f, 0.818848f, + 0.208862f, 0.808594f, 0.216919f, 0.798340f, 0.225098f, 0.787109f, 0.233032f, 0.776855f, + 0.239502f, 0.768066f, 0.244751f, 0.760254f, 0.250000f, 0.752441f, 0.254639f, 0.745117f, + 0.260986f, 0.736328f, 0.265381f, 0.728516f, 0.270264f, 0.721680f, 0.273438f, 0.715332f, + 0.277832f, 0.709473f, 0.280518f, 0.703613f, 0.282471f, 0.699219f, 0.286133f, 0.692871f, + 0.289307f, 0.686523f, 0.291504f, 0.681641f, 0.294678f, 0.675781f, 0.295898f, 0.671387f, + 0.297852f, 0.666992f, 0.299072f, 0.662598f, 0.300293f, 0.658691f, 0.301025f, 0.654785f, + 0.300537f, 0.651855f, 0.300537f, 0.647949f, 0.301025f, 0.643066f, 0.301758f, 0.637207f, + 0.301514f, 0.632324f, 0.302002f, 0.627930f, 0.301025f, 0.622070f, 0.300537f, 0.617188f, + 0.298340f, 0.612305f, 0.297363f, 0.607910f, 0.294434f, 0.602539f, 0.291748f, 0.597168f, + 0.288330f, 0.591797f, 0.283936f, 0.585938f, 0.280029f, 0.580078f, 0.273193f, 0.573242f, + 0.269043f, 0.563965f, 0.262695f, 0.553711f, 0.254883f, 0.541992f, 0.246216f, 0.529785f, + 0.234619f, 0.515625f, 0.221802f, 0.499268f, 0.205200f, 0.479980f, 0.184692f, 0.454834f, + 0.158569f, 0.422363f, 0.124268f, 0.375488f, 0.078003f, 0.288086f, 0.014595f, 0.107117f, + 0.000000f, 1.000000f, 0.049713f, 0.977051f, 0.088806f, 0.949219f, 0.119446f, 0.922852f, + 0.145874f, 0.898438f, 0.166016f, 0.878418f, 0.185425f, 0.857910f, 0.201050f, 0.840820f, + 0.215088f, 0.824707f, 0.228394f, 0.808594f, 0.239136f, 0.794922f, 0.248413f, 0.782715f, + 0.257568f, 0.771484f, 0.264893f, 0.760254f, 0.272705f, 0.750000f, 0.280273f, 0.739258f, + 0.286133f, 0.730469f, 0.291260f, 0.722168f, 0.296387f, 0.714844f, 0.301025f, 0.707031f, + 0.303955f, 0.701172f, 0.308594f, 0.694336f, 0.311768f, 0.687988f, 0.315186f, 0.681152f, + 0.317871f, 0.675781f, 0.321045f, 0.669922f, 0.324707f, 0.664062f, 0.326660f, 0.659180f, + 0.329102f, 0.653809f, 0.329590f, 0.649902f, 0.331055f, 0.645508f, 0.332275f, 0.641602f, + 0.333252f, 0.637695f, 0.333496f, 0.633789f, 0.334229f, 0.630371f, 0.334229f, 0.626953f, + 0.333740f, 0.624023f, 0.334229f, 0.620605f, 0.333252f, 0.616699f, 0.333008f, 0.612305f, + 0.332275f, 0.608398f, 0.330566f, 0.604980f, 0.329590f, 0.600098f, 0.328125f, 0.596191f, + 0.326172f, 0.592285f, 0.323486f, 0.587891f, 0.320312f, 0.583008f, 0.317139f, 0.578125f, + 0.313721f, 0.573242f, 0.309082f, 0.567871f, 0.303955f, 0.561035f, 0.298096f, 0.555176f, + 0.291504f, 0.547852f, 0.283447f, 0.540039f, 0.274170f, 0.530762f, 0.263672f, 0.520508f, + 0.250977f, 0.508301f, 0.236572f, 0.493652f, 0.218506f, 0.475586f, 0.196777f, 0.451660f, + 0.169800f, 0.417969f, 0.134155f, 0.368164f, 0.084351f, 0.283936f, 0.015701f, 0.108337f, + 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.108582f, 0.938965f, 0.144531f, 0.908691f, + 0.173096f, 0.882324f, 0.196289f, 0.858398f, 0.214600f, 0.837891f, 0.231689f, 0.818848f, + 0.246094f, 0.801758f, 0.259033f, 0.786133f, 0.269775f, 0.771973f, 0.279053f, 0.759277f, + 0.289062f, 0.747070f, 0.296387f, 0.736328f, 0.303467f, 0.725586f, 0.309082f, 0.716797f, + 0.315186f, 0.707520f, 0.320312f, 0.699219f, 0.325195f, 0.691406f, 0.329834f, 0.684082f, + 0.333496f, 0.677246f, 0.336914f, 0.670898f, 0.340332f, 0.664551f, 0.343994f, 0.658203f, + 0.345703f, 0.652832f, 0.348633f, 0.647461f, 0.351074f, 0.642578f, 0.352295f, 0.637695f, + 0.355225f, 0.632812f, 0.355957f, 0.628418f, 0.356445f, 0.624512f, 0.358398f, 0.620117f, + 0.358887f, 0.616211f, 0.359131f, 0.612793f, 0.359863f, 0.609375f, 0.360352f, 0.605469f, + 0.359619f, 0.602539f, 0.359619f, 0.599121f, 0.359619f, 0.595703f, 0.358154f, 0.591797f, + 0.356934f, 0.588379f, 0.355469f, 0.584961f, 0.355469f, 0.581055f, 0.352295f, 0.577148f, + 0.350342f, 0.573730f, 0.347656f, 0.569824f, 0.345459f, 0.565430f, 0.341797f, 0.560547f, + 0.337891f, 0.555664f, 0.333252f, 0.550781f, 0.328125f, 0.544434f, 0.322510f, 0.538574f, + 0.315186f, 0.531250f, 0.308350f, 0.523926f, 0.299805f, 0.514648f, 0.289551f, 0.504883f, + 0.277344f, 0.492676f, 0.262207f, 0.477539f, 0.245728f, 0.459717f, 0.223145f, 0.436035f, + 0.196167f, 0.404785f, 0.160156f, 0.358643f, 0.107544f, 0.280273f, 0.028214f, 0.113586f, + 0.000000f, 1.000000f, 0.062988f, 0.971191f, 0.109253f, 0.938477f, 0.145508f, 0.908203f, + 0.174438f, 0.881348f, 0.198975f, 0.856934f, 0.217773f, 0.835938f, 0.235596f, 0.816406f, + 0.250244f, 0.798828f, 0.263672f, 0.782715f, 0.275146f, 0.768066f, 0.284912f, 0.754883f, + 0.293945f, 0.743164f, 0.303223f, 0.730957f, 0.310791f, 0.720215f, 0.316895f, 0.710449f, + 0.323242f, 0.701172f, 0.328857f, 0.692383f, 0.334473f, 0.684082f, 0.338867f, 0.676758f, + 0.343994f, 0.668457f, 0.347656f, 0.662109f, 0.351074f, 0.655273f, 0.355225f, 0.649414f, + 0.357178f, 0.643066f, 0.360107f, 0.637695f, 0.363281f, 0.632324f, 0.365723f, 0.626465f, + 0.368652f, 0.621094f, 0.370605f, 0.616211f, 0.371582f, 0.611816f, 0.373535f, 0.607422f, + 0.374756f, 0.603027f, 0.375732f, 0.599121f, 0.376465f, 0.595215f, 0.376953f, 0.591309f, + 0.377686f, 0.587891f, 0.377930f, 0.583984f, 0.378418f, 0.580566f, 0.377930f, 0.576172f, + 0.377441f, 0.572266f, 0.376465f, 0.568848f, 0.376465f, 0.564453f, 0.374512f, 0.560059f, + 0.373535f, 0.555664f, 0.371338f, 0.551758f, 0.369385f, 0.546875f, 0.366455f, 0.541992f, + 0.363525f, 0.536621f, 0.359619f, 0.531250f, 0.356201f, 0.525391f, 0.350830f, 0.518555f, + 0.345459f, 0.511230f, 0.339600f, 0.503906f, 0.331055f, 0.494141f, 0.322754f, 0.483398f, + 0.312500f, 0.471924f, 0.299316f, 0.457031f, 0.283936f, 0.439453f, 0.264160f, 0.416504f, + 0.238525f, 0.386230f, 0.204834f, 0.341553f, 0.151611f, 0.267334f, 0.062408f, 0.109009f, + 0.000000f, 1.000000f, 0.062744f, 0.971680f, 0.110352f, 0.937988f, 0.147095f, 0.907227f, + 0.175415f, 0.880859f, 0.201660f, 0.855469f, 0.221558f, 0.833496f, 0.239258f, 0.813965f, + 0.254395f, 0.795898f, 0.267578f, 0.779785f, 0.280273f, 0.764648f, 0.291260f, 0.750488f, + 0.300537f, 0.738281f, 0.308838f, 0.726074f, 0.317383f, 0.714844f, 0.324707f, 0.704102f, + 0.331787f, 0.694336f, 0.337891f, 0.685059f, 0.344238f, 0.676270f, 0.348145f, 0.668945f, + 0.355225f, 0.660156f, 0.358154f, 0.653320f, 0.362549f, 0.646484f, 0.366943f, 0.639160f, + 0.370361f, 0.632812f, 0.373535f, 0.626953f, 0.376709f, 0.621094f, 0.379883f, 0.615234f, + 0.381836f, 0.609863f, 0.385010f, 0.604004f, 0.386963f, 0.599121f, 0.389893f, 0.594238f, + 0.391113f, 0.589844f, 0.392334f, 0.584961f, 0.394043f, 0.580566f, 0.395264f, 0.576172f, + 0.396973f, 0.572266f, 0.396973f, 0.568359f, 0.398438f, 0.563965f, 0.399414f, 0.559570f, + 0.398682f, 0.554688f, 0.398193f, 0.550781f, 0.398926f, 0.545898f, 0.398438f, 0.541992f, + 0.397217f, 0.536621f, 0.396484f, 0.532227f, 0.394531f, 0.527344f, 0.393311f, 0.521973f, + 0.390625f, 0.516602f, 0.388184f, 0.510742f, 0.385254f, 0.503906f, 0.381104f, 0.497070f, + 0.376221f, 0.489746f, 0.370361f, 0.481201f, 0.364746f, 0.472412f, 0.356934f, 0.461426f, + 0.347900f, 0.449219f, 0.335938f, 0.435059f, 0.323486f, 0.417725f, 0.305176f, 0.395752f, + 0.281738f, 0.366211f, 0.250000f, 0.324463f, 0.198730f, 0.255127f, 0.105286f, 0.104431f, + 0.000000f, 1.000000f, 0.062866f, 0.971680f, 0.111023f, 0.937500f, 0.148315f, 0.906738f, + 0.178101f, 0.878906f, 0.203369f, 0.854004f, 0.224976f, 0.831543f, 0.242676f, 0.811523f, + 0.259766f, 0.792480f, 0.272705f, 0.775879f, 0.285645f, 0.760254f, 0.297119f, 0.746094f, + 0.307373f, 0.732910f, 0.316650f, 0.720215f, 0.324951f, 0.708496f, 0.333252f, 0.697754f, + 0.341064f, 0.687500f, 0.346680f, 0.677734f, 0.353516f, 0.668945f, 0.359375f, 0.660156f, + 0.365234f, 0.651367f, 0.368896f, 0.644043f, 0.374268f, 0.636230f, 0.379150f, 0.628906f, + 0.383789f, 0.621582f, 0.386963f, 0.615234f, 0.391113f, 0.608887f, 0.395020f, 0.602539f, + 0.398193f, 0.596680f, 0.401611f, 0.590332f, 0.403809f, 0.585449f, 0.405518f, 0.580566f, + 0.409180f, 0.574707f, 0.410156f, 0.570312f, 0.412354f, 0.565430f, 0.414062f, 0.560547f, + 0.415527f, 0.556152f, 0.416992f, 0.551758f, 0.418213f, 0.547363f, 0.419678f, 0.542969f, + 0.419678f, 0.538086f, 0.420166f, 0.533691f, 0.420898f, 0.528320f, 0.420898f, 0.523926f, + 0.420166f, 0.518555f, 0.419678f, 0.513672f, 0.419434f, 0.508301f, 0.418457f, 0.502441f, + 0.416748f, 0.496826f, 0.415283f, 0.490723f, 0.412842f, 0.483398f, 0.410645f, 0.476074f, + 0.406250f, 0.468750f, 0.401855f, 0.459717f, 0.398682f, 0.450928f, 0.390625f, 0.439453f, + 0.383301f, 0.427490f, 0.373047f, 0.412842f, 0.361816f, 0.395996f, 0.345947f, 0.374268f, + 0.325684f, 0.346436f, 0.296387f, 0.305664f, 0.248291f, 0.240967f, 0.154663f, 0.099915f, + 0.000000f, 1.000000f, 0.063293f, 0.971191f, 0.111023f, 0.937988f, 0.149170f, 0.906250f, + 0.179932f, 0.877930f, 0.205811f, 0.852539f, 0.226929f, 0.830078f, 0.246582f, 0.808594f, + 0.263672f, 0.789551f, 0.277344f, 0.772461f, 0.291748f, 0.755859f, 0.303711f, 0.741211f, + 0.314209f, 0.727539f, 0.324951f, 0.714355f, 0.333252f, 0.702148f, 0.343018f, 0.689941f, + 0.350586f, 0.679199f, 0.358154f, 0.668945f, 0.364014f, 0.660156f, 0.370850f, 0.650391f, + 0.376465f, 0.642090f, 0.381592f, 0.633789f, 0.387451f, 0.625488f, 0.392090f, 0.618164f, + 0.396484f, 0.610840f, 0.400879f, 0.604004f, 0.404297f, 0.597656f, 0.407715f, 0.591309f, + 0.412109f, 0.584961f, 0.416260f, 0.578125f, 0.418701f, 0.572754f, 0.421631f, 0.566895f, + 0.425537f, 0.561035f, 0.426758f, 0.556152f, 0.428955f, 0.550781f, 0.432129f, 0.545410f, + 0.433838f, 0.540527f, 0.436523f, 0.535645f, 0.438232f, 0.530762f, 0.440918f, 0.525391f, + 0.441162f, 0.520996f, 0.442139f, 0.515625f, 0.442139f, 0.510254f, 0.443848f, 0.504883f, + 0.444824f, 0.500000f, 0.444092f, 0.494629f, 0.444824f, 0.488770f, 0.444336f, 0.482666f, + 0.443359f, 0.476562f, 0.442871f, 0.469971f, 0.442383f, 0.462646f, 0.439697f, 0.455322f, + 0.437012f, 0.447021f, 0.433350f, 0.438721f, 0.429199f, 0.428223f, 0.424072f, 0.417725f, + 0.418945f, 0.405518f, 0.410400f, 0.391357f, 0.399658f, 0.373779f, 0.386475f, 0.352539f, + 0.367920f, 0.325684f, 0.341797f, 0.287842f, 0.298340f, 0.226685f, 0.206909f, 0.094177f, + 0.000000f, 1.000000f, 0.063416f, 0.971191f, 0.112122f, 0.937012f, 0.149780f, 0.905762f, + 0.181885f, 0.876953f, 0.208618f, 0.850586f, 0.231323f, 0.827148f, 0.251221f, 0.805664f, + 0.268555f, 0.785645f, 0.283936f, 0.768066f, 0.298340f, 0.750977f, 0.310791f, 0.735352f, + 0.322510f, 0.720703f, 0.332275f, 0.707520f, 0.343018f, 0.694824f, 0.352051f, 0.683105f, + 0.359619f, 0.671875f, 0.367188f, 0.661621f, 0.373535f, 0.651855f, 0.381592f, 0.641602f, + 0.387207f, 0.633301f, 0.393799f, 0.624023f, 0.399170f, 0.615723f, 0.404053f, 0.608398f, + 0.409424f, 0.600098f, 0.414062f, 0.592773f, 0.418213f, 0.585938f, 0.421875f, 0.579102f, + 0.427246f, 0.571777f, 0.431396f, 0.564941f, 0.435547f, 0.558594f, 0.437744f, 0.552734f, + 0.442139f, 0.546875f, 0.445312f, 0.541016f, 0.447754f, 0.535645f, 0.450439f, 0.529785f, + 0.453125f, 0.524414f, 0.455811f, 0.519043f, 0.458252f, 0.514160f, 0.460449f, 0.508789f, + 0.462891f, 0.503418f, 0.463623f, 0.497803f, 0.465332f, 0.492188f, 0.467041f, 0.486572f, + 0.468262f, 0.480957f, 0.468262f, 0.475586f, 0.469727f, 0.469238f, 0.470215f, 0.462891f, + 0.470703f, 0.456055f, 0.469238f, 0.449219f, 0.469727f, 0.442139f, 0.468506f, 0.434326f, + 0.467285f, 0.425781f, 0.463867f, 0.416748f, 0.461426f, 0.406494f, 0.458984f, 0.396240f, + 0.451660f, 0.383057f, 0.446533f, 0.369385f, 0.437256f, 0.352295f, 0.426514f, 0.331543f, + 0.409668f, 0.305420f, 0.386963f, 0.269287f, 0.346924f, 0.211426f, 0.261230f, 0.088196f, + 0.000000f, 1.000000f, 0.064514f, 0.970215f, 0.113281f, 0.936523f, 0.151855f, 0.904785f, + 0.183105f, 0.875977f, 0.210693f, 0.849121f, 0.235352f, 0.824219f, 0.255371f, 0.802246f, + 0.273682f, 0.782227f, 0.290771f, 0.763184f, 0.304443f, 0.746094f, 0.316650f, 0.730469f, + 0.328369f, 0.715820f, 0.340088f, 0.702148f, 0.350586f, 0.688965f, 0.359131f, 0.676758f, + 0.368408f, 0.665039f, 0.376709f, 0.653809f, 0.384033f, 0.643555f, 0.391357f, 0.633789f, + 0.397461f, 0.624512f, 0.405518f, 0.614258f, 0.411377f, 0.605469f, 0.416992f, 0.597168f, + 0.422607f, 0.589355f, 0.427979f, 0.581055f, 0.432373f, 0.573730f, 0.437744f, 0.566406f, + 0.442627f, 0.559570f, 0.446777f, 0.552246f, 0.451416f, 0.545410f, 0.455566f, 0.538574f, + 0.460205f, 0.532227f, 0.462402f, 0.525879f, 0.465576f, 0.520508f, 0.469238f, 0.514160f, + 0.472168f, 0.508301f, 0.475098f, 0.502441f, 0.477783f, 0.497559f, 0.480957f, 0.491455f, + 0.484619f, 0.485596f, 0.486084f, 0.480469f, 0.487549f, 0.474121f, 0.489746f, 0.467773f, + 0.491211f, 0.461670f, 0.493408f, 0.456055f, 0.494141f, 0.449707f, 0.495605f, 0.442383f, + 0.496826f, 0.435791f, 0.496582f, 0.428711f, 0.496826f, 0.421875f, 0.496582f, 0.412842f, + 0.496582f, 0.404297f, 0.495850f, 0.395508f, 0.492676f, 0.385254f, 0.489990f, 0.374023f, + 0.486572f, 0.360840f, 0.481201f, 0.348145f, 0.474365f, 0.330566f, 0.465332f, 0.310791f, + 0.451660f, 0.285645f, 0.430908f, 0.250488f, 0.395752f, 0.196655f, 0.314941f, 0.082642f, + 0.000000f, 1.000000f, 0.064331f, 0.970703f, 0.113464f, 0.936523f, 0.153320f, 0.903809f, + 0.186401f, 0.874023f, 0.213989f, 0.846680f, 0.238770f, 0.821777f, 0.260742f, 0.798340f, + 0.278320f, 0.778809f, 0.295654f, 0.759277f, 0.309082f, 0.742676f, 0.323975f, 0.725586f, + 0.335938f, 0.710449f, 0.346436f, 0.696777f, 0.357666f, 0.683105f, 0.367920f, 0.669922f, + 0.377686f, 0.657227f, 0.386475f, 0.645996f, 0.394531f, 0.634766f, 0.403076f, 0.624512f, + 0.409180f, 0.614746f, 0.416748f, 0.604492f, 0.423096f, 0.595703f, 0.429688f, 0.586426f, + 0.435059f, 0.578613f, 0.442627f, 0.569336f, 0.446777f, 0.561523f, 0.452148f, 0.553711f, + 0.456787f, 0.546875f, 0.462402f, 0.539062f, 0.467773f, 0.531738f, 0.471436f, 0.524902f, + 0.475586f, 0.518066f, 0.481201f, 0.510742f, 0.483643f, 0.504883f, 0.488281f, 0.498535f, + 0.492432f, 0.491943f, 0.494141f, 0.486328f, 0.498047f, 0.480225f, 0.501465f, 0.474121f, + 0.505371f, 0.467773f, 0.508789f, 0.461914f, 0.509277f, 0.456055f, 0.512207f, 0.449463f, + 0.514648f, 0.442627f, 0.517090f, 0.436523f, 0.518555f, 0.430176f, 0.520996f, 0.422607f, + 0.521973f, 0.415771f, 0.522949f, 0.408447f, 0.523926f, 0.400391f, 0.525391f, 0.391846f, + 0.525391f, 0.383545f, 0.524902f, 0.373779f, 0.523926f, 0.363770f, 0.521484f, 0.352295f, + 0.520020f, 0.340332f, 0.515625f, 0.325928f, 0.510742f, 0.309570f, 0.502930f, 0.290039f, + 0.491455f, 0.265381f, 0.473389f, 0.233521f, 0.442383f, 0.181519f, 0.370117f, 0.076660f, + 0.000000f, 1.000000f, 0.064087f, 0.971191f, 0.113586f, 0.936523f, 0.154785f, 0.902832f, + 0.189209f, 0.872070f, 0.218018f, 0.844238f, 0.242920f, 0.818848f, 0.263428f, 0.796387f, + 0.282227f, 0.775391f, 0.299561f, 0.756348f, 0.314941f, 0.737793f, 0.330322f, 0.720703f, + 0.343506f, 0.704590f, 0.355225f, 0.689941f, 0.366943f, 0.675781f, 0.376709f, 0.662598f, + 0.387207f, 0.649902f, 0.395996f, 0.638184f, 0.405273f, 0.625977f, 0.412354f, 0.616211f, + 0.421631f, 0.604492f, 0.429199f, 0.594727f, 0.436035f, 0.584961f, 0.443359f, 0.575684f, + 0.448975f, 0.566895f, 0.456787f, 0.557617f, 0.460938f, 0.549805f, 0.468750f, 0.541016f, + 0.473145f, 0.533203f, 0.477783f, 0.525879f, 0.483887f, 0.518066f, 0.488037f, 0.510254f, + 0.492676f, 0.503418f, 0.497803f, 0.496094f, 0.502930f, 0.488770f, 0.506348f, 0.482666f, + 0.511230f, 0.475830f, 0.514648f, 0.469727f, 0.518555f, 0.462891f, 0.521484f, 0.456787f, + 0.525391f, 0.450439f, 0.529785f, 0.443848f, 0.532715f, 0.437988f, 0.535645f, 0.430664f, + 0.537598f, 0.423828f, 0.540039f, 0.417236f, 0.543457f, 0.410645f, 0.545898f, 0.402832f, + 0.547852f, 0.395752f, 0.550293f, 0.388184f, 0.550781f, 0.380127f, 0.552246f, 0.371826f, + 0.552734f, 0.362305f, 0.553711f, 0.353271f, 0.553711f, 0.342773f, 0.553223f, 0.332031f, + 0.551758f, 0.319336f, 0.548828f, 0.305176f, 0.545898f, 0.289795f, 0.540039f, 0.270020f, + 0.529297f, 0.246948f, 0.513184f, 0.216187f, 0.487549f, 0.167358f, 0.422119f, 0.069885f, + 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.115173f, 0.935547f, 0.156616f, 0.901855f, + 0.192017f, 0.870117f, 0.220093f, 0.842773f, 0.246338f, 0.816895f, 0.268066f, 0.793457f, + 0.287598f, 0.771973f, 0.305420f, 0.751953f, 0.322510f, 0.732910f, 0.336670f, 0.715820f, + 0.350830f, 0.698730f, 0.364014f, 0.683105f, 0.375000f, 0.668945f, 0.386475f, 0.654785f, + 0.396729f, 0.642578f, 0.407715f, 0.628906f, 0.415771f, 0.617676f, 0.423584f, 0.606445f, + 0.433350f, 0.595215f, 0.439941f, 0.584961f, 0.448975f, 0.574219f, 0.455566f, 0.564453f, + 0.462402f, 0.555176f, 0.469727f, 0.545898f, 0.476318f, 0.537109f, 0.481689f, 0.528809f, + 0.488770f, 0.520020f, 0.493652f, 0.512207f, 0.499512f, 0.504395f, 0.504883f, 0.496338f, + 0.510254f, 0.488525f, 0.515625f, 0.480713f, 0.520996f, 0.473633f, 0.524902f, 0.466797f, + 0.530273f, 0.459473f, 0.534180f, 0.452637f, 0.538086f, 0.446045f, 0.542969f, 0.438965f, + 0.546387f, 0.432861f, 0.550781f, 0.425781f, 0.553711f, 0.419678f, 0.558105f, 0.412598f, + 0.561035f, 0.404785f, 0.564453f, 0.397949f, 0.567383f, 0.390869f, 0.570312f, 0.383789f, + 0.572754f, 0.375732f, 0.575195f, 0.367920f, 0.577148f, 0.360107f, 0.580566f, 0.350830f, + 0.581543f, 0.342773f, 0.582520f, 0.332520f, 0.582520f, 0.322510f, 0.583496f, 0.310791f, + 0.583008f, 0.298828f, 0.580078f, 0.285156f, 0.578613f, 0.269287f, 0.573730f, 0.251221f, + 0.565430f, 0.229004f, 0.554688f, 0.198730f, 0.529785f, 0.154053f, 0.471924f, 0.063538f, + 0.000000f, 1.000000f, 0.063843f, 0.971191f, 0.116028f, 0.935059f, 0.159546f, 0.899902f, + 0.193848f, 0.869141f, 0.223999f, 0.840820f, 0.249268f, 0.814941f, 0.272461f, 0.790527f, + 0.293213f, 0.768066f, 0.312500f, 0.747070f, 0.329590f, 0.727539f, 0.343994f, 0.709961f, + 0.357666f, 0.693848f, 0.371582f, 0.677246f, 0.384766f, 0.662109f, 0.395996f, 0.647461f, + 0.406250f, 0.634277f, 0.417236f, 0.621094f, 0.425293f, 0.609375f, 0.435547f, 0.596680f, + 0.446045f, 0.584961f, 0.453125f, 0.574707f, 0.460938f, 0.563965f, 0.469971f, 0.553223f, + 0.477051f, 0.543457f, 0.483887f, 0.534180f, 0.491699f, 0.524414f, 0.497559f, 0.515625f, + 0.503906f, 0.506836f, 0.509277f, 0.498779f, 0.516113f, 0.490479f, 0.521973f, 0.481934f, + 0.527344f, 0.473877f, 0.533691f, 0.465576f, 0.538574f, 0.458008f, 0.542969f, 0.450684f, + 0.548828f, 0.443359f, 0.553223f, 0.436035f, 0.558105f, 0.429199f, 0.563965f, 0.421631f, + 0.567383f, 0.415039f, 0.571777f, 0.407715f, 0.575195f, 0.401367f, 0.580566f, 0.394043f, + 0.583984f, 0.386475f, 0.587402f, 0.379150f, 0.590820f, 0.371826f, 0.595215f, 0.364258f, + 0.597656f, 0.356445f, 0.599121f, 0.348633f, 0.604492f, 0.340088f, 0.605469f, 0.331299f, + 0.608887f, 0.322021f, 0.608398f, 0.312744f, 0.611816f, 0.302490f, 0.612305f, 0.291260f, + 0.612305f, 0.279297f, 0.611816f, 0.266113f, 0.610352f, 0.250244f, 0.606445f, 0.232788f, + 0.601562f, 0.211060f, 0.590820f, 0.182739f, 0.570312f, 0.140747f, 0.519043f, 0.057953f, + 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.117493f, 0.934082f, 0.160645f, 0.899414f, + 0.195190f, 0.868164f, 0.227295f, 0.838867f, 0.253174f, 0.812012f, 0.277588f, 0.787109f, + 0.297607f, 0.764648f, 0.317627f, 0.743164f, 0.335449f, 0.723633f, 0.350586f, 0.705078f, + 0.364990f, 0.687500f, 0.379883f, 0.670898f, 0.392090f, 0.655273f, 0.405762f, 0.640137f, + 0.416016f, 0.625977f, 0.426758f, 0.612793f, 0.437500f, 0.600098f, 0.448242f, 0.586914f, + 0.456543f, 0.575684f, 0.465820f, 0.563965f, 0.473877f, 0.553223f, 0.481201f, 0.542969f, + 0.490723f, 0.531738f, 0.497559f, 0.522461f, 0.505371f, 0.512207f, 0.512695f, 0.502441f, + 0.519043f, 0.493896f, 0.525879f, 0.484619f, 0.532715f, 0.476318f, 0.538574f, 0.467529f, + 0.544922f, 0.458984f, 0.551270f, 0.450684f, 0.558105f, 0.442383f, 0.561035f, 0.435059f, + 0.567383f, 0.427246f, 0.572754f, 0.419189f, 0.578125f, 0.412109f, 0.582520f, 0.404785f, + 0.588379f, 0.397217f, 0.592285f, 0.390137f, 0.597168f, 0.383057f, 0.602051f, 0.375488f, + 0.605469f, 0.369141f, 0.610352f, 0.360352f, 0.612793f, 0.353027f, 0.618164f, 0.344971f, + 0.621094f, 0.337402f, 0.625000f, 0.329102f, 0.628418f, 0.320312f, 0.631348f, 0.312256f, + 0.633301f, 0.302490f, 0.637207f, 0.293701f, 0.638672f, 0.282959f, 0.640137f, 0.271973f, + 0.641602f, 0.259766f, 0.641113f, 0.247437f, 0.640137f, 0.231689f, 0.637695f, 0.214966f, + 0.634277f, 0.194214f, 0.625488f, 0.167847f, 0.607422f, 0.128784f, 0.563965f, 0.054199f, + 0.000000f, 1.000000f, 0.064270f, 0.971191f, 0.118652f, 0.933105f, 0.161499f, 0.898926f, + 0.197510f, 0.867188f, 0.228516f, 0.837402f, 0.257324f, 0.809082f, 0.281250f, 0.784180f, + 0.302979f, 0.761230f, 0.322998f, 0.739258f, 0.341797f, 0.718262f, 0.357666f, 0.699707f, + 0.373535f, 0.681152f, 0.387207f, 0.664551f, 0.401855f, 0.647949f, 0.413818f, 0.632812f, + 0.425781f, 0.618164f, 0.437988f, 0.604004f, 0.448242f, 0.590820f, 0.459961f, 0.577637f, + 0.468994f, 0.565430f, 0.479248f, 0.552734f, 0.487549f, 0.541992f, 0.496338f, 0.531250f, + 0.504883f, 0.520020f, 0.511719f, 0.510254f, 0.519531f, 0.500000f, 0.527832f, 0.489746f, + 0.535156f, 0.480469f, 0.541504f, 0.470947f, 0.547852f, 0.462402f, 0.554688f, 0.453613f, + 0.562988f, 0.444092f, 0.568848f, 0.435547f, 0.575195f, 0.427002f, 0.580078f, 0.418945f, + 0.586914f, 0.410889f, 0.590820f, 0.403320f, 0.597168f, 0.395264f, 0.602051f, 0.387939f, + 0.608887f, 0.379883f, 0.613281f, 0.372559f, 0.618164f, 0.365234f, 0.623535f, 0.357422f, + 0.628418f, 0.350342f, 0.632324f, 0.342529f, 0.635254f, 0.334961f, 0.640625f, 0.326416f, + 0.645020f, 0.318604f, 0.648926f, 0.310547f, 0.651367f, 0.302246f, 0.656250f, 0.292725f, + 0.659180f, 0.283936f, 0.661621f, 0.274658f, 0.664551f, 0.263916f, 0.667480f, 0.253418f, + 0.668945f, 0.241577f, 0.669922f, 0.229248f, 0.670410f, 0.214844f, 0.669434f, 0.198364f, + 0.664551f, 0.178589f, 0.658203f, 0.153564f, 0.644043f, 0.117371f, 0.605957f, 0.046814f, + 0.000000f, 1.000000f, 0.065063f, 0.970703f, 0.119690f, 0.932617f, 0.162720f, 0.898438f, + 0.199585f, 0.865723f, 0.232910f, 0.834473f, 0.260254f, 0.807129f, 0.285889f, 0.781250f, + 0.309082f, 0.756836f, 0.328613f, 0.734863f, 0.348145f, 0.713379f, 0.365234f, 0.693848f, + 0.381836f, 0.675293f, 0.396729f, 0.657227f, 0.410645f, 0.641113f, 0.423828f, 0.625000f, + 0.436768f, 0.609863f, 0.448730f, 0.595215f, 0.460938f, 0.581055f, 0.470459f, 0.568359f, + 0.480957f, 0.555176f, 0.490723f, 0.543457f, 0.500977f, 0.531250f, 0.508789f, 0.519531f, + 0.519043f, 0.508301f, 0.526855f, 0.497559f, 0.535156f, 0.487305f, 0.541992f, 0.477295f, + 0.550781f, 0.467041f, 0.558105f, 0.457031f, 0.564453f, 0.448242f, 0.571777f, 0.438721f, + 0.579102f, 0.429688f, 0.585449f, 0.421143f, 0.592285f, 0.411865f, 0.597656f, 0.403320f, + 0.605469f, 0.395020f, 0.610840f, 0.386719f, 0.616211f, 0.378662f, 0.621094f, 0.371094f, + 0.628906f, 0.362549f, 0.632812f, 0.355225f, 0.638184f, 0.347900f, 0.644043f, 0.339844f, + 0.648926f, 0.332275f, 0.654785f, 0.324707f, 0.657715f, 0.316895f, 0.663086f, 0.308350f, + 0.667480f, 0.300293f, 0.671387f, 0.292236f, 0.675293f, 0.283936f, 0.680176f, 0.274658f, + 0.683105f, 0.266113f, 0.686523f, 0.256348f, 0.689941f, 0.246704f, 0.692383f, 0.235474f, + 0.693848f, 0.224609f, 0.696289f, 0.212524f, 0.697266f, 0.198486f, 0.695801f, 0.182617f, + 0.693848f, 0.163330f, 0.689941f, 0.140869f, 0.678711f, 0.106812f, 0.645020f, 0.043213f, + 0.000000f, 1.000000f, 0.065430f, 0.970215f, 0.120850f, 0.932129f, 0.163452f, 0.897949f, + 0.202393f, 0.864258f, 0.236206f, 0.832520f, 0.264893f, 0.804199f, 0.290527f, 0.777832f, + 0.312988f, 0.753418f, 0.334961f, 0.730469f, 0.354248f, 0.708496f, 0.372803f, 0.687988f, + 0.389160f, 0.669434f, 0.404297f, 0.650879f, 0.420166f, 0.633789f, 0.433105f, 0.617676f, + 0.447266f, 0.601562f, 0.459717f, 0.586426f, 0.471191f, 0.572266f, 0.481934f, 0.558594f, + 0.493164f, 0.544922f, 0.503418f, 0.532227f, 0.512695f, 0.520508f, 0.523438f, 0.507812f, + 0.531250f, 0.497070f, 0.542480f, 0.484863f, 0.548340f, 0.475098f, 0.558594f, 0.464111f, + 0.564941f, 0.454102f, 0.574219f, 0.443359f, 0.581543f, 0.433594f, 0.587891f, 0.424805f, + 0.595215f, 0.415283f, 0.603027f, 0.406006f, 0.611328f, 0.396240f, 0.616699f, 0.387939f, + 0.622559f, 0.379150f, 0.629395f, 0.370605f, 0.635254f, 0.362305f, 0.641113f, 0.354248f, + 0.647949f, 0.346191f, 0.652832f, 0.338135f, 0.658691f, 0.330322f, 0.664062f, 0.322754f, + 0.669922f, 0.314453f, 0.674316f, 0.307373f, 0.680176f, 0.299316f, 0.683594f, 0.291016f, + 0.688477f, 0.282471f, 0.693848f, 0.274170f, 0.696777f, 0.266602f, 0.701660f, 0.257568f, + 0.706055f, 0.248047f, 0.710449f, 0.239014f, 0.712891f, 0.229370f, 0.716797f, 0.219116f, + 0.719238f, 0.208374f, 0.720215f, 0.196045f, 0.723145f, 0.182739f, 0.723145f, 0.167969f, + 0.722168f, 0.150391f, 0.718262f, 0.128662f, 0.709961f, 0.096558f, 0.679688f, 0.039581f, + 0.000000f, 1.000000f, 0.066101f, 0.969727f, 0.121155f, 0.932617f, 0.165527f, 0.896973f, + 0.205322f, 0.861816f, 0.238281f, 0.831543f, 0.268311f, 0.801758f, 0.294678f, 0.774902f, + 0.319336f, 0.749512f, 0.341309f, 0.725586f, 0.361572f, 0.703125f, 0.380371f, 0.682617f, + 0.396973f, 0.663086f, 0.413330f, 0.644043f, 0.428467f, 0.626465f, 0.445068f, 0.609375f, + 0.458252f, 0.592773f, 0.470947f, 0.577637f, 0.481201f, 0.563477f, 0.493896f, 0.548340f, + 0.504883f, 0.535156f, 0.516113f, 0.521973f, 0.526855f, 0.509277f, 0.536621f, 0.496826f, + 0.544922f, 0.485107f, 0.554688f, 0.473389f, 0.563965f, 0.461914f, 0.572754f, 0.451172f, + 0.581543f, 0.440430f, 0.590332f, 0.429932f, 0.597168f, 0.419922f, 0.604980f, 0.410156f, + 0.612793f, 0.400391f, 0.619141f, 0.391602f, 0.627930f, 0.381592f, 0.634766f, 0.372314f, + 0.640625f, 0.363770f, 0.647949f, 0.354492f, 0.655273f, 0.345947f, 0.659668f, 0.337891f, + 0.666016f, 0.329590f, 0.672852f, 0.321289f, 0.677734f, 0.313721f, 0.683594f, 0.305664f, + 0.689941f, 0.297363f, 0.694824f, 0.289795f, 0.700195f, 0.282227f, 0.706055f, 0.274414f, + 0.709961f, 0.265625f, 0.714355f, 0.257324f, 0.719727f, 0.249023f, 0.723633f, 0.240845f, + 0.728027f, 0.231323f, 0.731445f, 0.223022f, 0.736328f, 0.212891f, 0.740234f, 0.202759f, + 0.743164f, 0.191772f, 0.746094f, 0.181030f, 0.747070f, 0.168701f, 0.748535f, 0.154297f, + 0.748047f, 0.137207f, 0.745117f, 0.116882f, 0.737305f, 0.087463f, 0.713867f, 0.035583f, + 0.000000f, 1.000000f, 0.066650f, 0.969238f, 0.121887f, 0.932129f, 0.168335f, 0.895020f, + 0.207153f, 0.861328f, 0.241699f, 0.828613f, 0.272217f, 0.798828f, 0.300537f, 0.770996f, + 0.323975f, 0.745605f, 0.348633f, 0.720703f, 0.368652f, 0.698242f, 0.387451f, 0.677246f, + 0.405029f, 0.656738f, 0.422852f, 0.637207f, 0.437256f, 0.619141f, 0.452881f, 0.601562f, + 0.467285f, 0.584961f, 0.480225f, 0.568848f, 0.493652f, 0.553223f, 0.505859f, 0.539062f, + 0.517578f, 0.524414f, 0.528320f, 0.511230f, 0.539062f, 0.498047f, 0.549805f, 0.485352f, + 0.559570f, 0.472900f, 0.570312f, 0.460938f, 0.578125f, 0.449463f, 0.587402f, 0.438232f, + 0.596680f, 0.427002f, 0.604980f, 0.416748f, 0.613281f, 0.405762f, 0.621094f, 0.395996f, + 0.627930f, 0.386230f, 0.636719f, 0.376465f, 0.643555f, 0.367188f, 0.651367f, 0.357422f, + 0.657227f, 0.348633f, 0.665527f, 0.339111f, 0.673340f, 0.330322f, 0.677246f, 0.322266f, + 0.684082f, 0.313721f, 0.691406f, 0.305176f, 0.696777f, 0.297119f, 0.702637f, 0.289062f, + 0.708008f, 0.281006f, 0.714844f, 0.272705f, 0.720215f, 0.265381f, 0.725098f, 0.257568f, + 0.730469f, 0.249390f, 0.735352f, 0.240723f, 0.740234f, 0.232910f, 0.744141f, 0.224365f, + 0.750000f, 0.215576f, 0.753906f, 0.206299f, 0.757324f, 0.197632f, 0.761719f, 0.187622f, + 0.763672f, 0.177734f, 0.767578f, 0.166504f, 0.770020f, 0.154297f, 0.771484f, 0.141113f, + 0.771973f, 0.125244f, 0.770020f, 0.106323f, 0.763672f, 0.078552f, 0.744141f, 0.031311f, + 0.000000f, 1.000000f, 0.068359f, 0.968262f, 0.123169f, 0.931641f, 0.169067f, 0.894531f, + 0.209961f, 0.859375f, 0.243896f, 0.827637f, 0.276855f, 0.795898f, 0.305664f, 0.767578f, + 0.329834f, 0.741211f, 0.353027f, 0.716797f, 0.375488f, 0.692871f, 0.395264f, 0.670898f, + 0.413330f, 0.650391f, 0.430176f, 0.630859f, 0.448486f, 0.611328f, 0.463135f, 0.593262f, + 0.477783f, 0.576660f, 0.491943f, 0.559570f, 0.505859f, 0.543945f, 0.518066f, 0.528809f, + 0.528809f, 0.514648f, 0.540527f, 0.500488f, 0.552246f, 0.487061f, 0.562012f, 0.474365f, + 0.573730f, 0.460938f, 0.582520f, 0.449219f, 0.593262f, 0.436768f, 0.602539f, 0.425293f, + 0.612793f, 0.413818f, 0.618652f, 0.404053f, 0.628906f, 0.392090f, 0.637695f, 0.381592f, + 0.645508f, 0.371582f, 0.653320f, 0.361816f, 0.657715f, 0.353516f, 0.667969f, 0.342529f, + 0.675781f, 0.333252f, 0.682617f, 0.323975f, 0.688965f, 0.315186f, 0.696289f, 0.306152f, + 0.703613f, 0.297607f, 0.709961f, 0.289062f, 0.715332f, 0.281006f, 0.720703f, 0.273193f, + 0.728027f, 0.264648f, 0.732910f, 0.256836f, 0.738770f, 0.249390f, 0.745117f, 0.241089f, + 0.749512f, 0.233643f, 0.754883f, 0.225220f, 0.760254f, 0.216675f, 0.764648f, 0.208252f, + 0.769531f, 0.200195f, 0.773926f, 0.191895f, 0.778320f, 0.182373f, 0.781738f, 0.173096f, + 0.785156f, 0.163330f, 0.788574f, 0.153442f, 0.791016f, 0.141113f, 0.793945f, 0.129028f, + 0.794922f, 0.114624f, 0.793457f, 0.096802f, 0.789062f, 0.071899f, 0.771973f, 0.028336f, + 0.000000f, 1.000000f, 0.068176f, 0.968750f, 0.123291f, 0.931641f, 0.171997f, 0.893066f, + 0.212891f, 0.857422f, 0.247803f, 0.824707f, 0.279541f, 0.793945f, 0.309570f, 0.764648f, + 0.335938f, 0.737305f, 0.360107f, 0.711914f, 0.382568f, 0.687500f, 0.402588f, 0.665527f, + 0.422852f, 0.643555f, 0.439453f, 0.623535f, 0.457275f, 0.604004f, 0.473633f, 0.584961f, + 0.488770f, 0.567871f, 0.503418f, 0.550781f, 0.516602f, 0.534668f, 0.528809f, 0.519043f, + 0.542480f, 0.503418f, 0.554199f, 0.489502f, 0.564941f, 0.476074f, 0.575684f, 0.462402f, + 0.587402f, 0.448975f, 0.597656f, 0.436523f, 0.607422f, 0.424316f, 0.618164f, 0.412109f, + 0.626953f, 0.400635f, 0.635254f, 0.389893f, 0.644531f, 0.378906f, 0.652832f, 0.368164f, + 0.660645f, 0.357910f, 0.669434f, 0.347412f, 0.676758f, 0.338135f, 0.684082f, 0.328613f, + 0.692871f, 0.318359f, 0.698242f, 0.309570f, 0.706543f, 0.299805f, 0.713867f, 0.291016f, + 0.719238f, 0.282715f, 0.726074f, 0.273926f, 0.733398f, 0.265381f, 0.738281f, 0.257812f, + 0.745117f, 0.249390f, 0.751465f, 0.241211f, 0.756836f, 0.233521f, 0.762695f, 0.225708f, + 0.768555f, 0.217651f, 0.772949f, 0.210693f, 0.779297f, 0.201782f, 0.783203f, 0.193604f, + 0.788086f, 0.185181f, 0.792969f, 0.177246f, 0.796875f, 0.168335f, 0.801758f, 0.159302f, + 0.805176f, 0.150635f, 0.808105f, 0.140015f, 0.811035f, 0.129517f, 0.814453f, 0.117981f, + 0.815918f, 0.103760f, 0.814941f, 0.087219f, 0.812500f, 0.064514f, 0.797852f, 0.024719f, + 0.000000f, 1.000000f, 0.067627f, 0.969727f, 0.123962f, 0.930664f, 0.171997f, 0.893066f, + 0.213989f, 0.856934f, 0.251221f, 0.822754f, 0.284668f, 0.791016f, 0.313721f, 0.761230f, + 0.342041f, 0.732910f, 0.365479f, 0.707520f, 0.388672f, 0.682617f, 0.410889f, 0.659180f, + 0.431885f, 0.636719f, 0.448730f, 0.616211f, 0.466553f, 0.596680f, 0.482422f, 0.577637f, + 0.496826f, 0.560059f, 0.512695f, 0.541992f, 0.527344f, 0.524902f, 0.541504f, 0.508789f, + 0.553711f, 0.493896f, 0.566895f, 0.479004f, 0.577637f, 0.465088f, 0.589355f, 0.450684f, + 0.600098f, 0.437988f, 0.611328f, 0.424316f, 0.622559f, 0.411621f, 0.631836f, 0.400146f, + 0.641113f, 0.387939f, 0.650879f, 0.376465f, 0.658691f, 0.365723f, 0.668945f, 0.354248f, + 0.676758f, 0.343994f, 0.685547f, 0.333496f, 0.692871f, 0.323486f, 0.700195f, 0.314209f, + 0.708984f, 0.304199f, 0.715820f, 0.295166f, 0.723145f, 0.285156f, 0.730469f, 0.276123f, + 0.736816f, 0.267822f, 0.743164f, 0.258789f, 0.750488f, 0.250244f, 0.757812f, 0.242310f, + 0.761719f, 0.234375f, 0.769043f, 0.225952f, 0.774414f, 0.218506f, 0.779785f, 0.210938f, + 0.785156f, 0.203003f, 0.791504f, 0.195312f, 0.797363f, 0.187988f, 0.801270f, 0.179565f, + 0.806152f, 0.171509f, 0.811523f, 0.162964f, 0.815918f, 0.155151f, 0.818359f, 0.146973f, + 0.823242f, 0.137207f, 0.828613f, 0.128174f, 0.830078f, 0.117920f, 0.832520f, 0.106873f, + 0.834961f, 0.093811f, 0.835938f, 0.078918f, 0.833984f, 0.058533f, 0.821777f, 0.022888f, + 0.000000f, 1.000000f, 0.067932f, 0.969238f, 0.125488f, 0.929688f, 0.175171f, 0.891113f, + 0.217529f, 0.854492f, 0.254150f, 0.820801f, 0.287109f, 0.788574f, 0.319092f, 0.757812f, + 0.348633f, 0.728516f, 0.372803f, 0.702148f, 0.396729f, 0.676758f, 0.418457f, 0.653320f, + 0.438721f, 0.630371f, 0.458252f, 0.608887f, 0.476562f, 0.588379f, 0.493652f, 0.568848f, + 0.509766f, 0.550293f, 0.524902f, 0.532227f, 0.539551f, 0.515137f, 0.552734f, 0.499023f, + 0.567383f, 0.483154f, 0.579102f, 0.468018f, 0.591797f, 0.453125f, 0.603516f, 0.439453f, + 0.614258f, 0.425537f, 0.625488f, 0.412354f, 0.636230f, 0.399658f, 0.645996f, 0.387451f, + 0.654297f, 0.375977f, 0.665527f, 0.363281f, 0.675293f, 0.352051f, 0.682617f, 0.341553f, + 0.691895f, 0.330566f, 0.701660f, 0.319580f, 0.708496f, 0.309570f, 0.716309f, 0.299805f, + 0.722656f, 0.290527f, 0.731445f, 0.281006f, 0.739258f, 0.271484f, 0.746582f, 0.261719f, + 0.753906f, 0.253174f, 0.759277f, 0.244507f, 0.767090f, 0.235840f, 0.771973f, 0.228027f, + 0.779297f, 0.219482f, 0.784668f, 0.211670f, 0.791504f, 0.203735f, 0.797363f, 0.196411f, + 0.802734f, 0.188354f, 0.808594f, 0.181152f, 0.813477f, 0.173950f, 0.818848f, 0.166138f, + 0.823242f, 0.158447f, 0.828125f, 0.149902f, 0.833496f, 0.141846f, 0.836914f, 0.134766f, + 0.840820f, 0.125366f, 0.844238f, 0.116882f, 0.847656f, 0.107178f, 0.852051f, 0.096863f, + 0.853516f, 0.084900f, 0.854980f, 0.071045f, 0.854004f, 0.052765f, 0.845215f, 0.020370f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.126465f, 0.929688f, 0.176270f, 0.890625f, + 0.219116f, 0.853516f, 0.257568f, 0.818359f, 0.294189f, 0.784668f, 0.324219f, 0.754395f, + 0.353027f, 0.725098f, 0.378906f, 0.697754f, 0.403564f, 0.671875f, 0.426514f, 0.646973f, + 0.448242f, 0.623535f, 0.466309f, 0.602051f, 0.486572f, 0.581055f, 0.503906f, 0.560547f, + 0.519043f, 0.541992f, 0.535645f, 0.523438f, 0.550781f, 0.505859f, 0.564941f, 0.489258f, + 0.579102f, 0.472900f, 0.592285f, 0.457275f, 0.604980f, 0.442139f, 0.615234f, 0.428467f, + 0.627441f, 0.414062f, 0.638672f, 0.400635f, 0.649414f, 0.387451f, 0.660645f, 0.374512f, + 0.669922f, 0.362793f, 0.680176f, 0.350586f, 0.689941f, 0.338867f, 0.699219f, 0.327881f, + 0.705078f, 0.317627f, 0.715820f, 0.306152f, 0.725098f, 0.295410f, 0.730957f, 0.286377f, + 0.739746f, 0.276123f, 0.746582f, 0.267090f, 0.754883f, 0.257568f, 0.762207f, 0.248291f, + 0.768066f, 0.239502f, 0.777344f, 0.230103f, 0.781250f, 0.222412f, 0.788574f, 0.213745f, + 0.796387f, 0.205322f, 0.800293f, 0.198120f, 0.806641f, 0.190186f, 0.813965f, 0.182251f, + 0.817871f, 0.175049f, 0.823730f, 0.167725f, 0.829590f, 0.160278f, 0.835449f, 0.152832f, + 0.838867f, 0.146484f, 0.844727f, 0.137695f, 0.849121f, 0.129883f, 0.852539f, 0.123169f, + 0.857910f, 0.114807f, 0.861328f, 0.106140f, 0.865234f, 0.096985f, 0.868652f, 0.087036f, + 0.870605f, 0.076904f, 0.871582f, 0.063538f, 0.872070f, 0.046936f, 0.864746f, 0.018570f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.127197f, 0.929199f, 0.177124f, 0.890137f, + 0.222656f, 0.851562f, 0.262207f, 0.815918f, 0.297119f, 0.782227f, 0.328857f, 0.750977f, + 0.358398f, 0.721191f, 0.386230f, 0.692383f, 0.411377f, 0.666016f, 0.434326f, 0.641113f, + 0.455566f, 0.617676f, 0.476074f, 0.594727f, 0.496094f, 0.572754f, 0.513184f, 0.552734f, + 0.530762f, 0.533203f, 0.547363f, 0.514160f, 0.562988f, 0.496094f, 0.576660f, 0.479248f, + 0.590820f, 0.462402f, 0.604004f, 0.446533f, 0.616211f, 0.431641f, 0.629883f, 0.416504f, + 0.641602f, 0.402344f, 0.652344f, 0.388672f, 0.664062f, 0.375488f, 0.674805f, 0.362305f, + 0.683594f, 0.350098f, 0.693359f, 0.338379f, 0.704102f, 0.326172f, 0.713379f, 0.314697f, + 0.721680f, 0.303711f, 0.729980f, 0.293945f, 0.738770f, 0.282715f, 0.746582f, 0.272705f, + 0.755371f, 0.262695f, 0.761230f, 0.253662f, 0.770020f, 0.244141f, 0.776367f, 0.235596f, + 0.783203f, 0.226196f, 0.791504f, 0.217041f, 0.797852f, 0.208618f, 0.803223f, 0.200684f, + 0.811523f, 0.191772f, 0.816406f, 0.184570f, 0.821777f, 0.176880f, 0.828613f, 0.168945f, + 0.833496f, 0.161865f, 0.839355f, 0.154785f, 0.844727f, 0.147339f, 0.850586f, 0.140381f, + 0.854492f, 0.133911f, 0.860840f, 0.126465f, 0.864258f, 0.118774f, 0.868164f, 0.111755f, + 0.872559f, 0.103699f, 0.876465f, 0.096558f, 0.881348f, 0.087158f, 0.883789f, 0.079224f, + 0.886719f, 0.068542f, 0.888184f, 0.057404f, 0.889648f, 0.041260f, 0.882812f, 0.016769f, + 0.000000f, 1.000000f, 0.068054f, 0.969238f, 0.128052f, 0.928711f, 0.180054f, 0.888184f, + 0.224487f, 0.850586f, 0.264648f, 0.813965f, 0.301758f, 0.779297f, 0.334473f, 0.747070f, + 0.364746f, 0.716797f, 0.391357f, 0.688477f, 0.416992f, 0.661133f, 0.441650f, 0.635254f, + 0.466064f, 0.609863f, 0.485596f, 0.587891f, 0.505371f, 0.565430f, 0.523438f, 0.544434f, + 0.541992f, 0.523926f, 0.557617f, 0.504883f, 0.572754f, 0.486816f, 0.587402f, 0.469482f, + 0.602539f, 0.452393f, 0.614746f, 0.437012f, 0.628906f, 0.420654f, 0.641113f, 0.405762f, + 0.653809f, 0.391113f, 0.665527f, 0.376953f, 0.678223f, 0.363037f, 0.687500f, 0.350586f, + 0.699219f, 0.337402f, 0.708008f, 0.325684f, 0.717285f, 0.313965f, 0.727051f, 0.302490f, + 0.736816f, 0.290771f, 0.743652f, 0.280762f, 0.753906f, 0.270020f, 0.761230f, 0.259766f, + 0.770020f, 0.249878f, 0.776855f, 0.240112f, 0.784668f, 0.230957f, 0.791504f, 0.221924f, + 0.796875f, 0.213867f, 0.806641f, 0.204102f, 0.812988f, 0.195679f, 0.817383f, 0.187988f, + 0.825684f, 0.179199f, 0.831543f, 0.171509f, 0.837402f, 0.164307f, 0.843262f, 0.156250f, + 0.848145f, 0.149536f, 0.853516f, 0.142578f, 0.859863f, 0.135010f, 0.864258f, 0.128784f, + 0.869629f, 0.121704f, 0.875000f, 0.114990f, 0.878906f, 0.109009f, 0.883301f, 0.101196f, + 0.887207f, 0.093689f, 0.892090f, 0.086487f, 0.895508f, 0.079102f, 0.898438f, 0.070251f, + 0.901855f, 0.061432f, 0.905273f, 0.050354f, 0.905762f, 0.036346f, 0.900391f, 0.013496f, + 0.000000f, 1.000000f, 0.068542f, 0.969238f, 0.129272f, 0.928223f, 0.179810f, 0.888672f, + 0.228149f, 0.848145f, 0.269531f, 0.811035f, 0.306152f, 0.776367f, 0.338623f, 0.743652f, + 0.370850f, 0.712402f, 0.399902f, 0.682617f, 0.426514f, 0.654785f, 0.450684f, 0.628418f, + 0.472168f, 0.604004f, 0.494873f, 0.580078f, 0.515625f, 0.557129f, 0.533691f, 0.535645f, + 0.550781f, 0.515625f, 0.568359f, 0.495850f, 0.584473f, 0.477295f, 0.600098f, 0.459473f, + 0.614746f, 0.441895f, 0.628906f, 0.425293f, 0.642578f, 0.409424f, 0.655762f, 0.394043f, + 0.667969f, 0.379395f, 0.679199f, 0.365234f, 0.690430f, 0.352051f, 0.700684f, 0.338379f, + 0.711914f, 0.325684f, 0.721191f, 0.313477f, 0.731445f, 0.301270f, 0.740234f, 0.290283f, + 0.750488f, 0.278809f, 0.759277f, 0.267822f, 0.767090f, 0.257324f, 0.775391f, 0.247681f, + 0.783691f, 0.237305f, 0.791016f, 0.227539f, 0.799316f, 0.218262f, 0.806641f, 0.209106f, + 0.811523f, 0.200928f, 0.818359f, 0.192505f, 0.826172f, 0.183716f, 0.833496f, 0.175293f, + 0.839355f, 0.166870f, 0.845215f, 0.159424f, 0.852051f, 0.151733f, 0.857910f, 0.144165f, + 0.860840f, 0.137939f, 0.867676f, 0.130371f, 0.873047f, 0.123840f, 0.877930f, 0.117249f, + 0.883301f, 0.110352f, 0.887207f, 0.104614f, 0.893555f, 0.097595f, 0.897461f, 0.091553f, + 0.900879f, 0.084900f, 0.904785f, 0.077393f, 0.910645f, 0.069885f, 0.912109f, 0.063721f, + 0.915527f, 0.054260f, 0.918945f, 0.044922f, 0.918945f, 0.032166f, 0.916504f, 0.011772f, + 0.000000f, 1.000000f, 0.069641f, 0.968262f, 0.129395f, 0.928223f, 0.182739f, 0.886719f, + 0.228882f, 0.847656f, 0.272217f, 0.809082f, 0.310547f, 0.773438f, 0.343994f, 0.740234f, + 0.377930f, 0.707031f, 0.405518f, 0.678223f, 0.433105f, 0.649414f, 0.458252f, 0.622559f, + 0.483154f, 0.596680f, 0.504395f, 0.572266f, 0.524414f, 0.549805f, 0.543945f, 0.527344f, + 0.562988f, 0.506348f, 0.580078f, 0.486572f, 0.596680f, 0.467285f, 0.611816f, 0.448975f, + 0.627441f, 0.431396f, 0.641113f, 0.414795f, 0.655762f, 0.398438f, 0.667969f, 0.383301f, + 0.680664f, 0.367920f, 0.693359f, 0.353760f, 0.702637f, 0.340576f, 0.714355f, 0.326904f, + 0.724121f, 0.314209f, 0.735352f, 0.301270f, 0.745605f, 0.289307f, 0.754395f, 0.277832f, + 0.763184f, 0.266602f, 0.770996f, 0.255859f, 0.782227f, 0.244873f, 0.789551f, 0.234863f, + 0.796387f, 0.225464f, 0.805176f, 0.215454f, 0.813477f, 0.206055f, 0.819336f, 0.197021f, + 0.825684f, 0.188354f, 0.833496f, 0.179932f, 0.838867f, 0.172241f, 0.846680f, 0.163696f, + 0.853027f, 0.155518f, 0.857422f, 0.148438f, 0.865723f, 0.139893f, 0.869629f, 0.133545f, + 0.875488f, 0.125977f, 0.881348f, 0.119385f, 0.885742f, 0.113098f, 0.892578f, 0.105774f, + 0.895020f, 0.100403f, 0.900879f, 0.093567f, 0.904785f, 0.088013f, 0.909668f, 0.081787f, + 0.913574f, 0.076172f, 0.917969f, 0.069458f, 0.921875f, 0.062408f, 0.924805f, 0.055573f, + 0.929199f, 0.048553f, 0.931152f, 0.038879f, 0.933105f, 0.028000f, 0.931152f, 0.010727f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.131348f, 0.926758f, 0.184448f, 0.886230f, + 0.232788f, 0.845215f, 0.277100f, 0.806641f, 0.314941f, 0.770020f, 0.351562f, 0.735840f, + 0.382568f, 0.703613f, 0.413818f, 0.672852f, 0.441650f, 0.643555f, 0.466553f, 0.616211f, + 0.490723f, 0.589844f, 0.514648f, 0.564941f, 0.534668f, 0.541016f, 0.553711f, 0.519531f, + 0.572754f, 0.498291f, 0.591797f, 0.477539f, 0.607422f, 0.458008f, 0.624023f, 0.439453f, + 0.639648f, 0.421387f, 0.653320f, 0.404785f, 0.666992f, 0.388184f, 0.681152f, 0.372070f, + 0.693359f, 0.356934f, 0.705566f, 0.342529f, 0.716309f, 0.328857f, 0.728027f, 0.315186f, + 0.735840f, 0.302979f, 0.747559f, 0.289795f, 0.758301f, 0.277588f, 0.768555f, 0.265869f, + 0.776367f, 0.254639f, 0.785156f, 0.243896f, 0.794434f, 0.233398f, 0.801758f, 0.223267f, + 0.810059f, 0.213135f, 0.816895f, 0.203735f, 0.824707f, 0.194946f, 0.832031f, 0.185547f, + 0.839844f, 0.176758f, 0.846191f, 0.168213f, 0.852051f, 0.160522f, 0.858887f, 0.152344f, + 0.863281f, 0.145508f, 0.871582f, 0.136841f, 0.876953f, 0.129761f, 0.883301f, 0.122131f, + 0.888184f, 0.115479f, 0.893555f, 0.108765f, 0.897949f, 0.102417f, 0.903809f, 0.095947f, + 0.907715f, 0.089905f, 0.912109f, 0.084167f, 0.917480f, 0.078003f, 0.921875f, 0.072632f, + 0.925781f, 0.066895f, 0.930664f, 0.061249f, 0.934570f, 0.055664f, 0.937500f, 0.048309f, + 0.940430f, 0.041870f, 0.943359f, 0.034607f, 0.945312f, 0.024429f, 0.944824f, 0.008392f, + 0.000000f, 1.000000f, 0.068909f, 0.969238f, 0.131470f, 0.927246f, 0.186523f, 0.884766f, + 0.235718f, 0.843262f, 0.278564f, 0.804688f, 0.318604f, 0.767578f, 0.355469f, 0.732422f, + 0.389648f, 0.698730f, 0.419922f, 0.667480f, 0.448975f, 0.637695f, 0.474854f, 0.609375f, + 0.500488f, 0.583008f, 0.521484f, 0.558105f, 0.545410f, 0.533691f, 0.565430f, 0.510742f, + 0.583984f, 0.489014f, 0.601562f, 0.468506f, 0.618652f, 0.448730f, 0.634766f, 0.429932f, + 0.650391f, 0.411377f, 0.665527f, 0.393799f, 0.679688f, 0.377197f, 0.693848f, 0.361328f, + 0.706055f, 0.346191f, 0.716797f, 0.332031f, 0.729004f, 0.317383f, 0.739746f, 0.304199f, + 0.750000f, 0.291260f, 0.761230f, 0.278076f, 0.771484f, 0.266113f, 0.779785f, 0.254639f, + 0.789062f, 0.243408f, 0.797852f, 0.232300f, 0.807129f, 0.221680f, 0.812988f, 0.212402f, + 0.823242f, 0.201660f, 0.829590f, 0.192871f, 0.837891f, 0.182861f, 0.845703f, 0.174561f, + 0.851074f, 0.166138f, 0.859375f, 0.157104f, 0.864258f, 0.149170f, 0.871094f, 0.141357f, + 0.875977f, 0.134155f, 0.882324f, 0.126831f, 0.888672f, 0.119995f, 0.895020f, 0.112488f, + 0.900391f, 0.105408f, 0.905762f, 0.098694f, 0.910156f, 0.092529f, 0.914551f, 0.086304f, + 0.919922f, 0.080200f, 0.924316f, 0.074646f, 0.928223f, 0.069153f, 0.932617f, 0.063721f, + 0.937500f, 0.058228f, 0.940918f, 0.052948f, 0.945312f, 0.047882f, 0.949219f, 0.042603f, + 0.951660f, 0.035553f, 0.955078f, 0.028717f, 0.957031f, 0.020462f, 0.957031f, 0.007118f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.133423f, 0.925781f, 0.188354f, 0.883789f, + 0.238892f, 0.841797f, 0.282959f, 0.802246f, 0.323730f, 0.764160f, 0.362305f, 0.728027f, + 0.395264f, 0.694336f, 0.426514f, 0.662598f, 0.455811f, 0.632324f, 0.483398f, 0.603027f, + 0.507812f, 0.576172f, 0.533203f, 0.549805f, 0.553223f, 0.525879f, 0.574707f, 0.502930f, + 0.594727f, 0.480225f, 0.613281f, 0.458984f, 0.629883f, 0.438965f, 0.646484f, 0.419922f, + 0.662109f, 0.401611f, 0.678223f, 0.383545f, 0.692383f, 0.366699f, 0.704102f, 0.351074f, + 0.718262f, 0.335693f, 0.728516f, 0.321045f, 0.741699f, 0.306396f, 0.752441f, 0.292725f, + 0.764160f, 0.279541f, 0.772461f, 0.267578f, 0.782715f, 0.254883f, 0.792969f, 0.243408f, + 0.801270f, 0.232300f, 0.811035f, 0.221069f, 0.818359f, 0.211060f, 0.827637f, 0.200684f, + 0.834961f, 0.190918f, 0.842285f, 0.181763f, 0.850098f, 0.172485f, 0.857422f, 0.163452f, + 0.864746f, 0.154907f, 0.869141f, 0.147217f, 0.876953f, 0.139038f, 0.882812f, 0.131348f, + 0.889160f, 0.123474f, 0.895020f, 0.116455f, 0.899414f, 0.109741f, 0.905273f, 0.103210f, + 0.909668f, 0.097107f, 0.916016f, 0.089844f, 0.921387f, 0.083374f, 0.926758f, 0.077271f, + 0.930176f, 0.071411f, 0.935547f, 0.065491f, 0.938965f, 0.060455f, 0.944336f, 0.054901f, + 0.947754f, 0.049988f, 0.951660f, 0.044952f, 0.955078f, 0.040405f, 0.959473f, 0.035278f, + 0.962402f, 0.030823f, 0.965820f, 0.024307f, 0.968262f, 0.016586f, 0.969238f, 0.006050f, + 0.000000f, 1.000000f, 0.070435f, 0.968262f, 0.133301f, 0.926270f, 0.189941f, 0.882812f, + 0.241577f, 0.840332f, 0.286133f, 0.799805f, 0.327881f, 0.761230f, 0.366699f, 0.724609f, + 0.401855f, 0.689941f, 0.433838f, 0.657227f, 0.464355f, 0.625977f, 0.491211f, 0.597168f, + 0.518066f, 0.568848f, 0.541016f, 0.542969f, 0.564453f, 0.517578f, 0.585938f, 0.493896f, + 0.604492f, 0.471680f, 0.624023f, 0.449951f, 0.641113f, 0.429688f, 0.657715f, 0.410156f, + 0.674316f, 0.391357f, 0.688965f, 0.373779f, 0.703613f, 0.356689f, 0.716797f, 0.340576f, + 0.729980f, 0.324707f, 0.740723f, 0.310303f, 0.753906f, 0.295654f, 0.764160f, 0.282227f, + 0.774902f, 0.268799f, 0.786133f, 0.256104f, 0.794922f, 0.244141f, 0.803711f, 0.232910f, + 0.813477f, 0.221191f, 0.822266f, 0.210571f, 0.830566f, 0.200195f, 0.839355f, 0.189697f, + 0.846191f, 0.180420f, 0.854492f, 0.171021f, 0.862305f, 0.161743f, 0.868164f, 0.153564f, + 0.874023f, 0.145386f, 0.882812f, 0.136475f, 0.889160f, 0.128784f, 0.894043f, 0.121399f, + 0.898926f, 0.114563f, 0.905273f, 0.107117f, 0.910645f, 0.100281f, 0.916504f, 0.093262f, + 0.921387f, 0.087036f, 0.926758f, 0.080872f, 0.930176f, 0.075684f, 0.935547f, 0.069397f, + 0.940430f, 0.063232f, 0.945801f, 0.057404f, 0.949707f, 0.052155f, 0.953613f, 0.047241f, + 0.957031f, 0.042328f, 0.961426f, 0.037659f, 0.965332f, 0.032745f, 0.968750f, 0.028534f, + 0.972168f, 0.023834f, 0.976074f, 0.019577f, 0.978516f, 0.013664f, 0.980469f, 0.005028f, + 0.000000f, 1.000000f, 0.070129f, 0.968262f, 0.134644f, 0.925293f, 0.192261f, 0.881348f, + 0.243896f, 0.838379f, 0.290283f, 0.797363f, 0.333740f, 0.757812f, 0.372070f, 0.720703f, + 0.408936f, 0.685059f, 0.441406f, 0.651855f, 0.472412f, 0.620117f, 0.499756f, 0.590332f, + 0.525879f, 0.562012f, 0.550781f, 0.535156f, 0.573730f, 0.509766f, 0.594727f, 0.485840f, + 0.616211f, 0.462646f, 0.633789f, 0.441162f, 0.651855f, 0.420410f, 0.668945f, 0.400635f, + 0.684570f, 0.381836f, 0.700195f, 0.363770f, 0.714844f, 0.346436f, 0.728516f, 0.330078f, + 0.740234f, 0.314697f, 0.753906f, 0.299316f, 0.765625f, 0.285156f, 0.776367f, 0.271484f, + 0.787598f, 0.258057f, 0.796387f, 0.245850f, 0.806641f, 0.233643f, 0.816406f, 0.222046f, + 0.825684f, 0.210693f, 0.833984f, 0.199829f, 0.841797f, 0.190063f, 0.850098f, 0.179565f, + 0.858398f, 0.170288f, 0.865723f, 0.160889f, 0.873535f, 0.151611f, 0.878906f, 0.143677f, + 0.886719f, 0.135132f, 0.892090f, 0.127319f, 0.898926f, 0.119263f, 0.903809f, 0.112488f, + 0.911621f, 0.104736f, 0.916504f, 0.097778f, 0.922363f, 0.090942f, 0.925781f, 0.085022f, + 0.931641f, 0.078979f, 0.936523f, 0.072266f, 0.940918f, 0.066589f, 0.945801f, 0.060669f, + 0.949219f, 0.055847f, 0.953613f, 0.050964f, 0.958496f, 0.045593f, 0.962891f, 0.040070f, + 0.967285f, 0.034668f, 0.970703f, 0.030228f, 0.974609f, 0.025726f, 0.978516f, 0.021210f, + 0.981445f, 0.017456f, 0.985352f, 0.012962f, 0.988281f, 0.009377f, 0.991211f, 0.003784f, + 0.000000f, 1.000000f, 0.071289f, 0.967773f, 0.134644f, 0.925293f, 0.193848f, 0.880371f, + 0.246460f, 0.836914f, 0.293945f, 0.794922f, 0.338379f, 0.754883f, 0.377686f, 0.716797f, + 0.413574f, 0.681152f, 0.447998f, 0.646973f, 0.478027f, 0.614746f, 0.507324f, 0.583984f, + 0.536133f, 0.554688f, 0.558594f, 0.528320f, 0.583984f, 0.501465f, 0.604492f, 0.477783f, + 0.625977f, 0.454346f, 0.645020f, 0.432129f, 0.663086f, 0.411133f, 0.680176f, 0.391113f, + 0.695801f, 0.372314f, 0.710938f, 0.354248f, 0.724609f, 0.337402f, 0.738281f, 0.320312f, + 0.752930f, 0.303955f, 0.766602f, 0.288818f, 0.775879f, 0.275635f, 0.786621f, 0.261475f, + 0.799805f, 0.247559f, 0.807129f, 0.236450f, 0.817871f, 0.223389f, 0.829102f, 0.211426f, + 0.835449f, 0.201050f, 0.846191f, 0.189575f, 0.852051f, 0.180176f, 0.861816f, 0.169678f, + 0.868164f, 0.160645f, 0.876465f, 0.151367f, 0.882812f, 0.142578f, 0.889160f, 0.134155f, + 0.896484f, 0.125977f, 0.904785f, 0.117371f, 0.907715f, 0.111206f, 0.914551f, 0.103333f, + 0.920898f, 0.095520f, 0.924805f, 0.090332f, 0.931641f, 0.082886f, 0.936523f, 0.075745f, + 0.937988f, 0.072388f, 0.946289f, 0.064758f, 0.952637f, 0.057343f, 0.952637f, 0.054260f, + 0.958496f, 0.049530f, 0.968262f, 0.040955f, 0.968262f, 0.036835f, 0.968262f, 0.034943f, + 0.974609f, 0.030457f, 0.983887f, 0.021042f, 0.983887f, 0.018127f, 0.983887f, 0.016891f, + 0.983887f, 0.016220f, 0.999512f, 0.003506f, 0.999512f, 0.000325f, 0.999512f, 0.000003f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995605f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.992188f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.987305f, 0.000000f, 0.985352f, + 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f, 0.000000f, 0.976562f, + 0.000000f, 0.975098f, 0.000000f, 0.971680f, 0.000000f, 0.969727f, 0.000000f, 0.965820f, + 0.000000f, 0.963379f, 0.000000f, 0.959473f, 0.000000f, 0.957031f, 0.000000f, 0.952637f, + 0.000000f, 0.949219f, 0.000000f, 0.945312f, 0.000000f, 0.939941f, 0.000000f, 0.936035f, + 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.920410f, 0.000000f, 0.915527f, + 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.895020f, 0.000000f, 0.887695f, + 0.000000f, 0.879883f, 0.000000f, 0.871582f, 0.000000f, 0.862305f, 0.000000f, 0.852539f, + 0.000000f, 0.842285f, 0.000000f, 0.831543f, 0.000000f, 0.819824f, 0.000000f, 0.806152f, + 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.761230f, 0.000000f, 0.742676f, + 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000000f, 0.650391f, + 0.000000f, 0.620117f, 0.000000f, 0.585449f, 0.000000f, 0.544922f, 0.000000f, 0.498535f, + 0.000000f, 0.441650f, 0.000000f, 0.368652f, 0.000000f, 0.267822f, 0.000000f, 0.102722f, + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.994629f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.990723f, 0.000000f, 0.988281f, 0.000000f, 0.986816f, 0.000000f, 0.985352f, + 0.000000f, 0.983398f, 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.977051f, + 0.000000f, 0.974121f, 0.000000f, 0.972168f, 0.000000f, 0.969238f, 0.000000f, 0.966797f, + 0.000000f, 0.962891f, 0.000000f, 0.959961f, 0.000000f, 0.956543f, 0.000000f, 0.952637f, + 0.000000f, 0.949219f, 0.000000f, 0.944824f, 0.000000f, 0.940430f, 0.000000f, 0.935547f, + 0.000000f, 0.931152f, 0.000000f, 0.925781f, 0.000000f, 0.919922f, 0.000000f, 0.915039f, + 0.000000f, 0.908691f, 0.000000f, 0.901855f, 0.000000f, 0.894531f, 0.000000f, 0.887207f, + 0.000000f, 0.879395f, 0.000000f, 0.871094f, 0.000000f, 0.861816f, 0.000000f, 0.852051f, + 0.000000f, 0.841797f, 0.000000f, 0.831055f, 0.000000f, 0.819336f, 0.000000f, 0.806152f, + 0.000000f, 0.792480f, 0.000000f, 0.776855f, 0.000000f, 0.760742f, 0.000000f, 0.742676f, + 0.000000f, 0.723145f, 0.000000f, 0.701172f, 0.000000f, 0.676758f, 0.000002f, 0.649902f, + 0.000005f, 0.620117f, 0.000005f, 0.584961f, 0.000005f, 0.544922f, 0.000004f, 0.498535f, + 0.000003f, 0.441406f, 0.000003f, 0.367920f, 0.000002f, 0.267578f, 0.000001f, 0.103210f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998535f, 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.996094f, + 0.000000f, 0.995117f, 0.000000f, 0.993652f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.989746f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984863f, + 0.000000f, 0.983398f, 0.000000f, 0.980957f, 0.000000f, 0.979004f, 0.000000f, 0.976074f, + 0.000000f, 0.973633f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, 0.000000f, 0.965820f, + 0.000000f, 0.962891f, 0.000000f, 0.959473f, 0.000000f, 0.955566f, 0.000000f, 0.952148f, + 0.000000f, 0.948242f, 0.000000f, 0.944336f, 0.000000f, 0.940430f, 0.000000f, 0.935059f, + 0.000000f, 0.930176f, 0.000000f, 0.925293f, 0.000000f, 0.919922f, 0.000001f, 0.914062f, + 0.000005f, 0.907715f, 0.000012f, 0.901367f, 0.000019f, 0.894043f, 0.000027f, 0.886719f, + 0.000035f, 0.878906f, 0.000045f, 0.870605f, 0.000054f, 0.861328f, 0.000062f, 0.851562f, + 0.000064f, 0.841309f, 0.000064f, 0.830078f, 0.000064f, 0.818848f, 0.000061f, 0.806152f, + 0.000058f, 0.791504f, 0.000055f, 0.776855f, 0.000050f, 0.759766f, 0.000046f, 0.742188f, + 0.000042f, 0.722656f, 0.000042f, 0.700684f, 0.000046f, 0.676270f, 0.000042f, 0.649414f, + 0.000038f, 0.620117f, 0.000037f, 0.584473f, 0.000032f, 0.544434f, 0.000030f, 0.498047f, + 0.000026f, 0.441162f, 0.000022f, 0.368164f, 0.000019f, 0.267334f, 0.000010f, 0.102539f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.999023f, + 0.000000f, 0.998047f, 0.000000f, 0.997559f, 0.000000f, 0.996582f, 0.000000f, 0.996094f, + 0.000000f, 0.994629f, 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.991211f, + 0.000000f, 0.989258f, 0.000000f, 0.987793f, 0.000000f, 0.986328f, 0.000000f, 0.984375f, + 0.000003f, 0.982422f, 0.000012f, 0.980469f, 0.000022f, 0.978516f, 0.000036f, 0.975586f, + 0.000050f, 0.973633f, 0.000063f, 0.970703f, 0.000080f, 0.968262f, 0.000094f, 0.964844f, + 0.000107f, 0.961914f, 0.000124f, 0.958496f, 0.000139f, 0.955078f, 0.000153f, 0.951660f, + 0.000166f, 0.947754f, 0.000183f, 0.943359f, 0.000197f, 0.938965f, 0.000211f, 0.934082f, + 0.000222f, 0.929199f, 0.000230f, 0.924316f, 0.000232f, 0.918945f, 0.000230f, 0.912598f, + 0.000224f, 0.906738f, 0.000216f, 0.899902f, 0.000210f, 0.893066f, 0.000202f, 0.885254f, + 0.000191f, 0.877441f, 0.000182f, 0.869141f, 0.000180f, 0.860352f, 0.000180f, 0.850098f, + 0.000182f, 0.839844f, 0.000184f, 0.829102f, 0.000187f, 0.817871f, 0.000189f, 0.804688f, + 0.000175f, 0.790527f, 0.000168f, 0.775391f, 0.000165f, 0.758789f, 0.000168f, 0.740723f, + 0.000168f, 0.721680f, 0.000150f, 0.699707f, 0.000149f, 0.675293f, 0.000142f, 0.648926f, + 0.000145f, 0.618652f, 0.000124f, 0.583984f, 0.000121f, 0.543945f, 0.000115f, 0.497803f, + 0.000098f, 0.440186f, 0.000092f, 0.367920f, 0.000071f, 0.267090f, 0.000031f, 0.102356f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000001f, 0.998047f, 0.000025f, 0.997559f, 0.000063f, 0.996094f, 0.000091f, 0.995117f, + 0.000127f, 0.994141f, 0.000159f, 0.992676f, 0.000184f, 0.991699f, 0.000213f, 0.990234f, + 0.000244f, 0.988770f, 0.000268f, 0.986816f, 0.000287f, 0.985352f, 0.000311f, 0.983887f, + 0.000338f, 0.981934f, 0.000360f, 0.979492f, 0.000377f, 0.977539f, 0.000392f, 0.975098f, + 0.000415f, 0.972168f, 0.000437f, 0.969727f, 0.000454f, 0.967285f, 0.000469f, 0.963867f, + 0.000481f, 0.960938f, 0.000495f, 0.957520f, 0.000501f, 0.954102f, 0.000497f, 0.950195f, + 0.000487f, 0.946777f, 0.000476f, 0.941895f, 0.000469f, 0.937500f, 0.000468f, 0.933105f, + 0.000470f, 0.927734f, 0.000473f, 0.922852f, 0.000474f, 0.917480f, 0.000476f, 0.911133f, + 0.000478f, 0.905273f, 0.000470f, 0.898438f, 0.000479f, 0.891602f, 0.000485f, 0.883789f, + 0.000486f, 0.876465f, 0.000486f, 0.867676f, 0.000487f, 0.858398f, 0.000466f, 0.849121f, + 0.000467f, 0.838379f, 0.000468f, 0.827637f, 0.000468f, 0.816406f, 0.000463f, 0.803223f, + 0.000435f, 0.788574f, 0.000437f, 0.773926f, 0.000432f, 0.757324f, 0.000427f, 0.739746f, + 0.000419f, 0.720215f, 0.000387f, 0.698242f, 0.000385f, 0.674316f, 0.000373f, 0.647461f, + 0.000362f, 0.617676f, 0.000329f, 0.583008f, 0.000320f, 0.542969f, 0.000300f, 0.497559f, + 0.000266f, 0.440186f, 0.000244f, 0.367920f, 0.000195f, 0.267334f, 0.000071f, 0.102478f, + 0.000000f, 1.000000f, 0.000163f, 0.999512f, 0.000284f, 0.999023f, 0.000322f, 0.998535f, + 0.000390f, 0.997559f, 0.000446f, 0.996582f, 0.000468f, 0.996094f, 0.000480f, 0.995117f, + 0.000559f, 0.993164f, 0.000587f, 0.992676f, 0.000602f, 0.991211f, 0.000611f, 0.989746f, + 0.000666f, 0.988281f, 0.000695f, 0.986328f, 0.000711f, 0.984863f, 0.000721f, 0.982910f, + 0.000727f, 0.980957f, 0.000771f, 0.978516f, 0.000804f, 0.976074f, 0.000835f, 0.973633f, + 0.000859f, 0.971680f, 0.000866f, 0.968750f, 0.000858f, 0.965820f, 0.000897f, 0.962402f, + 0.000907f, 0.959473f, 0.000910f, 0.956055f, 0.000895f, 0.952148f, 0.000893f, 0.949219f, + 0.000887f, 0.944824f, 0.000919f, 0.940918f, 0.000936f, 0.935547f, 0.000953f, 0.931641f, + 0.000932f, 0.926270f, 0.000944f, 0.920898f, 0.000958f, 0.916016f, 0.000992f, 0.909668f, + 0.001000f, 0.903320f, 0.000954f, 0.896484f, 0.000952f, 0.889648f, 0.000958f, 0.882324f, + 0.000962f, 0.874023f, 0.000989f, 0.865723f, 0.000987f, 0.856934f, 0.000939f, 0.846680f, + 0.000939f, 0.836426f, 0.000934f, 0.825684f, 0.000918f, 0.813965f, 0.000944f, 0.800781f, + 0.000895f, 0.786621f, 0.000877f, 0.771973f, 0.000869f, 0.755371f, 0.000849f, 0.738281f, + 0.000871f, 0.718750f, 0.000816f, 0.696289f, 0.000781f, 0.672852f, 0.000767f, 0.646484f, + 0.000762f, 0.616699f, 0.000692f, 0.581543f, 0.000667f, 0.541992f, 0.000639f, 0.496582f, + 0.000575f, 0.439209f, 0.000523f, 0.367188f, 0.000407f, 0.267578f, 0.000128f, 0.101868f, + 0.000000f, 1.000000f, 0.000358f, 0.999512f, 0.000612f, 0.998535f, 0.000588f, 0.998535f, + 0.000780f, 0.997070f, 0.000782f, 0.996582f, 0.000771f, 0.995605f, 0.000897f, 0.994629f, + 0.000930f, 0.993164f, 0.000935f, 0.991211f, 0.000952f, 0.990723f, 0.000975f, 0.988770f, + 0.001143f, 0.987305f, 0.001187f, 0.985352f, 0.001217f, 0.983398f, 0.001245f, 0.981934f, + 0.001275f, 0.979980f, 0.001399f, 0.977051f, 0.001397f, 0.974609f, 0.001397f, 0.972168f, + 0.001394f, 0.969727f, 0.001391f, 0.967773f, 0.001451f, 0.963867f, 0.001482f, 0.960938f, + 0.001512f, 0.958008f, 0.001531f, 0.954102f, 0.001549f, 0.950684f, 0.001515f, 0.946777f, + 0.001597f, 0.943359f, 0.001645f, 0.938477f, 0.001668f, 0.933594f, 0.001675f, 0.929199f, + 0.001617f, 0.924316f, 0.001619f, 0.918945f, 0.001625f, 0.913574f, 0.001703f, 0.907227f, + 0.001728f, 0.900879f, 0.001737f, 0.894043f, 0.001659f, 0.887207f, 0.001665f, 0.879883f, + 0.001655f, 0.872070f, 0.001730f, 0.863281f, 0.001733f, 0.854004f, 0.001653f, 0.843750f, + 0.001659f, 0.833984f, 0.001629f, 0.823242f, 0.001668f, 0.811523f, 0.001670f, 0.798828f, + 0.001593f, 0.784180f, 0.001596f, 0.770020f, 0.001554f, 0.752930f, 0.001526f, 0.735840f, + 0.001560f, 0.716309f, 0.001481f, 0.694824f, 0.001433f, 0.670898f, 0.001390f, 0.644043f, + 0.001403f, 0.614746f, 0.001324f, 0.580566f, 0.001235f, 0.541016f, 0.001184f, 0.496094f, + 0.001082f, 0.438721f, 0.000964f, 0.367188f, 0.000731f, 0.266357f, 0.000206f, 0.101624f, + 0.000000f, 1.000000f, 0.000436f, 0.999512f, 0.000781f, 0.998535f, 0.000744f, 0.997559f, + 0.001057f, 0.996582f, 0.001103f, 0.995605f, 0.001136f, 0.994629f, 0.001171f, 0.994141f, + 0.001474f, 0.992188f, 0.001503f, 0.990723f, 0.001531f, 0.989258f, 0.001568f, 0.987793f, + 0.001811f, 0.985840f, 0.001837f, 0.984375f, 0.001862f, 0.982422f, 0.001885f, 0.980469f, + 0.001904f, 0.978516f, 0.002110f, 0.975586f, 0.002098f, 0.973145f, 0.002125f, 0.970703f, + 0.002155f, 0.967773f, 0.002172f, 0.965332f, 0.002342f, 0.962402f, 0.002340f, 0.958496f, + 0.002382f, 0.955566f, 0.002436f, 0.952148f, 0.002466f, 0.948242f, 0.002483f, 0.944824f, + 0.002539f, 0.940430f, 0.002563f, 0.936035f, 0.002596f, 0.931152f, 0.002623f, 0.926270f, + 0.002653f, 0.921387f, 0.002586f, 0.916504f, 0.002697f, 0.910645f, 0.002726f, 0.904785f, + 0.002726f, 0.897949f, 0.002762f, 0.891113f, 0.002682f, 0.884277f, 0.002682f, 0.876953f, + 0.002764f, 0.869141f, 0.002762f, 0.860352f, 0.002775f, 0.851074f, 0.002785f, 0.841309f, + 0.002693f, 0.831055f, 0.002645f, 0.820312f, 0.002720f, 0.808594f, 0.002716f, 0.794922f, + 0.002718f, 0.781738f, 0.002617f, 0.766602f, 0.002560f, 0.750488f, 0.002514f, 0.733398f, + 0.002567f, 0.713867f, 0.002470f, 0.692383f, 0.002403f, 0.668457f, 0.002317f, 0.642578f, + 0.002331f, 0.612793f, 0.002230f, 0.578613f, 0.002100f, 0.539551f, 0.001986f, 0.495117f, + 0.001828f, 0.437744f, 0.001591f, 0.366455f, 0.001179f, 0.266602f, 0.000311f, 0.100708f, + 0.000000f, 1.000000f, 0.000562f, 0.999023f, 0.001087f, 0.998047f, 0.001167f, 0.997559f, + 0.001545f, 0.996582f, 0.001648f, 0.995117f, 0.001674f, 0.994141f, 0.001679f, 0.993164f, + 0.002090f, 0.991211f, 0.002174f, 0.990234f, 0.002226f, 0.988281f, 0.002283f, 0.986328f, + 0.002634f, 0.984863f, 0.002668f, 0.982422f, 0.002708f, 0.980469f, 0.002739f, 0.979004f, + 0.002733f, 0.976562f, 0.003048f, 0.973633f, 0.003136f, 0.971191f, 0.003130f, 0.968750f, + 0.003168f, 0.965820f, 0.003208f, 0.963379f, 0.003485f, 0.959961f, 0.003578f, 0.956543f, + 0.003546f, 0.952637f, 0.003571f, 0.949707f, 0.003595f, 0.946289f, 0.003649f, 0.942383f, + 0.003769f, 0.937500f, 0.003860f, 0.933105f, 0.003901f, 0.928223f, 0.003929f, 0.923828f, + 0.003929f, 0.918457f, 0.003866f, 0.913086f, 0.004047f, 0.907227f, 0.004105f, 0.900879f, + 0.004093f, 0.895020f, 0.004139f, 0.887695f, 0.004177f, 0.881348f, 0.004047f, 0.873535f, + 0.004208f, 0.865723f, 0.004192f, 0.856445f, 0.004234f, 0.847656f, 0.004219f, 0.837891f, + 0.004108f, 0.827637f, 0.004116f, 0.817383f, 0.004177f, 0.805176f, 0.004166f, 0.791992f, + 0.004154f, 0.777832f, 0.004036f, 0.763184f, 0.003960f, 0.747559f, 0.003979f, 0.729980f, + 0.003979f, 0.710449f, 0.003859f, 0.689453f, 0.003752f, 0.665527f, 0.003664f, 0.640137f, + 0.003653f, 0.610840f, 0.003494f, 0.576660f, 0.003300f, 0.537598f, 0.003094f, 0.493896f, + 0.002893f, 0.437256f, 0.002426f, 0.366211f, 0.001757f, 0.265869f, 0.000430f, 0.100830f, + 0.000000f, 1.000000f, 0.000334f, 0.999512f, 0.001054f, 0.998047f, 0.001493f, 0.997070f, + 0.001719f, 0.995605f, 0.002230f, 0.994141f, 0.002279f, 0.993652f, 0.002474f, 0.991699f, + 0.002930f, 0.990234f, 0.002981f, 0.988770f, 0.003071f, 0.987305f, 0.003239f, 0.985352f, + 0.003639f, 0.982910f, 0.003712f, 0.980957f, 0.003738f, 0.978516f, 0.003807f, 0.977051f, + 0.003975f, 0.975098f, 0.004288f, 0.971680f, 0.004372f, 0.968750f, 0.004478f, 0.966309f, + 0.004475f, 0.963867f, 0.004536f, 0.960938f, 0.004906f, 0.957031f, 0.004997f, 0.953613f, + 0.004993f, 0.950195f, 0.005058f, 0.946289f, 0.005131f, 0.942871f, 0.005177f, 0.939453f, + 0.005489f, 0.934570f, 0.005463f, 0.929688f, 0.005554f, 0.924805f, 0.005608f, 0.919922f, + 0.005676f, 0.915527f, 0.005661f, 0.909668f, 0.005836f, 0.903809f, 0.005894f, 0.896973f, + 0.005974f, 0.890625f, 0.005943f, 0.884277f, 0.005997f, 0.876953f, 0.005852f, 0.869629f, + 0.006119f, 0.861328f, 0.006168f, 0.852539f, 0.006149f, 0.843750f, 0.006111f, 0.833984f, + 0.006023f, 0.823730f, 0.006008f, 0.813477f, 0.006111f, 0.800781f, 0.006161f, 0.787598f, + 0.006119f, 0.774414f, 0.005974f, 0.759766f, 0.005947f, 0.744629f, 0.005978f, 0.726562f, + 0.005928f, 0.707031f, 0.005718f, 0.686035f, 0.005585f, 0.663086f, 0.005436f, 0.637695f, + 0.005413f, 0.607910f, 0.005184f, 0.574707f, 0.004887f, 0.536133f, 0.004562f, 0.492432f, + 0.004215f, 0.435303f, 0.003492f, 0.365723f, 0.002497f, 0.265625f, 0.000574f, 0.100403f, + 0.000000f, 1.000000f, 0.000472f, 0.999023f, 0.001438f, 0.997559f, 0.002029f, 0.996582f, + 0.002350f, 0.994629f, 0.002920f, 0.993652f, 0.003023f, 0.992676f, 0.003340f, 0.990723f, + 0.003897f, 0.988770f, 0.004021f, 0.987305f, 0.004108f, 0.985840f, 0.004410f, 0.983887f, + 0.004959f, 0.981445f, 0.005058f, 0.979004f, 0.005089f, 0.976562f, 0.005119f, 0.974609f, + 0.005417f, 0.972168f, 0.005920f, 0.969727f, 0.005951f, 0.966309f, 0.006046f, 0.963379f, + 0.006165f, 0.960938f, 0.006268f, 0.958008f, 0.006714f, 0.954102f, 0.006840f, 0.950195f, + 0.006977f, 0.947266f, 0.006966f, 0.943359f, 0.006981f, 0.939453f, 0.007202f, 0.935547f, + 0.007645f, 0.930664f, 0.007660f, 0.926270f, 0.007641f, 0.920898f, 0.007767f, 0.916504f, + 0.007809f, 0.911133f, 0.007881f, 0.906250f, 0.008125f, 0.899414f, 0.008232f, 0.893066f, + 0.008293f, 0.886230f, 0.008392f, 0.879883f, 0.008324f, 0.873047f, 0.008263f, 0.865723f, + 0.008553f, 0.856445f, 0.008675f, 0.848145f, 0.008606f, 0.838867f, 0.008652f, 0.829590f, + 0.008492f, 0.819336f, 0.008453f, 0.809082f, 0.008789f, 0.796387f, 0.008720f, 0.783203f, + 0.008652f, 0.770508f, 0.008461f, 0.755859f, 0.008423f, 0.740234f, 0.008492f, 0.722168f, + 0.008423f, 0.703125f, 0.008331f, 0.682617f, 0.008049f, 0.659668f, 0.007721f, 0.635254f, + 0.007732f, 0.605469f, 0.007339f, 0.572266f, 0.006920f, 0.534668f, 0.006493f, 0.490723f, + 0.005875f, 0.434326f, 0.004822f, 0.365234f, 0.003347f, 0.265625f, 0.000737f, 0.099487f, + 0.000000f, 1.000000f, 0.000788f, 0.999023f, 0.001456f, 0.997559f, 0.002056f, 0.996094f, + 0.003193f, 0.994141f, 0.003294f, 0.993164f, 0.003887f, 0.991699f, 0.004456f, 0.989258f, + 0.004616f, 0.987305f, 0.005211f, 0.985840f, 0.005360f, 0.984375f, 0.005871f, 0.981445f, + 0.006081f, 0.979492f, 0.006680f, 0.977051f, 0.006763f, 0.975098f, 0.006824f, 0.972168f, + 0.007336f, 0.969238f, 0.007793f, 0.966309f, 0.007996f, 0.963867f, 0.008034f, 0.960938f, + 0.008163f, 0.958008f, 0.008591f, 0.954590f, 0.008636f, 0.950684f, 0.009171f, 0.947266f, + 0.009262f, 0.943359f, 0.009415f, 0.939453f, 0.009445f, 0.936035f, 0.009689f, 0.931152f, + 0.010193f, 0.926270f, 0.010422f, 0.921875f, 0.010239f, 0.916504f, 0.010422f, 0.911621f, + 0.010582f, 0.907227f, 0.010811f, 0.900879f, 0.011162f, 0.895020f, 0.011177f, 0.888184f, + 0.011299f, 0.881836f, 0.011360f, 0.875000f, 0.011337f, 0.868164f, 0.011528f, 0.860840f, + 0.011803f, 0.852051f, 0.011810f, 0.842773f, 0.011841f, 0.833984f, 0.011818f, 0.824707f, + 0.011780f, 0.814941f, 0.011787f, 0.804199f, 0.012024f, 0.791016f, 0.011925f, 0.778320f, + 0.011841f, 0.765137f, 0.011696f, 0.750488f, 0.011627f, 0.736328f, 0.011749f, 0.718262f, + 0.011559f, 0.698730f, 0.011452f, 0.678711f, 0.011124f, 0.656250f, 0.010750f, 0.632324f, + 0.010605f, 0.602051f, 0.010086f, 0.569336f, 0.009506f, 0.532715f, 0.008842f, 0.488770f, + 0.007866f, 0.433105f, 0.006378f, 0.364014f, 0.004341f, 0.264893f, 0.000914f, 0.099304f, + 0.000000f, 1.000000f, 0.001091f, 0.999023f, 0.002075f, 0.997559f, 0.002211f, 0.996582f, + 0.003613f, 0.994141f, 0.004295f, 0.992188f, 0.004448f, 0.990723f, 0.005737f, 0.987793f, + 0.005981f, 0.985840f, 0.006618f, 0.983887f, 0.006832f, 0.982422f, 0.007587f, 0.979492f, + 0.007866f, 0.977051f, 0.008545f, 0.974609f, 0.008766f, 0.972656f, 0.009003f, 0.969727f, + 0.009537f, 0.966309f, 0.009811f, 0.963379f, 0.010338f, 0.959961f, 0.010597f, 0.957520f, + 0.010696f, 0.954590f, 0.011238f, 0.950195f, 0.011566f, 0.946777f, 0.011963f, 0.942871f, + 0.012199f, 0.938965f, 0.012314f, 0.935547f, 0.012581f, 0.932129f, 0.013023f, 0.926758f, + 0.013382f, 0.921387f, 0.013657f, 0.916992f, 0.013939f, 0.912109f, 0.013710f, 0.906738f, + 0.013931f, 0.901855f, 0.014526f, 0.895996f, 0.014885f, 0.889160f, 0.015030f, 0.882812f, + 0.014931f, 0.876465f, 0.015053f, 0.870117f, 0.015160f, 0.862793f, 0.015488f, 0.854492f, + 0.015686f, 0.846191f, 0.015747f, 0.837402f, 0.015915f, 0.828613f, 0.015762f, 0.818848f, + 0.015778f, 0.809082f, 0.015854f, 0.797852f, 0.016068f, 0.785645f, 0.016037f, 0.772949f, + 0.016052f, 0.760254f, 0.015930f, 0.746582f, 0.015656f, 0.731445f, 0.015717f, 0.712891f, + 0.015579f, 0.694336f, 0.015274f, 0.674316f, 0.014870f, 0.652832f, 0.014488f, 0.627930f, + 0.014114f, 0.598145f, 0.013412f, 0.566406f, 0.012589f, 0.530273f, 0.011642f, 0.486328f, + 0.010262f, 0.431396f, 0.008263f, 0.364258f, 0.005493f, 0.263916f, 0.001109f, 0.098450f, + 0.000000f, 1.000000f, 0.000887f, 0.999023f, 0.002274f, 0.997070f, 0.002935f, 0.995605f, + 0.004227f, 0.993164f, 0.005424f, 0.991211f, 0.005623f, 0.989746f, 0.006866f, 0.986816f, + 0.007545f, 0.984375f, 0.007835f, 0.982422f, 0.008629f, 0.979980f, 0.009605f, 0.976562f, + 0.009987f, 0.974121f, 0.010300f, 0.972168f, 0.011017f, 0.969727f, 0.011658f, 0.966309f, + 0.012405f, 0.963379f, 0.012512f, 0.959961f, 0.013245f, 0.957031f, 0.013420f, 0.953613f, + 0.014008f, 0.950195f, 0.014595f, 0.946289f, 0.014938f, 0.942383f, 0.015572f, 0.938477f, + 0.015671f, 0.934570f, 0.016022f, 0.931152f, 0.016342f, 0.926270f, 0.017090f, 0.921387f, + 0.017593f, 0.916504f, 0.017731f, 0.911133f, 0.018051f, 0.906738f, 0.018311f, 0.902344f, + 0.018265f, 0.895996f, 0.018906f, 0.889648f, 0.019638f, 0.883789f, 0.019684f, 0.876953f, + 0.019699f, 0.870605f, 0.019760f, 0.863770f, 0.019989f, 0.857422f, 0.020355f, 0.848633f, + 0.020813f, 0.839844f, 0.020859f, 0.831055f, 0.020889f, 0.822754f, 0.021042f, 0.813965f, + 0.020935f, 0.803711f, 0.020981f, 0.791992f, 0.021332f, 0.779785f, 0.021301f, 0.767578f, + 0.021164f, 0.754883f, 0.020874f, 0.741211f, 0.020737f, 0.725098f, 0.020935f, 0.708008f, + 0.020584f, 0.689453f, 0.020172f, 0.669922f, 0.019409f, 0.648438f, 0.019043f, 0.623535f, + 0.018585f, 0.594727f, 0.017471f, 0.563477f, 0.016266f, 0.527832f, 0.015045f, 0.483643f, + 0.013084f, 0.430176f, 0.010391f, 0.363281f, 0.006832f, 0.263428f, 0.001331f, 0.098022f, + 0.000000f, 1.000000f, 0.001259f, 0.998535f, 0.003033f, 0.996582f, 0.003775f, 0.995117f, + 0.004944f, 0.992188f, 0.006237f, 0.990234f, 0.007256f, 0.987793f, 0.008118f, 0.984863f, + 0.009392f, 0.981934f, 0.009758f, 0.980469f, 0.010361f, 0.977539f, 0.011642f, 0.974121f, + 0.012421f, 0.971680f, 0.012856f, 0.968750f, 0.013634f, 0.966309f, 0.014641f, 0.962402f, + 0.015503f, 0.958984f, 0.015991f, 0.956055f, 0.016663f, 0.953125f, 0.016922f, 0.949707f, + 0.017654f, 0.945312f, 0.018555f, 0.940918f, 0.018921f, 0.937500f, 0.019653f, 0.933594f, + 0.020020f, 0.929688f, 0.020142f, 0.925781f, 0.021118f, 0.920410f, 0.021744f, 0.915527f, + 0.022202f, 0.910645f, 0.022766f, 0.905762f, 0.023041f, 0.901367f, 0.023315f, 0.895996f, + 0.023865f, 0.889648f, 0.024246f, 0.882812f, 0.025085f, 0.876953f, 0.025406f, 0.870605f, + 0.025391f, 0.864258f, 0.025574f, 0.857910f, 0.026077f, 0.850098f, 0.026520f, 0.841797f, + 0.027039f, 0.833496f, 0.026947f, 0.824707f, 0.027023f, 0.815918f, 0.027145f, 0.807129f, + 0.027176f, 0.796387f, 0.027832f, 0.785645f, 0.027771f, 0.773438f, 0.027725f, 0.761230f, + 0.027512f, 0.748535f, 0.027176f, 0.735840f, 0.027298f, 0.719238f, 0.027191f, 0.702148f, + 0.026810f, 0.684570f, 0.026154f, 0.665039f, 0.025360f, 0.644531f, 0.024689f, 0.619141f, + 0.023865f, 0.590820f, 0.022659f, 0.560547f, 0.020828f, 0.525391f, 0.019165f, 0.481445f, + 0.016571f, 0.427979f, 0.012985f, 0.362305f, 0.008476f, 0.262939f, 0.001597f, 0.097290f, + 0.000000f, 1.000000f, 0.001215f, 0.998535f, 0.002966f, 0.996582f, 0.004471f, 0.994141f, + 0.006348f, 0.991211f, 0.006783f, 0.989258f, 0.008652f, 0.986328f, 0.010139f, 0.982910f, + 0.010628f, 0.980957f, 0.011955f, 0.978027f, 0.012970f, 0.974121f, 0.013916f, 0.971191f, + 0.015312f, 0.967773f, 0.015778f, 0.965332f, 0.016647f, 0.962402f, 0.018127f, 0.958008f, + 0.019104f, 0.954590f, 0.019699f, 0.951660f, 0.020248f, 0.948730f, 0.021149f, 0.944824f, + 0.022171f, 0.939941f, 0.022995f, 0.935547f, 0.023636f, 0.932129f, 0.024063f, 0.928223f, + 0.025055f, 0.924316f, 0.025681f, 0.919434f, 0.026321f, 0.914062f, 0.027374f, 0.909180f, + 0.027756f, 0.904297f, 0.028427f, 0.899414f, 0.028946f, 0.894531f, 0.029587f, 0.888672f, + 0.030380f, 0.882324f, 0.030975f, 0.876465f, 0.031433f, 0.869629f, 0.032043f, 0.863770f, + 0.032440f, 0.857910f, 0.032379f, 0.850586f, 0.033142f, 0.842285f, 0.033813f, 0.833984f, + 0.034424f, 0.825684f, 0.034698f, 0.817871f, 0.034424f, 0.809082f, 0.034393f, 0.800293f, + 0.035187f, 0.789062f, 0.035370f, 0.778320f, 0.035187f, 0.766113f, 0.035187f, 0.754395f, + 0.035034f, 0.742676f, 0.034882f, 0.729004f, 0.034790f, 0.712891f, 0.034607f, 0.695801f, + 0.034119f, 0.678711f, 0.033356f, 0.660156f, 0.032043f, 0.640137f, 0.031403f, 0.614258f, + 0.030273f, 0.586914f, 0.028503f, 0.557129f, 0.026123f, 0.522461f, 0.024094f, 0.478516f, + 0.020691f, 0.426514f, 0.016129f, 0.361816f, 0.010269f, 0.261963f, 0.001909f, 0.096802f, + 0.000000f, 1.000000f, 0.001688f, 0.998535f, 0.003967f, 0.996094f, 0.005096f, 0.993652f, + 0.007088f, 0.990723f, 0.008499f, 0.987793f, 0.009575f, 0.984863f, 0.011612f, 0.981445f, + 0.013092f, 0.978516f, 0.014122f, 0.975586f, 0.016022f, 0.971191f, 0.017105f, 0.967773f, + 0.018188f, 0.964844f, 0.019211f, 0.961914f, 0.020569f, 0.957520f, 0.021713f, 0.953613f, + 0.022903f, 0.950195f, 0.024002f, 0.946777f, 0.024643f, 0.943848f, 0.025986f, 0.938965f, + 0.027405f, 0.934570f, 0.028336f, 0.930176f, 0.029129f, 0.926270f, 0.029633f, 0.922363f, + 0.030853f, 0.918457f, 0.031982f, 0.912598f, 0.032776f, 0.907227f, 0.033752f, 0.901855f, + 0.034393f, 0.897461f, 0.035217f, 0.892578f, 0.035645f, 0.887207f, 0.037079f, 0.880859f, + 0.038025f, 0.874512f, 0.038635f, 0.868164f, 0.039124f, 0.862793f, 0.039490f, 0.855957f, + 0.040222f, 0.850098f, 0.040802f, 0.842285f, 0.041626f, 0.833984f, 0.042206f, 0.826172f, + 0.042755f, 0.817871f, 0.042786f, 0.810059f, 0.042999f, 0.801758f, 0.043488f, 0.791992f, + 0.044128f, 0.781250f, 0.044067f, 0.770020f, 0.044434f, 0.759277f, 0.044220f, 0.747559f, + 0.044037f, 0.736328f, 0.043915f, 0.721680f, 0.043518f, 0.705566f, 0.043243f, 0.689453f, + 0.042297f, 0.672363f, 0.041443f, 0.655273f, 0.040222f, 0.634277f, 0.039429f, 0.608887f, + 0.037537f, 0.582520f, 0.035492f, 0.553711f, 0.032471f, 0.520508f, 0.029556f, 0.475342f, + 0.025238f, 0.425049f, 0.019531f, 0.361572f, 0.012436f, 0.261719f, 0.002287f, 0.096252f, + 0.000000f, 1.000000f, 0.002026f, 0.998535f, 0.004211f, 0.995605f, 0.006321f, 0.992676f, + 0.008430f, 0.989258f, 0.009537f, 0.987305f, 0.012123f, 0.982910f, 0.013802f, 0.979004f, + 0.014915f, 0.976074f, 0.017014f, 0.972168f, 0.019089f, 0.967773f, 0.020798f, 0.964355f, + 0.021545f, 0.960938f, 0.023483f, 0.957031f, 0.025116f, 0.952637f, 0.026413f, 0.948730f, + 0.027725f, 0.944824f, 0.028946f, 0.941406f, 0.030060f, 0.937500f, 0.031647f, 0.932617f, + 0.033417f, 0.927734f, 0.034393f, 0.924316f, 0.035156f, 0.919434f, 0.036041f, 0.915527f, + 0.037323f, 0.910156f, 0.039398f, 0.904785f, 0.040192f, 0.899902f, 0.041321f, 0.895020f, + 0.041809f, 0.889648f, 0.042908f, 0.885254f, 0.044250f, 0.878906f, 0.045258f, 0.872070f, + 0.046509f, 0.866211f, 0.047211f, 0.860352f, 0.047852f, 0.854492f, 0.048523f, 0.848145f, + 0.049225f, 0.840820f, 0.050781f, 0.833496f, 0.050842f, 0.824707f, 0.051666f, 0.817383f, + 0.052246f, 0.810059f, 0.052795f, 0.802246f, 0.052704f, 0.793457f, 0.053589f, 0.782715f, + 0.054291f, 0.772461f, 0.054321f, 0.762207f, 0.054626f, 0.751465f, 0.053680f, 0.740234f, + 0.053711f, 0.728516f, 0.053711f, 0.713379f, 0.053680f, 0.698730f, 0.053070f, 0.683105f, + 0.051941f, 0.666504f, 0.050507f, 0.649414f, 0.049438f, 0.627441f, 0.048187f, 0.603516f, + 0.045776f, 0.577637f, 0.042877f, 0.549805f, 0.039459f, 0.516602f, 0.035889f, 0.472656f, + 0.030350f, 0.422607f, 0.023346f, 0.361084f, 0.014725f, 0.261230f, 0.002661f, 0.095459f, + 0.000000f, 1.000000f, 0.002241f, 0.998047f, 0.004997f, 0.995117f, 0.007359f, 0.991699f, + 0.009644f, 0.988281f, 0.011307f, 0.985352f, 0.014214f, 0.980957f, 0.016434f, 0.976562f, + 0.017715f, 0.973633f, 0.019943f, 0.968750f, 0.021881f, 0.964844f, 0.024170f, 0.960449f, + 0.025940f, 0.957031f, 0.027649f, 0.952148f, 0.030365f, 0.947266f, 0.031433f, 0.943359f, + 0.032806f, 0.939453f, 0.034180f, 0.936035f, 0.036652f, 0.930176f, 0.038208f, 0.925781f, + 0.039703f, 0.921387f, 0.041199f, 0.916992f, 0.042603f, 0.912598f, 0.043945f, 0.907227f, + 0.045563f, 0.901855f, 0.047302f, 0.895996f, 0.048462f, 0.891602f, 0.049683f, 0.886719f, + 0.050537f, 0.882324f, 0.051666f, 0.875977f, 0.053680f, 0.869141f, 0.055054f, 0.863281f, + 0.055908f, 0.856934f, 0.056885f, 0.851074f, 0.057587f, 0.845703f, 0.058746f, 0.838867f, + 0.060211f, 0.831055f, 0.061005f, 0.823242f, 0.062225f, 0.816406f, 0.062103f, 0.808105f, + 0.063232f, 0.801270f, 0.063416f, 0.793457f, 0.064331f, 0.783203f, 0.065002f, 0.773438f, + 0.065308f, 0.763184f, 0.065430f, 0.753418f, 0.065491f, 0.743164f, 0.065002f, 0.732910f, + 0.065308f, 0.719238f, 0.065125f, 0.705566f, 0.064575f, 0.691406f, 0.063660f, 0.675781f, + 0.062469f, 0.660156f, 0.060822f, 0.643555f, 0.059601f, 0.621094f, 0.057831f, 0.598145f, + 0.054871f, 0.573242f, 0.051208f, 0.545898f, 0.047241f, 0.511719f, 0.042572f, 0.469727f, + 0.036285f, 0.421387f, 0.027420f, 0.360107f, 0.017288f, 0.260986f, 0.003103f, 0.094543f, + 0.000000f, 1.000000f, 0.002699f, 0.997559f, 0.006077f, 0.994629f, 0.009171f, 0.990234f, + 0.011162f, 0.986816f, 0.013596f, 0.982910f, 0.016663f, 0.978516f, 0.019119f, 0.974121f, + 0.021225f, 0.970215f, 0.024506f, 0.964844f, 0.026108f, 0.960938f, 0.028091f, 0.957031f, + 0.030945f, 0.951660f, 0.033508f, 0.946289f, 0.035614f, 0.941895f, 0.037628f, 0.937500f, + 0.039154f, 0.933105f, 0.041046f, 0.928223f, 0.044006f, 0.922363f, 0.045685f, 0.917480f, + 0.047302f, 0.913574f, 0.048950f, 0.909180f, 0.051056f, 0.904297f, 0.053192f, 0.898438f, + 0.054688f, 0.893066f, 0.056091f, 0.887695f, 0.057556f, 0.882324f, 0.059143f, 0.877930f, + 0.060638f, 0.872070f, 0.062439f, 0.865723f, 0.064087f, 0.858887f, 0.065552f, 0.853516f, + 0.066956f, 0.848145f, 0.067444f, 0.841797f, 0.068420f, 0.835938f, 0.070801f, 0.827637f, + 0.071838f, 0.820312f, 0.072632f, 0.812988f, 0.073853f, 0.806152f, 0.074402f, 0.799805f, + 0.074829f, 0.791992f, 0.076172f, 0.782715f, 0.076843f, 0.772949f, 0.076965f, 0.763184f, + 0.077759f, 0.754395f, 0.077820f, 0.744629f, 0.077698f, 0.734863f, 0.077454f, 0.723145f, + 0.077576f, 0.709961f, 0.077209f, 0.696777f, 0.076416f, 0.683105f, 0.075439f, 0.668945f, + 0.073669f, 0.654297f, 0.072144f, 0.635254f, 0.070801f, 0.614258f, 0.067993f, 0.592285f, + 0.064514f, 0.568359f, 0.060272f, 0.542480f, 0.055481f, 0.506836f, 0.049927f, 0.466309f, + 0.042175f, 0.419678f, 0.032379f, 0.357422f, 0.019928f, 0.260498f, 0.003540f, 0.093628f, + 0.000000f, 1.000000f, 0.003256f, 0.997559f, 0.006847f, 0.994141f, 0.010422f, 0.989258f, + 0.013496f, 0.985352f, 0.016830f, 0.980469f, 0.019699f, 0.975586f, 0.022263f, 0.971680f, + 0.025574f, 0.966309f, 0.028839f, 0.960449f, 0.031555f, 0.956055f, 0.033203f, 0.952148f, + 0.036865f, 0.945801f, 0.039795f, 0.939941f, 0.042084f, 0.935547f, 0.044250f, 0.931152f, + 0.046997f, 0.925293f, 0.049561f, 0.919434f, 0.051514f, 0.914551f, 0.054230f, 0.909668f, + 0.055603f, 0.905273f, 0.057739f, 0.900391f, 0.060455f, 0.894043f, 0.063110f, 0.888184f, + 0.064941f, 0.883301f, 0.066467f, 0.878418f, 0.067993f, 0.873047f, 0.070129f, 0.866699f, + 0.072388f, 0.860352f, 0.073975f, 0.854492f, 0.075989f, 0.849121f, 0.077209f, 0.842773f, + 0.078308f, 0.837402f, 0.080078f, 0.831543f, 0.081604f, 0.823730f, 0.083374f, 0.816406f, + 0.084717f, 0.809570f, 0.085938f, 0.802734f, 0.086609f, 0.795898f, 0.087463f, 0.789551f, + 0.088318f, 0.780273f, 0.089722f, 0.770996f, 0.090332f, 0.762207f, 0.090820f, 0.753906f, + 0.091003f, 0.744141f, 0.091064f, 0.735840f, 0.090942f, 0.726074f, 0.091064f, 0.712891f, + 0.091064f, 0.700684f, 0.090698f, 0.687988f, 0.089600f, 0.675781f, 0.087585f, 0.661133f, + 0.086060f, 0.646973f, 0.084717f, 0.627441f, 0.082092f, 0.607422f, 0.078857f, 0.585938f, + 0.074951f, 0.563965f, 0.069641f, 0.538574f, 0.064758f, 0.502441f, 0.057800f, 0.463135f, + 0.048431f, 0.417725f, 0.037231f, 0.354248f, 0.022766f, 0.260010f, 0.004044f, 0.092957f, + 0.000000f, 1.000000f, 0.004089f, 0.997070f, 0.007858f, 0.993164f, 0.012085f, 0.988281f, + 0.015350f, 0.984375f, 0.019882f, 0.977539f, 0.023315f, 0.973145f, 0.026230f, 0.968262f, + 0.030502f, 0.961426f, 0.034058f, 0.956055f, 0.036469f, 0.951660f, 0.040192f, 0.945312f, + 0.043549f, 0.939453f, 0.046143f, 0.934082f, 0.049530f, 0.928711f, 0.052307f, 0.923340f, + 0.055603f, 0.916992f, 0.058990f, 0.910645f, 0.061035f, 0.905762f, 0.063416f, 0.900879f, + 0.065857f, 0.895508f, 0.068848f, 0.888672f, 0.071289f, 0.883301f, 0.074219f, 0.877930f, + 0.076172f, 0.872559f, 0.077698f, 0.868164f, 0.080444f, 0.862305f, 0.082703f, 0.854980f, + 0.084900f, 0.848633f, 0.086853f, 0.843262f, 0.088440f, 0.837891f, 0.090454f, 0.832520f, + 0.091736f, 0.825684f, 0.094299f, 0.818359f, 0.096008f, 0.811523f, 0.097412f, 0.804688f, + 0.099121f, 0.797852f, 0.099670f, 0.791504f, 0.100525f, 0.785156f, 0.102234f, 0.776855f, + 0.103638f, 0.768066f, 0.104187f, 0.758789f, 0.105408f, 0.751465f, 0.105469f, 0.743164f, + 0.105408f, 0.734863f, 0.105164f, 0.726074f, 0.106140f, 0.713867f, 0.106079f, 0.702148f, + 0.105347f, 0.690430f, 0.104614f, 0.678711f, 0.102539f, 0.666992f, 0.100891f, 0.654297f, + 0.099426f, 0.637207f, 0.097229f, 0.619141f, 0.094910f, 0.601074f, 0.090759f, 0.580566f, + 0.085449f, 0.559082f, 0.080078f, 0.531738f, 0.074158f, 0.498047f, 0.065735f, 0.460938f, + 0.055634f, 0.416260f, 0.042633f, 0.351807f, 0.025879f, 0.259033f, 0.004566f, 0.092041f, + 0.000000f, 1.000000f, 0.005260f, 0.996582f, 0.009384f, 0.992188f, 0.014206f, 0.986816f, + 0.018677f, 0.981445f, 0.023102f, 0.975098f, 0.027206f, 0.969727f, 0.031616f, 0.962891f, + 0.036011f, 0.957031f, 0.039642f, 0.951172f, 0.043304f, 0.945312f, 0.048096f, 0.937988f, + 0.051025f, 0.932129f, 0.054565f, 0.926758f, 0.057892f, 0.921387f, 0.062286f, 0.914062f, + 0.065186f, 0.907715f, 0.068726f, 0.901855f, 0.071777f, 0.896484f, 0.074036f, 0.890625f, + 0.077881f, 0.883789f, 0.081482f, 0.877441f, 0.083679f, 0.872070f, 0.085815f, 0.867188f, + 0.088684f, 0.861816f, 0.091553f, 0.854980f, 0.094543f, 0.848633f, 0.097473f, 0.842773f, + 0.099365f, 0.836426f, 0.101074f, 0.831055f, 0.102600f, 0.826172f, 0.105530f, 0.818848f, + 0.107971f, 0.812012f, 0.109802f, 0.804688f, 0.111511f, 0.798340f, 0.112732f, 0.792480f, + 0.114319f, 0.786133f, 0.115051f, 0.780273f, 0.116821f, 0.770996f, 0.118408f, 0.763184f, + 0.119385f, 0.755371f, 0.120850f, 0.748047f, 0.120728f, 0.739746f, 0.121338f, 0.733398f, + 0.120667f, 0.724121f, 0.121277f, 0.712891f, 0.122314f, 0.702637f, 0.121582f, 0.691895f, + 0.120728f, 0.681152f, 0.118896f, 0.669922f, 0.117249f, 0.659668f, 0.116089f, 0.644531f, + 0.113770f, 0.627441f, 0.111023f, 0.611328f, 0.107544f, 0.593750f, 0.102783f, 0.575195f, + 0.096802f, 0.554688f, 0.091309f, 0.524902f, 0.083984f, 0.493652f, 0.074524f, 0.457275f, + 0.062195f, 0.414551f, 0.048340f, 0.349854f, 0.029022f, 0.258545f, 0.005138f, 0.091736f, + 0.000000f, 1.000000f, 0.006630f, 0.995605f, 0.012138f, 0.990234f, 0.016922f, 0.984863f, + 0.022842f, 0.978027f, 0.028015f, 0.971191f, 0.031555f, 0.966309f, 0.037872f, 0.958008f, + 0.042908f, 0.951172f, 0.046295f, 0.946289f, 0.051910f, 0.937500f, 0.056549f, 0.930664f, + 0.060028f, 0.924805f, 0.064087f, 0.918457f, 0.068787f, 0.910156f, 0.073181f, 0.903809f, + 0.076599f, 0.897949f, 0.079407f, 0.892578f, 0.084045f, 0.884766f, 0.087769f, 0.877930f, + 0.091492f, 0.871582f, 0.094360f, 0.865723f, 0.097473f, 0.859863f, 0.099976f, 0.854492f, + 0.103882f, 0.847168f, 0.107056f, 0.840820f, 0.110107f, 0.834961f, 0.112244f, 0.829590f, + 0.115173f, 0.824219f, 0.116638f, 0.818359f, 0.119202f, 0.811035f, 0.122314f, 0.804199f, + 0.124573f, 0.797363f, 0.126953f, 0.791992f, 0.127808f, 0.785645f, 0.129150f, 0.780273f, + 0.131226f, 0.772949f, 0.133179f, 0.765137f, 0.135132f, 0.757324f, 0.135742f, 0.750000f, + 0.136353f, 0.743164f, 0.137329f, 0.735840f, 0.137207f, 0.729004f, 0.137939f, 0.720215f, + 0.138672f, 0.710449f, 0.138672f, 0.700684f, 0.138550f, 0.690430f, 0.137695f, 0.681641f, + 0.136108f, 0.671387f, 0.134399f, 0.661621f, 0.133301f, 0.648926f, 0.131348f, 0.633789f, + 0.129028f, 0.619141f, 0.125244f, 0.603516f, 0.120789f, 0.587402f, 0.115417f, 0.569336f, + 0.109741f, 0.546875f, 0.103027f, 0.519531f, 0.094360f, 0.488770f, 0.083557f, 0.454346f, + 0.069702f, 0.413330f, 0.054138f, 0.347656f, 0.032196f, 0.257812f, 0.005753f, 0.091309f, + 0.000000f, 1.000000f, 0.007626f, 0.995117f, 0.014359f, 0.988770f, 0.020340f, 0.983398f, + 0.027176f, 0.975098f, 0.032959f, 0.968262f, 0.038818f, 0.959961f, 0.044983f, 0.952148f, + 0.049652f, 0.945801f, 0.056732f, 0.936523f, 0.062103f, 0.929199f, 0.066406f, 0.922363f, + 0.070862f, 0.915527f, 0.076416f, 0.907227f, 0.081909f, 0.899414f, 0.085571f, 0.893066f, + 0.088562f, 0.887695f, 0.093628f, 0.879395f, 0.098511f, 0.871582f, 0.103333f, 0.864746f, + 0.106262f, 0.858887f, 0.109497f, 0.853516f, 0.113525f, 0.845703f, 0.117676f, 0.838379f, + 0.120483f, 0.832520f, 0.124146f, 0.826172f, 0.126709f, 0.820801f, 0.128662f, 0.815918f, + 0.131958f, 0.809082f, 0.136108f, 0.801758f, 0.137939f, 0.794922f, 0.140015f, 0.789062f, + 0.142700f, 0.783203f, 0.144409f, 0.777832f, 0.145264f, 0.772461f, 0.148071f, 0.764160f, + 0.150757f, 0.756836f, 0.151855f, 0.750000f, 0.153442f, 0.743164f, 0.154175f, 0.736816f, + 0.154297f, 0.730469f, 0.154907f, 0.724609f, 0.156128f, 0.714355f, 0.156616f, 0.705566f, + 0.157471f, 0.697266f, 0.155762f, 0.687988f, 0.155762f, 0.679688f, 0.154419f, 0.671387f, + 0.152588f, 0.662598f, 0.151489f, 0.649902f, 0.149414f, 0.636719f, 0.147339f, 0.623535f, + 0.143921f, 0.610352f, 0.140015f, 0.596680f, 0.134644f, 0.581055f, 0.128296f, 0.562500f, + 0.122559f, 0.539062f, 0.114868f, 0.513184f, 0.104797f, 0.484619f, 0.092407f, 0.452393f, + 0.077332f, 0.410156f, 0.060272f, 0.344971f, 0.035950f, 0.258545f, 0.006393f, 0.090515f, + 0.000000f, 1.000000f, 0.009056f, 0.994629f, 0.016968f, 0.987305f, 0.024200f, 0.979980f, + 0.032990f, 0.971191f, 0.039520f, 0.962891f, 0.046753f, 0.954102f, 0.053284f, 0.946289f, + 0.059784f, 0.937012f, 0.067017f, 0.928223f, 0.072510f, 0.920410f, 0.078369f, 0.912598f, + 0.084839f, 0.903320f, 0.090271f, 0.895996f, 0.094482f, 0.889160f, 0.100464f, 0.880859f, + 0.106018f, 0.872070f, 0.110352f, 0.864746f, 0.114807f, 0.858398f, 0.118713f, 0.852051f, + 0.123413f, 0.844238f, 0.127930f, 0.836426f, 0.132324f, 0.829102f, 0.135986f, 0.822754f, + 0.138672f, 0.817383f, 0.141602f, 0.812012f, 0.145508f, 0.804688f, 0.149292f, 0.797363f, + 0.152344f, 0.791016f, 0.155640f, 0.785156f, 0.157959f, 0.779785f, 0.159424f, 0.774414f, + 0.160645f, 0.769043f, 0.164795f, 0.761230f, 0.166748f, 0.753906f, 0.168457f, 0.747559f, + 0.170410f, 0.741211f, 0.171509f, 0.735352f, 0.172485f, 0.729004f, 0.172607f, 0.723633f, + 0.173828f, 0.715820f, 0.175415f, 0.707031f, 0.176270f, 0.699707f, 0.176147f, 0.691406f, + 0.175659f, 0.684082f, 0.174683f, 0.677246f, 0.173462f, 0.668945f, 0.171875f, 0.660156f, + 0.171143f, 0.648926f, 0.169189f, 0.637207f, 0.166870f, 0.625977f, 0.164062f, 0.614258f, + 0.159790f, 0.602051f, 0.154175f, 0.589355f, 0.148438f, 0.574219f, 0.143188f, 0.552734f, + 0.136230f, 0.531250f, 0.126953f, 0.507812f, 0.115540f, 0.481201f, 0.101746f, 0.450195f, + 0.086182f, 0.404541f, 0.066711f, 0.342529f, 0.039337f, 0.258057f, 0.007034f, 0.090088f, + 0.000000f, 1.000000f, 0.010162f, 0.994141f, 0.020432f, 0.985352f, 0.030762f, 0.975586f, + 0.038666f, 0.967773f, 0.048370f, 0.956055f, 0.056427f, 0.947754f, 0.064941f, 0.936523f, + 0.072571f, 0.927734f, 0.078918f, 0.919434f, 0.086853f, 0.908691f, 0.094116f, 0.899414f, + 0.099731f, 0.891602f, 0.105408f, 0.884277f, 0.112793f, 0.873535f, 0.118591f, 0.865234f, + 0.124329f, 0.857910f, 0.128418f, 0.850586f, 0.133667f, 0.842773f, 0.138550f, 0.834473f, + 0.143799f, 0.826660f, 0.148926f, 0.819824f, 0.151733f, 0.813477f, 0.155151f, 0.808105f, + 0.159912f, 0.799316f, 0.164307f, 0.792480f, 0.167358f, 0.785645f, 0.171021f, 0.779785f, + 0.173218f, 0.774414f, 0.175293f, 0.769531f, 0.178467f, 0.763184f, 0.182129f, 0.755859f, + 0.183960f, 0.749512f, 0.186279f, 0.742676f, 0.188477f, 0.736816f, 0.189697f, 0.731934f, + 0.190552f, 0.726562f, 0.191162f, 0.721191f, 0.193726f, 0.712891f, 0.194824f, 0.705566f, + 0.195435f, 0.698242f, 0.196533f, 0.691895f, 0.196411f, 0.685059f, 0.195557f, 0.678223f, + 0.194458f, 0.672363f, 0.193237f, 0.666016f, 0.192627f, 0.654297f, 0.191772f, 0.644531f, + 0.190063f, 0.635742f, 0.187500f, 0.625488f, 0.184082f, 0.616211f, 0.180298f, 0.605469f, + 0.175049f, 0.594727f, 0.170166f, 0.580566f, 0.164795f, 0.562500f, 0.158325f, 0.544434f, + 0.149292f, 0.524414f, 0.139404f, 0.503418f, 0.126099f, 0.478271f, 0.111084f, 0.447510f, + 0.094971f, 0.399414f, 0.072998f, 0.340576f, 0.042816f, 0.258545f, 0.007729f, 0.089966f, + 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.025009f, 0.983398f, 0.037354f, 0.971680f, + 0.048065f, 0.960449f, 0.058807f, 0.949707f, 0.069641f, 0.937500f, 0.078369f, 0.927246f, + 0.085449f, 0.918457f, 0.096130f, 0.905273f, 0.103760f, 0.895508f, 0.110352f, 0.887695f, + 0.118469f, 0.876465f, 0.125854f, 0.866699f, 0.132202f, 0.857910f, 0.138184f, 0.850586f, + 0.144043f, 0.840820f, 0.150757f, 0.832031f, 0.155884f, 0.823730f, 0.161011f, 0.816406f, + 0.165039f, 0.810059f, 0.169556f, 0.802734f, 0.175659f, 0.793457f, 0.179565f, 0.786133f, + 0.184204f, 0.779297f, 0.186768f, 0.773926f, 0.189453f, 0.768066f, 0.192261f, 0.762695f, + 0.197144f, 0.754395f, 0.199829f, 0.748047f, 0.203247f, 0.742188f, 0.205322f, 0.736816f, + 0.207397f, 0.731445f, 0.208374f, 0.726562f, 0.210205f, 0.721191f, 0.212036f, 0.713867f, + 0.214478f, 0.707520f, 0.215820f, 0.701172f, 0.217163f, 0.694824f, 0.217041f, 0.688965f, + 0.217285f, 0.683105f, 0.216675f, 0.677734f, 0.216064f, 0.671875f, 0.216431f, 0.665039f, + 0.215942f, 0.656250f, 0.214355f, 0.647949f, 0.214233f, 0.640625f, 0.211914f, 0.631836f, + 0.209229f, 0.624023f, 0.205200f, 0.615234f, 0.200928f, 0.606445f, 0.197144f, 0.597168f, + 0.192627f, 0.582520f, 0.187134f, 0.567871f, 0.180542f, 0.553223f, 0.172729f, 0.537109f, + 0.163452f, 0.520020f, 0.151001f, 0.499268f, 0.137207f, 0.475586f, 0.122070f, 0.438721f, + 0.103760f, 0.395020f, 0.079346f, 0.339355f, 0.046722f, 0.260010f, 0.008469f, 0.090271f, + 0.000000f, 1.000000f, 0.017120f, 0.990723f, 0.032562f, 0.978516f, 0.046265f, 0.965820f, + 0.059692f, 0.953125f, 0.073059f, 0.938965f, 0.083679f, 0.927734f, 0.094666f, 0.915039f, + 0.105530f, 0.902832f, 0.114868f, 0.892090f, 0.124268f, 0.879883f, 0.132935f, 0.869141f, + 0.140137f, 0.859863f, 0.146851f, 0.850586f, 0.155396f, 0.839355f, 0.162842f, 0.829590f, + 0.168945f, 0.821777f, 0.174316f, 0.813965f, 0.180664f, 0.804688f, 0.186035f, 0.795410f, + 0.191772f, 0.787598f, 0.196289f, 0.780273f, 0.199219f, 0.774414f, 0.203857f, 0.767578f, + 0.208252f, 0.759766f, 0.213501f, 0.751953f, 0.216309f, 0.745605f, 0.219971f, 0.739258f, + 0.222778f, 0.733398f, 0.224731f, 0.728516f, 0.226685f, 0.724121f, 0.229614f, 0.717773f, + 0.232178f, 0.711426f, 0.234375f, 0.705078f, 0.236328f, 0.699219f, 0.237305f, 0.693359f, + 0.238159f, 0.688477f, 0.239014f, 0.684082f, 0.238647f, 0.679199f, 0.238525f, 0.674805f, + 0.239624f, 0.667480f, 0.239746f, 0.660156f, 0.240112f, 0.653320f, 0.239502f, 0.646484f, + 0.237793f, 0.640137f, 0.236084f, 0.633301f, 0.234131f, 0.627441f, 0.230347f, 0.620117f, + 0.227051f, 0.613770f, 0.223999f, 0.604492f, 0.220581f, 0.593750f, 0.216064f, 0.582520f, + 0.211304f, 0.571289f, 0.204102f, 0.559082f, 0.196045f, 0.545410f, 0.187378f, 0.530762f, + 0.176147f, 0.514160f, 0.163452f, 0.495605f, 0.150024f, 0.466064f, 0.133667f, 0.432373f, + 0.112976f, 0.392334f, 0.085876f, 0.338867f, 0.050323f, 0.260742f, 0.009201f, 0.090271f, + 0.000000f, 1.000000f, 0.021469f, 0.988770f, 0.040436f, 0.975098f, 0.058228f, 0.959473f, + 0.075134f, 0.942871f, 0.089233f, 0.928711f, 0.104126f, 0.913574f, 0.114685f, 0.901855f, + 0.128662f, 0.885742f, 0.138184f, 0.874023f, 0.146973f, 0.863281f, 0.158691f, 0.849609f, + 0.166992f, 0.839355f, 0.174438f, 0.829590f, 0.181763f, 0.819336f, 0.189941f, 0.808594f, + 0.196533f, 0.798828f, 0.202393f, 0.790527f, 0.207764f, 0.782715f, 0.213257f, 0.774902f, + 0.219727f, 0.765625f, 0.224731f, 0.757324f, 0.229248f, 0.750000f, 0.233032f, 0.743164f, + 0.236694f, 0.737305f, 0.239990f, 0.731445f, 0.243652f, 0.724609f, 0.246704f, 0.717773f, + 0.250732f, 0.711426f, 0.252686f, 0.705566f, 0.255371f, 0.699707f, 0.257080f, 0.694824f, + 0.258789f, 0.689941f, 0.259766f, 0.685547f, 0.260498f, 0.682129f, 0.262207f, 0.675293f, + 0.263428f, 0.668945f, 0.263916f, 0.663574f, 0.264893f, 0.658203f, 0.265137f, 0.652832f, + 0.264404f, 0.647461f, 0.263672f, 0.643066f, 0.262207f, 0.637695f, 0.260742f, 0.632812f, + 0.258301f, 0.627930f, 0.255859f, 0.621582f, 0.254883f, 0.613770f, 0.251953f, 0.605957f, + 0.249023f, 0.597168f, 0.244507f, 0.588867f, 0.239746f, 0.580078f, 0.234863f, 0.570801f, + 0.227783f, 0.561035f, 0.221069f, 0.550293f, 0.211548f, 0.539062f, 0.200928f, 0.525391f, + 0.190674f, 0.505371f, 0.177734f, 0.483398f, 0.163086f, 0.458496f, 0.144531f, 0.428223f, + 0.121338f, 0.389893f, 0.092224f, 0.339111f, 0.053864f, 0.261963f, 0.009865f, 0.090210f, + 0.000000f, 1.000000f, 0.027863f, 0.986328f, 0.051727f, 0.968750f, 0.073486f, 0.950195f, + 0.094482f, 0.931152f, 0.112671f, 0.913086f, 0.127808f, 0.897461f, 0.142578f, 0.880859f, + 0.155762f, 0.867188f, 0.165771f, 0.854492f, 0.178467f, 0.839355f, 0.189209f, 0.826660f, + 0.197021f, 0.816406f, 0.205200f, 0.806152f, 0.213867f, 0.794434f, 0.221924f, 0.783691f, + 0.229370f, 0.773926f, 0.234741f, 0.765137f, 0.239014f, 0.757812f, 0.245483f, 0.749023f, + 0.250977f, 0.740234f, 0.255859f, 0.732422f, 0.261719f, 0.724609f, 0.264160f, 0.718750f, + 0.267578f, 0.712402f, 0.270752f, 0.706543f, 0.273193f, 0.700684f, 0.276855f, 0.694336f, + 0.278809f, 0.688965f, 0.281982f, 0.682129f, 0.284180f, 0.677246f, 0.285645f, 0.671875f, + 0.287109f, 0.666992f, 0.288086f, 0.662598f, 0.288818f, 0.658203f, 0.289795f, 0.654297f, + 0.289551f, 0.649414f, 0.288574f, 0.645508f, 0.288330f, 0.641113f, 0.289551f, 0.635254f, + 0.288574f, 0.629883f, 0.287354f, 0.624512f, 0.286621f, 0.619141f, 0.285400f, 0.613281f, + 0.282471f, 0.607910f, 0.280273f, 0.602539f, 0.277344f, 0.596680f, 0.273926f, 0.590820f, + 0.268799f, 0.583496f, 0.263916f, 0.577637f, 0.257568f, 0.570312f, 0.251465f, 0.562012f, + 0.245728f, 0.551270f, 0.237549f, 0.539551f, 0.228638f, 0.526855f, 0.218628f, 0.512207f, + 0.206299f, 0.495850f, 0.192383f, 0.477051f, 0.175415f, 0.453857f, 0.154907f, 0.425537f, + 0.129883f, 0.389404f, 0.098389f, 0.339600f, 0.059204f, 0.255127f, 0.010590f, 0.091003f, + 0.000000f, 1.000000f, 0.038086f, 0.981934f, 0.070557f, 0.958496f, 0.097351f, 0.936523f, + 0.120850f, 0.914551f, 0.139771f, 0.896484f, 0.159546f, 0.875977f, 0.174927f, 0.859375f, + 0.188965f, 0.842773f, 0.202393f, 0.827637f, 0.213989f, 0.813477f, 0.224365f, 0.800293f, + 0.232910f, 0.789062f, 0.242065f, 0.776855f, 0.250244f, 0.766113f, 0.258301f, 0.755371f, + 0.264893f, 0.745605f, 0.271484f, 0.736328f, 0.276367f, 0.728516f, 0.281738f, 0.720215f, + 0.286133f, 0.712891f, 0.290283f, 0.705566f, 0.293457f, 0.698730f, 0.298340f, 0.691406f, + 0.300781f, 0.685059f, 0.303467f, 0.679199f, 0.306396f, 0.672852f, 0.309814f, 0.666992f, + 0.311523f, 0.661621f, 0.312256f, 0.657227f, 0.314453f, 0.651855f, 0.315674f, 0.647461f, + 0.316162f, 0.643555f, 0.317871f, 0.638672f, 0.317383f, 0.635254f, 0.317627f, 0.631348f, + 0.317627f, 0.627930f, 0.316895f, 0.623535f, 0.315674f, 0.619629f, 0.315918f, 0.614746f, + 0.314209f, 0.610840f, 0.312012f, 0.605957f, 0.310303f, 0.602051f, 0.308350f, 0.596680f, + 0.305664f, 0.592285f, 0.302002f, 0.586914f, 0.298584f, 0.581543f, 0.295166f, 0.575684f, + 0.290039f, 0.569336f, 0.285400f, 0.562988f, 0.279297f, 0.556152f, 0.272705f, 0.547852f, + 0.264648f, 0.539062f, 0.255615f, 0.529297f, 0.244995f, 0.517578f, 0.234375f, 0.505371f, + 0.220093f, 0.490234f, 0.204834f, 0.473145f, 0.186279f, 0.451660f, 0.165039f, 0.423828f, + 0.139038f, 0.386963f, 0.106506f, 0.334961f, 0.063965f, 0.250977f, 0.011330f, 0.091614f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.081604f, 0.953125f, 0.112366f, 0.928223f, + 0.138062f, 0.904297f, 0.159912f, 0.882812f, 0.179199f, 0.862793f, 0.195801f, 0.844727f, + 0.210449f, 0.828125f, 0.224609f, 0.812012f, 0.236084f, 0.797852f, 0.247192f, 0.784180f, + 0.256104f, 0.771973f, 0.265137f, 0.759766f, 0.273193f, 0.749023f, 0.280273f, 0.738770f, + 0.286621f, 0.729004f, 0.292725f, 0.719727f, 0.298340f, 0.710938f, 0.303711f, 0.702637f, + 0.308350f, 0.694824f, 0.312500f, 0.687500f, 0.316650f, 0.680176f, 0.319336f, 0.674316f, + 0.323242f, 0.667480f, 0.325928f, 0.661621f, 0.328613f, 0.655762f, 0.330322f, 0.650391f, + 0.333008f, 0.644531f, 0.334229f, 0.640137f, 0.336670f, 0.634766f, 0.337158f, 0.630371f, + 0.337646f, 0.626465f, 0.338867f, 0.622070f, 0.338867f, 0.618164f, 0.338623f, 0.614258f, + 0.339355f, 0.610352f, 0.339111f, 0.606445f, 0.337158f, 0.602539f, 0.336914f, 0.598145f, + 0.335449f, 0.594238f, 0.333984f, 0.590332f, 0.331787f, 0.585938f, 0.330322f, 0.582031f, + 0.327148f, 0.576660f, 0.323486f, 0.572266f, 0.320312f, 0.567383f, 0.316406f, 0.561523f, + 0.311768f, 0.555664f, 0.305908f, 0.549316f, 0.300293f, 0.542969f, 0.293457f, 0.534668f, + 0.285645f, 0.526367f, 0.277100f, 0.517090f, 0.267334f, 0.506836f, 0.255615f, 0.493896f, + 0.242676f, 0.478760f, 0.227295f, 0.461426f, 0.209229f, 0.440674f, 0.187744f, 0.413086f, + 0.160889f, 0.377686f, 0.126831f, 0.327637f, 0.081909f, 0.249390f, 0.020020f, 0.096985f, + 0.000000f, 1.000000f, 0.045471f, 0.978516f, 0.081543f, 0.953125f, 0.111755f, 0.928223f, + 0.138550f, 0.904297f, 0.161499f, 0.882324f, 0.180908f, 0.861816f, 0.198364f, 0.843262f, + 0.213135f, 0.826172f, 0.227173f, 0.810059f, 0.240112f, 0.794922f, 0.250488f, 0.781738f, + 0.260010f, 0.768555f, 0.269775f, 0.756348f, 0.278320f, 0.744629f, 0.285400f, 0.734375f, + 0.293457f, 0.723633f, 0.299561f, 0.714355f, 0.305908f, 0.705078f, 0.310791f, 0.697266f, + 0.315918f, 0.688965f, 0.321045f, 0.681152f, 0.325684f, 0.673340f, 0.328125f, 0.666992f, + 0.332275f, 0.660156f, 0.335449f, 0.653809f, 0.339111f, 0.647461f, 0.341064f, 0.642090f, + 0.345215f, 0.635254f, 0.346680f, 0.630371f, 0.348389f, 0.625000f, 0.350098f, 0.620117f, + 0.350586f, 0.615723f, 0.352295f, 0.611328f, 0.353271f, 0.606934f, 0.353271f, 0.602539f, + 0.353760f, 0.598633f, 0.354736f, 0.594238f, 0.353760f, 0.589844f, 0.353027f, 0.585938f, + 0.352783f, 0.581543f, 0.351807f, 0.577148f, 0.349609f, 0.572754f, 0.348877f, 0.567871f, + 0.346191f, 0.562988f, 0.343994f, 0.558105f, 0.340332f, 0.552734f, 0.337402f, 0.546875f, + 0.334229f, 0.541016f, 0.328125f, 0.534668f, 0.324463f, 0.527832f, 0.318848f, 0.519531f, + 0.311523f, 0.510742f, 0.303467f, 0.500977f, 0.294678f, 0.490723f, 0.285400f, 0.478271f, + 0.272705f, 0.463623f, 0.258545f, 0.446533f, 0.241699f, 0.425537f, 0.221436f, 0.399414f, + 0.196045f, 0.365479f, 0.163086f, 0.318359f, 0.116211f, 0.243164f, 0.045105f, 0.094666f, + 0.000000f, 1.000000f, 0.044952f, 0.979004f, 0.081909f, 0.953125f, 0.113342f, 0.927246f, + 0.139648f, 0.903320f, 0.162842f, 0.881348f, 0.181763f, 0.861328f, 0.200806f, 0.841797f, + 0.216553f, 0.823730f, 0.229736f, 0.808105f, 0.242676f, 0.792969f, 0.253906f, 0.778809f, + 0.265381f, 0.765137f, 0.274658f, 0.752441f, 0.283936f, 0.740723f, 0.291748f, 0.729980f, + 0.299561f, 0.719238f, 0.306885f, 0.708984f, 0.312744f, 0.700195f, 0.318115f, 0.691406f, + 0.324219f, 0.682617f, 0.329346f, 0.674316f, 0.333496f, 0.666992f, 0.338135f, 0.659668f, + 0.342041f, 0.652344f, 0.345703f, 0.645508f, 0.349365f, 0.639160f, 0.351807f, 0.633301f, + 0.355713f, 0.626953f, 0.358154f, 0.621094f, 0.360352f, 0.615234f, 0.363525f, 0.609375f, + 0.363770f, 0.604980f, 0.366211f, 0.600098f, 0.367432f, 0.595215f, 0.368652f, 0.590820f, + 0.369141f, 0.586426f, 0.370605f, 0.582031f, 0.370361f, 0.577637f, 0.370117f, 0.572754f, + 0.370117f, 0.567871f, 0.369629f, 0.563477f, 0.368652f, 0.558594f, 0.367676f, 0.553711f, + 0.367188f, 0.548340f, 0.364502f, 0.542969f, 0.362061f, 0.537598f, 0.359863f, 0.531738f, + 0.357178f, 0.524902f, 0.353760f, 0.518066f, 0.348877f, 0.510254f, 0.343994f, 0.502441f, + 0.338135f, 0.493408f, 0.331543f, 0.483887f, 0.323242f, 0.472900f, 0.314697f, 0.460693f, + 0.303467f, 0.446289f, 0.291504f, 0.429443f, 0.275879f, 0.409424f, 0.256592f, 0.383545f, + 0.233032f, 0.351562f, 0.200806f, 0.305908f, 0.154297f, 0.234253f, 0.076416f, 0.092346f, + 0.000000f, 1.000000f, 0.044891f, 0.979004f, 0.082153f, 0.953125f, 0.114136f, 0.926758f, + 0.141357f, 0.902344f, 0.163818f, 0.880371f, 0.185181f, 0.859375f, 0.203003f, 0.839844f, + 0.220337f, 0.821777f, 0.233521f, 0.805176f, 0.246460f, 0.790039f, 0.259277f, 0.774902f, + 0.270752f, 0.761719f, 0.280029f, 0.748535f, 0.289551f, 0.736328f, 0.298096f, 0.725098f, + 0.306885f, 0.713867f, 0.312988f, 0.704102f, 0.319336f, 0.694336f, 0.326172f, 0.684570f, + 0.333008f, 0.675781f, 0.337402f, 0.667480f, 0.342773f, 0.659668f, 0.347168f, 0.651855f, + 0.352295f, 0.644531f, 0.357178f, 0.636719f, 0.361572f, 0.629883f, 0.364014f, 0.623535f, + 0.367676f, 0.617188f, 0.371094f, 0.610352f, 0.374023f, 0.604492f, 0.377441f, 0.598633f, + 0.378418f, 0.593262f, 0.381104f, 0.587891f, 0.382568f, 0.582520f, 0.384521f, 0.577637f, + 0.386230f, 0.572754f, 0.387451f, 0.567871f, 0.387695f, 0.563477f, 0.387695f, 0.558594f, + 0.388184f, 0.553223f, 0.388672f, 0.548340f, 0.388672f, 0.543457f, 0.387451f, 0.538086f, + 0.387207f, 0.532715f, 0.385254f, 0.526855f, 0.384521f, 0.521484f, 0.381592f, 0.515137f, + 0.379639f, 0.508301f, 0.376709f, 0.501953f, 0.372803f, 0.494385f, 0.370361f, 0.486572f, + 0.364746f, 0.477295f, 0.358887f, 0.467773f, 0.351318f, 0.456543f, 0.343750f, 0.444336f, + 0.334229f, 0.430420f, 0.322754f, 0.413086f, 0.309326f, 0.392578f, 0.291016f, 0.368408f, + 0.269531f, 0.336670f, 0.239380f, 0.292969f, 0.194336f, 0.225342f, 0.113770f, 0.089355f, + 0.000000f, 1.000000f, 0.045258f, 0.979004f, 0.082520f, 0.953125f, 0.114197f, 0.927246f, + 0.142090f, 0.902344f, 0.165527f, 0.879395f, 0.186890f, 0.857910f, 0.205933f, 0.838379f, + 0.222778f, 0.820312f, 0.237427f, 0.802734f, 0.250488f, 0.787109f, 0.263428f, 0.771973f, + 0.274414f, 0.757812f, 0.284912f, 0.744629f, 0.296143f, 0.731934f, 0.303467f, 0.720215f, + 0.312500f, 0.708984f, 0.320312f, 0.698242f, 0.327881f, 0.687988f, 0.334717f, 0.678223f, + 0.341553f, 0.668945f, 0.347168f, 0.660156f, 0.352783f, 0.651367f, 0.359131f, 0.642578f, + 0.362793f, 0.635254f, 0.368896f, 0.626953f, 0.372070f, 0.620117f, 0.376221f, 0.613281f, + 0.378906f, 0.606934f, 0.383057f, 0.600098f, 0.387207f, 0.593750f, 0.390381f, 0.587402f, + 0.392822f, 0.581543f, 0.395020f, 0.576172f, 0.397217f, 0.570801f, 0.399414f, 0.565430f, + 0.400635f, 0.560547f, 0.403564f, 0.555176f, 0.404541f, 0.550293f, 0.405762f, 0.545410f, + 0.406738f, 0.539551f, 0.406494f, 0.534180f, 0.406738f, 0.529297f, 0.406494f, 0.523926f, + 0.407715f, 0.517578f, 0.406494f, 0.512207f, 0.406006f, 0.505371f, 0.404541f, 0.499023f, + 0.403564f, 0.492432f, 0.401123f, 0.485107f, 0.398438f, 0.477783f, 0.395508f, 0.468994f, + 0.390625f, 0.459717f, 0.385986f, 0.450439f, 0.380859f, 0.439697f, 0.374023f, 0.427002f, + 0.365234f, 0.413086f, 0.355957f, 0.396484f, 0.343018f, 0.376709f, 0.327637f, 0.352539f, + 0.307373f, 0.322510f, 0.278320f, 0.280762f, 0.236084f, 0.215210f, 0.155151f, 0.085266f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.082703f, 0.952637f, 0.115356f, 0.926270f, + 0.142578f, 0.901855f, 0.167725f, 0.877930f, 0.188232f, 0.856934f, 0.208618f, 0.836426f, + 0.225220f, 0.817871f, 0.240601f, 0.800293f, 0.254639f, 0.784180f, 0.268311f, 0.768555f, + 0.279785f, 0.753906f, 0.291016f, 0.740234f, 0.301758f, 0.727051f, 0.311768f, 0.714355f, + 0.320068f, 0.702637f, 0.328857f, 0.691406f, 0.336670f, 0.681152f, 0.343994f, 0.670898f, + 0.350098f, 0.661133f, 0.356201f, 0.652344f, 0.362061f, 0.643555f, 0.368652f, 0.634766f, + 0.373291f, 0.626953f, 0.378418f, 0.618652f, 0.383301f, 0.611328f, 0.388184f, 0.604004f, + 0.392090f, 0.597168f, 0.395508f, 0.590332f, 0.399414f, 0.583496f, 0.402832f, 0.576660f, + 0.407227f, 0.570312f, 0.409424f, 0.564453f, 0.412598f, 0.558594f, 0.415039f, 0.553223f, + 0.417725f, 0.547363f, 0.420654f, 0.541504f, 0.421631f, 0.536133f, 0.423584f, 0.531250f, + 0.424805f, 0.525391f, 0.425781f, 0.519531f, 0.426758f, 0.514160f, 0.427246f, 0.508789f, + 0.427490f, 0.501953f, 0.427734f, 0.496338f, 0.427002f, 0.489746f, 0.427490f, 0.483643f, + 0.426025f, 0.476318f, 0.425293f, 0.468750f, 0.423096f, 0.461182f, 0.420410f, 0.452148f, + 0.419434f, 0.443604f, 0.414307f, 0.433105f, 0.408691f, 0.422363f, 0.403564f, 0.409424f, + 0.396240f, 0.395752f, 0.387207f, 0.378662f, 0.377197f, 0.360352f, 0.364014f, 0.337646f, + 0.343506f, 0.307617f, 0.318604f, 0.267090f, 0.277588f, 0.205688f, 0.199707f, 0.082336f, + 0.000000f, 1.000000f, 0.045105f, 0.979004f, 0.083618f, 0.952148f, 0.116028f, 0.925781f, + 0.143921f, 0.900879f, 0.168701f, 0.877930f, 0.191162f, 0.854980f, 0.210693f, 0.834473f, + 0.228516f, 0.815918f, 0.244507f, 0.797363f, 0.259277f, 0.780762f, 0.273682f, 0.764160f, + 0.285889f, 0.749023f, 0.297852f, 0.734863f, 0.308350f, 0.721680f, 0.318359f, 0.708984f, + 0.326904f, 0.697266f, 0.336182f, 0.685547f, 0.343994f, 0.674805f, 0.350586f, 0.665039f, + 0.358398f, 0.654785f, 0.365234f, 0.645020f, 0.371826f, 0.635742f, 0.378418f, 0.626953f, + 0.384277f, 0.618164f, 0.389648f, 0.610352f, 0.395020f, 0.602051f, 0.400879f, 0.593750f, + 0.404053f, 0.586914f, 0.409180f, 0.579590f, 0.414795f, 0.571777f, 0.416992f, 0.565430f, + 0.421387f, 0.558594f, 0.424316f, 0.552246f, 0.427979f, 0.545898f, 0.431152f, 0.540039f, + 0.433105f, 0.534180f, 0.436035f, 0.528320f, 0.439209f, 0.522461f, 0.440918f, 0.517090f, + 0.443115f, 0.511230f, 0.444580f, 0.504883f, 0.446533f, 0.498535f, 0.446777f, 0.493164f, + 0.448975f, 0.486572f, 0.449707f, 0.479980f, 0.449463f, 0.474121f, 0.449219f, 0.467041f, + 0.449951f, 0.459473f, 0.449219f, 0.451904f, 0.447754f, 0.444092f, 0.446045f, 0.435059f, + 0.444092f, 0.425537f, 0.440918f, 0.415039f, 0.437256f, 0.404785f, 0.433350f, 0.392090f, + 0.427002f, 0.378174f, 0.419678f, 0.362549f, 0.409668f, 0.343262f, 0.398438f, 0.320557f, + 0.381104f, 0.292236f, 0.357910f, 0.254395f, 0.320557f, 0.194824f, 0.244629f, 0.078430f, + 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.083618f, 0.952148f, 0.116882f, 0.925781f, + 0.145386f, 0.899902f, 0.171143f, 0.875977f, 0.194336f, 0.853516f, 0.214111f, 0.832520f, + 0.232422f, 0.812500f, 0.249756f, 0.793457f, 0.263916f, 0.776855f, 0.278320f, 0.760254f, + 0.291260f, 0.745117f, 0.303467f, 0.730957f, 0.313232f, 0.717773f, 0.325439f, 0.704102f, + 0.333984f, 0.692383f, 0.343750f, 0.680176f, 0.351807f, 0.668945f, 0.359131f, 0.658691f, + 0.367188f, 0.647461f, 0.374512f, 0.637695f, 0.382568f, 0.627441f, 0.387939f, 0.618652f, + 0.395752f, 0.608887f, 0.400391f, 0.601074f, 0.406494f, 0.592285f, 0.411865f, 0.584473f, + 0.416748f, 0.576660f, 0.420166f, 0.569824f, 0.427246f, 0.561523f, 0.430420f, 0.554199f, + 0.435791f, 0.546875f, 0.439453f, 0.540039f, 0.442627f, 0.533691f, 0.446777f, 0.527344f, + 0.449951f, 0.520996f, 0.452881f, 0.514648f, 0.455566f, 0.508789f, 0.458984f, 0.502441f, + 0.460938f, 0.497070f, 0.463135f, 0.490479f, 0.466309f, 0.483398f, 0.467285f, 0.477783f, + 0.469238f, 0.471436f, 0.469971f, 0.464355f, 0.471680f, 0.457275f, 0.471436f, 0.450439f, + 0.473389f, 0.443115f, 0.473145f, 0.434814f, 0.472656f, 0.426514f, 0.472168f, 0.417969f, + 0.470459f, 0.408447f, 0.469238f, 0.398438f, 0.466797f, 0.387451f, 0.462646f, 0.375000f, + 0.458496f, 0.360840f, 0.451660f, 0.345459f, 0.443848f, 0.326416f, 0.432129f, 0.305420f, + 0.418701f, 0.276855f, 0.396973f, 0.240356f, 0.362061f, 0.183716f, 0.291260f, 0.074280f, + 0.000000f, 1.000000f, 0.045197f, 0.979004f, 0.083923f, 0.952148f, 0.117310f, 0.925293f, + 0.146118f, 0.899902f, 0.172729f, 0.875000f, 0.196045f, 0.851562f, 0.216919f, 0.830078f, + 0.235474f, 0.810059f, 0.252930f, 0.791504f, 0.268555f, 0.773926f, 0.282227f, 0.757324f, + 0.296631f, 0.741699f, 0.308594f, 0.727051f, 0.319580f, 0.712891f, 0.330078f, 0.699707f, + 0.341064f, 0.686523f, 0.350830f, 0.674316f, 0.359375f, 0.662598f, 0.369385f, 0.650879f, + 0.377441f, 0.639648f, 0.384521f, 0.629395f, 0.391357f, 0.620117f, 0.398682f, 0.610352f, + 0.406006f, 0.600586f, 0.411133f, 0.592285f, 0.417725f, 0.583008f, 0.424561f, 0.574219f, + 0.430664f, 0.565430f, 0.434814f, 0.558105f, 0.439453f, 0.550781f, 0.445312f, 0.542480f, + 0.450439f, 0.535156f, 0.454102f, 0.528320f, 0.458008f, 0.520996f, 0.462646f, 0.514160f, + 0.466797f, 0.507324f, 0.469238f, 0.500977f, 0.473145f, 0.494385f, 0.476807f, 0.488037f, + 0.479492f, 0.481934f, 0.482666f, 0.476074f, 0.484619f, 0.468506f, 0.487549f, 0.461670f, + 0.489990f, 0.455078f, 0.491943f, 0.448486f, 0.493652f, 0.440918f, 0.494873f, 0.434082f, + 0.495850f, 0.425781f, 0.496338f, 0.418213f, 0.497070f, 0.409668f, 0.497314f, 0.400635f, + 0.496826f, 0.390869f, 0.496094f, 0.380615f, 0.492188f, 0.369629f, 0.491455f, 0.357178f, + 0.487793f, 0.343506f, 0.482666f, 0.327881f, 0.476074f, 0.309814f, 0.467529f, 0.288818f, + 0.453857f, 0.262451f, 0.435303f, 0.226807f, 0.404053f, 0.174072f, 0.338623f, 0.069580f, + 0.000000f, 1.000000f, 0.044922f, 0.979004f, 0.084167f, 0.952148f, 0.118835f, 0.923828f, + 0.148438f, 0.897949f, 0.174683f, 0.873047f, 0.198853f, 0.849609f, 0.220459f, 0.828125f, + 0.238281f, 0.808105f, 0.256836f, 0.788574f, 0.272705f, 0.770996f, 0.287598f, 0.753906f, + 0.301270f, 0.737793f, 0.313965f, 0.722656f, 0.326660f, 0.707520f, 0.337646f, 0.693848f, + 0.348389f, 0.680664f, 0.359131f, 0.667480f, 0.368652f, 0.655762f, 0.377441f, 0.644043f, + 0.385986f, 0.632812f, 0.394043f, 0.622070f, 0.401123f, 0.611816f, 0.409912f, 0.601074f, + 0.416504f, 0.591797f, 0.423584f, 0.582031f, 0.429932f, 0.573242f, 0.437012f, 0.563965f, + 0.442627f, 0.555664f, 0.447998f, 0.547363f, 0.453613f, 0.539062f, 0.458984f, 0.531250f, + 0.464355f, 0.522949f, 0.469238f, 0.515625f, 0.474121f, 0.507812f, 0.478271f, 0.500977f, + 0.483154f, 0.493652f, 0.487549f, 0.486816f, 0.491211f, 0.479980f, 0.493408f, 0.474121f, + 0.497559f, 0.467285f, 0.501953f, 0.460449f, 0.504395f, 0.453125f, 0.507324f, 0.446289f, + 0.510254f, 0.439209f, 0.512695f, 0.432129f, 0.514648f, 0.424561f, 0.516602f, 0.417480f, + 0.519043f, 0.409424f, 0.520508f, 0.401367f, 0.521484f, 0.392334f, 0.521973f, 0.384033f, + 0.522461f, 0.373535f, 0.521484f, 0.363525f, 0.520996f, 0.352783f, 0.520020f, 0.340332f, + 0.517090f, 0.326904f, 0.513184f, 0.311279f, 0.507812f, 0.293457f, 0.500488f, 0.273193f, + 0.489746f, 0.247192f, 0.474121f, 0.213501f, 0.446777f, 0.163452f, 0.384521f, 0.065186f, + 0.000000f, 1.000000f, 0.045074f, 0.979004f, 0.084778f, 0.951660f, 0.119507f, 0.923828f, + 0.150513f, 0.896484f, 0.177490f, 0.871582f, 0.201416f, 0.848145f, 0.222900f, 0.826172f, + 0.241821f, 0.805664f, 0.259521f, 0.786621f, 0.276855f, 0.767578f, 0.292725f, 0.750488f, + 0.307617f, 0.733398f, 0.320312f, 0.717773f, 0.333252f, 0.702637f, 0.345215f, 0.688477f, + 0.355469f, 0.674805f, 0.366699f, 0.662109f, 0.377686f, 0.648926f, 0.386719f, 0.637207f, + 0.395508f, 0.625488f, 0.404053f, 0.614258f, 0.412598f, 0.603516f, 0.420654f, 0.592773f, + 0.427246f, 0.583008f, 0.435547f, 0.572754f, 0.442627f, 0.562988f, 0.449219f, 0.554199f, + 0.455811f, 0.544922f, 0.461914f, 0.536133f, 0.467529f, 0.527832f, 0.472656f, 0.519531f, + 0.479492f, 0.511230f, 0.484619f, 0.502930f, 0.489990f, 0.495361f, 0.493896f, 0.488281f, + 0.500488f, 0.479980f, 0.502930f, 0.473389f, 0.508301f, 0.466064f, 0.512695f, 0.458984f, + 0.516113f, 0.451904f, 0.520996f, 0.445068f, 0.524902f, 0.437988f, 0.527832f, 0.430664f, + 0.529785f, 0.423584f, 0.532715f, 0.416260f, 0.536621f, 0.408447f, 0.538574f, 0.400635f, + 0.541504f, 0.392578f, 0.543457f, 0.384277f, 0.544922f, 0.375488f, 0.546387f, 0.366455f, + 0.547852f, 0.356445f, 0.547852f, 0.346924f, 0.547852f, 0.335693f, 0.546387f, 0.322998f, + 0.546387f, 0.309326f, 0.542969f, 0.294922f, 0.539551f, 0.277588f, 0.533203f, 0.257080f, + 0.523926f, 0.233521f, 0.510254f, 0.201050f, 0.485596f, 0.152466f, 0.430420f, 0.061676f, + 0.000000f, 1.000000f, 0.045410f, 0.979004f, 0.085999f, 0.950684f, 0.120483f, 0.923340f, + 0.151611f, 0.895996f, 0.178467f, 0.871094f, 0.203125f, 0.847168f, 0.225220f, 0.824707f, + 0.246094f, 0.803223f, 0.263916f, 0.783691f, 0.281982f, 0.764160f, 0.297363f, 0.746582f, + 0.312256f, 0.729492f, 0.326416f, 0.712891f, 0.338135f, 0.698242f, 0.351807f, 0.683105f, + 0.363281f, 0.668945f, 0.375000f, 0.655273f, 0.385010f, 0.642578f, 0.394287f, 0.630371f, + 0.405029f, 0.617676f, 0.413818f, 0.606445f, 0.422607f, 0.594727f, 0.430664f, 0.583984f, + 0.438232f, 0.573730f, 0.446777f, 0.563477f, 0.453857f, 0.553223f, 0.460938f, 0.543945f, + 0.467773f, 0.534668f, 0.475586f, 0.524902f, 0.480469f, 0.516602f, 0.488037f, 0.507324f, + 0.494385f, 0.498779f, 0.500000f, 0.490723f, 0.504883f, 0.482666f, 0.510254f, 0.474609f, + 0.516113f, 0.466553f, 0.520996f, 0.458984f, 0.524902f, 0.451904f, 0.530273f, 0.444336f, + 0.535156f, 0.436768f, 0.538574f, 0.429688f, 0.543945f, 0.422363f, 0.547852f, 0.415283f, + 0.549805f, 0.407471f, 0.554199f, 0.399902f, 0.558105f, 0.391846f, 0.560547f, 0.384521f, + 0.563477f, 0.375977f, 0.566895f, 0.367432f, 0.569336f, 0.358398f, 0.569824f, 0.349854f, + 0.572754f, 0.339600f, 0.573242f, 0.329834f, 0.575195f, 0.318115f, 0.574707f, 0.306396f, + 0.574707f, 0.292969f, 0.572754f, 0.278564f, 0.569336f, 0.261963f, 0.564453f, 0.241943f, + 0.557617f, 0.218750f, 0.544922f, 0.188232f, 0.523926f, 0.142822f, 0.474609f, 0.057129f, + 0.000000f, 1.000000f, 0.045532f, 0.978516f, 0.085083f, 0.951660f, 0.122375f, 0.921387f, + 0.152954f, 0.895508f, 0.179932f, 0.870117f, 0.205566f, 0.845215f, 0.227783f, 0.822754f, + 0.248169f, 0.801270f, 0.269287f, 0.779785f, 0.286377f, 0.760742f, 0.302490f, 0.742676f, + 0.318359f, 0.725098f, 0.332520f, 0.708496f, 0.346680f, 0.692383f, 0.358643f, 0.677734f, + 0.371338f, 0.662598f, 0.382568f, 0.648926f, 0.393311f, 0.635742f, 0.403564f, 0.622559f, + 0.414551f, 0.609863f, 0.422852f, 0.598633f, 0.432861f, 0.586914f, 0.440918f, 0.575684f, + 0.450928f, 0.563965f, 0.458740f, 0.553711f, 0.467529f, 0.543457f, 0.474609f, 0.533203f, + 0.481689f, 0.523438f, 0.489258f, 0.514160f, 0.494873f, 0.504883f, 0.502441f, 0.495850f, + 0.507324f, 0.487549f, 0.514160f, 0.478516f, 0.521973f, 0.469238f, 0.526367f, 0.461426f, + 0.532227f, 0.453125f, 0.537598f, 0.445068f, 0.542480f, 0.437500f, 0.548828f, 0.429199f, + 0.553223f, 0.421875f, 0.558105f, 0.414551f, 0.562012f, 0.406738f, 0.568359f, 0.399170f, + 0.570801f, 0.391846f, 0.575195f, 0.383789f, 0.579102f, 0.375488f, 0.582520f, 0.367920f, + 0.586426f, 0.359375f, 0.588867f, 0.351074f, 0.591797f, 0.341797f, 0.593262f, 0.333252f, + 0.597656f, 0.322754f, 0.599609f, 0.312500f, 0.600586f, 0.301514f, 0.601074f, 0.289795f, + 0.600586f, 0.276611f, 0.600586f, 0.262207f, 0.599609f, 0.245850f, 0.596191f, 0.226929f, + 0.590820f, 0.204346f, 0.580078f, 0.175659f, 0.561035f, 0.133545f, 0.517090f, 0.051941f, + 0.000000f, 1.000000f, 0.045349f, 0.979004f, 0.085999f, 0.950684f, 0.122986f, 0.921387f, + 0.153931f, 0.895020f, 0.182373f, 0.868652f, 0.206543f, 0.844727f, 0.230835f, 0.820801f, + 0.252930f, 0.798340f, 0.272461f, 0.777832f, 0.290283f, 0.757812f, 0.308105f, 0.738770f, + 0.323730f, 0.720703f, 0.338623f, 0.703613f, 0.352051f, 0.687500f, 0.366699f, 0.671875f, + 0.378418f, 0.656738f, 0.391357f, 0.642090f, 0.403076f, 0.628418f, 0.412842f, 0.615234f, + 0.424072f, 0.602051f, 0.433350f, 0.590332f, 0.443115f, 0.578125f, 0.452393f, 0.566406f, + 0.461670f, 0.555176f, 0.469727f, 0.543945f, 0.478027f, 0.533691f, 0.487061f, 0.522949f, + 0.494873f, 0.512207f, 0.502441f, 0.502930f, 0.509766f, 0.492920f, 0.514648f, 0.484375f, + 0.522949f, 0.474609f, 0.529297f, 0.466064f, 0.537109f, 0.456543f, 0.542480f, 0.447998f, + 0.548340f, 0.439453f, 0.555176f, 0.430908f, 0.560547f, 0.422852f, 0.566406f, 0.414795f, + 0.571289f, 0.406738f, 0.576660f, 0.399170f, 0.581055f, 0.391602f, 0.586914f, 0.383545f, + 0.592285f, 0.375977f, 0.595215f, 0.367920f, 0.600098f, 0.359131f, 0.604004f, 0.351318f, + 0.607910f, 0.343262f, 0.611328f, 0.334229f, 0.615234f, 0.324951f, 0.618652f, 0.315918f, + 0.621582f, 0.305908f, 0.624023f, 0.295898f, 0.625000f, 0.285156f, 0.627441f, 0.273438f, + 0.628418f, 0.260742f, 0.628418f, 0.247070f, 0.627441f, 0.231201f, 0.625000f, 0.212646f, + 0.621094f, 0.191284f, 0.613281f, 0.163086f, 0.596680f, 0.123291f, 0.557617f, 0.049377f, + 0.000000f, 1.000000f, 0.045166f, 0.979004f, 0.087402f, 0.949707f, 0.123779f, 0.921387f, + 0.155640f, 0.893555f, 0.184082f, 0.867676f, 0.210815f, 0.841797f, 0.234497f, 0.818359f, + 0.256348f, 0.796387f, 0.275635f, 0.774902f, 0.295654f, 0.753906f, 0.312744f, 0.735352f, + 0.328857f, 0.716797f, 0.344727f, 0.699219f, 0.359863f, 0.682129f, 0.373291f, 0.666504f, + 0.386230f, 0.651367f, 0.399414f, 0.636230f, 0.410889f, 0.621582f, 0.422119f, 0.607910f, + 0.432861f, 0.594727f, 0.443604f, 0.582031f, 0.455322f, 0.569336f, 0.464844f, 0.557129f, + 0.473389f, 0.545410f, 0.482910f, 0.534180f, 0.491699f, 0.522949f, 0.500000f, 0.512207f, + 0.508301f, 0.501465f, 0.515625f, 0.491943f, 0.523926f, 0.481445f, 0.531250f, 0.471436f, + 0.538086f, 0.462402f, 0.543945f, 0.453125f, 0.552734f, 0.443604f, 0.559082f, 0.434570f, + 0.564453f, 0.425781f, 0.571289f, 0.417236f, 0.578125f, 0.408203f, 0.583008f, 0.400635f, + 0.589355f, 0.391846f, 0.595215f, 0.383789f, 0.600586f, 0.376221f, 0.606445f, 0.367920f, + 0.611816f, 0.359863f, 0.616699f, 0.352539f, 0.620117f, 0.343506f, 0.625000f, 0.334961f, + 0.628418f, 0.326904f, 0.633789f, 0.318359f, 0.637695f, 0.308838f, 0.641602f, 0.299805f, + 0.644531f, 0.289795f, 0.649414f, 0.279297f, 0.650879f, 0.269043f, 0.652832f, 0.257812f, + 0.654297f, 0.245117f, 0.655273f, 0.231323f, 0.655273f, 0.216064f, 0.654297f, 0.198608f, + 0.649414f, 0.178223f, 0.644531f, 0.151367f, 0.631348f, 0.114319f, 0.596680f, 0.045013f, + 0.000000f, 1.000000f, 0.045441f, 0.979004f, 0.087891f, 0.949707f, 0.123840f, 0.921387f, + 0.156616f, 0.893555f, 0.185913f, 0.866211f, 0.212646f, 0.840820f, 0.237183f, 0.816406f, + 0.259277f, 0.793945f, 0.281006f, 0.770996f, 0.299072f, 0.751465f, 0.317383f, 0.731445f, + 0.335449f, 0.711914f, 0.351562f, 0.694336f, 0.366211f, 0.677246f, 0.381592f, 0.660156f, + 0.394287f, 0.644531f, 0.406494f, 0.629883f, 0.420410f, 0.614258f, 0.431885f, 0.600586f, + 0.443604f, 0.586426f, 0.454346f, 0.573730f, 0.465088f, 0.560547f, 0.476074f, 0.548340f, + 0.485352f, 0.536133f, 0.494873f, 0.523926f, 0.502930f, 0.513184f, 0.512207f, 0.501953f, + 0.520996f, 0.490723f, 0.528320f, 0.480713f, 0.538086f, 0.469971f, 0.545410f, 0.459717f, + 0.552734f, 0.450195f, 0.559082f, 0.440674f, 0.567383f, 0.431152f, 0.575195f, 0.421143f, + 0.582520f, 0.411865f, 0.588867f, 0.403076f, 0.595703f, 0.394043f, 0.600586f, 0.385986f, + 0.607422f, 0.376953f, 0.613281f, 0.368652f, 0.619141f, 0.360596f, 0.624512f, 0.352539f, + 0.630371f, 0.344238f, 0.635254f, 0.336426f, 0.640625f, 0.327881f, 0.645996f, 0.318848f, + 0.650391f, 0.310547f, 0.655762f, 0.301758f, 0.659180f, 0.292725f, 0.663574f, 0.283447f, + 0.666992f, 0.274414f, 0.670410f, 0.263672f, 0.673828f, 0.253662f, 0.677246f, 0.242065f, + 0.681152f, 0.229858f, 0.681152f, 0.216797f, 0.682129f, 0.202271f, 0.681641f, 0.185425f, + 0.679199f, 0.165161f, 0.674316f, 0.140747f, 0.663086f, 0.105713f, 0.632812f, 0.041473f, + 0.000000f, 1.000000f, 0.045746f, 0.979004f, 0.088867f, 0.949219f, 0.124817f, 0.920898f, + 0.157837f, 0.892578f, 0.189331f, 0.864258f, 0.215332f, 0.838867f, 0.240723f, 0.814453f, + 0.262939f, 0.791016f, 0.284668f, 0.769043f, 0.305176f, 0.747070f, 0.323242f, 0.727051f, + 0.340576f, 0.708008f, 0.358643f, 0.688965f, 0.372559f, 0.671875f, 0.387939f, 0.654785f, + 0.402588f, 0.638184f, 0.416748f, 0.622559f, 0.429199f, 0.607422f, 0.441895f, 0.592773f, + 0.453125f, 0.578613f, 0.466309f, 0.564453f, 0.475830f, 0.551758f, 0.486084f, 0.539062f, + 0.497070f, 0.526367f, 0.505859f, 0.514648f, 0.516113f, 0.502441f, 0.525879f, 0.490723f, + 0.534668f, 0.479980f, 0.543945f, 0.468750f, 0.550293f, 0.458740f, 0.559570f, 0.447754f, + 0.567383f, 0.437744f, 0.577148f, 0.427002f, 0.582520f, 0.418213f, 0.589844f, 0.408447f, + 0.599121f, 0.398193f, 0.604004f, 0.389648f, 0.613281f, 0.379883f, 0.618164f, 0.371338f, + 0.625000f, 0.362305f, 0.631348f, 0.353760f, 0.637207f, 0.345459f, 0.643555f, 0.336914f, + 0.648926f, 0.328613f, 0.655762f, 0.320557f, 0.661133f, 0.312256f, 0.666504f, 0.303467f, + 0.669922f, 0.294922f, 0.676758f, 0.285889f, 0.681152f, 0.277100f, 0.685547f, 0.267578f, + 0.689453f, 0.258301f, 0.693848f, 0.248413f, 0.697266f, 0.238037f, 0.699707f, 0.227173f, + 0.703613f, 0.215576f, 0.704590f, 0.202881f, 0.707031f, 0.188232f, 0.706543f, 0.172241f, + 0.705566f, 0.153564f, 0.702637f, 0.130493f, 0.694336f, 0.097473f, 0.667969f, 0.037659f, + 0.000000f, 1.000000f, 0.046051f, 0.978516f, 0.089478f, 0.948730f, 0.125610f, 0.920410f, + 0.159546f, 0.891113f, 0.189697f, 0.863770f, 0.217651f, 0.837891f, 0.243774f, 0.812500f, + 0.266846f, 0.788574f, 0.289307f, 0.765625f, 0.310059f, 0.743652f, 0.329102f, 0.723145f, + 0.347168f, 0.703125f, 0.362793f, 0.685059f, 0.381348f, 0.665527f, 0.394775f, 0.648926f, + 0.410156f, 0.632324f, 0.425537f, 0.615723f, 0.437500f, 0.600586f, 0.451904f, 0.584961f, + 0.462402f, 0.570801f, 0.474854f, 0.556641f, 0.486328f, 0.542969f, 0.498047f, 0.529297f, + 0.508301f, 0.516602f, 0.518066f, 0.504395f, 0.529785f, 0.491699f, 0.538086f, 0.480469f, + 0.546875f, 0.468994f, 0.556641f, 0.457275f, 0.566406f, 0.446045f, 0.574707f, 0.435791f, + 0.583008f, 0.425049f, 0.591309f, 0.414551f, 0.599121f, 0.404541f, 0.606445f, 0.395264f, + 0.614746f, 0.385010f, 0.620605f, 0.375977f, 0.629395f, 0.365967f, 0.636230f, 0.356689f, + 0.642090f, 0.348145f, 0.649414f, 0.338867f, 0.656250f, 0.330078f, 0.661133f, 0.322266f, + 0.667480f, 0.313232f, 0.674805f, 0.304688f, 0.681152f, 0.296387f, 0.686035f, 0.288086f, + 0.690918f, 0.279541f, 0.696289f, 0.270020f, 0.702148f, 0.261230f, 0.706543f, 0.252686f, + 0.711426f, 0.243042f, 0.716309f, 0.233032f, 0.719727f, 0.223022f, 0.723633f, 0.213013f, + 0.726074f, 0.200928f, 0.728516f, 0.188721f, 0.730957f, 0.175537f, 0.732422f, 0.159790f, + 0.732910f, 0.142212f, 0.729980f, 0.119690f, 0.723145f, 0.088623f, 0.700684f, 0.034241f, + 0.000000f, 1.000000f, 0.046570f, 0.978027f, 0.089539f, 0.949219f, 0.125732f, 0.920410f, + 0.161377f, 0.890137f, 0.191650f, 0.862793f, 0.220947f, 0.835449f, 0.245361f, 0.810547f, + 0.271240f, 0.785645f, 0.292480f, 0.762695f, 0.315186f, 0.740234f, 0.333984f, 0.719238f, + 0.352539f, 0.699219f, 0.370605f, 0.679199f, 0.386719f, 0.661133f, 0.404053f, 0.642578f, + 0.418945f, 0.625488f, 0.432861f, 0.608887f, 0.447266f, 0.592773f, 0.460693f, 0.577148f, + 0.473389f, 0.562500f, 0.483887f, 0.548340f, 0.497070f, 0.534180f, 0.508301f, 0.520508f, + 0.519043f, 0.507324f, 0.531738f, 0.493896f, 0.541504f, 0.481689f, 0.551758f, 0.469482f, + 0.561035f, 0.457520f, 0.570312f, 0.446289f, 0.580566f, 0.434570f, 0.588867f, 0.423828f, + 0.597168f, 0.412842f, 0.605469f, 0.402344f, 0.614258f, 0.391846f, 0.622070f, 0.381836f, + 0.630371f, 0.371826f, 0.637207f, 0.362305f, 0.645508f, 0.352295f, 0.653320f, 0.342529f, + 0.659668f, 0.333496f, 0.666992f, 0.324463f, 0.673828f, 0.315430f, 0.679199f, 0.307129f, + 0.687012f, 0.297852f, 0.693848f, 0.289062f, 0.699219f, 0.281250f, 0.704590f, 0.272461f, + 0.711914f, 0.264160f, 0.716309f, 0.255371f, 0.722656f, 0.245850f, 0.726074f, 0.237549f, + 0.731934f, 0.228394f, 0.736328f, 0.218262f, 0.741211f, 0.208740f, 0.745117f, 0.197998f, + 0.750000f, 0.187256f, 0.752441f, 0.175171f, 0.755371f, 0.161987f, 0.756348f, 0.148071f, + 0.756836f, 0.131104f, 0.755371f, 0.109680f, 0.749512f, 0.081421f, 0.732422f, 0.030914f, + 0.000000f, 1.000000f, 0.047852f, 0.977051f, 0.089905f, 0.949219f, 0.128540f, 0.918457f, + 0.161499f, 0.890137f, 0.193604f, 0.861328f, 0.222656f, 0.833984f, 0.249634f, 0.808105f, + 0.274902f, 0.783203f, 0.298828f, 0.758789f, 0.318604f, 0.736816f, 0.339844f, 0.714844f, + 0.359131f, 0.694336f, 0.376465f, 0.674316f, 0.394775f, 0.655273f, 0.410645f, 0.636719f, + 0.426270f, 0.619629f, 0.442139f, 0.602051f, 0.456055f, 0.585938f, 0.469971f, 0.569824f, + 0.483887f, 0.554199f, 0.496826f, 0.539062f, 0.508301f, 0.524902f, 0.520020f, 0.510742f, + 0.532715f, 0.497070f, 0.541992f, 0.484375f, 0.553711f, 0.471191f, 0.563477f, 0.458740f, + 0.574707f, 0.446533f, 0.583984f, 0.434570f, 0.593750f, 0.422607f, 0.604492f, 0.411133f, + 0.612793f, 0.400635f, 0.620117f, 0.390137f, 0.629883f, 0.378662f, 0.637695f, 0.368408f, + 0.645020f, 0.358643f, 0.654297f, 0.348389f, 0.661133f, 0.339111f, 0.670410f, 0.328613f, + 0.676758f, 0.319336f, 0.684570f, 0.310059f, 0.691895f, 0.300537f, 0.698242f, 0.291992f, + 0.704102f, 0.283203f, 0.711426f, 0.274170f, 0.718262f, 0.265869f, 0.723633f, 0.257568f, + 0.729980f, 0.249023f, 0.736328f, 0.240723f, 0.741211f, 0.231201f, 0.747070f, 0.222168f, + 0.751953f, 0.213623f, 0.757812f, 0.204468f, 0.760254f, 0.194702f, 0.766113f, 0.184570f, + 0.770996f, 0.173340f, 0.772949f, 0.162354f, 0.777832f, 0.149902f, 0.779785f, 0.136108f, + 0.781250f, 0.120544f, 0.781738f, 0.101074f, 0.777832f, 0.074951f, 0.762207f, 0.028259f, + 0.000000f, 1.000000f, 0.048309f, 0.977051f, 0.089539f, 0.949219f, 0.129517f, 0.917969f, + 0.163574f, 0.889160f, 0.196167f, 0.859863f, 0.225220f, 0.832520f, 0.251953f, 0.806152f, + 0.279053f, 0.780273f, 0.301758f, 0.756348f, 0.323975f, 0.733398f, 0.345215f, 0.711426f, + 0.364746f, 0.689453f, 0.384766f, 0.668945f, 0.401123f, 0.649902f, 0.419922f, 0.630371f, + 0.434570f, 0.612793f, 0.450439f, 0.595215f, 0.466064f, 0.578125f, 0.479736f, 0.561523f, + 0.493408f, 0.545898f, 0.505859f, 0.530762f, 0.519531f, 0.515625f, 0.532227f, 0.501465f, + 0.543945f, 0.487549f, 0.555664f, 0.473633f, 0.567383f, 0.460693f, 0.577148f, 0.447998f, + 0.586426f, 0.435791f, 0.597656f, 0.423096f, 0.606934f, 0.411621f, 0.617676f, 0.399414f, + 0.625488f, 0.388672f, 0.635254f, 0.377197f, 0.645020f, 0.366211f, 0.653809f, 0.355469f, + 0.660645f, 0.345459f, 0.670410f, 0.334961f, 0.676758f, 0.325684f, 0.687500f, 0.314941f, + 0.694336f, 0.305176f, 0.700195f, 0.296143f, 0.709473f, 0.286133f, 0.715332f, 0.277344f, + 0.721680f, 0.268555f, 0.729492f, 0.259766f, 0.735840f, 0.250977f, 0.743164f, 0.242432f, + 0.748047f, 0.234131f, 0.753906f, 0.225952f, 0.761230f, 0.217163f, 0.765137f, 0.208130f, + 0.770996f, 0.199341f, 0.776855f, 0.190063f, 0.781738f, 0.180908f, 0.786621f, 0.170898f, + 0.791992f, 0.160645f, 0.794922f, 0.150146f, 0.798828f, 0.138184f, 0.801758f, 0.125244f, + 0.802246f, 0.110352f, 0.802734f, 0.092957f, 0.802734f, 0.068115f, 0.788086f, 0.025894f, + 0.000000f, 1.000000f, 0.048248f, 0.977539f, 0.089661f, 0.949219f, 0.129028f, 0.918457f, + 0.165649f, 0.887695f, 0.196777f, 0.859375f, 0.229126f, 0.830078f, 0.257080f, 0.803223f, + 0.281494f, 0.777832f, 0.307129f, 0.752441f, 0.330322f, 0.729004f, 0.350830f, 0.706543f, + 0.372559f, 0.684570f, 0.390625f, 0.664062f, 0.409424f, 0.643555f, 0.427002f, 0.624512f, + 0.444336f, 0.605957f, 0.459717f, 0.587891f, 0.475098f, 0.570312f, 0.490234f, 0.553711f, + 0.504395f, 0.537109f, 0.518066f, 0.521484f, 0.531250f, 0.506348f, 0.543457f, 0.492188f, + 0.556152f, 0.477539f, 0.567383f, 0.463867f, 0.579590f, 0.449951f, 0.589844f, 0.437256f, + 0.601562f, 0.424072f, 0.611816f, 0.411621f, 0.621582f, 0.399414f, 0.630859f, 0.387939f, + 0.641602f, 0.375977f, 0.649902f, 0.364502f, 0.659668f, 0.353516f, 0.669922f, 0.342773f, + 0.677246f, 0.332031f, 0.686523f, 0.321289f, 0.694336f, 0.311523f, 0.700684f, 0.302246f, + 0.710938f, 0.291504f, 0.716797f, 0.282227f, 0.725586f, 0.272217f, 0.733398f, 0.262939f, + 0.738770f, 0.254639f, 0.746582f, 0.245239f, 0.752930f, 0.236694f, 0.760254f, 0.228027f, + 0.766602f, 0.219482f, 0.771973f, 0.211426f, 0.779785f, 0.202393f, 0.786133f, 0.194458f, + 0.790039f, 0.185669f, 0.795410f, 0.176270f, 0.800293f, 0.167847f, 0.806641f, 0.158081f, + 0.811035f, 0.147949f, 0.815918f, 0.138184f, 0.818848f, 0.127075f, 0.822266f, 0.114990f, + 0.825684f, 0.101196f, 0.826172f, 0.084473f, 0.824219f, 0.061249f, 0.814941f, 0.023315f, + 0.000000f, 1.000000f, 0.047913f, 0.977539f, 0.091736f, 0.947754f, 0.129639f, 0.918457f, + 0.166504f, 0.887207f, 0.200928f, 0.856934f, 0.230225f, 0.829102f, 0.259277f, 0.801270f, + 0.286621f, 0.774902f, 0.311279f, 0.749512f, 0.333740f, 0.726074f, 0.356201f, 0.702637f, + 0.377930f, 0.680176f, 0.397705f, 0.658691f, 0.416504f, 0.638184f, 0.434326f, 0.618652f, + 0.452881f, 0.598633f, 0.468506f, 0.580566f, 0.484863f, 0.562988f, 0.499023f, 0.545898f, + 0.514160f, 0.529297f, 0.527344f, 0.513184f, 0.541504f, 0.497559f, 0.555664f, 0.482178f, + 0.567383f, 0.467773f, 0.580566f, 0.453369f, 0.592285f, 0.439453f, 0.604492f, 0.426025f, + 0.614746f, 0.413330f, 0.624023f, 0.400635f, 0.635254f, 0.387695f, 0.645508f, 0.375732f, + 0.656250f, 0.363770f, 0.665527f, 0.352295f, 0.674316f, 0.340820f, 0.682617f, 0.330566f, + 0.692383f, 0.319092f, 0.701172f, 0.308594f, 0.710449f, 0.298096f, 0.716797f, 0.288818f, + 0.725098f, 0.278564f, 0.734863f, 0.268066f, 0.741211f, 0.259277f, 0.749512f, 0.249268f, + 0.756348f, 0.240356f, 0.764160f, 0.231201f, 0.770020f, 0.222534f, 0.776855f, 0.213989f, + 0.784180f, 0.205200f, 0.790527f, 0.197021f, 0.796387f, 0.189209f, 0.802246f, 0.180420f, + 0.809570f, 0.172363f, 0.814941f, 0.162964f, 0.818359f, 0.154907f, 0.825195f, 0.145508f, + 0.828613f, 0.136475f, 0.834473f, 0.126465f, 0.839355f, 0.115967f, 0.842285f, 0.104614f, + 0.844727f, 0.091492f, 0.847168f, 0.076538f, 0.847168f, 0.055756f, 0.838379f, 0.021713f, + 0.000000f, 1.000000f, 0.047516f, 0.978027f, 0.091431f, 0.948242f, 0.131836f, 0.916992f, + 0.168091f, 0.886230f, 0.200684f, 0.856934f, 0.234253f, 0.826660f, 0.262207f, 0.799316f, + 0.290771f, 0.771973f, 0.315918f, 0.746582f, 0.339844f, 0.722168f, 0.362061f, 0.698242f, + 0.384521f, 0.675293f, 0.404541f, 0.653320f, 0.424561f, 0.632324f, 0.442627f, 0.612305f, + 0.461670f, 0.592285f, 0.477783f, 0.573242f, 0.494629f, 0.555176f, 0.509766f, 0.537598f, + 0.524902f, 0.520508f, 0.540039f, 0.503906f, 0.553223f, 0.488525f, 0.566406f, 0.473145f, + 0.578613f, 0.458252f, 0.592285f, 0.443359f, 0.604492f, 0.428955f, 0.616699f, 0.415283f, + 0.626465f, 0.402100f, 0.639160f, 0.388672f, 0.649414f, 0.376465f, 0.659668f, 0.364014f, + 0.670410f, 0.351562f, 0.678223f, 0.340332f, 0.689941f, 0.328369f, 0.698730f, 0.317383f, + 0.708496f, 0.306396f, 0.716309f, 0.295898f, 0.725586f, 0.284912f, 0.732910f, 0.274902f, + 0.742676f, 0.264893f, 0.748535f, 0.255859f, 0.757812f, 0.245850f, 0.765625f, 0.235718f, + 0.771973f, 0.227051f, 0.781250f, 0.217163f, 0.787598f, 0.208740f, 0.793457f, 0.200439f, + 0.800293f, 0.191528f, 0.808105f, 0.183105f, 0.813965f, 0.175049f, 0.819824f, 0.166748f, + 0.825684f, 0.159058f, 0.833008f, 0.150391f, 0.836426f, 0.142334f, 0.842773f, 0.133301f, + 0.847168f, 0.124451f, 0.851562f, 0.115479f, 0.856934f, 0.105164f, 0.860840f, 0.094604f, + 0.864258f, 0.082886f, 0.865234f, 0.068848f, 0.868652f, 0.049683f, 0.861328f, 0.018021f, + 0.000000f, 1.000000f, 0.047729f, 0.978027f, 0.091614f, 0.948242f, 0.132446f, 0.916504f, + 0.169434f, 0.885742f, 0.204468f, 0.854492f, 0.235474f, 0.825195f, 0.265869f, 0.796875f, + 0.293701f, 0.769531f, 0.319580f, 0.743164f, 0.344971f, 0.717773f, 0.368408f, 0.693848f, + 0.390137f, 0.670410f, 0.411621f, 0.647949f, 0.432861f, 0.625977f, 0.452148f, 0.605469f, + 0.469238f, 0.585449f, 0.487305f, 0.566406f, 0.503906f, 0.547363f, 0.518555f, 0.529785f, + 0.533203f, 0.512695f, 0.547852f, 0.496094f, 0.563477f, 0.479492f, 0.577148f, 0.463623f, + 0.590820f, 0.448486f, 0.603027f, 0.433350f, 0.616211f, 0.419189f, 0.626953f, 0.405273f, + 0.640625f, 0.390869f, 0.651367f, 0.377930f, 0.663086f, 0.364502f, 0.673828f, 0.352051f, + 0.683594f, 0.340088f, 0.693359f, 0.327881f, 0.703125f, 0.316650f, 0.714355f, 0.304688f, + 0.723145f, 0.293701f, 0.730957f, 0.283203f, 0.740234f, 0.272705f, 0.750000f, 0.261719f, + 0.757324f, 0.252197f, 0.765625f, 0.241943f, 0.772461f, 0.232910f, 0.781250f, 0.223145f, + 0.788086f, 0.213745f, 0.796387f, 0.204346f, 0.803711f, 0.195190f, 0.810059f, 0.187012f, + 0.816895f, 0.178101f, 0.824219f, 0.169800f, 0.831543f, 0.161377f, 0.836426f, 0.153809f, + 0.842285f, 0.145996f, 0.848633f, 0.137939f, 0.855469f, 0.130127f, 0.860840f, 0.121704f, + 0.863770f, 0.113342f, 0.869629f, 0.104309f, 0.873535f, 0.095337f, 0.879395f, 0.084961f, + 0.881836f, 0.074402f, 0.885254f, 0.061340f, 0.886719f, 0.044281f, 0.882324f, 0.017151f, + 0.000000f, 1.000000f, 0.047424f, 0.978027f, 0.092041f, 0.947754f, 0.133057f, 0.916016f, + 0.170532f, 0.884766f, 0.205933f, 0.854004f, 0.238892f, 0.823730f, 0.269043f, 0.794434f, + 0.298340f, 0.766602f, 0.324463f, 0.740234f, 0.349365f, 0.714355f, 0.373779f, 0.689453f, + 0.397217f, 0.665527f, 0.419189f, 0.642090f, 0.438477f, 0.620605f, 0.459229f, 0.599121f, + 0.477295f, 0.578613f, 0.495605f, 0.559082f, 0.512695f, 0.540039f, 0.530273f, 0.521484f, + 0.545898f, 0.503418f, 0.561035f, 0.486572f, 0.575195f, 0.469727f, 0.590332f, 0.453369f, + 0.604004f, 0.437988f, 0.616699f, 0.423096f, 0.628906f, 0.408447f, 0.642090f, 0.393799f, + 0.652832f, 0.380127f, 0.665527f, 0.366455f, 0.676270f, 0.353271f, 0.686523f, 0.341064f, + 0.697266f, 0.328125f, 0.707520f, 0.316162f, 0.718262f, 0.304199f, 0.728516f, 0.292480f, + 0.736816f, 0.281738f, 0.747070f, 0.270264f, 0.754395f, 0.260010f, 0.764160f, 0.249512f, + 0.772461f, 0.239380f, 0.781738f, 0.229126f, 0.788574f, 0.219604f, 0.796387f, 0.210327f, + 0.802734f, 0.201416f, 0.811035f, 0.192017f, 0.819824f, 0.182495f, 0.826172f, 0.174072f, + 0.833984f, 0.165161f, 0.838379f, 0.157349f, 0.847656f, 0.148560f, 0.852051f, 0.141113f, + 0.858887f, 0.133179f, 0.864258f, 0.125366f, 0.871094f, 0.117981f, 0.875977f, 0.110535f, + 0.881348f, 0.102539f, 0.886230f, 0.093567f, 0.891113f, 0.085266f, 0.896484f, 0.076294f, + 0.899902f, 0.066223f, 0.901855f, 0.055237f, 0.906738f, 0.039246f, 0.902344f, 0.014061f, + 0.000000f, 1.000000f, 0.047272f, 0.978027f, 0.093018f, 0.947266f, 0.134399f, 0.915527f, + 0.172729f, 0.883301f, 0.207520f, 0.852539f, 0.241577f, 0.821777f, 0.272949f, 0.792480f, + 0.301270f, 0.764160f, 0.330811f, 0.735840f, 0.356689f, 0.709961f, 0.381592f, 0.684570f, + 0.404053f, 0.660156f, 0.426270f, 0.636719f, 0.447998f, 0.614258f, 0.467773f, 0.592773f, + 0.487549f, 0.571777f, 0.506348f, 0.551270f, 0.523438f, 0.531738f, 0.539551f, 0.513184f, + 0.556152f, 0.495361f, 0.570801f, 0.477783f, 0.585938f, 0.460693f, 0.601562f, 0.443848f, + 0.616211f, 0.427734f, 0.629883f, 0.412598f, 0.641602f, 0.397949f, 0.652832f, 0.383545f, + 0.666016f, 0.369141f, 0.678223f, 0.355225f, 0.690430f, 0.342041f, 0.701660f, 0.328857f, + 0.711914f, 0.316650f, 0.721680f, 0.304443f, 0.731445f, 0.292236f, 0.743164f, 0.280518f, + 0.752441f, 0.269043f, 0.759766f, 0.258789f, 0.770020f, 0.247437f, 0.779297f, 0.236938f, + 0.786621f, 0.227051f, 0.795410f, 0.217041f, 0.803223f, 0.207031f, 0.811523f, 0.197632f, + 0.818359f, 0.188477f, 0.826172f, 0.179688f, 0.834473f, 0.170288f, 0.841309f, 0.161865f, + 0.847656f, 0.153076f, 0.854492f, 0.144653f, 0.861816f, 0.136597f, 0.867188f, 0.128906f, + 0.874512f, 0.120544f, 0.879883f, 0.113647f, 0.885254f, 0.106201f, 0.890137f, 0.099121f, + 0.898926f, 0.090759f, 0.901367f, 0.085083f, 0.906250f, 0.075439f, 0.912109f, 0.066650f, + 0.916992f, 0.058655f, 0.919434f, 0.047668f, 0.922852f, 0.034393f, 0.922363f, 0.013527f, + 0.000000f, 1.000000f, 0.048004f, 0.977539f, 0.093628f, 0.946777f, 0.135254f, 0.915039f, + 0.174438f, 0.882324f, 0.210327f, 0.850586f, 0.244751f, 0.819336f, 0.275635f, 0.790039f, + 0.307129f, 0.760254f, 0.335449f, 0.732422f, 0.361816f, 0.706055f, 0.386719f, 0.680176f, + 0.410400f, 0.655273f, 0.432861f, 0.631836f, 0.455078f, 0.608398f, 0.475586f, 0.586426f, + 0.495605f, 0.564941f, 0.514160f, 0.544434f, 0.532227f, 0.524414f, 0.550781f, 0.504883f, + 0.567871f, 0.486328f, 0.583496f, 0.468750f, 0.598145f, 0.451416f, 0.612793f, 0.434570f, + 0.627441f, 0.418701f, 0.640625f, 0.402832f, 0.654297f, 0.387451f, 0.667480f, 0.372559f, + 0.679199f, 0.358398f, 0.690430f, 0.344727f, 0.703125f, 0.330566f, 0.713867f, 0.317627f, + 0.725586f, 0.305176f, 0.735352f, 0.292480f, 0.745605f, 0.280518f, 0.754883f, 0.268799f, + 0.766602f, 0.257080f, 0.774414f, 0.246582f, 0.782715f, 0.235718f, 0.792969f, 0.225342f, + 0.802246f, 0.214478f, 0.809570f, 0.204956f, 0.817383f, 0.195312f, 0.827148f, 0.185303f, + 0.833496f, 0.176147f, 0.841797f, 0.166870f, 0.848145f, 0.158325f, 0.854980f, 0.150269f, + 0.862305f, 0.141479f, 0.871094f, 0.132690f, 0.875488f, 0.124817f, 0.883789f, 0.116272f, + 0.887695f, 0.109802f, 0.895020f, 0.101440f, 0.901367f, 0.094666f, 0.906250f, 0.087646f, + 0.912109f, 0.080322f, 0.917969f, 0.073486f, 0.923340f, 0.066406f, 0.926270f, 0.058746f, + 0.930664f, 0.050201f, 0.935059f, 0.041504f, 0.938965f, 0.029541f, 0.938965f, 0.010628f, + 0.000000f, 1.000000f, 0.048798f, 0.977051f, 0.092773f, 0.947754f, 0.135986f, 0.914551f, + 0.175415f, 0.881836f, 0.212524f, 0.849121f, 0.247314f, 0.817871f, 0.280029f, 0.787109f, + 0.310059f, 0.758301f, 0.337646f, 0.729980f, 0.365479f, 0.702637f, 0.392090f, 0.675781f, + 0.417480f, 0.650391f, 0.441162f, 0.625977f, 0.461670f, 0.602539f, 0.485107f, 0.579590f, + 0.504883f, 0.557617f, 0.523438f, 0.536621f, 0.541992f, 0.516602f, 0.559082f, 0.497070f, + 0.576172f, 0.478271f, 0.592773f, 0.459961f, 0.609375f, 0.441895f, 0.625000f, 0.424561f, + 0.640137f, 0.408203f, 0.653809f, 0.392334f, 0.666016f, 0.377197f, 0.678711f, 0.362305f, + 0.691406f, 0.347900f, 0.703125f, 0.333496f, 0.716797f, 0.319336f, 0.727051f, 0.306641f, + 0.738770f, 0.293701f, 0.747559f, 0.281494f, 0.759277f, 0.269043f, 0.768555f, 0.257324f, + 0.781250f, 0.245239f, 0.787598f, 0.235229f, 0.797363f, 0.223877f, 0.807617f, 0.212891f, + 0.813965f, 0.203491f, 0.824219f, 0.192871f, 0.833984f, 0.182861f, 0.840332f, 0.173584f, + 0.847168f, 0.164795f, 0.855469f, 0.155518f, 0.863770f, 0.146118f, 0.869141f, 0.138306f, + 0.876465f, 0.130005f, 0.882812f, 0.122070f, 0.890137f, 0.113831f, 0.896484f, 0.105835f, + 0.903809f, 0.097900f, 0.908691f, 0.090881f, 0.914062f, 0.083740f, 0.920898f, 0.076721f, + 0.926270f, 0.069824f, 0.931152f, 0.063232f, 0.937012f, 0.056519f, 0.941895f, 0.049957f, + 0.946289f, 0.042999f, 0.950684f, 0.034088f, 0.955078f, 0.024399f, 0.956055f, 0.008232f, + 0.000000f, 1.000000f, 0.048370f, 0.977539f, 0.094666f, 0.946289f, 0.137939f, 0.913086f, + 0.176147f, 0.881348f, 0.214966f, 0.847656f, 0.251465f, 0.815430f, 0.282959f, 0.785156f, + 0.315186f, 0.754395f, 0.343750f, 0.726074f, 0.372559f, 0.697754f, 0.398926f, 0.670898f, + 0.424072f, 0.645020f, 0.449219f, 0.620117f, 0.470947f, 0.596191f, 0.493164f, 0.572754f, + 0.512695f, 0.550781f, 0.532227f, 0.529785f, 0.552246f, 0.508789f, 0.571289f, 0.488281f, + 0.588379f, 0.468994f, 0.604492f, 0.450684f, 0.621094f, 0.432617f, 0.636230f, 0.415527f, + 0.649902f, 0.398682f, 0.664062f, 0.382568f, 0.678223f, 0.366699f, 0.692383f, 0.351318f, + 0.704102f, 0.337158f, 0.716309f, 0.322754f, 0.728516f, 0.308838f, 0.740234f, 0.295410f, + 0.750977f, 0.282471f, 0.761719f, 0.270020f, 0.772949f, 0.257568f, 0.782715f, 0.245850f, + 0.792969f, 0.234375f, 0.801758f, 0.223389f, 0.811523f, 0.212280f, 0.820312f, 0.201660f, + 0.827637f, 0.191772f, 0.837891f, 0.181396f, 0.846680f, 0.171509f, 0.853027f, 0.162720f, + 0.862305f, 0.152954f, 0.868652f, 0.144287f, 0.875977f, 0.135620f, 0.882812f, 0.127197f, + 0.891113f, 0.118408f, 0.896973f, 0.110596f, 0.902832f, 0.102966f, 0.909180f, 0.095642f, + 0.916504f, 0.087952f, 0.923828f, 0.079956f, 0.928223f, 0.073242f, 0.934570f, 0.066040f, + 0.938965f, 0.059753f, 0.943848f, 0.053253f, 0.949707f, 0.046722f, 0.955078f, 0.040619f, + 0.960449f, 0.034271f, 0.965820f, 0.027802f, 0.969238f, 0.018631f, 0.970215f, 0.006660f, + 0.000000f, 1.000000f, 0.048035f, 0.977539f, 0.095276f, 0.946289f, 0.138306f, 0.913086f, + 0.178833f, 0.879395f, 0.217773f, 0.846191f, 0.253174f, 0.813965f, 0.286865f, 0.782227f, + 0.319092f, 0.751465f, 0.349854f, 0.722168f, 0.377686f, 0.693848f, 0.405029f, 0.666016f, + 0.430908f, 0.640137f, 0.455566f, 0.614746f, 0.478760f, 0.589844f, 0.500488f, 0.566406f, + 0.522949f, 0.543457f, 0.542480f, 0.521484f, 0.561035f, 0.500488f, 0.580078f, 0.480469f, + 0.598145f, 0.460693f, 0.614746f, 0.441895f, 0.630859f, 0.423828f, 0.646484f, 0.406250f, + 0.660156f, 0.389404f, 0.675781f, 0.372559f, 0.690918f, 0.356445f, 0.704102f, 0.341064f, + 0.717285f, 0.326416f, 0.729492f, 0.312012f, 0.741699f, 0.297852f, 0.752930f, 0.284912f, + 0.763672f, 0.271484f, 0.774902f, 0.258789f, 0.785645f, 0.246704f, 0.795898f, 0.234741f, + 0.805664f, 0.223145f, 0.816406f, 0.211548f, 0.823730f, 0.201294f, 0.833984f, 0.190308f, + 0.842773f, 0.179932f, 0.850098f, 0.170654f, 0.858398f, 0.160645f, 0.865723f, 0.151489f, + 0.874512f, 0.142456f, 0.882812f, 0.132935f, 0.888184f, 0.125122f, 0.895996f, 0.116394f, + 0.903809f, 0.108032f, 0.910645f, 0.100220f, 0.916504f, 0.092651f, 0.922852f, 0.084961f, + 0.930176f, 0.076965f, 0.935059f, 0.070496f, 0.940430f, 0.063599f, 0.944824f, 0.057953f, + 0.953125f, 0.049774f, 0.958496f, 0.043243f, 0.963867f, 0.036804f, 0.969238f, 0.030823f, + 0.973145f, 0.025299f, 0.978027f, 0.019104f, 0.982910f, 0.013573f, 0.985352f, 0.004253f, + 0.000000f, 1.000000f, 0.049408f, 0.977051f, 0.094910f, 0.946289f, 0.138184f, 0.913574f, + 0.179688f, 0.879395f, 0.220215f, 0.844727f, 0.255371f, 0.812012f, 0.289551f, 0.780762f, + 0.323242f, 0.749023f, 0.353760f, 0.719238f, 0.382324f, 0.690430f, 0.411377f, 0.661621f, + 0.439209f, 0.634277f, 0.461426f, 0.609375f, 0.487793f, 0.583496f, 0.508301f, 0.560059f, + 0.532227f, 0.536621f, 0.551758f, 0.514160f, 0.570801f, 0.492920f, 0.589844f, 0.472412f, + 0.608398f, 0.452393f, 0.625000f, 0.433105f, 0.641602f, 0.414551f, 0.657715f, 0.396729f, + 0.672852f, 0.379150f, 0.688477f, 0.362305f, 0.703613f, 0.346191f, 0.716309f, 0.331055f, + 0.729004f, 0.316406f, 0.739258f, 0.302246f, 0.753418f, 0.287354f, 0.766602f, 0.273193f, + 0.776367f, 0.261230f, 0.786621f, 0.248291f, 0.799316f, 0.235229f, 0.807617f, 0.224731f, + 0.817871f, 0.212280f, 0.829102f, 0.200684f, 0.835938f, 0.190674f, 0.846680f, 0.179321f, + 0.853516f, 0.170044f, 0.863770f, 0.159302f, 0.871582f, 0.150269f, 0.879883f, 0.140503f, + 0.888184f, 0.131592f, 0.895020f, 0.122803f, 0.902344f, 0.114258f, 0.908691f, 0.106384f, + 0.915527f, 0.098022f, 0.920898f, 0.090515f, 0.929199f, 0.082642f, 0.936523f, 0.074036f, + 0.939941f, 0.069031f, 0.948730f, 0.060455f, 0.952637f, 0.053833f, 0.958496f, 0.048523f, + 0.968262f, 0.038727f, 0.968262f, 0.035004f, 0.974121f, 0.030151f, 0.983887f, 0.019562f, + 0.983887f, 0.017029f, 0.983887f, 0.016098f, 0.999512f, 0.000947f, 0.999512f, 0.000007f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.995117f, + 0.000000f, 0.993652f, 0.000000f, 0.992188f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.982422f, 0.000000f, 0.979492f, + 0.000000f, 0.977539f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968750f, + 0.000000f, 0.964844f, 0.000000f, 0.961914f, 0.000000f, 0.958496f, 0.000000f, 0.954590f, + 0.000000f, 0.950684f, 0.000000f, 0.946289f, 0.000000f, 0.941406f, 0.000000f, 0.937012f, + 0.000000f, 0.932129f, 0.000000f, 0.927246f, 0.000000f, 0.920898f, 0.000000f, 0.915039f, + 0.000000f, 0.909180f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.889160f, + 0.000000f, 0.881348f, 0.000000f, 0.873047f, 0.000000f, 0.864746f, 0.000000f, 0.855469f, + 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825684f, 0.000000f, 0.814453f, + 0.000000f, 0.802246f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761719f, + 0.000000f, 0.745605f, 0.000000f, 0.729004f, 0.000000f, 0.709961f, 0.000000f, 0.691406f, + 0.000000f, 0.670898f, 0.000000f, 0.646973f, 0.000000f, 0.622070f, 0.000000f, 0.594238f, + 0.000000f, 0.564941f, 0.000000f, 0.529297f, 0.000000f, 0.489746f, 0.000000f, 0.445312f, + 0.000000f, 0.391113f, 0.000000f, 0.323730f, 0.000000f, 0.234131f, 0.000000f, 0.089417f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.998047f, 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.993652f, 0.000000f, 0.991699f, 0.000000f, 0.990234f, 0.000000f, 0.988770f, + 0.000000f, 0.986816f, 0.000000f, 0.984375f, 0.000000f, 0.981934f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.974609f, 0.000000f, 0.971680f, 0.000000f, 0.968262f, + 0.000000f, 0.965332f, 0.000000f, 0.961914f, 0.000000f, 0.958008f, 0.000000f, 0.954102f, + 0.000000f, 0.950195f, 0.000000f, 0.946289f, 0.000000f, 0.940918f, 0.000000f, 0.936523f, + 0.000000f, 0.932129f, 0.000000f, 0.926758f, 0.000000f, 0.920898f, 0.000000f, 0.915039f, + 0.000000f, 0.908691f, 0.000000f, 0.902344f, 0.000000f, 0.895996f, 0.000000f, 0.888672f, + 0.000000f, 0.880859f, 0.000000f, 0.872559f, 0.000000f, 0.864258f, 0.000000f, 0.854980f, + 0.000000f, 0.846191f, 0.000000f, 0.836426f, 0.000000f, 0.825195f, 0.000000f, 0.813965f, + 0.000000f, 0.801758f, 0.000000f, 0.789062f, 0.000000f, 0.775879f, 0.000000f, 0.761230f, + 0.000000f, 0.745117f, 0.000000f, 0.728516f, 0.000000f, 0.709961f, 0.000000f, 0.691406f, + 0.000002f, 0.670410f, 0.000005f, 0.646973f, 0.000007f, 0.622070f, 0.000007f, 0.594238f, + 0.000007f, 0.564941f, 0.000006f, 0.529297f, 0.000005f, 0.489990f, 0.000004f, 0.445557f, + 0.000004f, 0.391846f, 0.000003f, 0.324463f, 0.000002f, 0.234131f, 0.000001f, 0.089661f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, + 0.000000f, 0.993164f, 0.000000f, 0.991699f, 0.000000f, 0.989746f, 0.000000f, 0.988281f, + 0.000000f, 0.985840f, 0.000000f, 0.983887f, 0.000000f, 0.981445f, 0.000000f, 0.979492f, + 0.000000f, 0.976562f, 0.000000f, 0.974121f, 0.000000f, 0.971191f, 0.000000f, 0.967773f, + 0.000000f, 0.964844f, 0.000000f, 0.961426f, 0.000000f, 0.957520f, 0.000000f, 0.953613f, + 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, 0.000000f, 0.936035f, + 0.000004f, 0.931641f, 0.000008f, 0.926270f, 0.000015f, 0.920410f, 0.000021f, 0.914551f, + 0.000028f, 0.908203f, 0.000035f, 0.901855f, 0.000043f, 0.895020f, 0.000051f, 0.888184f, + 0.000058f, 0.880371f, 0.000067f, 0.872070f, 0.000075f, 0.863281f, 0.000079f, 0.854492f, + 0.000080f, 0.845215f, 0.000080f, 0.835449f, 0.000079f, 0.825195f, 0.000075f, 0.812988f, + 0.000073f, 0.801270f, 0.000069f, 0.789062f, 0.000065f, 0.774902f, 0.000060f, 0.760742f, + 0.000057f, 0.744629f, 0.000056f, 0.727539f, 0.000057f, 0.710449f, 0.000059f, 0.690918f, + 0.000057f, 0.669922f, 0.000052f, 0.646484f, 0.000048f, 0.621582f, 0.000049f, 0.593750f, + 0.000044f, 0.564453f, 0.000042f, 0.528809f, 0.000038f, 0.489502f, 0.000034f, 0.445312f, + 0.000030f, 0.391113f, 0.000026f, 0.323975f, 0.000019f, 0.233887f, 0.000008f, 0.089050f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997559f, 0.000000f, 0.996094f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, + 0.000000f, 0.992188f, 0.000009f, 0.991211f, 0.000024f, 0.989258f, 0.000037f, 0.987793f, + 0.000054f, 0.985840f, 0.000070f, 0.982910f, 0.000083f, 0.981445f, 0.000101f, 0.979004f, + 0.000117f, 0.976074f, 0.000130f, 0.973633f, 0.000143f, 0.970215f, 0.000160f, 0.967285f, + 0.000174f, 0.963867f, 0.000186f, 0.960938f, 0.000197f, 0.957031f, 0.000211f, 0.953125f, + 0.000225f, 0.949219f, 0.000237f, 0.944336f, 0.000247f, 0.939941f, 0.000256f, 0.935059f, + 0.000266f, 0.930176f, 0.000268f, 0.925293f, 0.000266f, 0.919434f, 0.000260f, 0.913574f, + 0.000252f, 0.907227f, 0.000244f, 0.900879f, 0.000238f, 0.894043f, 0.000236f, 0.887207f, + 0.000232f, 0.879395f, 0.000230f, 0.871094f, 0.000229f, 0.862793f, 0.000233f, 0.854004f, + 0.000238f, 0.844727f, 0.000242f, 0.834473f, 0.000234f, 0.823730f, 0.000230f, 0.812012f, + 0.000226f, 0.799805f, 0.000228f, 0.787598f, 0.000228f, 0.773926f, 0.000227f, 0.759766f, + 0.000212f, 0.743652f, 0.000209f, 0.726562f, 0.000208f, 0.709473f, 0.000208f, 0.690430f, + 0.000202f, 0.668945f, 0.000182f, 0.645508f, 0.000180f, 0.621094f, 0.000175f, 0.593750f, + 0.000169f, 0.563477f, 0.000148f, 0.528809f, 0.000142f, 0.489014f, 0.000134f, 0.445312f, + 0.000112f, 0.390869f, 0.000100f, 0.324219f, 0.000075f, 0.233398f, 0.000025f, 0.088928f, + 0.000000f, 1.000000f, 0.000054f, 0.999512f, 0.000113f, 0.999023f, 0.000167f, 0.998535f, + 0.000189f, 0.997070f, 0.000246f, 0.996094f, 0.000273f, 0.995117f, 0.000290f, 0.993652f, + 0.000325f, 0.992188f, 0.000354f, 0.990234f, 0.000372f, 0.988770f, 0.000384f, 0.986816f, + 0.000405f, 0.984863f, 0.000433f, 0.982422f, 0.000450f, 0.980469f, 0.000462f, 0.977539f, + 0.000470f, 0.975098f, 0.000484f, 0.972168f, 0.000509f, 0.969238f, 0.000523f, 0.965820f, + 0.000534f, 0.962891f, 0.000546f, 0.959473f, 0.000547f, 0.956055f, 0.000560f, 0.951660f, + 0.000568f, 0.947754f, 0.000567f, 0.942871f, 0.000567f, 0.938965f, 0.000565f, 0.934082f, + 0.000562f, 0.928711f, 0.000576f, 0.923828f, 0.000587f, 0.917969f, 0.000571f, 0.911621f, + 0.000574f, 0.905762f, 0.000578f, 0.899414f, 0.000585f, 0.893066f, 0.000604f, 0.885254f, + 0.000618f, 0.877930f, 0.000595f, 0.869629f, 0.000592f, 0.860840f, 0.000587f, 0.852051f, + 0.000584f, 0.843262f, 0.000597f, 0.833008f, 0.000576f, 0.822266f, 0.000570f, 0.810547f, + 0.000566f, 0.798828f, 0.000563f, 0.786133f, 0.000557f, 0.772949f, 0.000562f, 0.758301f, + 0.000527f, 0.742188f, 0.000520f, 0.726074f, 0.000510f, 0.708008f, 0.000502f, 0.688965f, + 0.000501f, 0.667969f, 0.000459f, 0.644531f, 0.000446f, 0.620117f, 0.000430f, 0.592773f, + 0.000426f, 0.562500f, 0.000376f, 0.528320f, 0.000356f, 0.488770f, 0.000336f, 0.444824f, + 0.000289f, 0.390869f, 0.000256f, 0.323975f, 0.000186f, 0.233765f, 0.000055f, 0.088806f, + 0.000000f, 1.000000f, 0.000290f, 0.999512f, 0.000479f, 0.998535f, 0.000458f, 0.997559f, + 0.000594f, 0.997070f, 0.000597f, 0.995605f, 0.000589f, 0.994629f, 0.000578f, 0.993164f, + 0.000700f, 0.991699f, 0.000701f, 0.989746f, 0.000705f, 0.987793f, 0.000717f, 0.986328f, + 0.000832f, 0.983887f, 0.000863f, 0.980957f, 0.000886f, 0.979492f, 0.000904f, 0.976562f, + 0.000924f, 0.973633f, 0.001012f, 0.970703f, 0.001016f, 0.967773f, 0.001011f, 0.964844f, + 0.001012f, 0.961426f, 0.000993f, 0.958008f, 0.000986f, 0.954102f, 0.001061f, 0.950195f, + 0.001078f, 0.945801f, 0.001095f, 0.941895f, 0.001074f, 0.936523f, 0.001083f, 0.932129f, + 0.001089f, 0.927246f, 0.001166f, 0.921387f, 0.001181f, 0.916016f, 0.001144f, 0.910156f, + 0.001142f, 0.903809f, 0.001140f, 0.897461f, 0.001143f, 0.890625f, 0.001197f, 0.883301f, + 0.001204f, 0.875488f, 0.001161f, 0.867188f, 0.001157f, 0.859375f, 0.001145f, 0.850098f, + 0.001142f, 0.841309f, 0.001189f, 0.831055f, 0.001193f, 0.820312f, 0.001132f, 0.808594f, + 0.001108f, 0.796387f, 0.001103f, 0.784668f, 0.001098f, 0.770996f, 0.001127f, 0.756348f, + 0.001060f, 0.740234f, 0.001034f, 0.724121f, 0.001017f, 0.706543f, 0.000998f, 0.687988f, + 0.001012f, 0.666504f, 0.000923f, 0.643066f, 0.000898f, 0.618652f, 0.000873f, 0.591797f, + 0.000868f, 0.561523f, 0.000779f, 0.527344f, 0.000734f, 0.487793f, 0.000689f, 0.444580f, + 0.000599f, 0.389893f, 0.000523f, 0.323730f, 0.000373f, 0.233398f, 0.000099f, 0.089417f, + 0.000000f, 1.000000f, 0.000400f, 0.999023f, 0.000689f, 0.998047f, 0.000645f, 0.997559f, + 0.000905f, 0.996094f, 0.000939f, 0.995117f, 0.000952f, 0.994141f, 0.000978f, 0.992676f, + 0.001211f, 0.990234f, 0.001227f, 0.988770f, 0.001247f, 0.986816f, 0.001269f, 0.985352f, + 0.001455f, 0.982422f, 0.001476f, 0.979980f, 0.001487f, 0.977539f, 0.001502f, 0.975098f, + 0.001516f, 0.973145f, 0.001651f, 0.968750f, 0.001658f, 0.966309f, 0.001681f, 0.962891f, + 0.001699f, 0.959961f, 0.001675f, 0.956055f, 0.001800f, 0.952148f, 0.001839f, 0.948242f, + 0.001871f, 0.943848f, 0.001901f, 0.939453f, 0.001863f, 0.935059f, 0.001866f, 0.929688f, + 0.001955f, 0.925293f, 0.001974f, 0.919434f, 0.001995f, 0.913574f, 0.002020f, 0.908203f, + 0.001972f, 0.901367f, 0.001980f, 0.895020f, 0.001961f, 0.888672f, 0.002048f, 0.880859f, + 0.002071f, 0.873535f, 0.002018f, 0.865234f, 0.002022f, 0.856445f, 0.001982f, 0.847656f, + 0.001980f, 0.838867f, 0.002050f, 0.828125f, 0.002064f, 0.817871f, 0.001986f, 0.806152f, + 0.001945f, 0.794434f, 0.001921f, 0.782227f, 0.001959f, 0.769043f, 0.001961f, 0.753906f, + 0.001888f, 0.738770f, 0.001832f, 0.722168f, 0.001790f, 0.704590f, 0.001757f, 0.686035f, + 0.001786f, 0.664551f, 0.001705f, 0.641602f, 0.001612f, 0.617188f, 0.001554f, 0.590820f, + 0.001547f, 0.560547f, 0.001420f, 0.525879f, 0.001320f, 0.487549f, 0.001236f, 0.444092f, + 0.001087f, 0.389893f, 0.000926f, 0.323975f, 0.000646f, 0.233643f, 0.000157f, 0.088928f, + 0.000000f, 1.000000f, 0.000587f, 0.999023f, 0.001062f, 0.998047f, 0.001081f, 0.997070f, + 0.001424f, 0.995605f, 0.001475f, 0.994141f, 0.001475f, 0.992676f, 0.001491f, 0.991699f, + 0.001861f, 0.989258f, 0.001906f, 0.987305f, 0.001948f, 0.985840f, 0.001966f, 0.983887f, + 0.002239f, 0.980957f, 0.002279f, 0.978516f, 0.002285f, 0.976074f, 0.002308f, 0.973633f, + 0.002323f, 0.971191f, 0.002596f, 0.967773f, 0.002604f, 0.963867f, 0.002636f, 0.960938f, + 0.002666f, 0.958008f, 0.002708f, 0.954102f, 0.002844f, 0.950195f, 0.002907f, 0.945801f, + 0.002932f, 0.941406f, 0.002943f, 0.937012f, 0.002970f, 0.932617f, 0.002930f, 0.928223f, + 0.003109f, 0.922363f, 0.003160f, 0.916992f, 0.003153f, 0.910645f, 0.003172f, 0.904785f, + 0.003120f, 0.898926f, 0.003136f, 0.892578f, 0.003147f, 0.885742f, 0.003265f, 0.877930f, + 0.003284f, 0.870117f, 0.003296f, 0.862305f, 0.003214f, 0.853516f, 0.003225f, 0.845215f, + 0.003166f, 0.835938f, 0.003283f, 0.825195f, 0.003279f, 0.814941f, 0.003195f, 0.803711f, + 0.003191f, 0.791992f, 0.003122f, 0.779785f, 0.003168f, 0.766113f, 0.003157f, 0.751953f, + 0.003057f, 0.736328f, 0.002977f, 0.719727f, 0.002920f, 0.702637f, 0.002855f, 0.684082f, + 0.002897f, 0.662598f, 0.002787f, 0.639648f, 0.002647f, 0.615234f, 0.002542f, 0.588867f, + 0.002527f, 0.559082f, 0.002344f, 0.524902f, 0.002171f, 0.486572f, 0.002010f, 0.443848f, + 0.001811f, 0.389404f, 0.001480f, 0.323242f, 0.001016f, 0.233276f, 0.000229f, 0.088867f, + 0.000000f, 1.000000f, 0.000327f, 0.999023f, 0.001012f, 0.997559f, 0.001468f, 0.996582f, + 0.001693f, 0.995117f, 0.002108f, 0.993164f, 0.002146f, 0.991699f, 0.002295f, 0.990234f, + 0.002686f, 0.988281f, 0.002760f, 0.986328f, 0.002800f, 0.984375f, 0.002920f, 0.982422f, + 0.003242f, 0.979004f, 0.003294f, 0.976562f, 0.003368f, 0.974121f, 0.003374f, 0.971680f, + 0.003489f, 0.968750f, 0.003803f, 0.965332f, 0.003891f, 0.961914f, 0.003895f, 0.958008f, + 0.003929f, 0.955078f, 0.003956f, 0.952148f, 0.004257f, 0.947266f, 0.004269f, 0.943359f, + 0.004345f, 0.938477f, 0.004395f, 0.934570f, 0.004387f, 0.929688f, 0.004433f, 0.924805f, + 0.004612f, 0.918945f, 0.004677f, 0.913574f, 0.004688f, 0.907715f, 0.004730f, 0.901855f, + 0.004765f, 0.895996f, 0.004665f, 0.889648f, 0.004887f, 0.882324f, 0.004883f, 0.874512f, + 0.004932f, 0.867188f, 0.004917f, 0.859375f, 0.004841f, 0.850586f, 0.004833f, 0.841797f, + 0.004807f, 0.832520f, 0.004986f, 0.821777f, 0.004955f, 0.811523f, 0.004833f, 0.800293f, + 0.004814f, 0.789062f, 0.004726f, 0.776855f, 0.004807f, 0.763184f, 0.004787f, 0.748535f, + 0.004654f, 0.732910f, 0.004623f, 0.717285f, 0.004509f, 0.700195f, 0.004387f, 0.681641f, + 0.004436f, 0.660156f, 0.004265f, 0.637695f, 0.004120f, 0.613770f, 0.003937f, 0.587891f, + 0.003866f, 0.557129f, 0.003656f, 0.523438f, 0.003355f, 0.485596f, 0.003040f, 0.442871f, + 0.002743f, 0.388428f, 0.002197f, 0.323486f, 0.001485f, 0.232666f, 0.000321f, 0.089050f, + 0.000000f, 1.000000f, 0.000594f, 0.999023f, 0.001543f, 0.997559f, 0.002008f, 0.996094f, + 0.002377f, 0.994141f, 0.002901f, 0.992188f, 0.002945f, 0.990723f, 0.003237f, 0.988770f, + 0.003736f, 0.986816f, 0.003828f, 0.984863f, 0.003881f, 0.982910f, 0.004097f, 0.979980f, + 0.004555f, 0.977539f, 0.004597f, 0.974609f, 0.004696f, 0.972168f, 0.004784f, 0.969727f, + 0.004951f, 0.966309f, 0.005341f, 0.962402f, 0.005440f, 0.958984f, 0.005455f, 0.956055f, + 0.005497f, 0.952148f, 0.005569f, 0.948730f, 0.005840f, 0.944824f, 0.006130f, 0.939453f, + 0.006111f, 0.935059f, 0.006203f, 0.930664f, 0.006264f, 0.926270f, 0.006260f, 0.921875f, + 0.006573f, 0.916016f, 0.006634f, 0.909668f, 0.006733f, 0.904297f, 0.006706f, 0.897949f, + 0.006767f, 0.892090f, 0.006645f, 0.885742f, 0.007000f, 0.878418f, 0.007069f, 0.870605f, + 0.007053f, 0.862793f, 0.007092f, 0.855469f, 0.007069f, 0.847168f, 0.006927f, 0.838379f, + 0.007217f, 0.829102f, 0.007172f, 0.818359f, 0.007126f, 0.808105f, 0.007095f, 0.797363f, + 0.006981f, 0.785645f, 0.006851f, 0.773438f, 0.007057f, 0.759766f, 0.006981f, 0.745117f, + 0.006924f, 0.729980f, 0.006699f, 0.713867f, 0.006546f, 0.697266f, 0.006569f, 0.678711f, + 0.006435f, 0.657227f, 0.006199f, 0.635254f, 0.005989f, 0.611328f, 0.005718f, 0.586426f, + 0.005638f, 0.555664f, 0.005310f, 0.521973f, 0.004852f, 0.484619f, 0.004410f, 0.442627f, + 0.003910f, 0.387695f, 0.003103f, 0.323486f, 0.002079f, 0.231812f, 0.000437f, 0.088501f, + 0.000000f, 1.000000f, 0.000842f, 0.999023f, 0.001601f, 0.997070f, 0.002188f, 0.995605f, + 0.003227f, 0.993164f, 0.003399f, 0.991699f, 0.003914f, 0.989746f, 0.004398f, 0.987305f, + 0.004604f, 0.985352f, 0.005123f, 0.982910f, 0.005222f, 0.980957f, 0.005692f, 0.978516f, + 0.005787f, 0.975586f, 0.006268f, 0.972168f, 0.006329f, 0.969727f, 0.006454f, 0.967285f, + 0.006855f, 0.963379f, 0.007244f, 0.959473f, 0.007401f, 0.956055f, 0.007504f, 0.952637f, + 0.007519f, 0.949219f, 0.007637f, 0.945312f, 0.007980f, 0.940430f, 0.008423f, 0.936523f, + 0.008354f, 0.931641f, 0.008461f, 0.927246f, 0.008560f, 0.922852f, 0.008690f, 0.917480f, + 0.009163f, 0.911621f, 0.009155f, 0.905762f, 0.009224f, 0.899902f, 0.009323f, 0.894043f, + 0.009277f, 0.888184f, 0.009407f, 0.882324f, 0.009659f, 0.874023f, 0.009796f, 0.866211f, + 0.009727f, 0.858398f, 0.009811f, 0.850586f, 0.009758f, 0.842773f, 0.009644f, 0.834961f, + 0.010002f, 0.824219f, 0.009933f, 0.813965f, 0.009964f, 0.803711f, 0.009933f, 0.792969f, + 0.009727f, 0.781250f, 0.009659f, 0.770020f, 0.009827f, 0.755371f, 0.009743f, 0.741211f, + 0.009651f, 0.726562f, 0.009392f, 0.710938f, 0.009132f, 0.694824f, 0.009201f, 0.675293f, + 0.009056f, 0.654297f, 0.008705f, 0.632812f, 0.008377f, 0.609375f, 0.007980f, 0.583984f, + 0.007843f, 0.553223f, 0.007362f, 0.520020f, 0.006710f, 0.483643f, 0.006084f, 0.441162f, + 0.005352f, 0.386963f, 0.004211f, 0.322510f, 0.002754f, 0.231689f, 0.000555f, 0.088196f, + 0.000000f, 1.000000f, 0.001199f, 0.998535f, 0.001856f, 0.997070f, 0.002905f, 0.995117f, + 0.003901f, 0.992676f, 0.004478f, 0.990723f, 0.005035f, 0.988770f, 0.005505f, 0.985840f, + 0.006081f, 0.983398f, 0.006638f, 0.980957f, 0.006805f, 0.979004f, 0.007263f, 0.976074f, + 0.007786f, 0.972656f, 0.008293f, 0.969727f, 0.008400f, 0.966797f, 0.008461f, 0.964355f, + 0.009155f, 0.959961f, 0.009377f, 0.956543f, 0.009758f, 0.952637f, 0.009972f, 0.949219f, + 0.010078f, 0.945801f, 0.010284f, 0.941406f, 0.010689f, 0.936523f, 0.011162f, 0.932129f, + 0.011368f, 0.927734f, 0.011230f, 0.923340f, 0.011398f, 0.918457f, 0.011879f, 0.913574f, + 0.012062f, 0.907227f, 0.012398f, 0.901367f, 0.012383f, 0.895508f, 0.012451f, 0.889648f, + 0.012566f, 0.883789f, 0.012810f, 0.876953f, 0.013092f, 0.869629f, 0.013123f, 0.861816f, + 0.013290f, 0.854492f, 0.013168f, 0.846191f, 0.013191f, 0.838379f, 0.013115f, 0.829590f, + 0.013580f, 0.819336f, 0.013618f, 0.809570f, 0.013489f, 0.799316f, 0.013374f, 0.788574f, + 0.013107f, 0.777344f, 0.013306f, 0.765137f, 0.013374f, 0.751465f, 0.013237f, 0.737305f, + 0.013016f, 0.722656f, 0.012726f, 0.707520f, 0.012398f, 0.691406f, 0.012527f, 0.671875f, + 0.012276f, 0.650879f, 0.011787f, 0.629883f, 0.011375f, 0.606934f, 0.010841f, 0.581543f, + 0.010605f, 0.551270f, 0.009911f, 0.518066f, 0.009056f, 0.481934f, 0.008156f, 0.439209f, + 0.007133f, 0.385986f, 0.005486f, 0.322266f, 0.003534f, 0.231201f, 0.000685f, 0.087402f, + 0.000000f, 1.000000f, 0.001122f, 0.998535f, 0.002628f, 0.996582f, 0.003237f, 0.994629f, + 0.004601f, 0.991699f, 0.005741f, 0.989258f, 0.005901f, 0.987305f, 0.007145f, 0.983887f, + 0.007790f, 0.980957f, 0.008018f, 0.979004f, 0.008659f, 0.976562f, 0.009377f, 0.973145f, + 0.010048f, 0.969727f, 0.010307f, 0.967285f, 0.010864f, 0.963867f, 0.011108f, 0.960449f, + 0.011986f, 0.956543f, 0.012207f, 0.952637f, 0.012863f, 0.949219f, 0.012848f, 0.945312f, + 0.013107f, 0.941895f, 0.013664f, 0.937012f, 0.014084f, 0.932129f, 0.014572f, 0.927246f, + 0.014801f, 0.922852f, 0.014999f, 0.918945f, 0.014900f, 0.914062f, 0.015617f, 0.907715f, + 0.015976f, 0.902344f, 0.016327f, 0.896484f, 0.016342f, 0.890625f, 0.016373f, 0.884766f, + 0.016434f, 0.878906f, 0.016968f, 0.871094f, 0.017136f, 0.863770f, 0.017426f, 0.856445f, + 0.017410f, 0.849121f, 0.017441f, 0.841309f, 0.017426f, 0.833496f, 0.017822f, 0.824219f, + 0.017883f, 0.813965f, 0.017944f, 0.803711f, 0.017868f, 0.793945f, 0.017822f, 0.783691f, + 0.017654f, 0.772949f, 0.017700f, 0.759766f, 0.017715f, 0.746582f, 0.017563f, 0.732422f, + 0.017349f, 0.718262f, 0.016953f, 0.703613f, 0.016571f, 0.687500f, 0.016663f, 0.667480f, + 0.016159f, 0.647461f, 0.015793f, 0.626465f, 0.015045f, 0.604492f, 0.014397f, 0.578613f, + 0.013908f, 0.548340f, 0.012947f, 0.516113f, 0.011795f, 0.480469f, 0.010681f, 0.437744f, + 0.009186f, 0.385010f, 0.007019f, 0.322510f, 0.004486f, 0.231201f, 0.000840f, 0.086182f, + 0.000000f, 1.000000f, 0.001562f, 0.998535f, 0.003016f, 0.996094f, 0.003725f, 0.994629f, + 0.005463f, 0.990723f, 0.006287f, 0.988770f, 0.007427f, 0.985840f, 0.008575f, 0.982422f, + 0.009804f, 0.979492f, 0.010109f, 0.977051f, 0.010483f, 0.974121f, 0.011909f, 0.969727f, + 0.012657f, 0.966309f, 0.013023f, 0.963867f, 0.013741f, 0.960449f, 0.014297f, 0.956543f, + 0.014893f, 0.952637f, 0.015625f, 0.948730f, 0.015854f, 0.944824f, 0.016586f, 0.941406f, + 0.016937f, 0.937012f, 0.017578f, 0.932129f, 0.018219f, 0.927246f, 0.018372f, 0.922852f, + 0.018921f, 0.917969f, 0.019180f, 0.913574f, 0.019669f, 0.908691f, 0.020218f, 0.902344f, + 0.020538f, 0.896484f, 0.021225f, 0.891113f, 0.021149f, 0.885254f, 0.021286f, 0.879395f, + 0.021515f, 0.872559f, 0.022141f, 0.865234f, 0.022308f, 0.857910f, 0.022522f, 0.850586f, + 0.022629f, 0.843262f, 0.022736f, 0.835938f, 0.022537f, 0.827637f, 0.023331f, 0.817871f, + 0.023315f, 0.808105f, 0.023376f, 0.798340f, 0.023117f, 0.788574f, 0.023041f, 0.778320f, + 0.022858f, 0.768066f, 0.023010f, 0.754395f, 0.023224f, 0.741211f, 0.022888f, 0.727539f, + 0.022522f, 0.713867f, 0.021866f, 0.699219f, 0.021835f, 0.682617f, 0.021667f, 0.663086f, + 0.021057f, 0.643555f, 0.020325f, 0.623535f, 0.019501f, 0.601562f, 0.018707f, 0.575195f, + 0.017914f, 0.545410f, 0.016632f, 0.514160f, 0.015022f, 0.479492f, 0.013664f, 0.435791f, + 0.011627f, 0.384521f, 0.008766f, 0.322266f, 0.005531f, 0.230347f, 0.001017f, 0.085449f, + 0.000000f, 1.000000f, 0.001565f, 0.998535f, 0.003548f, 0.996094f, 0.004803f, 0.993652f, + 0.006626f, 0.989746f, 0.007435f, 0.987793f, 0.008812f, 0.984375f, 0.010437f, 0.979980f, + 0.011238f, 0.977051f, 0.012505f, 0.974121f, 0.013237f, 0.970703f, 0.014847f, 0.966797f, + 0.015343f, 0.963379f, 0.016144f, 0.959961f, 0.016541f, 0.957031f, 0.018036f, 0.952148f, + 0.018906f, 0.948242f, 0.019608f, 0.944336f, 0.019928f, 0.940430f, 0.020584f, 0.936523f, + 0.021576f, 0.931641f, 0.022156f, 0.926758f, 0.022903f, 0.921387f, 0.023300f, 0.917480f, + 0.023849f, 0.913086f, 0.024063f, 0.908203f, 0.025177f, 0.902344f, 0.026001f, 0.896484f, + 0.026001f, 0.890137f, 0.026688f, 0.884766f, 0.027115f, 0.879395f, 0.026993f, 0.873535f, + 0.027878f, 0.866211f, 0.028305f, 0.858887f, 0.028580f, 0.852051f, 0.029007f, 0.844238f, + 0.028885f, 0.836914f, 0.028793f, 0.830078f, 0.029510f, 0.821289f, 0.029755f, 0.811523f, + 0.030136f, 0.802246f, 0.030014f, 0.792480f, 0.029861f, 0.782715f, 0.029663f, 0.772949f, + 0.029831f, 0.762207f, 0.029831f, 0.748535f, 0.029739f, 0.735840f, 0.029343f, 0.722656f, + 0.028915f, 0.709473f, 0.028275f, 0.694824f, 0.028061f, 0.677246f, 0.027786f, 0.658691f, + 0.027008f, 0.639648f, 0.026138f, 0.620117f, 0.024826f, 0.598633f, 0.023987f, 0.571777f, + 0.022766f, 0.542969f, 0.020981f, 0.512207f, 0.019073f, 0.478027f, 0.017105f, 0.434082f, + 0.014404f, 0.382812f, 0.010895f, 0.322510f, 0.006779f, 0.230347f, 0.001223f, 0.084961f, + 0.000000f, 1.000000f, 0.001669f, 0.998535f, 0.003778f, 0.995605f, 0.005211f, 0.992676f, + 0.007935f, 0.988770f, 0.009338f, 0.985840f, 0.010193f, 0.982422f, 0.012466f, 0.978027f, + 0.013901f, 0.974609f, 0.014366f, 0.972168f, 0.016434f, 0.966797f, 0.017426f, 0.963379f, + 0.018829f, 0.959473f, 0.019730f, 0.956055f, 0.020538f, 0.952148f, 0.021805f, 0.947754f, + 0.023224f, 0.943359f, 0.024200f, 0.939453f, 0.024612f, 0.935547f, 0.025192f, 0.931152f, + 0.026642f, 0.925781f, 0.027664f, 0.920898f, 0.028488f, 0.916016f, 0.028809f, 0.911621f, + 0.029770f, 0.907227f, 0.030457f, 0.901367f, 0.031464f, 0.895508f, 0.032318f, 0.889648f, + 0.032562f, 0.884277f, 0.033112f, 0.878418f, 0.033478f, 0.872559f, 0.034363f, 0.866699f, + 0.034698f, 0.858398f, 0.035614f, 0.852051f, 0.035736f, 0.844727f, 0.036346f, 0.837891f, + 0.036469f, 0.831055f, 0.036346f, 0.823242f, 0.037079f, 0.813477f, 0.037598f, 0.804688f, + 0.037933f, 0.795410f, 0.037476f, 0.786133f, 0.037415f, 0.776855f, 0.037231f, 0.767578f, + 0.037598f, 0.754883f, 0.037354f, 0.742188f, 0.037262f, 0.729492f, 0.036743f, 0.717285f, + 0.036316f, 0.704102f, 0.035858f, 0.689941f, 0.035431f, 0.671387f, 0.034821f, 0.653809f, + 0.033936f, 0.635742f, 0.032593f, 0.616211f, 0.030960f, 0.595215f, 0.030136f, 0.568359f, + 0.028427f, 0.539551f, 0.026245f, 0.509766f, 0.023666f, 0.476562f, 0.021240f, 0.431885f, + 0.017776f, 0.381836f, 0.013306f, 0.322021f, 0.008209f, 0.230225f, 0.001459f, 0.084290f, + 0.000000f, 1.000000f, 0.001827f, 0.998535f, 0.005047f, 0.994629f, 0.007000f, 0.991211f, + 0.009064f, 0.987793f, 0.010567f, 0.984375f, 0.012871f, 0.979980f, 0.014038f, 0.976562f, + 0.016022f, 0.972656f, 0.017563f, 0.968750f, 0.019684f, 0.963379f, 0.021286f, 0.959473f, + 0.022369f, 0.955566f, 0.023438f, 0.952148f, 0.025162f, 0.946777f, 0.026611f, 0.942383f, + 0.028183f, 0.937988f, 0.028885f, 0.934082f, 0.029938f, 0.930664f, 0.031235f, 0.925293f, + 0.032684f, 0.919434f, 0.033630f, 0.914551f, 0.034729f, 0.909668f, 0.035248f, 0.905762f, + 0.035797f, 0.900391f, 0.037567f, 0.894043f, 0.038605f, 0.888184f, 0.039307f, 0.882812f, + 0.040070f, 0.876953f, 0.040314f, 0.872070f, 0.041016f, 0.865723f, 0.042450f, 0.858398f, + 0.043365f, 0.851562f, 0.043488f, 0.843750f, 0.044189f, 0.837402f, 0.044525f, 0.830566f, + 0.044647f, 0.824219f, 0.045227f, 0.814941f, 0.045959f, 0.805664f, 0.046387f, 0.796875f, + 0.046204f, 0.788574f, 0.046539f, 0.779785f, 0.046204f, 0.770508f, 0.046387f, 0.759766f, + 0.046570f, 0.747559f, 0.046509f, 0.735840f, 0.046204f, 0.723145f, 0.045837f, 0.711426f, + 0.044891f, 0.699219f, 0.044495f, 0.683594f, 0.043854f, 0.666016f, 0.043121f, 0.648926f, + 0.041809f, 0.631348f, 0.040222f, 0.612793f, 0.038391f, 0.590332f, 0.037079f, 0.564453f, + 0.034943f, 0.537109f, 0.032379f, 0.507812f, 0.028885f, 0.475342f, 0.025864f, 0.429688f, + 0.021500f, 0.380615f, 0.015945f, 0.321777f, 0.009758f, 0.229370f, 0.001731f, 0.083496f, + 0.000000f, 1.000000f, 0.002783f, 0.997559f, 0.005577f, 0.994141f, 0.007812f, 0.990723f, + 0.010483f, 0.986816f, 0.012062f, 0.983398f, 0.014725f, 0.978027f, 0.017319f, 0.973633f, + 0.018478f, 0.969727f, 0.020584f, 0.965332f, 0.023178f, 0.959961f, 0.025238f, 0.955566f, + 0.026505f, 0.951660f, 0.027969f, 0.947266f, 0.030487f, 0.941406f, 0.032104f, 0.936523f, + 0.033356f, 0.932617f, 0.034607f, 0.928223f, 0.036163f, 0.923828f, 0.037964f, 0.917969f, + 0.039307f, 0.913086f, 0.040588f, 0.907715f, 0.041443f, 0.903320f, 0.042419f, 0.898438f, + 0.044098f, 0.892578f, 0.045685f, 0.886230f, 0.046814f, 0.880371f, 0.047333f, 0.875000f, + 0.048370f, 0.869629f, 0.048828f, 0.864258f, 0.050385f, 0.856934f, 0.051239f, 0.849609f, + 0.052368f, 0.843262f, 0.053314f, 0.836426f, 0.053040f, 0.829590f, 0.054077f, 0.823730f, + 0.054504f, 0.814941f, 0.055359f, 0.806641f, 0.055878f, 0.797852f, 0.056152f, 0.789062f, + 0.056152f, 0.781250f, 0.056274f, 0.772461f, 0.056000f, 0.763184f, 0.056763f, 0.751465f, + 0.056610f, 0.740234f, 0.056488f, 0.729004f, 0.056030f, 0.717285f, 0.055145f, 0.705566f, + 0.054169f, 0.692871f, 0.054047f, 0.676758f, 0.053192f, 0.660156f, 0.052032f, 0.643555f, + 0.050323f, 0.626465f, 0.048279f, 0.608398f, 0.046814f, 0.585449f, 0.044647f, 0.560059f, + 0.042236f, 0.533691f, 0.038666f, 0.505371f, 0.034912f, 0.472412f, 0.031082f, 0.427734f, + 0.025772f, 0.380371f, 0.019012f, 0.321777f, 0.011581f, 0.229980f, 0.002018f, 0.082336f, + 0.000000f, 1.000000f, 0.003298f, 0.997070f, 0.006264f, 0.993652f, 0.008881f, 0.989746f, + 0.012100f, 0.985352f, 0.014313f, 0.981445f, 0.017776f, 0.975586f, 0.019714f, 0.971191f, + 0.021927f, 0.967285f, 0.024277f, 0.961426f, 0.027039f, 0.956055f, 0.029388f, 0.951660f, + 0.031143f, 0.947266f, 0.033844f, 0.941406f, 0.035645f, 0.936035f, 0.037964f, 0.930664f, + 0.039337f, 0.926270f, 0.040619f, 0.922363f, 0.043152f, 0.916016f, 0.045349f, 0.910156f, + 0.046814f, 0.905273f, 0.048218f, 0.900879f, 0.049377f, 0.896484f, 0.051117f, 0.889648f, + 0.052612f, 0.883301f, 0.054382f, 0.877930f, 0.055756f, 0.872070f, 0.056580f, 0.867188f, + 0.057404f, 0.861816f, 0.058929f, 0.854980f, 0.060638f, 0.847656f, 0.061646f, 0.841309f, + 0.062225f, 0.834473f, 0.063354f, 0.828125f, 0.063660f, 0.822266f, 0.064331f, 0.814453f, + 0.065979f, 0.806152f, 0.066284f, 0.797363f, 0.066406f, 0.789062f, 0.067322f, 0.781250f, + 0.067139f, 0.773926f, 0.067078f, 0.765625f, 0.067383f, 0.753906f, 0.067688f, 0.743164f, + 0.067749f, 0.732910f, 0.067383f, 0.721680f, 0.066528f, 0.710938f, 0.065735f, 0.699707f, + 0.065247f, 0.685059f, 0.064880f, 0.669922f, 0.063538f, 0.654297f, 0.062073f, 0.638184f, + 0.059814f, 0.622070f, 0.057617f, 0.604492f, 0.056122f, 0.580566f, 0.052917f, 0.555664f, + 0.049835f, 0.530762f, 0.045776f, 0.502930f, 0.041260f, 0.468262f, 0.036835f, 0.425781f, + 0.030258f, 0.379150f, 0.022263f, 0.322021f, 0.013573f, 0.229248f, 0.002316f, 0.081360f, + 0.000000f, 1.000000f, 0.003561f, 0.997070f, 0.007156f, 0.993164f, 0.010612f, 0.988281f, + 0.014122f, 0.983887f, 0.016617f, 0.979004f, 0.020523f, 0.973145f, 0.023422f, 0.968262f, + 0.025726f, 0.963867f, 0.029572f, 0.957031f, 0.031586f, 0.951660f, 0.034027f, 0.947266f, + 0.036560f, 0.941895f, 0.039612f, 0.935059f, 0.042511f, 0.929688f, 0.044067f, 0.924805f, + 0.046448f, 0.920410f, 0.048859f, 0.914062f, 0.050842f, 0.908203f, 0.053650f, 0.902344f, + 0.055206f, 0.897461f, 0.056335f, 0.893066f, 0.058716f, 0.887207f, 0.061005f, 0.880859f, + 0.062408f, 0.874512f, 0.063965f, 0.868652f, 0.065552f, 0.863770f, 0.066467f, 0.858887f, + 0.068359f, 0.852051f, 0.069702f, 0.844727f, 0.071289f, 0.838379f, 0.072754f, 0.832031f, + 0.073669f, 0.825684f, 0.074219f, 0.819336f, 0.075256f, 0.812988f, 0.076050f, 0.804199f, + 0.077515f, 0.795898f, 0.078308f, 0.788574f, 0.078613f, 0.780762f, 0.078796f, 0.772949f, + 0.078918f, 0.766113f, 0.080017f, 0.755859f, 0.080200f, 0.745117f, 0.080139f, 0.734863f, + 0.080078f, 0.724609f, 0.079163f, 0.714355f, 0.078430f, 0.704590f, 0.077454f, 0.691406f, + 0.077209f, 0.677734f, 0.076233f, 0.662598f, 0.074829f, 0.648926f, 0.072632f, 0.632812f, + 0.070129f, 0.617676f, 0.067993f, 0.597656f, 0.065552f, 0.575195f, 0.062286f, 0.551758f, + 0.057983f, 0.526855f, 0.053223f, 0.500977f, 0.048401f, 0.464600f, 0.042664f, 0.423828f, + 0.035034f, 0.377930f, 0.025772f, 0.319092f, 0.015602f, 0.228149f, 0.002670f, 0.080383f, + 0.000000f, 1.000000f, 0.004112f, 0.996582f, 0.008255f, 0.992676f, 0.012413f, 0.986816f, + 0.016052f, 0.982422f, 0.019943f, 0.976074f, 0.023285f, 0.970703f, 0.026810f, 0.965820f, + 0.030579f, 0.958496f, 0.033691f, 0.953125f, 0.037384f, 0.947266f, 0.039032f, 0.942871f, + 0.043030f, 0.935059f, 0.046204f, 0.929199f, 0.049713f, 0.923340f, 0.051880f, 0.918457f, + 0.054718f, 0.912109f, 0.057709f, 0.905273f, 0.059967f, 0.899414f, 0.061676f, 0.894531f, + 0.064148f, 0.889160f, 0.066162f, 0.883789f, 0.068848f, 0.876953f, 0.071350f, 0.871094f, + 0.073486f, 0.865234f, 0.074829f, 0.859863f, 0.075806f, 0.854980f, 0.078308f, 0.848145f, + 0.080627f, 0.841309f, 0.082092f, 0.833984f, 0.083191f, 0.828125f, 0.084839f, 0.822266f, + 0.085815f, 0.816406f, 0.086609f, 0.810059f, 0.088196f, 0.801270f, 0.089783f, 0.793945f, + 0.090210f, 0.786133f, 0.091125f, 0.778809f, 0.091736f, 0.771973f, 0.091553f, 0.764648f, + 0.092224f, 0.754883f, 0.093079f, 0.745117f, 0.093140f, 0.735352f, 0.093201f, 0.726562f, + 0.092651f, 0.716797f, 0.091797f, 0.707520f, 0.091370f, 0.696777f, 0.090515f, 0.682617f, + 0.089661f, 0.669434f, 0.088318f, 0.655762f, 0.086060f, 0.642578f, 0.084045f, 0.627930f, + 0.081116f, 0.611816f, 0.079163f, 0.591797f, 0.075562f, 0.569824f, 0.072144f, 0.548340f, + 0.067139f, 0.524414f, 0.061523f, 0.499268f, 0.056396f, 0.461914f, 0.049164f, 0.421631f, + 0.040161f, 0.376953f, 0.030151f, 0.317139f, 0.017792f, 0.228027f, 0.003069f, 0.079773f, + 0.000000f, 1.000000f, 0.005325f, 0.996094f, 0.009186f, 0.992188f, 0.014565f, 0.985840f, + 0.018402f, 0.980469f, 0.023132f, 0.973633f, 0.027496f, 0.967285f, 0.030396f, 0.962402f, + 0.035278f, 0.954590f, 0.039673f, 0.948242f, 0.042419f, 0.942871f, 0.046692f, 0.935547f, + 0.050446f, 0.928223f, 0.053772f, 0.922363f, 0.056091f, 0.917480f, 0.060211f, 0.910645f, + 0.064026f, 0.902832f, 0.067261f, 0.896484f, 0.070068f, 0.891113f, 0.071838f, 0.885742f, + 0.073975f, 0.880371f, 0.078003f, 0.872559f, 0.080627f, 0.866699f, 0.082458f, 0.860840f, + 0.085022f, 0.855469f, 0.086670f, 0.851074f, 0.088562f, 0.843262f, 0.091431f, 0.835938f, + 0.093506f, 0.830078f, 0.095276f, 0.823730f, 0.096313f, 0.818359f, 0.097229f, 0.812500f, + 0.099304f, 0.806152f, 0.100830f, 0.797363f, 0.102783f, 0.790039f, 0.103333f, 0.782715f, + 0.104858f, 0.776367f, 0.104614f, 0.769043f, 0.105286f, 0.763184f, 0.106323f, 0.753418f, + 0.106995f, 0.744141f, 0.107483f, 0.734863f, 0.107544f, 0.726074f, 0.106689f, 0.717285f, + 0.106262f, 0.708984f, 0.104980f, 0.699707f, 0.105103f, 0.686035f, 0.104309f, 0.673828f, + 0.102844f, 0.661621f, 0.100952f, 0.648926f, 0.098694f, 0.636230f, 0.095947f, 0.623047f, + 0.093689f, 0.604492f, 0.090698f, 0.584961f, 0.086853f, 0.565430f, 0.082336f, 0.544434f, + 0.076477f, 0.521973f, 0.070312f, 0.493408f, 0.064026f, 0.458008f, 0.056061f, 0.419922f, + 0.045807f, 0.376953f, 0.034241f, 0.314941f, 0.020111f, 0.228149f, 0.003462f, 0.079407f, + 0.000000f, 1.000000f, 0.005852f, 0.995605f, 0.010582f, 0.991211f, 0.016800f, 0.984375f, + 0.021683f, 0.978027f, 0.027328f, 0.970703f, 0.031464f, 0.964355f, 0.037018f, 0.957031f, + 0.041718f, 0.949707f, 0.045441f, 0.943359f, 0.049408f, 0.937012f, 0.054260f, 0.928711f, + 0.058807f, 0.921387f, 0.062225f, 0.915527f, 0.065979f, 0.909180f, 0.069702f, 0.901367f, + 0.074585f, 0.894043f, 0.077026f, 0.888184f, 0.080322f, 0.882324f, 0.083740f, 0.875488f, + 0.086914f, 0.868164f, 0.090393f, 0.861816f, 0.092834f, 0.855469f, 0.095032f, 0.850586f, + 0.096741f, 0.845703f, 0.100525f, 0.837891f, 0.103394f, 0.831055f, 0.105347f, 0.824219f, + 0.107239f, 0.818359f, 0.109253f, 0.812988f, 0.110413f, 0.807617f, 0.112305f, 0.800293f, + 0.114746f, 0.791992f, 0.116638f, 0.785645f, 0.117371f, 0.778320f, 0.118530f, 0.772461f, + 0.119019f, 0.766113f, 0.119690f, 0.760254f, 0.120850f, 0.750488f, 0.122131f, 0.741699f, + 0.121765f, 0.733398f, 0.122681f, 0.725098f, 0.122437f, 0.717285f, 0.121521f, 0.709473f, + 0.120728f, 0.700195f, 0.120483f, 0.688477f, 0.120422f, 0.677246f, 0.118835f, 0.666016f, + 0.116638f, 0.653809f, 0.114502f, 0.642578f, 0.111633f, 0.630859f, 0.108765f, 0.614258f, + 0.106445f, 0.596680f, 0.102844f, 0.579102f, 0.098145f, 0.560059f, 0.092346f, 0.540039f, + 0.085815f, 0.519531f, 0.079895f, 0.488037f, 0.072266f, 0.454590f, 0.062988f, 0.418213f, + 0.051239f, 0.376709f, 0.038727f, 0.312744f, 0.022507f, 0.227539f, 0.003885f, 0.078247f, + 0.000000f, 1.000000f, 0.007130f, 0.995117f, 0.013252f, 0.988770f, 0.019928f, 0.982422f, + 0.025421f, 0.974609f, 0.031860f, 0.967773f, 0.036316f, 0.960938f, 0.043030f, 0.951660f, + 0.048309f, 0.944824f, 0.052460f, 0.938477f, 0.058411f, 0.928711f, 0.063599f, 0.921387f, + 0.067261f, 0.914551f, 0.071167f, 0.908203f, 0.076721f, 0.898926f, 0.081360f, 0.891602f, + 0.084412f, 0.885742f, 0.088318f, 0.879395f, 0.092712f, 0.871094f, 0.097046f, 0.863770f, + 0.100891f, 0.856445f, 0.103210f, 0.850586f, 0.105957f, 0.845215f, 0.108948f, 0.839355f, + 0.112183f, 0.831543f, 0.115601f, 0.824707f, 0.118591f, 0.818359f, 0.120361f, 0.812988f, + 0.121704f, 0.807129f, 0.123474f, 0.801758f, 0.126709f, 0.793457f, 0.129028f, 0.786621f, + 0.130737f, 0.779785f, 0.131958f, 0.773438f, 0.133667f, 0.767578f, 0.133911f, 0.761719f, + 0.135132f, 0.754883f, 0.137085f, 0.745605f, 0.137451f, 0.737793f, 0.138062f, 0.729980f, + 0.138794f, 0.723145f, 0.138062f, 0.715332f, 0.137207f, 0.708008f, 0.137085f, 0.699219f, + 0.137329f, 0.688477f, 0.136475f, 0.677734f, 0.135376f, 0.667480f, 0.133179f, 0.657227f, + 0.130859f, 0.646484f, 0.128174f, 0.636230f, 0.125610f, 0.622070f, 0.123047f, 0.605957f, + 0.119141f, 0.589355f, 0.114807f, 0.572754f, 0.109802f, 0.555664f, 0.103394f, 0.537598f, + 0.096680f, 0.512207f, 0.089478f, 0.482910f, 0.080872f, 0.451660f, 0.069946f, 0.416748f, + 0.056976f, 0.376709f, 0.043182f, 0.310059f, 0.025070f, 0.227783f, 0.004345f, 0.077881f, + 0.000000f, 1.000000f, 0.008400f, 0.994629f, 0.015465f, 0.987793f, 0.022263f, 0.980957f, + 0.030548f, 0.971191f, 0.036316f, 0.964355f, 0.043182f, 0.955078f, 0.049866f, 0.946777f, + 0.054840f, 0.939941f, 0.061798f, 0.929688f, 0.067383f, 0.921387f, 0.073120f, 0.914062f, + 0.077820f, 0.906738f, 0.084167f, 0.896973f, 0.088623f, 0.889160f, 0.093201f, 0.882324f, + 0.097534f, 0.875977f, 0.101990f, 0.867188f, 0.106934f, 0.859375f, 0.110901f, 0.852051f, + 0.114319f, 0.845703f, 0.117432f, 0.839844f, 0.121460f, 0.831543f, 0.125000f, 0.824707f, + 0.128906f, 0.817383f, 0.131470f, 0.811523f, 0.134399f, 0.806152f, 0.135864f, 0.801270f, + 0.139160f, 0.793457f, 0.141602f, 0.786133f, 0.144043f, 0.779297f, 0.146240f, 0.773438f, + 0.147827f, 0.767578f, 0.148926f, 0.761719f, 0.149780f, 0.756348f, 0.151733f, 0.747559f, + 0.153198f, 0.740234f, 0.154663f, 0.732910f, 0.154785f, 0.726074f, 0.155029f, 0.719238f, + 0.154785f, 0.712402f, 0.153198f, 0.706543f, 0.154541f, 0.695801f, 0.154541f, 0.686523f, + 0.153931f, 0.676758f, 0.152588f, 0.667480f, 0.150635f, 0.658691f, 0.148682f, 0.649414f, + 0.146240f, 0.640625f, 0.143433f, 0.625977f, 0.140625f, 0.611816f, 0.137695f, 0.598145f, + 0.133423f, 0.583008f, 0.127563f, 0.568359f, 0.121460f, 0.551758f, 0.114868f, 0.532227f, + 0.108032f, 0.505371f, 0.100159f, 0.479248f, 0.089661f, 0.449463f, 0.077454f, 0.416016f, + 0.063354f, 0.373779f, 0.048187f, 0.308594f, 0.027634f, 0.228149f, 0.004814f, 0.077515f, + 0.000000f, 1.000000f, 0.009140f, 0.994629f, 0.018646f, 0.985840f, 0.026642f, 0.977539f, + 0.035187f, 0.968262f, 0.042419f, 0.959473f, 0.051025f, 0.949707f, 0.057281f, 0.941406f, + 0.064514f, 0.931152f, 0.071899f, 0.921875f, 0.077393f, 0.914551f, 0.084167f, 0.904785f, + 0.091309f, 0.895020f, 0.096375f, 0.887207f, 0.101562f, 0.879883f, 0.106445f, 0.871582f, + 0.112427f, 0.862305f, 0.117676f, 0.854004f, 0.121643f, 0.847168f, 0.125244f, 0.840820f, + 0.130371f, 0.833008f, 0.135742f, 0.824219f, 0.138794f, 0.817383f, 0.142456f, 0.810547f, + 0.145020f, 0.804688f, 0.148193f, 0.798828f, 0.150879f, 0.791992f, 0.155029f, 0.784180f, + 0.157837f, 0.777832f, 0.160156f, 0.771973f, 0.162476f, 0.766113f, 0.163574f, 0.760742f, + 0.164673f, 0.755371f, 0.167236f, 0.747559f, 0.168945f, 0.740234f, 0.170776f, 0.732910f, + 0.171753f, 0.726562f, 0.171753f, 0.720703f, 0.172485f, 0.714355f, 0.171997f, 0.708984f, + 0.171997f, 0.700195f, 0.172974f, 0.691406f, 0.172363f, 0.682617f, 0.172241f, 0.674805f, + 0.171387f, 0.666992f, 0.168945f, 0.658691f, 0.166992f, 0.650879f, 0.164185f, 0.641113f, + 0.162109f, 0.627930f, 0.159668f, 0.615234f, 0.156006f, 0.603516f, 0.151978f, 0.590820f, + 0.146606f, 0.577148f, 0.140625f, 0.563477f, 0.134155f, 0.546875f, 0.127563f, 0.523926f, + 0.119690f, 0.500488f, 0.109924f, 0.475830f, 0.098633f, 0.447754f, 0.085083f, 0.415527f, + 0.070312f, 0.367920f, 0.053162f, 0.306885f, 0.030350f, 0.228882f, 0.005295f, 0.077148f, + 0.000000f, 1.000000f, 0.011208f, 0.993652f, 0.021729f, 0.984375f, 0.031860f, 0.974121f, + 0.040680f, 0.965332f, 0.050781f, 0.953613f, 0.058533f, 0.944824f, 0.067810f, 0.933105f, + 0.075439f, 0.923340f, 0.082581f, 0.915039f, 0.090027f, 0.904297f, 0.097961f, 0.894043f, + 0.104736f, 0.885254f, 0.109985f, 0.877930f, 0.116516f, 0.867188f, 0.123535f, 0.857422f, + 0.128906f, 0.849609f, 0.132324f, 0.843262f, 0.138794f, 0.833984f, 0.143677f, 0.825195f, + 0.149048f, 0.817383f, 0.152710f, 0.810547f, 0.157471f, 0.803223f, 0.159790f, 0.797852f, + 0.164307f, 0.789062f, 0.167847f, 0.781738f, 0.171265f, 0.774902f, 0.174316f, 0.769043f, + 0.176636f, 0.763672f, 0.178467f, 0.758789f, 0.180786f, 0.752441f, 0.184082f, 0.744629f, + 0.185425f, 0.737305f, 0.187622f, 0.731445f, 0.189087f, 0.726074f, 0.189453f, 0.719727f, + 0.190186f, 0.714355f, 0.189453f, 0.709473f, 0.191650f, 0.700684f, 0.192261f, 0.692871f, + 0.192383f, 0.685547f, 0.191772f, 0.678223f, 0.191040f, 0.671387f, 0.189575f, 0.664062f, + 0.187622f, 0.657715f, 0.184937f, 0.649902f, 0.183716f, 0.639160f, 0.182007f, 0.628418f, + 0.179199f, 0.617676f, 0.175903f, 0.606934f, 0.171143f, 0.595703f, 0.166504f, 0.583984f, + 0.159912f, 0.571777f, 0.154175f, 0.556641f, 0.147827f, 0.537109f, 0.139893f, 0.517578f, + 0.131226f, 0.496338f, 0.120361f, 0.473145f, 0.107727f, 0.445801f, 0.092651f, 0.413330f, + 0.077454f, 0.364014f, 0.058197f, 0.306152f, 0.032990f, 0.229370f, 0.005756f, 0.076660f, + 0.000000f, 1.000000f, 0.012024f, 0.993652f, 0.024628f, 0.983398f, 0.037384f, 0.971191f, + 0.048859f, 0.958984f, 0.059052f, 0.948730f, 0.069397f, 0.936523f, 0.079529f, 0.925293f, + 0.086853f, 0.916504f, 0.097656f, 0.902832f, 0.105103f, 0.893066f, 0.112366f, 0.884277f, + 0.120667f, 0.872559f, 0.127808f, 0.862793f, 0.134155f, 0.854004f, 0.139648f, 0.845703f, + 0.146362f, 0.835938f, 0.153320f, 0.826660f, 0.158325f, 0.818359f, 0.163330f, 0.810547f, + 0.167114f, 0.803711f, 0.172607f, 0.795410f, 0.176636f, 0.787598f, 0.181519f, 0.779297f, + 0.185181f, 0.772461f, 0.188477f, 0.766113f, 0.191040f, 0.760742f, 0.193726f, 0.754883f, + 0.197266f, 0.747070f, 0.200684f, 0.739746f, 0.202637f, 0.733887f, 0.205200f, 0.728516f, + 0.206421f, 0.723145f, 0.206909f, 0.717773f, 0.207397f, 0.712891f, 0.210083f, 0.705566f, + 0.211060f, 0.697754f, 0.211670f, 0.691895f, 0.212158f, 0.685059f, 0.211914f, 0.679199f, + 0.211304f, 0.672852f, 0.210083f, 0.667480f, 0.208862f, 0.661621f, 0.207153f, 0.652832f, + 0.206909f, 0.644043f, 0.204956f, 0.635254f, 0.202271f, 0.626465f, 0.199707f, 0.617188f, + 0.196411f, 0.608398f, 0.191650f, 0.599121f, 0.186890f, 0.589355f, 0.180664f, 0.578613f, + 0.175415f, 0.562988f, 0.169189f, 0.546875f, 0.162231f, 0.530762f, 0.152710f, 0.512207f, + 0.142578f, 0.492188f, 0.130615f, 0.469971f, 0.116455f, 0.444336f, 0.102051f, 0.405762f, + 0.084717f, 0.361084f, 0.063049f, 0.305908f, 0.035797f, 0.230713f, 0.006294f, 0.076782f, + 0.000000f, 1.000000f, 0.015854f, 0.991211f, 0.030777f, 0.979004f, 0.044312f, 0.966797f, + 0.057495f, 0.954590f, 0.070068f, 0.940918f, 0.081421f, 0.929199f, 0.092346f, 0.916016f, + 0.103149f, 0.903809f, 0.111877f, 0.893555f, 0.121765f, 0.880859f, 0.130371f, 0.869629f, + 0.138428f, 0.859863f, 0.145996f, 0.850098f, 0.153442f, 0.838867f, 0.160767f, 0.829102f, + 0.166992f, 0.819824f, 0.172241f, 0.812500f, 0.178711f, 0.802734f, 0.184448f, 0.793457f, + 0.189697f, 0.785156f, 0.194336f, 0.777832f, 0.198364f, 0.770508f, 0.201416f, 0.765137f, + 0.206665f, 0.756348f, 0.210571f, 0.748535f, 0.214600f, 0.741211f, 0.217041f, 0.734863f, + 0.219604f, 0.729004f, 0.221802f, 0.724121f, 0.224121f, 0.718750f, 0.225586f, 0.712891f, + 0.228760f, 0.706055f, 0.229858f, 0.700195f, 0.230713f, 0.693848f, 0.231689f, 0.688477f, + 0.232788f, 0.683105f, 0.231934f, 0.677734f, 0.231934f, 0.672852f, 0.230957f, 0.667480f, + 0.231323f, 0.659668f, 0.230835f, 0.652344f, 0.229126f, 0.645508f, 0.228516f, 0.638672f, + 0.226074f, 0.630859f, 0.223267f, 0.624023f, 0.219849f, 0.616699f, 0.216431f, 0.609375f, + 0.212036f, 0.601562f, 0.207642f, 0.591309f, 0.202515f, 0.579102f, 0.197998f, 0.566406f, + 0.191040f, 0.553223f, 0.184082f, 0.539062f, 0.175293f, 0.523926f, 0.165527f, 0.507324f, + 0.153687f, 0.489014f, 0.140747f, 0.468018f, 0.127563f, 0.436768f, 0.111816f, 0.401611f, + 0.092285f, 0.359863f, 0.068115f, 0.305908f, 0.038666f, 0.232422f, 0.006775f, 0.076782f, + 0.000000f, 1.000000f, 0.018921f, 0.990234f, 0.035980f, 0.977539f, 0.052704f, 0.962402f, + 0.068909f, 0.946777f, 0.082764f, 0.933105f, 0.095703f, 0.918945f, 0.106995f, 0.906738f, + 0.119934f, 0.891602f, 0.130371f, 0.879883f, 0.139893f, 0.868652f, 0.150513f, 0.854980f, + 0.159058f, 0.844238f, 0.166626f, 0.833984f, 0.174805f, 0.823730f, 0.182739f, 0.812500f, + 0.189453f, 0.802734f, 0.195801f, 0.793457f, 0.201660f, 0.785156f, 0.206787f, 0.777344f, + 0.213379f, 0.767578f, 0.219238f, 0.759277f, 0.222534f, 0.751953f, 0.226685f, 0.744629f, + 0.229858f, 0.738281f, 0.233643f, 0.731934f, 0.236572f, 0.724609f, 0.241211f, 0.716797f, + 0.244019f, 0.710449f, 0.245972f, 0.704102f, 0.248291f, 0.698730f, 0.249756f, 0.693359f, + 0.251465f, 0.688477f, 0.251709f, 0.684082f, 0.251709f, 0.679688f, 0.252441f, 0.673340f, + 0.254395f, 0.666992f, 0.254150f, 0.661621f, 0.253662f, 0.655762f, 0.253418f, 0.649902f, + 0.252930f, 0.644531f, 0.250977f, 0.639160f, 0.248901f, 0.633301f, 0.247192f, 0.627441f, + 0.243896f, 0.621094f, 0.241699f, 0.614258f, 0.238403f, 0.605469f, 0.234863f, 0.596680f, + 0.231201f, 0.587402f, 0.225708f, 0.578125f, 0.220337f, 0.567871f, 0.213867f, 0.557129f, + 0.207275f, 0.546387f, 0.198364f, 0.533203f, 0.188599f, 0.519531f, 0.177856f, 0.504395f, + 0.166748f, 0.482910f, 0.153564f, 0.459229f, 0.138184f, 0.431152f, 0.120300f, 0.398193f, + 0.098999f, 0.358398f, 0.073364f, 0.306885f, 0.040985f, 0.233398f, 0.007290f, 0.077026f, + 0.000000f, 1.000000f, 0.023407f, 0.987793f, 0.043671f, 0.973145f, 0.063416f, 0.956543f, + 0.082153f, 0.938965f, 0.098206f, 0.922852f, 0.112915f, 0.908203f, 0.127319f, 0.892090f, + 0.140137f, 0.877930f, 0.151245f, 0.865723f, 0.162598f, 0.851562f, 0.173706f, 0.838379f, + 0.181763f, 0.827637f, 0.190796f, 0.816406f, 0.199951f, 0.804199f, 0.207886f, 0.793945f, + 0.214478f, 0.784180f, 0.221436f, 0.774902f, 0.227051f, 0.766113f, 0.233032f, 0.757324f, + 0.237671f, 0.748535f, 0.243530f, 0.739746f, 0.248047f, 0.732422f, 0.251953f, 0.725098f, + 0.255371f, 0.718262f, 0.258545f, 0.712402f, 0.262451f, 0.705566f, 0.264648f, 0.699219f, + 0.268066f, 0.691895f, 0.270508f, 0.685547f, 0.271973f, 0.680176f, 0.274414f, 0.674316f, + 0.275391f, 0.669434f, 0.275879f, 0.664551f, 0.277100f, 0.659668f, 0.276855f, 0.654785f, + 0.277100f, 0.650391f, 0.276367f, 0.645996f, 0.275635f, 0.641113f, 0.274902f, 0.634766f, + 0.274170f, 0.628906f, 0.272217f, 0.623047f, 0.270020f, 0.617676f, 0.268555f, 0.611328f, + 0.265381f, 0.605469f, 0.262207f, 0.598633f, 0.258301f, 0.592285f, 0.253662f, 0.584961f, + 0.249146f, 0.577637f, 0.243286f, 0.569336f, 0.236572f, 0.561035f, 0.229370f, 0.551270f, + 0.221802f, 0.539062f, 0.213257f, 0.525391f, 0.203247f, 0.510742f, 0.192139f, 0.494141f, + 0.179688f, 0.475342f, 0.165405f, 0.453613f, 0.148315f, 0.428223f, 0.129028f, 0.396973f, + 0.106262f, 0.358643f, 0.078552f, 0.308350f, 0.045227f, 0.227417f, 0.007805f, 0.077332f, + 0.000000f, 1.000000f, 0.028732f, 0.985840f, 0.054169f, 0.967773f, 0.077515f, 0.948242f, + 0.098267f, 0.929199f, 0.117065f, 0.911621f, 0.134155f, 0.893555f, 0.149414f, 0.877441f, + 0.163452f, 0.861816f, 0.176758f, 0.846680f, 0.189087f, 0.832520f, 0.199585f, 0.819824f, + 0.209351f, 0.807617f, 0.218628f, 0.795410f, 0.227295f, 0.783691f, 0.234985f, 0.773438f, + 0.241943f, 0.763184f, 0.249756f, 0.752930f, 0.254883f, 0.744141f, 0.260742f, 0.735352f, + 0.265381f, 0.727539f, 0.270264f, 0.719238f, 0.275635f, 0.710938f, 0.279297f, 0.703613f, + 0.283691f, 0.696289f, 0.287109f, 0.689453f, 0.288818f, 0.683594f, 0.292969f, 0.676758f, + 0.294189f, 0.670898f, 0.296631f, 0.665039f, 0.298096f, 0.659668f, 0.299805f, 0.654785f, + 0.300049f, 0.649902f, 0.300537f, 0.645996f, 0.301270f, 0.641113f, 0.301270f, 0.637207f, + 0.300049f, 0.632812f, 0.299805f, 0.627930f, 0.299072f, 0.623535f, 0.296875f, 0.618652f, + 0.296387f, 0.613770f, 0.293701f, 0.608887f, 0.291504f, 0.604004f, 0.289307f, 0.598145f, + 0.285156f, 0.592773f, 0.281494f, 0.586426f, 0.278076f, 0.580078f, 0.272461f, 0.573242f, + 0.267090f, 0.565918f, 0.261963f, 0.558594f, 0.253662f, 0.549316f, 0.246704f, 0.540039f, + 0.238037f, 0.529297f, 0.228394f, 0.517090f, 0.218018f, 0.504395f, 0.206421f, 0.489258f, + 0.191406f, 0.471191f, 0.176270f, 0.451416f, 0.157837f, 0.426758f, 0.137573f, 0.396729f, + 0.113403f, 0.357666f, 0.084412f, 0.304443f, 0.049072f, 0.224609f, 0.008316f, 0.078186f, + 0.000000f, 1.000000f, 0.032104f, 0.984863f, 0.060852f, 0.964355f, 0.085754f, 0.943848f, + 0.107727f, 0.923828f, 0.129028f, 0.904297f, 0.147339f, 0.885742f, 0.163208f, 0.868652f, + 0.178467f, 0.852051f, 0.191772f, 0.836914f, 0.204468f, 0.822266f, 0.215332f, 0.808594f, + 0.224976f, 0.796387f, 0.235107f, 0.784180f, 0.244507f, 0.771973f, 0.251953f, 0.761230f, + 0.259766f, 0.750488f, 0.265625f, 0.740723f, 0.271729f, 0.731445f, 0.278809f, 0.722168f, + 0.283691f, 0.713867f, 0.288818f, 0.705566f, 0.292480f, 0.698242f, 0.297119f, 0.690430f, + 0.301025f, 0.683105f, 0.304443f, 0.676270f, 0.307129f, 0.669922f, 0.309326f, 0.664062f, + 0.312500f, 0.657227f, 0.314453f, 0.651855f, 0.315918f, 0.645996f, 0.317627f, 0.641602f, + 0.317871f, 0.636719f, 0.318604f, 0.631836f, 0.319092f, 0.627441f, 0.319824f, 0.623047f, + 0.319336f, 0.619141f, 0.318604f, 0.613770f, 0.317139f, 0.609863f, 0.316406f, 0.605469f, + 0.314453f, 0.600586f, 0.312744f, 0.595703f, 0.310547f, 0.591309f, 0.306885f, 0.585938f, + 0.303711f, 0.580566f, 0.300293f, 0.574707f, 0.295898f, 0.568848f, 0.291748f, 0.562500f, + 0.285889f, 0.555176f, 0.280273f, 0.547363f, 0.272949f, 0.539062f, 0.265869f, 0.530273f, + 0.257080f, 0.520020f, 0.247803f, 0.508301f, 0.237305f, 0.495605f, 0.224976f, 0.480469f, + 0.210938f, 0.463135f, 0.195435f, 0.443115f, 0.177246f, 0.419189f, 0.156250f, 0.388916f, + 0.131104f, 0.351318f, 0.101135f, 0.299805f, 0.063171f, 0.223633f, 0.014900f, 0.084656f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061432f, 0.963867f, 0.086670f, 0.943359f, + 0.109070f, 0.923340f, 0.129272f, 0.903809f, 0.147827f, 0.885254f, 0.165161f, 0.867676f, + 0.179688f, 0.851562f, 0.193970f, 0.835449f, 0.206543f, 0.820801f, 0.218628f, 0.806641f, + 0.229248f, 0.793945f, 0.238892f, 0.781250f, 0.247681f, 0.769531f, 0.256104f, 0.757812f, + 0.264160f, 0.747559f, 0.270996f, 0.736816f, 0.278320f, 0.727051f, 0.283691f, 0.718262f, + 0.290283f, 0.708984f, 0.294922f, 0.700684f, 0.299316f, 0.692871f, 0.304443f, 0.684570f, + 0.308350f, 0.677246f, 0.312500f, 0.669922f, 0.315918f, 0.663086f, 0.317871f, 0.657227f, + 0.321045f, 0.650879f, 0.323730f, 0.644531f, 0.326904f, 0.638184f, 0.328125f, 0.633301f, + 0.329346f, 0.627930f, 0.330322f, 0.623047f, 0.330811f, 0.618164f, 0.332031f, 0.613770f, + 0.331787f, 0.609375f, 0.331543f, 0.604492f, 0.331299f, 0.599609f, 0.330322f, 0.595215f, + 0.328613f, 0.590332f, 0.328613f, 0.585449f, 0.326172f, 0.580566f, 0.323486f, 0.575195f, + 0.320801f, 0.569336f, 0.317871f, 0.563477f, 0.313965f, 0.557129f, 0.311279f, 0.550781f, + 0.305420f, 0.543457f, 0.300293f, 0.535645f, 0.294434f, 0.527832f, 0.287354f, 0.518066f, + 0.280518f, 0.508301f, 0.271484f, 0.497070f, 0.261475f, 0.484131f, 0.250244f, 0.469238f, + 0.236816f, 0.452393f, 0.221802f, 0.432861f, 0.205078f, 0.408936f, 0.184937f, 0.380127f, + 0.160278f, 0.343262f, 0.129395f, 0.293701f, 0.089783f, 0.219971f, 0.032715f, 0.083496f, + 0.000000f, 1.000000f, 0.032227f, 0.984375f, 0.060944f, 0.964355f, 0.086853f, 0.943359f, + 0.110291f, 0.922363f, 0.130615f, 0.902832f, 0.149170f, 0.884766f, 0.165649f, 0.867188f, + 0.180908f, 0.850586f, 0.196045f, 0.833984f, 0.208618f, 0.819336f, 0.220825f, 0.804688f, + 0.232300f, 0.791016f, 0.242920f, 0.778320f, 0.251221f, 0.766602f, 0.260498f, 0.754883f, + 0.268311f, 0.743652f, 0.276367f, 0.733398f, 0.283203f, 0.723145f, 0.289307f, 0.713867f, + 0.295654f, 0.704590f, 0.301025f, 0.695801f, 0.306396f, 0.687500f, 0.312012f, 0.679199f, + 0.315674f, 0.671387f, 0.319824f, 0.664062f, 0.324463f, 0.656738f, 0.327637f, 0.649902f, + 0.330566f, 0.643555f, 0.333984f, 0.636719f, 0.337402f, 0.630371f, 0.338379f, 0.625000f, + 0.340576f, 0.619629f, 0.342041f, 0.614258f, 0.343018f, 0.609375f, 0.344727f, 0.604004f, + 0.344727f, 0.599609f, 0.345459f, 0.595215f, 0.344971f, 0.589355f, 0.344727f, 0.584473f, + 0.344482f, 0.580078f, 0.343750f, 0.574219f, 0.341797f, 0.568848f, 0.340332f, 0.563965f, + 0.338135f, 0.558105f, 0.335693f, 0.551758f, 0.333008f, 0.545410f, 0.329346f, 0.538574f, + 0.325195f, 0.531250f, 0.320801f, 0.523438f, 0.315674f, 0.514648f, 0.309326f, 0.505371f, + 0.302734f, 0.495361f, 0.294922f, 0.484131f, 0.286377f, 0.471191f, 0.275879f, 0.456543f, + 0.263672f, 0.439453f, 0.250977f, 0.420410f, 0.233887f, 0.397217f, 0.214600f, 0.368652f, + 0.191040f, 0.332764f, 0.161011f, 0.285889f, 0.120117f, 0.213135f, 0.056519f, 0.080872f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.060913f, 0.964355f, 0.087158f, 0.943359f, + 0.110718f, 0.922363f, 0.131714f, 0.902344f, 0.150635f, 0.883789f, 0.167603f, 0.865723f, + 0.183350f, 0.849121f, 0.198486f, 0.832520f, 0.211426f, 0.817383f, 0.224121f, 0.802734f, + 0.235474f, 0.789062f, 0.245728f, 0.776367f, 0.255615f, 0.763184f, 0.265381f, 0.751953f, + 0.273193f, 0.740234f, 0.281738f, 0.729492f, 0.288330f, 0.719238f, 0.295898f, 0.708984f, + 0.302246f, 0.699707f, 0.308594f, 0.690430f, 0.314453f, 0.681641f, 0.319092f, 0.673340f, + 0.324219f, 0.665039f, 0.328857f, 0.657227f, 0.333252f, 0.649902f, 0.336426f, 0.643066f, + 0.340332f, 0.635742f, 0.344482f, 0.628906f, 0.346924f, 0.622559f, 0.349609f, 0.616211f, + 0.352051f, 0.610352f, 0.353516f, 0.604980f, 0.355469f, 0.599121f, 0.356689f, 0.594238f, + 0.358643f, 0.588867f, 0.359375f, 0.583984f, 0.359863f, 0.578613f, 0.360352f, 0.572754f, + 0.360107f, 0.567871f, 0.360107f, 0.562012f, 0.359131f, 0.556641f, 0.358398f, 0.550781f, + 0.356934f, 0.544434f, 0.354980f, 0.538086f, 0.352539f, 0.531738f, 0.349365f, 0.524902f, + 0.346680f, 0.518066f, 0.342529f, 0.509277f, 0.337891f, 0.501465f, 0.332764f, 0.491943f, + 0.326660f, 0.481689f, 0.320312f, 0.470703f, 0.311523f, 0.458008f, 0.302734f, 0.444336f, + 0.291748f, 0.427490f, 0.278809f, 0.408936f, 0.263428f, 0.386230f, 0.244507f, 0.358398f, + 0.222168f, 0.324219f, 0.193359f, 0.278076f, 0.152344f, 0.208496f, 0.085327f, 0.079407f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061218f, 0.964355f, 0.087158f, 0.943359f, + 0.110657f, 0.922363f, 0.132690f, 0.902344f, 0.151001f, 0.883301f, 0.169067f, 0.864746f, + 0.185425f, 0.847656f, 0.200806f, 0.831055f, 0.213989f, 0.815918f, 0.226440f, 0.800781f, + 0.238525f, 0.786621f, 0.248901f, 0.773438f, 0.260498f, 0.760254f, 0.268555f, 0.748535f, + 0.277588f, 0.736816f, 0.287354f, 0.725098f, 0.294434f, 0.714844f, 0.302246f, 0.704102f, + 0.309814f, 0.694336f, 0.315918f, 0.684570f, 0.321289f, 0.676270f, 0.326904f, 0.666992f, + 0.332764f, 0.658691f, 0.337646f, 0.650391f, 0.341553f, 0.643066f, 0.347168f, 0.634766f, + 0.350586f, 0.627441f, 0.354736f, 0.620605f, 0.358643f, 0.613281f, 0.362061f, 0.606445f, + 0.363525f, 0.601074f, 0.366699f, 0.594238f, 0.369141f, 0.588379f, 0.370117f, 0.583496f, + 0.372559f, 0.577637f, 0.373535f, 0.572754f, 0.375244f, 0.567383f, 0.375000f, 0.561523f, + 0.375488f, 0.555664f, 0.375977f, 0.550781f, 0.375488f, 0.544434f, 0.374756f, 0.538574f, + 0.374512f, 0.532715f, 0.372803f, 0.526367f, 0.371094f, 0.519531f, 0.369385f, 0.512695f, + 0.366455f, 0.504883f, 0.362793f, 0.496582f, 0.358887f, 0.488770f, 0.354492f, 0.479492f, + 0.349854f, 0.468506f, 0.344482f, 0.457764f, 0.337158f, 0.444336f, 0.329346f, 0.430664f, + 0.318848f, 0.414307f, 0.307373f, 0.395752f, 0.292969f, 0.373535f, 0.276123f, 0.347168f, + 0.254639f, 0.313721f, 0.226685f, 0.268799f, 0.186768f, 0.202637f, 0.117493f, 0.077942f, + 0.000000f, 1.000000f, 0.032074f, 0.984863f, 0.061310f, 0.964355f, 0.087585f, 0.942871f, + 0.111755f, 0.921875f, 0.132812f, 0.901855f, 0.153564f, 0.881836f, 0.170166f, 0.863770f, + 0.187378f, 0.846191f, 0.202271f, 0.830078f, 0.217163f, 0.813477f, 0.229492f, 0.798340f, + 0.242065f, 0.784180f, 0.254150f, 0.770020f, 0.264160f, 0.757324f, 0.274414f, 0.744629f, + 0.283936f, 0.732422f, 0.292236f, 0.721191f, 0.301025f, 0.709961f, 0.308594f, 0.699219f, + 0.316406f, 0.688965f, 0.323730f, 0.678711f, 0.329590f, 0.669434f, 0.335449f, 0.660156f, + 0.341797f, 0.651367f, 0.347412f, 0.643066f, 0.351807f, 0.634766f, 0.357178f, 0.626465f, + 0.361084f, 0.619141f, 0.364258f, 0.612793f, 0.368164f, 0.605469f, 0.372559f, 0.598145f, + 0.375732f, 0.591797f, 0.379150f, 0.584961f, 0.381348f, 0.579102f, 0.382568f, 0.573730f, + 0.385498f, 0.567383f, 0.387451f, 0.562012f, 0.389648f, 0.556152f, 0.390381f, 0.550293f, + 0.391113f, 0.544434f, 0.391846f, 0.539062f, 0.392090f, 0.533203f, 0.392334f, 0.526367f, + 0.392090f, 0.520508f, 0.392334f, 0.513184f, 0.390625f, 0.506348f, 0.389404f, 0.499268f, + 0.387695f, 0.491699f, 0.385498f, 0.483643f, 0.382080f, 0.474609f, 0.377930f, 0.465576f, + 0.373779f, 0.455078f, 0.368652f, 0.443848f, 0.362061f, 0.431885f, 0.354736f, 0.417480f, + 0.347168f, 0.401611f, 0.335449f, 0.382568f, 0.323486f, 0.361328f, 0.307373f, 0.335205f, + 0.287109f, 0.303223f, 0.261719f, 0.260498f, 0.222290f, 0.195557f, 0.152588f, 0.075867f, + 0.000000f, 1.000000f, 0.032227f, 0.984863f, 0.062134f, 0.963379f, 0.088196f, 0.942383f, + 0.112488f, 0.921387f, 0.134033f, 0.901367f, 0.154907f, 0.880859f, 0.172363f, 0.862793f, + 0.189575f, 0.845215f, 0.203979f, 0.828125f, 0.218994f, 0.812012f, 0.233765f, 0.795898f, + 0.246338f, 0.781250f, 0.258301f, 0.767090f, 0.268799f, 0.753418f, 0.279053f, 0.740723f, + 0.289551f, 0.727539f, 0.299072f, 0.715820f, 0.307373f, 0.704590f, 0.314941f, 0.693848f, + 0.322510f, 0.683594f, 0.329102f, 0.673828f, 0.337158f, 0.663574f, 0.344238f, 0.653809f, + 0.349609f, 0.645020f, 0.354980f, 0.636230f, 0.360840f, 0.627930f, 0.366211f, 0.619629f, + 0.371094f, 0.611816f, 0.375244f, 0.604492f, 0.379150f, 0.597168f, 0.383545f, 0.589844f, + 0.387451f, 0.582520f, 0.391846f, 0.575684f, 0.394287f, 0.568848f, 0.396240f, 0.562988f, + 0.399658f, 0.556641f, 0.402100f, 0.550293f, 0.404053f, 0.544922f, 0.405762f, 0.539062f, + 0.406982f, 0.532227f, 0.407959f, 0.526367f, 0.409180f, 0.520508f, 0.409912f, 0.513672f, + 0.409912f, 0.507324f, 0.410645f, 0.500977f, 0.409912f, 0.493896f, 0.409180f, 0.486816f, + 0.408203f, 0.478271f, 0.406494f, 0.469727f, 0.403564f, 0.460449f, 0.400391f, 0.451904f, + 0.397217f, 0.440918f, 0.393799f, 0.429688f, 0.387939f, 0.418213f, 0.381592f, 0.404053f, + 0.375000f, 0.388428f, 0.364746f, 0.369873f, 0.353027f, 0.349365f, 0.339355f, 0.323975f, + 0.320801f, 0.292725f, 0.296875f, 0.250977f, 0.258545f, 0.188599f, 0.190674f, 0.073059f, + 0.000000f, 1.000000f, 0.032257f, 0.984863f, 0.062073f, 0.963379f, 0.088806f, 0.942383f, + 0.111633f, 0.921875f, 0.135376f, 0.900391f, 0.154785f, 0.880859f, 0.173706f, 0.862305f, + 0.190796f, 0.843750f, 0.207642f, 0.826172f, 0.222412f, 0.809570f, 0.236816f, 0.793457f, + 0.249512f, 0.778320f, 0.262207f, 0.763184f, 0.273926f, 0.749512f, 0.284912f, 0.736328f, + 0.295410f, 0.723633f, 0.304443f, 0.711914f, 0.313721f, 0.700195f, 0.322021f, 0.688965f, + 0.329346f, 0.678223f, 0.337402f, 0.667969f, 0.345215f, 0.657715f, 0.352051f, 0.647949f, + 0.357666f, 0.638672f, 0.364014f, 0.629883f, 0.371094f, 0.620117f, 0.375000f, 0.612793f, + 0.381592f, 0.604004f, 0.385498f, 0.596191f, 0.391602f, 0.587891f, 0.395996f, 0.580078f, + 0.399902f, 0.572754f, 0.403564f, 0.565430f, 0.407471f, 0.558594f, 0.410400f, 0.552246f, + 0.413330f, 0.545898f, 0.416748f, 0.539551f, 0.418945f, 0.533203f, 0.420654f, 0.527832f, + 0.423096f, 0.520996f, 0.425293f, 0.514160f, 0.427002f, 0.507324f, 0.427490f, 0.500977f, + 0.428467f, 0.494141f, 0.429443f, 0.487793f, 0.429932f, 0.479736f, 0.429199f, 0.472412f, + 0.428223f, 0.465088f, 0.427734f, 0.456299f, 0.427002f, 0.447266f, 0.423828f, 0.437744f, + 0.421631f, 0.427734f, 0.418457f, 0.415771f, 0.414307f, 0.403809f, 0.408447f, 0.390137f, + 0.401855f, 0.374268f, 0.394531f, 0.356934f, 0.383545f, 0.336670f, 0.371338f, 0.311768f, + 0.354248f, 0.281006f, 0.331787f, 0.241089f, 0.296143f, 0.181763f, 0.230469f, 0.069702f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.061951f, 0.963867f, 0.088989f, 0.942383f, + 0.112976f, 0.920898f, 0.136108f, 0.899414f, 0.156616f, 0.879883f, 0.175293f, 0.860840f, + 0.194214f, 0.841309f, 0.211182f, 0.823242f, 0.226440f, 0.806152f, 0.241089f, 0.790039f, + 0.254150f, 0.774902f, 0.266846f, 0.760254f, 0.278076f, 0.746582f, 0.289307f, 0.732910f, + 0.299805f, 0.720215f, 0.309814f, 0.708008f, 0.319336f, 0.695801f, 0.329102f, 0.684082f, + 0.336670f, 0.672852f, 0.344727f, 0.662109f, 0.352539f, 0.651855f, 0.359619f, 0.641602f, + 0.367432f, 0.631348f, 0.374512f, 0.622070f, 0.380127f, 0.613281f, 0.385742f, 0.604492f, + 0.391113f, 0.595703f, 0.396484f, 0.587402f, 0.401611f, 0.579590f, 0.406006f, 0.571777f, + 0.411865f, 0.563477f, 0.416260f, 0.555664f, 0.420410f, 0.548828f, 0.424072f, 0.541504f, + 0.427490f, 0.534668f, 0.430664f, 0.527832f, 0.434326f, 0.521484f, 0.436768f, 0.515137f, + 0.440674f, 0.508301f, 0.441895f, 0.501953f, 0.443359f, 0.495361f, 0.446289f, 0.488770f, + 0.447754f, 0.480957f, 0.447998f, 0.474365f, 0.449463f, 0.466797f, 0.449951f, 0.458984f, + 0.449951f, 0.451172f, 0.448975f, 0.442383f, 0.448975f, 0.433350f, 0.446777f, 0.423584f, + 0.446045f, 0.413330f, 0.442627f, 0.401855f, 0.440186f, 0.389648f, 0.435303f, 0.376221f, + 0.429443f, 0.360840f, 0.422363f, 0.343262f, 0.414062f, 0.323242f, 0.402100f, 0.299072f, + 0.387207f, 0.270264f, 0.367432f, 0.231201f, 0.334229f, 0.173828f, 0.270752f, 0.066895f, + 0.000000f, 1.000000f, 0.032349f, 0.984375f, 0.061493f, 0.964355f, 0.088989f, 0.942383f, + 0.114197f, 0.920410f, 0.137085f, 0.899414f, 0.157959f, 0.878418f, 0.178711f, 0.858398f, + 0.197266f, 0.839355f, 0.212891f, 0.821777f, 0.229248f, 0.804688f, 0.243896f, 0.788574f, + 0.257812f, 0.772461f, 0.270264f, 0.758301f, 0.281982f, 0.743652f, 0.294189f, 0.729492f, + 0.304932f, 0.716309f, 0.315674f, 0.703613f, 0.324463f, 0.691406f, 0.335938f, 0.678711f, + 0.344238f, 0.667480f, 0.351807f, 0.656738f, 0.359863f, 0.645508f, 0.368164f, 0.634766f, + 0.376465f, 0.624512f, 0.382080f, 0.615723f, 0.389404f, 0.605957f, 0.395508f, 0.596680f, + 0.401367f, 0.587891f, 0.407471f, 0.579102f, 0.414062f, 0.569824f, 0.418457f, 0.562012f, + 0.424561f, 0.553711f, 0.429688f, 0.545898f, 0.433594f, 0.538574f, 0.437744f, 0.530762f, + 0.441895f, 0.523926f, 0.445801f, 0.516602f, 0.450684f, 0.509277f, 0.452881f, 0.502930f, + 0.456543f, 0.496094f, 0.458984f, 0.489502f, 0.460693f, 0.482422f, 0.463135f, 0.475342f, + 0.465576f, 0.468262f, 0.466064f, 0.461182f, 0.468994f, 0.452881f, 0.470215f, 0.444824f, + 0.470703f, 0.437256f, 0.471680f, 0.427979f, 0.471191f, 0.418701f, 0.470215f, 0.409668f, + 0.469482f, 0.398682f, 0.466797f, 0.387695f, 0.465332f, 0.375488f, 0.462646f, 0.362305f, + 0.456543f, 0.346924f, 0.451904f, 0.329590f, 0.443848f, 0.310547f, 0.434570f, 0.287109f, + 0.420654f, 0.258301f, 0.401855f, 0.221558f, 0.372070f, 0.166260f, 0.311035f, 0.064758f, + 0.000000f, 1.000000f, 0.031952f, 0.984863f, 0.061584f, 0.964355f, 0.089539f, 0.941895f, + 0.115112f, 0.919922f, 0.138184f, 0.897949f, 0.160400f, 0.876953f, 0.180542f, 0.856934f, + 0.198242f, 0.838379f, 0.216187f, 0.819824f, 0.230835f, 0.803223f, 0.246094f, 0.786621f, + 0.260498f, 0.770508f, 0.274170f, 0.754883f, 0.286621f, 0.740234f, 0.300049f, 0.725586f, + 0.310791f, 0.711914f, 0.322266f, 0.698242f, 0.331299f, 0.686035f, 0.341797f, 0.673340f, + 0.350342f, 0.662109f, 0.360107f, 0.650391f, 0.367920f, 0.639648f, 0.376953f, 0.628418f, + 0.384033f, 0.618652f, 0.391357f, 0.608398f, 0.399170f, 0.598145f, 0.406982f, 0.588379f, + 0.412598f, 0.579102f, 0.419434f, 0.569824f, 0.424072f, 0.561523f, 0.430176f, 0.552734f, + 0.436035f, 0.544434f, 0.442383f, 0.535645f, 0.446533f, 0.527832f, 0.451904f, 0.519531f, + 0.455078f, 0.512695f, 0.460938f, 0.504883f, 0.465088f, 0.497803f, 0.468262f, 0.490967f, + 0.472900f, 0.483398f, 0.476562f, 0.476562f, 0.478760f, 0.469482f, 0.481445f, 0.462158f, + 0.484375f, 0.454590f, 0.486572f, 0.447021f, 0.488281f, 0.439209f, 0.490723f, 0.431396f, + 0.490967f, 0.423096f, 0.492676f, 0.414062f, 0.494141f, 0.404541f, 0.494141f, 0.395020f, + 0.493408f, 0.384766f, 0.493408f, 0.373779f, 0.489746f, 0.361572f, 0.488770f, 0.348145f, + 0.485107f, 0.332764f, 0.480469f, 0.316162f, 0.472900f, 0.297119f, 0.465332f, 0.274414f, + 0.454102f, 0.246948f, 0.436279f, 0.211060f, 0.408936f, 0.158203f, 0.352051f, 0.061707f, + 0.000000f, 1.000000f, 0.031860f, 0.984863f, 0.062103f, 0.963867f, 0.089905f, 0.941406f, + 0.115967f, 0.918945f, 0.139648f, 0.896973f, 0.162598f, 0.875488f, 0.181763f, 0.855957f, + 0.200928f, 0.836914f, 0.217651f, 0.818848f, 0.234985f, 0.800781f, 0.249878f, 0.784180f, + 0.264648f, 0.767578f, 0.278809f, 0.751953f, 0.292480f, 0.735840f, 0.304443f, 0.721680f, + 0.316895f, 0.707520f, 0.327393f, 0.694336f, 0.338135f, 0.681152f, 0.348145f, 0.668945f, + 0.358154f, 0.656250f, 0.367920f, 0.644531f, 0.377441f, 0.632812f, 0.384766f, 0.622070f, + 0.392822f, 0.611328f, 0.401367f, 0.600586f, 0.409424f, 0.590332f, 0.416748f, 0.580566f, + 0.423584f, 0.570801f, 0.431152f, 0.561035f, 0.437012f, 0.551758f, 0.443359f, 0.542969f, + 0.448486f, 0.534668f, 0.454346f, 0.525879f, 0.461182f, 0.517090f, 0.465332f, 0.509277f, + 0.470703f, 0.500977f, 0.475098f, 0.493408f, 0.479980f, 0.485840f, 0.484375f, 0.478516f, + 0.488281f, 0.470947f, 0.492920f, 0.463623f, 0.496826f, 0.456787f, 0.498779f, 0.448730f, + 0.501953f, 0.440918f, 0.504883f, 0.433594f, 0.507812f, 0.425537f, 0.509766f, 0.417236f, + 0.512207f, 0.408203f, 0.514160f, 0.400146f, 0.514648f, 0.390381f, 0.516602f, 0.380371f, + 0.515625f, 0.370361f, 0.516602f, 0.358643f, 0.515625f, 0.346436f, 0.514160f, 0.333740f, + 0.511719f, 0.319092f, 0.509277f, 0.302490f, 0.502441f, 0.284424f, 0.496094f, 0.262207f, + 0.484619f, 0.235474f, 0.472168f, 0.201050f, 0.446777f, 0.150513f, 0.394043f, 0.058258f, + 0.000000f, 1.000000f, 0.032166f, 0.984863f, 0.061920f, 0.963867f, 0.090759f, 0.940918f, + 0.116943f, 0.917969f, 0.140381f, 0.896484f, 0.162720f, 0.875488f, 0.183472f, 0.854980f, + 0.202637f, 0.835449f, 0.220215f, 0.817383f, 0.237549f, 0.798828f, 0.253418f, 0.781738f, + 0.268311f, 0.764648f, 0.283203f, 0.748047f, 0.296875f, 0.732910f, 0.309326f, 0.718262f, + 0.321289f, 0.704102f, 0.334473f, 0.689453f, 0.344238f, 0.676270f, 0.354736f, 0.663574f, + 0.365967f, 0.650879f, 0.375732f, 0.638672f, 0.384033f, 0.626953f, 0.393311f, 0.615234f, + 0.403076f, 0.603516f, 0.411377f, 0.592773f, 0.419678f, 0.582520f, 0.426025f, 0.572266f, + 0.434570f, 0.562012f, 0.440674f, 0.552734f, 0.449219f, 0.542480f, 0.455566f, 0.533203f, + 0.461670f, 0.524414f, 0.467285f, 0.515625f, 0.475098f, 0.506348f, 0.480225f, 0.498291f, + 0.486084f, 0.489502f, 0.490234f, 0.481689f, 0.495361f, 0.473877f, 0.500000f, 0.465820f, + 0.503906f, 0.458496f, 0.509766f, 0.450439f, 0.513672f, 0.443115f, 0.517578f, 0.435547f, + 0.520996f, 0.427002f, 0.523438f, 0.419434f, 0.527832f, 0.411621f, 0.529785f, 0.402588f, + 0.532715f, 0.394287f, 0.535156f, 0.385254f, 0.537598f, 0.375977f, 0.539551f, 0.365967f, + 0.540527f, 0.355957f, 0.540527f, 0.344482f, 0.541016f, 0.332764f, 0.539551f, 0.319824f, + 0.538086f, 0.305908f, 0.536621f, 0.288818f, 0.532227f, 0.271240f, 0.526855f, 0.249512f, + 0.518555f, 0.223755f, 0.504883f, 0.190186f, 0.482178f, 0.142944f, 0.436279f, 0.055878f, + 0.000000f, 1.000000f, 0.032196f, 0.984863f, 0.062805f, 0.963379f, 0.090637f, 0.940918f, + 0.118896f, 0.916992f, 0.141602f, 0.895996f, 0.165039f, 0.874023f, 0.185791f, 0.854004f, + 0.204712f, 0.834473f, 0.223145f, 0.814941f, 0.240356f, 0.796387f, 0.257080f, 0.778809f, + 0.272461f, 0.761719f, 0.287354f, 0.745117f, 0.300781f, 0.729492f, 0.315430f, 0.714355f, + 0.327148f, 0.699219f, 0.339355f, 0.685059f, 0.351562f, 0.670898f, 0.362061f, 0.658203f, + 0.373047f, 0.645020f, 0.383545f, 0.632324f, 0.393799f, 0.620117f, 0.403809f, 0.607910f, + 0.411133f, 0.597168f, 0.420166f, 0.585938f, 0.429932f, 0.574219f, 0.437012f, 0.563965f, + 0.445312f, 0.553711f, 0.452148f, 0.543457f, 0.459717f, 0.533691f, 0.467529f, 0.523926f, + 0.474365f, 0.514160f, 0.480469f, 0.505371f, 0.487793f, 0.496338f, 0.493896f, 0.487061f, + 0.499268f, 0.478516f, 0.505859f, 0.469482f, 0.511230f, 0.461670f, 0.516602f, 0.453369f, + 0.521484f, 0.445312f, 0.526367f, 0.437500f, 0.531250f, 0.429688f, 0.535156f, 0.422119f, + 0.538574f, 0.414062f, 0.543457f, 0.405273f, 0.547363f, 0.397217f, 0.551270f, 0.388916f, + 0.553223f, 0.379883f, 0.555664f, 0.371338f, 0.559570f, 0.361328f, 0.561523f, 0.351318f, + 0.563477f, 0.341064f, 0.565918f, 0.329834f, 0.565918f, 0.317871f, 0.564941f, 0.305420f, + 0.564941f, 0.291260f, 0.563965f, 0.274902f, 0.560547f, 0.258057f, 0.556152f, 0.237305f, + 0.550293f, 0.213013f, 0.539062f, 0.180786f, 0.519043f, 0.135864f, 0.474854f, 0.052826f, + 0.000000f, 1.000000f, 0.032440f, 0.984375f, 0.063049f, 0.963379f, 0.092773f, 0.939453f, + 0.118774f, 0.916992f, 0.142944f, 0.895508f, 0.166138f, 0.873535f, 0.187744f, 0.852539f, + 0.206665f, 0.833008f, 0.227295f, 0.812500f, 0.243774f, 0.793945f, 0.260254f, 0.776855f, + 0.275879f, 0.759277f, 0.291504f, 0.742188f, 0.307617f, 0.725098f, 0.319580f, 0.710449f, + 0.333984f, 0.694824f, 0.344727f, 0.681152f, 0.358643f, 0.666016f, 0.369629f, 0.652344f, + 0.381836f, 0.639160f, 0.391602f, 0.626465f, 0.401367f, 0.613770f, 0.412109f, 0.601074f, + 0.420654f, 0.589844f, 0.429443f, 0.578613f, 0.438232f, 0.566895f, 0.447510f, 0.555664f, + 0.456055f, 0.544922f, 0.464355f, 0.534180f, 0.471191f, 0.524414f, 0.480713f, 0.513672f, + 0.487061f, 0.504395f, 0.493652f, 0.494873f, 0.500977f, 0.485596f, 0.507324f, 0.476318f, + 0.514160f, 0.466797f, 0.520020f, 0.458008f, 0.525879f, 0.449463f, 0.532715f, 0.440430f, + 0.537109f, 0.432617f, 0.543457f, 0.424072f, 0.548828f, 0.416016f, 0.553223f, 0.408203f, + 0.558594f, 0.400146f, 0.562012f, 0.391602f, 0.565918f, 0.382568f, 0.570801f, 0.374268f, + 0.575195f, 0.365234f, 0.577637f, 0.356445f, 0.581543f, 0.346436f, 0.584473f, 0.337402f, + 0.585938f, 0.326416f, 0.589355f, 0.315674f, 0.589355f, 0.303955f, 0.590820f, 0.291260f, + 0.590820f, 0.277588f, 0.590332f, 0.262207f, 0.589355f, 0.244873f, 0.585938f, 0.224609f, + 0.580078f, 0.201416f, 0.570801f, 0.170776f, 0.554199f, 0.127808f, 0.515137f, 0.048737f, + 0.000000f, 1.000000f, 0.032379f, 0.984375f, 0.063538f, 0.962891f, 0.093689f, 0.938965f, + 0.119202f, 0.916992f, 0.144165f, 0.894531f, 0.166870f, 0.873047f, 0.189453f, 0.851562f, + 0.209839f, 0.830566f, 0.229370f, 0.811035f, 0.247192f, 0.791992f, 0.264404f, 0.773438f, + 0.281006f, 0.755859f, 0.296631f, 0.738281f, 0.312012f, 0.722168f, 0.324707f, 0.706543f, + 0.340576f, 0.690430f, 0.352295f, 0.675293f, 0.364502f, 0.661133f, 0.376221f, 0.646973f, + 0.388428f, 0.633301f, 0.399170f, 0.620117f, 0.409668f, 0.607422f, 0.420654f, 0.594238f, + 0.430176f, 0.582031f, 0.439697f, 0.570312f, 0.448975f, 0.558594f, 0.457764f, 0.547852f, + 0.467529f, 0.535645f, 0.475586f, 0.525391f, 0.484131f, 0.514648f, 0.491699f, 0.504395f, + 0.499756f, 0.494141f, 0.508789f, 0.483643f, 0.514160f, 0.474854f, 0.521973f, 0.464844f, + 0.528320f, 0.455566f, 0.535645f, 0.446045f, 0.542480f, 0.436768f, 0.548340f, 0.428223f, + 0.555176f, 0.419189f, 0.560059f, 0.411133f, 0.565918f, 0.402588f, 0.570801f, 0.394043f, + 0.577148f, 0.385986f, 0.581055f, 0.377930f, 0.586426f, 0.368164f, 0.590820f, 0.359619f, + 0.596191f, 0.350830f, 0.598145f, 0.342041f, 0.603027f, 0.332275f, 0.605957f, 0.322266f, + 0.609375f, 0.312012f, 0.613281f, 0.301514f, 0.614258f, 0.289551f, 0.616211f, 0.277100f, + 0.617676f, 0.264160f, 0.618652f, 0.249512f, 0.616699f, 0.231812f, 0.615234f, 0.212524f, + 0.610352f, 0.189819f, 0.602051f, 0.160278f, 0.589355f, 0.119446f, 0.553223f, 0.046387f, + 0.000000f, 1.000000f, 0.031982f, 0.984863f, 0.063782f, 0.962402f, 0.093689f, 0.939453f, + 0.120239f, 0.916504f, 0.145142f, 0.894043f, 0.169434f, 0.871582f, 0.190674f, 0.850098f, + 0.213013f, 0.829102f, 0.231201f, 0.809570f, 0.249634f, 0.790039f, 0.268555f, 0.770996f, + 0.284668f, 0.753418f, 0.300293f, 0.735840f, 0.316895f, 0.718262f, 0.331055f, 0.702148f, + 0.344482f, 0.686523f, 0.358154f, 0.670898f, 0.372314f, 0.655762f, 0.384033f, 0.641602f, + 0.396484f, 0.627441f, 0.408936f, 0.613281f, 0.419678f, 0.600098f, 0.430176f, 0.587402f, + 0.439453f, 0.575195f, 0.449463f, 0.562500f, 0.459717f, 0.550293f, 0.469971f, 0.538574f, + 0.479004f, 0.527344f, 0.486816f, 0.516113f, 0.496338f, 0.505371f, 0.504395f, 0.494629f, + 0.512695f, 0.483887f, 0.521484f, 0.473389f, 0.528809f, 0.463135f, 0.535645f, 0.453857f, + 0.543457f, 0.444092f, 0.551270f, 0.434326f, 0.558105f, 0.424561f, 0.564453f, 0.415527f, + 0.570801f, 0.406494f, 0.576172f, 0.397705f, 0.582520f, 0.388916f, 0.588867f, 0.380127f, + 0.595703f, 0.371582f, 0.600586f, 0.363281f, 0.606445f, 0.354492f, 0.610352f, 0.345459f, + 0.615723f, 0.336426f, 0.619629f, 0.327637f, 0.623535f, 0.317627f, 0.627930f, 0.307861f, + 0.631348f, 0.297363f, 0.635254f, 0.286865f, 0.638184f, 0.275635f, 0.641113f, 0.263184f, + 0.642578f, 0.249878f, 0.643555f, 0.235352f, 0.643555f, 0.218994f, 0.643066f, 0.200684f, + 0.640137f, 0.178589f, 0.633301f, 0.151367f, 0.621582f, 0.112854f, 0.590332f, 0.044617f, + 0.000000f, 1.000000f, 0.031830f, 0.984863f, 0.065002f, 0.961426f, 0.093323f, 0.939453f, + 0.120544f, 0.916504f, 0.146118f, 0.893555f, 0.170532f, 0.870605f, 0.192017f, 0.849609f, + 0.214478f, 0.827637f, 0.235474f, 0.806641f, 0.253662f, 0.787109f, 0.271240f, 0.768555f, + 0.288574f, 0.750000f, 0.305908f, 0.731934f, 0.321045f, 0.714844f, 0.336182f, 0.698242f, + 0.351318f, 0.681641f, 0.364990f, 0.666016f, 0.378906f, 0.650879f, 0.390625f, 0.635742f, + 0.403076f, 0.621582f, 0.416016f, 0.607422f, 0.427734f, 0.593750f, 0.438477f, 0.580078f, + 0.448975f, 0.567383f, 0.461426f, 0.554199f, 0.470215f, 0.542480f, 0.480713f, 0.530273f, + 0.489502f, 0.518555f, 0.499756f, 0.506348f, 0.508301f, 0.495850f, 0.517578f, 0.484131f, + 0.525879f, 0.473633f, 0.533691f, 0.463135f, 0.542480f, 0.452393f, 0.550293f, 0.442139f, + 0.558105f, 0.432129f, 0.565430f, 0.422607f, 0.573242f, 0.412354f, 0.581543f, 0.402832f, + 0.586914f, 0.393555f, 0.594727f, 0.384033f, 0.599121f, 0.375977f, 0.606934f, 0.366211f, + 0.612793f, 0.357666f, 0.619629f, 0.348633f, 0.625000f, 0.340332f, 0.629395f, 0.331299f, + 0.636230f, 0.321777f, 0.641113f, 0.312500f, 0.645508f, 0.303467f, 0.649902f, 0.293457f, + 0.653809f, 0.283447f, 0.657227f, 0.272705f, 0.661621f, 0.261230f, 0.664062f, 0.249023f, + 0.667969f, 0.236450f, 0.669434f, 0.222290f, 0.670898f, 0.207031f, 0.670410f, 0.188599f, + 0.667969f, 0.167603f, 0.663574f, 0.141479f, 0.653320f, 0.104431f, 0.627441f, 0.040070f, + 0.000000f, 1.000000f, 0.032135f, 0.984863f, 0.065613f, 0.961426f, 0.093323f, 0.939941f, + 0.121582f, 0.916016f, 0.148560f, 0.892090f, 0.172119f, 0.869629f, 0.194824f, 0.847656f, + 0.217041f, 0.826172f, 0.236938f, 0.805664f, 0.256592f, 0.785645f, 0.275635f, 0.765137f, + 0.292969f, 0.746582f, 0.310059f, 0.728516f, 0.326660f, 0.710938f, 0.342285f, 0.693848f, + 0.356445f, 0.677246f, 0.371338f, 0.660645f, 0.385742f, 0.645508f, 0.398438f, 0.630371f, + 0.411621f, 0.615234f, 0.424316f, 0.600586f, 0.436279f, 0.586426f, 0.448242f, 0.573242f, + 0.459961f, 0.560059f, 0.471191f, 0.546387f, 0.480957f, 0.534180f, 0.491211f, 0.521484f, + 0.501953f, 0.508789f, 0.510742f, 0.497559f, 0.520996f, 0.485840f, 0.529785f, 0.474609f, + 0.540039f, 0.463135f, 0.546387f, 0.452637f, 0.556641f, 0.441406f, 0.564941f, 0.430664f, + 0.572266f, 0.420898f, 0.580566f, 0.410400f, 0.589355f, 0.400391f, 0.596191f, 0.390625f, + 0.602539f, 0.380859f, 0.611328f, 0.370850f, 0.617188f, 0.361816f, 0.625977f, 0.352295f, + 0.630371f, 0.343750f, 0.637207f, 0.334717f, 0.643555f, 0.325684f, 0.649902f, 0.316650f, + 0.655762f, 0.307373f, 0.660156f, 0.298096f, 0.666016f, 0.288330f, 0.671387f, 0.279053f, + 0.675781f, 0.268799f, 0.680176f, 0.258301f, 0.685059f, 0.247192f, 0.686523f, 0.235718f, + 0.690918f, 0.223145f, 0.693359f, 0.208984f, 0.694336f, 0.194458f, 0.695801f, 0.176758f, + 0.696777f, 0.157349f, 0.693359f, 0.131958f, 0.684570f, 0.097412f, 0.661133f, 0.037842f, + 0.000000f, 1.000000f, 0.032623f, 0.984375f, 0.064941f, 0.961914f, 0.094177f, 0.938965f, + 0.122559f, 0.915039f, 0.148560f, 0.891602f, 0.172485f, 0.869141f, 0.196777f, 0.846191f, + 0.219849f, 0.824219f, 0.239868f, 0.803711f, 0.260498f, 0.782715f, 0.279541f, 0.762695f, + 0.298340f, 0.743652f, 0.314697f, 0.725098f, 0.330811f, 0.707031f, 0.347900f, 0.689453f, + 0.362061f, 0.672852f, 0.378662f, 0.655762f, 0.392090f, 0.640137f, 0.405762f, 0.624512f, + 0.418457f, 0.609375f, 0.432129f, 0.594727f, 0.445801f, 0.580078f, 0.457520f, 0.565918f, + 0.469971f, 0.551758f, 0.480469f, 0.538574f, 0.491699f, 0.525391f, 0.503418f, 0.512207f, + 0.513672f, 0.500000f, 0.522461f, 0.488281f, 0.532715f, 0.476074f, 0.543457f, 0.464355f, + 0.551758f, 0.452881f, 0.562012f, 0.441406f, 0.569336f, 0.430664f, 0.580078f, 0.419434f, + 0.586426f, 0.409180f, 0.596191f, 0.398193f, 0.603516f, 0.388428f, 0.611816f, 0.377930f, + 0.620605f, 0.367432f, 0.628418f, 0.357910f, 0.634766f, 0.348389f, 0.642090f, 0.339111f, + 0.648926f, 0.329346f, 0.655762f, 0.320312f, 0.662109f, 0.311279f, 0.667969f, 0.302246f, + 0.675293f, 0.293213f, 0.680176f, 0.283936f, 0.686035f, 0.273926f, 0.691895f, 0.264404f, + 0.696289f, 0.254395f, 0.701172f, 0.243896f, 0.708008f, 0.232788f, 0.710938f, 0.221558f, + 0.714355f, 0.209351f, 0.718750f, 0.195801f, 0.721191f, 0.181641f, 0.722168f, 0.165527f, + 0.723633f, 0.146851f, 0.721191f, 0.123413f, 0.714355f, 0.091125f, 0.694336f, 0.035065f, + 0.000000f, 1.000000f, 0.033020f, 0.983887f, 0.065308f, 0.961914f, 0.094727f, 0.938965f, + 0.123535f, 0.914551f, 0.149902f, 0.891602f, 0.175659f, 0.867188f, 0.199585f, 0.844727f, + 0.221313f, 0.823242f, 0.243652f, 0.800781f, 0.262939f, 0.780762f, 0.282959f, 0.760254f, + 0.300293f, 0.741211f, 0.319336f, 0.721680f, 0.337646f, 0.702637f, 0.353271f, 0.685547f, + 0.369141f, 0.667480f, 0.385010f, 0.650879f, 0.400146f, 0.634277f, 0.414551f, 0.618164f, + 0.428955f, 0.602539f, 0.440918f, 0.587891f, 0.454346f, 0.572754f, 0.466797f, 0.558594f, + 0.479248f, 0.544434f, 0.491211f, 0.530273f, 0.502441f, 0.517090f, 0.512695f, 0.504395f, + 0.523926f, 0.491455f, 0.535156f, 0.478516f, 0.544922f, 0.466797f, 0.554199f, 0.454590f, + 0.564941f, 0.442383f, 0.574219f, 0.430908f, 0.584473f, 0.419189f, 0.592773f, 0.408691f, + 0.603027f, 0.396973f, 0.612793f, 0.385742f, 0.620117f, 0.375732f, 0.625488f, 0.366211f, + 0.636719f, 0.354980f, 0.643555f, 0.345215f, 0.651855f, 0.334717f, 0.659668f, 0.324951f, + 0.667969f, 0.315186f, 0.673340f, 0.306152f, 0.679688f, 0.297363f, 0.687500f, 0.287598f, + 0.694824f, 0.278320f, 0.701660f, 0.269287f, 0.707031f, 0.259766f, 0.712402f, 0.249878f, + 0.718750f, 0.240234f, 0.722656f, 0.230103f, 0.728516f, 0.219116f, 0.733398f, 0.207886f, + 0.737793f, 0.196899f, 0.742676f, 0.183472f, 0.744629f, 0.169678f, 0.748047f, 0.154053f, + 0.747559f, 0.136230f, 0.748535f, 0.113220f, 0.744141f, 0.082703f, 0.728027f, 0.031616f, + 0.000000f, 1.000000f, 0.033752f, 0.983398f, 0.065613f, 0.961914f, 0.095276f, 0.938477f, + 0.124146f, 0.914062f, 0.150757f, 0.890625f, 0.176392f, 0.866699f, 0.200439f, 0.844238f, + 0.224243f, 0.821289f, 0.245117f, 0.799805f, 0.267090f, 0.778320f, 0.286621f, 0.758301f, + 0.306641f, 0.737305f, 0.323730f, 0.718262f, 0.342285f, 0.699219f, 0.359375f, 0.681152f, + 0.375977f, 0.663086f, 0.391602f, 0.645996f, 0.407227f, 0.628906f, 0.422119f, 0.612305f, + 0.435547f, 0.596680f, 0.448730f, 0.581543f, 0.462891f, 0.565918f, 0.475830f, 0.551270f, + 0.488037f, 0.536621f, 0.501465f, 0.522461f, 0.513184f, 0.508301f, 0.524902f, 0.495117f, + 0.536621f, 0.481689f, 0.546387f, 0.469482f, 0.557129f, 0.456543f, 0.568359f, 0.443848f, + 0.578613f, 0.431885f, 0.588867f, 0.419922f, 0.599121f, 0.407959f, 0.607422f, 0.396729f, + 0.616699f, 0.385498f, 0.626953f, 0.374268f, 0.634766f, 0.363525f, 0.643066f, 0.352783f, + 0.652344f, 0.342529f, 0.660156f, 0.332031f, 0.668945f, 0.321533f, 0.677246f, 0.311279f, + 0.685059f, 0.301758f, 0.691406f, 0.291992f, 0.699219f, 0.282715f, 0.706543f, 0.272949f, + 0.712891f, 0.263916f, 0.721191f, 0.254395f, 0.726562f, 0.245850f, 0.731934f, 0.235962f, + 0.739258f, 0.225464f, 0.745117f, 0.215942f, 0.750000f, 0.205566f, 0.755859f, 0.194336f, + 0.760254f, 0.183350f, 0.765137f, 0.171387f, 0.769043f, 0.158081f, 0.772461f, 0.142822f, + 0.773438f, 0.125977f, 0.774414f, 0.105103f, 0.771484f, 0.077087f, 0.757812f, 0.028961f, + 0.000000f, 1.000000f, 0.033691f, 0.983398f, 0.065063f, 0.962402f, 0.096558f, 0.937500f, + 0.125366f, 0.913574f, 0.152954f, 0.888672f, 0.177856f, 0.866211f, 0.202881f, 0.842285f, + 0.226318f, 0.819336f, 0.249023f, 0.797363f, 0.270508f, 0.775879f, 0.290771f, 0.754883f, + 0.309814f, 0.734375f, 0.330811f, 0.713867f, 0.347412f, 0.695801f, 0.364746f, 0.676758f, + 0.382324f, 0.658691f, 0.398438f, 0.640625f, 0.413818f, 0.623535f, 0.429688f, 0.606934f, + 0.443848f, 0.590332f, 0.458496f, 0.574219f, 0.472412f, 0.559082f, 0.485596f, 0.543457f, + 0.499023f, 0.528809f, 0.512207f, 0.514160f, 0.522949f, 0.500488f, 0.535156f, 0.486572f, + 0.547363f, 0.472900f, 0.558594f, 0.459473f, 0.570312f, 0.446533f, 0.580566f, 0.433838f, + 0.590820f, 0.421387f, 0.603027f, 0.408936f, 0.611328f, 0.397217f, 0.622559f, 0.385254f, + 0.631348f, 0.373779f, 0.641113f, 0.362549f, 0.650391f, 0.351562f, 0.659668f, 0.340088f, + 0.667480f, 0.329834f, 0.676270f, 0.319336f, 0.684570f, 0.309082f, 0.694824f, 0.297852f, + 0.701660f, 0.288086f, 0.709473f, 0.278320f, 0.717773f, 0.268311f, 0.723633f, 0.259277f, + 0.731445f, 0.249512f, 0.738770f, 0.240234f, 0.746094f, 0.230713f, 0.751953f, 0.222412f, + 0.758789f, 0.211792f, 0.765137f, 0.201660f, 0.772461f, 0.191772f, 0.776855f, 0.181396f, + 0.782227f, 0.170288f, 0.787598f, 0.158203f, 0.791016f, 0.145630f, 0.795410f, 0.131836f, + 0.797852f, 0.116455f, 0.800781f, 0.096130f, 0.798340f, 0.071167f, 0.787109f, 0.025589f, + 0.000000f, 1.000000f, 0.034302f, 0.983398f, 0.065308f, 0.962402f, 0.096863f, 0.937500f, + 0.125610f, 0.913086f, 0.153076f, 0.889160f, 0.179688f, 0.864746f, 0.204712f, 0.841309f, + 0.228760f, 0.817871f, 0.252441f, 0.794922f, 0.273438f, 0.773438f, 0.294922f, 0.751953f, + 0.314697f, 0.731445f, 0.334473f, 0.710938f, 0.354004f, 0.691406f, 0.369873f, 0.672363f, + 0.388184f, 0.653809f, 0.404541f, 0.635742f, 0.421875f, 0.617676f, 0.438965f, 0.600098f, + 0.452637f, 0.583496f, 0.466797f, 0.567383f, 0.481201f, 0.551270f, 0.495361f, 0.536133f, + 0.508301f, 0.520996f, 0.521973f, 0.506348f, 0.535156f, 0.491211f, 0.547852f, 0.477539f, + 0.558594f, 0.463867f, 0.569824f, 0.450195f, 0.582031f, 0.436768f, 0.593262f, 0.423584f, + 0.604492f, 0.410645f, 0.615723f, 0.398193f, 0.626953f, 0.385986f, 0.634277f, 0.374512f, + 0.646484f, 0.362061f, 0.656250f, 0.350586f, 0.665527f, 0.339111f, 0.675781f, 0.328125f, + 0.685059f, 0.316650f, 0.693359f, 0.306152f, 0.701660f, 0.295654f, 0.710449f, 0.285156f, + 0.719238f, 0.274658f, 0.726562f, 0.264648f, 0.734375f, 0.254639f, 0.743164f, 0.244751f, + 0.750977f, 0.234985f, 0.757324f, 0.226074f, 0.764648f, 0.216553f, 0.772949f, 0.206909f, + 0.780762f, 0.197876f, 0.784180f, 0.188477f, 0.791016f, 0.178223f, 0.798340f, 0.167847f, + 0.804688f, 0.157349f, 0.810547f, 0.146118f, 0.814453f, 0.134033f, 0.818848f, 0.120789f, + 0.821289f, 0.106506f, 0.824219f, 0.088257f, 0.825195f, 0.063965f, 0.814941f, 0.023544f, + 0.000000f, 1.000000f, 0.033966f, 0.983887f, 0.066040f, 0.961426f, 0.096497f, 0.937988f, + 0.126831f, 0.912598f, 0.153931f, 0.888672f, 0.181152f, 0.863770f, 0.207153f, 0.839355f, + 0.231567f, 0.815918f, 0.253418f, 0.793945f, 0.277100f, 0.770996f, 0.299072f, 0.749023f, + 0.319336f, 0.728027f, 0.339844f, 0.707031f, 0.358643f, 0.687012f, 0.376221f, 0.667969f, + 0.395020f, 0.648438f, 0.412109f, 0.630371f, 0.427734f, 0.612305f, 0.446289f, 0.594238f, + 0.461914f, 0.577148f, 0.475830f, 0.560547f, 0.490479f, 0.544434f, 0.504883f, 0.528320f, + 0.518555f, 0.512695f, 0.532227f, 0.498047f, 0.544922f, 0.483398f, 0.557617f, 0.468506f, + 0.571289f, 0.453857f, 0.583496f, 0.440186f, 0.595215f, 0.426758f, 0.605957f, 0.413574f, + 0.617676f, 0.400391f, 0.630859f, 0.386963f, 0.638672f, 0.375244f, 0.651367f, 0.362305f, + 0.661133f, 0.350586f, 0.671387f, 0.338867f, 0.681641f, 0.326904f, 0.689453f, 0.315674f, + 0.699707f, 0.304443f, 0.708984f, 0.293213f, 0.719238f, 0.282227f, 0.726074f, 0.272217f, + 0.735352f, 0.261719f, 0.744141f, 0.251221f, 0.753418f, 0.240356f, 0.762207f, 0.230713f, + 0.768066f, 0.221313f, 0.775879f, 0.211792f, 0.782715f, 0.202393f, 0.791504f, 0.192505f, + 0.798340f, 0.183960f, 0.805176f, 0.174316f, 0.811523f, 0.165283f, 0.818359f, 0.154419f, + 0.824219f, 0.144897f, 0.830078f, 0.134155f, 0.834961f, 0.123047f, 0.840332f, 0.110107f, + 0.844238f, 0.096313f, 0.846680f, 0.080017f, 0.848145f, 0.057251f, 0.842285f, 0.023071f, + 0.000000f, 1.000000f, 0.033997f, 0.983887f, 0.066833f, 0.960938f, 0.097168f, 0.937500f, + 0.127563f, 0.912109f, 0.155396f, 0.887695f, 0.183105f, 0.862793f, 0.208984f, 0.838379f, + 0.233887f, 0.814453f, 0.257812f, 0.791016f, 0.280518f, 0.768066f, 0.301758f, 0.746582f, + 0.323975f, 0.724609f, 0.344971f, 0.703613f, 0.364258f, 0.683105f, 0.383301f, 0.663086f, + 0.401611f, 0.644043f, 0.419189f, 0.625000f, 0.436768f, 0.606445f, 0.452393f, 0.588867f, + 0.468750f, 0.570801f, 0.484619f, 0.553711f, 0.500488f, 0.536621f, 0.516113f, 0.520508f, + 0.530273f, 0.504395f, 0.543945f, 0.489258f, 0.557129f, 0.474121f, 0.569824f, 0.459229f, + 0.583008f, 0.444580f, 0.595703f, 0.430420f, 0.607910f, 0.416748f, 0.620117f, 0.402832f, + 0.631836f, 0.389893f, 0.641602f, 0.376953f, 0.653320f, 0.363770f, 0.664551f, 0.351318f, + 0.675293f, 0.338867f, 0.687012f, 0.326416f, 0.695801f, 0.315430f, 0.706055f, 0.303223f, + 0.714355f, 0.292480f, 0.725586f, 0.280762f, 0.734863f, 0.269775f, 0.743164f, 0.259033f, + 0.751953f, 0.248657f, 0.761230f, 0.238159f, 0.770508f, 0.227783f, 0.778809f, 0.217407f, + 0.786621f, 0.207520f, 0.795410f, 0.197510f, 0.802246f, 0.188232f, 0.809082f, 0.178833f, + 0.816895f, 0.169800f, 0.823730f, 0.160522f, 0.830078f, 0.151611f, 0.839355f, 0.141724f, + 0.842773f, 0.132080f, 0.850586f, 0.121460f, 0.855469f, 0.111450f, 0.861328f, 0.099548f, + 0.866211f, 0.086487f, 0.869141f, 0.072083f, 0.872070f, 0.051971f, 0.868164f, 0.019196f, + 0.000000f, 1.000000f, 0.034058f, 0.983887f, 0.067078f, 0.960938f, 0.098328f, 0.936523f, + 0.128906f, 0.911133f, 0.156494f, 0.886719f, 0.184204f, 0.861816f, 0.211792f, 0.836914f, + 0.236084f, 0.812988f, 0.261719f, 0.788574f, 0.284424f, 0.765625f, 0.306152f, 0.743652f, + 0.328613f, 0.721191f, 0.349609f, 0.699707f, 0.369141f, 0.679199f, 0.389893f, 0.658203f, + 0.408447f, 0.638672f, 0.426514f, 0.619141f, 0.442871f, 0.600586f, 0.461182f, 0.582031f, + 0.478027f, 0.563965f, 0.495361f, 0.546387f, 0.509766f, 0.529297f, 0.523926f, 0.513184f, + 0.539551f, 0.496826f, 0.554199f, 0.480957f, 0.567383f, 0.465576f, 0.580566f, 0.450439f, + 0.595215f, 0.435059f, 0.608398f, 0.420898f, 0.619629f, 0.406982f, 0.631836f, 0.393066f, + 0.644531f, 0.378906f, 0.656738f, 0.365967f, 0.666992f, 0.353027f, 0.679199f, 0.340088f, + 0.690430f, 0.327148f, 0.699707f, 0.315430f, 0.711426f, 0.302979f, 0.721191f, 0.291504f, + 0.730957f, 0.279541f, 0.741211f, 0.268066f, 0.750000f, 0.257324f, 0.760254f, 0.246216f, + 0.768066f, 0.235474f, 0.778320f, 0.224731f, 0.785645f, 0.214966f, 0.795898f, 0.204224f, + 0.802734f, 0.194336f, 0.812500f, 0.184082f, 0.818848f, 0.174683f, 0.827637f, 0.164795f, + 0.835449f, 0.155762f, 0.842285f, 0.146606f, 0.849609f, 0.137817f, 0.856934f, 0.128662f, + 0.863281f, 0.119934f, 0.869629f, 0.109497f, 0.875977f, 0.099609f, 0.881836f, 0.089417f, + 0.887695f, 0.076904f, 0.891602f, 0.063049f, 0.895508f, 0.044708f, 0.893555f, 0.016769f, + 0.000000f, 1.000000f, 0.033264f, 0.984375f, 0.066284f, 0.961914f, 0.098633f, 0.936523f, + 0.128906f, 0.911621f, 0.158203f, 0.886230f, 0.186279f, 0.860352f, 0.213501f, 0.835449f, + 0.239624f, 0.811035f, 0.263672f, 0.787109f, 0.288086f, 0.763184f, 0.310303f, 0.740723f, + 0.333252f, 0.717773f, 0.355469f, 0.695801f, 0.375000f, 0.674805f, 0.395020f, 0.654297f, + 0.414062f, 0.634277f, 0.432861f, 0.613770f, 0.450439f, 0.595215f, 0.469238f, 0.575684f, + 0.485840f, 0.557617f, 0.502930f, 0.540039f, 0.519043f, 0.522461f, 0.533691f, 0.505371f, + 0.549316f, 0.488770f, 0.563477f, 0.472656f, 0.578125f, 0.456787f, 0.592285f, 0.441162f, + 0.606445f, 0.425781f, 0.620117f, 0.410889f, 0.633301f, 0.396729f, 0.644043f, 0.382812f, + 0.656250f, 0.368896f, 0.669434f, 0.354980f, 0.683105f, 0.341309f, 0.692383f, 0.329102f, + 0.703125f, 0.316162f, 0.715820f, 0.303467f, 0.725098f, 0.291504f, 0.737305f, 0.279053f, + 0.746582f, 0.267578f, 0.754883f, 0.256592f, 0.766113f, 0.244629f, 0.775391f, 0.233643f, + 0.785645f, 0.222778f, 0.794434f, 0.212036f, 0.803223f, 0.201294f, 0.812500f, 0.191040f, + 0.819824f, 0.181519f, 0.829590f, 0.171143f, 0.837402f, 0.161377f, 0.845215f, 0.151367f, + 0.852539f, 0.142212f, 0.861816f, 0.132690f, 0.867188f, 0.124573f, 0.874512f, 0.115173f, + 0.881836f, 0.106506f, 0.888672f, 0.097778f, 0.895508f, 0.087830f, 0.902344f, 0.077271f, + 0.908203f, 0.067383f, 0.913086f, 0.054840f, 0.916504f, 0.039185f, 0.916504f, 0.014191f, + 0.000000f, 1.000000f, 0.033478f, 0.984375f, 0.066833f, 0.961426f, 0.098694f, 0.936523f, + 0.130005f, 0.910645f, 0.159424f, 0.885254f, 0.187866f, 0.859375f, 0.215088f, 0.834473f, + 0.241333f, 0.809082f, 0.266602f, 0.785156f, 0.290771f, 0.761230f, 0.314941f, 0.737305f, + 0.336670f, 0.715332f, 0.359375f, 0.692383f, 0.380859f, 0.670410f, 0.400146f, 0.649902f, + 0.422119f, 0.628418f, 0.440674f, 0.608398f, 0.459717f, 0.588867f, 0.477783f, 0.569336f, + 0.494629f, 0.550781f, 0.511719f, 0.532227f, 0.526855f, 0.515137f, 0.542480f, 0.498047f, + 0.559082f, 0.480957f, 0.574219f, 0.464111f, 0.589355f, 0.447754f, 0.603027f, 0.432129f, + 0.618164f, 0.416504f, 0.632812f, 0.401123f, 0.644043f, 0.386963f, 0.657715f, 0.372314f, + 0.670898f, 0.358154f, 0.682617f, 0.344727f, 0.695312f, 0.330566f, 0.707520f, 0.317383f, + 0.719238f, 0.304688f, 0.729004f, 0.291992f, 0.740234f, 0.279541f, 0.751465f, 0.267090f, + 0.761230f, 0.255371f, 0.771973f, 0.243774f, 0.782227f, 0.232300f, 0.790527f, 0.221436f, + 0.801758f, 0.209717f, 0.810547f, 0.199585f, 0.818359f, 0.189087f, 0.828125f, 0.178467f, + 0.836426f, 0.168091f, 0.846191f, 0.158203f, 0.852539f, 0.149292f, 0.861816f, 0.138794f, + 0.871094f, 0.128784f, 0.876465f, 0.120483f, 0.885254f, 0.110779f, 0.894043f, 0.101440f, + 0.899902f, 0.093384f, 0.907715f, 0.084656f, 0.914551f, 0.076172f, 0.920898f, 0.067810f, + 0.926758f, 0.057373f, 0.933105f, 0.046234f, 0.937012f, 0.032898f, 0.937988f, 0.011459f, + 0.000000f, 1.000000f, 0.033630f, 0.983887f, 0.067444f, 0.960938f, 0.098999f, 0.936523f, + 0.129883f, 0.910645f, 0.160889f, 0.883789f, 0.189819f, 0.858398f, 0.217163f, 0.833008f, + 0.244019f, 0.807617f, 0.270752f, 0.782227f, 0.296143f, 0.757812f, 0.319092f, 0.734375f, + 0.342529f, 0.710938f, 0.364014f, 0.688477f, 0.385986f, 0.666504f, 0.407959f, 0.644531f, + 0.427246f, 0.624023f, 0.447754f, 0.603027f, 0.466553f, 0.583008f, 0.484375f, 0.563477f, + 0.501465f, 0.544922f, 0.520508f, 0.525879f, 0.539062f, 0.506836f, 0.555664f, 0.489258f, + 0.571289f, 0.471924f, 0.586426f, 0.455078f, 0.601562f, 0.438477f, 0.616699f, 0.422363f, + 0.631348f, 0.406738f, 0.645996f, 0.391357f, 0.657715f, 0.376953f, 0.668945f, 0.362793f, + 0.683105f, 0.347900f, 0.695801f, 0.333496f, 0.709473f, 0.319336f, 0.721680f, 0.306152f, + 0.732422f, 0.293945f, 0.741699f, 0.281006f, 0.754395f, 0.267578f, 0.766113f, 0.255371f, + 0.776855f, 0.243774f, 0.785645f, 0.232300f, 0.796875f, 0.220093f, 0.806641f, 0.208984f, + 0.816406f, 0.197876f, 0.825684f, 0.187134f, 0.835449f, 0.176392f, 0.845215f, 0.165771f, + 0.853027f, 0.155762f, 0.862305f, 0.145752f, 0.871094f, 0.135498f, 0.879395f, 0.125732f, + 0.886230f, 0.116943f, 0.894531f, 0.107727f, 0.903320f, 0.098267f, 0.911133f, 0.088867f, + 0.917969f, 0.080261f, 0.924805f, 0.071716f, 0.931641f, 0.063538f, 0.938477f, 0.055145f, + 0.945312f, 0.046967f, 0.951172f, 0.038208f, 0.956055f, 0.026398f, 0.960449f, 0.009575f, + 0.000000f, 1.000000f, 0.034332f, 0.983887f, 0.066467f, 0.961914f, 0.099854f, 0.936035f, + 0.131104f, 0.910156f, 0.162109f, 0.883301f, 0.191162f, 0.857422f, 0.219360f, 0.831543f, + 0.247070f, 0.805664f, 0.273926f, 0.780273f, 0.298828f, 0.755371f, 0.322754f, 0.731934f, + 0.347168f, 0.708008f, 0.370850f, 0.684082f, 0.392822f, 0.661621f, 0.413330f, 0.640137f, + 0.435303f, 0.618652f, 0.455078f, 0.597656f, 0.473877f, 0.577148f, 0.493896f, 0.556641f, + 0.512207f, 0.537109f, 0.530762f, 0.518066f, 0.548340f, 0.499512f, 0.564453f, 0.481689f, + 0.581055f, 0.464111f, 0.597168f, 0.446777f, 0.611816f, 0.430176f, 0.626465f, 0.413574f, + 0.642090f, 0.397461f, 0.655762f, 0.382080f, 0.670410f, 0.366699f, 0.682617f, 0.351807f, + 0.697266f, 0.337158f, 0.710449f, 0.322754f, 0.722656f, 0.309082f, 0.733398f, 0.295654f, + 0.746582f, 0.282227f, 0.758301f, 0.269043f, 0.769531f, 0.256104f, 0.780273f, 0.244141f, + 0.791016f, 0.231934f, 0.801758f, 0.219849f, 0.811035f, 0.208374f, 0.821777f, 0.197021f, + 0.831055f, 0.186035f, 0.842285f, 0.174561f, 0.850586f, 0.164062f, 0.860840f, 0.153442f, + 0.868652f, 0.143311f, 0.877441f, 0.133545f, 0.886719f, 0.123291f, 0.894531f, 0.113953f, + 0.901367f, 0.105103f, 0.911621f, 0.095093f, 0.919434f, 0.085938f, 0.926270f, 0.077271f, + 0.934570f, 0.068787f, 0.941895f, 0.059631f, 0.949219f, 0.051025f, 0.956055f, 0.042542f, + 0.963867f, 0.034424f, 0.969727f, 0.027069f, 0.976074f, 0.018982f, 0.980469f, 0.005779f, + 0.000000f, 1.000000f, 0.034424f, 0.983887f, 0.066284f, 0.961914f, 0.100586f, 0.935547f, + 0.132080f, 0.909668f, 0.162842f, 0.882812f, 0.192383f, 0.856445f, 0.221924f, 0.829590f, + 0.250000f, 0.803223f, 0.276611f, 0.778320f, 0.301758f, 0.753418f, 0.328613f, 0.728027f, + 0.350342f, 0.705078f, 0.375977f, 0.680176f, 0.397461f, 0.658203f, 0.421631f, 0.634766f, + 0.441650f, 0.613281f, 0.461182f, 0.592285f, 0.483643f, 0.570801f, 0.502441f, 0.550293f, + 0.520996f, 0.530273f, 0.538574f, 0.511230f, 0.556152f, 0.492676f, 0.574219f, 0.474121f, + 0.591797f, 0.455811f, 0.607422f, 0.438232f, 0.623535f, 0.421143f, 0.639648f, 0.404297f, + 0.655273f, 0.387939f, 0.668457f, 0.372314f, 0.682129f, 0.356934f, 0.695801f, 0.341797f, + 0.708496f, 0.327393f, 0.721680f, 0.312500f, 0.735840f, 0.297852f, 0.750000f, 0.284180f, + 0.759766f, 0.271729f, 0.770020f, 0.258301f, 0.784180f, 0.244629f, 0.796875f, 0.232422f, + 0.803223f, 0.220947f, 0.816406f, 0.208008f, 0.828613f, 0.196289f, 0.835449f, 0.185547f, + 0.847656f, 0.173462f, 0.856445f, 0.163574f, 0.865723f, 0.152222f, 0.876465f, 0.141602f, + 0.883789f, 0.131714f, 0.894043f, 0.121216f, 0.902344f, 0.111694f, 0.910645f, 0.101868f, + 0.920410f, 0.091797f, 0.927246f, 0.083313f, 0.936523f, 0.073181f, 0.942383f, 0.065674f, + 0.952637f, 0.055176f, 0.957031f, 0.049164f, 0.968262f, 0.037628f, 0.968262f, 0.033844f, + 0.983887f, 0.020599f, 0.983887f, 0.016708f, 0.996582f, 0.005913f, 0.999512f, 0.000015f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.997070f, 0.000000f, 0.995605f, 0.000000f, 0.994629f, 0.000000f, 0.993164f, + 0.000000f, 0.990723f, 0.000000f, 0.989258f, 0.000000f, 0.986816f, 0.000000f, 0.984375f, + 0.000000f, 0.982422f, 0.000000f, 0.979492f, 0.000000f, 0.975586f, 0.000000f, 0.973633f, + 0.000000f, 0.970215f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958984f, + 0.000000f, 0.954590f, 0.000000f, 0.950195f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, + 0.000000f, 0.935547f, 0.000000f, 0.930176f, 0.000000f, 0.924805f, 0.000000f, 0.918945f, + 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f, + 0.000000f, 0.884766f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860840f, + 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f, + 0.000000f, 0.811523f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f, + 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717773f, + 0.000000f, 0.700195f, 0.000000f, 0.682617f, 0.000000f, 0.663086f, 0.000000f, 0.643066f, + 0.000000f, 0.622070f, 0.000000f, 0.597656f, 0.000000f, 0.572266f, 0.000000f, 0.544922f, + 0.000000f, 0.515625f, 0.000000f, 0.480957f, 0.000000f, 0.444092f, 0.000000f, 0.401367f, + 0.000000f, 0.351074f, 0.000000f, 0.289551f, 0.000000f, 0.207397f, 0.000000f, 0.080261f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998535f, + 0.000000f, 0.997070f, 0.000000f, 0.996094f, 0.000000f, 0.994629f, 0.000000f, 0.992676f, + 0.000000f, 0.991211f, 0.000000f, 0.988770f, 0.000000f, 0.986816f, 0.000000f, 0.984375f, + 0.000000f, 0.981934f, 0.000000f, 0.979492f, 0.000000f, 0.976074f, 0.000000f, 0.973145f, + 0.000000f, 0.969727f, 0.000000f, 0.966309f, 0.000000f, 0.961914f, 0.000000f, 0.958496f, + 0.000000f, 0.954590f, 0.000000f, 0.949707f, 0.000000f, 0.945312f, 0.000000f, 0.940430f, + 0.000000f, 0.935059f, 0.000000f, 0.929688f, 0.000000f, 0.924316f, 0.000000f, 0.918457f, + 0.000000f, 0.912598f, 0.000000f, 0.906250f, 0.000000f, 0.899414f, 0.000000f, 0.892090f, + 0.000000f, 0.884277f, 0.000000f, 0.876953f, 0.000000f, 0.869141f, 0.000000f, 0.860352f, + 0.000000f, 0.851562f, 0.000000f, 0.841797f, 0.000000f, 0.832031f, 0.000000f, 0.821777f, + 0.000000f, 0.811035f, 0.000000f, 0.799805f, 0.000000f, 0.787598f, 0.000000f, 0.774902f, + 0.000000f, 0.761230f, 0.000000f, 0.747070f, 0.000000f, 0.732910f, 0.000000f, 0.717285f, + 0.000001f, 0.699707f, 0.000004f, 0.682617f, 0.000007f, 0.662598f, 0.000009f, 0.643066f, + 0.000009f, 0.622070f, 0.000009f, 0.597656f, 0.000009f, 0.572266f, 0.000008f, 0.544922f, + 0.000007f, 0.516113f, 0.000006f, 0.481689f, 0.000006f, 0.443604f, 0.000005f, 0.402100f, + 0.000004f, 0.351562f, 0.000003f, 0.289062f, 0.000002f, 0.207764f, 0.000001f, 0.079895f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.996582f, 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, + 0.000000f, 0.990723f, 0.000000f, 0.988770f, 0.000000f, 0.986328f, 0.000000f, 0.984375f, + 0.000000f, 0.981445f, 0.000000f, 0.979004f, 0.000000f, 0.975586f, 0.000000f, 0.972168f, + 0.000000f, 0.969238f, 0.000000f, 0.965820f, 0.000000f, 0.961914f, 0.000000f, 0.958008f, + 0.000002f, 0.953613f, 0.000007f, 0.949707f, 0.000012f, 0.944824f, 0.000018f, 0.939941f, + 0.000024f, 0.934570f, 0.000031f, 0.929199f, 0.000038f, 0.923340f, 0.000044f, 0.917480f, + 0.000052f, 0.911621f, 0.000059f, 0.905762f, 0.000066f, 0.898438f, 0.000072f, 0.891602f, + 0.000080f, 0.883789f, 0.000087f, 0.875977f, 0.000093f, 0.868164f, 0.000095f, 0.859863f, + 0.000096f, 0.850586f, 0.000096f, 0.841309f, 0.000093f, 0.831543f, 0.000090f, 0.821289f, + 0.000087f, 0.810059f, 0.000084f, 0.799316f, 0.000079f, 0.787109f, 0.000073f, 0.773926f, + 0.000072f, 0.760742f, 0.000072f, 0.747070f, 0.000073f, 0.732422f, 0.000073f, 0.716309f, + 0.000074f, 0.699707f, 0.000072f, 0.681641f, 0.000067f, 0.663086f, 0.000064f, 0.643066f, + 0.000062f, 0.621582f, 0.000062f, 0.597168f, 0.000057f, 0.571777f, 0.000056f, 0.544434f, + 0.000053f, 0.515625f, 0.000048f, 0.481445f, 0.000044f, 0.443359f, 0.000042f, 0.401855f, + 0.000034f, 0.350830f, 0.000030f, 0.288818f, 0.000019f, 0.207642f, 0.000006f, 0.079651f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000003f, 0.998047f, + 0.000020f, 0.997070f, 0.000045f, 0.995605f, 0.000063f, 0.994141f, 0.000085f, 0.992188f, + 0.000104f, 0.990234f, 0.000119f, 0.988281f, 0.000136f, 0.985840f, 0.000154f, 0.983398f, + 0.000168f, 0.980957f, 0.000179f, 0.978027f, 0.000192f, 0.975098f, 0.000208f, 0.971680f, + 0.000221f, 0.968262f, 0.000231f, 0.964844f, 0.000239f, 0.960938f, 0.000250f, 0.957031f, + 0.000263f, 0.953125f, 0.000273f, 0.948242f, 0.000282f, 0.944336f, 0.000288f, 0.938965f, + 0.000292f, 0.934082f, 0.000296f, 0.928223f, 0.000294f, 0.922852f, 0.000290f, 0.916992f, + 0.000287f, 0.911133f, 0.000285f, 0.904785f, 0.000280f, 0.897461f, 0.000284f, 0.890137f, + 0.000287f, 0.882812f, 0.000288f, 0.875000f, 0.000289f, 0.867188f, 0.000290f, 0.858398f, + 0.000281f, 0.849609f, 0.000287f, 0.839844f, 0.000291f, 0.830566f, 0.000292f, 0.820312f, + 0.000292f, 0.809570f, 0.000291f, 0.797852f, 0.000276f, 0.786133f, 0.000277f, 0.773438f, + 0.000278f, 0.759766f, 0.000278f, 0.746094f, 0.000274f, 0.731445f, 0.000252f, 0.715820f, + 0.000254f, 0.698730f, 0.000252f, 0.681152f, 0.000248f, 0.662109f, 0.000243f, 0.642578f, + 0.000218f, 0.621094f, 0.000218f, 0.597168f, 0.000210f, 0.571289f, 0.000203f, 0.544434f, + 0.000191f, 0.515137f, 0.000172f, 0.480957f, 0.000160f, 0.443115f, 0.000149f, 0.401611f, + 0.000123f, 0.350830f, 0.000106f, 0.288818f, 0.000073f, 0.207642f, 0.000020f, 0.079895f, + 0.000000f, 1.000000f, 0.000185f, 0.999512f, 0.000298f, 0.998535f, 0.000294f, 0.997559f, + 0.000370f, 0.996094f, 0.000383f, 0.994629f, 0.000383f, 0.993164f, 0.000381f, 0.991699f, + 0.000452f, 0.989258f, 0.000458f, 0.987305f, 0.000459f, 0.984863f, 0.000458f, 0.982910f, + 0.000511f, 0.979492f, 0.000525f, 0.976562f, 0.000539f, 0.974121f, 0.000551f, 0.970703f, + 0.000565f, 0.967285f, 0.000621f, 0.963867f, 0.000637f, 0.959961f, 0.000641f, 0.955566f, + 0.000637f, 0.951660f, 0.000631f, 0.947266f, 0.000626f, 0.942871f, 0.000665f, 0.937500f, + 0.000668f, 0.932129f, 0.000652f, 0.926758f, 0.000655f, 0.920898f, 0.000660f, 0.915527f, + 0.000666f, 0.909668f, 0.000706f, 0.902832f, 0.000720f, 0.895996f, 0.000705f, 0.888672f, + 0.000704f, 0.881348f, 0.000700f, 0.874023f, 0.000696f, 0.865723f, 0.000721f, 0.857422f, + 0.000701f, 0.848145f, 0.000705f, 0.838867f, 0.000701f, 0.829102f, 0.000694f, 0.818848f, + 0.000688f, 0.808594f, 0.000710f, 0.796875f, 0.000680f, 0.784668f, 0.000670f, 0.771973f, + 0.000663f, 0.758789f, 0.000656f, 0.745117f, 0.000648f, 0.730469f, 0.000666f, 0.714844f, + 0.000614f, 0.697754f, 0.000600f, 0.680176f, 0.000590f, 0.661133f, 0.000580f, 0.641602f, + 0.000583f, 0.620117f, 0.000522f, 0.596191f, 0.000506f, 0.570801f, 0.000488f, 0.544434f, + 0.000480f, 0.514648f, 0.000417f, 0.480713f, 0.000394f, 0.443115f, 0.000362f, 0.401855f, + 0.000302f, 0.350830f, 0.000257f, 0.289062f, 0.000174f, 0.206909f, 0.000042f, 0.080078f, + 0.000000f, 1.000000f, 0.000337f, 0.999023f, 0.000554f, 0.998047f, 0.000512f, 0.997070f, + 0.000679f, 0.995605f, 0.000685f, 0.994141f, 0.000697f, 0.992188f, 0.000701f, 0.990723f, + 0.000876f, 0.988281f, 0.000892f, 0.986328f, 0.000899f, 0.984375f, 0.000913f, 0.981934f, + 0.001050f, 0.978516f, 0.001065f, 0.976074f, 0.001062f, 0.972656f, 0.001066f, 0.969727f, + 0.001066f, 0.965820f, 0.001171f, 0.962402f, 0.001182f, 0.958008f, 0.001184f, 0.954102f, + 0.001179f, 0.949707f, 0.001186f, 0.945801f, 0.001189f, 0.941406f, 0.001287f, 0.936035f, + 0.001306f, 0.930664f, 0.001294f, 0.925293f, 0.001304f, 0.919434f, 0.001305f, 0.914062f, + 0.001305f, 0.908203f, 0.001375f, 0.900879f, 0.001380f, 0.894043f, 0.001350f, 0.886719f, + 0.001364f, 0.879395f, 0.001354f, 0.872070f, 0.001351f, 0.864258f, 0.001410f, 0.854980f, + 0.001416f, 0.846191f, 0.001375f, 0.836426f, 0.001357f, 0.826660f, 0.001353f, 0.816895f, + 0.001342f, 0.807129f, 0.001385f, 0.795410f, 0.001338f, 0.782715f, 0.001338f, 0.770020f, + 0.001292f, 0.757324f, 0.001280f, 0.743164f, 0.001266f, 0.729492f, 0.001297f, 0.713379f, + 0.001238f, 0.696289f, 0.001184f, 0.678711f, 0.001159f, 0.660156f, 0.001134f, 0.640625f, + 0.001145f, 0.618652f, 0.001055f, 0.595215f, 0.001001f, 0.570312f, 0.000966f, 0.543457f, + 0.000953f, 0.514160f, 0.000840f, 0.479980f, 0.000782f, 0.442383f, 0.000719f, 0.401611f, + 0.000603f, 0.350098f, 0.000506f, 0.289307f, 0.000332f, 0.207275f, 0.000074f, 0.079468f, + 0.000000f, 1.000000f, 0.000518f, 0.999023f, 0.000906f, 0.997559f, 0.000903f, 0.996582f, + 0.001175f, 0.994629f, 0.001205f, 0.993652f, 0.001199f, 0.991699f, 0.001201f, 0.989746f, + 0.001484f, 0.987305f, 0.001515f, 0.984863f, 0.001541f, 0.982422f, 0.001551f, 0.980469f, + 0.001749f, 0.977051f, 0.001771f, 0.974121f, 0.001785f, 0.971191f, 0.001799f, 0.967773f, + 0.001780f, 0.964355f, 0.001976f, 0.959961f, 0.002014f, 0.956543f, 0.002035f, 0.952148f, + 0.002056f, 0.948242f, 0.002037f, 0.943848f, 0.002047f, 0.939453f, 0.002216f, 0.933594f, + 0.002234f, 0.928223f, 0.002243f, 0.922852f, 0.002201f, 0.916992f, 0.002226f, 0.911621f, + 0.002224f, 0.905762f, 0.002361f, 0.898926f, 0.002377f, 0.891602f, 0.002323f, 0.884766f, + 0.002340f, 0.877441f, 0.002316f, 0.869629f, 0.002314f, 0.862305f, 0.002420f, 0.853027f, + 0.002436f, 0.844238f, 0.002373f, 0.834473f, 0.002373f, 0.825195f, 0.002335f, 0.814941f, + 0.002304f, 0.804688f, 0.002392f, 0.793457f, 0.002390f, 0.780762f, 0.002316f, 0.768555f, + 0.002264f, 0.755371f, 0.002218f, 0.742188f, 0.002239f, 0.728027f, 0.002245f, 0.711426f, + 0.002165f, 0.694824f, 0.002094f, 0.677246f, 0.002018f, 0.659180f, 0.001966f, 0.639648f, + 0.001995f, 0.617676f, 0.001859f, 0.594238f, 0.001762f, 0.568848f, 0.001684f, 0.542480f, + 0.001666f, 0.513184f, 0.001490f, 0.478760f, 0.001363f, 0.441895f, 0.001249f, 0.401367f, + 0.001061f, 0.350342f, 0.000866f, 0.289062f, 0.000556f, 0.206787f, 0.000117f, 0.078979f, + 0.000000f, 1.000000f, 0.000760f, 0.999023f, 0.001332f, 0.997070f, 0.001328f, 0.996094f, + 0.001492f, 0.994141f, 0.001834f, 0.992676f, 0.001856f, 0.990723f, 0.001965f, 0.988770f, + 0.002293f, 0.985840f, 0.002340f, 0.983887f, 0.002354f, 0.981445f, 0.002365f, 0.979004f, + 0.002703f, 0.975098f, 0.002726f, 0.972168f, 0.002771f, 0.968750f, 0.002802f, 0.965820f, + 0.002825f, 0.962402f, 0.003088f, 0.958008f, 0.003153f, 0.954102f, 0.003189f, 0.949707f, + 0.003204f, 0.945801f, 0.003216f, 0.941406f, 0.003246f, 0.936523f, 0.003475f, 0.931152f, + 0.003502f, 0.925781f, 0.003517f, 0.920410f, 0.003540f, 0.915039f, 0.003492f, 0.909668f, + 0.003565f, 0.902832f, 0.003706f, 0.895996f, 0.003731f, 0.889160f, 0.003752f, 0.881836f, + 0.003683f, 0.874512f, 0.003696f, 0.867676f, 0.003693f, 0.859375f, 0.003820f, 0.850098f, + 0.003847f, 0.841309f, 0.003754f, 0.832031f, 0.003759f, 0.822266f, 0.003698f, 0.812988f, + 0.003683f, 0.802246f, 0.003784f, 0.790527f, 0.003775f, 0.778320f, 0.003683f, 0.766113f, + 0.003603f, 0.752930f, 0.003542f, 0.739746f, 0.003592f, 0.725586f, 0.003561f, 0.709473f, + 0.003452f, 0.692871f, 0.003357f, 0.675293f, 0.003233f, 0.657227f, 0.003132f, 0.638672f, + 0.003176f, 0.615723f, 0.002989f, 0.592773f, 0.002840f, 0.568359f, 0.002689f, 0.541992f, + 0.002653f, 0.511719f, 0.002439f, 0.478760f, 0.002193f, 0.441895f, 0.001974f, 0.401123f, + 0.001719f, 0.349121f, 0.001345f, 0.288574f, 0.000865f, 0.206299f, 0.000174f, 0.078552f, + 0.000000f, 1.000000f, 0.000584f, 0.999023f, 0.001467f, 0.997070f, 0.001897f, 0.995605f, + 0.002226f, 0.993652f, 0.002655f, 0.991699f, 0.002668f, 0.989746f, 0.002922f, 0.987305f, + 0.003340f, 0.984375f, 0.003370f, 0.981934f, 0.003416f, 0.979980f, 0.003435f, 0.977539f, + 0.003956f, 0.973145f, 0.004028f, 0.970215f, 0.004055f, 0.966797f, 0.004105f, 0.963379f, + 0.004257f, 0.960449f, 0.004597f, 0.955566f, 0.004604f, 0.951172f, 0.004665f, 0.947266f, + 0.004723f, 0.943359f, 0.004742f, 0.938965f, 0.004845f, 0.933594f, 0.005104f, 0.927734f, + 0.005180f, 0.922852f, 0.005192f, 0.916992f, 0.005230f, 0.912109f, 0.005150f, 0.906250f, + 0.005314f, 0.899902f, 0.005489f, 0.892578f, 0.005543f, 0.885742f, 0.005539f, 0.878906f, + 0.005474f, 0.872070f, 0.005474f, 0.864258f, 0.005520f, 0.855957f, 0.005726f, 0.847168f, + 0.005707f, 0.838379f, 0.005699f, 0.829102f, 0.005589f, 0.819336f, 0.005505f, 0.810059f, + 0.005581f, 0.799316f, 0.005684f, 0.787109f, 0.005650f, 0.775879f, 0.005516f, 0.763184f, + 0.005386f, 0.750488f, 0.005295f, 0.737305f, 0.005390f, 0.722656f, 0.005352f, 0.706543f, + 0.005177f, 0.690430f, 0.005039f, 0.673340f, 0.004902f, 0.655762f, 0.004784f, 0.636719f, + 0.004765f, 0.613770f, 0.004570f, 0.590820f, 0.004318f, 0.566895f, 0.004059f, 0.541016f, + 0.003971f, 0.510742f, 0.003651f, 0.477295f, 0.003283f, 0.441162f, 0.002920f, 0.401123f, + 0.002542f, 0.348877f, 0.001953f, 0.289062f, 0.001245f, 0.206177f, 0.000248f, 0.078003f, + 0.000000f, 1.000000f, 0.000916f, 0.998535f, 0.002106f, 0.996582f, 0.002583f, 0.995117f, + 0.003138f, 0.992676f, 0.003239f, 0.990723f, 0.003679f, 0.988281f, 0.003891f, 0.985840f, + 0.004288f, 0.982910f, 0.004719f, 0.979980f, 0.004738f, 0.977539f, 0.004902f, 0.974609f, + 0.005215f, 0.970703f, 0.005634f, 0.967285f, 0.005722f, 0.964355f, 0.005714f, 0.960938f, + 0.006035f, 0.957031f, 0.006458f, 0.952637f, 0.006542f, 0.948242f, 0.006550f, 0.943848f, + 0.006618f, 0.940430f, 0.006676f, 0.936035f, 0.006981f, 0.930176f, 0.007221f, 0.924316f, + 0.007290f, 0.918945f, 0.007370f, 0.914062f, 0.007359f, 0.908691f, 0.007412f, 0.903320f, + 0.007557f, 0.895996f, 0.007835f, 0.889160f, 0.007828f, 0.882324f, 0.007881f, 0.875488f, + 0.007858f, 0.868652f, 0.007793f, 0.861328f, 0.007980f, 0.852539f, 0.008125f, 0.843262f, + 0.008156f, 0.834473f, 0.008118f, 0.825684f, 0.007973f, 0.816406f, 0.007935f, 0.806641f, + 0.007988f, 0.795898f, 0.008095f, 0.784180f, 0.008041f, 0.772461f, 0.007866f, 0.760254f, + 0.007805f, 0.748047f, 0.007648f, 0.734863f, 0.007763f, 0.719727f, 0.007629f, 0.704102f, + 0.007427f, 0.687988f, 0.007202f, 0.670898f, 0.007019f, 0.653809f, 0.006924f, 0.634277f, + 0.006840f, 0.611816f, 0.006519f, 0.588867f, 0.006172f, 0.565430f, 0.005829f, 0.540039f, + 0.005642f, 0.509277f, 0.005196f, 0.476074f, 0.004684f, 0.440674f, 0.004120f, 0.400391f, + 0.003605f, 0.348145f, 0.002705f, 0.289062f, 0.001725f, 0.205566f, 0.000326f, 0.077332f, + 0.000000f, 1.000000f, 0.001302f, 0.998535f, 0.001939f, 0.996582f, 0.002926f, 0.994629f, + 0.003897f, 0.991211f, 0.004383f, 0.988770f, 0.004898f, 0.986816f, 0.005314f, 0.983887f, + 0.005802f, 0.980957f, 0.006329f, 0.978516f, 0.006432f, 0.976074f, 0.006756f, 0.972168f, + 0.007172f, 0.968262f, 0.007656f, 0.964844f, 0.007710f, 0.961426f, 0.007797f, 0.958496f, + 0.008072f, 0.953613f, 0.008446f, 0.949219f, 0.008881f, 0.944824f, 0.009026f, 0.940918f, + 0.008965f, 0.936523f, 0.009109f, 0.932129f, 0.009590f, 0.926270f, 0.009941f, 0.920898f, + 0.009941f, 0.915527f, 0.010002f, 0.910156f, 0.010109f, 0.905273f, 0.010208f, 0.899414f, + 0.010445f, 0.892090f, 0.010719f, 0.884766f, 0.010773f, 0.877930f, 0.010765f, 0.871582f, + 0.010803f, 0.864746f, 0.010658f, 0.857422f, 0.010979f, 0.848145f, 0.011276f, 0.839355f, + 0.011192f, 0.830566f, 0.011116f, 0.821777f, 0.010918f, 0.812500f, 0.010918f, 0.803223f, + 0.011047f, 0.791992f, 0.011230f, 0.780762f, 0.011131f, 0.769043f, 0.010994f, 0.757324f, + 0.010757f, 0.744629f, 0.010490f, 0.732422f, 0.010696f, 0.716309f, 0.010574f, 0.700684f, + 0.010399f, 0.685059f, 0.010048f, 0.668457f, 0.009720f, 0.651855f, 0.009651f, 0.631348f, + 0.009384f, 0.609375f, 0.008987f, 0.587402f, 0.008461f, 0.563965f, 0.007965f, 0.539062f, + 0.007744f, 0.507812f, 0.007160f, 0.474854f, 0.006374f, 0.439697f, 0.005653f, 0.399414f, + 0.004845f, 0.348389f, 0.003616f, 0.288818f, 0.002266f, 0.205444f, 0.000417f, 0.076965f, + 0.000000f, 1.000000f, 0.001271f, 0.998535f, 0.002785f, 0.996094f, 0.003345f, 0.994141f, + 0.004704f, 0.990234f, 0.005741f, 0.987793f, 0.005882f, 0.985840f, 0.007034f, 0.981445f, + 0.007622f, 0.978516f, 0.007812f, 0.976074f, 0.008369f, 0.973145f, 0.009026f, 0.969238f, + 0.009521f, 0.965332f, 0.009666f, 0.961914f, 0.010216f, 0.958496f, 0.010292f, 0.955078f, + 0.010887f, 0.950195f, 0.011253f, 0.945312f, 0.011703f, 0.940918f, 0.011879f, 0.937012f, + 0.012062f, 0.933594f, 0.012314f, 0.927734f, 0.012794f, 0.921875f, 0.013214f, 0.916504f, + 0.013321f, 0.911621f, 0.013275f, 0.905762f, 0.013367f, 0.900879f, 0.013672f, 0.894043f, + 0.014053f, 0.887207f, 0.014336f, 0.880371f, 0.014351f, 0.873535f, 0.014389f, 0.867188f, + 0.014389f, 0.860840f, 0.014565f, 0.852539f, 0.014717f, 0.843262f, 0.015007f, 0.834961f, + 0.014885f, 0.826172f, 0.014946f, 0.817871f, 0.014816f, 0.809082f, 0.014755f, 0.798828f, + 0.014931f, 0.787598f, 0.014984f, 0.775879f, 0.014824f, 0.764648f, 0.014648f, 0.753418f, + 0.014351f, 0.741699f, 0.014252f, 0.728516f, 0.014442f, 0.712891f, 0.014107f, 0.697754f, + 0.013870f, 0.682129f, 0.013451f, 0.666016f, 0.012978f, 0.649414f, 0.012909f, 0.628418f, + 0.012581f, 0.607422f, 0.012024f, 0.585449f, 0.011368f, 0.562500f, 0.010658f, 0.537598f, + 0.010315f, 0.506348f, 0.009468f, 0.473877f, 0.008453f, 0.439209f, 0.007465f, 0.397949f, + 0.006321f, 0.346924f, 0.004692f, 0.289307f, 0.002895f, 0.205200f, 0.000525f, 0.077087f, + 0.000000f, 1.000000f, 0.001298f, 0.998535f, 0.002880f, 0.995605f, 0.003941f, 0.993652f, + 0.005333f, 0.989746f, 0.006458f, 0.986816f, 0.007507f, 0.984375f, 0.008331f, 0.979980f, + 0.009392f, 0.976074f, 0.010002f, 0.973145f, 0.010216f, 0.970703f, 0.011642f, 0.965820f, + 0.012321f, 0.961914f, 0.012520f, 0.958496f, 0.013039f, 0.955078f, 0.013443f, 0.951172f, + 0.014153f, 0.945801f, 0.014717f, 0.941406f, 0.014832f, 0.937012f, 0.015358f, 0.933105f, + 0.015556f, 0.929199f, 0.016205f, 0.922852f, 0.016617f, 0.916992f, 0.016907f, 0.912109f, + 0.017319f, 0.906738f, 0.017288f, 0.901367f, 0.017395f, 0.896484f, 0.018051f, 0.889160f, + 0.018356f, 0.881836f, 0.018784f, 0.875488f, 0.018707f, 0.869141f, 0.018784f, 0.862305f, + 0.018646f, 0.855957f, 0.019257f, 0.847168f, 0.019287f, 0.838379f, 0.019608f, 0.830078f, + 0.019562f, 0.821777f, 0.019424f, 0.812988f, 0.019257f, 0.804688f, 0.019501f, 0.793945f, + 0.019638f, 0.783203f, 0.019638f, 0.771973f, 0.019455f, 0.760742f, 0.019241f, 0.749512f, + 0.018829f, 0.738281f, 0.018860f, 0.724121f, 0.018814f, 0.708984f, 0.018555f, 0.694336f, + 0.018188f, 0.679199f, 0.017502f, 0.663086f, 0.016983f, 0.646484f, 0.016953f, 0.625488f, + 0.016357f, 0.604492f, 0.015564f, 0.583496f, 0.014771f, 0.561035f, 0.013977f, 0.535156f, + 0.013329f, 0.504395f, 0.012230f, 0.472900f, 0.010811f, 0.438477f, 0.009567f, 0.396729f, + 0.008011f, 0.346436f, 0.005909f, 0.289307f, 0.003656f, 0.205444f, 0.000666f, 0.076050f, + 0.000000f, 1.000000f, 0.001846f, 0.998047f, 0.003963f, 0.994629f, 0.005146f, 0.992676f, + 0.007011f, 0.988281f, 0.007751f, 0.985352f, 0.008919f, 0.982422f, 0.010635f, 0.977539f, + 0.011368f, 0.974609f, 0.012535f, 0.970703f, 0.012993f, 0.967285f, 0.014397f, 0.962402f, + 0.015129f, 0.958496f, 0.015839f, 0.954590f, 0.016174f, 0.951660f, 0.017059f, 0.946289f, + 0.018036f, 0.941406f, 0.018646f, 0.937012f, 0.018951f, 0.933105f, 0.019424f, 0.928223f, + 0.020035f, 0.923828f, 0.020828f, 0.917480f, 0.021347f, 0.912109f, 0.021484f, 0.906738f, + 0.022110f, 0.901367f, 0.022217f, 0.896973f, 0.022507f, 0.890137f, 0.023163f, 0.883301f, + 0.023697f, 0.876953f, 0.024002f, 0.870117f, 0.024048f, 0.863770f, 0.024078f, 0.857422f, + 0.024353f, 0.850098f, 0.024689f, 0.841309f, 0.025238f, 0.833496f, 0.025223f, 0.824707f, + 0.025223f, 0.816406f, 0.024948f, 0.808105f, 0.024918f, 0.799805f, 0.025223f, 0.788574f, + 0.025162f, 0.777832f, 0.025391f, 0.767090f, 0.025040f, 0.756348f, 0.024734f, 0.745605f, + 0.024139f, 0.733887f, 0.024445f, 0.718750f, 0.024231f, 0.704590f, 0.023773f, 0.690430f, + 0.023224f, 0.675781f, 0.022522f, 0.660156f, 0.021912f, 0.642578f, 0.021744f, 0.622070f, + 0.021027f, 0.602051f, 0.019913f, 0.581543f, 0.018753f, 0.559082f, 0.017868f, 0.532227f, + 0.016953f, 0.502441f, 0.015442f, 0.471191f, 0.013618f, 0.437256f, 0.012192f, 0.395752f, + 0.010048f, 0.345947f, 0.007343f, 0.289062f, 0.004478f, 0.204834f, 0.000809f, 0.075439f, + 0.000000f, 1.000000f, 0.002016f, 0.998047f, 0.004318f, 0.994629f, 0.005547f, 0.992188f, + 0.008095f, 0.987305f, 0.009377f, 0.983887f, 0.010376f, 0.980469f, 0.012512f, 0.975586f, + 0.014168f, 0.971680f, 0.015022f, 0.968262f, 0.016296f, 0.963379f, 0.017456f, 0.958496f, + 0.018723f, 0.954590f, 0.019531f, 0.950684f, 0.019943f, 0.947754f, 0.021530f, 0.941895f, + 0.022537f, 0.936523f, 0.022919f, 0.932129f, 0.023560f, 0.928223f, 0.024002f, 0.924316f, + 0.025040f, 0.917480f, 0.026154f, 0.912109f, 0.026779f, 0.906738f, 0.027023f, 0.901367f, + 0.027573f, 0.896484f, 0.027817f, 0.891113f, 0.028946f, 0.884277f, 0.029190f, 0.876953f, + 0.029846f, 0.870605f, 0.030014f, 0.864746f, 0.030365f, 0.858398f, 0.030334f, 0.852051f, + 0.031067f, 0.843262f, 0.031464f, 0.834961f, 0.031677f, 0.827148f, 0.031830f, 0.819336f, + 0.031860f, 0.811523f, 0.031647f, 0.803223f, 0.031982f, 0.793457f, 0.032227f, 0.783203f, + 0.032043f, 0.771973f, 0.032104f, 0.762207f, 0.031616f, 0.751465f, 0.031311f, 0.741211f, + 0.031281f, 0.728516f, 0.031097f, 0.714355f, 0.030777f, 0.700195f, 0.030090f, 0.686523f, + 0.029510f, 0.672363f, 0.028305f, 0.657227f, 0.028168f, 0.638672f, 0.027420f, 0.618652f, + 0.026443f, 0.599121f, 0.025192f, 0.579102f, 0.023529f, 0.557129f, 0.022720f, 0.529785f, + 0.021179f, 0.500000f, 0.019348f, 0.470215f, 0.017075f, 0.436768f, 0.015137f, 0.393799f, + 0.012459f, 0.345215f, 0.008987f, 0.289062f, 0.005451f, 0.205078f, 0.000969f, 0.074890f, + 0.000000f, 1.000000f, 0.002222f, 0.998047f, 0.004772f, 0.994141f, 0.006283f, 0.991211f, + 0.008919f, 0.986328f, 0.011200f, 0.982422f, 0.013168f, 0.977539f, 0.014603f, 0.973633f, + 0.016479f, 0.969238f, 0.017822f, 0.965332f, 0.020096f, 0.959473f, 0.021118f, 0.954590f, + 0.022385f, 0.950684f, 0.023361f, 0.946777f, 0.024658f, 0.941895f, 0.025955f, 0.936523f, + 0.027344f, 0.931641f, 0.028122f, 0.927246f, 0.028870f, 0.922852f, 0.029419f, 0.917969f, + 0.031189f, 0.911621f, 0.032013f, 0.906250f, 0.032623f, 0.900391f, 0.033417f, 0.895508f, + 0.033508f, 0.890625f, 0.034821f, 0.884277f, 0.035767f, 0.877441f, 0.036621f, 0.871094f, + 0.036682f, 0.864258f, 0.037292f, 0.858887f, 0.037537f, 0.852539f, 0.038025f, 0.845215f, + 0.038727f, 0.836426f, 0.039093f, 0.828613f, 0.039276f, 0.821289f, 0.039673f, 0.813477f, + 0.039276f, 0.805664f, 0.039612f, 0.797852f, 0.039886f, 0.786621f, 0.040039f, 0.776367f, + 0.039948f, 0.767090f, 0.039886f, 0.756836f, 0.039551f, 0.747070f, 0.038940f, 0.736816f, + 0.039001f, 0.722656f, 0.038727f, 0.708984f, 0.038300f, 0.695312f, 0.037445f, 0.682129f, + 0.036530f, 0.668457f, 0.035614f, 0.653809f, 0.034912f, 0.634277f, 0.034241f, 0.615234f, + 0.032776f, 0.596191f, 0.031311f, 0.576660f, 0.029327f, 0.555176f, 0.028137f, 0.526855f, + 0.026276f, 0.498779f, 0.023758f, 0.468994f, 0.020996f, 0.437012f, 0.018600f, 0.392334f, + 0.015228f, 0.345215f, 0.010918f, 0.289307f, 0.006634f, 0.204834f, 0.001159f, 0.074524f, + 0.000000f, 1.000000f, 0.002541f, 0.997559f, 0.005898f, 0.993652f, 0.008385f, 0.989258f, + 0.010857f, 0.984863f, 0.012863f, 0.981445f, 0.015221f, 0.975586f, 0.017654f, 0.970703f, + 0.018692f, 0.966797f, 0.020630f, 0.962402f, 0.023270f, 0.956055f, 0.025604f, 0.950684f, + 0.026642f, 0.946289f, 0.027634f, 0.942871f, 0.030014f, 0.936523f, 0.031433f, 0.930664f, + 0.032532f, 0.926270f, 0.033997f, 0.921387f, 0.034821f, 0.917969f, 0.036072f, 0.911133f, + 0.037476f, 0.905273f, 0.038757f, 0.899414f, 0.039642f, 0.894531f, 0.040314f, 0.889160f, + 0.040955f, 0.884277f, 0.042450f, 0.876953f, 0.043488f, 0.870117f, 0.044250f, 0.863770f, + 0.045105f, 0.858398f, 0.044952f, 0.852051f, 0.045837f, 0.846191f, 0.046600f, 0.837402f, + 0.047058f, 0.829102f, 0.047760f, 0.822266f, 0.048065f, 0.814453f, 0.048187f, 0.807129f, + 0.048004f, 0.800293f, 0.048401f, 0.789551f, 0.048950f, 0.780273f, 0.049316f, 0.770508f, + 0.049103f, 0.761230f, 0.048615f, 0.751465f, 0.047943f, 0.741699f, 0.047791f, 0.729492f, + 0.047577f, 0.716309f, 0.047333f, 0.703613f, 0.046906f, 0.690918f, 0.045654f, 0.678223f, + 0.044434f, 0.664551f, 0.043915f, 0.647949f, 0.042816f, 0.629883f, 0.041626f, 0.611328f, + 0.039948f, 0.593262f, 0.037872f, 0.574219f, 0.035919f, 0.551270f, 0.034271f, 0.523926f, + 0.031830f, 0.496094f, 0.028732f, 0.467529f, 0.025284f, 0.436035f, 0.022461f, 0.390869f, + 0.018234f, 0.343994f, 0.013084f, 0.290039f, 0.007851f, 0.203613f, 0.001363f, 0.073547f, + 0.000000f, 1.000000f, 0.003119f, 0.997070f, 0.006718f, 0.993164f, 0.009628f, 0.988281f, + 0.012733f, 0.983398f, 0.014343f, 0.979980f, 0.017624f, 0.973633f, 0.020187f, 0.968262f, + 0.022675f, 0.963867f, 0.024384f, 0.958008f, 0.027664f, 0.951660f, 0.029388f, 0.947266f, + 0.031342f, 0.942383f, 0.032898f, 0.937012f, 0.035187f, 0.930664f, 0.037292f, 0.925293f, + 0.038818f, 0.920410f, 0.039948f, 0.916016f, 0.041504f, 0.910645f, 0.043610f, 0.903809f, + 0.044739f, 0.897949f, 0.045929f, 0.893066f, 0.047241f, 0.887695f, 0.048340f, 0.883301f, + 0.049377f, 0.875488f, 0.050659f, 0.869141f, 0.052094f, 0.862793f, 0.052856f, 0.856445f, + 0.053619f, 0.851074f, 0.053925f, 0.845703f, 0.054901f, 0.836914f, 0.056519f, 0.829590f, + 0.056824f, 0.821777f, 0.057007f, 0.814453f, 0.057678f, 0.808105f, 0.057404f, 0.800781f, + 0.058014f, 0.791504f, 0.058533f, 0.782227f, 0.058807f, 0.772949f, 0.058990f, 0.763672f, + 0.058624f, 0.754883f, 0.057983f, 0.745605f, 0.057739f, 0.735840f, 0.057831f, 0.722656f, + 0.057770f, 0.710449f, 0.057159f, 0.698730f, 0.056122f, 0.686035f, 0.054626f, 0.673828f, + 0.053436f, 0.660645f, 0.052734f, 0.642578f, 0.051666f, 0.625000f, 0.049957f, 0.607910f, + 0.047760f, 0.589844f, 0.045410f, 0.571777f, 0.043457f, 0.547363f, 0.040985f, 0.520996f, + 0.038025f, 0.494385f, 0.034271f, 0.466309f, 0.030258f, 0.433594f, 0.026794f, 0.389648f, + 0.021698f, 0.343750f, 0.015495f, 0.290771f, 0.009254f, 0.203125f, 0.001593f, 0.072693f, + 0.000000f, 1.000000f, 0.003414f, 0.996582f, 0.007236f, 0.992676f, 0.011124f, 0.986816f, + 0.014381f, 0.982422f, 0.016602f, 0.978027f, 0.020721f, 0.970703f, 0.023529f, 0.965332f, + 0.025726f, 0.960938f, 0.029190f, 0.953613f, 0.031433f, 0.948242f, 0.034515f, 0.942871f, + 0.036224f, 0.937988f, 0.039001f, 0.931152f, 0.041901f, 0.924316f, 0.043274f, 0.919434f, + 0.045441f, 0.914551f, 0.046600f, 0.910156f, 0.049103f, 0.902832f, 0.051208f, 0.896484f, + 0.053223f, 0.891113f, 0.054291f, 0.886230f, 0.055664f, 0.880859f, 0.057007f, 0.874023f, + 0.059204f, 0.867188f, 0.059906f, 0.860840f, 0.061798f, 0.854980f, 0.062378f, 0.849121f, + 0.062744f, 0.844238f, 0.064148f, 0.836426f, 0.065430f, 0.828613f, 0.066528f, 0.820801f, + 0.067505f, 0.814453f, 0.067444f, 0.807617f, 0.067749f, 0.800781f, 0.068176f, 0.793457f, + 0.069336f, 0.783691f, 0.069641f, 0.774414f, 0.069702f, 0.765625f, 0.069397f, 0.757324f, + 0.068970f, 0.748535f, 0.068665f, 0.740234f, 0.068909f, 0.727539f, 0.068787f, 0.715820f, + 0.068176f, 0.704102f, 0.067139f, 0.692871f, 0.065979f, 0.681152f, 0.064636f, 0.669434f, + 0.063660f, 0.653809f, 0.062683f, 0.637207f, 0.060883f, 0.620605f, 0.058838f, 0.604004f, + 0.056274f, 0.586914f, 0.053406f, 0.568848f, 0.051361f, 0.542969f, 0.048340f, 0.517578f, + 0.044708f, 0.492676f, 0.040283f, 0.465576f, 0.035980f, 0.430664f, 0.031464f, 0.388184f, + 0.025360f, 0.343262f, 0.017883f, 0.291260f, 0.010696f, 0.202881f, 0.001856f, 0.072144f, + 0.000000f, 1.000000f, 0.004360f, 0.996094f, 0.008430f, 0.992188f, 0.012947f, 0.985840f, + 0.016388f, 0.980957f, 0.019348f, 0.975098f, 0.024017f, 0.968262f, 0.026917f, 0.962891f, + 0.030121f, 0.957520f, 0.033203f, 0.949707f, 0.037048f, 0.943359f, 0.038940f, 0.938477f, + 0.041809f, 0.932617f, 0.045410f, 0.924805f, 0.048187f, 0.918945f, 0.050842f, 0.913086f, + 0.052185f, 0.908691f, 0.055511f, 0.901367f, 0.057404f, 0.894531f, 0.059570f, 0.889160f, + 0.061798f, 0.883301f, 0.063049f, 0.878906f, 0.064697f, 0.872559f, 0.067261f, 0.864746f, + 0.069092f, 0.858398f, 0.070435f, 0.853027f, 0.071594f, 0.847168f, 0.072632f, 0.841797f, + 0.073975f, 0.834961f, 0.075623f, 0.826660f, 0.077026f, 0.819824f, 0.078003f, 0.812988f, + 0.078308f, 0.806152f, 0.079163f, 0.800293f, 0.079041f, 0.792480f, 0.080139f, 0.783691f, + 0.081482f, 0.774902f, 0.081421f, 0.766602f, 0.081299f, 0.757812f, 0.080811f, 0.750488f, + 0.080811f, 0.742676f, 0.080994f, 0.731445f, 0.080811f, 0.719727f, 0.080688f, 0.708984f, + 0.079712f, 0.698242f, 0.078308f, 0.687012f, 0.076965f, 0.676758f, 0.075623f, 0.663086f, + 0.074646f, 0.646973f, 0.072754f, 0.631836f, 0.070862f, 0.616211f, 0.068481f, 0.600586f, + 0.065247f, 0.584473f, 0.062561f, 0.562500f, 0.059814f, 0.539551f, 0.056091f, 0.515625f, + 0.051666f, 0.490479f, 0.046753f, 0.464355f, 0.041748f, 0.427490f, 0.036346f, 0.386719f, + 0.029175f, 0.343262f, 0.021042f, 0.288818f, 0.012299f, 0.203003f, 0.002108f, 0.070984f, + 0.000000f, 1.000000f, 0.004745f, 0.996094f, 0.009407f, 0.991699f, 0.014153f, 0.984863f, + 0.018326f, 0.979492f, 0.022720f, 0.972168f, 0.027298f, 0.965820f, 0.030807f, 0.959961f, + 0.034576f, 0.952637f, 0.038940f, 0.945801f, 0.041931f, 0.939453f, 0.044830f, 0.934570f, + 0.048767f, 0.925781f, 0.052521f, 0.918945f, 0.055420f, 0.912598f, 0.057861f, 0.907227f, + 0.061035f, 0.900391f, 0.063660f, 0.893066f, 0.066895f, 0.886719f, 0.069153f, 0.880859f, + 0.070557f, 0.875977f, 0.073242f, 0.870117f, 0.075867f, 0.862793f, 0.078064f, 0.855957f, + 0.079712f, 0.849609f, 0.081238f, 0.844238f, 0.082458f, 0.839355f, 0.084229f, 0.832520f, + 0.086426f, 0.824219f, 0.087891f, 0.817383f, 0.088806f, 0.810547f, 0.089722f, 0.804688f, + 0.090271f, 0.798340f, 0.091003f, 0.791504f, 0.093018f, 0.782715f, 0.092896f, 0.773926f, + 0.093750f, 0.766602f, 0.094116f, 0.758789f, 0.094238f, 0.751465f, 0.093262f, 0.743652f, + 0.093445f, 0.733398f, 0.093872f, 0.722656f, 0.093567f, 0.712402f, 0.092651f, 0.702148f, + 0.091553f, 0.692383f, 0.090027f, 0.681641f, 0.088440f, 0.670898f, 0.087402f, 0.655273f, + 0.086304f, 0.641113f, 0.084229f, 0.626465f, 0.081421f, 0.612305f, 0.078552f, 0.596680f, + 0.075012f, 0.580566f, 0.072510f, 0.558105f, 0.068970f, 0.535645f, 0.064514f, 0.512695f, + 0.059235f, 0.489014f, 0.053314f, 0.463867f, 0.048309f, 0.424561f, 0.041534f, 0.385254f, + 0.033173f, 0.343018f, 0.024246f, 0.286133f, 0.014030f, 0.202759f, 0.002388f, 0.070007f, + 0.000000f, 1.000000f, 0.005783f, 0.995605f, 0.010551f, 0.990723f, 0.016327f, 0.983398f, + 0.021011f, 0.978027f, 0.026352f, 0.969727f, 0.031097f, 0.962891f, 0.034790f, 0.957520f, + 0.040161f, 0.948242f, 0.044769f, 0.940918f, 0.047974f, 0.935547f, 0.052094f, 0.927246f, + 0.056610f, 0.919434f, 0.060028f, 0.912598f, 0.063110f, 0.906738f, 0.066467f, 0.900391f, + 0.070557f, 0.891602f, 0.073975f, 0.884766f, 0.076782f, 0.878906f, 0.079102f, 0.873047f, + 0.081482f, 0.866699f, 0.084717f, 0.859375f, 0.087708f, 0.852539f, 0.089233f, 0.846680f, + 0.091370f, 0.841309f, 0.092957f, 0.835938f, 0.094849f, 0.828613f, 0.097229f, 0.821289f, + 0.099365f, 0.813965f, 0.100464f, 0.808105f, 0.101807f, 0.801758f, 0.102173f, 0.795898f, + 0.103821f, 0.789062f, 0.105042f, 0.780273f, 0.106018f, 0.772461f, 0.106995f, 0.765625f, + 0.106750f, 0.757812f, 0.107361f, 0.750488f, 0.106995f, 0.744141f, 0.107239f, 0.733887f, + 0.107605f, 0.723633f, 0.107544f, 0.714355f, 0.106873f, 0.704590f, 0.105347f, 0.695312f, + 0.103943f, 0.686035f, 0.102478f, 0.675781f, 0.102295f, 0.662598f, 0.100342f, 0.647949f, + 0.098328f, 0.635742f, 0.095703f, 0.621582f, 0.092529f, 0.607910f, 0.089111f, 0.593750f, + 0.086121f, 0.573730f, 0.082764f, 0.553223f, 0.078003f, 0.531738f, 0.073059f, 0.510742f, + 0.067383f, 0.488525f, 0.061157f, 0.458496f, 0.054871f, 0.421875f, 0.047150f, 0.384766f, + 0.037567f, 0.343750f, 0.027527f, 0.283203f, 0.015640f, 0.202515f, 0.002684f, 0.069092f, + 0.000000f, 1.000000f, 0.006943f, 0.995117f, 0.011772f, 0.989746f, 0.018341f, 0.982422f, + 0.023682f, 0.975098f, 0.030090f, 0.967285f, 0.034973f, 0.960449f, 0.040741f, 0.951660f, + 0.045776f, 0.943848f, 0.050415f, 0.937012f, 0.055145f, 0.929199f, 0.059967f, 0.920898f, + 0.064270f, 0.913574f, 0.068359f, 0.906738f, 0.071777f, 0.899902f, 0.076660f, 0.891113f, + 0.079834f, 0.883789f, 0.084229f, 0.876953f, 0.087097f, 0.870605f, 0.090149f, 0.863770f, + 0.093933f, 0.855957f, 0.096619f, 0.849121f, 0.099792f, 0.843262f, 0.101624f, 0.837402f, + 0.103638f, 0.832520f, 0.106689f, 0.824219f, 0.109009f, 0.816406f, 0.110779f, 0.810059f, + 0.112732f, 0.804199f, 0.114075f, 0.798340f, 0.115295f, 0.792969f, 0.116638f, 0.785156f, + 0.118103f, 0.777344f, 0.120239f, 0.769531f, 0.120483f, 0.762695f, 0.121033f, 0.755859f, + 0.120789f, 0.750000f, 0.121094f, 0.743164f, 0.121887f, 0.732910f, 0.121826f, 0.723633f, + 0.121704f, 0.714355f, 0.120911f, 0.706055f, 0.120544f, 0.697754f, 0.118774f, 0.688965f, + 0.117371f, 0.679199f, 0.116821f, 0.666992f, 0.115173f, 0.654297f, 0.113037f, 0.641602f, + 0.110596f, 0.629395f, 0.107971f, 0.617188f, 0.104004f, 0.604492f, 0.100769f, 0.586426f, + 0.097229f, 0.567383f, 0.093262f, 0.548828f, 0.087952f, 0.529297f, 0.082031f, 0.508789f, + 0.075012f, 0.486572f, 0.069092f, 0.453857f, 0.061462f, 0.419922f, 0.053040f, 0.384766f, + 0.042084f, 0.344482f, 0.031250f, 0.281006f, 0.017685f, 0.203247f, 0.002993f, 0.068542f, + 0.000000f, 1.000000f, 0.007553f, 0.994629f, 0.013931f, 0.988281f, 0.020828f, 0.980957f, + 0.028076f, 0.972656f, 0.033905f, 0.964844f, 0.039520f, 0.957520f, 0.046295f, 0.947266f, + 0.051849f, 0.939453f, 0.056702f, 0.932617f, 0.063232f, 0.922363f, 0.068420f, 0.914551f, + 0.072693f, 0.907227f, 0.077637f, 0.899414f, 0.082764f, 0.890625f, 0.087341f, 0.882812f, + 0.091309f, 0.875488f, 0.094238f, 0.869141f, 0.099609f, 0.860840f, 0.102783f, 0.853027f, + 0.106628f, 0.845703f, 0.109863f, 0.838867f, 0.112000f, 0.833984f, 0.114929f, 0.827637f, + 0.118225f, 0.818848f, 0.121094f, 0.812012f, 0.123657f, 0.805664f, 0.125610f, 0.799805f, + 0.126465f, 0.794922f, 0.128418f, 0.788574f, 0.130615f, 0.780762f, 0.132568f, 0.772949f, + 0.133667f, 0.766113f, 0.134766f, 0.759277f, 0.135254f, 0.753418f, 0.135254f, 0.747559f, + 0.136230f, 0.739746f, 0.136963f, 0.730469f, 0.137939f, 0.722168f, 0.137207f, 0.713867f, + 0.136475f, 0.706055f, 0.135498f, 0.698242f, 0.134521f, 0.690918f, 0.133179f, 0.680664f, + 0.132324f, 0.668945f, 0.131104f, 0.657715f, 0.128784f, 0.646484f, 0.126709f, 0.635742f, + 0.123413f, 0.624023f, 0.119751f, 0.612793f, 0.116821f, 0.597168f, 0.113403f, 0.579590f, + 0.109070f, 0.562988f, 0.103882f, 0.544922f, 0.098328f, 0.526367f, 0.091003f, 0.506348f, + 0.084290f, 0.480469f, 0.077454f, 0.450439f, 0.069031f, 0.418945f, 0.058624f, 0.383789f, + 0.046387f, 0.343994f, 0.034790f, 0.279297f, 0.019684f, 0.203613f, 0.003374f, 0.068787f, + 0.000000f, 1.000000f, 0.008575f, 0.994141f, 0.016556f, 0.986816f, 0.023254f, 0.979980f, + 0.031891f, 0.969238f, 0.038269f, 0.962402f, 0.045532f, 0.952148f, 0.052307f, 0.943359f, + 0.058289f, 0.935547f, 0.065796f, 0.924805f, 0.072205f, 0.916016f, 0.076782f, 0.908691f, + 0.081970f, 0.900391f, 0.088379f, 0.890137f, 0.093567f, 0.881836f, 0.097717f, 0.875000f, + 0.102112f, 0.868164f, 0.107178f, 0.858398f, 0.111755f, 0.850098f, 0.116394f, 0.842773f, + 0.120056f, 0.835938f, 0.122803f, 0.830078f, 0.126709f, 0.821289f, 0.129883f, 0.813965f, + 0.133301f, 0.807129f, 0.136353f, 0.800781f, 0.137573f, 0.795898f, 0.140137f, 0.790039f, + 0.142334f, 0.782227f, 0.145020f, 0.774902f, 0.147095f, 0.767578f, 0.148682f, 0.761719f, + 0.149536f, 0.755371f, 0.149902f, 0.750488f, 0.150391f, 0.744141f, 0.152344f, 0.734863f, + 0.152832f, 0.727051f, 0.153687f, 0.719727f, 0.153076f, 0.711914f, 0.153076f, 0.705566f, + 0.152100f, 0.698242f, 0.150269f, 0.690918f, 0.150269f, 0.680176f, 0.149414f, 0.669922f, + 0.148071f, 0.660156f, 0.145874f, 0.649902f, 0.143188f, 0.639648f, 0.140259f, 0.629883f, + 0.136353f, 0.619141f, 0.133423f, 0.604980f, 0.130371f, 0.590332f, 0.126343f, 0.574219f, + 0.121277f, 0.558105f, 0.114929f, 0.541504f, 0.108276f, 0.523926f, 0.101257f, 0.503906f, + 0.094116f, 0.475586f, 0.085876f, 0.447998f, 0.075989f, 0.417725f, 0.064819f, 0.383789f, + 0.051666f, 0.341553f, 0.038544f, 0.277588f, 0.021500f, 0.203857f, 0.003771f, 0.068604f, + 0.000000f, 1.000000f, 0.009750f, 0.994141f, 0.018921f, 0.985352f, 0.026566f, 0.977051f, + 0.036346f, 0.967285f, 0.043640f, 0.958008f, 0.052460f, 0.947266f, 0.058868f, 0.939453f, + 0.067261f, 0.928223f, 0.074036f, 0.918457f, 0.080383f, 0.910645f, 0.086243f, 0.901367f, + 0.093628f, 0.891113f, 0.099304f, 0.881836f, 0.105225f, 0.874023f, 0.110413f, 0.865723f, + 0.115784f, 0.855957f, 0.121155f, 0.847656f, 0.125610f, 0.840332f, 0.129272f, 0.833496f, + 0.133667f, 0.825684f, 0.138550f, 0.816406f, 0.142700f, 0.808594f, 0.146118f, 0.801758f, + 0.148438f, 0.796387f, 0.151001f, 0.790527f, 0.154297f, 0.782715f, 0.156860f, 0.775391f, + 0.160156f, 0.768555f, 0.161621f, 0.762695f, 0.163086f, 0.756348f, 0.164429f, 0.750977f, + 0.165283f, 0.746094f, 0.166992f, 0.737305f, 0.168823f, 0.729980f, 0.169434f, 0.722656f, + 0.170166f, 0.715820f, 0.169800f, 0.709473f, 0.169312f, 0.703125f, 0.168091f, 0.696777f, + 0.168335f, 0.687988f, 0.167603f, 0.678711f, 0.167236f, 0.669434f, 0.165405f, 0.660645f, + 0.162842f, 0.651855f, 0.160034f, 0.643066f, 0.157349f, 0.634766f, 0.154419f, 0.624512f, + 0.151611f, 0.609863f, 0.147705f, 0.596191f, 0.143555f, 0.582520f, 0.138672f, 0.568359f, + 0.132812f, 0.553711f, 0.125977f, 0.538574f, 0.118958f, 0.521484f, 0.112061f, 0.497070f, + 0.104309f, 0.472412f, 0.094727f, 0.446045f, 0.083557f, 0.416748f, 0.070740f, 0.383301f, + 0.057739f, 0.336914f, 0.042694f, 0.277588f, 0.023712f, 0.205078f, 0.004120f, 0.067993f, + 0.000000f, 1.000000f, 0.010826f, 0.993652f, 0.021271f, 0.984375f, 0.031647f, 0.973633f, + 0.040100f, 0.965332f, 0.050293f, 0.953125f, 0.058868f, 0.943848f, 0.067932f, 0.932617f, + 0.075684f, 0.922363f, 0.083252f, 0.913086f, 0.091064f, 0.901855f, 0.099304f, 0.891602f, + 0.105530f, 0.882812f, 0.110718f, 0.875000f, 0.118652f, 0.863770f, 0.125244f, 0.854004f, + 0.130005f, 0.846191f, 0.135132f, 0.838379f, 0.140015f, 0.829590f, 0.145264f, 0.820312f, + 0.150391f, 0.812012f, 0.154541f, 0.804688f, 0.157837f, 0.798340f, 0.161255f, 0.791992f, + 0.165771f, 0.782715f, 0.168823f, 0.775391f, 0.172363f, 0.768066f, 0.174683f, 0.762207f, + 0.175903f, 0.757324f, 0.178711f, 0.751465f, 0.180420f, 0.745117f, 0.182495f, 0.737305f, + 0.184326f, 0.729980f, 0.185547f, 0.724121f, 0.186401f, 0.717773f, 0.186890f, 0.711914f, + 0.186768f, 0.706055f, 0.185913f, 0.700684f, 0.186401f, 0.691895f, 0.186279f, 0.683105f, + 0.186035f, 0.675781f, 0.184814f, 0.667969f, 0.182739f, 0.660645f, 0.180786f, 0.652832f, + 0.178101f, 0.645020f, 0.175293f, 0.636719f, 0.173462f, 0.625000f, 0.170166f, 0.612793f, + 0.166382f, 0.601074f, 0.162476f, 0.589355f, 0.156860f, 0.577148f, 0.151245f, 0.564453f, + 0.144653f, 0.550781f, 0.138184f, 0.534668f, 0.131104f, 0.514160f, 0.123291f, 0.492676f, + 0.113892f, 0.468994f, 0.102905f, 0.443604f, 0.091064f, 0.415771f, 0.077271f, 0.382812f, + 0.063293f, 0.333496f, 0.046753f, 0.277100f, 0.025787f, 0.206421f, 0.004452f, 0.067383f, + 0.000000f, 1.000000f, 0.011368f, 0.993652f, 0.023193f, 0.983887f, 0.035919f, 0.972168f, + 0.046143f, 0.960938f, 0.056976f, 0.949707f, 0.067261f, 0.937988f, 0.076233f, 0.927246f, + 0.084839f, 0.916992f, 0.095093f, 0.904297f, 0.103088f, 0.894043f, 0.110657f, 0.884766f, + 0.118469f, 0.873047f, 0.125732f, 0.862793f, 0.132935f, 0.853027f, 0.138794f, 0.845215f, + 0.145142f, 0.834961f, 0.150879f, 0.825684f, 0.157104f, 0.816406f, 0.162476f, 0.808105f, + 0.166138f, 0.801758f, 0.171021f, 0.792969f, 0.175293f, 0.784180f, 0.180542f, 0.775879f, + 0.183838f, 0.769043f, 0.186523f, 0.762695f, 0.189087f, 0.756836f, 0.192261f, 0.750488f, + 0.194702f, 0.742676f, 0.197998f, 0.735840f, 0.199829f, 0.729492f, 0.201050f, 0.723633f, + 0.202393f, 0.717773f, 0.203613f, 0.712402f, 0.203613f, 0.707520f, 0.204468f, 0.700195f, + 0.205811f, 0.692871f, 0.205322f, 0.686035f, 0.204834f, 0.679199f, 0.204712f, 0.672363f, + 0.202515f, 0.665527f, 0.201538f, 0.659180f, 0.198608f, 0.652344f, 0.197144f, 0.643555f, + 0.195679f, 0.634277f, 0.192993f, 0.624512f, 0.189453f, 0.614746f, 0.185669f, 0.604492f, + 0.181152f, 0.594727f, 0.176636f, 0.584473f, 0.170532f, 0.573242f, 0.164185f, 0.561523f, + 0.158203f, 0.543945f, 0.151245f, 0.526367f, 0.142700f, 0.507324f, 0.133911f, 0.487793f, + 0.123474f, 0.466064f, 0.111938f, 0.442139f, 0.098450f, 0.415283f, 0.084839f, 0.376221f, + 0.069519f, 0.331543f, 0.050629f, 0.277100f, 0.027802f, 0.207153f, 0.004837f, 0.067444f, + 0.000000f, 1.000000f, 0.013916f, 0.991699f, 0.027954f, 0.980469f, 0.040405f, 0.969238f, + 0.052277f, 0.957520f, 0.065369f, 0.943848f, 0.075928f, 0.932617f, 0.086914f, 0.919922f, + 0.096985f, 0.908203f, 0.106384f, 0.897461f, 0.116028f, 0.885254f, 0.124451f, 0.873535f, + 0.132935f, 0.863281f, 0.140259f, 0.853516f, 0.148193f, 0.842285f, 0.155884f, 0.832031f, + 0.162476f, 0.822754f, 0.166626f, 0.814941f, 0.173828f, 0.804688f, 0.180176f, 0.795410f, + 0.185669f, 0.786133f, 0.189453f, 0.778809f, 0.194336f, 0.770996f, 0.197144f, 0.764648f, + 0.201538f, 0.755859f, 0.206787f, 0.748047f, 0.209473f, 0.740723f, 0.212524f, 0.733887f, + 0.214844f, 0.728027f, 0.216309f, 0.722656f, 0.218262f, 0.717285f, 0.219971f, 0.710938f, + 0.221069f, 0.704102f, 0.223511f, 0.697266f, 0.223999f, 0.691406f, 0.224121f, 0.685547f, + 0.224121f, 0.679688f, 0.223877f, 0.674316f, 0.222412f, 0.668457f, 0.221191f, 0.663086f, + 0.220825f, 0.655273f, 0.219727f, 0.646973f, 0.217407f, 0.640137f, 0.215820f, 0.632324f, + 0.212769f, 0.624512f, 0.209473f, 0.616211f, 0.205200f, 0.607910f, 0.201294f, 0.599121f, + 0.195679f, 0.589844f, 0.190186f, 0.578125f, 0.185669f, 0.564941f, 0.179443f, 0.550781f, + 0.172119f, 0.536133f, 0.163696f, 0.520508f, 0.155396f, 0.503418f, 0.144409f, 0.484619f, + 0.133179f, 0.464355f, 0.120605f, 0.442139f, 0.107605f, 0.409424f, 0.092712f, 0.372803f, + 0.075195f, 0.330322f, 0.054901f, 0.278076f, 0.029694f, 0.208252f, 0.005230f, 0.067566f, + 0.000000f, 1.000000f, 0.016098f, 0.991699f, 0.031250f, 0.979492f, 0.046326f, 0.966797f, + 0.060455f, 0.952637f, 0.073181f, 0.939453f, 0.086975f, 0.925293f, 0.096802f, 0.914551f, + 0.109863f, 0.899414f, 0.120483f, 0.887695f, 0.129639f, 0.875977f, 0.139648f, 0.863281f, + 0.148682f, 0.851562f, 0.157471f, 0.841309f, 0.164429f, 0.831055f, 0.171875f, 0.820312f, + 0.179565f, 0.810059f, 0.186646f, 0.800781f, 0.192627f, 0.791504f, 0.197876f, 0.782715f, + 0.203613f, 0.772949f, 0.209839f, 0.763672f, 0.213379f, 0.755859f, 0.218750f, 0.748047f, + 0.221802f, 0.741211f, 0.224976f, 0.734863f, 0.229248f, 0.727051f, 0.231812f, 0.719727f, + 0.234985f, 0.712891f, 0.237549f, 0.706055f, 0.238770f, 0.700684f, 0.240723f, 0.694824f, + 0.242310f, 0.689941f, 0.242310f, 0.685547f, 0.242310f, 0.680176f, 0.243408f, 0.673828f, + 0.242920f, 0.667969f, 0.242676f, 0.661133f, 0.242188f, 0.654785f, 0.241577f, 0.648438f, + 0.239868f, 0.642090f, 0.237793f, 0.635742f, 0.235352f, 0.629395f, 0.232300f, 0.622559f, + 0.229004f, 0.615723f, 0.225586f, 0.607910f, 0.221680f, 0.598145f, 0.217407f, 0.588867f, + 0.212280f, 0.578125f, 0.206787f, 0.567383f, 0.201050f, 0.556152f, 0.193604f, 0.544434f, + 0.185669f, 0.530762f, 0.176270f, 0.516113f, 0.166992f, 0.500977f, 0.155273f, 0.483398f, + 0.144165f, 0.460449f, 0.131104f, 0.434814f, 0.116577f, 0.405273f, 0.099976f, 0.371094f, + 0.080994f, 0.330566f, 0.058533f, 0.279053f, 0.031921f, 0.210205f, 0.005592f, 0.067871f, + 0.000000f, 1.000000f, 0.018982f, 0.990234f, 0.036041f, 0.977539f, 0.053192f, 0.962891f, + 0.069458f, 0.947754f, 0.084351f, 0.932129f, 0.097961f, 0.918945f, 0.111328f, 0.904297f, + 0.123291f, 0.890625f, 0.135498f, 0.877930f, 0.146240f, 0.864258f, 0.156860f, 0.851562f, + 0.166138f, 0.840332f, 0.174927f, 0.829102f, 0.183105f, 0.817383f, 0.191650f, 0.806641f, + 0.199341f, 0.795898f, 0.206055f, 0.787109f, 0.212524f, 0.777344f, 0.218750f, 0.768066f, + 0.224609f, 0.758789f, 0.229980f, 0.749512f, 0.235107f, 0.741211f, 0.238892f, 0.733398f, + 0.243286f, 0.725098f, 0.246582f, 0.718750f, 0.249023f, 0.712402f, 0.252930f, 0.704590f, + 0.255615f, 0.697266f, 0.258545f, 0.690918f, 0.260010f, 0.684570f, 0.261475f, 0.679199f, + 0.262939f, 0.673340f, 0.263672f, 0.668457f, 0.264404f, 0.663086f, 0.263184f, 0.658203f, + 0.262695f, 0.653320f, 0.262939f, 0.647949f, 0.261719f, 0.642090f, 0.260010f, 0.636230f, + 0.259033f, 0.629883f, 0.256836f, 0.623535f, 0.253906f, 0.616699f, 0.251709f, 0.610840f, + 0.248047f, 0.603027f, 0.244263f, 0.595703f, 0.239258f, 0.588379f, 0.234497f, 0.580078f, + 0.228760f, 0.570801f, 0.221802f, 0.561035f, 0.214844f, 0.550781f, 0.206787f, 0.540039f, + 0.198364f, 0.525879f, 0.190063f, 0.510742f, 0.179443f, 0.494385f, 0.167969f, 0.476318f, + 0.155396f, 0.455322f, 0.141113f, 0.430664f, 0.125122f, 0.403076f, 0.106934f, 0.369873f, + 0.086731f, 0.331055f, 0.062683f, 0.281006f, 0.035004f, 0.205078f, 0.005989f, 0.068420f, + 0.000000f, 1.000000f, 0.022034f, 0.988770f, 0.041840f, 0.974609f, 0.061157f, 0.958008f, + 0.079163f, 0.941895f, 0.096313f, 0.925293f, 0.111877f, 0.909668f, 0.126099f, 0.895020f, + 0.139404f, 0.880371f, 0.152100f, 0.866211f, 0.163940f, 0.852051f, 0.175537f, 0.839355f, + 0.185669f, 0.827148f, 0.195190f, 0.814941f, 0.203491f, 0.803223f, 0.212524f, 0.791504f, + 0.220337f, 0.780762f, 0.226685f, 0.770996f, 0.234497f, 0.760742f, 0.241089f, 0.751465f, + 0.246460f, 0.742188f, 0.251953f, 0.733398f, 0.256836f, 0.725098f, 0.260254f, 0.717285f, + 0.265137f, 0.708984f, 0.269531f, 0.701172f, 0.272705f, 0.694336f, 0.274414f, 0.687988f, + 0.277588f, 0.681152f, 0.279541f, 0.674805f, 0.281494f, 0.668945f, 0.283203f, 0.663086f, + 0.283447f, 0.658203f, 0.284180f, 0.653320f, 0.284424f, 0.648926f, 0.284668f, 0.643555f, + 0.283936f, 0.638184f, 0.283203f, 0.633789f, 0.281982f, 0.627930f, 0.280029f, 0.623535f, + 0.278564f, 0.617188f, 0.276123f, 0.611816f, 0.272949f, 0.606445f, 0.269287f, 0.600098f, + 0.265137f, 0.592773f, 0.260986f, 0.586426f, 0.256592f, 0.578613f, 0.250977f, 0.570801f, + 0.244629f, 0.562012f, 0.238159f, 0.552734f, 0.230957f, 0.541992f, 0.222046f, 0.531250f, + 0.213623f, 0.518555f, 0.203369f, 0.504883f, 0.191772f, 0.489502f, 0.179565f, 0.472412f, + 0.165649f, 0.452148f, 0.151245f, 0.429932f, 0.133789f, 0.402832f, 0.114746f, 0.371094f, + 0.092896f, 0.331055f, 0.067444f, 0.278320f, 0.037933f, 0.202637f, 0.006348f, 0.068604f, + 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.045685f, 0.972656f, 0.066162f, 0.955566f, + 0.085266f, 0.938477f, 0.102783f, 0.922363f, 0.119019f, 0.905762f, 0.134399f, 0.890137f, + 0.149048f, 0.874512f, 0.162354f, 0.859863f, 0.174438f, 0.846191f, 0.186646f, 0.832031f, + 0.196655f, 0.819336f, 0.206299f, 0.807129f, 0.216187f, 0.794922f, 0.224243f, 0.783691f, + 0.232910f, 0.772461f, 0.239502f, 0.762207f, 0.247314f, 0.751953f, 0.254395f, 0.742188f, + 0.259521f, 0.732910f, 0.265381f, 0.723633f, 0.270020f, 0.715332f, 0.275635f, 0.707031f, + 0.280273f, 0.698730f, 0.282715f, 0.691895f, 0.286621f, 0.684082f, 0.289795f, 0.677246f, + 0.291748f, 0.670898f, 0.295410f, 0.664062f, 0.296631f, 0.658203f, 0.297607f, 0.652832f, + 0.298828f, 0.647461f, 0.300781f, 0.641602f, 0.300293f, 0.637207f, 0.301270f, 0.632324f, + 0.300049f, 0.626953f, 0.299072f, 0.622559f, 0.298828f, 0.617188f, 0.296631f, 0.612305f, + 0.294189f, 0.607422f, 0.292236f, 0.601562f, 0.289307f, 0.595703f, 0.285889f, 0.589844f, + 0.282959f, 0.583984f, 0.277588f, 0.577148f, 0.273438f, 0.569824f, 0.267578f, 0.562500f, + 0.261475f, 0.553711f, 0.255371f, 0.544922f, 0.246948f, 0.534180f, 0.239136f, 0.524414f, + 0.230591f, 0.511719f, 0.220581f, 0.498779f, 0.208496f, 0.483154f, 0.196411f, 0.466797f, + 0.182251f, 0.446777f, 0.167236f, 0.424316f, 0.149780f, 0.397461f, 0.130005f, 0.365723f, + 0.107483f, 0.326416f, 0.080872f, 0.274902f, 0.048859f, 0.201416f, 0.011032f, 0.073975f, + 0.000000f, 1.000000f, 0.023407f, 0.988281f, 0.045624f, 0.972656f, 0.066101f, 0.955566f, + 0.085083f, 0.938477f, 0.102844f, 0.921875f, 0.119690f, 0.905273f, 0.135620f, 0.889160f, + 0.149658f, 0.874023f, 0.163940f, 0.858887f, 0.175537f, 0.845215f, 0.187622f, 0.831055f, + 0.199097f, 0.817871f, 0.209229f, 0.805176f, 0.218628f, 0.792969f, 0.227783f, 0.781250f, + 0.236084f, 0.770508f, 0.244141f, 0.759277f, 0.250977f, 0.749023f, 0.258057f, 0.739258f, + 0.265137f, 0.729492f, 0.270508f, 0.720215f, 0.276123f, 0.711426f, 0.281494f, 0.702637f, + 0.284668f, 0.695312f, 0.289795f, 0.686523f, 0.293945f, 0.679199f, 0.297363f, 0.671875f, + 0.300049f, 0.665039f, 0.303711f, 0.658203f, 0.304688f, 0.652344f, 0.307373f, 0.645996f, + 0.309082f, 0.640137f, 0.309570f, 0.635254f, 0.310547f, 0.629883f, 0.311523f, 0.624512f, + 0.311523f, 0.619629f, 0.310303f, 0.614258f, 0.310303f, 0.609375f, 0.308594f, 0.604004f, + 0.307617f, 0.598633f, 0.305908f, 0.592773f, 0.303467f, 0.587402f, 0.300293f, 0.581543f, + 0.297852f, 0.574707f, 0.292969f, 0.567871f, 0.289062f, 0.561035f, 0.284180f, 0.553223f, + 0.278809f, 0.544922f, 0.272705f, 0.535645f, 0.266113f, 0.525879f, 0.258545f, 0.515137f, + 0.250488f, 0.502930f, 0.240967f, 0.489746f, 0.230347f, 0.475342f, 0.218384f, 0.458496f, + 0.205322f, 0.439209f, 0.190063f, 0.416992f, 0.173706f, 0.391602f, 0.153809f, 0.359863f, + 0.131592f, 0.322021f, 0.104431f, 0.271729f, 0.070129f, 0.199585f, 0.024445f, 0.074219f, + 0.000000f, 1.000000f, 0.022964f, 0.988770f, 0.045502f, 0.973145f, 0.066467f, 0.955566f, + 0.085938f, 0.937988f, 0.103394f, 0.921875f, 0.120728f, 0.904785f, 0.136108f, 0.889160f, + 0.150391f, 0.873535f, 0.164429f, 0.858398f, 0.177856f, 0.843750f, 0.189941f, 0.830078f, + 0.200317f, 0.816895f, 0.211548f, 0.803711f, 0.221313f, 0.791504f, 0.231323f, 0.779297f, + 0.239014f, 0.768066f, 0.247314f, 0.756836f, 0.255859f, 0.746094f, 0.261963f, 0.736328f, + 0.269531f, 0.726074f, 0.275635f, 0.716797f, 0.281494f, 0.707520f, 0.286377f, 0.698730f, + 0.291504f, 0.690430f, 0.296631f, 0.682129f, 0.301270f, 0.674316f, 0.305176f, 0.666504f, + 0.308350f, 0.659180f, 0.311035f, 0.653320f, 0.313965f, 0.645996f, 0.316406f, 0.639648f, + 0.318359f, 0.633301f, 0.319336f, 0.627930f, 0.321289f, 0.622070f, 0.321777f, 0.616699f, + 0.322754f, 0.611816f, 0.322510f, 0.606445f, 0.322510f, 0.601074f, 0.322266f, 0.595703f, + 0.320312f, 0.589844f, 0.319580f, 0.583984f, 0.317383f, 0.578125f, 0.314697f, 0.572266f, + 0.312500f, 0.565918f, 0.309814f, 0.559082f, 0.306152f, 0.551270f, 0.301758f, 0.543457f, + 0.297119f, 0.535156f, 0.291504f, 0.525879f, 0.285400f, 0.516113f, 0.277588f, 0.505371f, + 0.270508f, 0.493652f, 0.261719f, 0.480469f, 0.251709f, 0.466064f, 0.241089f, 0.449463f, + 0.228027f, 0.430420f, 0.214600f, 0.408936f, 0.197876f, 0.383545f, 0.179321f, 0.353027f, + 0.156616f, 0.315186f, 0.130371f, 0.266357f, 0.094299f, 0.195435f, 0.042755f, 0.071960f, + 0.000000f, 1.000000f, 0.023224f, 0.988770f, 0.045227f, 0.973145f, 0.066589f, 0.955566f, + 0.085999f, 0.938477f, 0.104614f, 0.921387f, 0.121094f, 0.904785f, 0.137451f, 0.888184f, + 0.151855f, 0.872559f, 0.166870f, 0.857422f, 0.179199f, 0.842773f, 0.191284f, 0.829102f, + 0.203735f, 0.814941f, 0.214600f, 0.801758f, 0.224731f, 0.789062f, 0.233154f, 0.777344f, + 0.243164f, 0.765137f, 0.251221f, 0.753906f, 0.259277f, 0.743652f, 0.267822f, 0.732422f, + 0.273682f, 0.722656f, 0.281006f, 0.712891f, 0.287109f, 0.703613f, 0.292480f, 0.694336f, + 0.298340f, 0.685547f, 0.303955f, 0.677246f, 0.307861f, 0.669434f, 0.312500f, 0.661133f, + 0.315430f, 0.653809f, 0.318359f, 0.646973f, 0.322266f, 0.639648f, 0.325195f, 0.632812f, + 0.327881f, 0.626465f, 0.329346f, 0.620605f, 0.331787f, 0.614258f, 0.332764f, 0.608887f, + 0.334473f, 0.603516f, 0.334473f, 0.598145f, 0.333984f, 0.592285f, 0.334961f, 0.586426f, + 0.333984f, 0.580566f, 0.333252f, 0.575195f, 0.332275f, 0.568359f, 0.330811f, 0.562500f, + 0.328125f, 0.555664f, 0.325684f, 0.548828f, 0.322754f, 0.540527f, 0.319336f, 0.533203f, + 0.314941f, 0.524414f, 0.310547f, 0.515137f, 0.305176f, 0.505371f, 0.299072f, 0.494629f, + 0.291992f, 0.482666f, 0.284424f, 0.469971f, 0.275146f, 0.455322f, 0.264404f, 0.439209f, + 0.252930f, 0.420654f, 0.239380f, 0.399414f, 0.224243f, 0.375000f, 0.206055f, 0.345215f, + 0.183228f, 0.308838f, 0.157104f, 0.261719f, 0.120361f, 0.193237f, 0.064697f, 0.072388f, + 0.000000f, 1.000000f, 0.023453f, 0.988281f, 0.045319f, 0.973145f, 0.066528f, 0.955566f, + 0.086365f, 0.937988f, 0.105164f, 0.920898f, 0.121643f, 0.904297f, 0.138306f, 0.887695f, + 0.153076f, 0.872070f, 0.167725f, 0.856934f, 0.180786f, 0.841797f, 0.193237f, 0.827637f, + 0.205078f, 0.813477f, 0.216064f, 0.800293f, 0.226562f, 0.787598f, 0.237915f, 0.774902f, + 0.246704f, 0.763184f, 0.256348f, 0.750977f, 0.262939f, 0.740234f, 0.271729f, 0.729492f, + 0.279541f, 0.719238f, 0.285645f, 0.709473f, 0.291748f, 0.699707f, 0.299316f, 0.689941f, + 0.304932f, 0.680664f, 0.309814f, 0.672363f, 0.315430f, 0.663574f, 0.319336f, 0.655762f, + 0.324463f, 0.647461f, 0.327637f, 0.640625f, 0.332031f, 0.632812f, 0.334717f, 0.625977f, + 0.337891f, 0.618652f, 0.340088f, 0.612305f, 0.343018f, 0.605957f, 0.344482f, 0.600098f, + 0.346436f, 0.594238f, 0.347656f, 0.588379f, 0.347656f, 0.582520f, 0.348877f, 0.576172f, + 0.348633f, 0.570801f, 0.347656f, 0.564453f, 0.347168f, 0.558105f, 0.345703f, 0.551758f, + 0.344727f, 0.544922f, 0.342529f, 0.538086f, 0.340820f, 0.530762f, 0.337402f, 0.522461f, + 0.334229f, 0.514160f, 0.329590f, 0.505371f, 0.324463f, 0.495361f, 0.318848f, 0.484863f, + 0.312744f, 0.472900f, 0.305664f, 0.460205f, 0.297363f, 0.445801f, 0.287598f, 0.430176f, + 0.276367f, 0.411865f, 0.264404f, 0.391113f, 0.249756f, 0.367432f, 0.232666f, 0.338135f, + 0.211670f, 0.301514f, 0.184692f, 0.255859f, 0.148438f, 0.188721f, 0.090271f, 0.070923f, + 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045563f, 0.972656f, 0.066711f, 0.955566f, + 0.086243f, 0.938477f, 0.105103f, 0.920898f, 0.123169f, 0.903809f, 0.138916f, 0.887207f, + 0.154419f, 0.871094f, 0.168701f, 0.855957f, 0.182983f, 0.840332f, 0.195435f, 0.826172f, + 0.207397f, 0.812012f, 0.219360f, 0.798340f, 0.230347f, 0.785156f, 0.240479f, 0.772461f, + 0.250488f, 0.760254f, 0.259766f, 0.748535f, 0.268555f, 0.736816f, 0.275879f, 0.726074f, + 0.284424f, 0.715332f, 0.291504f, 0.705078f, 0.298828f, 0.694824f, 0.305908f, 0.685059f, + 0.310791f, 0.676270f, 0.316650f, 0.666992f, 0.323242f, 0.657715f, 0.327637f, 0.648926f, + 0.332275f, 0.641113f, 0.337158f, 0.633301f, 0.340576f, 0.625977f, 0.344482f, 0.618164f, + 0.348877f, 0.610840f, 0.351318f, 0.604004f, 0.353760f, 0.597656f, 0.356445f, 0.591309f, + 0.357910f, 0.585449f, 0.359619f, 0.579590f, 0.360596f, 0.573730f, 0.361328f, 0.567383f, + 0.362061f, 0.561035f, 0.361328f, 0.555176f, 0.361816f, 0.548828f, 0.361328f, 0.541992f, + 0.361084f, 0.535645f, 0.358887f, 0.527832f, 0.357666f, 0.520508f, 0.354492f, 0.512207f, + 0.351807f, 0.504395f, 0.347900f, 0.495117f, 0.343994f, 0.485107f, 0.340088f, 0.474854f, + 0.334473f, 0.462402f, 0.327637f, 0.449463f, 0.320557f, 0.435303f, 0.312012f, 0.420166f, + 0.301758f, 0.402100f, 0.290039f, 0.381592f, 0.276611f, 0.358398f, 0.260254f, 0.329834f, + 0.239746f, 0.294922f, 0.214111f, 0.250244f, 0.178711f, 0.184326f, 0.118408f, 0.069946f, + 0.000000f, 1.000000f, 0.023590f, 0.988281f, 0.045593f, 0.973145f, 0.066833f, 0.955566f, + 0.086975f, 0.937988f, 0.105957f, 0.920410f, 0.124084f, 0.903320f, 0.140015f, 0.886719f, + 0.155884f, 0.870605f, 0.169800f, 0.854980f, 0.184814f, 0.839355f, 0.197998f, 0.824707f, + 0.210327f, 0.810059f, 0.222290f, 0.796387f, 0.233887f, 0.783203f, 0.244385f, 0.770020f, + 0.253662f, 0.757812f, 0.263184f, 0.745605f, 0.272949f, 0.733887f, 0.281738f, 0.722168f, + 0.290039f, 0.710938f, 0.298340f, 0.699707f, 0.305420f, 0.689453f, 0.312256f, 0.679688f, + 0.318359f, 0.670410f, 0.324951f, 0.660645f, 0.330811f, 0.651855f, 0.335693f, 0.643066f, + 0.341064f, 0.634766f, 0.345703f, 0.626465f, 0.349121f, 0.619141f, 0.354248f, 0.611328f, + 0.357910f, 0.604004f, 0.362061f, 0.596191f, 0.363770f, 0.589844f, 0.366699f, 0.583496f, + 0.368896f, 0.577148f, 0.370850f, 0.571289f, 0.374023f, 0.564453f, 0.374756f, 0.558105f, + 0.376465f, 0.551758f, 0.376709f, 0.545410f, 0.376465f, 0.539062f, 0.376709f, 0.532227f, + 0.376709f, 0.524902f, 0.375977f, 0.517090f, 0.375244f, 0.509277f, 0.373535f, 0.501465f, + 0.370850f, 0.493164f, 0.368164f, 0.483643f, 0.365234f, 0.473877f, 0.359619f, 0.464111f, + 0.355957f, 0.451904f, 0.350342f, 0.439453f, 0.343750f, 0.425537f, 0.335693f, 0.410156f, + 0.327148f, 0.392334f, 0.316162f, 0.372559f, 0.303711f, 0.349121f, 0.288086f, 0.321045f, + 0.269043f, 0.287598f, 0.244263f, 0.244507f, 0.209106f, 0.180664f, 0.149292f, 0.068176f, + 0.000000f, 1.000000f, 0.023499f, 0.988281f, 0.045319f, 0.973145f, 0.067078f, 0.955078f, + 0.087463f, 0.937500f, 0.107056f, 0.919922f, 0.123840f, 0.903320f, 0.139893f, 0.886719f, + 0.156006f, 0.870117f, 0.171753f, 0.853516f, 0.186523f, 0.838379f, 0.200073f, 0.823242f, + 0.212891f, 0.808594f, 0.225220f, 0.793945f, 0.237061f, 0.780273f, 0.247925f, 0.767578f, + 0.257324f, 0.754395f, 0.269287f, 0.741211f, 0.276367f, 0.729980f, 0.287842f, 0.718262f, + 0.294922f, 0.707031f, 0.302979f, 0.696289f, 0.310791f, 0.685547f, 0.318848f, 0.675293f, + 0.325195f, 0.666016f, 0.332520f, 0.655762f, 0.336914f, 0.646973f, 0.343506f, 0.637695f, + 0.349365f, 0.628906f, 0.354248f, 0.620605f, 0.359131f, 0.612305f, 0.363281f, 0.604492f, + 0.368164f, 0.596680f, 0.371826f, 0.588867f, 0.375000f, 0.582031f, 0.379150f, 0.574707f, + 0.381592f, 0.567871f, 0.384521f, 0.561035f, 0.387695f, 0.554199f, 0.388916f, 0.548340f, + 0.390381f, 0.541504f, 0.391357f, 0.535156f, 0.392090f, 0.528320f, 0.393311f, 0.520996f, + 0.392822f, 0.514160f, 0.393066f, 0.506836f, 0.391602f, 0.499023f, 0.391602f, 0.490967f, + 0.388916f, 0.482178f, 0.387939f, 0.472900f, 0.385498f, 0.462891f, 0.381348f, 0.452393f, + 0.377686f, 0.441162f, 0.372803f, 0.428223f, 0.366699f, 0.414551f, 0.359619f, 0.399658f, + 0.352295f, 0.382324f, 0.342773f, 0.362305f, 0.330322f, 0.339600f, 0.317139f, 0.312988f, + 0.298096f, 0.280273f, 0.274902f, 0.236816f, 0.241821f, 0.175659f, 0.181885f, 0.066345f, + 0.000000f, 1.000000f, 0.023575f, 0.988281f, 0.045929f, 0.972656f, 0.067505f, 0.955078f, + 0.087769f, 0.937500f, 0.106750f, 0.919922f, 0.124634f, 0.902344f, 0.142212f, 0.885254f, + 0.158447f, 0.868652f, 0.173218f, 0.852539f, 0.187988f, 0.836914f, 0.203003f, 0.820801f, + 0.215820f, 0.806152f, 0.228760f, 0.791504f, 0.240479f, 0.777832f, 0.250977f, 0.764648f, + 0.262451f, 0.750977f, 0.272461f, 0.738770f, 0.281982f, 0.726562f, 0.291748f, 0.714355f, + 0.299316f, 0.703613f, 0.309082f, 0.692383f, 0.317139f, 0.681641f, 0.324707f, 0.670898f, + 0.331787f, 0.661133f, 0.337646f, 0.651367f, 0.344482f, 0.641602f, 0.351562f, 0.632324f, + 0.358154f, 0.622559f, 0.363281f, 0.613770f, 0.368896f, 0.604980f, 0.373291f, 0.597168f, + 0.379150f, 0.588867f, 0.382812f, 0.580566f, 0.387207f, 0.572754f, 0.390381f, 0.565918f, + 0.393066f, 0.559082f, 0.396729f, 0.552246f, 0.400146f, 0.545410f, 0.402832f, 0.538574f, + 0.404053f, 0.531738f, 0.406006f, 0.524902f, 0.407471f, 0.518066f, 0.409424f, 0.510254f, + 0.409424f, 0.503418f, 0.409912f, 0.496094f, 0.410156f, 0.487793f, 0.409912f, 0.479492f, + 0.408691f, 0.471436f, 0.407227f, 0.461914f, 0.405029f, 0.451660f, 0.403076f, 0.441162f, + 0.399414f, 0.430176f, 0.395264f, 0.417236f, 0.390869f, 0.403809f, 0.384033f, 0.388916f, + 0.378662f, 0.371826f, 0.369141f, 0.352539f, 0.358154f, 0.330078f, 0.345947f, 0.304199f, + 0.329102f, 0.272217f, 0.307129f, 0.230713f, 0.274658f, 0.171143f, 0.216431f, 0.064514f, + 0.000000f, 1.000000f, 0.023270f, 0.988770f, 0.045654f, 0.972656f, 0.067322f, 0.955566f, + 0.087585f, 0.937500f, 0.107178f, 0.919434f, 0.125488f, 0.901855f, 0.143433f, 0.884277f, + 0.160034f, 0.867676f, 0.174927f, 0.851562f, 0.190796f, 0.834473f, 0.204468f, 0.819336f, + 0.217651f, 0.804199f, 0.230469f, 0.790039f, 0.242798f, 0.775879f, 0.256104f, 0.761719f, + 0.266113f, 0.749023f, 0.276855f, 0.735840f, 0.286377f, 0.724121f, 0.296631f, 0.711426f, + 0.305176f, 0.699707f, 0.314209f, 0.688477f, 0.322754f, 0.677246f, 0.331055f, 0.666504f, + 0.338867f, 0.655762f, 0.346191f, 0.645508f, 0.353271f, 0.635254f, 0.359619f, 0.625977f, + 0.366943f, 0.616211f, 0.372314f, 0.606934f, 0.378662f, 0.598145f, 0.383301f, 0.589844f, + 0.387695f, 0.582031f, 0.393555f, 0.573242f, 0.398438f, 0.564941f, 0.401855f, 0.557617f, + 0.405762f, 0.549805f, 0.409912f, 0.542480f, 0.413330f, 0.535156f, 0.416016f, 0.528320f, + 0.418945f, 0.521973f, 0.421143f, 0.514648f, 0.423096f, 0.506836f, 0.424316f, 0.500488f, + 0.425293f, 0.492676f, 0.426514f, 0.485107f, 0.428467f, 0.476562f, 0.428223f, 0.468018f, + 0.426758f, 0.459717f, 0.426025f, 0.450439f, 0.427002f, 0.440674f, 0.425293f, 0.429688f, + 0.421631f, 0.418701f, 0.418457f, 0.405762f, 0.414795f, 0.392334f, 0.409668f, 0.377686f, + 0.403809f, 0.361084f, 0.395996f, 0.342041f, 0.386719f, 0.320312f, 0.375000f, 0.294678f, + 0.359375f, 0.262939f, 0.338623f, 0.223511f, 0.308105f, 0.164795f, 0.251465f, 0.062103f, + 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046021f, 0.972656f, 0.067383f, 0.955566f, + 0.088318f, 0.937012f, 0.108032f, 0.918945f, 0.126587f, 0.901367f, 0.144409f, 0.883789f, + 0.161255f, 0.866211f, 0.177734f, 0.849121f, 0.191406f, 0.833984f, 0.207642f, 0.817383f, + 0.221191f, 0.802734f, 0.234009f, 0.788086f, 0.246826f, 0.773438f, 0.257324f, 0.760254f, + 0.269531f, 0.746582f, 0.280762f, 0.733398f, 0.291504f, 0.720215f, 0.301025f, 0.708008f, + 0.311035f, 0.695801f, 0.320557f, 0.684082f, 0.329102f, 0.672363f, 0.338135f, 0.661133f, + 0.346680f, 0.650391f, 0.354492f, 0.639648f, 0.361328f, 0.629883f, 0.367920f, 0.619629f, + 0.374756f, 0.610352f, 0.380859f, 0.600586f, 0.387695f, 0.591797f, 0.393311f, 0.582520f, + 0.399170f, 0.573730f, 0.405029f, 0.564453f, 0.409668f, 0.556641f, 0.414062f, 0.548340f, + 0.418945f, 0.540527f, 0.422607f, 0.532715f, 0.426270f, 0.525879f, 0.430420f, 0.518555f, + 0.433350f, 0.511230f, 0.436035f, 0.503906f, 0.438721f, 0.496094f, 0.440430f, 0.489258f, + 0.442627f, 0.481445f, 0.444580f, 0.473389f, 0.445312f, 0.465332f, 0.447266f, 0.456787f, + 0.447510f, 0.447998f, 0.446777f, 0.438721f, 0.446533f, 0.428711f, 0.445068f, 0.417725f, + 0.443848f, 0.406738f, 0.441650f, 0.394287f, 0.438721f, 0.381104f, 0.434570f, 0.366699f, + 0.429443f, 0.349854f, 0.423096f, 0.331299f, 0.413818f, 0.310547f, 0.404297f, 0.285156f, + 0.390869f, 0.254883f, 0.371338f, 0.215698f, 0.342773f, 0.159912f, 0.289062f, 0.060211f, + 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046082f, 0.972656f, 0.067627f, 0.955078f, + 0.088745f, 0.937012f, 0.108459f, 0.918945f, 0.127930f, 0.899902f, 0.146362f, 0.882324f, + 0.163696f, 0.864746f, 0.178589f, 0.848633f, 0.195435f, 0.831543f, 0.208496f, 0.816895f, + 0.222290f, 0.801270f, 0.235962f, 0.786133f, 0.249146f, 0.771484f, 0.262939f, 0.756836f, + 0.273926f, 0.743652f, 0.284668f, 0.729980f, 0.296875f, 0.716797f, 0.306885f, 0.703613f, + 0.317383f, 0.691406f, 0.326660f, 0.679688f, 0.334961f, 0.667969f, 0.343750f, 0.656738f, + 0.352783f, 0.645996f, 0.360596f, 0.634766f, 0.369141f, 0.624023f, 0.376709f, 0.613770f, + 0.384033f, 0.603516f, 0.390625f, 0.593750f, 0.396973f, 0.583984f, 0.403564f, 0.574707f, + 0.408936f, 0.565918f, 0.414551f, 0.557129f, 0.420166f, 0.548340f, 0.426514f, 0.539551f, + 0.431152f, 0.531250f, 0.435791f, 0.522949f, 0.440186f, 0.515625f, 0.443359f, 0.508301f, + 0.447754f, 0.500488f, 0.451416f, 0.493164f, 0.454346f, 0.485352f, 0.457275f, 0.477783f, + 0.459961f, 0.470215f, 0.461670f, 0.461914f, 0.463379f, 0.453857f, 0.465576f, 0.445068f, + 0.466064f, 0.435791f, 0.466553f, 0.427002f, 0.467529f, 0.416748f, 0.467529f, 0.406738f, + 0.465820f, 0.395264f, 0.465332f, 0.382812f, 0.462891f, 0.369385f, 0.460205f, 0.354980f, + 0.455322f, 0.338379f, 0.451172f, 0.321289f, 0.442871f, 0.299561f, 0.434326f, 0.275391f, + 0.420898f, 0.245605f, 0.403320f, 0.208374f, 0.377441f, 0.154297f, 0.325928f, 0.058807f, + 0.000000f, 1.000000f, 0.022980f, 0.988770f, 0.046143f, 0.972168f, 0.068359f, 0.954590f, + 0.089783f, 0.936035f, 0.109497f, 0.917969f, 0.129028f, 0.898926f, 0.146606f, 0.881836f, + 0.164307f, 0.864258f, 0.180664f, 0.847656f, 0.196045f, 0.831543f, 0.211426f, 0.814941f, + 0.225586f, 0.799316f, 0.239868f, 0.784180f, 0.253174f, 0.769043f, 0.265381f, 0.754883f, + 0.277832f, 0.740234f, 0.289551f, 0.726562f, 0.300293f, 0.713379f, 0.311523f, 0.700684f, + 0.322266f, 0.687500f, 0.332031f, 0.675781f, 0.341553f, 0.663574f, 0.350586f, 0.651855f, + 0.360107f, 0.640137f, 0.368652f, 0.628906f, 0.377441f, 0.617676f, 0.384766f, 0.607422f, + 0.392090f, 0.597168f, 0.400391f, 0.586914f, 0.407471f, 0.576660f, 0.413574f, 0.567383f, + 0.420898f, 0.557617f, 0.426270f, 0.548340f, 0.432373f, 0.539551f, 0.437988f, 0.530762f, + 0.443848f, 0.521973f, 0.448730f, 0.513672f, 0.452637f, 0.505859f, 0.457275f, 0.497803f, + 0.462158f, 0.489746f, 0.466064f, 0.482422f, 0.470947f, 0.474854f, 0.473877f, 0.466064f, + 0.476074f, 0.458496f, 0.479492f, 0.450439f, 0.482422f, 0.441406f, 0.484863f, 0.433105f, + 0.485840f, 0.423828f, 0.487061f, 0.414551f, 0.488037f, 0.404541f, 0.488525f, 0.393799f, + 0.487549f, 0.382324f, 0.487793f, 0.370850f, 0.486084f, 0.357178f, 0.484375f, 0.343750f, + 0.480469f, 0.327393f, 0.475830f, 0.309570f, 0.471436f, 0.289551f, 0.463379f, 0.265381f, + 0.451904f, 0.237427f, 0.436768f, 0.200684f, 0.411865f, 0.148315f, 0.364258f, 0.057251f, + 0.000000f, 1.000000f, 0.023148f, 0.988770f, 0.046234f, 0.972168f, 0.068176f, 0.954590f, + 0.088684f, 0.937012f, 0.110352f, 0.916992f, 0.130005f, 0.898926f, 0.148071f, 0.880859f, + 0.166260f, 0.863281f, 0.181763f, 0.847168f, 0.197998f, 0.830078f, 0.213257f, 0.813965f, + 0.227783f, 0.797852f, 0.243042f, 0.781738f, 0.256592f, 0.766602f, 0.269287f, 0.751953f, + 0.281494f, 0.737793f, 0.293945f, 0.723633f, 0.305908f, 0.709961f, 0.317139f, 0.696777f, + 0.328369f, 0.683105f, 0.336914f, 0.671387f, 0.347900f, 0.658691f, 0.358154f, 0.646484f, + 0.367432f, 0.634766f, 0.375488f, 0.624023f, 0.384277f, 0.612305f, 0.394043f, 0.601074f, + 0.402100f, 0.589844f, 0.409668f, 0.579590f, 0.417236f, 0.569824f, 0.423584f, 0.560059f, + 0.431396f, 0.549805f, 0.437744f, 0.540039f, 0.443848f, 0.530762f, 0.450439f, 0.521973f, + 0.456055f, 0.512695f, 0.461426f, 0.503906f, 0.467529f, 0.495361f, 0.472412f, 0.487061f, + 0.477051f, 0.479004f, 0.480957f, 0.471191f, 0.485840f, 0.463135f, 0.490479f, 0.454834f, + 0.492676f, 0.446777f, 0.497070f, 0.437988f, 0.500000f, 0.429443f, 0.502441f, 0.420898f, + 0.504883f, 0.411621f, 0.507324f, 0.402588f, 0.508789f, 0.392334f, 0.510742f, 0.381348f, + 0.511230f, 0.370605f, 0.510254f, 0.358398f, 0.510742f, 0.345459f, 0.509766f, 0.331543f, + 0.507324f, 0.315918f, 0.503906f, 0.298096f, 0.499268f, 0.278809f, 0.492188f, 0.255127f, + 0.482422f, 0.228027f, 0.467773f, 0.192993f, 0.447754f, 0.142578f, 0.401123f, 0.054169f, + 0.000000f, 1.000000f, 0.023102f, 0.988770f, 0.046387f, 0.972656f, 0.068909f, 0.954102f, + 0.091064f, 0.935059f, 0.111694f, 0.916504f, 0.130493f, 0.898438f, 0.148438f, 0.880859f, + 0.165771f, 0.863281f, 0.183716f, 0.845703f, 0.199463f, 0.829102f, 0.216797f, 0.811523f, + 0.231079f, 0.795410f, 0.245972f, 0.779297f, 0.260254f, 0.764160f, 0.272705f, 0.749512f, + 0.285889f, 0.734863f, 0.298340f, 0.720703f, 0.311523f, 0.706055f, 0.322021f, 0.692871f, + 0.333740f, 0.679688f, 0.344482f, 0.666504f, 0.354492f, 0.654297f, 0.364502f, 0.641602f, + 0.373535f, 0.629395f, 0.383545f, 0.617676f, 0.393555f, 0.605957f, 0.402588f, 0.594727f, + 0.409912f, 0.583984f, 0.418945f, 0.572754f, 0.426025f, 0.562500f, 0.434570f, 0.551758f, + 0.441406f, 0.542480f, 0.449707f, 0.531738f, 0.456299f, 0.521973f, 0.462158f, 0.512695f, + 0.469482f, 0.503418f, 0.474854f, 0.494385f, 0.481201f, 0.485352f, 0.486328f, 0.476318f, + 0.492432f, 0.468018f, 0.498291f, 0.459473f, 0.501465f, 0.451416f, 0.507324f, 0.443359f, + 0.510254f, 0.434570f, 0.514648f, 0.426025f, 0.519043f, 0.416992f, 0.521484f, 0.408203f, + 0.524902f, 0.399170f, 0.527344f, 0.389404f, 0.528809f, 0.380127f, 0.532227f, 0.368896f, + 0.533691f, 0.357910f, 0.534668f, 0.346436f, 0.534668f, 0.333740f, 0.533691f, 0.319092f, + 0.532715f, 0.304443f, 0.529785f, 0.287109f, 0.526367f, 0.267822f, 0.521973f, 0.245483f, + 0.512695f, 0.218872f, 0.500488f, 0.184692f, 0.481445f, 0.136841f, 0.440674f, 0.052094f, + 0.000000f, 1.000000f, 0.022919f, 0.988770f, 0.046387f, 0.972168f, 0.069458f, 0.953613f, + 0.092285f, 0.934082f, 0.111755f, 0.916504f, 0.131104f, 0.898438f, 0.149414f, 0.880371f, + 0.167725f, 0.862305f, 0.185303f, 0.844727f, 0.203125f, 0.826660f, 0.218750f, 0.810059f, + 0.234253f, 0.793457f, 0.248413f, 0.777832f, 0.263916f, 0.761719f, 0.276367f, 0.747070f, + 0.290527f, 0.731934f, 0.303223f, 0.717285f, 0.314941f, 0.703125f, 0.327148f, 0.689453f, + 0.339111f, 0.675781f, 0.349609f, 0.662109f, 0.361572f, 0.648926f, 0.372070f, 0.636719f, + 0.382568f, 0.623535f, 0.392334f, 0.611816f, 0.400879f, 0.600586f, 0.409668f, 0.588867f, + 0.418945f, 0.577148f, 0.428955f, 0.565918f, 0.437012f, 0.555176f, 0.444824f, 0.544434f, + 0.453125f, 0.533691f, 0.460449f, 0.523438f, 0.467529f, 0.513672f, 0.475342f, 0.503418f, + 0.480957f, 0.494629f, 0.488281f, 0.484375f, 0.494629f, 0.475098f, 0.500488f, 0.465820f, + 0.507324f, 0.456787f, 0.512207f, 0.448486f, 0.518555f, 0.439453f, 0.522461f, 0.431396f, + 0.527832f, 0.422852f, 0.532715f, 0.413818f, 0.537109f, 0.404541f, 0.541016f, 0.395996f, + 0.544434f, 0.386719f, 0.547852f, 0.377441f, 0.549316f, 0.366943f, 0.553223f, 0.356445f, + 0.555664f, 0.345459f, 0.556641f, 0.333740f, 0.557617f, 0.320801f, 0.558105f, 0.307129f, + 0.557129f, 0.292969f, 0.557129f, 0.275391f, 0.555176f, 0.257324f, 0.549805f, 0.234863f, + 0.544434f, 0.209473f, 0.534180f, 0.175781f, 0.515625f, 0.130371f, 0.477783f, 0.049103f, + 0.000000f, 1.000000f, 0.023056f, 0.988770f, 0.046051f, 0.972656f, 0.070496f, 0.952637f, + 0.091858f, 0.934570f, 0.112366f, 0.916016f, 0.132202f, 0.897949f, 0.151123f, 0.879395f, + 0.169067f, 0.861328f, 0.187622f, 0.842773f, 0.203369f, 0.826172f, 0.220459f, 0.809082f, + 0.236206f, 0.792480f, 0.251221f, 0.775879f, 0.265381f, 0.759766f, 0.280273f, 0.744141f, + 0.294189f, 0.729004f, 0.306396f, 0.714355f, 0.320801f, 0.699219f, 0.331787f, 0.685547f, + 0.345215f, 0.671387f, 0.355957f, 0.657715f, 0.367432f, 0.644531f, 0.379150f, 0.631348f, + 0.389160f, 0.618652f, 0.399658f, 0.605957f, 0.409180f, 0.594238f, 0.419434f, 0.581543f, + 0.429688f, 0.569824f, 0.437988f, 0.558594f, 0.446533f, 0.547363f, 0.455322f, 0.536621f, + 0.464600f, 0.524902f, 0.470947f, 0.515137f, 0.480469f, 0.504395f, 0.487793f, 0.494385f, + 0.494873f, 0.484375f, 0.502441f, 0.474609f, 0.508301f, 0.464844f, 0.516113f, 0.455078f, + 0.521484f, 0.445801f, 0.528320f, 0.436768f, 0.533691f, 0.427734f, 0.539062f, 0.419189f, + 0.544922f, 0.410156f, 0.550293f, 0.401611f, 0.554688f, 0.392090f, 0.559570f, 0.382812f, + 0.564453f, 0.373779f, 0.567871f, 0.364014f, 0.570801f, 0.354248f, 0.574219f, 0.343750f, + 0.577637f, 0.332031f, 0.580078f, 0.320557f, 0.582520f, 0.308105f, 0.584473f, 0.294434f, + 0.583496f, 0.280273f, 0.583984f, 0.264160f, 0.583008f, 0.245483f, 0.579590f, 0.224854f, + 0.573242f, 0.199341f, 0.564941f, 0.168945f, 0.549805f, 0.124329f, 0.514648f, 0.047058f, + 0.000000f, 1.000000f, 0.023087f, 0.988770f, 0.047150f, 0.971680f, 0.070435f, 0.953125f, + 0.091675f, 0.935059f, 0.111877f, 0.916992f, 0.131836f, 0.897949f, 0.151978f, 0.878906f, + 0.170898f, 0.860352f, 0.188354f, 0.842285f, 0.206055f, 0.824707f, 0.222900f, 0.807129f, + 0.239746f, 0.789551f, 0.255127f, 0.773438f, 0.270020f, 0.757324f, 0.284668f, 0.741211f, + 0.297852f, 0.726074f, 0.312988f, 0.710938f, 0.324707f, 0.695801f, 0.338135f, 0.681152f, + 0.350830f, 0.666992f, 0.362305f, 0.653320f, 0.374756f, 0.639160f, 0.385254f, 0.626465f, + 0.397461f, 0.612793f, 0.408203f, 0.600098f, 0.419189f, 0.587891f, 0.428223f, 0.575684f, + 0.437256f, 0.563965f, 0.447266f, 0.551758f, 0.457031f, 0.540039f, 0.467529f, 0.528320f, + 0.474609f, 0.517578f, 0.483887f, 0.505859f, 0.491455f, 0.495850f, 0.500488f, 0.484863f, + 0.507812f, 0.474609f, 0.514160f, 0.464844f, 0.523926f, 0.453857f, 0.530273f, 0.444336f, + 0.537598f, 0.434570f, 0.543945f, 0.425049f, 0.550781f, 0.415771f, 0.556152f, 0.406738f, + 0.561523f, 0.397949f, 0.567871f, 0.388672f, 0.572754f, 0.380127f, 0.578613f, 0.369873f, + 0.583984f, 0.360596f, 0.587402f, 0.351318f, 0.592285f, 0.340820f, 0.595215f, 0.330566f, + 0.600586f, 0.319092f, 0.602051f, 0.307861f, 0.605957f, 0.295654f, 0.607910f, 0.281982f, + 0.610352f, 0.268555f, 0.610352f, 0.251953f, 0.608887f, 0.234253f, 0.607910f, 0.214111f, + 0.604004f, 0.190308f, 0.596680f, 0.159790f, 0.583984f, 0.117981f, 0.553711f, 0.044434f, + 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.047394f, 0.971191f, 0.070435f, 0.953125f, + 0.091614f, 0.935059f, 0.113525f, 0.915527f, 0.133789f, 0.896484f, 0.154419f, 0.876953f, + 0.171875f, 0.859375f, 0.190308f, 0.841309f, 0.208740f, 0.823242f, 0.225586f, 0.805176f, + 0.241821f, 0.788574f, 0.257568f, 0.771973f, 0.272705f, 0.755371f, 0.287354f, 0.738770f, + 0.302734f, 0.722656f, 0.316162f, 0.707520f, 0.330811f, 0.691895f, 0.342041f, 0.677734f, + 0.357666f, 0.662598f, 0.369385f, 0.648438f, 0.380859f, 0.634277f, 0.392822f, 0.621094f, + 0.404541f, 0.607422f, 0.415527f, 0.594238f, 0.427490f, 0.581055f, 0.436768f, 0.568848f, + 0.447510f, 0.556641f, 0.457031f, 0.544434f, 0.466309f, 0.532715f, 0.476807f, 0.520508f, + 0.486084f, 0.508789f, 0.495605f, 0.497803f, 0.503906f, 0.486816f, 0.511719f, 0.476074f, + 0.520020f, 0.465332f, 0.529297f, 0.454102f, 0.536133f, 0.444336f, 0.544434f, 0.433838f, + 0.552246f, 0.423340f, 0.559570f, 0.413330f, 0.567383f, 0.403809f, 0.572266f, 0.394775f, + 0.579102f, 0.385254f, 0.585449f, 0.375977f, 0.591309f, 0.366943f, 0.597656f, 0.357178f, + 0.603027f, 0.347412f, 0.607910f, 0.337891f, 0.612793f, 0.327637f, 0.617676f, 0.317139f, + 0.622559f, 0.305664f, 0.625977f, 0.294678f, 0.629395f, 0.282715f, 0.631836f, 0.269287f, + 0.633789f, 0.255859f, 0.634766f, 0.239868f, 0.637207f, 0.223389f, 0.635254f, 0.203979f, + 0.633301f, 0.180054f, 0.627930f, 0.151367f, 0.618164f, 0.111938f, 0.589355f, 0.042847f, + 0.000000f, 1.000000f, 0.022888f, 0.988770f, 0.048126f, 0.970703f, 0.070801f, 0.953125f, + 0.092102f, 0.935059f, 0.113831f, 0.915527f, 0.134766f, 0.895996f, 0.153564f, 0.877441f, + 0.174072f, 0.858398f, 0.192139f, 0.840332f, 0.211548f, 0.821289f, 0.228516f, 0.803711f, + 0.244995f, 0.786133f, 0.260986f, 0.769043f, 0.276123f, 0.752441f, 0.291504f, 0.736328f, + 0.307617f, 0.719727f, 0.321045f, 0.704102f, 0.335938f, 0.688477f, 0.349609f, 0.673340f, + 0.362305f, 0.658691f, 0.374756f, 0.644043f, 0.387451f, 0.629883f, 0.400879f, 0.615723f, + 0.413330f, 0.601562f, 0.424805f, 0.588379f, 0.436279f, 0.574707f, 0.446289f, 0.562500f, + 0.456299f, 0.549805f, 0.467285f, 0.537109f, 0.478516f, 0.524414f, 0.488037f, 0.512207f, + 0.498291f, 0.500488f, 0.506348f, 0.489258f, 0.516602f, 0.477295f, 0.524902f, 0.466553f, + 0.535156f, 0.455078f, 0.541992f, 0.444336f, 0.549805f, 0.433838f, 0.558594f, 0.423096f, + 0.567383f, 0.412354f, 0.575684f, 0.401611f, 0.582031f, 0.392090f, 0.590332f, 0.381836f, + 0.597168f, 0.372070f, 0.604004f, 0.362549f, 0.609375f, 0.353516f, 0.616699f, 0.343994f, + 0.622070f, 0.334229f, 0.627930f, 0.323975f, 0.632812f, 0.314209f, 0.638672f, 0.303467f, + 0.644043f, 0.292725f, 0.648438f, 0.281006f, 0.651855f, 0.269531f, 0.656738f, 0.256836f, + 0.659668f, 0.243530f, 0.662109f, 0.228027f, 0.663574f, 0.211792f, 0.663574f, 0.192383f, + 0.661621f, 0.171021f, 0.659668f, 0.143311f, 0.649414f, 0.104797f, 0.626953f, 0.040009f, + 0.000000f, 1.000000f, 0.022675f, 0.988770f, 0.047974f, 0.971191f, 0.070557f, 0.953613f, + 0.092834f, 0.934570f, 0.115173f, 0.914551f, 0.135132f, 0.895996f, 0.156006f, 0.876465f, + 0.175049f, 0.857910f, 0.194702f, 0.838379f, 0.212402f, 0.820312f, 0.230591f, 0.802246f, + 0.246704f, 0.784668f, 0.263916f, 0.767090f, 0.281006f, 0.750000f, 0.296875f, 0.732910f, + 0.310547f, 0.716797f, 0.326416f, 0.700684f, 0.341064f, 0.684570f, 0.354980f, 0.669434f, + 0.368896f, 0.653809f, 0.381348f, 0.639648f, 0.395508f, 0.624512f, 0.408203f, 0.609863f, + 0.420410f, 0.596191f, 0.430908f, 0.583008f, 0.442627f, 0.568848f, 0.454346f, 0.555664f, + 0.466797f, 0.542480f, 0.476807f, 0.529785f, 0.487793f, 0.517090f, 0.498291f, 0.504395f, + 0.507812f, 0.492432f, 0.519043f, 0.480225f, 0.527832f, 0.468506f, 0.539062f, 0.456543f, + 0.547852f, 0.445068f, 0.557129f, 0.434082f, 0.565430f, 0.422852f, 0.572266f, 0.412598f, + 0.581543f, 0.401611f, 0.590332f, 0.390625f, 0.598145f, 0.379883f, 0.606445f, 0.369629f, + 0.615234f, 0.359131f, 0.619141f, 0.350342f, 0.628418f, 0.339600f, 0.635254f, 0.330322f, + 0.642090f, 0.320557f, 0.647949f, 0.310547f, 0.652832f, 0.300537f, 0.659668f, 0.289795f, + 0.665039f, 0.279053f, 0.671387f, 0.267578f, 0.675781f, 0.255859f, 0.680176f, 0.243530f, + 0.684082f, 0.230225f, 0.686523f, 0.216187f, 0.690430f, 0.199951f, 0.690430f, 0.182495f, + 0.691895f, 0.161377f, 0.688477f, 0.134766f, 0.681641f, 0.098877f, 0.663086f, 0.038025f, + 0.000000f, 1.000000f, 0.023010f, 0.988770f, 0.048401f, 0.970703f, 0.071045f, 0.953125f, + 0.093140f, 0.934082f, 0.114502f, 0.915039f, 0.136597f, 0.895020f, 0.156372f, 0.875977f, + 0.177734f, 0.855957f, 0.195801f, 0.837402f, 0.214478f, 0.818848f, 0.233765f, 0.800293f, + 0.250000f, 0.782715f, 0.267578f, 0.764648f, 0.283447f, 0.747559f, 0.299316f, 0.730469f, + 0.315918f, 0.713379f, 0.330322f, 0.697266f, 0.346436f, 0.681152f, 0.359619f, 0.665527f, + 0.374512f, 0.649902f, 0.388184f, 0.634277f, 0.401611f, 0.619629f, 0.414307f, 0.604980f, + 0.427246f, 0.590332f, 0.439941f, 0.576660f, 0.451660f, 0.562500f, 0.464355f, 0.548828f, + 0.475586f, 0.535156f, 0.488037f, 0.521973f, 0.498047f, 0.509277f, 0.509277f, 0.496338f, + 0.520508f, 0.483643f, 0.530273f, 0.471436f, 0.541016f, 0.459229f, 0.550781f, 0.447266f, + 0.560547f, 0.435059f, 0.569824f, 0.423584f, 0.579590f, 0.412354f, 0.589355f, 0.400635f, + 0.598633f, 0.389648f, 0.604980f, 0.379639f, 0.615234f, 0.368164f, 0.623535f, 0.357178f, + 0.630859f, 0.346924f, 0.637695f, 0.336670f, 0.646484f, 0.326416f, 0.654297f, 0.316406f, + 0.661621f, 0.306396f, 0.669434f, 0.296387f, 0.674316f, 0.286621f, 0.681152f, 0.275635f, + 0.687500f, 0.264893f, 0.694336f, 0.253662f, 0.699219f, 0.242432f, 0.704590f, 0.230469f, + 0.708984f, 0.217407f, 0.711914f, 0.203613f, 0.715820f, 0.187866f, 0.718262f, 0.171265f, + 0.720215f, 0.150146f, 0.719238f, 0.125732f, 0.712402f, 0.092590f, 0.697754f, 0.035126f, + 0.000000f, 1.000000f, 0.023560f, 0.988281f, 0.048157f, 0.971191f, 0.070618f, 0.953613f, + 0.094360f, 0.933105f, 0.115234f, 0.914551f, 0.137451f, 0.894531f, 0.158447f, 0.875000f, + 0.177612f, 0.855957f, 0.198120f, 0.836426f, 0.217041f, 0.817383f, 0.234985f, 0.798828f, + 0.252930f, 0.780273f, 0.270508f, 0.762695f, 0.288086f, 0.745117f, 0.303467f, 0.728027f, + 0.320801f, 0.710449f, 0.336426f, 0.693359f, 0.350342f, 0.677734f, 0.365967f, 0.661133f, + 0.381104f, 0.645020f, 0.394775f, 0.629883f, 0.408691f, 0.614746f, 0.422852f, 0.599609f, + 0.435303f, 0.584961f, 0.448730f, 0.569824f, 0.461182f, 0.556152f, 0.474365f, 0.541992f, + 0.486328f, 0.527832f, 0.497803f, 0.514648f, 0.509766f, 0.500977f, 0.520020f, 0.488525f, + 0.531250f, 0.475098f, 0.542480f, 0.462646f, 0.551758f, 0.450439f, 0.563965f, 0.437256f, + 0.573242f, 0.425781f, 0.583984f, 0.413330f, 0.594238f, 0.401611f, 0.604492f, 0.389893f, + 0.612305f, 0.378662f, 0.621582f, 0.367432f, 0.629395f, 0.356689f, 0.640137f, 0.344971f, + 0.647949f, 0.334473f, 0.656738f, 0.323486f, 0.664062f, 0.312988f, 0.673340f, 0.302490f, + 0.679688f, 0.292725f, 0.688477f, 0.282227f, 0.695801f, 0.272217f, 0.702148f, 0.262207f, + 0.708496f, 0.251221f, 0.714844f, 0.240356f, 0.722168f, 0.228516f, 0.727051f, 0.217163f, + 0.732422f, 0.204590f, 0.736816f, 0.191528f, 0.742676f, 0.176270f, 0.744629f, 0.159912f, + 0.747559f, 0.140625f, 0.748047f, 0.117004f, 0.745117f, 0.085266f, 0.731445f, 0.031067f, + 0.000000f, 1.000000f, 0.023895f, 0.987793f, 0.048157f, 0.971191f, 0.071167f, 0.953125f, + 0.094788f, 0.933105f, 0.116272f, 0.914062f, 0.137939f, 0.894043f, 0.159424f, 0.874512f, + 0.180176f, 0.854492f, 0.199829f, 0.834961f, 0.219360f, 0.815918f, 0.237305f, 0.797363f, + 0.256348f, 0.778320f, 0.274170f, 0.760254f, 0.291504f, 0.742188f, 0.308105f, 0.724609f, + 0.323975f, 0.707520f, 0.342041f, 0.689941f, 0.356201f, 0.673828f, 0.372314f, 0.657227f, + 0.387207f, 0.640625f, 0.401123f, 0.625000f, 0.414795f, 0.609863f, 0.430420f, 0.593750f, + 0.444336f, 0.578613f, 0.457275f, 0.563477f, 0.470703f, 0.549316f, 0.483643f, 0.535156f, + 0.495605f, 0.520996f, 0.508301f, 0.506836f, 0.519531f, 0.493408f, 0.531250f, 0.479980f, + 0.543457f, 0.466797f, 0.553711f, 0.453613f, 0.565430f, 0.440674f, 0.576172f, 0.428223f, + 0.587402f, 0.415283f, 0.597656f, 0.403076f, 0.608887f, 0.391113f, 0.616211f, 0.379395f, + 0.628418f, 0.367188f, 0.636719f, 0.355713f, 0.646973f, 0.343994f, 0.656738f, 0.333252f, + 0.665527f, 0.321777f, 0.673340f, 0.310791f, 0.682617f, 0.299561f, 0.692383f, 0.288818f, + 0.699219f, 0.278564f, 0.707031f, 0.268311f, 0.715820f, 0.257568f, 0.723633f, 0.247803f, + 0.730469f, 0.237793f, 0.735840f, 0.226685f, 0.743652f, 0.215210f, 0.750000f, 0.203613f, + 0.756836f, 0.191528f, 0.761230f, 0.178467f, 0.766602f, 0.163940f, 0.770996f, 0.148804f, + 0.774902f, 0.130737f, 0.776855f, 0.108154f, 0.775391f, 0.079651f, 0.764648f, 0.028809f, + 0.000000f, 1.000000f, 0.024796f, 0.986816f, 0.047729f, 0.971680f, 0.071899f, 0.952148f, + 0.094849f, 0.933105f, 0.117432f, 0.913086f, 0.138184f, 0.894043f, 0.161255f, 0.872559f, + 0.180542f, 0.854004f, 0.200806f, 0.834473f, 0.221069f, 0.814941f, 0.240601f, 0.795410f, + 0.257568f, 0.777344f, 0.277100f, 0.758301f, 0.294678f, 0.739746f, 0.312256f, 0.721680f, + 0.328369f, 0.704590f, 0.346436f, 0.686523f, 0.360840f, 0.669922f, 0.377441f, 0.652832f, + 0.393799f, 0.635742f, 0.408203f, 0.620117f, 0.423096f, 0.604004f, 0.436768f, 0.588379f, + 0.452881f, 0.572266f, 0.466064f, 0.557617f, 0.479004f, 0.542480f, 0.492188f, 0.527832f, + 0.505371f, 0.513672f, 0.518066f, 0.499512f, 0.530273f, 0.485352f, 0.543457f, 0.471436f, + 0.554688f, 0.458008f, 0.565918f, 0.444580f, 0.578613f, 0.431152f, 0.589355f, 0.418213f, + 0.602051f, 0.405273f, 0.611328f, 0.393066f, 0.621094f, 0.380615f, 0.632324f, 0.368164f, + 0.643066f, 0.355713f, 0.653320f, 0.343994f, 0.663574f, 0.332275f, 0.672852f, 0.320557f, + 0.681641f, 0.309570f, 0.690918f, 0.298096f, 0.701660f, 0.286133f, 0.709961f, 0.275146f, + 0.720215f, 0.264404f, 0.727051f, 0.253906f, 0.735352f, 0.243652f, 0.743652f, 0.233032f, + 0.751953f, 0.222412f, 0.759277f, 0.212524f, 0.766113f, 0.200928f, 0.772949f, 0.189575f, + 0.780273f, 0.177856f, 0.786621f, 0.165283f, 0.791992f, 0.151611f, 0.796875f, 0.136719f, + 0.800781f, 0.120178f, 0.805664f, 0.099182f, 0.803711f, 0.072327f, 0.796875f, 0.026505f, + 0.000000f, 1.000000f, 0.025131f, 0.986816f, 0.048157f, 0.971680f, 0.071899f, 0.952637f, + 0.094910f, 0.933105f, 0.117920f, 0.913086f, 0.140625f, 0.892578f, 0.161743f, 0.872559f, + 0.184082f, 0.852051f, 0.203247f, 0.833008f, 0.223755f, 0.812988f, 0.242798f, 0.793945f, + 0.261475f, 0.774902f, 0.280029f, 0.755859f, 0.298340f, 0.737305f, 0.316406f, 0.718750f, + 0.333008f, 0.701172f, 0.351562f, 0.682617f, 0.366699f, 0.666016f, 0.384033f, 0.648438f, + 0.399414f, 0.631348f, 0.414795f, 0.615234f, 0.430420f, 0.598633f, 0.445068f, 0.583008f, + 0.460693f, 0.566895f, 0.474854f, 0.550781f, 0.489014f, 0.535645f, 0.501953f, 0.520996f, + 0.515625f, 0.505859f, 0.528809f, 0.491455f, 0.541992f, 0.477051f, 0.554688f, 0.462891f, + 0.566895f, 0.449219f, 0.580078f, 0.435303f, 0.589844f, 0.422363f, 0.601562f, 0.408691f, + 0.614746f, 0.395264f, 0.625488f, 0.382324f, 0.635742f, 0.370117f, 0.648438f, 0.356689f, + 0.658203f, 0.344727f, 0.669434f, 0.332520f, 0.679688f, 0.320068f, 0.689453f, 0.308350f, + 0.699707f, 0.296387f, 0.708496f, 0.284912f, 0.718262f, 0.273682f, 0.729004f, 0.261719f, + 0.737305f, 0.250977f, 0.747070f, 0.239624f, 0.755371f, 0.229248f, 0.763184f, 0.218506f, + 0.771973f, 0.208252f, 0.779297f, 0.197388f, 0.788574f, 0.186890f, 0.794922f, 0.175415f, + 0.803223f, 0.163696f, 0.809570f, 0.152344f, 0.816406f, 0.139282f, 0.822266f, 0.125366f, + 0.828613f, 0.109253f, 0.832031f, 0.091003f, 0.832520f, 0.065674f, 0.828613f, 0.024155f, + 0.000000f, 1.000000f, 0.024414f, 0.988281f, 0.048126f, 0.971191f, 0.072205f, 0.952637f, + 0.096008f, 0.932617f, 0.118042f, 0.913086f, 0.141113f, 0.892090f, 0.163208f, 0.871582f, + 0.184448f, 0.851562f, 0.204834f, 0.832031f, 0.225708f, 0.811523f, 0.245605f, 0.791992f, + 0.265381f, 0.772461f, 0.283936f, 0.753418f, 0.302246f, 0.734863f, 0.320557f, 0.715820f, + 0.338867f, 0.697754f, 0.354980f, 0.679688f, 0.372803f, 0.661621f, 0.390381f, 0.644043f, + 0.405762f, 0.627441f, 0.421631f, 0.610352f, 0.437500f, 0.593262f, 0.452881f, 0.576660f, + 0.468506f, 0.560547f, 0.481934f, 0.545410f, 0.496582f, 0.529785f, 0.510254f, 0.514160f, + 0.524902f, 0.499023f, 0.538086f, 0.484131f, 0.550781f, 0.469482f, 0.564453f, 0.454834f, + 0.578125f, 0.440430f, 0.592285f, 0.426025f, 0.602539f, 0.412842f, 0.615234f, 0.398926f, + 0.627930f, 0.385254f, 0.640137f, 0.371826f, 0.651855f, 0.358643f, 0.662109f, 0.346436f, + 0.674316f, 0.333008f, 0.684570f, 0.320801f, 0.695312f, 0.308594f, 0.706055f, 0.296143f, + 0.716309f, 0.284180f, 0.726562f, 0.272217f, 0.736816f, 0.260010f, 0.746094f, 0.249023f, + 0.756836f, 0.237305f, 0.766113f, 0.225952f, 0.773926f, 0.214966f, 0.784180f, 0.203613f, + 0.792480f, 0.192871f, 0.801758f, 0.182129f, 0.809082f, 0.171875f, 0.818848f, 0.160767f, + 0.826172f, 0.150269f, 0.833496f, 0.138184f, 0.841797f, 0.125977f, 0.846191f, 0.113586f, + 0.853027f, 0.098511f, 0.858398f, 0.081116f, 0.861328f, 0.058472f, 0.859375f, 0.022568f, + 0.000000f, 1.000000f, 0.024719f, 0.987793f, 0.048187f, 0.971191f, 0.072021f, 0.952637f, + 0.096375f, 0.932617f, 0.119019f, 0.912109f, 0.142334f, 0.891602f, 0.163452f, 0.871582f, + 0.185791f, 0.850586f, 0.207031f, 0.830566f, 0.228638f, 0.810059f, 0.247559f, 0.790527f, + 0.267822f, 0.770508f, 0.288330f, 0.750488f, 0.305420f, 0.732422f, 0.325195f, 0.712891f, + 0.343262f, 0.694336f, 0.361572f, 0.675781f, 0.378174f, 0.658203f, 0.395752f, 0.639648f, + 0.412598f, 0.622070f, 0.428711f, 0.605469f, 0.446289f, 0.587891f, 0.461182f, 0.571289f, + 0.476074f, 0.554688f, 0.490479f, 0.538574f, 0.505859f, 0.522461f, 0.520508f, 0.506836f, + 0.535156f, 0.491455f, 0.548828f, 0.476318f, 0.562500f, 0.461182f, 0.577148f, 0.446289f, + 0.589844f, 0.431641f, 0.603027f, 0.417236f, 0.617188f, 0.402832f, 0.629395f, 0.388916f, + 0.640625f, 0.375732f, 0.652344f, 0.361572f, 0.666504f, 0.347656f, 0.677734f, 0.335205f, + 0.687988f, 0.322266f, 0.700195f, 0.309082f, 0.711914f, 0.296143f, 0.722656f, 0.283936f, + 0.733398f, 0.271484f, 0.743652f, 0.259277f, 0.753418f, 0.247803f, 0.764648f, 0.235107f, + 0.774902f, 0.223633f, 0.783691f, 0.212646f, 0.794922f, 0.200684f, 0.804199f, 0.189453f, + 0.813477f, 0.177979f, 0.822266f, 0.167480f, 0.830078f, 0.156738f, 0.839844f, 0.145874f, + 0.847656f, 0.135620f, 0.856445f, 0.124817f, 0.863770f, 0.112671f, 0.872070f, 0.100769f, + 0.876953f, 0.087585f, 0.883301f, 0.071716f, 0.889648f, 0.052063f, 0.887207f, 0.019165f, + 0.000000f, 1.000000f, 0.024582f, 0.988281f, 0.049316f, 0.970703f, 0.073120f, 0.951660f, + 0.096436f, 0.932129f, 0.119263f, 0.912598f, 0.142822f, 0.891602f, 0.164917f, 0.870605f, + 0.187012f, 0.850098f, 0.209473f, 0.829102f, 0.229736f, 0.809082f, 0.250000f, 0.789062f, + 0.271240f, 0.768066f, 0.289795f, 0.749023f, 0.312012f, 0.728516f, 0.329102f, 0.709961f, + 0.348145f, 0.690918f, 0.365723f, 0.672363f, 0.383545f, 0.653809f, 0.401611f, 0.635742f, + 0.418457f, 0.617676f, 0.435059f, 0.600098f, 0.451660f, 0.583008f, 0.468262f, 0.565430f, + 0.484863f, 0.548340f, 0.500000f, 0.532227f, 0.515625f, 0.515625f, 0.530762f, 0.499756f, + 0.545410f, 0.483887f, 0.560059f, 0.468506f, 0.572754f, 0.453369f, 0.587402f, 0.437988f, + 0.601562f, 0.422852f, 0.614746f, 0.407959f, 0.629883f, 0.393066f, 0.643066f, 0.379150f, + 0.654297f, 0.365234f, 0.666504f, 0.351562f, 0.679688f, 0.337402f, 0.691895f, 0.323975f, + 0.705078f, 0.310303f, 0.715820f, 0.297607f, 0.728516f, 0.284180f, 0.738770f, 0.271729f, + 0.750000f, 0.259277f, 0.759766f, 0.247070f, 0.772461f, 0.234131f, 0.783203f, 0.222046f, + 0.793457f, 0.210449f, 0.803223f, 0.198486f, 0.812500f, 0.187134f, 0.821777f, 0.175903f, + 0.833496f, 0.163818f, 0.842285f, 0.152588f, 0.852539f, 0.141113f, 0.861816f, 0.130127f, + 0.871094f, 0.119629f, 0.878418f, 0.109436f, 0.887695f, 0.098511f, 0.895508f, 0.087219f, + 0.902832f, 0.074646f, 0.909668f, 0.061127f, 0.915527f, 0.043549f, 0.918945f, 0.016251f, + 0.000000f, 1.000000f, 0.024323f, 0.987793f, 0.048218f, 0.971680f, 0.073364f, 0.951660f, + 0.096436f, 0.932129f, 0.120911f, 0.911133f, 0.143921f, 0.890625f, 0.166504f, 0.869629f, + 0.189087f, 0.848633f, 0.210938f, 0.827637f, 0.232788f, 0.806641f, 0.254150f, 0.786133f, + 0.274414f, 0.766113f, 0.293701f, 0.746582f, 0.314209f, 0.726562f, 0.333008f, 0.707031f, + 0.352295f, 0.687500f, 0.370117f, 0.668945f, 0.389893f, 0.649414f, 0.407227f, 0.631348f, + 0.424072f, 0.613281f, 0.442627f, 0.595215f, 0.460693f, 0.577148f, 0.477783f, 0.559570f, + 0.493408f, 0.542480f, 0.509277f, 0.525391f, 0.525879f, 0.508789f, 0.541504f, 0.492188f, + 0.557129f, 0.476074f, 0.570312f, 0.460693f, 0.585449f, 0.444824f, 0.599121f, 0.429443f, + 0.612793f, 0.414307f, 0.627441f, 0.398682f, 0.642090f, 0.383789f, 0.655273f, 0.369141f, + 0.668945f, 0.354736f, 0.681641f, 0.340820f, 0.694336f, 0.326904f, 0.706543f, 0.313232f, + 0.719238f, 0.299561f, 0.731445f, 0.285889f, 0.743652f, 0.272705f, 0.754395f, 0.259521f, + 0.767578f, 0.246338f, 0.778809f, 0.233887f, 0.789551f, 0.221802f, 0.798828f, 0.209717f, + 0.811035f, 0.197021f, 0.823242f, 0.184082f, 0.833008f, 0.173096f, 0.842285f, 0.161499f, + 0.853027f, 0.149536f, 0.862793f, 0.138428f, 0.872559f, 0.127075f, 0.883301f, 0.115662f, + 0.891602f, 0.104858f, 0.899902f, 0.094177f, 0.909180f, 0.083374f, 0.918457f, 0.072998f, + 0.926270f, 0.062805f, 0.934570f, 0.049561f, 0.941406f, 0.035126f, 0.946777f, 0.013084f, + 0.000000f, 1.000000f, 0.022781f, 0.989258f, 0.048920f, 0.970703f, 0.073975f, 0.951172f, + 0.097534f, 0.931641f, 0.120605f, 0.911621f, 0.144531f, 0.890137f, 0.167358f, 0.869141f, + 0.190063f, 0.848145f, 0.212402f, 0.826660f, 0.234375f, 0.805664f, 0.256348f, 0.784668f, + 0.277100f, 0.764160f, 0.298340f, 0.743652f, 0.318359f, 0.723633f, 0.338135f, 0.703613f, + 0.357178f, 0.684082f, 0.376709f, 0.664551f, 0.395752f, 0.645508f, 0.415283f, 0.626465f, + 0.432129f, 0.607910f, 0.449951f, 0.589355f, 0.467773f, 0.571777f, 0.485107f, 0.553711f, + 0.501465f, 0.536133f, 0.518066f, 0.519043f, 0.534180f, 0.501953f, 0.549805f, 0.485352f, + 0.565918f, 0.468750f, 0.581543f, 0.452393f, 0.595703f, 0.436523f, 0.610840f, 0.420410f, + 0.626465f, 0.404785f, 0.641113f, 0.389404f, 0.654297f, 0.374512f, 0.667969f, 0.359619f, + 0.681641f, 0.344971f, 0.696289f, 0.330078f, 0.708984f, 0.315918f, 0.721191f, 0.302002f, + 0.734375f, 0.288086f, 0.747559f, 0.274170f, 0.758789f, 0.261230f, 0.771484f, 0.247559f, + 0.783691f, 0.234253f, 0.794434f, 0.221802f, 0.807617f, 0.208496f, 0.817383f, 0.196533f, + 0.829102f, 0.183838f, 0.840820f, 0.171631f, 0.851074f, 0.159302f, 0.861328f, 0.147705f, + 0.873535f, 0.135254f, 0.882324f, 0.124634f, 0.893066f, 0.112610f, 0.902832f, 0.101196f, + 0.911133f, 0.090698f, 0.921875f, 0.079346f, 0.933105f, 0.067505f, 0.940430f, 0.057343f, + 0.949707f, 0.046661f, 0.958496f, 0.036591f, 0.967285f, 0.025909f, 0.973633f, 0.009155f, + 0.000000f, 1.000000f, 0.023911f, 0.988281f, 0.049011f, 0.971191f, 0.074768f, 0.950684f, + 0.097229f, 0.932129f, 0.122131f, 0.910645f, 0.145508f, 0.889648f, 0.168213f, 0.868652f, + 0.191650f, 0.847168f, 0.214478f, 0.825684f, 0.236694f, 0.804199f, 0.258789f, 0.783203f, + 0.280518f, 0.762207f, 0.300781f, 0.741699f, 0.321533f, 0.721191f, 0.342529f, 0.700684f, + 0.361572f, 0.680664f, 0.380859f, 0.661621f, 0.401123f, 0.641602f, 0.420898f, 0.622070f, + 0.438477f, 0.603027f, 0.456543f, 0.584473f, 0.474365f, 0.566406f, 0.491699f, 0.548340f, + 0.509277f, 0.530273f, 0.526855f, 0.512207f, 0.543457f, 0.495117f, 0.559570f, 0.478027f, + 0.575684f, 0.461182f, 0.591797f, 0.444336f, 0.607422f, 0.427979f, 0.623047f, 0.411621f, + 0.638672f, 0.395752f, 0.653320f, 0.380371f, 0.667480f, 0.364990f, 0.681152f, 0.349854f, + 0.695312f, 0.334961f, 0.708496f, 0.320312f, 0.721191f, 0.305664f, 0.736328f, 0.290771f, + 0.750488f, 0.276367f, 0.763184f, 0.262939f, 0.774414f, 0.249878f, 0.786133f, 0.235962f, + 0.799805f, 0.221924f, 0.813965f, 0.208618f, 0.822754f, 0.197144f, 0.834473f, 0.183716f, + 0.847656f, 0.170288f, 0.860352f, 0.158081f, 0.868164f, 0.146606f, 0.880859f, 0.133667f, + 0.892578f, 0.121765f, 0.901367f, 0.110657f, 0.912598f, 0.098450f, 0.922363f, 0.087585f, + 0.933105f, 0.075806f, 0.942871f, 0.064697f, 0.952637f, 0.053192f, 0.963379f, 0.042450f, + 0.968262f, 0.033875f, 0.983887f, 0.018707f, 0.988281f, 0.013397f, 0.999512f, 0.000030f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.999023f, 0.000000f, 0.998047f, + 0.000000f, 0.996582f, 0.000000f, 0.994629f, 0.000000f, 0.992188f, 0.000000f, 0.990723f, + 0.000000f, 0.988281f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979980f, + 0.000000f, 0.977051f, 0.000000f, 0.973145f, 0.000000f, 0.969727f, 0.000000f, 0.965332f, + 0.000000f, 0.961426f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.947266f, + 0.000000f, 0.941895f, 0.000000f, 0.936523f, 0.000000f, 0.931152f, 0.000000f, 0.925293f, + 0.000000f, 0.918945f, 0.000000f, 0.912109f, 0.000000f, 0.905762f, 0.000000f, 0.898926f, + 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875977f, 0.000000f, 0.867676f, + 0.000000f, 0.859375f, 0.000000f, 0.850098f, 0.000000f, 0.841309f, 0.000000f, 0.831543f, + 0.000000f, 0.821289f, 0.000000f, 0.810059f, 0.000000f, 0.799316f, 0.000000f, 0.787598f, + 0.000000f, 0.775879f, 0.000000f, 0.764160f, 0.000000f, 0.750488f, 0.000000f, 0.736816f, + 0.000000f, 0.722656f, 0.000000f, 0.707520f, 0.000000f, 0.691895f, 0.000000f, 0.675781f, + 0.000000f, 0.658203f, 0.000000f, 0.639160f, 0.000000f, 0.620117f, 0.000000f, 0.599609f, + 0.000000f, 0.578613f, 0.000000f, 0.554199f, 0.000000f, 0.528809f, 0.000000f, 0.502441f, + 0.000000f, 0.474121f, 0.000000f, 0.441162f, 0.000000f, 0.404785f, 0.000000f, 0.365234f, + 0.000000f, 0.317871f, 0.000000f, 0.261230f, 0.000000f, 0.186401f, 0.000000f, 0.073303f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.996582f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.991211f, + 0.000000f, 0.988770f, 0.000000f, 0.985840f, 0.000000f, 0.982910f, 0.000000f, 0.979492f, + 0.000000f, 0.976562f, 0.000000f, 0.972656f, 0.000000f, 0.968750f, 0.000000f, 0.964844f, + 0.000000f, 0.960938f, 0.000000f, 0.957031f, 0.000000f, 0.952148f, 0.000000f, 0.946777f, + 0.000000f, 0.941895f, 0.000000f, 0.936035f, 0.000000f, 0.930664f, 0.000000f, 0.925293f, + 0.000000f, 0.918457f, 0.000000f, 0.912109f, 0.000000f, 0.905273f, 0.000000f, 0.898438f, + 0.000000f, 0.891602f, 0.000000f, 0.884277f, 0.000000f, 0.875488f, 0.000000f, 0.867188f, + 0.000000f, 0.858398f, 0.000000f, 0.849609f, 0.000000f, 0.840820f, 0.000000f, 0.831055f, + 0.000000f, 0.820801f, 0.000000f, 0.810059f, 0.000000f, 0.798828f, 0.000000f, 0.787598f, + 0.000000f, 0.775879f, 0.000000f, 0.763672f, 0.000000f, 0.750488f, 0.000000f, 0.736816f, + 0.000002f, 0.722168f, 0.000004f, 0.707031f, 0.000006f, 0.691895f, 0.000009f, 0.675781f, + 0.000011f, 0.658203f, 0.000012f, 0.639648f, 0.000012f, 0.620117f, 0.000011f, 0.599609f, + 0.000010f, 0.578613f, 0.000010f, 0.554199f, 0.000009f, 0.528809f, 0.000008f, 0.502441f, + 0.000007f, 0.474854f, 0.000008f, 0.440918f, 0.000006f, 0.404541f, 0.000006f, 0.366455f, + 0.000005f, 0.318359f, 0.000004f, 0.260986f, 0.000003f, 0.187012f, 0.000001f, 0.073303f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997559f, + 0.000000f, 0.995605f, 0.000000f, 0.994141f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, + 0.000000f, 0.988281f, 0.000000f, 0.985352f, 0.000000f, 0.982422f, 0.000000f, 0.979492f, + 0.000000f, 0.976074f, 0.000002f, 0.972656f, 0.000008f, 0.968750f, 0.000013f, 0.964844f, + 0.000019f, 0.960449f, 0.000026f, 0.956055f, 0.000032f, 0.951172f, 0.000040f, 0.946289f, + 0.000046f, 0.941406f, 0.000052f, 0.935547f, 0.000059f, 0.930176f, 0.000066f, 0.924316f, + 0.000073f, 0.918457f, 0.000078f, 0.911621f, 0.000085f, 0.904785f, 0.000091f, 0.897949f, + 0.000098f, 0.891113f, 0.000103f, 0.883301f, 0.000108f, 0.875488f, 0.000111f, 0.866699f, + 0.000111f, 0.858398f, 0.000110f, 0.849609f, 0.000107f, 0.840332f, 0.000103f, 0.831055f, + 0.000101f, 0.820312f, 0.000097f, 0.809570f, 0.000093f, 0.798340f, 0.000091f, 0.787109f, + 0.000090f, 0.775879f, 0.000091f, 0.763672f, 0.000090f, 0.750000f, 0.000091f, 0.736328f, + 0.000092f, 0.721680f, 0.000092f, 0.707031f, 0.000090f, 0.691895f, 0.000084f, 0.675293f, + 0.000082f, 0.657227f, 0.000081f, 0.639160f, 0.000082f, 0.619629f, 0.000080f, 0.599609f, + 0.000072f, 0.578613f, 0.000071f, 0.553711f, 0.000067f, 0.528809f, 0.000068f, 0.501953f, + 0.000064f, 0.474365f, 0.000054f, 0.440674f, 0.000052f, 0.404541f, 0.000049f, 0.365967f, + 0.000036f, 0.318604f, 0.000032f, 0.260742f, 0.000020f, 0.186768f, 0.000005f, 0.073242f, + 0.000000f, 1.000000f, 0.000043f, 0.999512f, 0.000081f, 0.998535f, 0.000108f, 0.997070f, + 0.000124f, 0.995605f, 0.000155f, 0.993652f, 0.000170f, 0.991699f, 0.000178f, 0.989746f, + 0.000201f, 0.987305f, 0.000216f, 0.984375f, 0.000226f, 0.981445f, 0.000232f, 0.979004f, + 0.000245f, 0.975586f, 0.000261f, 0.972168f, 0.000270f, 0.967773f, 0.000276f, 0.963867f, + 0.000280f, 0.959961f, 0.000290f, 0.955078f, 0.000303f, 0.950195f, 0.000311f, 0.945312f, + 0.000319f, 0.940430f, 0.000324f, 0.935059f, 0.000323f, 0.929688f, 0.000330f, 0.923340f, + 0.000333f, 0.916992f, 0.000335f, 0.910645f, 0.000334f, 0.903809f, 0.000332f, 0.896973f, + 0.000332f, 0.890137f, 0.000340f, 0.882324f, 0.000335f, 0.874023f, 0.000337f, 0.865723f, + 0.000339f, 0.856934f, 0.000343f, 0.848145f, 0.000347f, 0.839355f, 0.000354f, 0.830078f, + 0.000346f, 0.819336f, 0.000346f, 0.808594f, 0.000344f, 0.797363f, 0.000340f, 0.786133f, + 0.000340f, 0.774902f, 0.000347f, 0.762695f, 0.000331f, 0.749023f, 0.000326f, 0.734863f, + 0.000325f, 0.721191f, 0.000322f, 0.706055f, 0.000317f, 0.691406f, 0.000297f, 0.674805f, + 0.000297f, 0.656738f, 0.000291f, 0.638672f, 0.000285f, 0.619141f, 0.000276f, 0.599609f, + 0.000257f, 0.577637f, 0.000249f, 0.553711f, 0.000239f, 0.528320f, 0.000229f, 0.501953f, + 0.000222f, 0.474121f, 0.000192f, 0.440430f, 0.000177f, 0.404541f, 0.000162f, 0.366211f, + 0.000131f, 0.317627f, 0.000109f, 0.260498f, 0.000069f, 0.186401f, 0.000016f, 0.072571f, + 0.000000f, 1.000000f, 0.000240f, 0.999023f, 0.000381f, 0.998047f, 0.000352f, 0.997070f, + 0.000453f, 0.995117f, 0.000445f, 0.993164f, 0.000432f, 0.991211f, 0.000427f, 0.989258f, + 0.000529f, 0.986328f, 0.000539f, 0.983398f, 0.000548f, 0.980469f, 0.000558f, 0.977539f, + 0.000641f, 0.974121f, 0.000657f, 0.970215f, 0.000670f, 0.966309f, 0.000674f, 0.962891f, + 0.000666f, 0.958496f, 0.000720f, 0.953613f, 0.000724f, 0.948730f, 0.000719f, 0.943848f, + 0.000719f, 0.938965f, 0.000719f, 0.933594f, 0.000724f, 0.928223f, 0.000784f, 0.921875f, + 0.000794f, 0.915527f, 0.000779f, 0.909180f, 0.000781f, 0.902344f, 0.000791f, 0.895508f, + 0.000794f, 0.888672f, 0.000840f, 0.880859f, 0.000815f, 0.872559f, 0.000814f, 0.864258f, + 0.000812f, 0.855957f, 0.000812f, 0.847168f, 0.000815f, 0.838379f, 0.000852f, 0.828613f, + 0.000819f, 0.817871f, 0.000807f, 0.807617f, 0.000807f, 0.796875f, 0.000807f, 0.785645f, + 0.000801f, 0.773926f, 0.000828f, 0.761230f, 0.000789f, 0.748047f, 0.000767f, 0.734375f, + 0.000766f, 0.720215f, 0.000756f, 0.705566f, 0.000741f, 0.690918f, 0.000760f, 0.673828f, + 0.000701f, 0.656250f, 0.000685f, 0.637695f, 0.000669f, 0.618652f, 0.000653f, 0.599121f, + 0.000625f, 0.577148f, 0.000587f, 0.553223f, 0.000565f, 0.527832f, 0.000539f, 0.501465f, + 0.000528f, 0.473877f, 0.000452f, 0.439697f, 0.000420f, 0.403809f, 0.000381f, 0.365967f, + 0.000308f, 0.317871f, 0.000253f, 0.260742f, 0.000157f, 0.186401f, 0.000031f, 0.072388f, + 0.000000f, 1.000000f, 0.000383f, 0.999023f, 0.000658f, 0.997559f, 0.000662f, 0.996094f, + 0.000860f, 0.994629f, 0.000876f, 0.992188f, 0.000875f, 0.990234f, 0.000867f, 0.988770f, + 0.001044f, 0.984863f, 0.001068f, 0.982422f, 0.001084f, 0.979492f, 0.001096f, 0.976562f, + 0.001233f, 0.972656f, 0.001249f, 0.969238f, 0.001255f, 0.965332f, 0.001245f, 0.961426f, + 0.001245f, 0.957520f, 0.001364f, 0.952148f, 0.001392f, 0.947266f, 0.001414f, 0.942383f, + 0.001401f, 0.937012f, 0.001410f, 0.932129f, 0.001413f, 0.926758f, 0.001525f, 0.919922f, + 0.001539f, 0.913574f, 0.001513f, 0.907227f, 0.001514f, 0.900879f, 0.001509f, 0.894043f, + 0.001519f, 0.887207f, 0.001614f, 0.878906f, 0.001627f, 0.871094f, 0.001584f, 0.862793f, + 0.001567f, 0.854004f, 0.001572f, 0.845703f, 0.001568f, 0.836914f, 0.001637f, 0.826660f, + 0.001644f, 0.816895f, 0.001596f, 0.806152f, 0.001570f, 0.794922f, 0.001554f, 0.784180f, + 0.001540f, 0.772949f, 0.001595f, 0.760254f, 0.001542f, 0.746582f, 0.001506f, 0.733398f, + 0.001476f, 0.719238f, 0.001456f, 0.704590f, 0.001433f, 0.689941f, 0.001471f, 0.672852f, + 0.001373f, 0.655273f, 0.001327f, 0.636719f, 0.001291f, 0.618164f, 0.001261f, 0.598633f, + 0.001273f, 0.576660f, 0.001151f, 0.552734f, 0.001091f, 0.527344f, 0.001044f, 0.501465f, + 0.001024f, 0.473145f, 0.000885f, 0.439453f, 0.000810f, 0.404053f, 0.000731f, 0.365967f, + 0.000594f, 0.317139f, 0.000479f, 0.260986f, 0.000290f, 0.185913f, 0.000055f, 0.072205f, + 0.000000f, 1.000000f, 0.000665f, 0.998535f, 0.001108f, 0.997070f, 0.001078f, 0.995605f, + 0.001183f, 0.993652f, 0.001465f, 0.991699f, 0.001467f, 0.989746f, 0.001527f, 0.987305f, + 0.001788f, 0.983887f, 0.001810f, 0.980469f, 0.001819f, 0.978027f, 0.001825f, 0.975098f, + 0.002068f, 0.970703f, 0.002083f, 0.966797f, 0.002113f, 0.963379f, 0.002136f, 0.959473f, + 0.002121f, 0.955566f, 0.002344f, 0.950195f, 0.002380f, 0.944824f, 0.002407f, 0.940430f, + 0.002377f, 0.935059f, 0.002382f, 0.929688f, 0.002417f, 0.924316f, 0.002584f, 0.917969f, + 0.002621f, 0.911621f, 0.002634f, 0.905273f, 0.002584f, 0.898926f, 0.002573f, 0.892090f, + 0.002617f, 0.885254f, 0.002737f, 0.876953f, 0.002756f, 0.869141f, 0.002714f, 0.860352f, + 0.002716f, 0.852539f, 0.002682f, 0.843750f, 0.002665f, 0.835449f, 0.002785f, 0.824707f, + 0.002800f, 0.814453f, 0.002737f, 0.803711f, 0.002689f, 0.792969f, 0.002657f, 0.782715f, + 0.002623f, 0.771484f, 0.002718f, 0.758301f, 0.002647f, 0.745117f, 0.002590f, 0.731445f, + 0.002539f, 0.717773f, 0.002491f, 0.703613f, 0.002455f, 0.688477f, 0.002506f, 0.671387f, + 0.002419f, 0.653809f, 0.002304f, 0.635742f, 0.002209f, 0.617188f, 0.002146f, 0.597656f, + 0.002169f, 0.575195f, 0.002022f, 0.551758f, 0.001869f, 0.527344f, 0.001777f, 0.501465f, + 0.001743f, 0.472412f, 0.001549f, 0.439209f, 0.001372f, 0.403809f, 0.001231f, 0.366211f, + 0.001015f, 0.317627f, 0.000793f, 0.261230f, 0.000472f, 0.185547f, 0.000089f, 0.071411f, + 0.000000f, 1.000000f, 0.000511f, 0.998535f, 0.001285f, 0.997070f, 0.001654f, 0.995117f, + 0.001899f, 0.992676f, 0.002253f, 0.990234f, 0.002249f, 0.988281f, 0.002424f, 0.985352f, + 0.002768f, 0.982422f, 0.002787f, 0.979492f, 0.002794f, 0.976562f, 0.002808f, 0.974121f, + 0.003235f, 0.968750f, 0.003250f, 0.964844f, 0.003298f, 0.960938f, 0.003326f, 0.957031f, + 0.003334f, 0.953125f, 0.003654f, 0.947754f, 0.003704f, 0.942871f, 0.003731f, 0.937988f, + 0.003765f, 0.933105f, 0.003729f, 0.927734f, 0.003851f, 0.921875f, 0.004032f, 0.915039f, + 0.004082f, 0.909180f, 0.004101f, 0.902832f, 0.004047f, 0.895996f, 0.004066f, 0.889648f, + 0.004128f, 0.882324f, 0.004284f, 0.874023f, 0.004318f, 0.866211f, 0.004318f, 0.857910f, + 0.004253f, 0.849609f, 0.004208f, 0.841797f, 0.004238f, 0.832520f, 0.004372f, 0.822266f, + 0.004372f, 0.812500f, 0.004295f, 0.801758f, 0.004227f, 0.791016f, 0.004211f, 0.780762f, + 0.004169f, 0.769043f, 0.004265f, 0.755859f, 0.004242f, 0.743164f, 0.004139f, 0.729492f, + 0.004044f, 0.716309f, 0.003922f, 0.702148f, 0.003960f, 0.686523f, 0.003929f, 0.669922f, + 0.003799f, 0.652344f, 0.003635f, 0.634766f, 0.003494f, 0.616211f, 0.003368f, 0.597168f, + 0.003389f, 0.574219f, 0.003183f, 0.550293f, 0.002970f, 0.525879f, 0.002785f, 0.500977f, + 0.002716f, 0.471680f, 0.002438f, 0.438965f, 0.002150f, 0.403564f, 0.001896f, 0.366211f, + 0.001602f, 0.316895f, 0.001202f, 0.261475f, 0.000722f, 0.185059f, 0.000137f, 0.071045f, + 0.000000f, 1.000000f, 0.000868f, 0.998535f, 0.001947f, 0.996094f, 0.002363f, 0.994629f, + 0.002825f, 0.991211f, 0.003231f, 0.988770f, 0.003258f, 0.986816f, 0.003414f, 0.984375f, + 0.003702f, 0.980469f, 0.004047f, 0.977051f, 0.004097f, 0.974609f, 0.004158f, 0.971191f, + 0.004467f, 0.966797f, 0.004810f, 0.962891f, 0.004799f, 0.958496f, 0.004841f, 0.955078f, + 0.004944f, 0.950684f, 0.005356f, 0.944824f, 0.005440f, 0.939941f, 0.005493f, 0.935059f, + 0.005497f, 0.930176f, 0.005550f, 0.925293f, 0.005707f, 0.918457f, 0.005974f, 0.912109f, + 0.005993f, 0.905762f, 0.006039f, 0.899902f, 0.006046f, 0.893555f, 0.005966f, 0.887207f, + 0.006180f, 0.879395f, 0.006344f, 0.871094f, 0.006348f, 0.863281f, 0.006348f, 0.855469f, + 0.006279f, 0.847168f, 0.006264f, 0.839355f, 0.006348f, 0.829590f, 0.006474f, 0.819336f, + 0.006462f, 0.809570f, 0.006344f, 0.799316f, 0.006317f, 0.789062f, 0.006210f, 0.778320f, + 0.006241f, 0.766602f, 0.006332f, 0.753418f, 0.006252f, 0.740723f, 0.006111f, 0.727051f, + 0.005966f, 0.714355f, 0.005840f, 0.700684f, 0.005886f, 0.684570f, 0.005795f, 0.667969f, + 0.005604f, 0.650879f, 0.005424f, 0.633301f, 0.005203f, 0.614746f, 0.005043f, 0.595215f, + 0.005001f, 0.572754f, 0.004692f, 0.549805f, 0.004417f, 0.525391f, 0.004093f, 0.500000f, + 0.003971f, 0.470459f, 0.003572f, 0.438232f, 0.003149f, 0.403320f, 0.002739f, 0.366699f, + 0.002323f, 0.316162f, 0.001709f, 0.261475f, 0.001044f, 0.185669f, 0.000188f, 0.070312f, + 0.000000f, 1.000000f, 0.001301f, 0.998535f, 0.001880f, 0.996094f, 0.002771f, 0.993652f, + 0.003651f, 0.990234f, 0.004047f, 0.987793f, 0.004498f, 0.985352f, 0.004833f, 0.981934f, + 0.005249f, 0.978516f, 0.005646f, 0.975098f, 0.005669f, 0.972168f, 0.005970f, 0.968262f, + 0.006287f, 0.963867f, 0.006695f, 0.959473f, 0.006775f, 0.956055f, 0.006760f, 0.951660f, + 0.007030f, 0.947266f, 0.007313f, 0.941895f, 0.007607f, 0.936523f, 0.007675f, 0.931641f, + 0.007744f, 0.926758f, 0.007744f, 0.922363f, 0.008095f, 0.915527f, 0.008392f, 0.908691f, + 0.008453f, 0.902832f, 0.008469f, 0.896484f, 0.008507f, 0.890625f, 0.008392f, 0.884277f, + 0.008728f, 0.875488f, 0.008919f, 0.867676f, 0.008980f, 0.859863f, 0.008949f, 0.852051f, + 0.008820f, 0.844238f, 0.008789f, 0.836426f, 0.008965f, 0.826172f, 0.009178f, 0.816406f, + 0.009132f, 0.806152f, 0.009079f, 0.796387f, 0.008911f, 0.786133f, 0.008759f, 0.776367f, + 0.008827f, 0.763672f, 0.008911f, 0.750488f, 0.008835f, 0.738281f, 0.008629f, 0.725098f, + 0.008408f, 0.712402f, 0.008224f, 0.698730f, 0.008354f, 0.682617f, 0.008179f, 0.666016f, + 0.007904f, 0.648926f, 0.007645f, 0.631348f, 0.007317f, 0.613770f, 0.007168f, 0.593750f, + 0.007042f, 0.571289f, 0.006683f, 0.548828f, 0.006203f, 0.524902f, 0.005756f, 0.500000f, + 0.005562f, 0.469727f, 0.005039f, 0.437256f, 0.004406f, 0.403320f, 0.003811f, 0.366211f, + 0.003242f, 0.316406f, 0.002337f, 0.261475f, 0.001417f, 0.185059f, 0.000250f, 0.069946f, + 0.000000f, 1.000000f, 0.001305f, 0.998535f, 0.002796f, 0.995605f, 0.003759f, 0.993164f, + 0.004532f, 0.989258f, 0.005486f, 0.986328f, 0.005547f, 0.983887f, 0.006359f, 0.979492f, + 0.007092f, 0.976074f, 0.007229f, 0.973145f, 0.007645f, 0.969727f, 0.007950f, 0.965332f, + 0.008621f, 0.960449f, 0.009010f, 0.956543f, 0.009109f, 0.952637f, 0.009224f, 0.949219f, + 0.009575f, 0.943359f, 0.010010f, 0.938477f, 0.010345f, 0.933105f, 0.010384f, 0.928223f, + 0.010475f, 0.923340f, 0.010666f, 0.918457f, 0.011108f, 0.911133f, 0.011414f, 0.904785f, + 0.011459f, 0.898926f, 0.011513f, 0.893066f, 0.011513f, 0.886719f, 0.011612f, 0.879883f, + 0.011932f, 0.871582f, 0.012199f, 0.863770f, 0.012169f, 0.856445f, 0.012184f, 0.848633f, + 0.012146f, 0.841309f, 0.011993f, 0.833008f, 0.012367f, 0.822754f, 0.012474f, 0.812988f, + 0.012390f, 0.803223f, 0.012299f, 0.792969f, 0.012085f, 0.783203f, 0.011978f, 0.773438f, + 0.012169f, 0.760742f, 0.012199f, 0.747559f, 0.012032f, 0.735352f, 0.011703f, 0.722656f, + 0.011536f, 0.709961f, 0.011276f, 0.697266f, 0.011368f, 0.679688f, 0.011154f, 0.663574f, + 0.010765f, 0.646973f, 0.010376f, 0.629883f, 0.010002f, 0.612793f, 0.009781f, 0.592285f, + 0.009514f, 0.569824f, 0.009041f, 0.547363f, 0.008453f, 0.524414f, 0.007805f, 0.499756f, + 0.007500f, 0.468506f, 0.006767f, 0.436523f, 0.005943f, 0.402588f, 0.005157f, 0.365234f, + 0.004299f, 0.315430f, 0.003090f, 0.261719f, 0.001874f, 0.184937f, 0.000340f, 0.069336f, + 0.000000f, 1.000000f, 0.001388f, 0.998047f, 0.002949f, 0.995117f, 0.003960f, 0.992676f, + 0.005760f, 0.987793f, 0.006760f, 0.984863f, 0.007267f, 0.981934f, 0.008400f, 0.977539f, + 0.008934f, 0.973633f, 0.009468f, 0.970215f, 0.009995f, 0.967285f, 0.010574f, 0.962402f, + 0.011307f, 0.957031f, 0.011543f, 0.953613f, 0.011986f, 0.949219f, 0.012039f, 0.945312f, + 0.012878f, 0.939941f, 0.013222f, 0.934082f, 0.013702f, 0.929688f, 0.013824f, 0.924805f, + 0.013779f, 0.919922f, 0.014191f, 0.913574f, 0.014801f, 0.907227f, 0.014854f, 0.900879f, + 0.015144f, 0.894531f, 0.015190f, 0.888672f, 0.015099f, 0.882812f, 0.015526f, 0.875488f, + 0.015915f, 0.867676f, 0.016144f, 0.859863f, 0.016144f, 0.852539f, 0.016068f, 0.844727f, + 0.015961f, 0.837402f, 0.016113f, 0.828613f, 0.016434f, 0.818359f, 0.016525f, 0.808594f, + 0.016479f, 0.799316f, 0.016281f, 0.790039f, 0.016129f, 0.780273f, 0.016037f, 0.769531f, + 0.016159f, 0.756836f, 0.016113f, 0.744629f, 0.015869f, 0.732422f, 0.015640f, 0.720215f, + 0.015244f, 0.707520f, 0.014992f, 0.693359f, 0.015114f, 0.676758f, 0.014694f, 0.660645f, + 0.014343f, 0.645020f, 0.013794f, 0.628418f, 0.013161f, 0.611328f, 0.012917f, 0.589355f, + 0.012550f, 0.567871f, 0.011826f, 0.545410f, 0.011040f, 0.522949f, 0.010208f, 0.499268f, + 0.009827f, 0.467041f, 0.008827f, 0.436035f, 0.007713f, 0.402832f, 0.006733f, 0.363525f, + 0.005547f, 0.315430f, 0.003967f, 0.261475f, 0.002380f, 0.184937f, 0.000430f, 0.068237f, + 0.000000f, 1.000000f, 0.001554f, 0.998047f, 0.003771f, 0.994141f, 0.005260f, 0.991211f, + 0.006737f, 0.986816f, 0.008194f, 0.983398f, 0.009239f, 0.979980f, 0.010109f, 0.975586f, + 0.011467f, 0.970703f, 0.012070f, 0.967285f, 0.012260f, 0.964355f, 0.013695f, 0.958984f, + 0.014343f, 0.954102f, 0.014755f, 0.949707f, 0.014999f, 0.945801f, 0.015686f, 0.941406f, + 0.016403f, 0.935059f, 0.017197f, 0.930176f, 0.017258f, 0.925293f, 0.017776f, 0.920410f, + 0.017960f, 0.916016f, 0.018463f, 0.908691f, 0.018951f, 0.902344f, 0.019348f, 0.896484f, + 0.019699f, 0.890137f, 0.019699f, 0.884766f, 0.019653f, 0.878906f, 0.020340f, 0.870117f, + 0.020752f, 0.862793f, 0.020828f, 0.854980f, 0.020935f, 0.847656f, 0.020737f, 0.840820f, + 0.020737f, 0.833496f, 0.021194f, 0.823242f, 0.021225f, 0.813965f, 0.021484f, 0.804688f, + 0.021271f, 0.795410f, 0.021011f, 0.786133f, 0.020889f, 0.776855f, 0.020905f, 0.765137f, + 0.021057f, 0.752930f, 0.020874f, 0.741211f, 0.020584f, 0.729004f, 0.020233f, 0.717773f, + 0.019592f, 0.705078f, 0.019577f, 0.689941f, 0.019516f, 0.673828f, 0.019012f, 0.658203f, + 0.018417f, 0.642578f, 0.017761f, 0.626953f, 0.016922f, 0.609375f, 0.016739f, 0.587402f, + 0.016174f, 0.565918f, 0.015182f, 0.543945f, 0.014122f, 0.522461f, 0.013283f, 0.497070f, + 0.012520f, 0.465820f, 0.011261f, 0.435303f, 0.009857f, 0.403076f, 0.008575f, 0.362793f, + 0.007057f, 0.315186f, 0.004986f, 0.262207f, 0.002995f, 0.185425f, 0.000528f, 0.067444f, + 0.000000f, 1.000000f, 0.002249f, 0.997559f, 0.004627f, 0.993652f, 0.005775f, 0.991211f, + 0.008293f, 0.985840f, 0.009468f, 0.981934f, 0.010590f, 0.979004f, 0.012863f, 0.972656f, + 0.013573f, 0.968262f, 0.014664f, 0.964844f, 0.015450f, 0.960449f, 0.016556f, 0.955078f, + 0.017975f, 0.950195f, 0.018661f, 0.946289f, 0.018860f, 0.942383f, 0.019928f, 0.936523f, + 0.020767f, 0.930664f, 0.021362f, 0.925781f, 0.021942f, 0.920410f, 0.022369f, 0.916016f, + 0.022751f, 0.910156f, 0.023743f, 0.903809f, 0.024002f, 0.896973f, 0.024597f, 0.891602f, + 0.025009f, 0.885742f, 0.024994f, 0.880371f, 0.025375f, 0.873047f, 0.026062f, 0.865234f, + 0.026337f, 0.857422f, 0.026459f, 0.850586f, 0.026566f, 0.843262f, 0.026550f, 0.836426f, + 0.026581f, 0.828125f, 0.027206f, 0.818359f, 0.027161f, 0.809082f, 0.027283f, 0.799805f, + 0.026978f, 0.791504f, 0.026810f, 0.782715f, 0.026505f, 0.773438f, 0.026749f, 0.760742f, + 0.026764f, 0.748535f, 0.026611f, 0.737305f, 0.026108f, 0.725586f, 0.025650f, 0.714844f, + 0.024933f, 0.702637f, 0.025146f, 0.686523f, 0.024811f, 0.670898f, 0.024063f, 0.655273f, + 0.023361f, 0.640625f, 0.022400f, 0.625000f, 0.021805f, 0.605957f, 0.021347f, 0.584961f, + 0.020370f, 0.563965f, 0.019135f, 0.542969f, 0.017868f, 0.521484f, 0.016830f, 0.494385f, + 0.015762f, 0.464844f, 0.014183f, 0.434326f, 0.012291f, 0.402588f, 0.010735f, 0.361084f, + 0.008743f, 0.314697f, 0.006134f, 0.262451f, 0.003664f, 0.184448f, 0.000638f, 0.066772f, + 0.000000f, 1.000000f, 0.002054f, 0.998047f, 0.005222f, 0.993164f, 0.006458f, 0.990723f, + 0.009277f, 0.984863f, 0.011032f, 0.980469f, 0.012871f, 0.976074f, 0.014778f, 0.970215f, + 0.016830f, 0.965332f, 0.017563f, 0.961914f, 0.019226f, 0.956543f, 0.020554f, 0.951172f, + 0.021362f, 0.946289f, 0.022537f, 0.941895f, 0.023254f, 0.937988f, 0.024429f, 0.931641f, + 0.025772f, 0.925781f, 0.026566f, 0.920410f, 0.027069f, 0.916016f, 0.027344f, 0.911621f, + 0.028687f, 0.904297f, 0.029526f, 0.897461f, 0.030212f, 0.892090f, 0.030380f, 0.885742f, + 0.030716f, 0.880859f, 0.031097f, 0.875488f, 0.031891f, 0.866699f, 0.032410f, 0.859375f, + 0.032959f, 0.852051f, 0.032928f, 0.845215f, 0.033264f, 0.838867f, 0.033051f, 0.832031f, + 0.033630f, 0.822266f, 0.033997f, 0.812500f, 0.034210f, 0.804199f, 0.034180f, 0.795410f, + 0.033936f, 0.787109f, 0.033417f, 0.778809f, 0.033661f, 0.767578f, 0.033844f, 0.755859f, + 0.033630f, 0.744629f, 0.033234f, 0.733398f, 0.032776f, 0.722168f, 0.032074f, 0.711426f, + 0.031616f, 0.697266f, 0.031464f, 0.682129f, 0.031067f, 0.667480f, 0.030090f, 0.652832f, + 0.029144f, 0.638184f, 0.027969f, 0.623047f, 0.027359f, 0.603027f, 0.026703f, 0.582520f, + 0.025375f, 0.562500f, 0.023758f, 0.541504f, 0.022186f, 0.520508f, 0.021103f, 0.492920f, + 0.019562f, 0.463379f, 0.017548f, 0.434082f, 0.015221f, 0.402344f, 0.013191f, 0.360596f, + 0.010681f, 0.314209f, 0.007496f, 0.263184f, 0.004452f, 0.183594f, 0.000767f, 0.065796f, + 0.000000f, 1.000000f, 0.002428f, 0.997559f, 0.005573f, 0.993164f, 0.008026f, 0.989258f, + 0.010979f, 0.983398f, 0.013222f, 0.979004f, 0.015213f, 0.973633f, 0.017471f, 0.967773f, + 0.019196f, 0.963379f, 0.020935f, 0.958984f, 0.022690f, 0.952637f, 0.024796f, 0.946777f, + 0.026001f, 0.941895f, 0.027252f, 0.937500f, 0.028152f, 0.932617f, 0.029953f, 0.926270f, + 0.030746f, 0.920898f, 0.032166f, 0.915527f, 0.032654f, 0.911133f, 0.033539f, 0.905273f, + 0.034729f, 0.898438f, 0.036102f, 0.891602f, 0.036713f, 0.885742f, 0.037415f, 0.880859f, + 0.037323f, 0.875488f, 0.038544f, 0.868164f, 0.039368f, 0.860352f, 0.039795f, 0.853516f, + 0.040222f, 0.846680f, 0.040436f, 0.839844f, 0.040680f, 0.833984f, 0.041046f, 0.825195f, + 0.041534f, 0.815918f, 0.041901f, 0.807129f, 0.042023f, 0.798828f, 0.041504f, 0.791016f, + 0.041595f, 0.782227f, 0.041443f, 0.773438f, 0.041718f, 0.761719f, 0.041656f, 0.750488f, + 0.041321f, 0.739746f, 0.040985f, 0.729492f, 0.040100f, 0.718750f, 0.039337f, 0.708496f, + 0.039307f, 0.692871f, 0.038727f, 0.678223f, 0.038208f, 0.664062f, 0.036987f, 0.650391f, + 0.035736f, 0.635742f, 0.034393f, 0.620117f, 0.033875f, 0.599609f, 0.032745f, 0.580078f, + 0.031097f, 0.560547f, 0.029327f, 0.540527f, 0.027054f, 0.520508f, 0.025848f, 0.490234f, + 0.023834f, 0.461670f, 0.021332f, 0.433350f, 0.018372f, 0.402344f, 0.016144f, 0.359131f, + 0.012894f, 0.313721f, 0.009102f, 0.264160f, 0.005341f, 0.182739f, 0.000927f, 0.064758f, + 0.000000f, 1.000000f, 0.002878f, 0.997559f, 0.006504f, 0.992676f, 0.009315f, 0.987793f, + 0.012947f, 0.981934f, 0.015312f, 0.977539f, 0.017731f, 0.971191f, 0.020447f, 0.965332f, + 0.022369f, 0.960449f, 0.023743f, 0.956543f, 0.027145f, 0.948242f, 0.028946f, 0.942383f, + 0.030807f, 0.937500f, 0.031708f, 0.933594f, 0.034027f, 0.926270f, 0.035736f, 0.920410f, + 0.037018f, 0.915039f, 0.037964f, 0.910645f, 0.038910f, 0.905762f, 0.040680f, 0.898438f, + 0.041992f, 0.891602f, 0.043213f, 0.885742f, 0.043793f, 0.880371f, 0.044373f, 0.875000f, + 0.045227f, 0.869629f, 0.046204f, 0.860840f, 0.047607f, 0.853516f, 0.048126f, 0.847168f, + 0.048370f, 0.840820f, 0.048767f, 0.834473f, 0.048706f, 0.827637f, 0.049896f, 0.818359f, + 0.050446f, 0.809570f, 0.050720f, 0.801270f, 0.050568f, 0.793457f, 0.050323f, 0.785645f, + 0.050049f, 0.777832f, 0.050476f, 0.766602f, 0.050598f, 0.755859f, 0.050629f, 0.746094f, + 0.050049f, 0.735840f, 0.049408f, 0.725586f, 0.048431f, 0.715332f, 0.048218f, 0.702637f, + 0.048035f, 0.688477f, 0.046997f, 0.674316f, 0.046051f, 0.660645f, 0.044861f, 0.647461f, + 0.043060f, 0.633789f, 0.041901f, 0.615723f, 0.040985f, 0.596191f, 0.039429f, 0.577148f, + 0.037567f, 0.558594f, 0.035339f, 0.540039f, 0.032837f, 0.516113f, 0.031128f, 0.487793f, + 0.028809f, 0.461182f, 0.025543f, 0.432617f, 0.022003f, 0.402832f, 0.019440f, 0.357910f, + 0.015465f, 0.313965f, 0.010681f, 0.264404f, 0.006344f, 0.182617f, 0.001092f, 0.064209f, + 0.000000f, 1.000000f, 0.003632f, 0.996582f, 0.007587f, 0.992188f, 0.010414f, 0.986328f, + 0.014725f, 0.980469f, 0.017197f, 0.976074f, 0.020142f, 0.968750f, 0.023468f, 0.962891f, + 0.025879f, 0.958008f, 0.028595f, 0.951172f, 0.030853f, 0.944824f, 0.033691f, 0.938477f, + 0.035583f, 0.934082f, 0.037842f, 0.927734f, 0.039734f, 0.920898f, 0.041992f, 0.914551f, + 0.043793f, 0.909180f, 0.044800f, 0.904785f, 0.046661f, 0.898926f, 0.048096f, 0.891602f, + 0.049866f, 0.884766f, 0.050751f, 0.879395f, 0.051941f, 0.874023f, 0.052490f, 0.869141f, + 0.054169f, 0.861328f, 0.055359f, 0.854004f, 0.056305f, 0.846680f, 0.057098f, 0.840332f, + 0.057495f, 0.834961f, 0.057800f, 0.828613f, 0.058685f, 0.819824f, 0.059479f, 0.811035f, + 0.060120f, 0.803223f, 0.060242f, 0.795410f, 0.060333f, 0.788086f, 0.059753f, 0.780762f, + 0.060242f, 0.770996f, 0.060242f, 0.760254f, 0.060455f, 0.750000f, 0.060059f, 0.740723f, + 0.059387f, 0.730469f, 0.058685f, 0.721680f, 0.057800f, 0.710449f, 0.057587f, 0.696289f, + 0.056915f, 0.683105f, 0.056030f, 0.669922f, 0.054504f, 0.657715f, 0.053131f, 0.644531f, + 0.051422f, 0.630371f, 0.050293f, 0.611328f, 0.048889f, 0.593262f, 0.047058f, 0.575195f, + 0.044586f, 0.557129f, 0.041656f, 0.538086f, 0.039398f, 0.512695f, 0.037201f, 0.486572f, + 0.033936f, 0.459717f, 0.030258f, 0.432373f, 0.026291f, 0.400879f, 0.022949f, 0.356445f, + 0.018234f, 0.313721f, 0.012558f, 0.265137f, 0.007404f, 0.182617f, 0.001262f, 0.063599f, + 0.000000f, 1.000000f, 0.004120f, 0.996094f, 0.008354f, 0.991699f, 0.012260f, 0.985352f, + 0.016769f, 0.979492f, 0.019363f, 0.974609f, 0.023438f, 0.966309f, 0.026428f, 0.960938f, + 0.029419f, 0.955078f, 0.032990f, 0.947266f, 0.036072f, 0.940430f, 0.038086f, 0.935059f, + 0.040924f, 0.929688f, 0.043762f, 0.921875f, 0.046936f, 0.914551f, 0.048859f, 0.909180f, + 0.050446f, 0.903809f, 0.051880f, 0.899414f, 0.054321f, 0.891113f, 0.056641f, 0.884277f, + 0.058228f, 0.878418f, 0.059387f, 0.873047f, 0.060181f, 0.868164f, 0.062256f, 0.860840f, + 0.063416f, 0.853027f, 0.064941f, 0.846191f, 0.065857f, 0.840332f, 0.066772f, 0.834473f, + 0.067139f, 0.828613f, 0.068298f, 0.820312f, 0.069092f, 0.812012f, 0.070190f, 0.804199f, + 0.070251f, 0.796387f, 0.070618f, 0.789551f, 0.070251f, 0.782715f, 0.070618f, 0.773926f, + 0.071106f, 0.763184f, 0.070984f, 0.753418f, 0.071045f, 0.744141f, 0.070435f, 0.735352f, + 0.069702f, 0.726074f, 0.068787f, 0.717285f, 0.068542f, 0.703613f, 0.067932f, 0.690918f, + 0.066772f, 0.678711f, 0.065796f, 0.666504f, 0.063721f, 0.654297f, 0.062164f, 0.642090f, + 0.060852f, 0.624512f, 0.059387f, 0.606934f, 0.057251f, 0.590332f, 0.055054f, 0.572754f, + 0.052002f, 0.555664f, 0.048828f, 0.536621f, 0.046387f, 0.509766f, 0.043457f, 0.484375f, + 0.039734f, 0.458984f, 0.035187f, 0.432861f, 0.031067f, 0.397705f, 0.026810f, 0.355713f, + 0.021164f, 0.313965f, 0.014526f, 0.266602f, 0.008568f, 0.182129f, 0.001485f, 0.063538f, + 0.000000f, 1.000000f, 0.004551f, 0.996094f, 0.009392f, 0.991211f, 0.013962f, 0.983887f, + 0.017792f, 0.978516f, 0.022156f, 0.971191f, 0.026657f, 0.964355f, 0.030258f, 0.958008f, + 0.033203f, 0.952148f, 0.037201f, 0.943848f, 0.040710f, 0.937012f, 0.044250f, 0.931152f, + 0.046509f, 0.924316f, 0.050598f, 0.916016f, 0.053192f, 0.909180f, 0.056091f, 0.903320f, + 0.057648f, 0.897949f, 0.060669f, 0.890625f, 0.063293f, 0.883301f, 0.064880f, 0.877441f, + 0.067139f, 0.871582f, 0.068604f, 0.866699f, 0.069702f, 0.859863f, 0.072205f, 0.852051f, + 0.074036f, 0.845215f, 0.075134f, 0.838379f, 0.076111f, 0.833496f, 0.077271f, 0.827637f, + 0.078186f, 0.820312f, 0.079224f, 0.811523f, 0.080261f, 0.804199f, 0.080994f, 0.796875f, + 0.081299f, 0.790039f, 0.081299f, 0.783691f, 0.081482f, 0.775879f, 0.082214f, 0.765137f, + 0.082520f, 0.756836f, 0.082764f, 0.747070f, 0.082214f, 0.738770f, 0.081543f, 0.730469f, + 0.080566f, 0.721680f, 0.080139f, 0.709961f, 0.079895f, 0.697266f, 0.078735f, 0.685547f, + 0.077271f, 0.673828f, 0.076050f, 0.662598f, 0.073669f, 0.650879f, 0.072266f, 0.636719f, + 0.070679f, 0.620117f, 0.068787f, 0.603516f, 0.066345f, 0.587402f, 0.063354f, 0.570801f, + 0.059723f, 0.554199f, 0.057007f, 0.531250f, 0.053925f, 0.506836f, 0.049957f, 0.482666f, + 0.045593f, 0.458496f, 0.040375f, 0.431885f, 0.035828f, 0.394531f, 0.030869f, 0.355225f, + 0.024323f, 0.314941f, 0.017105f, 0.262695f, 0.009865f, 0.182373f, 0.001684f, 0.062286f, + 0.000000f, 1.000000f, 0.005116f, 0.995605f, 0.010109f, 0.990723f, 0.015930f, 0.982910f, + 0.020416f, 0.977051f, 0.024887f, 0.969238f, 0.030289f, 0.961426f, 0.034027f, 0.956055f, + 0.038147f, 0.947754f, 0.042694f, 0.939453f, 0.046021f, 0.933105f, 0.049103f, 0.927246f, + 0.053406f, 0.917969f, 0.057281f, 0.910645f, 0.060638f, 0.904297f, 0.062927f, 0.898438f, + 0.066040f, 0.890625f, 0.069458f, 0.882324f, 0.071777f, 0.875977f, 0.074585f, 0.869629f, + 0.076416f, 0.864746f, 0.078430f, 0.858398f, 0.081116f, 0.850586f, 0.082764f, 0.843750f, + 0.084961f, 0.837402f, 0.085999f, 0.831543f, 0.086853f, 0.826172f, 0.088196f, 0.819336f, + 0.090210f, 0.810547f, 0.091370f, 0.803223f, 0.092224f, 0.796387f, 0.092285f, 0.790039f, + 0.093140f, 0.783691f, 0.093140f, 0.776367f, 0.094177f, 0.766113f, 0.094727f, 0.757812f, + 0.094849f, 0.749512f, 0.094421f, 0.741211f, 0.094238f, 0.732910f, 0.093140f, 0.725098f, + 0.092529f, 0.713867f, 0.092285f, 0.702148f, 0.091431f, 0.690918f, 0.090271f, 0.680176f, + 0.088379f, 0.669434f, 0.086548f, 0.658691f, 0.084290f, 0.646973f, 0.083191f, 0.630371f, + 0.081299f, 0.614746f, 0.078918f, 0.600098f, 0.075500f, 0.584473f, 0.072266f, 0.569336f, + 0.068359f, 0.551270f, 0.065552f, 0.527832f, 0.061829f, 0.504395f, 0.057281f, 0.481689f, + 0.051941f, 0.457520f, 0.045990f, 0.432373f, 0.041321f, 0.392822f, 0.035065f, 0.354736f, + 0.027573f, 0.314941f, 0.019547f, 0.259033f, 0.011169f, 0.182983f, 0.001916f, 0.061859f, + 0.000000f, 1.000000f, 0.006191f, 0.995117f, 0.011017f, 0.990723f, 0.017899f, 0.981934f, + 0.022003f, 0.976562f, 0.028793f, 0.966309f, 0.032928f, 0.959961f, 0.037384f, 0.953125f, + 0.043152f, 0.943359f, 0.047943f, 0.935547f, 0.051788f, 0.929688f, 0.056061f, 0.920898f, + 0.060486f, 0.912598f, 0.064880f, 0.904785f, 0.067993f, 0.898926f, 0.071533f, 0.891602f, + 0.075378f, 0.882812f, 0.078735f, 0.875488f, 0.082092f, 0.868652f, 0.084045f, 0.863281f, + 0.086487f, 0.856934f, 0.089417f, 0.848633f, 0.092346f, 0.841797f, 0.094604f, 0.835449f, + 0.095642f, 0.830078f, 0.097473f, 0.824219f, 0.099304f, 0.816406f, 0.101074f, 0.808594f, + 0.102478f, 0.801758f, 0.104187f, 0.794922f, 0.104309f, 0.789062f, 0.105164f, 0.782715f, + 0.105164f, 0.775879f, 0.106873f, 0.766113f, 0.107544f, 0.757812f, 0.107605f, 0.749512f, + 0.107605f, 0.742676f, 0.107117f, 0.735352f, 0.106262f, 0.727539f, 0.105835f, 0.716797f, + 0.105896f, 0.706055f, 0.104858f, 0.695312f, 0.103638f, 0.685547f, 0.102295f, 0.675293f, + 0.100159f, 0.666016f, 0.097900f, 0.654785f, 0.096436f, 0.639160f, 0.094910f, 0.625000f, + 0.092041f, 0.610352f, 0.089050f, 0.596680f, 0.085388f, 0.582031f, 0.081604f, 0.567383f, + 0.077942f, 0.545410f, 0.074585f, 0.524414f, 0.069946f, 0.502930f, 0.064758f, 0.480225f, + 0.058472f, 0.457031f, 0.052612f, 0.427246f, 0.046936f, 0.391602f, 0.039703f, 0.354736f, + 0.031036f, 0.315918f, 0.022400f, 0.257080f, 0.012619f, 0.183350f, 0.002148f, 0.061646f, + 0.000000f, 1.000000f, 0.006817f, 0.995117f, 0.012398f, 0.989258f, 0.019669f, 0.980957f, + 0.024902f, 0.974121f, 0.031738f, 0.964355f, 0.037354f, 0.957520f, 0.042908f, 0.948242f, + 0.048340f, 0.939941f, 0.053680f, 0.932617f, 0.057648f, 0.924805f, 0.063416f, 0.915039f, + 0.067627f, 0.907715f, 0.072266f, 0.899902f, 0.076172f, 0.893066f, 0.081116f, 0.883301f, + 0.085388f, 0.875000f, 0.088745f, 0.868652f, 0.091675f, 0.862305f, 0.094788f, 0.854980f, + 0.098633f, 0.846191f, 0.101318f, 0.839355f, 0.103577f, 0.833008f, 0.106140f, 0.827148f, + 0.107727f, 0.822266f, 0.109985f, 0.813965f, 0.112549f, 0.806152f, 0.114563f, 0.798828f, + 0.115540f, 0.792969f, 0.117065f, 0.787109f, 0.116943f, 0.781738f, 0.118591f, 0.773438f, + 0.119934f, 0.765137f, 0.120544f, 0.756836f, 0.121277f, 0.750000f, 0.121155f, 0.742676f, + 0.120300f, 0.735840f, 0.119812f, 0.729492f, 0.120056f, 0.717773f, 0.119690f, 0.708008f, + 0.119141f, 0.698242f, 0.117920f, 0.689453f, 0.116821f, 0.680176f, 0.114380f, 0.670898f, + 0.112244f, 0.661133f, 0.110962f, 0.646484f, 0.109131f, 0.633301f, 0.106567f, 0.620117f, + 0.103149f, 0.606445f, 0.099426f, 0.593262f, 0.095703f, 0.580078f, 0.091797f, 0.561523f, + 0.088196f, 0.541504f, 0.083618f, 0.521484f, 0.078247f, 0.500488f, 0.072266f, 0.479492f, + 0.065491f, 0.457031f, 0.059631f, 0.423828f, 0.052521f, 0.390381f, 0.044403f, 0.354980f, + 0.034576f, 0.315674f, 0.025177f, 0.255127f, 0.014053f, 0.183350f, 0.002422f, 0.061646f, + 0.000000f, 1.000000f, 0.007477f, 0.994629f, 0.014580f, 0.987305f, 0.021271f, 0.980469f, + 0.028717f, 0.970703f, 0.034760f, 0.962891f, 0.040588f, 0.955566f, 0.048798f, 0.944336f, + 0.054474f, 0.936523f, 0.058929f, 0.929688f, 0.065491f, 0.918457f, 0.071106f, 0.909668f, + 0.075867f, 0.902344f, 0.080261f, 0.894531f, 0.086365f, 0.884277f, 0.090149f, 0.876465f, + 0.095154f, 0.868652f, 0.098572f, 0.862305f, 0.101868f, 0.854004f, 0.106812f, 0.845215f, + 0.110413f, 0.837402f, 0.113098f, 0.831055f, 0.116028f, 0.825195f, 0.117920f, 0.818848f, + 0.121521f, 0.810059f, 0.123779f, 0.803223f, 0.125732f, 0.796875f, 0.127686f, 0.790527f, + 0.128662f, 0.785156f, 0.129395f, 0.779297f, 0.131958f, 0.770508f, 0.133423f, 0.762207f, + 0.134155f, 0.755371f, 0.134888f, 0.749023f, 0.134888f, 0.742188f, 0.134888f, 0.736328f, + 0.134399f, 0.728027f, 0.134644f, 0.718262f, 0.134888f, 0.708984f, 0.134033f, 0.700195f, + 0.132812f, 0.691895f, 0.131592f, 0.684082f, 0.129761f, 0.675293f, 0.127319f, 0.665039f, + 0.126221f, 0.652344f, 0.124207f, 0.640137f, 0.121277f, 0.627930f, 0.118408f, 0.615723f, + 0.114990f, 0.603516f, 0.110474f, 0.591309f, 0.106873f, 0.574707f, 0.102905f, 0.555664f, + 0.098206f, 0.537109f, 0.093018f, 0.518555f, 0.086853f, 0.499268f, 0.080017f, 0.479248f, + 0.073364f, 0.452637f, 0.066711f, 0.422119f, 0.058594f, 0.389893f, 0.049225f, 0.354980f, + 0.038177f, 0.316406f, 0.028336f, 0.254150f, 0.015450f, 0.183838f, 0.002693f, 0.061462f, + 0.000000f, 1.000000f, 0.008354f, 0.994629f, 0.015961f, 0.986816f, 0.023605f, 0.979492f, + 0.031921f, 0.968750f, 0.038483f, 0.961426f, 0.046234f, 0.950684f, 0.053558f, 0.941406f, + 0.059143f, 0.934082f, 0.066406f, 0.922852f, 0.073486f, 0.913574f, 0.078979f, 0.905273f, + 0.084167f, 0.896973f, 0.090210f, 0.886719f, 0.096008f, 0.877441f, 0.100464f, 0.870117f, + 0.104309f, 0.863281f, 0.109802f, 0.853027f, 0.114563f, 0.844727f, 0.118225f, 0.836914f, + 0.122681f, 0.829590f, 0.125244f, 0.823730f, 0.128784f, 0.814941f, 0.132690f, 0.806641f, + 0.134888f, 0.799805f, 0.137939f, 0.793457f, 0.139893f, 0.787598f, 0.141602f, 0.782715f, + 0.143433f, 0.774414f, 0.145386f, 0.766602f, 0.146729f, 0.759766f, 0.147949f, 0.753418f, + 0.148682f, 0.747070f, 0.148804f, 0.741211f, 0.148926f, 0.735352f, 0.149536f, 0.725098f, + 0.150635f, 0.717285f, 0.150024f, 0.708984f, 0.149536f, 0.701172f, 0.148682f, 0.693848f, + 0.146729f, 0.686035f, 0.144775f, 0.678711f, 0.143311f, 0.666992f, 0.142334f, 0.655762f, + 0.140015f, 0.645020f, 0.137329f, 0.634277f, 0.134399f, 0.623047f, 0.130859f, 0.612305f, + 0.126587f, 0.600586f, 0.122620f, 0.584961f, 0.118958f, 0.567871f, 0.114075f, 0.551270f, + 0.108887f, 0.534180f, 0.102661f, 0.517090f, 0.095764f, 0.498535f, 0.088257f, 0.477295f, + 0.081665f, 0.448730f, 0.073486f, 0.419922f, 0.064331f, 0.388428f, 0.053955f, 0.354736f, + 0.042419f, 0.314209f, 0.031403f, 0.253174f, 0.017044f, 0.184692f, 0.002956f, 0.061035f, + 0.000000f, 1.000000f, 0.009033f, 0.994629f, 0.018036f, 0.985840f, 0.026031f, 0.977051f, + 0.035248f, 0.967773f, 0.042816f, 0.958008f, 0.051422f, 0.947754f, 0.058624f, 0.938965f, + 0.066345f, 0.927734f, 0.074097f, 0.917480f, 0.080078f, 0.909180f, 0.087097f, 0.899902f, + 0.094360f, 0.888672f, 0.099976f, 0.880371f, 0.105713f, 0.872070f, 0.110474f, 0.863281f, + 0.116028f, 0.853516f, 0.121643f, 0.844238f, 0.126831f, 0.836426f, 0.130859f, 0.829590f, + 0.134766f, 0.820801f, 0.139404f, 0.812012f, 0.142700f, 0.804199f, 0.146973f, 0.797363f, + 0.149170f, 0.790527f, 0.150757f, 0.785156f, 0.154541f, 0.777344f, 0.157104f, 0.769531f, + 0.159424f, 0.763184f, 0.161133f, 0.755859f, 0.161743f, 0.750000f, 0.162964f, 0.744629f, + 0.163330f, 0.739258f, 0.164307f, 0.730469f, 0.165283f, 0.722656f, 0.165771f, 0.714844f, + 0.165649f, 0.708008f, 0.165039f, 0.701660f, 0.164062f, 0.694336f, 0.162476f, 0.687500f, + 0.161743f, 0.678223f, 0.160767f, 0.667969f, 0.158813f, 0.658203f, 0.156616f, 0.648438f, + 0.153931f, 0.639160f, 0.150757f, 0.629395f, 0.147095f, 0.619141f, 0.143188f, 0.607910f, + 0.139771f, 0.592773f, 0.135498f, 0.578125f, 0.130981f, 0.563477f, 0.125244f, 0.547852f, + 0.119202f, 0.532227f, 0.112183f, 0.515625f, 0.104919f, 0.497559f, 0.097717f, 0.471680f, + 0.089905f, 0.445557f, 0.080811f, 0.417969f, 0.070679f, 0.388428f, 0.058960f, 0.354980f, + 0.047211f, 0.310059f, 0.034393f, 0.252441f, 0.018539f, 0.185547f, 0.003244f, 0.061188f, + 0.000000f, 1.000000f, 0.009888f, 0.994141f, 0.019958f, 0.985352f, 0.029358f, 0.975098f, + 0.038239f, 0.966309f, 0.048859f, 0.954102f, 0.056885f, 0.944824f, 0.065552f, 0.933594f, + 0.073547f, 0.923340f, 0.081238f, 0.914551f, 0.088806f, 0.903320f, 0.097168f, 0.892090f, + 0.103149f, 0.883789f, 0.109131f, 0.875488f, 0.117065f, 0.863770f, 0.123047f, 0.854004f, + 0.128418f, 0.845703f, 0.133179f, 0.837402f, 0.138794f, 0.828613f, 0.144409f, 0.818848f, + 0.148926f, 0.810059f, 0.153564f, 0.802246f, 0.157471f, 0.795410f, 0.160034f, 0.789062f, + 0.164307f, 0.779785f, 0.167603f, 0.771973f, 0.170044f, 0.765137f, 0.172607f, 0.758789f, + 0.174316f, 0.752930f, 0.176514f, 0.747559f, 0.177368f, 0.740234f, 0.179077f, 0.732910f, + 0.180664f, 0.725586f, 0.181396f, 0.718750f, 0.181396f, 0.712402f, 0.181885f, 0.706543f, + 0.180786f, 0.700195f, 0.179810f, 0.694336f, 0.179077f, 0.685547f, 0.178833f, 0.676270f, + 0.177734f, 0.667969f, 0.175659f, 0.659180f, 0.173462f, 0.650879f, 0.171143f, 0.642578f, + 0.167725f, 0.634277f, 0.163940f, 0.624512f, 0.161255f, 0.611816f, 0.158081f, 0.599609f, + 0.153320f, 0.586426f, 0.148438f, 0.573242f, 0.143188f, 0.560059f, 0.136230f, 0.545898f, + 0.129883f, 0.531250f, 0.122375f, 0.512695f, 0.115662f, 0.490967f, 0.107544f, 0.467529f, + 0.098450f, 0.443115f, 0.088379f, 0.417236f, 0.076660f, 0.388184f, 0.064453f, 0.355713f, + 0.051910f, 0.307373f, 0.037720f, 0.252930f, 0.020309f, 0.187012f, 0.003546f, 0.060883f, + 0.000000f, 1.000000f, 0.010391f, 0.994141f, 0.021210f, 0.985352f, 0.032745f, 0.974121f, + 0.042908f, 0.962891f, 0.053345f, 0.952148f, 0.062500f, 0.940918f, 0.072205f, 0.929688f, + 0.080505f, 0.920410f, 0.090271f, 0.907227f, 0.097961f, 0.897461f, 0.105774f, 0.887695f, + 0.114502f, 0.876465f, 0.121704f, 0.865723f, 0.128662f, 0.855957f, 0.134521f, 0.847656f, + 0.140625f, 0.837402f, 0.146851f, 0.827148f, 0.153076f, 0.817871f, 0.157959f, 0.809570f, + 0.162964f, 0.802246f, 0.167480f, 0.793457f, 0.172241f, 0.784180f, 0.175903f, 0.776367f, + 0.180054f, 0.768555f, 0.183228f, 0.761719f, 0.185791f, 0.755371f, 0.188232f, 0.748535f, + 0.191162f, 0.740723f, 0.192871f, 0.734375f, 0.195679f, 0.727539f, 0.195801f, 0.721680f, + 0.196777f, 0.715820f, 0.197510f, 0.709961f, 0.197388f, 0.704590f, 0.197021f, 0.696777f, + 0.197632f, 0.688965f, 0.197266f, 0.681641f, 0.196411f, 0.674316f, 0.194946f, 0.666992f, + 0.193604f, 0.659668f, 0.191162f, 0.652832f, 0.188110f, 0.645508f, 0.185913f, 0.636230f, + 0.182983f, 0.625488f, 0.179443f, 0.615234f, 0.176025f, 0.604492f, 0.171753f, 0.593750f, + 0.166138f, 0.582031f, 0.161011f, 0.570312f, 0.154907f, 0.557617f, 0.148071f, 0.543945f, + 0.141357f, 0.524902f, 0.134033f, 0.505859f, 0.125977f, 0.486084f, 0.117004f, 0.464844f, + 0.106873f, 0.441650f, 0.095703f, 0.416748f, 0.083252f, 0.388916f, 0.070435f, 0.349854f, + 0.056671f, 0.305908f, 0.040863f, 0.253662f, 0.021820f, 0.188477f, 0.003828f, 0.060883f, + 0.000000f, 1.000000f, 0.012199f, 0.992676f, 0.024460f, 0.982910f, 0.035431f, 0.972168f, + 0.047913f, 0.960449f, 0.058899f, 0.948730f, 0.069214f, 0.937500f, 0.079407f, 0.925781f, + 0.089722f, 0.913574f, 0.098389f, 0.903320f, 0.107483f, 0.891602f, 0.116760f, 0.879883f, + 0.124756f, 0.869629f, 0.131836f, 0.859863f, 0.140503f, 0.848145f, 0.147949f, 0.837891f, + 0.154785f, 0.828125f, 0.160400f, 0.819336f, 0.166992f, 0.809570f, 0.172974f, 0.799316f, + 0.178345f, 0.790527f, 0.183105f, 0.782227f, 0.186890f, 0.774902f, 0.191162f, 0.767578f, + 0.195435f, 0.758789f, 0.199951f, 0.750000f, 0.202515f, 0.742676f, 0.205566f, 0.735352f, + 0.207886f, 0.729004f, 0.209595f, 0.723145f, 0.210449f, 0.717773f, 0.213257f, 0.710938f, + 0.213989f, 0.704102f, 0.214722f, 0.697266f, 0.215088f, 0.690918f, 0.215332f, 0.685059f, + 0.215088f, 0.678711f, 0.213867f, 0.672852f, 0.212280f, 0.666504f, 0.210693f, 0.661133f, + 0.209106f, 0.651855f, 0.207520f, 0.644043f, 0.204834f, 0.635254f, 0.202148f, 0.626953f, + 0.198486f, 0.617676f, 0.194946f, 0.608398f, 0.190552f, 0.598633f, 0.185181f, 0.588379f, + 0.179443f, 0.577637f, 0.173584f, 0.564941f, 0.167969f, 0.550293f, 0.160767f, 0.535156f, + 0.154175f, 0.519043f, 0.145386f, 0.501953f, 0.136597f, 0.483643f, 0.126465f, 0.463379f, + 0.114807f, 0.441406f, 0.102905f, 0.417236f, 0.090820f, 0.384766f, 0.076904f, 0.347168f, + 0.061798f, 0.305420f, 0.043976f, 0.254150f, 0.023560f, 0.189575f, 0.004086f, 0.060669f, + 0.000000f, 1.000000f, 0.013603f, 0.992676f, 0.026031f, 0.982422f, 0.039551f, 0.970703f, + 0.052856f, 0.958008f, 0.064270f, 0.945801f, 0.076294f, 0.933105f, 0.087158f, 0.921875f, + 0.097717f, 0.908691f, 0.108765f, 0.896484f, 0.117859f, 0.885254f, 0.128052f, 0.873047f, + 0.136353f, 0.861816f, 0.145264f, 0.851562f, 0.153564f, 0.840820f, 0.160889f, 0.829102f, + 0.168213f, 0.818848f, 0.174927f, 0.809082f, 0.181885f, 0.799316f, 0.187744f, 0.790527f, + 0.193726f, 0.780273f, 0.199341f, 0.771484f, 0.203613f, 0.762695f, 0.207886f, 0.754883f, + 0.212280f, 0.747070f, 0.215332f, 0.740234f, 0.219849f, 0.731934f, 0.223267f, 0.724121f, + 0.225830f, 0.717285f, 0.227417f, 0.710449f, 0.229248f, 0.704590f, 0.230347f, 0.698730f, + 0.231445f, 0.692871f, 0.231445f, 0.687500f, 0.232056f, 0.681641f, 0.231934f, 0.674805f, + 0.231201f, 0.668457f, 0.230835f, 0.661621f, 0.229858f, 0.654785f, 0.228394f, 0.647949f, + 0.226440f, 0.640625f, 0.224365f, 0.634277f, 0.221436f, 0.626953f, 0.217041f, 0.619141f, + 0.213623f, 0.610840f, 0.209473f, 0.602051f, 0.204712f, 0.591309f, 0.200073f, 0.581055f, + 0.194702f, 0.569336f, 0.188599f, 0.557129f, 0.181274f, 0.543945f, 0.173828f, 0.530273f, + 0.165649f, 0.515137f, 0.156250f, 0.499268f, 0.146484f, 0.482178f, 0.135376f, 0.462891f, + 0.124146f, 0.438477f, 0.111877f, 0.412109f, 0.098328f, 0.381348f, 0.083130f, 0.346191f, + 0.066162f, 0.305664f, 0.047180f, 0.255615f, 0.025009f, 0.190796f, 0.004433f, 0.061157f, + 0.000000f, 1.000000f, 0.015060f, 0.991699f, 0.029160f, 0.981445f, 0.043610f, 0.968750f, + 0.057648f, 0.955566f, 0.071167f, 0.942383f, 0.083618f, 0.929688f, 0.095642f, 0.916016f, + 0.108215f, 0.903320f, 0.117920f, 0.891602f, 0.129883f, 0.877930f, 0.139404f, 0.866211f, + 0.148560f, 0.854492f, 0.157837f, 0.843750f, 0.166382f, 0.832031f, 0.175171f, 0.820801f, + 0.182983f, 0.810059f, 0.190186f, 0.799805f, 0.196289f, 0.790039f, 0.202271f, 0.780273f, + 0.209106f, 0.770020f, 0.214966f, 0.760742f, 0.220215f, 0.751465f, 0.225220f, 0.743164f, + 0.229492f, 0.734863f, 0.233643f, 0.726562f, 0.236816f, 0.719727f, 0.240479f, 0.712402f, + 0.243042f, 0.704590f, 0.245728f, 0.697754f, 0.247070f, 0.690918f, 0.249023f, 0.684570f, + 0.250488f, 0.679199f, 0.250732f, 0.673340f, 0.250488f, 0.667969f, 0.250732f, 0.662109f, + 0.249634f, 0.656738f, 0.248657f, 0.650879f, 0.247681f, 0.645020f, 0.245850f, 0.638184f, + 0.243896f, 0.631836f, 0.240601f, 0.624023f, 0.237915f, 0.617188f, 0.234009f, 0.609375f, + 0.230469f, 0.601074f, 0.226196f, 0.592773f, 0.221069f, 0.583496f, 0.214844f, 0.574219f, + 0.209595f, 0.563965f, 0.202271f, 0.552734f, 0.194824f, 0.541016f, 0.186279f, 0.527832f, + 0.177490f, 0.512207f, 0.168091f, 0.495850f, 0.157349f, 0.477539f, 0.145752f, 0.457031f, + 0.134033f, 0.434570f, 0.120422f, 0.409180f, 0.105530f, 0.380127f, 0.089111f, 0.346436f, + 0.071106f, 0.306641f, 0.050690f, 0.257324f, 0.027359f, 0.186646f, 0.004692f, 0.061188f, + 0.000000f, 1.000000f, 0.016144f, 0.991699f, 0.032501f, 0.979004f, 0.048553f, 0.965332f, + 0.063599f, 0.951660f, 0.077332f, 0.938965f, 0.092041f, 0.923828f, 0.105225f, 0.910645f, + 0.117493f, 0.896973f, 0.130371f, 0.883301f, 0.141113f, 0.870605f, 0.152344f, 0.857910f, + 0.162231f, 0.845703f, 0.172363f, 0.833496f, 0.181885f, 0.821777f, 0.190674f, 0.810059f, + 0.198364f, 0.799316f, 0.206909f, 0.788086f, 0.213257f, 0.778320f, 0.220947f, 0.768066f, + 0.226440f, 0.758789f, 0.232666f, 0.749023f, 0.237305f, 0.740234f, 0.242798f, 0.730957f, + 0.247314f, 0.722656f, 0.251465f, 0.714355f, 0.255615f, 0.706543f, 0.258789f, 0.699219f, + 0.261719f, 0.691895f, 0.264404f, 0.685059f, 0.266113f, 0.678711f, 0.267334f, 0.672363f, + 0.268311f, 0.666992f, 0.269287f, 0.661133f, 0.268799f, 0.656250f, 0.268799f, 0.650391f, + 0.268311f, 0.645020f, 0.266602f, 0.639648f, 0.265381f, 0.633789f, 0.263672f, 0.627930f, + 0.260498f, 0.621582f, 0.257812f, 0.615234f, 0.254639f, 0.608398f, 0.250488f, 0.601562f, + 0.246582f, 0.593750f, 0.241455f, 0.585449f, 0.235840f, 0.576660f, 0.230103f, 0.567383f, + 0.223511f, 0.557617f, 0.216187f, 0.546387f, 0.208496f, 0.534668f, 0.200073f, 0.521973f, + 0.190063f, 0.507324f, 0.179810f, 0.491699f, 0.168457f, 0.474121f, 0.156372f, 0.455078f, + 0.142822f, 0.433350f, 0.128418f, 0.408447f, 0.112305f, 0.380127f, 0.094971f, 0.346680f, + 0.075867f, 0.306885f, 0.054291f, 0.255615f, 0.029739f, 0.184692f, 0.005028f, 0.062134f, + 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034760f, 0.978516f, 0.050659f, 0.965332f, + 0.066528f, 0.951172f, 0.081360f, 0.937012f, 0.096375f, 0.922363f, 0.109497f, 0.908691f, + 0.122620f, 0.894531f, 0.135376f, 0.880859f, 0.148071f, 0.867188f, 0.158325f, 0.854492f, + 0.169922f, 0.841309f, 0.179565f, 0.829102f, 0.189697f, 0.816895f, 0.198242f, 0.805664f, + 0.207397f, 0.793945f, 0.216675f, 0.782715f, 0.221802f, 0.772949f, 0.230469f, 0.761719f, + 0.237183f, 0.751953f, 0.242676f, 0.742188f, 0.248535f, 0.733398f, 0.254395f, 0.724121f, + 0.258789f, 0.715332f, 0.263916f, 0.707031f, 0.267334f, 0.698730f, 0.270752f, 0.690918f, + 0.273926f, 0.684082f, 0.276611f, 0.676758f, 0.278809f, 0.669922f, 0.280273f, 0.664062f, + 0.281738f, 0.657715f, 0.281982f, 0.652344f, 0.283203f, 0.646484f, 0.281982f, 0.641602f, + 0.282227f, 0.635742f, 0.281494f, 0.630371f, 0.279541f, 0.625000f, 0.278076f, 0.619141f, + 0.275146f, 0.613281f, 0.272949f, 0.606934f, 0.269043f, 0.600586f, 0.265381f, 0.593750f, + 0.260986f, 0.586426f, 0.255859f, 0.578125f, 0.251465f, 0.570312f, 0.244995f, 0.561035f, + 0.238647f, 0.551270f, 0.231812f, 0.541016f, 0.223389f, 0.529297f, 0.214233f, 0.516602f, + 0.204712f, 0.502441f, 0.195190f, 0.487305f, 0.183350f, 0.470459f, 0.171021f, 0.451172f, + 0.157471f, 0.429688f, 0.142334f, 0.405029f, 0.125977f, 0.377197f, 0.107971f, 0.343750f, + 0.088074f, 0.304199f, 0.065125f, 0.253662f, 0.038574f, 0.183838f, 0.008568f, 0.066162f, + 0.000000f, 1.000000f, 0.017303f, 0.991211f, 0.034607f, 0.978516f, 0.050690f, 0.965332f, + 0.066711f, 0.951172f, 0.081970f, 0.936523f, 0.096313f, 0.922363f, 0.110413f, 0.907715f, + 0.123901f, 0.893555f, 0.136475f, 0.880371f, 0.148682f, 0.866699f, 0.159546f, 0.854004f, + 0.170410f, 0.840820f, 0.181519f, 0.828125f, 0.192017f, 0.815430f, 0.201050f, 0.804199f, + 0.209717f, 0.792480f, 0.218018f, 0.781250f, 0.226196f, 0.770508f, 0.233032f, 0.760254f, + 0.240723f, 0.749512f, 0.247559f, 0.739746f, 0.253174f, 0.729980f, 0.258545f, 0.721191f, + 0.263916f, 0.711914f, 0.268311f, 0.703613f, 0.273438f, 0.695312f, 0.277344f, 0.687012f, + 0.280029f, 0.679688f, 0.282959f, 0.672363f, 0.286133f, 0.665039f, 0.288086f, 0.658691f, + 0.289551f, 0.652832f, 0.290283f, 0.646484f, 0.291504f, 0.641113f, 0.291992f, 0.635742f, + 0.291992f, 0.629883f, 0.291260f, 0.624023f, 0.290039f, 0.618652f, 0.288818f, 0.612305f, + 0.286865f, 0.606445f, 0.284668f, 0.600098f, 0.281494f, 0.594238f, 0.278809f, 0.586426f, + 0.274414f, 0.579590f, 0.270752f, 0.571289f, 0.265625f, 0.563477f, 0.260010f, 0.553711f, + 0.254639f, 0.544434f, 0.247681f, 0.533691f, 0.240479f, 0.522461f, 0.231934f, 0.510254f, + 0.222778f, 0.496338f, 0.212891f, 0.481201f, 0.202148f, 0.464600f, 0.190186f, 0.446045f, + 0.177002f, 0.424561f, 0.162964f, 0.400879f, 0.146484f, 0.373047f, 0.128052f, 0.340088f, + 0.108032f, 0.301758f, 0.083984f, 0.251709f, 0.054810f, 0.182495f, 0.018692f, 0.068237f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034637f, 0.978516f, 0.051056f, 0.965332f, + 0.066589f, 0.951172f, 0.082703f, 0.936035f, 0.096252f, 0.922363f, 0.111145f, 0.907715f, + 0.124268f, 0.894043f, 0.136963f, 0.879883f, 0.149414f, 0.866211f, 0.161987f, 0.853027f, + 0.172363f, 0.839844f, 0.182861f, 0.827148f, 0.192627f, 0.814941f, 0.202759f, 0.802734f, + 0.211670f, 0.791016f, 0.221558f, 0.779297f, 0.229126f, 0.768555f, 0.237183f, 0.757812f, + 0.244141f, 0.747070f, 0.251221f, 0.737305f, 0.257568f, 0.727539f, 0.263184f, 0.718262f, + 0.268799f, 0.708984f, 0.273682f, 0.700195f, 0.278564f, 0.691406f, 0.282715f, 0.683594f, + 0.286865f, 0.675293f, 0.289551f, 0.667969f, 0.293213f, 0.660645f, 0.295898f, 0.653320f, + 0.298096f, 0.646973f, 0.299072f, 0.641113f, 0.300293f, 0.635254f, 0.301270f, 0.629395f, + 0.301514f, 0.624023f, 0.301514f, 0.617188f, 0.300781f, 0.611816f, 0.299805f, 0.605957f, + 0.298584f, 0.599609f, 0.296875f, 0.593262f, 0.294434f, 0.586426f, 0.291748f, 0.579102f, + 0.288818f, 0.572266f, 0.284668f, 0.563965f, 0.280029f, 0.556152f, 0.275879f, 0.546875f, + 0.269531f, 0.537109f, 0.264160f, 0.526855f, 0.256348f, 0.515625f, 0.250000f, 0.503418f, + 0.241333f, 0.489746f, 0.231567f, 0.474365f, 0.221436f, 0.458496f, 0.210083f, 0.439697f, + 0.197388f, 0.419189f, 0.183105f, 0.395508f, 0.167847f, 0.368896f, 0.149902f, 0.336426f, + 0.129272f, 0.297852f, 0.104980f, 0.248901f, 0.074402f, 0.180786f, 0.032623f, 0.065308f, + 0.000000f, 1.000000f, 0.017410f, 0.991211f, 0.034210f, 0.979004f, 0.050873f, 0.965332f, + 0.066772f, 0.951172f, 0.082520f, 0.936035f, 0.097351f, 0.921875f, 0.111328f, 0.907715f, + 0.124817f, 0.893555f, 0.137817f, 0.879395f, 0.150757f, 0.865723f, 0.162598f, 0.852539f, + 0.174316f, 0.839355f, 0.185303f, 0.825684f, 0.195312f, 0.813477f, 0.205444f, 0.801270f, + 0.215088f, 0.789551f, 0.224121f, 0.778320f, 0.231323f, 0.767090f, 0.240601f, 0.755859f, + 0.248047f, 0.745117f, 0.254395f, 0.734863f, 0.261230f, 0.725098f, 0.267090f, 0.715332f, + 0.273682f, 0.706055f, 0.279053f, 0.696777f, 0.283691f, 0.687988f, 0.288330f, 0.679688f, + 0.293213f, 0.670898f, 0.297119f, 0.663086f, 0.300049f, 0.655762f, 0.303711f, 0.648438f, + 0.306152f, 0.641602f, 0.308350f, 0.634766f, 0.309570f, 0.628906f, 0.311035f, 0.622559f, + 0.311035f, 0.617188f, 0.312012f, 0.610840f, 0.312012f, 0.604492f, 0.311768f, 0.598633f, + 0.310791f, 0.592285f, 0.309570f, 0.585938f, 0.307617f, 0.579102f, 0.305664f, 0.572266f, + 0.302490f, 0.564453f, 0.298828f, 0.556641f, 0.296143f, 0.548340f, 0.291260f, 0.539551f, + 0.286377f, 0.529297f, 0.281494f, 0.519531f, 0.274658f, 0.507812f, 0.268066f, 0.495850f, + 0.260498f, 0.482422f, 0.250732f, 0.467285f, 0.241821f, 0.451172f, 0.230957f, 0.432617f, + 0.219360f, 0.411621f, 0.205322f, 0.388672f, 0.189941f, 0.361816f, 0.172119f, 0.330322f, + 0.152100f, 0.293213f, 0.127319f, 0.244873f, 0.095825f, 0.178711f, 0.049957f, 0.065735f, + 0.000000f, 1.000000f, 0.017456f, 0.991211f, 0.034058f, 0.979004f, 0.050537f, 0.965332f, + 0.066895f, 0.951172f, 0.082397f, 0.936523f, 0.097656f, 0.921875f, 0.111877f, 0.907715f, + 0.125488f, 0.893066f, 0.139038f, 0.878906f, 0.151611f, 0.865234f, 0.164062f, 0.851562f, + 0.175293f, 0.838379f, 0.186401f, 0.825195f, 0.197266f, 0.812500f, 0.207886f, 0.799805f, + 0.217163f, 0.788086f, 0.225586f, 0.776367f, 0.234985f, 0.765137f, 0.243774f, 0.753418f, + 0.251709f, 0.743164f, 0.258301f, 0.732422f, 0.266357f, 0.721680f, 0.272461f, 0.711914f, + 0.278320f, 0.702637f, 0.284424f, 0.693359f, 0.289551f, 0.684082f, 0.295410f, 0.675293f, + 0.300293f, 0.666992f, 0.303223f, 0.658691f, 0.306885f, 0.650879f, 0.310791f, 0.643066f, + 0.312988f, 0.636230f, 0.316406f, 0.628906f, 0.318604f, 0.622070f, 0.320068f, 0.616211f, + 0.322021f, 0.609863f, 0.323242f, 0.603516f, 0.322998f, 0.597168f, 0.323486f, 0.590820f, + 0.323486f, 0.583984f, 0.321777f, 0.578125f, 0.321533f, 0.570801f, 0.320312f, 0.563477f, + 0.317383f, 0.555664f, 0.315674f, 0.548340f, 0.311279f, 0.539551f, 0.308594f, 0.530273f, + 0.303467f, 0.520508f, 0.298584f, 0.510254f, 0.292969f, 0.499512f, 0.286377f, 0.487549f, + 0.279541f, 0.474609f, 0.271240f, 0.459961f, 0.262207f, 0.443359f, 0.251953f, 0.426270f, + 0.240967f, 0.406006f, 0.227417f, 0.383301f, 0.212891f, 0.357422f, 0.195557f, 0.326172f, + 0.175781f, 0.289551f, 0.150757f, 0.242554f, 0.118347f, 0.176025f, 0.069946f, 0.064331f, + 0.000000f, 1.000000f, 0.017212f, 0.991211f, 0.034332f, 0.979004f, 0.050720f, 0.965332f, + 0.067261f, 0.950684f, 0.083008f, 0.936035f, 0.097900f, 0.921387f, 0.112122f, 0.907715f, + 0.126099f, 0.893066f, 0.139648f, 0.878418f, 0.152710f, 0.864258f, 0.164917f, 0.851074f, + 0.177246f, 0.836914f, 0.187500f, 0.824707f, 0.199219f, 0.811035f, 0.209229f, 0.798828f, + 0.219604f, 0.786621f, 0.229004f, 0.774414f, 0.238525f, 0.762695f, 0.246704f, 0.751465f, + 0.255371f, 0.740234f, 0.262207f, 0.729980f, 0.270264f, 0.719238f, 0.278076f, 0.708984f, + 0.284424f, 0.698730f, 0.289795f, 0.689453f, 0.296143f, 0.680176f, 0.301270f, 0.670898f, + 0.304932f, 0.662598f, 0.311035f, 0.653809f, 0.315430f, 0.645508f, 0.318848f, 0.637695f, + 0.323242f, 0.629395f, 0.326904f, 0.621582f, 0.329102f, 0.614746f, 0.330322f, 0.608398f, + 0.333008f, 0.601562f, 0.333984f, 0.595703f, 0.334961f, 0.588867f, 0.335693f, 0.582520f, + 0.335938f, 0.576172f, 0.335449f, 0.569336f, 0.333984f, 0.562500f, 0.333496f, 0.555664f, + 0.332520f, 0.547852f, 0.329346f, 0.540039f, 0.326904f, 0.531250f, 0.324219f, 0.521973f, + 0.320312f, 0.513184f, 0.315918f, 0.502930f, 0.311279f, 0.492188f, 0.304932f, 0.479980f, + 0.298828f, 0.467529f, 0.291504f, 0.452881f, 0.282471f, 0.437012f, 0.273926f, 0.419189f, + 0.262207f, 0.399170f, 0.250244f, 0.376953f, 0.236206f, 0.351318f, 0.220337f, 0.321045f, + 0.199829f, 0.284668f, 0.175781f, 0.238403f, 0.143066f, 0.173706f, 0.092285f, 0.063904f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.034607f, 0.978516f, 0.050629f, 0.965332f, + 0.067017f, 0.951172f, 0.083618f, 0.936035f, 0.098633f, 0.921387f, 0.112732f, 0.906738f, + 0.127319f, 0.892090f, 0.140503f, 0.877930f, 0.153442f, 0.863770f, 0.166260f, 0.850098f, + 0.178223f, 0.836914f, 0.190186f, 0.823242f, 0.200928f, 0.810059f, 0.211914f, 0.797363f, + 0.221680f, 0.785156f, 0.231567f, 0.772461f, 0.242065f, 0.760742f, 0.250488f, 0.749023f, + 0.259277f, 0.737305f, 0.267334f, 0.726562f, 0.274902f, 0.715820f, 0.281250f, 0.705566f, + 0.289307f, 0.695312f, 0.296387f, 0.685059f, 0.302734f, 0.674805f, 0.308350f, 0.665527f, + 0.313721f, 0.656738f, 0.319580f, 0.647461f, 0.323975f, 0.639160f, 0.327393f, 0.631348f, + 0.332031f, 0.623047f, 0.335205f, 0.615723f, 0.337646f, 0.608398f, 0.340576f, 0.601562f, + 0.343262f, 0.594727f, 0.344482f, 0.588379f, 0.346191f, 0.582031f, 0.347656f, 0.574707f, + 0.347656f, 0.568359f, 0.347900f, 0.561523f, 0.348389f, 0.554688f, 0.346924f, 0.547363f, + 0.346924f, 0.539551f, 0.344482f, 0.531738f, 0.343018f, 0.523926f, 0.340820f, 0.514160f, + 0.336670f, 0.504883f, 0.333252f, 0.494629f, 0.328613f, 0.483887f, 0.324219f, 0.471436f, + 0.318115f, 0.458740f, 0.312012f, 0.444336f, 0.303467f, 0.429199f, 0.295410f, 0.411377f, + 0.285156f, 0.392090f, 0.273438f, 0.370117f, 0.260254f, 0.344971f, 0.244507f, 0.315674f, + 0.225342f, 0.280273f, 0.201660f, 0.234497f, 0.169434f, 0.170410f, 0.117493f, 0.062866f, + 0.000000f, 1.000000f, 0.017044f, 0.991211f, 0.034515f, 0.978516f, 0.051208f, 0.964844f, + 0.067200f, 0.950684f, 0.083496f, 0.936035f, 0.099304f, 0.920898f, 0.113525f, 0.906738f, + 0.127930f, 0.892090f, 0.141357f, 0.877441f, 0.154419f, 0.863281f, 0.167725f, 0.849121f, + 0.180298f, 0.835449f, 0.191528f, 0.821777f, 0.202515f, 0.809082f, 0.214233f, 0.795410f, + 0.224854f, 0.782715f, 0.235474f, 0.770508f, 0.244751f, 0.758301f, 0.254150f, 0.746094f, + 0.262695f, 0.734863f, 0.272705f, 0.723145f, 0.280518f, 0.711914f, 0.288330f, 0.701172f, + 0.295166f, 0.690918f, 0.301270f, 0.681152f, 0.309082f, 0.670898f, 0.315186f, 0.661133f, + 0.321045f, 0.651855f, 0.324951f, 0.643555f, 0.331787f, 0.634277f, 0.335938f, 0.625977f, + 0.339600f, 0.618164f, 0.343262f, 0.609863f, 0.347656f, 0.602051f, 0.350830f, 0.594727f, + 0.353271f, 0.588379f, 0.355469f, 0.581055f, 0.357178f, 0.574707f, 0.358887f, 0.567383f, + 0.360352f, 0.560547f, 0.361328f, 0.553711f, 0.361328f, 0.546387f, 0.361572f, 0.539062f, + 0.361572f, 0.530762f, 0.361084f, 0.522949f, 0.359375f, 0.514160f, 0.356689f, 0.504883f, + 0.354980f, 0.495850f, 0.350830f, 0.486084f, 0.347900f, 0.475098f, 0.344238f, 0.463379f, + 0.337891f, 0.450439f, 0.331787f, 0.437012f, 0.325195f, 0.421387f, 0.317383f, 0.404297f, + 0.309082f, 0.384766f, 0.297363f, 0.363037f, 0.285156f, 0.338623f, 0.269531f, 0.309326f, + 0.251709f, 0.274658f, 0.228149f, 0.230713f, 0.196655f, 0.167969f, 0.145020f, 0.062622f, + 0.000000f, 1.000000f, 0.016602f, 0.991699f, 0.034302f, 0.979004f, 0.051178f, 0.965332f, + 0.067322f, 0.950684f, 0.083618f, 0.936035f, 0.098694f, 0.921387f, 0.113586f, 0.906738f, + 0.128174f, 0.891602f, 0.142944f, 0.876465f, 0.155762f, 0.862793f, 0.169189f, 0.848145f, + 0.182007f, 0.833984f, 0.193604f, 0.820801f, 0.206299f, 0.806641f, 0.217285f, 0.793457f, + 0.228149f, 0.780762f, 0.238647f, 0.767578f, 0.249512f, 0.755371f, 0.257812f, 0.743652f, + 0.266602f, 0.731934f, 0.276123f, 0.720215f, 0.283203f, 0.709473f, 0.292725f, 0.698242f, + 0.300537f, 0.687500f, 0.307129f, 0.677246f, 0.314453f, 0.667480f, 0.321045f, 0.657227f, + 0.326660f, 0.647949f, 0.332764f, 0.638672f, 0.338379f, 0.629395f, 0.343018f, 0.620605f, + 0.347168f, 0.612793f, 0.353271f, 0.603516f, 0.357178f, 0.595703f, 0.359619f, 0.588379f, + 0.363525f, 0.581055f, 0.367188f, 0.573242f, 0.369385f, 0.566406f, 0.372070f, 0.559082f, + 0.372803f, 0.551758f, 0.375000f, 0.544434f, 0.375000f, 0.537598f, 0.376465f, 0.530273f, + 0.376465f, 0.521973f, 0.375977f, 0.514160f, 0.375000f, 0.505371f, 0.374268f, 0.497314f, + 0.372314f, 0.487549f, 0.369629f, 0.477783f, 0.366699f, 0.465820f, 0.363525f, 0.454590f, + 0.358398f, 0.441406f, 0.354004f, 0.427979f, 0.347168f, 0.412842f, 0.340088f, 0.396484f, + 0.331787f, 0.377686f, 0.321533f, 0.356201f, 0.309326f, 0.331787f, 0.296143f, 0.303711f, + 0.278320f, 0.269043f, 0.256104f, 0.226440f, 0.225586f, 0.165283f, 0.173584f, 0.061523f, + 0.000000f, 1.000000f, 0.016647f, 0.991699f, 0.033936f, 0.979004f, 0.050934f, 0.965332f, + 0.067566f, 0.950684f, 0.083801f, 0.936035f, 0.099915f, 0.920410f, 0.115051f, 0.905762f, + 0.129272f, 0.890625f, 0.143677f, 0.876465f, 0.157593f, 0.861328f, 0.170532f, 0.847168f, + 0.183716f, 0.833008f, 0.196289f, 0.818359f, 0.208740f, 0.805176f, 0.219238f, 0.791992f, + 0.230957f, 0.778320f, 0.241821f, 0.765625f, 0.251465f, 0.753418f, 0.261475f, 0.741211f, + 0.271240f, 0.729004f, 0.279785f, 0.717773f, 0.289795f, 0.706055f, 0.296875f, 0.695312f, + 0.305176f, 0.684570f, 0.312744f, 0.673828f, 0.319824f, 0.663574f, 0.327148f, 0.653320f, + 0.333496f, 0.643555f, 0.340332f, 0.633301f, 0.346436f, 0.624023f, 0.352051f, 0.614746f, + 0.357422f, 0.605957f, 0.362549f, 0.597168f, 0.366455f, 0.588867f, 0.370850f, 0.580566f, + 0.374268f, 0.572754f, 0.378174f, 0.565430f, 0.381104f, 0.558105f, 0.384277f, 0.551270f, + 0.385498f, 0.543945f, 0.386963f, 0.537109f, 0.389893f, 0.529297f, 0.389648f, 0.521484f, + 0.391357f, 0.513184f, 0.392090f, 0.504395f, 0.391602f, 0.496338f, 0.390869f, 0.487549f, + 0.388672f, 0.478027f, 0.387207f, 0.468018f, 0.385254f, 0.456787f, 0.382568f, 0.446289f, + 0.379150f, 0.433105f, 0.374268f, 0.418945f, 0.368652f, 0.404541f, 0.362549f, 0.387451f, + 0.354980f, 0.369629f, 0.345947f, 0.348389f, 0.336182f, 0.324707f, 0.322998f, 0.297119f, + 0.306152f, 0.263916f, 0.285889f, 0.221436f, 0.255859f, 0.161743f, 0.203735f, 0.060760f, + 0.000000f, 1.000000f, 0.016815f, 0.991699f, 0.034088f, 0.979004f, 0.051514f, 0.964844f, + 0.068787f, 0.950195f, 0.083984f, 0.936035f, 0.099487f, 0.920898f, 0.115906f, 0.904785f, + 0.129517f, 0.890625f, 0.144287f, 0.875488f, 0.158936f, 0.860352f, 0.172974f, 0.845215f, + 0.185669f, 0.831055f, 0.197876f, 0.817383f, 0.210449f, 0.803711f, 0.221802f, 0.790527f, + 0.232788f, 0.777344f, 0.244385f, 0.764160f, 0.254395f, 0.751465f, 0.264404f, 0.739258f, + 0.274658f, 0.727051f, 0.283936f, 0.715332f, 0.293457f, 0.703613f, 0.302490f, 0.691895f, + 0.310303f, 0.681152f, 0.318848f, 0.669922f, 0.326172f, 0.659180f, 0.334229f, 0.648438f, + 0.341309f, 0.638184f, 0.347656f, 0.628418f, 0.353760f, 0.618652f, 0.361328f, 0.608887f, + 0.366211f, 0.600098f, 0.370361f, 0.591309f, 0.375977f, 0.582520f, 0.381592f, 0.573730f, + 0.384766f, 0.565918f, 0.388672f, 0.558105f, 0.392822f, 0.550293f, 0.395996f, 0.542480f, + 0.399414f, 0.535156f, 0.401367f, 0.527832f, 0.403320f, 0.520020f, 0.405273f, 0.512207f, + 0.406250f, 0.504395f, 0.407227f, 0.495850f, 0.407959f, 0.487793f, 0.408447f, 0.478271f, + 0.407959f, 0.468994f, 0.406250f, 0.458496f, 0.405518f, 0.447754f, 0.402588f, 0.436523f, + 0.399902f, 0.423828f, 0.395752f, 0.410400f, 0.392578f, 0.395996f, 0.386475f, 0.379150f, + 0.379150f, 0.361328f, 0.372070f, 0.341064f, 0.361816f, 0.317383f, 0.349854f, 0.290527f, + 0.333984f, 0.258057f, 0.315430f, 0.216797f, 0.285889f, 0.158936f, 0.235107f, 0.058167f, + 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051239f, 0.965332f, + 0.068054f, 0.950195f, 0.084473f, 0.935547f, 0.100037f, 0.920410f, 0.116028f, 0.904785f, + 0.131470f, 0.889160f, 0.145996f, 0.874023f, 0.160278f, 0.859375f, 0.173584f, 0.845215f, + 0.187744f, 0.830078f, 0.199829f, 0.816406f, 0.212646f, 0.802246f, 0.224365f, 0.789062f, + 0.236206f, 0.775391f, 0.246460f, 0.762695f, 0.257568f, 0.749512f, 0.268311f, 0.736816f, + 0.278564f, 0.724609f, 0.288574f, 0.712402f, 0.298828f, 0.700195f, 0.307617f, 0.687988f, + 0.315918f, 0.676758f, 0.324707f, 0.665527f, 0.333008f, 0.654785f, 0.340576f, 0.644043f, + 0.347656f, 0.633789f, 0.354004f, 0.623535f, 0.361572f, 0.613770f, 0.367920f, 0.604004f, + 0.374268f, 0.594238f, 0.380127f, 0.584961f, 0.386475f, 0.575684f, 0.392334f, 0.566406f, + 0.395996f, 0.558105f, 0.399658f, 0.549805f, 0.403809f, 0.541992f, 0.407715f, 0.534668f, + 0.411865f, 0.526855f, 0.414795f, 0.519043f, 0.417236f, 0.511230f, 0.420410f, 0.502930f, + 0.421631f, 0.494629f, 0.423828f, 0.486572f, 0.424072f, 0.478027f, 0.425293f, 0.468750f, + 0.424805f, 0.458984f, 0.424805f, 0.448730f, 0.424561f, 0.438232f, 0.421875f, 0.426758f, + 0.420410f, 0.414307f, 0.416748f, 0.401611f, 0.414795f, 0.386230f, 0.409912f, 0.370605f, + 0.403564f, 0.353027f, 0.396973f, 0.332764f, 0.387207f, 0.309814f, 0.376709f, 0.283203f, + 0.363037f, 0.250977f, 0.344727f, 0.211914f, 0.317139f, 0.154907f, 0.268311f, 0.057495f, + 0.000000f, 1.000000f, 0.016891f, 0.991699f, 0.034027f, 0.979004f, 0.051636f, 0.964844f, + 0.067871f, 0.950684f, 0.084351f, 0.935547f, 0.101257f, 0.919434f, 0.117004f, 0.904297f, + 0.132812f, 0.888672f, 0.147461f, 0.873047f, 0.161621f, 0.858398f, 0.175415f, 0.843750f, + 0.188232f, 0.829590f, 0.199951f, 0.816406f, 0.214233f, 0.801270f, 0.226318f, 0.787598f, + 0.237793f, 0.774414f, 0.250732f, 0.760254f, 0.261963f, 0.747559f, 0.271729f, 0.734375f, + 0.283447f, 0.721680f, 0.293213f, 0.708984f, 0.303467f, 0.697266f, 0.312500f, 0.685059f, + 0.321289f, 0.673340f, 0.330322f, 0.661621f, 0.338867f, 0.650879f, 0.346924f, 0.639648f, + 0.355957f, 0.628418f, 0.363281f, 0.618164f, 0.370117f, 0.607910f, 0.375977f, 0.598145f, + 0.383301f, 0.587891f, 0.390869f, 0.578125f, 0.395020f, 0.569336f, 0.401611f, 0.559570f, + 0.406982f, 0.550781f, 0.411621f, 0.541992f, 0.416504f, 0.534180f, 0.421143f, 0.525391f, + 0.425049f, 0.517578f, 0.429199f, 0.509277f, 0.431396f, 0.501465f, 0.434814f, 0.493408f, + 0.437500f, 0.485107f, 0.438965f, 0.476807f, 0.441895f, 0.467529f, 0.442627f, 0.458984f, + 0.442871f, 0.449219f, 0.443359f, 0.439453f, 0.443848f, 0.427979f, 0.443115f, 0.416992f, + 0.441650f, 0.404785f, 0.439209f, 0.392334f, 0.437012f, 0.376953f, 0.433594f, 0.361328f, + 0.427490f, 0.344238f, 0.422363f, 0.324463f, 0.414307f, 0.302002f, 0.405029f, 0.276611f, + 0.391846f, 0.244995f, 0.374756f, 0.206055f, 0.348633f, 0.151367f, 0.302490f, 0.056274f, + 0.000000f, 1.000000f, 0.016785f, 0.991699f, 0.034454f, 0.979004f, 0.051300f, 0.965332f, + 0.068359f, 0.950195f, 0.085144f, 0.934570f, 0.101685f, 0.918945f, 0.118408f, 0.902832f, + 0.133423f, 0.887695f, 0.148560f, 0.873047f, 0.161987f, 0.858398f, 0.176270f, 0.843750f, + 0.189941f, 0.829102f, 0.204346f, 0.813965f, 0.216919f, 0.799805f, 0.229126f, 0.786133f, + 0.241455f, 0.772461f, 0.252686f, 0.758301f, 0.265137f, 0.745117f, 0.276611f, 0.731445f, + 0.286865f, 0.718750f, 0.297607f, 0.706543f, 0.308105f, 0.693359f, 0.316650f, 0.682129f, + 0.326172f, 0.670410f, 0.336914f, 0.657715f, 0.345703f, 0.646484f, 0.353516f, 0.635254f, + 0.362549f, 0.624023f, 0.370605f, 0.613281f, 0.377686f, 0.602539f, 0.385254f, 0.592285f, + 0.392334f, 0.582031f, 0.398926f, 0.572266f, 0.405029f, 0.562500f, 0.410645f, 0.553223f, + 0.417725f, 0.542969f, 0.423584f, 0.534180f, 0.428467f, 0.525391f, 0.432861f, 0.517090f, + 0.438477f, 0.508301f, 0.443115f, 0.500000f, 0.446045f, 0.492432f, 0.449463f, 0.483887f, + 0.452881f, 0.475342f, 0.455078f, 0.467041f, 0.458740f, 0.457520f, 0.459717f, 0.448486f, + 0.460938f, 0.438965f, 0.462646f, 0.428711f, 0.463135f, 0.418457f, 0.464355f, 0.406982f, + 0.462891f, 0.394531f, 0.460693f, 0.382324f, 0.459473f, 0.367432f, 0.456299f, 0.352295f, + 0.453369f, 0.334473f, 0.448242f, 0.315674f, 0.441162f, 0.294189f, 0.433350f, 0.268799f, + 0.421387f, 0.238403f, 0.405518f, 0.200195f, 0.382080f, 0.146362f, 0.337402f, 0.054291f, + 0.000000f, 1.000000f, 0.016983f, 0.991211f, 0.034607f, 0.978516f, 0.051331f, 0.964844f, + 0.068726f, 0.950195f, 0.086365f, 0.934082f, 0.102539f, 0.918457f, 0.118408f, 0.902832f, + 0.134033f, 0.887695f, 0.147705f, 0.873535f, 0.163452f, 0.857910f, 0.177856f, 0.842773f, + 0.191406f, 0.828125f, 0.204712f, 0.813477f, 0.217651f, 0.798828f, 0.231689f, 0.784180f, + 0.244263f, 0.770020f, 0.256348f, 0.756348f, 0.267578f, 0.743164f, 0.280273f, 0.729492f, + 0.290527f, 0.716797f, 0.302002f, 0.703613f, 0.312012f, 0.690918f, 0.322754f, 0.678223f, + 0.333008f, 0.666016f, 0.342773f, 0.653809f, 0.352539f, 0.642090f, 0.360107f, 0.630371f, + 0.369141f, 0.619141f, 0.379150f, 0.607422f, 0.386475f, 0.596680f, 0.393555f, 0.586426f, + 0.401855f, 0.575684f, 0.409180f, 0.565430f, 0.416260f, 0.555176f, 0.422363f, 0.545410f, + 0.429443f, 0.535645f, 0.434326f, 0.526367f, 0.439941f, 0.517090f, 0.446045f, 0.507812f, + 0.451904f, 0.499268f, 0.455078f, 0.491455f, 0.461670f, 0.481934f, 0.464844f, 0.474365f, + 0.468262f, 0.465088f, 0.471680f, 0.456543f, 0.475098f, 0.447021f, 0.477783f, 0.438232f, + 0.479980f, 0.428467f, 0.482422f, 0.417969f, 0.483643f, 0.407471f, 0.483643f, 0.396240f, + 0.484131f, 0.385010f, 0.483643f, 0.371582f, 0.482666f, 0.357910f, 0.480469f, 0.342285f, + 0.478516f, 0.325684f, 0.473145f, 0.306641f, 0.468506f, 0.285156f, 0.460693f, 0.260986f, + 0.451660f, 0.231201f, 0.436768f, 0.194458f, 0.415283f, 0.141968f, 0.373047f, 0.053589f, + 0.000000f, 1.000000f, 0.016998f, 0.991211f, 0.034210f, 0.979004f, 0.052094f, 0.964355f, + 0.069275f, 0.949219f, 0.086426f, 0.933594f, 0.102783f, 0.918457f, 0.118774f, 0.902832f, + 0.134521f, 0.887695f, 0.149170f, 0.872559f, 0.164673f, 0.856934f, 0.178589f, 0.842285f, + 0.193604f, 0.826660f, 0.208252f, 0.811035f, 0.221802f, 0.796875f, 0.234985f, 0.782227f, + 0.246216f, 0.769043f, 0.259033f, 0.754883f, 0.272217f, 0.740234f, 0.283447f, 0.727539f, + 0.295898f, 0.713379f, 0.305908f, 0.700684f, 0.317139f, 0.687500f, 0.328125f, 0.674805f, + 0.338135f, 0.662109f, 0.347168f, 0.650391f, 0.358154f, 0.638184f, 0.367432f, 0.625977f, + 0.377686f, 0.614258f, 0.385254f, 0.603027f, 0.393555f, 0.591797f, 0.402100f, 0.580566f, + 0.411621f, 0.569824f, 0.419189f, 0.558594f, 0.425781f, 0.548340f, 0.432861f, 0.538086f, + 0.439941f, 0.528320f, 0.446777f, 0.518066f, 0.453369f, 0.508301f, 0.458252f, 0.499512f, + 0.464111f, 0.490479f, 0.469971f, 0.481201f, 0.475342f, 0.472412f, 0.479736f, 0.464111f, + 0.484375f, 0.455566f, 0.488281f, 0.445801f, 0.492188f, 0.437012f, 0.496094f, 0.427002f, + 0.498291f, 0.417725f, 0.501465f, 0.407227f, 0.503906f, 0.396484f, 0.504883f, 0.385742f, + 0.506348f, 0.373535f, 0.504883f, 0.361084f, 0.506348f, 0.347656f, 0.505371f, 0.332031f, + 0.503418f, 0.316162f, 0.500488f, 0.297363f, 0.495117f, 0.277344f, 0.489746f, 0.252686f, + 0.481934f, 0.224121f, 0.468018f, 0.187988f, 0.448242f, 0.137451f, 0.409912f, 0.051300f, + 0.000000f, 1.000000f, 0.016922f, 0.991211f, 0.034454f, 0.978516f, 0.052185f, 0.964355f, + 0.070251f, 0.948242f, 0.087158f, 0.933105f, 0.104004f, 0.917969f, 0.119263f, 0.902832f, + 0.135132f, 0.887695f, 0.150391f, 0.872070f, 0.166138f, 0.855957f, 0.180908f, 0.840820f, + 0.195557f, 0.825195f, 0.209229f, 0.810547f, 0.223511f, 0.795410f, 0.235962f, 0.781250f, + 0.250000f, 0.766602f, 0.263184f, 0.752441f, 0.274414f, 0.738281f, 0.287354f, 0.724609f, + 0.298584f, 0.710938f, 0.311279f, 0.697754f, 0.321777f, 0.684570f, 0.333008f, 0.671387f, + 0.344238f, 0.658203f, 0.354736f, 0.645508f, 0.364258f, 0.633789f, 0.374512f, 0.621094f, + 0.384033f, 0.609375f, 0.393555f, 0.597168f, 0.402100f, 0.585938f, 0.410889f, 0.574707f, + 0.418701f, 0.563965f, 0.427979f, 0.552246f, 0.436279f, 0.541504f, 0.444092f, 0.530762f, + 0.451416f, 0.520508f, 0.458008f, 0.510742f, 0.465820f, 0.500000f, 0.471680f, 0.490234f, + 0.478027f, 0.480957f, 0.484375f, 0.471680f, 0.489502f, 0.462402f, 0.494873f, 0.453369f, + 0.500000f, 0.444824f, 0.504883f, 0.435059f, 0.509766f, 0.425537f, 0.513672f, 0.416504f, + 0.517090f, 0.406250f, 0.520508f, 0.396484f, 0.522461f, 0.385986f, 0.525879f, 0.374756f, + 0.527344f, 0.363281f, 0.528809f, 0.350586f, 0.529297f, 0.336914f, 0.529785f, 0.322021f, + 0.528809f, 0.305420f, 0.525879f, 0.288086f, 0.522461f, 0.267578f, 0.518066f, 0.244263f, + 0.511230f, 0.216553f, 0.500000f, 0.181641f, 0.482910f, 0.132812f, 0.446777f, 0.049377f, + 0.000000f, 1.000000f, 0.016632f, 0.991699f, 0.034515f, 0.978516f, 0.051971f, 0.964355f, + 0.070496f, 0.948242f, 0.087646f, 0.933105f, 0.103149f, 0.918457f, 0.120117f, 0.902344f, + 0.135864f, 0.886719f, 0.151733f, 0.871094f, 0.167358f, 0.854980f, 0.182983f, 0.839355f, + 0.196411f, 0.824707f, 0.210815f, 0.809570f, 0.224854f, 0.794434f, 0.239380f, 0.779297f, + 0.252930f, 0.764648f, 0.265381f, 0.750488f, 0.277588f, 0.736328f, 0.291748f, 0.722168f, + 0.303955f, 0.708008f, 0.315430f, 0.694336f, 0.327148f, 0.680664f, 0.338135f, 0.667969f, + 0.349609f, 0.654785f, 0.361328f, 0.641602f, 0.370850f, 0.628906f, 0.380615f, 0.616699f, + 0.391357f, 0.604492f, 0.400879f, 0.592285f, 0.411377f, 0.580078f, 0.420654f, 0.568359f, + 0.429199f, 0.556641f, 0.436523f, 0.545898f, 0.445801f, 0.534668f, 0.453857f, 0.523926f, + 0.462402f, 0.512695f, 0.469482f, 0.502930f, 0.478027f, 0.491943f, 0.485107f, 0.481689f, + 0.491699f, 0.471436f, 0.498535f, 0.461670f, 0.504395f, 0.452393f, 0.510254f, 0.442627f, + 0.515625f, 0.433594f, 0.521973f, 0.424316f, 0.526367f, 0.414795f, 0.530762f, 0.405273f, + 0.535645f, 0.395020f, 0.539062f, 0.385254f, 0.543457f, 0.374268f, 0.546875f, 0.363037f, + 0.549316f, 0.351807f, 0.551758f, 0.339111f, 0.552734f, 0.326416f, 0.554199f, 0.311279f, + 0.554199f, 0.295410f, 0.553223f, 0.278076f, 0.551270f, 0.258545f, 0.548340f, 0.235718f, + 0.541992f, 0.208008f, 0.531738f, 0.175049f, 0.516113f, 0.127808f, 0.482422f, 0.047516f, + 0.000000f, 1.000000f, 0.016479f, 0.991699f, 0.034515f, 0.978516f, 0.053406f, 0.962891f, + 0.070190f, 0.948730f, 0.088135f, 0.933105f, 0.103577f, 0.918457f, 0.120361f, 0.902832f, + 0.136719f, 0.886230f, 0.152954f, 0.870117f, 0.168457f, 0.854492f, 0.184326f, 0.838867f, + 0.197754f, 0.823730f, 0.212769f, 0.808594f, 0.228760f, 0.792480f, 0.241699f, 0.778320f, + 0.255127f, 0.763184f, 0.269043f, 0.748535f, 0.282715f, 0.733887f, 0.294434f, 0.719727f, + 0.307861f, 0.705078f, 0.318848f, 0.691895f, 0.332031f, 0.678223f, 0.343994f, 0.664062f, + 0.354492f, 0.650879f, 0.367188f, 0.637695f, 0.376953f, 0.625000f, 0.389160f, 0.611816f, + 0.398926f, 0.599121f, 0.408691f, 0.586914f, 0.419922f, 0.574219f, 0.428955f, 0.562988f, + 0.437744f, 0.550781f, 0.446533f, 0.539062f, 0.455566f, 0.527832f, 0.466309f, 0.515625f, + 0.473145f, 0.505371f, 0.482422f, 0.493896f, 0.490234f, 0.483154f, 0.497070f, 0.472900f, + 0.505371f, 0.462158f, 0.511230f, 0.452393f, 0.519043f, 0.441650f, 0.524902f, 0.432373f, + 0.533203f, 0.422363f, 0.537598f, 0.413086f, 0.544922f, 0.403564f, 0.549316f, 0.393066f, + 0.555664f, 0.383057f, 0.559570f, 0.373047f, 0.564453f, 0.362305f, 0.568359f, 0.351562f, + 0.570312f, 0.340332f, 0.573730f, 0.327637f, 0.576660f, 0.314697f, 0.578613f, 0.299561f, + 0.579590f, 0.284668f, 0.579590f, 0.268311f, 0.580078f, 0.247925f, 0.577148f, 0.226807f, + 0.572754f, 0.200439f, 0.563965f, 0.167725f, 0.551270f, 0.123474f, 0.520020f, 0.045990f, + 0.000000f, 1.000000f, 0.016113f, 0.992188f, 0.034698f, 0.978516f, 0.053680f, 0.962891f, + 0.071106f, 0.948242f, 0.087952f, 0.933105f, 0.103760f, 0.918457f, 0.120850f, 0.902344f, + 0.137939f, 0.885742f, 0.154175f, 0.869629f, 0.169434f, 0.854004f, 0.184814f, 0.838379f, + 0.200317f, 0.822754f, 0.216064f, 0.806641f, 0.229492f, 0.791504f, 0.244385f, 0.776367f, + 0.258789f, 0.761230f, 0.271729f, 0.746582f, 0.285889f, 0.731934f, 0.298584f, 0.717285f, + 0.311279f, 0.702637f, 0.324951f, 0.688477f, 0.337402f, 0.674316f, 0.348877f, 0.660645f, + 0.360840f, 0.647461f, 0.373047f, 0.633301f, 0.384277f, 0.620117f, 0.394043f, 0.607422f, + 0.406250f, 0.594238f, 0.416504f, 0.581543f, 0.427734f, 0.568848f, 0.437988f, 0.556641f, + 0.448730f, 0.543945f, 0.457031f, 0.532227f, 0.466553f, 0.520508f, 0.476562f, 0.508301f, + 0.485840f, 0.497070f, 0.493896f, 0.486084f, 0.502441f, 0.474854f, 0.510254f, 0.463867f, + 0.518555f, 0.453369f, 0.527344f, 0.441650f, 0.533691f, 0.431885f, 0.541992f, 0.421143f, + 0.548340f, 0.411133f, 0.555176f, 0.401367f, 0.561035f, 0.391602f, 0.568359f, 0.381592f, + 0.572266f, 0.371582f, 0.578613f, 0.360840f, 0.583496f, 0.350586f, 0.589844f, 0.339355f, + 0.593262f, 0.327393f, 0.596680f, 0.315430f, 0.600098f, 0.302490f, 0.602539f, 0.288818f, + 0.605469f, 0.273438f, 0.606934f, 0.256836f, 0.606934f, 0.238281f, 0.604980f, 0.217285f, + 0.604004f, 0.191895f, 0.597168f, 0.160522f, 0.584961f, 0.117798f, 0.556641f, 0.044098f, + 0.000000f, 1.000000f, 0.016373f, 0.991699f, 0.034668f, 0.978516f, 0.053589f, 0.963379f, + 0.070435f, 0.949219f, 0.087769f, 0.933594f, 0.104797f, 0.917480f, 0.122681f, 0.900879f, + 0.138794f, 0.885254f, 0.153687f, 0.870117f, 0.170044f, 0.853516f, 0.186768f, 0.836914f, + 0.202271f, 0.821289f, 0.217651f, 0.805664f, 0.231812f, 0.790039f, 0.246704f, 0.774414f, + 0.260254f, 0.759766f, 0.275391f, 0.744141f, 0.288574f, 0.729492f, 0.303467f, 0.714355f, + 0.315186f, 0.700195f, 0.329590f, 0.685547f, 0.341064f, 0.671387f, 0.354736f, 0.657227f, + 0.366455f, 0.643066f, 0.379639f, 0.629395f, 0.391846f, 0.615723f, 0.402344f, 0.602539f, + 0.413330f, 0.589355f, 0.424805f, 0.576172f, 0.434570f, 0.563477f, 0.445557f, 0.550781f, + 0.457031f, 0.538086f, 0.466553f, 0.525879f, 0.477295f, 0.513184f, 0.486816f, 0.501465f, + 0.496094f, 0.489502f, 0.505859f, 0.477539f, 0.515625f, 0.465820f, 0.523926f, 0.454834f, + 0.532715f, 0.443359f, 0.540527f, 0.432617f, 0.548828f, 0.421631f, 0.557129f, 0.410645f, + 0.564453f, 0.400146f, 0.572266f, 0.389404f, 0.579590f, 0.379395f, 0.585449f, 0.369873f, + 0.592285f, 0.359619f, 0.598633f, 0.348389f, 0.604980f, 0.337891f, 0.609375f, 0.326904f, + 0.615723f, 0.315186f, 0.619141f, 0.303223f, 0.623535f, 0.290283f, 0.627930f, 0.276855f, + 0.631348f, 0.262207f, 0.633789f, 0.246460f, 0.634766f, 0.227783f, 0.634277f, 0.207397f, + 0.633301f, 0.182617f, 0.627930f, 0.153076f, 0.618652f, 0.112427f, 0.597168f, 0.042389f, + 0.000000f, 1.000000f, 0.016586f, 0.991699f, 0.035858f, 0.977051f, 0.053131f, 0.963867f, + 0.070496f, 0.949219f, 0.088135f, 0.933105f, 0.105225f, 0.917480f, 0.122559f, 0.900879f, + 0.139160f, 0.884766f, 0.156372f, 0.868652f, 0.172485f, 0.852051f, 0.187988f, 0.836426f, + 0.203735f, 0.820801f, 0.219604f, 0.804199f, 0.234985f, 0.788574f, 0.248535f, 0.773438f, + 0.264648f, 0.757324f, 0.278809f, 0.742188f, 0.293213f, 0.726562f, 0.306885f, 0.711914f, + 0.321045f, 0.696777f, 0.333252f, 0.682617f, 0.346924f, 0.667969f, 0.360107f, 0.653320f, + 0.372314f, 0.639160f, 0.385742f, 0.625000f, 0.396484f, 0.611816f, 0.409424f, 0.597656f, + 0.421143f, 0.584473f, 0.433838f, 0.570312f, 0.444336f, 0.557617f, 0.456299f, 0.544434f, + 0.466553f, 0.531738f, 0.477295f, 0.519043f, 0.488037f, 0.506348f, 0.498779f, 0.493652f, + 0.508301f, 0.481689f, 0.519043f, 0.469238f, 0.527832f, 0.457520f, 0.538086f, 0.445312f, + 0.544922f, 0.434326f, 0.555664f, 0.422607f, 0.564453f, 0.411133f, 0.572266f, 0.400146f, + 0.581543f, 0.388672f, 0.588379f, 0.378418f, 0.596680f, 0.367432f, 0.603516f, 0.357178f, + 0.611328f, 0.346436f, 0.618652f, 0.336182f, 0.624023f, 0.324951f, 0.631348f, 0.313965f, + 0.637695f, 0.302246f, 0.642090f, 0.290771f, 0.646973f, 0.278076f, 0.652344f, 0.264648f, + 0.656738f, 0.250244f, 0.660156f, 0.234253f, 0.662598f, 0.216431f, 0.664551f, 0.197266f, + 0.664062f, 0.174194f, 0.661133f, 0.145386f, 0.653809f, 0.106384f, 0.632324f, 0.039246f, + 0.000000f, 1.000000f, 0.016739f, 0.991211f, 0.036163f, 0.977051f, 0.053284f, 0.963867f, + 0.071106f, 0.948730f, 0.088806f, 0.932617f, 0.105652f, 0.916992f, 0.122620f, 0.900879f, + 0.139771f, 0.884766f, 0.156616f, 0.867676f, 0.172852f, 0.852051f, 0.188599f, 0.835938f, + 0.206177f, 0.818848f, 0.220703f, 0.803223f, 0.236450f, 0.787598f, 0.252441f, 0.770996f, + 0.267090f, 0.755859f, 0.281006f, 0.740234f, 0.296875f, 0.724609f, 0.309570f, 0.709961f, + 0.324463f, 0.694336f, 0.338379f, 0.679199f, 0.351562f, 0.664551f, 0.365967f, 0.649902f, + 0.379150f, 0.635254f, 0.391602f, 0.621094f, 0.404297f, 0.606934f, 0.416992f, 0.592773f, + 0.428955f, 0.579102f, 0.441406f, 0.564941f, 0.452881f, 0.551758f, 0.464844f, 0.538086f, + 0.476318f, 0.524902f, 0.487549f, 0.512207f, 0.498291f, 0.499268f, 0.507812f, 0.486816f, + 0.519531f, 0.473633f, 0.529297f, 0.461182f, 0.540527f, 0.448730f, 0.549805f, 0.437012f, + 0.560547f, 0.424316f, 0.570312f, 0.412598f, 0.578613f, 0.400879f, 0.588379f, 0.389404f, + 0.596680f, 0.377930f, 0.606445f, 0.365967f, 0.614258f, 0.355469f, 0.622070f, 0.344238f, + 0.630859f, 0.333252f, 0.638672f, 0.322754f, 0.645996f, 0.312012f, 0.652832f, 0.300293f, + 0.660645f, 0.289062f, 0.665527f, 0.277588f, 0.671875f, 0.265137f, 0.677246f, 0.251709f, + 0.681641f, 0.237915f, 0.687500f, 0.222046f, 0.690918f, 0.205688f, 0.692871f, 0.186523f, + 0.693848f, 0.164429f, 0.692871f, 0.137451f, 0.687012f, 0.100342f, 0.670898f, 0.037354f, + 0.000000f, 1.000000f, 0.016800f, 0.991211f, 0.036499f, 0.977051f, 0.053680f, 0.963867f, + 0.070740f, 0.948730f, 0.089417f, 0.932129f, 0.106201f, 0.916992f, 0.124146f, 0.899902f, + 0.141357f, 0.883789f, 0.158081f, 0.867188f, 0.174316f, 0.851074f, 0.190674f, 0.834473f, + 0.206421f, 0.818848f, 0.223022f, 0.802246f, 0.239136f, 0.785645f, 0.254639f, 0.770020f, + 0.270264f, 0.753906f, 0.284180f, 0.738281f, 0.299316f, 0.722656f, 0.314453f, 0.706543f, + 0.328857f, 0.691406f, 0.343262f, 0.676270f, 0.358154f, 0.660645f, 0.371826f, 0.645996f, + 0.384521f, 0.631348f, 0.398682f, 0.616699f, 0.411621f, 0.602051f, 0.423828f, 0.587891f, + 0.436279f, 0.574219f, 0.449951f, 0.559570f, 0.462402f, 0.545898f, 0.473389f, 0.532227f, + 0.485840f, 0.518555f, 0.497559f, 0.504883f, 0.508789f, 0.491943f, 0.520996f, 0.478516f, + 0.531250f, 0.465820f, 0.542480f, 0.452881f, 0.553711f, 0.439697f, 0.565430f, 0.427002f, + 0.574707f, 0.415039f, 0.584473f, 0.402832f, 0.594727f, 0.390381f, 0.604004f, 0.378662f, + 0.612793f, 0.366699f, 0.623535f, 0.354492f, 0.632324f, 0.343018f, 0.641113f, 0.331543f, + 0.649414f, 0.320312f, 0.658691f, 0.308838f, 0.665527f, 0.298340f, 0.674805f, 0.286865f, + 0.682129f, 0.275391f, 0.689941f, 0.263672f, 0.695801f, 0.252197f, 0.702637f, 0.238647f, + 0.708496f, 0.224976f, 0.713379f, 0.209839f, 0.718262f, 0.194214f, 0.723145f, 0.175781f, + 0.726074f, 0.155273f, 0.725586f, 0.129150f, 0.721191f, 0.093445f, 0.708496f, 0.035828f, + 0.000000f, 1.000000f, 0.016815f, 0.991211f, 0.035889f, 0.978027f, 0.053314f, 0.963867f, + 0.072266f, 0.947754f, 0.089172f, 0.932617f, 0.106995f, 0.916504f, 0.125122f, 0.899414f, + 0.141357f, 0.883789f, 0.158691f, 0.866699f, 0.176025f, 0.850098f, 0.192383f, 0.833496f, + 0.209351f, 0.816895f, 0.225708f, 0.800781f, 0.240845f, 0.784668f, 0.257080f, 0.768066f, + 0.272949f, 0.751953f, 0.288574f, 0.735352f, 0.303467f, 0.720215f, 0.317871f, 0.704102f, + 0.333740f, 0.688477f, 0.347168f, 0.673340f, 0.362305f, 0.658203f, 0.377197f, 0.642578f, + 0.389404f, 0.627930f, 0.403809f, 0.612793f, 0.418457f, 0.597656f, 0.431152f, 0.583008f, + 0.444336f, 0.568359f, 0.457275f, 0.554199f, 0.470459f, 0.540039f, 0.482666f, 0.525879f, + 0.495117f, 0.512207f, 0.506836f, 0.498535f, 0.519531f, 0.484863f, 0.531250f, 0.471191f, + 0.544434f, 0.457275f, 0.555176f, 0.444580f, 0.565430f, 0.431641f, 0.577148f, 0.418213f, + 0.587402f, 0.405762f, 0.599609f, 0.392334f, 0.609375f, 0.380127f, 0.620605f, 0.367432f, + 0.630371f, 0.355225f, 0.639648f, 0.343262f, 0.650391f, 0.330811f, 0.658691f, 0.319336f, + 0.668457f, 0.306885f, 0.677734f, 0.295410f, 0.687012f, 0.283691f, 0.695801f, 0.272705f, + 0.704102f, 0.261475f, 0.712402f, 0.249390f, 0.719238f, 0.237183f, 0.727051f, 0.224976f, + 0.733887f, 0.211426f, 0.741211f, 0.197021f, 0.745117f, 0.182251f, 0.750977f, 0.164185f, + 0.755371f, 0.144165f, 0.757324f, 0.119934f, 0.756836f, 0.087341f, 0.747070f, 0.032013f, + 0.000000f, 1.000000f, 0.017166f, 0.990723f, 0.035431f, 0.978516f, 0.053558f, 0.963867f, + 0.071533f, 0.948242f, 0.089539f, 0.932617f, 0.107849f, 0.915527f, 0.125122f, 0.899414f, + 0.142334f, 0.883301f, 0.160400f, 0.865723f, 0.176636f, 0.849609f, 0.193115f, 0.833008f, + 0.209717f, 0.816406f, 0.227417f, 0.799316f, 0.242676f, 0.783203f, 0.260010f, 0.766113f, + 0.276367f, 0.750000f, 0.291748f, 0.733398f, 0.307861f, 0.717773f, 0.322266f, 0.701660f, + 0.338623f, 0.685547f, 0.352539f, 0.669922f, 0.367432f, 0.654785f, 0.382812f, 0.638672f, + 0.396973f, 0.623535f, 0.410156f, 0.608398f, 0.424561f, 0.593262f, 0.438965f, 0.578125f, + 0.451660f, 0.563477f, 0.465820f, 0.548340f, 0.479736f, 0.534180f, 0.492188f, 0.519531f, + 0.505371f, 0.504883f, 0.518555f, 0.490967f, 0.530762f, 0.477295f, 0.541992f, 0.463379f, + 0.555664f, 0.449463f, 0.566406f, 0.436035f, 0.579102f, 0.422363f, 0.590820f, 0.408936f, + 0.602539f, 0.395508f, 0.614746f, 0.382080f, 0.626465f, 0.369385f, 0.635742f, 0.356934f, + 0.646973f, 0.343750f, 0.657227f, 0.331299f, 0.667480f, 0.318848f, 0.678711f, 0.306396f, + 0.687988f, 0.294189f, 0.698730f, 0.281494f, 0.708496f, 0.269531f, 0.717773f, 0.257568f, + 0.727539f, 0.245850f, 0.736328f, 0.234741f, 0.744141f, 0.222900f, 0.751953f, 0.210205f, + 0.760254f, 0.197510f, 0.768066f, 0.183472f, 0.774902f, 0.168091f, 0.780273f, 0.151489f, + 0.785156f, 0.133545f, 0.788574f, 0.111023f, 0.789551f, 0.080322f, 0.783203f, 0.028793f, + 0.000000f, 1.000000f, 0.017410f, 0.990234f, 0.035706f, 0.978027f, 0.053162f, 0.964355f, + 0.072021f, 0.948242f, 0.090149f, 0.932129f, 0.107239f, 0.916016f, 0.125000f, 0.899902f, + 0.143311f, 0.882812f, 0.161133f, 0.865723f, 0.177490f, 0.849121f, 0.196899f, 0.831543f, + 0.211670f, 0.814941f, 0.230225f, 0.797852f, 0.246826f, 0.780762f, 0.263184f, 0.764160f, + 0.279053f, 0.748047f, 0.294434f, 0.731934f, 0.310303f, 0.715332f, 0.325684f, 0.699219f, + 0.341797f, 0.683105f, 0.358398f, 0.666504f, 0.371826f, 0.651367f, 0.387207f, 0.635254f, + 0.403076f, 0.619141f, 0.417236f, 0.604004f, 0.431152f, 0.588867f, 0.445801f, 0.573242f, + 0.460205f, 0.558105f, 0.474609f, 0.542969f, 0.488037f, 0.528320f, 0.502930f, 0.513184f, + 0.516113f, 0.498535f, 0.528809f, 0.484131f, 0.541992f, 0.469727f, 0.555664f, 0.455078f, + 0.568848f, 0.440918f, 0.580566f, 0.427246f, 0.592285f, 0.413574f, 0.604492f, 0.399902f, + 0.616211f, 0.386230f, 0.627930f, 0.372559f, 0.641113f, 0.358887f, 0.652344f, 0.345703f, + 0.663574f, 0.332520f, 0.674316f, 0.319580f, 0.685547f, 0.306641f, 0.696289f, 0.293701f, + 0.707520f, 0.281006f, 0.718750f, 0.268066f, 0.729004f, 0.255371f, 0.738770f, 0.243164f, + 0.748047f, 0.231323f, 0.757812f, 0.218994f, 0.767578f, 0.207275f, 0.776367f, 0.195435f, + 0.784180f, 0.182495f, 0.792969f, 0.169556f, 0.802734f, 0.154785f, 0.809570f, 0.138794f, + 0.814941f, 0.121826f, 0.820801f, 0.101318f, 0.823730f, 0.072754f, 0.820801f, 0.027664f, + 0.000000f, 1.000000f, 0.018005f, 0.990234f, 0.035400f, 0.978516f, 0.054352f, 0.962891f, + 0.071411f, 0.948730f, 0.090088f, 0.932129f, 0.108276f, 0.916016f, 0.126587f, 0.898926f, + 0.144775f, 0.881836f, 0.161987f, 0.864746f, 0.179077f, 0.848145f, 0.197144f, 0.831055f, + 0.214844f, 0.813477f, 0.230225f, 0.797363f, 0.248901f, 0.779785f, 0.264160f, 0.763184f, + 0.281250f, 0.746582f, 0.297363f, 0.729492f, 0.314209f, 0.712891f, 0.329590f, 0.696289f, + 0.346680f, 0.679688f, 0.362061f, 0.663574f, 0.378418f, 0.647461f, 0.394043f, 0.631348f, + 0.409180f, 0.615234f, 0.423584f, 0.599609f, 0.438965f, 0.583496f, 0.453369f, 0.568359f, + 0.468262f, 0.552734f, 0.482178f, 0.537598f, 0.497314f, 0.521973f, 0.512207f, 0.506836f, + 0.524902f, 0.492188f, 0.539062f, 0.477051f, 0.552246f, 0.462402f, 0.565918f, 0.447754f, + 0.580078f, 0.433105f, 0.592773f, 0.418945f, 0.604980f, 0.404785f, 0.617676f, 0.390381f, + 0.631836f, 0.375977f, 0.643066f, 0.362549f, 0.655273f, 0.348633f, 0.668457f, 0.334717f, + 0.680176f, 0.321045f, 0.692383f, 0.307617f, 0.704102f, 0.293945f, 0.716309f, 0.281250f, + 0.726562f, 0.267822f, 0.737793f, 0.254639f, 0.749512f, 0.242065f, 0.759766f, 0.228882f, + 0.770996f, 0.216064f, 0.781250f, 0.203491f, 0.791016f, 0.191162f, 0.801758f, 0.178711f, + 0.810547f, 0.166992f, 0.820312f, 0.154053f, 0.829102f, 0.139648f, 0.838867f, 0.125000f, + 0.845703f, 0.109192f, 0.853027f, 0.089905f, 0.856934f, 0.064453f, 0.855957f, 0.024933f, + 0.000000f, 1.000000f, 0.018250f, 0.990723f, 0.034637f, 0.979004f, 0.053894f, 0.963867f, + 0.073181f, 0.947266f, 0.090881f, 0.931641f, 0.109253f, 0.915039f, 0.127686f, 0.897949f, + 0.145020f, 0.881836f, 0.163452f, 0.864258f, 0.180908f, 0.847168f, 0.198608f, 0.830078f, + 0.216187f, 0.812500f, 0.232910f, 0.795898f, 0.250732f, 0.778320f, 0.268799f, 0.760742f, + 0.284424f, 0.744141f, 0.300049f, 0.727539f, 0.318115f, 0.710449f, 0.334961f, 0.693848f, + 0.350098f, 0.677246f, 0.367676f, 0.660156f, 0.383545f, 0.643555f, 0.398926f, 0.627441f, + 0.415527f, 0.611328f, 0.431152f, 0.595215f, 0.445801f, 0.579102f, 0.460938f, 0.562988f, + 0.476074f, 0.547363f, 0.490234f, 0.531738f, 0.504395f, 0.516113f, 0.520508f, 0.500488f, + 0.535156f, 0.485596f, 0.548828f, 0.470459f, 0.562988f, 0.455322f, 0.577148f, 0.439941f, + 0.591309f, 0.425049f, 0.605469f, 0.410400f, 0.618164f, 0.395752f, 0.630859f, 0.381348f, + 0.645020f, 0.366699f, 0.658203f, 0.352051f, 0.671875f, 0.337646f, 0.684570f, 0.323486f, + 0.697266f, 0.309814f, 0.708984f, 0.296143f, 0.721191f, 0.281982f, 0.734863f, 0.268311f, + 0.745605f, 0.254639f, 0.757324f, 0.241455f, 0.770020f, 0.227295f, 0.782227f, 0.214111f, + 0.793457f, 0.201416f, 0.804688f, 0.187622f, 0.816406f, 0.174438f, 0.826172f, 0.161987f, + 0.835938f, 0.149780f, 0.845703f, 0.137207f, 0.856934f, 0.124390f, 0.865723f, 0.110168f, + 0.875977f, 0.095398f, 0.884277f, 0.077576f, 0.890137f, 0.055084f, 0.891113f, 0.020645f, + 0.000000f, 1.000000f, 0.018402f, 0.990723f, 0.036224f, 0.977539f, 0.053894f, 0.963867f, + 0.072876f, 0.947754f, 0.091736f, 0.931152f, 0.109619f, 0.915039f, 0.127319f, 0.898438f, + 0.145142f, 0.881348f, 0.164307f, 0.863281f, 0.182251f, 0.846191f, 0.199219f, 0.829590f, + 0.217651f, 0.811523f, 0.235596f, 0.793945f, 0.253906f, 0.776855f, 0.270996f, 0.759277f, + 0.287598f, 0.742188f, 0.305420f, 0.725098f, 0.322266f, 0.708008f, 0.338867f, 0.691406f, + 0.355957f, 0.673828f, 0.372803f, 0.656738f, 0.388916f, 0.640137f, 0.404785f, 0.623535f, + 0.419922f, 0.607422f, 0.436035f, 0.590820f, 0.453125f, 0.574219f, 0.468994f, 0.558105f, + 0.484619f, 0.541992f, 0.499756f, 0.525391f, 0.515137f, 0.509766f, 0.530273f, 0.494141f, + 0.545410f, 0.478760f, 0.559082f, 0.463135f, 0.573730f, 0.447754f, 0.588867f, 0.432129f, + 0.603516f, 0.416992f, 0.617188f, 0.401611f, 0.631348f, 0.386475f, 0.645996f, 0.371338f, + 0.659668f, 0.356689f, 0.674805f, 0.341553f, 0.687988f, 0.327148f, 0.700684f, 0.312988f, + 0.713379f, 0.298828f, 0.725586f, 0.284180f, 0.739746f, 0.269775f, 0.753418f, 0.255371f, + 0.765625f, 0.241333f, 0.777832f, 0.227783f, 0.790039f, 0.213623f, 0.802734f, 0.199951f, + 0.815430f, 0.185791f, 0.827637f, 0.172241f, 0.838867f, 0.159424f, 0.850586f, 0.145752f, + 0.861328f, 0.132446f, 0.873047f, 0.119141f, 0.883301f, 0.106384f, 0.894043f, 0.093933f, + 0.905273f, 0.080444f, 0.914551f, 0.064392f, 0.923340f, 0.045380f, 0.929199f, 0.016312f, + 0.000000f, 1.000000f, 0.018188f, 0.990723f, 0.036255f, 0.977539f, 0.054260f, 0.963379f, + 0.073486f, 0.946777f, 0.091797f, 0.931152f, 0.109375f, 0.915039f, 0.127930f, 0.897949f, + 0.147095f, 0.880371f, 0.164917f, 0.863281f, 0.183350f, 0.845703f, 0.201660f, 0.828125f, + 0.220215f, 0.810059f, 0.238281f, 0.792480f, 0.255371f, 0.775391f, 0.272461f, 0.758301f, + 0.291016f, 0.740234f, 0.308350f, 0.723145f, 0.326172f, 0.705566f, 0.343262f, 0.687988f, + 0.360107f, 0.670898f, 0.377197f, 0.653809f, 0.393799f, 0.636719f, 0.410156f, 0.620117f, + 0.426514f, 0.603027f, 0.444092f, 0.585938f, 0.459473f, 0.569824f, 0.476562f, 0.552734f, + 0.493408f, 0.536621f, 0.508301f, 0.520020f, 0.523438f, 0.503906f, 0.539062f, 0.487793f, + 0.555176f, 0.471680f, 0.570312f, 0.455811f, 0.585938f, 0.439941f, 0.600586f, 0.424072f, + 0.616699f, 0.408447f, 0.630859f, 0.393066f, 0.644531f, 0.377686f, 0.660156f, 0.362061f, + 0.674316f, 0.346924f, 0.687988f, 0.332031f, 0.702637f, 0.316650f, 0.717285f, 0.301514f, + 0.729980f, 0.286865f, 0.744629f, 0.272217f, 0.756836f, 0.257568f, 0.771484f, 0.242920f, + 0.784668f, 0.228516f, 0.797363f, 0.214233f, 0.811523f, 0.199585f, 0.824707f, 0.185425f, + 0.836914f, 0.171387f, 0.849609f, 0.157104f, 0.861328f, 0.143433f, 0.875000f, 0.129150f, + 0.886719f, 0.115479f, 0.897949f, 0.102600f, 0.910645f, 0.088196f, 0.922852f, 0.074524f, + 0.934082f, 0.061005f, 0.945801f, 0.047729f, 0.956055f, 0.032867f, 0.963379f, 0.011261f, + 0.000000f, 1.000000f, 0.017197f, 0.991211f, 0.035645f, 0.978516f, 0.053741f, 0.963867f, + 0.073975f, 0.946777f, 0.091614f, 0.931152f, 0.109009f, 0.915527f, 0.129028f, 0.897461f, + 0.148804f, 0.878906f, 0.166138f, 0.862305f, 0.184204f, 0.845215f, 0.203125f, 0.827148f, + 0.221313f, 0.809570f, 0.240356f, 0.791504f, 0.257812f, 0.773438f, 0.275879f, 0.756348f, + 0.294189f, 0.738281f, 0.311523f, 0.720703f, 0.329346f, 0.703125f, 0.346924f, 0.685547f, + 0.364258f, 0.668457f, 0.382568f, 0.650879f, 0.399170f, 0.633301f, 0.416504f, 0.616211f, + 0.433838f, 0.598633f, 0.450684f, 0.581543f, 0.467773f, 0.564941f, 0.483887f, 0.547852f, + 0.500488f, 0.531250f, 0.516602f, 0.514160f, 0.532715f, 0.497803f, 0.549316f, 0.481445f, + 0.565430f, 0.465088f, 0.581055f, 0.448730f, 0.596680f, 0.432617f, 0.612305f, 0.416504f, + 0.627441f, 0.400391f, 0.642578f, 0.384521f, 0.657227f, 0.368896f, 0.672363f, 0.353027f, + 0.687988f, 0.337158f, 0.703613f, 0.321289f, 0.719238f, 0.305664f, 0.734375f, 0.290283f, + 0.748535f, 0.275391f, 0.762207f, 0.260498f, 0.775879f, 0.245728f, 0.789062f, 0.231079f, + 0.802734f, 0.215820f, 0.817383f, 0.200562f, 0.832031f, 0.185303f, 0.847168f, 0.170410f, + 0.860840f, 0.156006f, 0.871582f, 0.142822f, 0.884277f, 0.128174f, 0.898438f, 0.113220f, + 0.912109f, 0.098511f, 0.925781f, 0.084290f, 0.936523f, 0.070618f, 0.952148f, 0.055542f, + 0.963379f, 0.042084f, 0.975098f, 0.028702f, 0.983887f, 0.016449f, 0.999512f, 0.000059f, + }, + { + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.995605f, 0.000000f, 0.993164f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f, + 0.000000f, 0.970215f, 0.000000f, 0.965820f, 0.000000f, 0.960938f, 0.000000f, 0.956543f, + 0.000000f, 0.951660f, 0.000000f, 0.946777f, 0.000000f, 0.940430f, 0.000000f, 0.934570f, + 0.000000f, 0.928223f, 0.000000f, 0.921387f, 0.000000f, 0.915527f, 0.000000f, 0.908691f, + 0.000000f, 0.901367f, 0.000000f, 0.893555f, 0.000000f, 0.885254f, 0.000000f, 0.877441f, + 0.000000f, 0.869629f, 0.000000f, 0.860840f, 0.000000f, 0.852051f, 0.000000f, 0.842285f, + 0.000000f, 0.832520f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f, + 0.000000f, 0.791016f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000000f, 0.754883f, + 0.000000f, 0.742676f, 0.000000f, 0.729492f, 0.000000f, 0.714844f, 0.000000f, 0.700684f, + 0.000000f, 0.685547f, 0.000000f, 0.670410f, 0.000000f, 0.654785f, 0.000000f, 0.637695f, + 0.000000f, 0.620117f, 0.000000f, 0.600586f, 0.000000f, 0.581055f, 0.000000f, 0.561523f, + 0.000000f, 0.540527f, 0.000000f, 0.516602f, 0.000000f, 0.491211f, 0.000000f, 0.465820f, + 0.000000f, 0.439697f, 0.000000f, 0.406738f, 0.000000f, 0.371582f, 0.000000f, 0.336182f, + 0.000000f, 0.291992f, 0.000000f, 0.238159f, 0.000000f, 0.169434f, 0.000000f, 0.067261f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998535f, 0.000000f, 0.997070f, + 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990723f, 0.000000f, 0.988281f, + 0.000000f, 0.984863f, 0.000000f, 0.981445f, 0.000000f, 0.978027f, 0.000000f, 0.974609f, + 0.000000f, 0.970215f, 0.000000f, 0.965332f, 0.000000f, 0.960938f, 0.000000f, 0.956055f, + 0.000000f, 0.950684f, 0.000000f, 0.945801f, 0.000000f, 0.939941f, 0.000000f, 0.934082f, + 0.000000f, 0.927734f, 0.000000f, 0.921387f, 0.000000f, 0.915039f, 0.000000f, 0.908203f, + 0.000000f, 0.900879f, 0.000000f, 0.893066f, 0.000000f, 0.885254f, 0.000000f, 0.876953f, + 0.000000f, 0.869141f, 0.000000f, 0.860840f, 0.000000f, 0.851074f, 0.000000f, 0.841797f, + 0.000000f, 0.832031f, 0.000000f, 0.822266f, 0.000000f, 0.812500f, 0.000000f, 0.802246f, + 0.000000f, 0.790527f, 0.000000f, 0.778809f, 0.000000f, 0.766602f, 0.000001f, 0.754395f, + 0.000003f, 0.742188f, 0.000005f, 0.729492f, 0.000007f, 0.715332f, 0.000010f, 0.700684f, + 0.000012f, 0.685547f, 0.000014f, 0.670410f, 0.000014f, 0.654785f, 0.000014f, 0.637695f, + 0.000014f, 0.619629f, 0.000013f, 0.600098f, 0.000013f, 0.581055f, 0.000012f, 0.562012f, + 0.000010f, 0.540527f, 0.000009f, 0.516602f, 0.000009f, 0.491699f, 0.000010f, 0.466064f, + 0.000009f, 0.439697f, 0.000008f, 0.406982f, 0.000007f, 0.372314f, 0.000007f, 0.336426f, + 0.000005f, 0.291260f, 0.000005f, 0.237549f, 0.000003f, 0.169189f, 0.000001f, 0.067505f, + 0.000000f, 1.000000f, 0.000000f, 0.999512f, 0.000000f, 0.998047f, 0.000000f, 0.997070f, + 0.000000f, 0.995117f, 0.000000f, 0.992676f, 0.000000f, 0.990234f, 0.000002f, 0.987793f, + 0.000007f, 0.984375f, 0.000014f, 0.980957f, 0.000021f, 0.977539f, 0.000029f, 0.974121f, + 0.000036f, 0.969727f, 0.000043f, 0.965332f, 0.000051f, 0.960449f, 0.000058f, 0.955566f, + 0.000064f, 0.951172f, 0.000070f, 0.945801f, 0.000077f, 0.939941f, 0.000084f, 0.933594f, + 0.000089f, 0.927246f, 0.000094f, 0.920898f, 0.000100f, 0.914551f, 0.000106f, 0.908203f, + 0.000111f, 0.900391f, 0.000116f, 0.892578f, 0.000120f, 0.884766f, 0.000124f, 0.876953f, + 0.000125f, 0.869141f, 0.000124f, 0.860352f, 0.000121f, 0.851074f, 0.000117f, 0.841797f, + 0.000113f, 0.832031f, 0.000112f, 0.821777f, 0.000112f, 0.812012f, 0.000112f, 0.801758f, + 0.000109f, 0.790039f, 0.000109f, 0.778320f, 0.000110f, 0.766602f, 0.000112f, 0.754395f, + 0.000114f, 0.742188f, 0.000116f, 0.729492f, 0.000108f, 0.714844f, 0.000105f, 0.700195f, + 0.000107f, 0.685059f, 0.000107f, 0.669922f, 0.000106f, 0.654297f, 0.000099f, 0.637695f, + 0.000096f, 0.619141f, 0.000096f, 0.600098f, 0.000096f, 0.581055f, 0.000094f, 0.561523f, + 0.000083f, 0.540039f, 0.000081f, 0.516113f, 0.000080f, 0.491699f, 0.000077f, 0.465576f, + 0.000066f, 0.439453f, 0.000062f, 0.406738f, 0.000059f, 0.372314f, 0.000052f, 0.337158f, + 0.000042f, 0.291992f, 0.000035f, 0.237915f, 0.000021f, 0.169189f, 0.000004f, 0.067383f, + 0.000000f, 1.000000f, 0.000113f, 0.999023f, 0.000178f, 0.998047f, 0.000176f, 0.996582f, + 0.000218f, 0.994141f, 0.000227f, 0.992676f, 0.000228f, 0.989746f, 0.000226f, 0.987305f, + 0.000267f, 0.983398f, 0.000271f, 0.980469f, 0.000272f, 0.977051f, 0.000271f, 0.973145f, + 0.000300f, 0.968750f, 0.000308f, 0.964355f, 0.000315f, 0.959473f, 0.000322f, 0.954590f, + 0.000329f, 0.949707f, 0.000360f, 0.944336f, 0.000369f, 0.938477f, 0.000371f, 0.932617f, + 0.000369f, 0.926270f, 0.000366f, 0.919922f, 0.000363f, 0.913574f, 0.000384f, 0.906738f, + 0.000379f, 0.899414f, 0.000378f, 0.891602f, 0.000377f, 0.883789f, 0.000380f, 0.875977f, + 0.000383f, 0.868164f, 0.000405f, 0.859375f, 0.000400f, 0.850098f, 0.000404f, 0.840332f, + 0.000403f, 0.831055f, 0.000401f, 0.821289f, 0.000398f, 0.811523f, 0.000410f, 0.800781f, + 0.000398f, 0.789551f, 0.000400f, 0.777344f, 0.000398f, 0.765625f, 0.000392f, 0.753906f, + 0.000388f, 0.741699f, 0.000399f, 0.728516f, 0.000379f, 0.714355f, 0.000375f, 0.699707f, + 0.000370f, 0.684570f, 0.000365f, 0.669434f, 0.000359f, 0.654785f, 0.000348f, 0.637207f, + 0.000337f, 0.618652f, 0.000329f, 0.600098f, 0.000320f, 0.581055f, 0.000314f, 0.561523f, + 0.000294f, 0.540039f, 0.000277f, 0.516602f, 0.000267f, 0.491455f, 0.000254f, 0.465820f, + 0.000247f, 0.438965f, 0.000209f, 0.406494f, 0.000193f, 0.371826f, 0.000173f, 0.336914f, + 0.000136f, 0.292236f, 0.000110f, 0.238403f, 0.000065f, 0.169556f, 0.000012f, 0.067261f, + 0.000000f, 1.000000f, 0.000267f, 0.999023f, 0.000419f, 0.997559f, 0.000392f, 0.996094f, + 0.000529f, 0.993652f, 0.000532f, 0.991211f, 0.000531f, 0.989258f, 0.000537f, 0.986816f, + 0.000649f, 0.982910f, 0.000649f, 0.979004f, 0.000659f, 0.975586f, 0.000662f, 0.972168f, + 0.000753f, 0.967773f, 0.000757f, 0.962891f, 0.000760f, 0.958496f, 0.000763f, 0.953613f, + 0.000763f, 0.948730f, 0.000831f, 0.943359f, 0.000836f, 0.937012f, 0.000831f, 0.931152f, + 0.000835f, 0.924805f, 0.000842f, 0.918945f, 0.000849f, 0.913086f, 0.000917f, 0.905273f, + 0.000905f, 0.897949f, 0.000908f, 0.890625f, 0.000909f, 0.882812f, 0.000908f, 0.875000f, + 0.000907f, 0.867188f, 0.000958f, 0.858398f, 0.000939f, 0.849121f, 0.000937f, 0.839355f, + 0.000938f, 0.830078f, 0.000936f, 0.820312f, 0.000932f, 0.810547f, 0.000970f, 0.799805f, + 0.000943f, 0.788086f, 0.000931f, 0.776855f, 0.000926f, 0.765137f, 0.000915f, 0.752930f, + 0.000910f, 0.740723f, 0.000939f, 0.727539f, 0.000904f, 0.713379f, 0.000873f, 0.698730f, + 0.000864f, 0.684082f, 0.000851f, 0.668945f, 0.000837f, 0.654297f, 0.000821f, 0.636230f, + 0.000784f, 0.618164f, 0.000764f, 0.600098f, 0.000746f, 0.580566f, 0.000723f, 0.561035f, + 0.000697f, 0.539551f, 0.000641f, 0.515625f, 0.000615f, 0.490967f, 0.000585f, 0.465820f, + 0.000568f, 0.439209f, 0.000479f, 0.406494f, 0.000438f, 0.372070f, 0.000391f, 0.336426f, + 0.000307f, 0.291016f, 0.000244f, 0.239136f, 0.000140f, 0.169189f, 0.000023f, 0.067078f, + 0.000000f, 1.000000f, 0.000519f, 0.998535f, 0.000839f, 0.997070f, 0.000782f, 0.995605f, + 0.001030f, 0.992676f, 0.001041f, 0.990234f, 0.001035f, 0.987793f, 0.001052f, 0.985352f, + 0.001259f, 0.981445f, 0.001264f, 0.978516f, 0.001260f, 0.974609f, 0.001259f, 0.970703f, + 0.001434f, 0.965820f, 0.001449f, 0.960938f, 0.001454f, 0.957031f, 0.001442f, 0.952148f, + 0.001452f, 0.947754f, 0.001609f, 0.941406f, 0.001631f, 0.935547f, 0.001645f, 0.929688f, + 0.001622f, 0.923828f, 0.001623f, 0.917480f, 0.001636f, 0.911133f, 0.001754f, 0.903809f, + 0.001770f, 0.895996f, 0.001750f, 0.888672f, 0.001744f, 0.880859f, 0.001740f, 0.873535f, + 0.001737f, 0.865723f, 0.001850f, 0.856445f, 0.001861f, 0.847168f, 0.001822f, 0.837891f, + 0.001800f, 0.828613f, 0.001790f, 0.819336f, 0.001783f, 0.809082f, 0.001864f, 0.798340f, + 0.001823f, 0.787109f, 0.001794f, 0.775391f, 0.001772f, 0.763672f, 0.001753f, 0.751953f, + 0.001739f, 0.740234f, 0.001797f, 0.726562f, 0.001744f, 0.712402f, 0.001681f, 0.697754f, + 0.001650f, 0.683594f, 0.001621f, 0.668457f, 0.001591f, 0.653809f, 0.001631f, 0.635742f, + 0.001534f, 0.617676f, 0.001457f, 0.599121f, 0.001414f, 0.580078f, 0.001370f, 0.561035f, + 0.001341f, 0.538574f, 0.001233f, 0.515137f, 0.001164f, 0.490723f, 0.001102f, 0.465576f, + 0.001074f, 0.438477f, 0.000912f, 0.406006f, 0.000821f, 0.372070f, 0.000726f, 0.337402f, + 0.000569f, 0.290283f, 0.000445f, 0.238770f, 0.000249f, 0.169434f, 0.000040f, 0.066528f, + 0.000000f, 1.000000f, 0.000836f, 0.998535f, 0.001378f, 0.996582f, 0.001312f, 0.994629f, + 0.001456f, 0.992188f, 0.001756f, 0.989258f, 0.001740f, 0.986816f, 0.001827f, 0.983887f, + 0.002106f, 0.979492f, 0.002115f, 0.976074f, 0.002119f, 0.973145f, 0.002125f, 0.969727f, + 0.002417f, 0.963867f, 0.002443f, 0.959473f, 0.002472f, 0.954590f, 0.002464f, 0.950195f, + 0.002464f, 0.945312f, 0.002714f, 0.938965f, 0.002747f, 0.933594f, 0.002773f, 0.927734f, + 0.002750f, 0.921387f, 0.002762f, 0.915527f, 0.002811f, 0.909180f, 0.002975f, 0.901367f, + 0.002996f, 0.894043f, 0.002970f, 0.886719f, 0.002977f, 0.879395f, 0.002951f, 0.872070f, + 0.002995f, 0.863770f, 0.003126f, 0.854492f, 0.003143f, 0.845215f, 0.003096f, 0.836426f, + 0.003057f, 0.826660f, 0.003033f, 0.817871f, 0.003008f, 0.808594f, 0.003153f, 0.796875f, + 0.003159f, 0.785156f, 0.003092f, 0.774414f, 0.003038f, 0.762695f, 0.002968f, 0.750977f, + 0.002930f, 0.739258f, 0.003029f, 0.725098f, 0.002956f, 0.710938f, 0.002890f, 0.696777f, + 0.002798f, 0.682617f, 0.002728f, 0.667969f, 0.002703f, 0.652832f, 0.002743f, 0.634766f, + 0.002602f, 0.617188f, 0.002487f, 0.598633f, 0.002377f, 0.579590f, 0.002291f, 0.561035f, + 0.002310f, 0.538086f, 0.002117f, 0.514648f, 0.001955f, 0.490479f, 0.001832f, 0.466064f, + 0.001786f, 0.437744f, 0.001535f, 0.405762f, 0.001353f, 0.372314f, 0.001190f, 0.337402f, + 0.000955f, 0.290771f, 0.000717f, 0.238525f, 0.000398f, 0.169678f, 0.000067f, 0.065735f, + 0.000000f, 1.000000f, 0.000743f, 0.998535f, 0.001665f, 0.996094f, 0.002008f, 0.994141f, + 0.002346f, 0.990723f, 0.002684f, 0.987793f, 0.002678f, 0.985352f, 0.002752f, 0.981934f, + 0.003250f, 0.978027f, 0.003258f, 0.974121f, 0.003281f, 0.970703f, 0.003288f, 0.967773f, + 0.003754f, 0.961914f, 0.003803f, 0.957031f, 0.003826f, 0.952637f, 0.003841f, 0.948242f, + 0.003820f, 0.943359f, 0.004246f, 0.936523f, 0.004269f, 0.930664f, 0.004307f, 0.925293f, + 0.004322f, 0.919434f, 0.004292f, 0.913086f, 0.004463f, 0.906738f, 0.004635f, 0.898926f, + 0.004665f, 0.891602f, 0.004677f, 0.884277f, 0.004627f, 0.876953f, 0.004593f, 0.870117f, + 0.004730f, 0.861328f, 0.004879f, 0.852051f, 0.004883f, 0.843262f, 0.004814f, 0.834473f, + 0.004810f, 0.825195f, 0.004757f, 0.815918f, 0.004803f, 0.806152f, 0.004898f, 0.794434f, + 0.004890f, 0.783691f, 0.004799f, 0.771973f, 0.004723f, 0.760742f, 0.004650f, 0.750000f, + 0.004570f, 0.737793f, 0.004707f, 0.723633f, 0.004662f, 0.709473f, 0.004486f, 0.695801f, + 0.004387f, 0.681152f, 0.004253f, 0.667480f, 0.004215f, 0.651367f, 0.004227f, 0.633301f, + 0.004025f, 0.615723f, 0.003859f, 0.597656f, 0.003700f, 0.579590f, 0.003527f, 0.561035f, + 0.003540f, 0.537109f, 0.003271f, 0.514160f, 0.003042f, 0.490234f, 0.002800f, 0.465576f, + 0.002720f, 0.437256f, 0.002392f, 0.405273f, 0.002062f, 0.371826f, 0.001789f, 0.337646f, + 0.001477f, 0.290527f, 0.001062f, 0.238770f, 0.000602f, 0.169556f, 0.000105f, 0.065247f, + 0.000000f, 1.000000f, 0.001196f, 0.998535f, 0.002502f, 0.995117f, 0.002876f, 0.992676f, + 0.003199f, 0.989746f, 0.003517f, 0.986816f, 0.003880f, 0.983887f, 0.004108f, 0.979980f, + 0.004414f, 0.976074f, 0.004761f, 0.972168f, 0.004765f, 0.968750f, 0.004841f, 0.964844f, + 0.005260f, 0.959473f, 0.005539f, 0.954590f, 0.005581f, 0.950195f, 0.005604f, 0.945801f, + 0.005680f, 0.940430f, 0.005978f, 0.933594f, 0.006275f, 0.927734f, 0.006283f, 0.922363f, + 0.006325f, 0.916992f, 0.006264f, 0.910645f, 0.006573f, 0.903320f, 0.006786f, 0.895996f, + 0.006844f, 0.888672f, 0.006844f, 0.881836f, 0.006767f, 0.874512f, 0.006763f, 0.867676f, + 0.006966f, 0.858398f, 0.007133f, 0.849121f, 0.007133f, 0.840332f, 0.007122f, 0.832031f, + 0.007023f, 0.823242f, 0.006935f, 0.813965f, 0.007061f, 0.803711f, 0.007187f, 0.791992f, + 0.007160f, 0.781250f, 0.007030f, 0.770508f, 0.006893f, 0.759277f, 0.006779f, 0.748047f, + 0.006832f, 0.735840f, 0.006901f, 0.721680f, 0.006802f, 0.708008f, 0.006618f, 0.693848f, + 0.006386f, 0.680176f, 0.006229f, 0.666504f, 0.006199f, 0.649902f, 0.006168f, 0.632324f, + 0.005928f, 0.614746f, 0.005661f, 0.597168f, 0.005367f, 0.579102f, 0.005241f, 0.559082f, + 0.005116f, 0.536133f, 0.004791f, 0.513184f, 0.004398f, 0.489990f, 0.004051f, 0.465820f, + 0.003904f, 0.436523f, 0.003481f, 0.405273f, 0.002977f, 0.372314f, 0.002529f, 0.337891f, + 0.002108f, 0.290039f, 0.001489f, 0.239014f, 0.000866f, 0.169556f, 0.000147f, 0.064087f, + 0.000000f, 1.000000f, 0.001239f, 0.998047f, 0.002592f, 0.994629f, 0.003477f, 0.992188f, + 0.004539f, 0.988281f, 0.004944f, 0.984863f, 0.005348f, 0.981934f, 0.005646f, 0.978027f, + 0.006233f, 0.973633f, 0.006599f, 0.969727f, 0.006657f, 0.966309f, 0.006851f, 0.961914f, + 0.007393f, 0.956055f, 0.007782f, 0.951660f, 0.007763f, 0.947266f, 0.007820f, 0.942871f, + 0.008011f, 0.937500f, 0.008484f, 0.930664f, 0.008728f, 0.924805f, 0.008812f, 0.919434f, + 0.008797f, 0.913574f, 0.008842f, 0.908203f, 0.009239f, 0.899902f, 0.009537f, 0.892578f, + 0.009529f, 0.885742f, 0.009575f, 0.878906f, 0.009567f, 0.872070f, 0.009438f, 0.865234f, + 0.009857f, 0.855469f, 0.010017f, 0.846680f, 0.009979f, 0.837891f, 0.009949f, 0.829102f, + 0.009804f, 0.820312f, 0.009750f, 0.812012f, 0.009979f, 0.800781f, 0.010086f, 0.789551f, + 0.010002f, 0.778809f, 0.009880f, 0.768555f, 0.009697f, 0.757812f, 0.009521f, 0.746582f, + 0.009628f, 0.733398f, 0.009613f, 0.719727f, 0.009483f, 0.706055f, 0.009216f, 0.692383f, + 0.008965f, 0.679199f, 0.008644f, 0.665039f, 0.008736f, 0.647949f, 0.008537f, 0.630371f, + 0.008232f, 0.613281f, 0.007851f, 0.596191f, 0.007481f, 0.578613f, 0.007275f, 0.558105f, + 0.007076f, 0.535156f, 0.006618f, 0.512695f, 0.006111f, 0.489746f, 0.005592f, 0.465820f, + 0.005367f, 0.435547f, 0.004776f, 0.404053f, 0.004097f, 0.372314f, 0.003468f, 0.337158f, + 0.002897f, 0.290283f, 0.002012f, 0.238892f, 0.001186f, 0.169434f, 0.000203f, 0.063721f, + 0.000000f, 1.000000f, 0.001400f, 0.998047f, 0.003353f, 0.994141f, 0.004185f, 0.991699f, + 0.005409f, 0.986816f, 0.006649f, 0.982910f, 0.006687f, 0.980469f, 0.007683f, 0.975586f, + 0.008133f, 0.971191f, 0.008553f, 0.967773f, 0.008949f, 0.963379f, 0.009407f, 0.958496f, + 0.009995f, 0.953125f, 0.010132f, 0.948242f, 0.010536f, 0.943848f, 0.010490f, 0.939453f, + 0.010963f, 0.933594f, 0.011513f, 0.926758f, 0.011848f, 0.921387f, 0.011826f, 0.915527f, + 0.011894f, 0.910645f, 0.012009f, 0.904297f, 0.012459f, 0.896484f, 0.012642f, 0.889648f, + 0.012917f, 0.882812f, 0.012863f, 0.875977f, 0.012817f, 0.869141f, 0.012993f, 0.861816f, + 0.013351f, 0.852051f, 0.013504f, 0.842773f, 0.013512f, 0.834961f, 0.013420f, 0.826660f, + 0.013329f, 0.818359f, 0.013176f, 0.809570f, 0.013489f, 0.797852f, 0.013573f, 0.786621f, + 0.013420f, 0.775879f, 0.013298f, 0.766113f, 0.013046f, 0.755371f, 0.012787f, 0.745117f, + 0.012985f, 0.730469f, 0.012978f, 0.717285f, 0.012703f, 0.704102f, 0.012375f, 0.690918f, + 0.012009f, 0.677734f, 0.011658f, 0.664062f, 0.011787f, 0.645508f, 0.011467f, 0.628906f, + 0.011032f, 0.612305f, 0.010597f, 0.595215f, 0.010040f, 0.578125f, 0.009789f, 0.556152f, + 0.009453f, 0.534180f, 0.008820f, 0.511719f, 0.008179f, 0.489258f, 0.007450f, 0.465576f, + 0.007130f, 0.434814f, 0.006325f, 0.404297f, 0.005444f, 0.372559f, 0.004631f, 0.336426f, + 0.003807f, 0.289307f, 0.002638f, 0.240112f, 0.001544f, 0.168701f, 0.000274f, 0.062744f, + 0.000000f, 1.000000f, 0.001608f, 0.998047f, 0.003750f, 0.993652f, 0.005112f, 0.990723f, + 0.006462f, 0.985840f, 0.007797f, 0.981445f, 0.008713f, 0.978516f, 0.009453f, 0.973145f, + 0.010658f, 0.968262f, 0.011154f, 0.964355f, 0.011276f, 0.960938f, 0.012253f, 0.955078f, + 0.012917f, 0.949219f, 0.013412f, 0.945312f, 0.013725f, 0.940430f, 0.013863f, 0.936523f, + 0.014458f, 0.929199f, 0.015152f, 0.922852f, 0.015289f, 0.917480f, 0.015640f, 0.912109f, + 0.015541f, 0.906738f, 0.015961f, 0.899902f, 0.016388f, 0.892578f, 0.016754f, 0.885742f, + 0.016953f, 0.878906f, 0.016937f, 0.872070f, 0.016815f, 0.865723f, 0.017197f, 0.856934f, + 0.017578f, 0.848145f, 0.017807f, 0.839355f, 0.017685f, 0.831543f, 0.017548f, 0.823242f, + 0.017456f, 0.815430f, 0.017456f, 0.805664f, 0.017853f, 0.793945f, 0.017853f, 0.783691f, + 0.017624f, 0.773438f, 0.017410f, 0.763672f, 0.017059f, 0.753418f, 0.017014f, 0.741699f, + 0.017105f, 0.728027f, 0.017014f, 0.714844f, 0.016617f, 0.702148f, 0.016159f, 0.688965f, + 0.015778f, 0.676270f, 0.015427f, 0.661621f, 0.015442f, 0.644043f, 0.014977f, 0.627441f, + 0.014381f, 0.610840f, 0.013771f, 0.594727f, 0.013016f, 0.577637f, 0.012810f, 0.555176f, + 0.012276f, 0.532715f, 0.011520f, 0.511230f, 0.010567f, 0.489014f, 0.009666f, 0.465820f, + 0.009216f, 0.433838f, 0.008209f, 0.403809f, 0.007027f, 0.372314f, 0.006031f, 0.334961f, + 0.004913f, 0.289307f, 0.003365f, 0.240234f, 0.001982f, 0.167603f, 0.000346f, 0.061798f, + 0.000000f, 1.000000f, 0.001885f, 0.997559f, 0.004303f, 0.993164f, 0.005737f, 0.990234f, + 0.007801f, 0.984375f, 0.009171f, 0.980469f, 0.010170f, 0.977051f, 0.011986f, 0.970215f, + 0.013268f, 0.965820f, 0.013802f, 0.961426f, 0.014313f, 0.958008f, 0.015793f, 0.951172f, + 0.016571f, 0.945801f, 0.017059f, 0.940918f, 0.017273f, 0.937012f, 0.017807f, 0.931641f, + 0.018814f, 0.924805f, 0.019150f, 0.918945f, 0.019638f, 0.913574f, 0.020004f, 0.908203f, + 0.019943f, 0.903320f, 0.020706f, 0.895020f, 0.021225f, 0.887695f, 0.021545f, 0.881348f, + 0.021805f, 0.875000f, 0.021729f, 0.868164f, 0.021652f, 0.862305f, 0.022263f, 0.852539f, + 0.022644f, 0.843750f, 0.022537f, 0.835449f, 0.022781f, 0.827637f, 0.022568f, 0.819824f, + 0.022339f, 0.812500f, 0.022736f, 0.801270f, 0.022873f, 0.790527f, 0.022751f, 0.780273f, + 0.022614f, 0.770508f, 0.022308f, 0.760742f, 0.022003f, 0.751465f, 0.021896f, 0.738281f, + 0.021912f, 0.724609f, 0.021698f, 0.711914f, 0.021271f, 0.699707f, 0.020676f, 0.687500f, + 0.020096f, 0.675293f, 0.019913f, 0.658691f, 0.019531f, 0.641602f, 0.019119f, 0.625488f, + 0.018433f, 0.609863f, 0.017456f, 0.593750f, 0.016678f, 0.576660f, 0.016357f, 0.553223f, + 0.015587f, 0.531738f, 0.014587f, 0.510742f, 0.013428f, 0.489014f, 0.012344f, 0.464111f, + 0.011665f, 0.433105f, 0.010361f, 0.403809f, 0.008804f, 0.372803f, 0.007610f, 0.334473f, + 0.006142f, 0.288818f, 0.004189f, 0.240356f, 0.002451f, 0.166870f, 0.000427f, 0.060730f, + 0.000000f, 1.000000f, 0.002254f, 0.997559f, 0.005020f, 0.992676f, 0.006535f, 0.989746f, + 0.009361f, 0.983398f, 0.010857f, 0.979004f, 0.012276f, 0.975098f, 0.014267f, 0.968262f, + 0.016144f, 0.962891f, 0.017197f, 0.958496f, 0.017914f, 0.953613f, 0.019135f, 0.947266f, + 0.020462f, 0.941895f, 0.020981f, 0.937500f, 0.021469f, 0.933105f, 0.022339f, 0.927246f, + 0.023392f, 0.919922f, 0.024200f, 0.914062f, 0.024628f, 0.909180f, 0.024734f, 0.904297f, + 0.025467f, 0.897949f, 0.026093f, 0.889648f, 0.026794f, 0.882812f, 0.027237f, 0.876953f, + 0.027145f, 0.870605f, 0.027359f, 0.864746f, 0.027695f, 0.856445f, 0.028198f, 0.847168f, + 0.028442f, 0.839355f, 0.028412f, 0.831543f, 0.028610f, 0.823730f, 0.028366f, 0.816895f, + 0.028549f, 0.807617f, 0.028885f, 0.796875f, 0.028900f, 0.786621f, 0.028839f, 0.776855f, + 0.028412f, 0.767578f, 0.028015f, 0.757812f, 0.027695f, 0.748047f, 0.027710f, 0.734375f, + 0.027634f, 0.721680f, 0.027313f, 0.709473f, 0.026672f, 0.697754f, 0.025955f, 0.685547f, + 0.025253f, 0.673340f, 0.025208f, 0.655762f, 0.024612f, 0.639648f, 0.023865f, 0.623535f, + 0.022964f, 0.607910f, 0.021942f, 0.593262f, 0.021088f, 0.573242f, 0.020432f, 0.551758f, + 0.019470f, 0.530762f, 0.018173f, 0.509766f, 0.016678f, 0.488525f, 0.015549f, 0.461914f, + 0.014511f, 0.432373f, 0.012840f, 0.403076f, 0.010925f, 0.372559f, 0.009460f, 0.333496f, + 0.007565f, 0.288330f, 0.005146f, 0.241333f, 0.003029f, 0.166504f, 0.000531f, 0.059662f, + 0.000000f, 1.000000f, 0.002697f, 0.997559f, 0.005894f, 0.992188f, 0.007965f, 0.988770f, + 0.011200f, 0.981934f, 0.012756f, 0.977539f, 0.014572f, 0.972168f, 0.017044f, 0.965332f, + 0.019043f, 0.960449f, 0.020172f, 0.955566f, 0.021912f, 0.949707f, 0.023605f, 0.942871f, + 0.024338f, 0.937988f, 0.025742f, 0.933105f, 0.026047f, 0.929688f, 0.027542f, 0.921387f, + 0.028931f, 0.915039f, 0.029419f, 0.909668f, 0.029968f, 0.904785f, 0.030472f, 0.899902f, + 0.031525f, 0.892090f, 0.032562f, 0.884766f, 0.032806f, 0.877930f, 0.033173f, 0.872070f, + 0.033600f, 0.866211f, 0.033691f, 0.860352f, 0.034515f, 0.851074f, 0.035126f, 0.842773f, + 0.035187f, 0.834473f, 0.035370f, 0.827637f, 0.035309f, 0.820312f, 0.035095f, 0.812988f, + 0.035431f, 0.802246f, 0.035858f, 0.792480f, 0.035919f, 0.782715f, 0.035461f, 0.773438f, + 0.035248f, 0.764648f, 0.034729f, 0.755371f, 0.034698f, 0.743652f, 0.034515f, 0.730469f, + 0.034393f, 0.718750f, 0.033813f, 0.707031f, 0.033020f, 0.695312f, 0.032104f, 0.683594f, + 0.031555f, 0.669434f, 0.031250f, 0.652832f, 0.030411f, 0.637207f, 0.029556f, 0.622070f, + 0.028336f, 0.606934f, 0.027039f, 0.591797f, 0.026337f, 0.571289f, 0.025345f, 0.549805f, + 0.023926f, 0.529785f, 0.022278f, 0.509277f, 0.020416f, 0.488281f, 0.019287f, 0.459961f, + 0.017838f, 0.431152f, 0.015717f, 0.403076f, 0.013298f, 0.373535f, 0.011597f, 0.331787f, + 0.009270f, 0.288818f, 0.006207f, 0.242065f, 0.003660f, 0.166260f, 0.000636f, 0.059082f, + 0.000000f, 1.000000f, 0.002750f, 0.997559f, 0.006912f, 0.991699f, 0.009270f, 0.987305f, + 0.012810f, 0.980469f, 0.014969f, 0.975586f, 0.017136f, 0.969727f, 0.019791f, 0.962891f, + 0.021851f, 0.957520f, 0.023514f, 0.953125f, 0.025696f, 0.945312f, 0.027924f, 0.938965f, + 0.029434f, 0.933594f, 0.030167f, 0.929199f, 0.031647f, 0.923340f, 0.033417f, 0.916504f, + 0.034363f, 0.910645f, 0.035645f, 0.904785f, 0.036224f, 0.899902f, 0.036957f, 0.894043f, + 0.038116f, 0.886230f, 0.039337f, 0.878906f, 0.039978f, 0.873047f, 0.040161f, 0.867188f, + 0.040588f, 0.861816f, 0.041168f, 0.854004f, 0.042297f, 0.845215f, 0.042786f, 0.837402f, + 0.042938f, 0.830078f, 0.042969f, 0.822754f, 0.042786f, 0.816895f, 0.043030f, 0.807129f, + 0.043671f, 0.796875f, 0.043671f, 0.787598f, 0.043427f, 0.778320f, 0.043152f, 0.770020f, + 0.042938f, 0.761230f, 0.042389f, 0.751465f, 0.042480f, 0.738770f, 0.042175f, 0.726562f, + 0.041809f, 0.714844f, 0.041138f, 0.704102f, 0.040161f, 0.692871f, 0.038879f, 0.681641f, + 0.038818f, 0.665527f, 0.038269f, 0.649902f, 0.037109f, 0.635254f, 0.035828f, 0.620117f, + 0.034454f, 0.606445f, 0.032990f, 0.589844f, 0.032104f, 0.568359f, 0.030762f, 0.548340f, + 0.029068f, 0.528809f, 0.026993f, 0.508789f, 0.024857f, 0.488770f, 0.023544f, 0.458740f, + 0.021500f, 0.430664f, 0.019043f, 0.402832f, 0.016113f, 0.373779f, 0.013977f, 0.331055f, + 0.011101f, 0.289062f, 0.007458f, 0.243042f, 0.004395f, 0.166016f, 0.000759f, 0.058838f, + 0.000000f, 1.000000f, 0.003342f, 0.997070f, 0.007214f, 0.991699f, 0.010582f, 0.985352f, + 0.014206f, 0.979492f, 0.016922f, 0.974609f, 0.020294f, 0.966797f, 0.022873f, 0.960938f, + 0.025055f, 0.955078f, 0.027206f, 0.950195f, 0.030518f, 0.941406f, 0.032654f, 0.935059f, + 0.034271f, 0.930176f, 0.035461f, 0.925293f, 0.037292f, 0.917480f, 0.039520f, 0.910645f, + 0.041046f, 0.905273f, 0.041687f, 0.899902f, 0.042664f, 0.895020f, 0.044159f, 0.887207f, + 0.045685f, 0.879883f, 0.046448f, 0.874023f, 0.047577f, 0.867676f, 0.048157f, 0.862305f, + 0.048370f, 0.855957f, 0.049652f, 0.847168f, 0.050812f, 0.839355f, 0.051025f, 0.832031f, + 0.051178f, 0.825195f, 0.051544f, 0.818848f, 0.051208f, 0.811523f, 0.052032f, 0.801270f, + 0.052368f, 0.791504f, 0.052399f, 0.783203f, 0.052032f, 0.774414f, 0.051727f, 0.766113f, + 0.051117f, 0.757812f, 0.051422f, 0.745605f, 0.051208f, 0.733887f, 0.050598f, 0.723145f, + 0.050201f, 0.711914f, 0.049347f, 0.701660f, 0.048035f, 0.690918f, 0.047272f, 0.676758f, + 0.047028f, 0.662109f, 0.045715f, 0.646973f, 0.044373f, 0.632812f, 0.042908f, 0.619141f, + 0.041046f, 0.604980f, 0.039825f, 0.585938f, 0.038483f, 0.566406f, 0.036865f, 0.546875f, + 0.034668f, 0.527832f, 0.032227f, 0.508789f, 0.029953f, 0.485596f, 0.028061f, 0.456787f, + 0.025681f, 0.429932f, 0.022537f, 0.403564f, 0.019104f, 0.374023f, 0.016663f, 0.329834f, + 0.013145f, 0.288818f, 0.008850f, 0.244263f, 0.005169f, 0.165771f, 0.000897f, 0.058228f, + 0.000000f, 1.000000f, 0.003767f, 0.996094f, 0.008530f, 0.990723f, 0.011810f, 0.984863f, + 0.015808f, 0.978516f, 0.019150f, 0.973145f, 0.023117f, 0.964844f, 0.026337f, 0.958496f, + 0.028595f, 0.952637f, 0.031525f, 0.945312f, 0.034729f, 0.937500f, 0.037415f, 0.931641f, + 0.039520f, 0.925781f, 0.041077f, 0.919922f, 0.044189f, 0.911621f, 0.045837f, 0.905762f, + 0.047455f, 0.899902f, 0.048981f, 0.895020f, 0.050262f, 0.888672f, 0.052216f, 0.880371f, + 0.053955f, 0.874023f, 0.054749f, 0.867676f, 0.055725f, 0.862305f, 0.055939f, 0.856934f, + 0.057556f, 0.848145f, 0.058502f, 0.840332f, 0.059235f, 0.833496f, 0.060120f, 0.826660f, + 0.059998f, 0.820312f, 0.060028f, 0.814453f, 0.061127f, 0.804199f, 0.061829f, 0.794922f, + 0.061707f, 0.786133f, 0.061890f, 0.778320f, 0.061462f, 0.770508f, 0.060913f, 0.762695f, + 0.060852f, 0.751953f, 0.061005f, 0.740234f, 0.060730f, 0.729492f, 0.059723f, 0.719238f, + 0.059204f, 0.708984f, 0.057770f, 0.698730f, 0.056702f, 0.687012f, 0.056244f, 0.672363f, + 0.055420f, 0.658203f, 0.054047f, 0.644531f, 0.052185f, 0.630859f, 0.050629f, 0.617676f, + 0.048615f, 0.603027f, 0.047394f, 0.583008f, 0.045624f, 0.563477f, 0.043457f, 0.545410f, + 0.040833f, 0.526855f, 0.037964f, 0.508789f, 0.035645f, 0.482422f, 0.033112f, 0.455566f, + 0.030151f, 0.430176f, 0.026382f, 0.403320f, 0.022766f, 0.372559f, 0.019562f, 0.329102f, + 0.015305f, 0.289551f, 0.010284f, 0.244263f, 0.006035f, 0.166016f, 0.001036f, 0.056915f, + 0.000000f, 1.000000f, 0.004234f, 0.996094f, 0.009125f, 0.990723f, 0.013443f, 0.983398f, + 0.017822f, 0.977051f, 0.020660f, 0.972168f, 0.025879f, 0.962891f, 0.029648f, 0.956055f, + 0.031982f, 0.950684f, 0.036255f, 0.941406f, 0.039429f, 0.934570f, 0.042450f, 0.927734f, + 0.044312f, 0.922852f, 0.048187f, 0.913574f, 0.050201f, 0.906738f, 0.053040f, 0.899902f, + 0.054657f, 0.895020f, 0.055908f, 0.890137f, 0.058502f, 0.880859f, 0.060303f, 0.874512f, + 0.062164f, 0.867676f, 0.063354f, 0.862305f, 0.064209f, 0.856934f, 0.065796f, 0.849121f, + 0.067261f, 0.841309f, 0.068359f, 0.833984f, 0.068665f, 0.827148f, 0.069824f, 0.821289f, + 0.069824f, 0.815430f, 0.070312f, 0.806152f, 0.071411f, 0.797363f, 0.071899f, 0.789551f, + 0.072144f, 0.780762f, 0.071777f, 0.773438f, 0.071533f, 0.766602f, 0.071167f, 0.756836f, + 0.071167f, 0.746094f, 0.071289f, 0.735352f, 0.070984f, 0.725586f, 0.069763f, 0.715820f, + 0.068604f, 0.706055f, 0.067139f, 0.696777f, 0.066895f, 0.681641f, 0.066101f, 0.668457f, + 0.064575f, 0.654785f, 0.062744f, 0.641602f, 0.061096f, 0.629395f, 0.058716f, 0.616699f, + 0.057251f, 0.598145f, 0.055573f, 0.580078f, 0.053314f, 0.562012f, 0.050507f, 0.544922f, + 0.047333f, 0.526367f, 0.044098f, 0.507324f, 0.041687f, 0.480469f, 0.038757f, 0.455078f, + 0.035034f, 0.429443f, 0.030624f, 0.403320f, 0.026657f, 0.369385f, 0.022934f, 0.329102f, + 0.017715f, 0.290039f, 0.011932f, 0.245239f, 0.007030f, 0.166626f, 0.001216f, 0.056305f, + 0.000000f, 1.000000f, 0.005039f, 0.995605f, 0.009857f, 0.990234f, 0.015373f, 0.982422f, + 0.019577f, 0.976562f, 0.023788f, 0.969238f, 0.028442f, 0.960938f, 0.032928f, 0.954102f, + 0.036102f, 0.947266f, 0.040375f, 0.938477f, 0.044006f, 0.931152f, 0.047607f, 0.924805f, + 0.050537f, 0.916992f, 0.053864f, 0.908691f, 0.057343f, 0.901367f, 0.059540f, 0.895508f, + 0.062073f, 0.889648f, 0.064453f, 0.881836f, 0.067749f, 0.874023f, 0.069397f, 0.867676f, + 0.070923f, 0.862305f, 0.072266f, 0.856934f, 0.073730f, 0.849609f, 0.075806f, 0.841309f, + 0.077515f, 0.833984f, 0.078369f, 0.828125f, 0.079163f, 0.821289f, 0.079285f, 0.815918f, + 0.080688f, 0.807617f, 0.081726f, 0.798828f, 0.082458f, 0.790527f, 0.082581f, 0.783203f, + 0.082825f, 0.775879f, 0.082458f, 0.769043f, 0.082092f, 0.760742f, 0.082703f, 0.749512f, + 0.082153f, 0.739746f, 0.082092f, 0.729980f, 0.081238f, 0.721191f, 0.080017f, 0.711914f, + 0.078491f, 0.703125f, 0.078064f, 0.690430f, 0.077148f, 0.676270f, 0.075867f, 0.664062f, + 0.074280f, 0.651855f, 0.072144f, 0.640137f, 0.070068f, 0.627441f, 0.067932f, 0.611816f, + 0.066162f, 0.594727f, 0.063904f, 0.577148f, 0.061188f, 0.560547f, 0.057861f, 0.543457f, + 0.054413f, 0.525879f, 0.051392f, 0.503418f, 0.048370f, 0.479248f, 0.044586f, 0.453857f, + 0.040039f, 0.428955f, 0.034973f, 0.403809f, 0.030685f, 0.367188f, 0.026230f, 0.328857f, + 0.020370f, 0.291016f, 0.013924f, 0.240845f, 0.007980f, 0.166626f, 0.001383f, 0.055695f, + 0.000000f, 1.000000f, 0.005764f, 0.995117f, 0.010727f, 0.990234f, 0.016769f, 0.981934f, + 0.021439f, 0.975586f, 0.026550f, 0.966797f, 0.031952f, 0.958984f, 0.035492f, 0.953125f, + 0.040680f, 0.943359f, 0.045532f, 0.935059f, 0.049469f, 0.928223f, 0.052673f, 0.921875f, + 0.056763f, 0.912109f, 0.061493f, 0.903809f, 0.063782f, 0.896973f, 0.066895f, 0.891113f, + 0.069763f, 0.883301f, 0.073608f, 0.874512f, 0.075989f, 0.867676f, 0.078674f, 0.860840f, + 0.080200f, 0.855957f, 0.081726f, 0.849609f, 0.084290f, 0.841309f, 0.086365f, 0.833496f, + 0.087585f, 0.827637f, 0.089111f, 0.821289f, 0.089905f, 0.815918f, 0.090820f, 0.808105f, + 0.092346f, 0.799805f, 0.093506f, 0.791504f, 0.093567f, 0.784668f, 0.093811f, 0.777832f, + 0.093689f, 0.770996f, 0.093750f, 0.763672f, 0.094360f, 0.752930f, 0.094299f, 0.743164f, + 0.094055f, 0.734375f, 0.093506f, 0.725586f, 0.092468f, 0.717285f, 0.090942f, 0.708496f, + 0.090027f, 0.696289f, 0.089539f, 0.684082f, 0.088135f, 0.671875f, 0.086670f, 0.660645f, + 0.084778f, 0.648926f, 0.082092f, 0.637695f, 0.079590f, 0.625000f, 0.077942f, 0.607422f, + 0.075684f, 0.591309f, 0.072937f, 0.574707f, 0.069580f, 0.558594f, 0.065674f, 0.542969f, + 0.061829f, 0.524902f, 0.058685f, 0.500977f, 0.055206f, 0.477051f, 0.050598f, 0.453125f, + 0.045532f, 0.429199f, 0.039581f, 0.404785f, 0.035309f, 0.365723f, 0.029953f, 0.329346f, + 0.023056f, 0.291016f, 0.015854f, 0.237793f, 0.009064f, 0.166870f, 0.001560f, 0.055237f, + 0.000000f, 1.000000f, 0.006138f, 0.995117f, 0.011711f, 0.989258f, 0.018356f, 0.980957f, + 0.023132f, 0.974609f, 0.030045f, 0.964844f, 0.034698f, 0.957520f, 0.039764f, 0.950195f, + 0.045166f, 0.940430f, 0.050354f, 0.932129f, 0.053925f, 0.925781f, 0.058868f, 0.916504f, + 0.063782f, 0.907227f, 0.067871f, 0.899414f, 0.071411f, 0.893066f, 0.074951f, 0.885254f, + 0.079224f, 0.875977f, 0.082703f, 0.868652f, 0.085266f, 0.861328f, 0.087219f, 0.855957f, + 0.089966f, 0.848633f, 0.092896f, 0.840332f, 0.095032f, 0.833008f, 0.097839f, 0.826660f, + 0.098694f, 0.820801f, 0.099731f, 0.815430f, 0.101562f, 0.807617f, 0.103088f, 0.798828f, + 0.104248f, 0.791992f, 0.105103f, 0.784668f, 0.105469f, 0.778320f, 0.105347f, 0.771973f, + 0.105713f, 0.764648f, 0.106689f, 0.754395f, 0.106934f, 0.745605f, 0.106689f, 0.737793f, + 0.106262f, 0.729004f, 0.104797f, 0.721191f, 0.103760f, 0.713379f, 0.103027f, 0.701660f, + 0.102295f, 0.690430f, 0.101624f, 0.679199f, 0.099670f, 0.667969f, 0.097778f, 0.657227f, + 0.095032f, 0.646484f, 0.092468f, 0.635742f, 0.090576f, 0.619141f, 0.088501f, 0.603027f, + 0.085510f, 0.588379f, 0.082092f, 0.573242f, 0.078186f, 0.558105f, 0.073730f, 0.542969f, + 0.070312f, 0.520020f, 0.066650f, 0.497803f, 0.061981f, 0.475342f, 0.056885f, 0.452881f, + 0.050812f, 0.429932f, 0.045319f, 0.400635f, 0.040100f, 0.365234f, 0.033478f, 0.329102f, + 0.025726f, 0.291016f, 0.018326f, 0.236084f, 0.010094f, 0.166870f, 0.001750f, 0.054657f, + 0.000000f, 1.000000f, 0.006809f, 0.995117f, 0.012581f, 0.988770f, 0.019684f, 0.980469f, + 0.025528f, 0.972656f, 0.032959f, 0.963379f, 0.038269f, 0.956055f, 0.043854f, 0.946289f, + 0.050293f, 0.937500f, 0.055115f, 0.929688f, 0.060089f, 0.921387f, 0.065796f, 0.911133f, + 0.070801f, 0.902832f, 0.074585f, 0.895996f, 0.078857f, 0.888184f, 0.084106f, 0.877930f, + 0.087830f, 0.870117f, 0.091553f, 0.862793f, 0.094482f, 0.856445f, 0.097839f, 0.848633f, + 0.101135f, 0.839844f, 0.104370f, 0.832031f, 0.106140f, 0.825684f, 0.108459f, 0.819824f, + 0.110046f, 0.814941f, 0.111877f, 0.805664f, 0.114014f, 0.797852f, 0.115601f, 0.791504f, + 0.116577f, 0.784668f, 0.117249f, 0.778809f, 0.117798f, 0.772461f, 0.118103f, 0.764160f, + 0.118774f, 0.755371f, 0.119446f, 0.747070f, 0.119812f, 0.739258f, 0.118896f, 0.731934f, + 0.118347f, 0.724609f, 0.117004f, 0.717773f, 0.117126f, 0.705566f, 0.115784f, 0.694336f, + 0.115051f, 0.684570f, 0.113342f, 0.674316f, 0.111328f, 0.664551f, 0.108887f, 0.654785f, + 0.105957f, 0.643555f, 0.104248f, 0.628418f, 0.101685f, 0.613770f, 0.098999f, 0.600098f, + 0.095459f, 0.585938f, 0.091736f, 0.572266f, 0.087036f, 0.557129f, 0.082886f, 0.537598f, + 0.079224f, 0.516113f, 0.074585f, 0.495605f, 0.069092f, 0.474609f, 0.063049f, 0.453125f, + 0.056732f, 0.430664f, 0.050995f, 0.397949f, 0.044586f, 0.364258f, 0.037354f, 0.329346f, + 0.028717f, 0.292480f, 0.020645f, 0.234497f, 0.011307f, 0.167725f, 0.001945f, 0.054443f, + 0.000000f, 1.000000f, 0.007446f, 0.994629f, 0.014336f, 0.987305f, 0.021194f, 0.979980f, + 0.028076f, 0.970703f, 0.035339f, 0.962402f, 0.041168f, 0.954590f, 0.048096f, 0.943848f, + 0.054718f, 0.935059f, 0.059662f, 0.927734f, 0.066162f, 0.916504f, 0.072693f, 0.907715f, + 0.077759f, 0.899414f, 0.082092f, 0.891602f, 0.087646f, 0.880859f, 0.092712f, 0.872559f, + 0.096436f, 0.865234f, 0.100403f, 0.857910f, 0.104492f, 0.849121f, 0.108337f, 0.839844f, + 0.111755f, 0.832520f, 0.115051f, 0.825195f, 0.117798f, 0.818848f, 0.119568f, 0.812988f, + 0.122559f, 0.804199f, 0.124878f, 0.796875f, 0.126343f, 0.790039f, 0.127808f, 0.783691f, + 0.129272f, 0.778320f, 0.129395f, 0.771973f, 0.131104f, 0.763184f, 0.132080f, 0.754883f, + 0.132935f, 0.747559f, 0.132324f, 0.740234f, 0.132568f, 0.733398f, 0.132080f, 0.726562f, + 0.131226f, 0.717773f, 0.130615f, 0.708008f, 0.130249f, 0.698242f, 0.129028f, 0.688965f, + 0.127563f, 0.679688f, 0.125488f, 0.670410f, 0.122925f, 0.661621f, 0.120972f, 0.649902f, + 0.118958f, 0.636719f, 0.116211f, 0.623535f, 0.113525f, 0.610840f, 0.109741f, 0.597656f, + 0.105530f, 0.583984f, 0.101013f, 0.570312f, 0.097107f, 0.553223f, 0.092834f, 0.533203f, + 0.088257f, 0.514160f, 0.082764f, 0.494873f, 0.076660f, 0.474609f, 0.069763f, 0.453857f, + 0.063538f, 0.427490f, 0.057159f, 0.395996f, 0.049530f, 0.363281f, 0.041138f, 0.329102f, + 0.031555f, 0.292969f, 0.023087f, 0.233276f, 0.012466f, 0.168335f, 0.002146f, 0.053955f, + 0.000000f, 1.000000f, 0.007866f, 0.994629f, 0.015533f, 0.986816f, 0.022812f, 0.979492f, + 0.031311f, 0.969238f, 0.037750f, 0.961914f, 0.045288f, 0.951172f, 0.052368f, 0.941895f, + 0.058899f, 0.933594f, 0.066101f, 0.922363f, 0.072876f, 0.912598f, 0.078735f, 0.904785f, + 0.083618f, 0.895996f, 0.090881f, 0.884766f, 0.096497f, 0.875488f, 0.101318f, 0.867676f, + 0.105835f, 0.860840f, 0.110291f, 0.850098f, 0.115845f, 0.840820f, 0.119690f, 0.833496f, + 0.122620f, 0.826172f, 0.125854f, 0.819824f, 0.128906f, 0.811035f, 0.132935f, 0.802246f, + 0.135376f, 0.795410f, 0.137695f, 0.788574f, 0.139282f, 0.783203f, 0.140625f, 0.777344f, + 0.142456f, 0.769531f, 0.144287f, 0.761230f, 0.144897f, 0.753906f, 0.146118f, 0.747070f, + 0.145752f, 0.740723f, 0.146240f, 0.734375f, 0.145020f, 0.728027f, 0.146118f, 0.718262f, + 0.145630f, 0.709473f, 0.144775f, 0.700684f, 0.143555f, 0.692383f, 0.142334f, 0.683594f, + 0.140015f, 0.675293f, 0.137939f, 0.666992f, 0.135986f, 0.655273f, 0.133789f, 0.643066f, + 0.131592f, 0.630859f, 0.128174f, 0.619141f, 0.125000f, 0.607422f, 0.120667f, 0.594727f, + 0.116089f, 0.582520f, 0.112000f, 0.565430f, 0.107849f, 0.548340f, 0.102722f, 0.530762f, + 0.097229f, 0.512207f, 0.091003f, 0.494141f, 0.084351f, 0.475342f, 0.077087f, 0.453125f, + 0.070435f, 0.423828f, 0.062805f, 0.394287f, 0.054779f, 0.363281f, 0.045197f, 0.329834f, + 0.034973f, 0.291260f, 0.025497f, 0.232422f, 0.013664f, 0.169312f, 0.002337f, 0.053894f, + 0.000000f, 1.000000f, 0.008675f, 0.994629f, 0.016830f, 0.986816f, 0.024796f, 0.978027f, + 0.033447f, 0.968750f, 0.041473f, 0.958984f, 0.049957f, 0.948730f, 0.056702f, 0.939941f, + 0.064758f, 0.929199f, 0.071960f, 0.919434f, 0.078735f, 0.910156f, 0.085144f, 0.900391f, + 0.092285f, 0.889648f, 0.098633f, 0.880371f, 0.103516f, 0.872559f, 0.109558f, 0.863281f, + 0.115051f, 0.852539f, 0.120544f, 0.843750f, 0.125732f, 0.835449f, 0.129883f, 0.828125f, + 0.133789f, 0.819336f, 0.137573f, 0.810059f, 0.142456f, 0.801758f, 0.145142f, 0.794434f, + 0.148071f, 0.787598f, 0.149780f, 0.781738f, 0.152466f, 0.773926f, 0.154907f, 0.766113f, + 0.156616f, 0.759277f, 0.158325f, 0.752930f, 0.159180f, 0.746582f, 0.159180f, 0.740723f, + 0.159546f, 0.734863f, 0.160278f, 0.725586f, 0.160522f, 0.717773f, 0.160278f, 0.708984f, + 0.159912f, 0.702148f, 0.158569f, 0.694336f, 0.157227f, 0.687500f, 0.155884f, 0.680176f, + 0.153931f, 0.669434f, 0.152344f, 0.658691f, 0.149780f, 0.647461f, 0.147339f, 0.637207f, + 0.144287f, 0.626953f, 0.140625f, 0.616211f, 0.136597f, 0.604980f, 0.131958f, 0.592773f, + 0.128052f, 0.576660f, 0.123840f, 0.561035f, 0.118469f, 0.545410f, 0.112732f, 0.528809f, + 0.106262f, 0.511719f, 0.099121f, 0.494385f, 0.091797f, 0.474365f, 0.085327f, 0.447998f, + 0.077637f, 0.420898f, 0.069214f, 0.393311f, 0.059723f, 0.363037f, 0.049408f, 0.331055f, + 0.038940f, 0.287842f, 0.028168f, 0.233154f, 0.014854f, 0.169922f, 0.002617f, 0.054565f, + 0.000000f, 1.000000f, 0.009232f, 0.994141f, 0.018173f, 0.986328f, 0.027130f, 0.976562f, + 0.035339f, 0.968262f, 0.045166f, 0.957031f, 0.053101f, 0.947754f, 0.060852f, 0.937012f, + 0.069824f, 0.926270f, 0.077209f, 0.917480f, 0.085205f, 0.906250f, 0.092651f, 0.895508f, + 0.099609f, 0.886230f, 0.105286f, 0.877930f, 0.113342f, 0.866211f, 0.119629f, 0.856445f, + 0.125366f, 0.847168f, 0.130005f, 0.838867f, 0.135376f, 0.830078f, 0.141724f, 0.819336f, + 0.146484f, 0.811035f, 0.149658f, 0.802734f, 0.154053f, 0.795410f, 0.157959f, 0.788574f, + 0.160522f, 0.779785f, 0.164185f, 0.770996f, 0.166748f, 0.763672f, 0.169556f, 0.757324f, + 0.170654f, 0.750977f, 0.171265f, 0.745605f, 0.173218f, 0.738770f, 0.174316f, 0.730957f, + 0.175415f, 0.723145f, 0.175537f, 0.716797f, 0.175293f, 0.709473f, 0.174927f, 0.703125f, + 0.174072f, 0.695801f, 0.172485f, 0.689453f, 0.171265f, 0.679688f, 0.170654f, 0.670410f, + 0.168823f, 0.661133f, 0.165649f, 0.651855f, 0.163696f, 0.642578f, 0.160522f, 0.633301f, + 0.156616f, 0.623535f, 0.152954f, 0.613770f, 0.149170f, 0.600098f, 0.144775f, 0.586426f, + 0.140259f, 0.572266f, 0.134888f, 0.558105f, 0.129150f, 0.543457f, 0.122437f, 0.527344f, + 0.115417f, 0.510742f, 0.108276f, 0.491699f, 0.101013f, 0.468750f, 0.093323f, 0.444824f, + 0.084839f, 0.419678f, 0.075439f, 0.393066f, 0.065125f, 0.364258f, 0.053772f, 0.331787f, + 0.042877f, 0.285400f, 0.030746f, 0.232910f, 0.016144f, 0.171509f, 0.002817f, 0.054291f, + 0.000000f, 1.000000f, 0.008987f, 0.994629f, 0.018814f, 0.986328f, 0.029449f, 0.975586f, + 0.039124f, 0.965332f, 0.048492f, 0.956055f, 0.057098f, 0.945312f, 0.066772f, 0.934570f, + 0.074280f, 0.925293f, 0.084045f, 0.912598f, 0.091675f, 0.902832f, 0.099365f, 0.893066f, + 0.107788f, 0.881836f, 0.114929f, 0.871094f, 0.121765f, 0.860840f, 0.127930f, 0.852539f, + 0.135742f, 0.841309f, 0.141724f, 0.831543f, 0.147461f, 0.822266f, 0.153320f, 0.812988f, + 0.157593f, 0.804688f, 0.162109f, 0.796387f, 0.166870f, 0.786621f, 0.171021f, 0.777832f, + 0.175659f, 0.770508f, 0.178101f, 0.763184f, 0.180298f, 0.756836f, 0.182495f, 0.750000f, + 0.185425f, 0.741699f, 0.187256f, 0.734375f, 0.188721f, 0.727539f, 0.189697f, 0.720703f, + 0.189697f, 0.715332f, 0.190308f, 0.708496f, 0.189819f, 0.703125f, 0.189575f, 0.694824f, + 0.189819f, 0.687012f, 0.188477f, 0.679199f, 0.187012f, 0.671387f, 0.185059f, 0.663574f, + 0.183228f, 0.655762f, 0.179688f, 0.647461f, 0.177002f, 0.639160f, 0.173340f, 0.629395f, + 0.170532f, 0.618164f, 0.166992f, 0.606445f, 0.161987f, 0.593750f, 0.157104f, 0.582031f, + 0.151855f, 0.568848f, 0.146240f, 0.555664f, 0.139893f, 0.541504f, 0.132446f, 0.525879f, + 0.125977f, 0.506836f, 0.118530f, 0.486816f, 0.110352f, 0.465576f, 0.101868f, 0.443359f, + 0.091919f, 0.418945f, 0.081726f, 0.393555f, 0.070129f, 0.365234f, 0.058929f, 0.327393f, + 0.046570f, 0.283691f, 0.033203f, 0.233398f, 0.017288f, 0.172241f, 0.003036f, 0.054382f, + 0.000000f, 1.000000f, 0.010231f, 0.993652f, 0.020981f, 0.984863f, 0.031113f, 0.975098f, + 0.041016f, 0.965332f, 0.051483f, 0.954102f, 0.061768f, 0.943359f, 0.070801f, 0.932129f, + 0.080688f, 0.921387f, 0.089783f, 0.910645f, 0.098816f, 0.898926f, 0.107605f, 0.888184f, + 0.116211f, 0.877930f, 0.123169f, 0.867188f, 0.130981f, 0.855957f, 0.139282f, 0.845215f, + 0.145630f, 0.835449f, 0.151855f, 0.826660f, 0.157959f, 0.816406f, 0.163696f, 0.806641f, + 0.170410f, 0.796387f, 0.175293f, 0.787598f, 0.179565f, 0.779297f, 0.184082f, 0.771484f, + 0.188110f, 0.762207f, 0.192261f, 0.753906f, 0.195435f, 0.745605f, 0.197510f, 0.738770f, + 0.199829f, 0.731934f, 0.202271f, 0.725586f, 0.203125f, 0.719727f, 0.204346f, 0.713379f, + 0.205322f, 0.706055f, 0.205933f, 0.699219f, 0.205811f, 0.692383f, 0.205322f, 0.686035f, + 0.204346f, 0.679688f, 0.203491f, 0.672363f, 0.201904f, 0.666016f, 0.199097f, 0.658691f, + 0.197388f, 0.649414f, 0.194458f, 0.640137f, 0.192017f, 0.630859f, 0.188599f, 0.621582f, + 0.184814f, 0.610840f, 0.180176f, 0.600098f, 0.175537f, 0.589355f, 0.169800f, 0.578613f, + 0.163940f, 0.566406f, 0.157715f, 0.552246f, 0.151489f, 0.536621f, 0.144043f, 0.520020f, + 0.136719f, 0.502441f, 0.128296f, 0.484131f, 0.119812f, 0.464600f, 0.109863f, 0.442871f, + 0.099304f, 0.419434f, 0.088135f, 0.394775f, 0.076477f, 0.361816f, 0.064148f, 0.324951f, + 0.050781f, 0.284180f, 0.035797f, 0.234619f, 0.018677f, 0.174194f, 0.003256f, 0.054749f, + 0.000000f, 1.000000f, 0.010963f, 0.993652f, 0.021759f, 0.984863f, 0.033356f, 0.975098f, + 0.044403f, 0.963379f, 0.054718f, 0.953125f, 0.066101f, 0.940918f, 0.075806f, 0.930664f, + 0.086243f, 0.917969f, 0.096436f, 0.907227f, 0.105530f, 0.895996f, 0.114624f, 0.884277f, + 0.123718f, 0.872559f, 0.131958f, 0.862305f, 0.140015f, 0.851562f, 0.148682f, 0.839844f, + 0.156006f, 0.829102f, 0.163696f, 0.819336f, 0.169556f, 0.809570f, 0.175659f, 0.799805f, + 0.182373f, 0.790039f, 0.187012f, 0.780762f, 0.192505f, 0.771484f, 0.197754f, 0.762695f, + 0.201660f, 0.754395f, 0.205811f, 0.746582f, 0.209229f, 0.738770f, 0.211914f, 0.730957f, + 0.214966f, 0.722656f, 0.216675f, 0.715820f, 0.218750f, 0.708496f, 0.220215f, 0.702637f, + 0.221069f, 0.696289f, 0.221191f, 0.690430f, 0.221313f, 0.684570f, 0.221069f, 0.677246f, + 0.219849f, 0.670410f, 0.219360f, 0.663086f, 0.217041f, 0.655273f, 0.215332f, 0.648438f, + 0.212891f, 0.640625f, 0.210205f, 0.632324f, 0.206665f, 0.624512f, 0.202393f, 0.615723f, + 0.198364f, 0.606445f, 0.193604f, 0.596191f, 0.188354f, 0.584961f, 0.182861f, 0.572754f, + 0.176636f, 0.560059f, 0.170410f, 0.546387f, 0.163452f, 0.532227f, 0.155762f, 0.517090f, + 0.147217f, 0.500488f, 0.138306f, 0.483154f, 0.128540f, 0.464111f, 0.117737f, 0.443115f, + 0.107361f, 0.418457f, 0.095337f, 0.390625f, 0.082520f, 0.359863f, 0.069275f, 0.324707f, + 0.054626f, 0.284424f, 0.038544f, 0.235840f, 0.019958f, 0.175537f, 0.003546f, 0.055634f, + 0.000000f, 1.000000f, 0.012215f, 0.993164f, 0.023682f, 0.984375f, 0.035767f, 0.974121f, + 0.047485f, 0.961914f, 0.058838f, 0.950684f, 0.070312f, 0.939453f, 0.081848f, 0.927246f, + 0.092224f, 0.915527f, 0.102295f, 0.904297f, 0.112793f, 0.892090f, 0.122742f, 0.880371f, + 0.131714f, 0.869629f, 0.140503f, 0.858398f, 0.149536f, 0.846191f, 0.158081f, 0.834961f, + 0.165649f, 0.823730f, 0.174194f, 0.812988f, 0.181641f, 0.802734f, 0.187622f, 0.792480f, + 0.195312f, 0.781738f, 0.200928f, 0.771973f, 0.205933f, 0.762695f, 0.210938f, 0.753906f, + 0.216675f, 0.744629f, 0.220581f, 0.736328f, 0.224243f, 0.728516f, 0.227295f, 0.720703f, + 0.230469f, 0.712402f, 0.233398f, 0.705078f, 0.234985f, 0.698242f, 0.236206f, 0.691406f, + 0.236938f, 0.685547f, 0.238037f, 0.679199f, 0.237183f, 0.673340f, 0.237305f, 0.667480f, + 0.236694f, 0.661133f, 0.234253f, 0.655273f, 0.233154f, 0.648438f, 0.231201f, 0.640625f, + 0.228027f, 0.633301f, 0.225464f, 0.625000f, 0.221802f, 0.617188f, 0.217529f, 0.608398f, + 0.213745f, 0.599609f, 0.208252f, 0.589355f, 0.202393f, 0.579102f, 0.196655f, 0.568359f, + 0.189941f, 0.556152f, 0.182739f, 0.543457f, 0.174805f, 0.530273f, 0.166992f, 0.515625f, + 0.157471f, 0.498535f, 0.148071f, 0.480713f, 0.137939f, 0.461182f, 0.126953f, 0.439209f, + 0.114990f, 0.415283f, 0.102417f, 0.388672f, 0.088989f, 0.358887f, 0.074463f, 0.324951f, + 0.058289f, 0.285400f, 0.041046f, 0.237427f, 0.021713f, 0.171631f, 0.003746f, 0.055847f, + 0.000000f, 1.000000f, 0.012253f, 0.993652f, 0.025192f, 0.983398f, 0.038239f, 0.972168f, + 0.050659f, 0.960449f, 0.062988f, 0.948730f, 0.075439f, 0.936523f, 0.086792f, 0.924805f, + 0.097900f, 0.912598f, 0.109253f, 0.900391f, 0.119995f, 0.887695f, 0.130249f, 0.875977f, + 0.140015f, 0.864258f, 0.150269f, 0.852051f, 0.160278f, 0.840332f, 0.169067f, 0.828613f, + 0.177368f, 0.817383f, 0.185669f, 0.806641f, 0.193359f, 0.795898f, 0.200439f, 0.785645f, + 0.207642f, 0.774902f, 0.213989f, 0.765137f, 0.220703f, 0.754883f, 0.225342f, 0.745605f, + 0.231567f, 0.736328f, 0.234863f, 0.727539f, 0.238892f, 0.719238f, 0.242920f, 0.710938f, + 0.245483f, 0.703613f, 0.248901f, 0.695312f, 0.250732f, 0.688477f, 0.251709f, 0.682129f, + 0.253418f, 0.675293f, 0.253418f, 0.669922f, 0.253662f, 0.663574f, 0.253174f, 0.657715f, + 0.252686f, 0.651855f, 0.250977f, 0.645996f, 0.249268f, 0.639160f, 0.247437f, 0.632812f, + 0.244141f, 0.625977f, 0.240967f, 0.618164f, 0.237183f, 0.610840f, 0.232178f, 0.602051f, + 0.227417f, 0.593750f, 0.222168f, 0.583984f, 0.216309f, 0.574219f, 0.210327f, 0.563477f, + 0.203613f, 0.551758f, 0.195679f, 0.539062f, 0.186646f, 0.525879f, 0.178345f, 0.511230f, + 0.168701f, 0.495117f, 0.158569f, 0.477783f, 0.147583f, 0.458740f, 0.135376f, 0.437744f, + 0.122864f, 0.414551f, 0.109924f, 0.388916f, 0.095093f, 0.359619f, 0.079529f, 0.325684f, + 0.062469f, 0.286133f, 0.044067f, 0.236450f, 0.023499f, 0.169922f, 0.004017f, 0.056610f, + 0.000000f, 1.000000f, 0.013107f, 0.993164f, 0.026093f, 0.983398f, 0.039032f, 0.972656f, + 0.052094f, 0.960938f, 0.065063f, 0.948242f, 0.077698f, 0.936035f, 0.089539f, 0.923828f, + 0.101074f, 0.911621f, 0.113403f, 0.898438f, 0.123840f, 0.886719f, 0.134888f, 0.874023f, + 0.144897f, 0.861816f, 0.155396f, 0.849609f, 0.165405f, 0.837891f, 0.174805f, 0.826172f, + 0.183838f, 0.814453f, 0.191895f, 0.803223f, 0.200684f, 0.791992f, 0.208130f, 0.781250f, + 0.214966f, 0.770996f, 0.221802f, 0.760742f, 0.228638f, 0.750488f, 0.233643f, 0.741211f, + 0.239380f, 0.731445f, 0.243774f, 0.722656f, 0.248779f, 0.713379f, 0.252686f, 0.705566f, + 0.256348f, 0.697266f, 0.259277f, 0.689453f, 0.262207f, 0.682129f, 0.263672f, 0.674805f, + 0.264404f, 0.668457f, 0.265869f, 0.662109f, 0.266357f, 0.656250f, 0.265625f, 0.650391f, + 0.265137f, 0.644531f, 0.263672f, 0.638184f, 0.261963f, 0.632324f, 0.259766f, 0.625977f, + 0.257080f, 0.619141f, 0.254150f, 0.612305f, 0.250244f, 0.604492f, 0.246094f, 0.596191f, + 0.241455f, 0.588379f, 0.236572f, 0.579102f, 0.230347f, 0.569336f, 0.223999f, 0.559082f, + 0.216919f, 0.547852f, 0.209106f, 0.535156f, 0.200806f, 0.521973f, 0.192139f, 0.508301f, + 0.181885f, 0.491943f, 0.171387f, 0.475098f, 0.160400f, 0.456299f, 0.148315f, 0.435547f, + 0.135132f, 0.412598f, 0.121704f, 0.386963f, 0.106140f, 0.357422f, 0.090454f, 0.323975f, + 0.072388f, 0.284668f, 0.052643f, 0.235352f, 0.030457f, 0.169189f, 0.006878f, 0.060669f, + 0.000000f, 1.000000f, 0.013000f, 0.993164f, 0.026215f, 0.983398f, 0.039032f, 0.972656f, + 0.052002f, 0.960938f, 0.064575f, 0.948730f, 0.077454f, 0.936523f, 0.089417f, 0.923828f, + 0.101440f, 0.911133f, 0.113586f, 0.898438f, 0.124390f, 0.886230f, 0.135620f, 0.873535f, + 0.145996f, 0.861816f, 0.156494f, 0.849121f, 0.166504f, 0.837402f, 0.176147f, 0.825684f, + 0.184570f, 0.813965f, 0.193481f, 0.802246f, 0.201660f, 0.791504f, 0.210449f, 0.779785f, + 0.217285f, 0.770020f, 0.224976f, 0.758789f, 0.231201f, 0.749023f, 0.237671f, 0.738770f, + 0.243408f, 0.729492f, 0.248901f, 0.720215f, 0.253174f, 0.711426f, 0.257568f, 0.702637f, + 0.261719f, 0.693848f, 0.264160f, 0.686523f, 0.266846f, 0.678711f, 0.270508f, 0.670898f, + 0.271729f, 0.664551f, 0.273438f, 0.657715f, 0.273682f, 0.651855f, 0.273926f, 0.645996f, + 0.273193f, 0.639648f, 0.273438f, 0.633301f, 0.271240f, 0.627441f, 0.270020f, 0.620605f, + 0.267578f, 0.613770f, 0.265137f, 0.606934f, 0.261963f, 0.599121f, 0.258301f, 0.591309f, + 0.253418f, 0.582520f, 0.249268f, 0.574219f, 0.243408f, 0.563965f, 0.237061f, 0.554199f, + 0.230957f, 0.542969f, 0.223999f, 0.530762f, 0.216187f, 0.517578f, 0.207520f, 0.503418f, + 0.198242f, 0.488037f, 0.188232f, 0.471436f, 0.177246f, 0.452637f, 0.165283f, 0.432617f, + 0.152466f, 0.409424f, 0.138550f, 0.384277f, 0.123474f, 0.355469f, 0.107422f, 0.322266f, + 0.088745f, 0.283203f, 0.068054f, 0.234253f, 0.043793f, 0.168579f, 0.014336f, 0.061371f, + 0.000000f, 1.000000f, 0.013023f, 0.993164f, 0.026016f, 0.983398f, 0.039551f, 0.972168f, + 0.051727f, 0.960938f, 0.064941f, 0.948730f, 0.077148f, 0.936523f, 0.089233f, 0.923828f, + 0.101868f, 0.911133f, 0.113586f, 0.898438f, 0.125244f, 0.886230f, 0.135986f, 0.873535f, + 0.147583f, 0.860840f, 0.157715f, 0.848633f, 0.167969f, 0.836914f, 0.177368f, 0.824707f, + 0.186279f, 0.813477f, 0.195923f, 0.801758f, 0.204346f, 0.790039f, 0.212402f, 0.779297f, + 0.220215f, 0.768066f, 0.227295f, 0.757812f, 0.234497f, 0.747070f, 0.241333f, 0.737305f, + 0.247559f, 0.727051f, 0.252441f, 0.717773f, 0.258057f, 0.708496f, 0.262451f, 0.699707f, + 0.266846f, 0.691406f, 0.270508f, 0.682617f, 0.273682f, 0.674805f, 0.277100f, 0.666992f, + 0.278564f, 0.660156f, 0.280029f, 0.653320f, 0.281250f, 0.646973f, 0.281982f, 0.640625f, + 0.281982f, 0.634766f, 0.282471f, 0.627930f, 0.281006f, 0.621582f, 0.280029f, 0.615234f, + 0.278564f, 0.608398f, 0.276123f, 0.601562f, 0.273193f, 0.593750f, 0.269775f, 0.585938f, + 0.266113f, 0.577148f, 0.262451f, 0.568848f, 0.257324f, 0.559082f, 0.251221f, 0.548340f, + 0.246094f, 0.538086f, 0.239258f, 0.525879f, 0.231567f, 0.513184f, 0.223267f, 0.498779f, + 0.214844f, 0.483887f, 0.204956f, 0.467529f, 0.194336f, 0.449219f, 0.182495f, 0.428955f, + 0.170654f, 0.406250f, 0.156860f, 0.381104f, 0.141357f, 0.352783f, 0.125000f, 0.320068f, + 0.106384f, 0.281494f, 0.084900f, 0.233032f, 0.059113f, 0.168091f, 0.025330f, 0.061462f, + 0.000000f, 1.000000f, 0.013138f, 0.993164f, 0.025894f, 0.983398f, 0.039368f, 0.972168f, + 0.052155f, 0.960449f, 0.064880f, 0.948730f, 0.077698f, 0.936035f, 0.090393f, 0.923340f, + 0.102478f, 0.911133f, 0.113831f, 0.898438f, 0.124756f, 0.886230f, 0.136841f, 0.873047f, + 0.147217f, 0.861328f, 0.158325f, 0.848633f, 0.169067f, 0.836426f, 0.178955f, 0.824219f, + 0.188232f, 0.812012f, 0.197510f, 0.800781f, 0.206665f, 0.789062f, 0.214966f, 0.777832f, + 0.222656f, 0.767090f, 0.229980f, 0.756348f, 0.238281f, 0.745605f, 0.244385f, 0.735352f, + 0.251221f, 0.725098f, 0.256592f, 0.715332f, 0.261963f, 0.706055f, 0.267090f, 0.696777f, + 0.271240f, 0.688477f, 0.277100f, 0.679688f, 0.280518f, 0.671387f, 0.282227f, 0.663574f, + 0.285645f, 0.656250f, 0.287354f, 0.648926f, 0.289551f, 0.642090f, 0.291016f, 0.635254f, + 0.291016f, 0.629395f, 0.291260f, 0.622559f, 0.291016f, 0.616211f, 0.290283f, 0.609375f, + 0.289062f, 0.602539f, 0.287109f, 0.595215f, 0.285400f, 0.588379f, 0.282227f, 0.580078f, + 0.279541f, 0.571777f, 0.274658f, 0.562988f, 0.271240f, 0.553223f, 0.265625f, 0.542969f, + 0.259766f, 0.532715f, 0.254639f, 0.520508f, 0.247314f, 0.507812f, 0.239990f, 0.494629f, + 0.231323f, 0.479248f, 0.222290f, 0.462402f, 0.211914f, 0.444336f, 0.201050f, 0.424805f, + 0.189087f, 0.402588f, 0.175415f, 0.377686f, 0.161255f, 0.349609f, 0.144531f, 0.316650f, + 0.125732f, 0.277588f, 0.104248f, 0.229980f, 0.076416f, 0.165527f, 0.039185f, 0.059326f, + 0.000000f, 1.000000f, 0.013107f, 0.992676f, 0.026016f, 0.983398f, 0.039429f, 0.972168f, + 0.052490f, 0.960449f, 0.065125f, 0.948730f, 0.078064f, 0.936035f, 0.090576f, 0.923340f, + 0.102539f, 0.911133f, 0.114441f, 0.898438f, 0.126343f, 0.885742f, 0.137939f, 0.873047f, + 0.148926f, 0.860352f, 0.159302f, 0.848145f, 0.169800f, 0.835938f, 0.179443f, 0.823730f, + 0.189941f, 0.811523f, 0.199463f, 0.799805f, 0.208740f, 0.788086f, 0.216797f, 0.776855f, + 0.224976f, 0.765625f, 0.233765f, 0.754395f, 0.240601f, 0.744141f, 0.247803f, 0.733398f, + 0.254639f, 0.723145f, 0.260986f, 0.713379f, 0.267334f, 0.703125f, 0.272217f, 0.693848f, + 0.277588f, 0.684570f, 0.281494f, 0.676270f, 0.285400f, 0.667969f, 0.289062f, 0.659668f, + 0.292725f, 0.651367f, 0.294922f, 0.644043f, 0.298096f, 0.636719f, 0.298584f, 0.630371f, + 0.300781f, 0.624023f, 0.300293f, 0.617188f, 0.301514f, 0.610352f, 0.301025f, 0.603516f, + 0.300049f, 0.596680f, 0.299072f, 0.589355f, 0.296631f, 0.582031f, 0.294678f, 0.573730f, + 0.291748f, 0.565430f, 0.288574f, 0.556152f, 0.285645f, 0.547363f, 0.280029f, 0.537109f, + 0.275391f, 0.525879f, 0.270508f, 0.514160f, 0.263916f, 0.501465f, 0.256836f, 0.488037f, + 0.249268f, 0.473145f, 0.240479f, 0.456299f, 0.231079f, 0.438477f, 0.220581f, 0.419189f, + 0.208130f, 0.397461f, 0.195557f, 0.373047f, 0.181152f, 0.345703f, 0.164307f, 0.313477f, + 0.146118f, 0.275635f, 0.123596f, 0.229370f, 0.095337f, 0.164917f, 0.054840f, 0.059937f, + 0.000000f, 1.000000f, 0.012680f, 0.993164f, 0.025787f, 0.983887f, 0.039124f, 0.972656f, + 0.052582f, 0.960449f, 0.065491f, 0.948242f, 0.077576f, 0.936523f, 0.090454f, 0.923340f, + 0.102783f, 0.910645f, 0.115173f, 0.897949f, 0.127075f, 0.885254f, 0.138062f, 0.872559f, + 0.149536f, 0.860352f, 0.160767f, 0.847656f, 0.171143f, 0.834961f, 0.181885f, 0.822754f, + 0.191406f, 0.810547f, 0.201538f, 0.798340f, 0.210693f, 0.787109f, 0.219604f, 0.775391f, + 0.228027f, 0.764160f, 0.236206f, 0.752930f, 0.244507f, 0.742188f, 0.251465f, 0.731445f, + 0.258789f, 0.720703f, 0.264648f, 0.710938f, 0.271240f, 0.700684f, 0.276611f, 0.691406f, + 0.283447f, 0.681152f, 0.287598f, 0.672363f, 0.292236f, 0.663574f, 0.296143f, 0.655273f, + 0.301025f, 0.646973f, 0.303223f, 0.639160f, 0.305908f, 0.631836f, 0.307617f, 0.625000f, + 0.309570f, 0.617676f, 0.310547f, 0.611328f, 0.311523f, 0.604004f, 0.311768f, 0.597168f, + 0.311279f, 0.589355f, 0.310303f, 0.582031f, 0.309570f, 0.574707f, 0.308105f, 0.566895f, + 0.305664f, 0.558105f, 0.303467f, 0.549316f, 0.300049f, 0.540039f, 0.295898f, 0.530273f, + 0.291504f, 0.519531f, 0.286621f, 0.508301f, 0.280518f, 0.495850f, 0.273926f, 0.482178f, + 0.266357f, 0.468018f, 0.258789f, 0.451660f, 0.249390f, 0.434326f, 0.239380f, 0.415283f, + 0.227905f, 0.393555f, 0.215820f, 0.369873f, 0.201294f, 0.342285f, 0.185181f, 0.311035f, + 0.166626f, 0.273682f, 0.144653f, 0.227173f, 0.116333f, 0.162964f, 0.073181f, 0.059082f, + 0.000000f, 1.000000f, 0.012787f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.972656f, + 0.052216f, 0.960938f, 0.065063f, 0.948730f, 0.078064f, 0.936035f, 0.091064f, 0.923340f, + 0.103027f, 0.911133f, 0.115295f, 0.897949f, 0.127197f, 0.885254f, 0.138916f, 0.872559f, + 0.150513f, 0.859375f, 0.161377f, 0.847168f, 0.172363f, 0.834473f, 0.183350f, 0.822266f, + 0.193970f, 0.809570f, 0.203369f, 0.797852f, 0.213013f, 0.786133f, 0.221191f, 0.774414f, + 0.230469f, 0.762695f, 0.240234f, 0.750977f, 0.246948f, 0.740234f, 0.255371f, 0.729004f, + 0.262207f, 0.718750f, 0.269775f, 0.708008f, 0.276855f, 0.697754f, 0.282715f, 0.687500f, + 0.287842f, 0.678223f, 0.293945f, 0.668457f, 0.299316f, 0.659668f, 0.303223f, 0.650391f, + 0.308105f, 0.641602f, 0.311279f, 0.633301f, 0.313721f, 0.625977f, 0.316650f, 0.618652f, + 0.318848f, 0.611328f, 0.320801f, 0.604492f, 0.321045f, 0.597656f, 0.322998f, 0.590332f, + 0.322266f, 0.583008f, 0.322510f, 0.576172f, 0.321533f, 0.568359f, 0.321045f, 0.560547f, + 0.319336f, 0.552246f, 0.317139f, 0.543457f, 0.313721f, 0.533691f, 0.310303f, 0.524414f, + 0.306885f, 0.513672f, 0.301758f, 0.501953f, 0.297607f, 0.489990f, 0.291260f, 0.476562f, + 0.284424f, 0.462646f, 0.277344f, 0.446777f, 0.268066f, 0.429199f, 0.259277f, 0.410400f, + 0.248413f, 0.389404f, 0.236572f, 0.364990f, 0.223389f, 0.338623f, 0.207153f, 0.307129f, + 0.189087f, 0.269775f, 0.166626f, 0.225098f, 0.137939f, 0.162964f, 0.093628f, 0.059509f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.026138f, 0.983398f, 0.039093f, 0.972656f, + 0.052246f, 0.960938f, 0.065308f, 0.948730f, 0.078552f, 0.936035f, 0.091675f, 0.923340f, + 0.103271f, 0.911133f, 0.116028f, 0.897949f, 0.127808f, 0.885254f, 0.139526f, 0.872070f, + 0.151611f, 0.859375f, 0.163208f, 0.846191f, 0.173584f, 0.833984f, 0.184937f, 0.821289f, + 0.194214f, 0.809082f, 0.205322f, 0.796387f, 0.214478f, 0.784668f, 0.225098f, 0.772461f, + 0.233765f, 0.760742f, 0.241577f, 0.749512f, 0.251709f, 0.737305f, 0.258789f, 0.726562f, + 0.266357f, 0.715820f, 0.274658f, 0.704590f, 0.282227f, 0.693848f, 0.288574f, 0.683594f, + 0.294678f, 0.673828f, 0.300537f, 0.664062f, 0.305420f, 0.655273f, 0.310303f, 0.645996f, + 0.314209f, 0.637695f, 0.319824f, 0.628418f, 0.322510f, 0.620605f, 0.324951f, 0.613281f, + 0.328125f, 0.605469f, 0.330078f, 0.598633f, 0.331543f, 0.591797f, 0.333252f, 0.583984f, + 0.333740f, 0.577148f, 0.334229f, 0.569824f, 0.333740f, 0.562012f, 0.333252f, 0.554199f, + 0.332520f, 0.545898f, 0.330322f, 0.536621f, 0.328369f, 0.527832f, 0.325928f, 0.517578f, + 0.322754f, 0.507324f, 0.318115f, 0.496338f, 0.315430f, 0.484131f, 0.309082f, 0.470215f, + 0.302979f, 0.456055f, 0.296143f, 0.440674f, 0.287842f, 0.423584f, 0.279297f, 0.404785f, + 0.269287f, 0.384277f, 0.257812f, 0.361084f, 0.244629f, 0.334717f, 0.229858f, 0.303955f, + 0.212036f, 0.267334f, 0.190186f, 0.221924f, 0.160767f, 0.160522f, 0.115051f, 0.058319f, + 0.000000f, 1.000000f, 0.012390f, 0.993652f, 0.025955f, 0.983398f, 0.039337f, 0.972656f, + 0.051727f, 0.961426f, 0.065369f, 0.948730f, 0.078430f, 0.936035f, 0.090698f, 0.923828f, + 0.104248f, 0.910156f, 0.116821f, 0.897461f, 0.128540f, 0.884277f, 0.140625f, 0.871582f, + 0.152100f, 0.858398f, 0.163818f, 0.846191f, 0.174927f, 0.833008f, 0.186523f, 0.820312f, + 0.196777f, 0.807617f, 0.207886f, 0.795410f, 0.217285f, 0.783203f, 0.226685f, 0.770996f, + 0.236694f, 0.758301f, 0.245850f, 0.747070f, 0.254883f, 0.734863f, 0.262939f, 0.724121f, + 0.271973f, 0.712402f, 0.279053f, 0.702148f, 0.286377f, 0.690918f, 0.292236f, 0.681152f, + 0.299805f, 0.670898f, 0.305420f, 0.661133f, 0.311279f, 0.651367f, 0.316895f, 0.642090f, + 0.321777f, 0.633301f, 0.326904f, 0.624512f, 0.330811f, 0.615723f, 0.333740f, 0.607910f, + 0.336670f, 0.600098f, 0.339355f, 0.592773f, 0.342285f, 0.585449f, 0.344238f, 0.578125f, + 0.345215f, 0.570312f, 0.345947f, 0.562988f, 0.346924f, 0.554688f, 0.345947f, 0.547363f, + 0.345947f, 0.538574f, 0.345459f, 0.529297f, 0.344238f, 0.520508f, 0.341309f, 0.510254f, + 0.338379f, 0.500000f, 0.334961f, 0.489258f, 0.331299f, 0.477051f, 0.326660f, 0.463867f, + 0.321045f, 0.449707f, 0.314941f, 0.434814f, 0.307617f, 0.418457f, 0.299561f, 0.399414f, + 0.290771f, 0.379395f, 0.279785f, 0.355957f, 0.267822f, 0.329834f, 0.253174f, 0.299805f, + 0.235718f, 0.264404f, 0.214233f, 0.219727f, 0.186035f, 0.159302f, 0.139648f, 0.058105f, + 0.000000f, 1.000000f, 0.012421f, 0.993652f, 0.026154f, 0.983398f, 0.039032f, 0.972656f, + 0.051605f, 0.961426f, 0.065491f, 0.948730f, 0.078247f, 0.936523f, 0.091797f, 0.922852f, + 0.105103f, 0.910156f, 0.116699f, 0.897461f, 0.129639f, 0.883789f, 0.141357f, 0.871094f, + 0.153442f, 0.857910f, 0.164917f, 0.845215f, 0.176636f, 0.832031f, 0.187866f, 0.819336f, + 0.199097f, 0.806152f, 0.209473f, 0.793457f, 0.219604f, 0.781250f, 0.230957f, 0.768555f, + 0.239746f, 0.756836f, 0.249512f, 0.744629f, 0.258301f, 0.733398f, 0.266602f, 0.722168f, + 0.274658f, 0.710938f, 0.282959f, 0.699707f, 0.291016f, 0.688965f, 0.298584f, 0.678223f, + 0.304688f, 0.667969f, 0.311035f, 0.657715f, 0.317139f, 0.647949f, 0.322754f, 0.638672f, + 0.328613f, 0.628906f, 0.333008f, 0.620117f, 0.338623f, 0.611328f, 0.343018f, 0.602539f, + 0.346680f, 0.594238f, 0.349365f, 0.586426f, 0.352783f, 0.578613f, 0.354980f, 0.571289f, + 0.357178f, 0.563477f, 0.358154f, 0.555664f, 0.359619f, 0.547852f, 0.359375f, 0.540039f, + 0.359863f, 0.531738f, 0.359863f, 0.522461f, 0.358154f, 0.513184f, 0.357666f, 0.503418f, + 0.354248f, 0.493408f, 0.352051f, 0.482910f, 0.348877f, 0.470459f, 0.345459f, 0.457275f, + 0.341064f, 0.443359f, 0.334961f, 0.428711f, 0.328613f, 0.411865f, 0.321533f, 0.394043f, + 0.312012f, 0.374023f, 0.301758f, 0.351562f, 0.291260f, 0.325439f, 0.276123f, 0.295654f, + 0.260254f, 0.260742f, 0.239014f, 0.217529f, 0.211792f, 0.156494f, 0.165283f, 0.057495f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025940f, 0.983398f, 0.039276f, 0.972656f, + 0.052155f, 0.960938f, 0.065552f, 0.948730f, 0.078430f, 0.936035f, 0.091797f, 0.922852f, + 0.104614f, 0.910156f, 0.117310f, 0.896973f, 0.129028f, 0.884277f, 0.142822f, 0.870117f, + 0.154663f, 0.857422f, 0.166504f, 0.844238f, 0.178711f, 0.830566f, 0.190063f, 0.817383f, + 0.200928f, 0.805176f, 0.211670f, 0.792480f, 0.222778f, 0.779785f, 0.232422f, 0.767578f, + 0.242310f, 0.755859f, 0.251709f, 0.743652f, 0.260742f, 0.731934f, 0.269043f, 0.720703f, + 0.278564f, 0.708496f, 0.287354f, 0.697754f, 0.294922f, 0.686523f, 0.302002f, 0.675781f, + 0.310059f, 0.665039f, 0.317139f, 0.654297f, 0.322998f, 0.644531f, 0.330078f, 0.634277f, + 0.336670f, 0.624023f, 0.341797f, 0.614746f, 0.347168f, 0.605957f, 0.352051f, 0.596191f, + 0.356445f, 0.587891f, 0.359863f, 0.579590f, 0.362549f, 0.571777f, 0.365234f, 0.564453f, + 0.368896f, 0.556641f, 0.370361f, 0.548340f, 0.371582f, 0.541016f, 0.373047f, 0.532227f, + 0.373779f, 0.523926f, 0.373535f, 0.515625f, 0.374512f, 0.505371f, 0.372559f, 0.496338f, + 0.371094f, 0.485840f, 0.369385f, 0.474854f, 0.366455f, 0.463135f, 0.363281f, 0.450684f, + 0.360107f, 0.436768f, 0.354736f, 0.422363f, 0.350098f, 0.405029f, 0.342529f, 0.387451f, + 0.334473f, 0.368164f, 0.325684f, 0.345947f, 0.314941f, 0.320557f, 0.302246f, 0.291504f, + 0.285400f, 0.257080f, 0.265381f, 0.214355f, 0.238281f, 0.155151f, 0.192993f, 0.055817f, + 0.000000f, 1.000000f, 0.012619f, 0.993164f, 0.025803f, 0.983887f, 0.038879f, 0.972656f, + 0.051758f, 0.961426f, 0.065369f, 0.948730f, 0.079041f, 0.936035f, 0.091553f, 0.923340f, + 0.105469f, 0.909668f, 0.117310f, 0.896973f, 0.130737f, 0.883301f, 0.143188f, 0.869629f, + 0.155396f, 0.856445f, 0.167969f, 0.842773f, 0.179688f, 0.829590f, 0.191162f, 0.817383f, + 0.202393f, 0.804199f, 0.213379f, 0.791504f, 0.224854f, 0.778809f, 0.234741f, 0.766602f, + 0.244751f, 0.754395f, 0.255371f, 0.741699f, 0.263428f, 0.730469f, 0.273926f, 0.718262f, + 0.282959f, 0.706543f, 0.291016f, 0.695312f, 0.299805f, 0.684082f, 0.308594f, 0.672363f, + 0.316406f, 0.661133f, 0.323242f, 0.650391f, 0.330322f, 0.640137f, 0.337402f, 0.629883f, + 0.343506f, 0.620117f, 0.349854f, 0.609863f, 0.354980f, 0.600586f, 0.360596f, 0.591309f, + 0.364502f, 0.583008f, 0.369629f, 0.573730f, 0.372803f, 0.565430f, 0.376709f, 0.557617f, + 0.379883f, 0.549805f, 0.382812f, 0.541016f, 0.385010f, 0.533203f, 0.386963f, 0.524414f, + 0.387939f, 0.516113f, 0.388428f, 0.507324f, 0.389648f, 0.498047f, 0.388184f, 0.488525f, + 0.388672f, 0.478760f, 0.386475f, 0.467285f, 0.385254f, 0.455811f, 0.382080f, 0.442871f, + 0.380127f, 0.429932f, 0.375488f, 0.415039f, 0.370605f, 0.399414f, 0.364746f, 0.381348f, + 0.356934f, 0.361816f, 0.348389f, 0.340576f, 0.338623f, 0.315674f, 0.327637f, 0.287354f, + 0.312500f, 0.253174f, 0.292969f, 0.210938f, 0.267090f, 0.152832f, 0.220703f, 0.055206f, + 0.000000f, 1.000000f, 0.012627f, 0.993164f, 0.025696f, 0.983887f, 0.038879f, 0.973145f, + 0.052155f, 0.961426f, 0.065735f, 0.948242f, 0.079651f, 0.935547f, 0.092651f, 0.922363f, + 0.105652f, 0.909180f, 0.118713f, 0.895996f, 0.132080f, 0.881836f, 0.145020f, 0.868652f, + 0.157593f, 0.855469f, 0.169189f, 0.842285f, 0.180664f, 0.829590f, 0.192749f, 0.816406f, + 0.203979f, 0.803711f, 0.215454f, 0.790527f, 0.225830f, 0.778320f, 0.237183f, 0.765137f, + 0.247681f, 0.753418f, 0.257324f, 0.740723f, 0.267090f, 0.728516f, 0.277344f, 0.716309f, + 0.287354f, 0.704102f, 0.297119f, 0.691895f, 0.304932f, 0.680176f, 0.312988f, 0.669434f, + 0.321289f, 0.658203f, 0.329346f, 0.646973f, 0.336914f, 0.636230f, 0.343994f, 0.625488f, + 0.350098f, 0.615723f, 0.357422f, 0.605469f, 0.363525f, 0.595215f, 0.368652f, 0.586426f, + 0.374512f, 0.576660f, 0.380615f, 0.566895f, 0.384521f, 0.558105f, 0.387207f, 0.550781f, + 0.390869f, 0.542480f, 0.395264f, 0.534180f, 0.397705f, 0.525391f, 0.399902f, 0.517578f, + 0.402832f, 0.508301f, 0.403809f, 0.499512f, 0.404785f, 0.489990f, 0.405029f, 0.480469f, + 0.405029f, 0.470459f, 0.404541f, 0.459229f, 0.403320f, 0.447998f, 0.401855f, 0.435303f, + 0.400146f, 0.422119f, 0.395508f, 0.407471f, 0.392578f, 0.392090f, 0.386963f, 0.375488f, + 0.380127f, 0.355469f, 0.373535f, 0.334473f, 0.364258f, 0.310303f, 0.352783f, 0.282471f, + 0.339111f, 0.248413f, 0.321289f, 0.207153f, 0.295410f, 0.150024f, 0.250977f, 0.055573f, + 0.000000f, 1.000000f, 0.012405f, 0.993652f, 0.026001f, 0.983398f, 0.038910f, 0.972656f, + 0.052338f, 0.960938f, 0.066589f, 0.947754f, 0.078979f, 0.935547f, 0.093323f, 0.922363f, + 0.106750f, 0.908203f, 0.119690f, 0.895020f, 0.133423f, 0.881348f, 0.145630f, 0.868164f, + 0.156982f, 0.855469f, 0.170288f, 0.842285f, 0.181763f, 0.829102f, 0.193481f, 0.816406f, + 0.205933f, 0.802734f, 0.217285f, 0.790039f, 0.227539f, 0.777344f, 0.239746f, 0.764160f, + 0.249634f, 0.751465f, 0.261475f, 0.738281f, 0.271729f, 0.726074f, 0.281982f, 0.713379f, + 0.291504f, 0.701172f, 0.299805f, 0.689453f, 0.310059f, 0.678223f, 0.319092f, 0.666016f, + 0.326904f, 0.654785f, 0.335205f, 0.644043f, 0.343262f, 0.632812f, 0.351318f, 0.621582f, + 0.358398f, 0.610840f, 0.364990f, 0.600586f, 0.372559f, 0.589844f, 0.378174f, 0.580078f, + 0.383789f, 0.570801f, 0.388672f, 0.561523f, 0.394287f, 0.552246f, 0.398926f, 0.543457f, + 0.404297f, 0.534668f, 0.406738f, 0.526367f, 0.410889f, 0.517578f, 0.413086f, 0.509277f, + 0.416504f, 0.500488f, 0.417969f, 0.491455f, 0.420166f, 0.481934f, 0.421631f, 0.472168f, + 0.422119f, 0.462158f, 0.422852f, 0.451172f, 0.421631f, 0.439941f, 0.420410f, 0.428223f, + 0.419922f, 0.414307f, 0.416748f, 0.400146f, 0.414307f, 0.385010f, 0.408447f, 0.367920f, + 0.403809f, 0.348877f, 0.397705f, 0.327881f, 0.389404f, 0.304199f, 0.378418f, 0.276611f, + 0.366455f, 0.244507f, 0.349121f, 0.203491f, 0.324951f, 0.147583f, 0.282471f, 0.053955f, + 0.000000f, 1.000000f, 0.012566f, 0.993164f, 0.025864f, 0.983887f, 0.039215f, 0.972656f, + 0.052826f, 0.960449f, 0.066345f, 0.947754f, 0.079773f, 0.935059f, 0.093628f, 0.921387f, + 0.107666f, 0.908203f, 0.120300f, 0.894531f, 0.133301f, 0.881836f, 0.145386f, 0.868652f, + 0.158325f, 0.854980f, 0.171143f, 0.841797f, 0.183594f, 0.828613f, 0.195923f, 0.814941f, + 0.207397f, 0.802246f, 0.218872f, 0.789062f, 0.231201f, 0.775391f, 0.242188f, 0.762207f, + 0.253418f, 0.749512f, 0.264160f, 0.736816f, 0.273438f, 0.724121f, 0.284668f, 0.711914f, + 0.294189f, 0.699707f, 0.305420f, 0.687500f, 0.314209f, 0.675293f, 0.323486f, 0.663574f, + 0.333740f, 0.651367f, 0.341309f, 0.640137f, 0.349365f, 0.628906f, 0.357666f, 0.617676f, + 0.364746f, 0.606445f, 0.372070f, 0.596191f, 0.379883f, 0.585449f, 0.387695f, 0.574707f, + 0.393311f, 0.564941f, 0.399658f, 0.554688f, 0.405762f, 0.545410f, 0.410889f, 0.535645f, + 0.415039f, 0.527344f, 0.419678f, 0.518555f, 0.423584f, 0.510254f, 0.427734f, 0.500488f, + 0.432129f, 0.491943f, 0.434326f, 0.482910f, 0.435547f, 0.473877f, 0.439209f, 0.463623f, + 0.439697f, 0.453125f, 0.439941f, 0.442383f, 0.440674f, 0.431152f, 0.440918f, 0.419678f, + 0.439697f, 0.405762f, 0.437744f, 0.392578f, 0.435791f, 0.377197f, 0.432617f, 0.360840f, + 0.427734f, 0.342041f, 0.422363f, 0.321777f, 0.415527f, 0.297607f, 0.406250f, 0.271240f, + 0.395020f, 0.239014f, 0.378418f, 0.199463f, 0.355957f, 0.145142f, 0.315918f, 0.052887f, + 0.000000f, 1.000000f, 0.012573f, 0.993164f, 0.025833f, 0.983398f, 0.039368f, 0.972656f, + 0.052643f, 0.960449f, 0.066833f, 0.947754f, 0.081299f, 0.934082f, 0.094421f, 0.920898f, + 0.107910f, 0.907715f, 0.120361f, 0.895020f, 0.134399f, 0.881348f, 0.146484f, 0.868164f, + 0.159424f, 0.854980f, 0.171631f, 0.841797f, 0.183960f, 0.828125f, 0.196045f, 0.814941f, + 0.209351f, 0.800781f, 0.221313f, 0.787109f, 0.233398f, 0.773926f, 0.244629f, 0.761230f, + 0.256104f, 0.748047f, 0.266602f, 0.735352f, 0.278320f, 0.722168f, 0.287598f, 0.709961f, + 0.299805f, 0.697266f, 0.309814f, 0.684570f, 0.319092f, 0.672363f, 0.328125f, 0.660156f, + 0.339111f, 0.648438f, 0.347656f, 0.636230f, 0.355225f, 0.625000f, 0.364746f, 0.613770f, + 0.373779f, 0.601562f, 0.380859f, 0.591309f, 0.388184f, 0.580078f, 0.395752f, 0.569336f, + 0.403076f, 0.559082f, 0.408691f, 0.549316f, 0.416016f, 0.539062f, 0.422119f, 0.528809f, + 0.427246f, 0.519531f, 0.432373f, 0.510254f, 0.437256f, 0.501465f, 0.441895f, 0.492676f, + 0.444580f, 0.483887f, 0.449219f, 0.473633f, 0.451904f, 0.464600f, 0.455322f, 0.455322f, + 0.457031f, 0.444580f, 0.458496f, 0.433838f, 0.460449f, 0.422607f, 0.459961f, 0.410645f, + 0.460205f, 0.397949f, 0.460205f, 0.383789f, 0.457520f, 0.369385f, 0.455811f, 0.352539f, + 0.451660f, 0.334473f, 0.448975f, 0.314453f, 0.442139f, 0.291748f, 0.434814f, 0.265625f, + 0.424805f, 0.234375f, 0.408936f, 0.195068f, 0.387695f, 0.141968f, 0.348633f, 0.051575f, + 0.000000f, 1.000000f, 0.012520f, 0.993164f, 0.025620f, 0.983887f, 0.038788f, 0.972656f, + 0.052856f, 0.960449f, 0.067627f, 0.946777f, 0.081360f, 0.934082f, 0.095093f, 0.920898f, + 0.107849f, 0.908203f, 0.121277f, 0.894531f, 0.133911f, 0.881348f, 0.146973f, 0.868164f, + 0.160767f, 0.854492f, 0.173584f, 0.840332f, 0.186646f, 0.826660f, 0.199097f, 0.812988f, + 0.211304f, 0.799805f, 0.223389f, 0.786621f, 0.234497f, 0.772949f, 0.246582f, 0.760254f, + 0.258789f, 0.746582f, 0.269287f, 0.733887f, 0.281738f, 0.720215f, 0.291504f, 0.707520f, + 0.303223f, 0.694824f, 0.312744f, 0.682129f, 0.324219f, 0.669434f, 0.334229f, 0.657227f, + 0.343506f, 0.645020f, 0.354004f, 0.632812f, 0.363037f, 0.620605f, 0.371094f, 0.609375f, + 0.379395f, 0.598145f, 0.388916f, 0.585938f, 0.396729f, 0.575195f, 0.404785f, 0.563965f, + 0.411865f, 0.553223f, 0.419189f, 0.542480f, 0.427002f, 0.532227f, 0.432129f, 0.522461f, + 0.439697f, 0.511719f, 0.445801f, 0.502441f, 0.450439f, 0.492920f, 0.454590f, 0.484131f, + 0.460449f, 0.474854f, 0.464111f, 0.465088f, 0.468994f, 0.455566f, 0.471436f, 0.445801f, + 0.474854f, 0.435059f, 0.477295f, 0.425049f, 0.479248f, 0.413330f, 0.479736f, 0.402100f, + 0.481445f, 0.389160f, 0.481689f, 0.375244f, 0.481689f, 0.360840f, 0.478516f, 0.344482f, + 0.477295f, 0.326660f, 0.474365f, 0.307129f, 0.468506f, 0.285156f, 0.462402f, 0.259033f, + 0.453613f, 0.228271f, 0.439453f, 0.190674f, 0.420898f, 0.137817f, 0.383301f, 0.052277f, + 0.000000f, 1.000000f, 0.012436f, 0.993164f, 0.025482f, 0.983887f, 0.039398f, 0.972168f, + 0.053711f, 0.959961f, 0.067749f, 0.946777f, 0.080383f, 0.934570f, 0.093933f, 0.921875f, + 0.108093f, 0.908203f, 0.121460f, 0.894531f, 0.134766f, 0.881348f, 0.148071f, 0.867676f, + 0.162354f, 0.853516f, 0.175049f, 0.839355f, 0.188110f, 0.825684f, 0.200073f, 0.812500f, + 0.213501f, 0.798828f, 0.225464f, 0.785645f, 0.237549f, 0.772461f, 0.248779f, 0.758789f, + 0.262207f, 0.744629f, 0.274170f, 0.731445f, 0.283936f, 0.718262f, 0.296143f, 0.705566f, + 0.306641f, 0.692383f, 0.317627f, 0.679688f, 0.329346f, 0.666504f, 0.338867f, 0.654297f, + 0.349365f, 0.641602f, 0.358398f, 0.629883f, 0.368896f, 0.617188f, 0.379150f, 0.605469f, + 0.389160f, 0.592773f, 0.396729f, 0.581543f, 0.404541f, 0.569824f, 0.413330f, 0.558594f, + 0.423096f, 0.546875f, 0.430420f, 0.536133f, 0.437012f, 0.525391f, 0.444580f, 0.514648f, + 0.450684f, 0.504883f, 0.457520f, 0.494629f, 0.463379f, 0.484375f, 0.469238f, 0.475098f, + 0.474609f, 0.465576f, 0.479980f, 0.456055f, 0.484619f, 0.446045f, 0.489014f, 0.436035f, + 0.492432f, 0.425537f, 0.495361f, 0.414551f, 0.498535f, 0.404297f, 0.501465f, 0.391602f, + 0.502441f, 0.379639f, 0.504395f, 0.366211f, 0.503418f, 0.351318f, 0.504395f, 0.336182f, + 0.502441f, 0.318604f, 0.500977f, 0.299561f, 0.496582f, 0.277832f, 0.491455f, 0.252930f, + 0.482178f, 0.223145f, 0.470947f, 0.186279f, 0.454834f, 0.134888f, 0.419189f, 0.048889f, + 0.000000f, 1.000000f, 0.012390f, 0.993164f, 0.025208f, 0.983887f, 0.039673f, 0.972168f, + 0.054291f, 0.958984f, 0.068054f, 0.946777f, 0.080444f, 0.935059f, 0.094543f, 0.921875f, + 0.108093f, 0.908203f, 0.121277f, 0.895020f, 0.135376f, 0.880859f, 0.148804f, 0.866699f, + 0.162109f, 0.853027f, 0.175659f, 0.839355f, 0.187988f, 0.826172f, 0.201050f, 0.812012f, + 0.214355f, 0.798340f, 0.227539f, 0.784668f, 0.240112f, 0.770020f, 0.251953f, 0.757324f, + 0.263916f, 0.743652f, 0.276367f, 0.729980f, 0.287842f, 0.716797f, 0.299805f, 0.703613f, + 0.311035f, 0.690430f, 0.322998f, 0.676758f, 0.333496f, 0.664062f, 0.344238f, 0.651367f, + 0.354248f, 0.638672f, 0.365479f, 0.625977f, 0.376465f, 0.612793f, 0.385986f, 0.601074f, + 0.395264f, 0.588867f, 0.405029f, 0.576660f, 0.413818f, 0.564453f, 0.422607f, 0.553711f, + 0.431152f, 0.541504f, 0.439697f, 0.530273f, 0.448730f, 0.518555f, 0.455811f, 0.507812f, + 0.463135f, 0.497314f, 0.471680f, 0.485840f, 0.477539f, 0.475830f, 0.484131f, 0.465820f, + 0.490234f, 0.456299f, 0.495605f, 0.446533f, 0.500977f, 0.436523f, 0.505859f, 0.426025f, + 0.511230f, 0.415771f, 0.514160f, 0.405029f, 0.518555f, 0.393799f, 0.521484f, 0.381592f, + 0.524414f, 0.369385f, 0.525391f, 0.355957f, 0.526855f, 0.341797f, 0.527344f, 0.326904f, + 0.527344f, 0.309326f, 0.527344f, 0.291016f, 0.523438f, 0.269775f, 0.520020f, 0.245728f, + 0.512695f, 0.216919f, 0.503418f, 0.181152f, 0.487305f, 0.130859f, 0.454834f, 0.048218f, + 0.000000f, 1.000000f, 0.012207f, 0.993164f, 0.025513f, 0.983887f, 0.040070f, 0.971680f, + 0.054382f, 0.958984f, 0.067993f, 0.946777f, 0.081482f, 0.934082f, 0.095581f, 0.920898f, + 0.109802f, 0.907715f, 0.122864f, 0.894043f, 0.136353f, 0.879883f, 0.150024f, 0.866211f, + 0.163452f, 0.852539f, 0.176758f, 0.838867f, 0.189697f, 0.825195f, 0.203247f, 0.811035f, + 0.215698f, 0.797363f, 0.228638f, 0.783203f, 0.242432f, 0.769531f, 0.254639f, 0.755859f, + 0.266846f, 0.742188f, 0.279297f, 0.728027f, 0.290527f, 0.715332f, 0.303467f, 0.701172f, + 0.314697f, 0.687988f, 0.326904f, 0.674316f, 0.338135f, 0.661133f, 0.349609f, 0.648438f, + 0.360596f, 0.635254f, 0.371338f, 0.622559f, 0.383057f, 0.609375f, 0.393066f, 0.596680f, + 0.402344f, 0.584473f, 0.412109f, 0.572266f, 0.422607f, 0.559570f, 0.432617f, 0.547363f, + 0.441162f, 0.535645f, 0.449707f, 0.523926f, 0.458496f, 0.512207f, 0.467529f, 0.500977f, + 0.475586f, 0.489746f, 0.484131f, 0.478271f, 0.491211f, 0.467529f, 0.498291f, 0.456787f, + 0.504883f, 0.446533f, 0.512207f, 0.435791f, 0.518066f, 0.426025f, 0.523926f, 0.415771f, + 0.527832f, 0.405273f, 0.533203f, 0.395020f, 0.538086f, 0.383057f, 0.542969f, 0.371582f, + 0.544922f, 0.359131f, 0.548340f, 0.346191f, 0.551758f, 0.331787f, 0.551758f, 0.316650f, + 0.554199f, 0.300781f, 0.554688f, 0.281982f, 0.551758f, 0.261719f, 0.549805f, 0.237671f, + 0.544434f, 0.209717f, 0.537598f, 0.175049f, 0.522461f, 0.127441f, 0.493896f, 0.046814f, + 0.000000f, 1.000000f, 0.011963f, 0.993652f, 0.025787f, 0.983398f, 0.040527f, 0.971191f, + 0.054321f, 0.959473f, 0.067871f, 0.947266f, 0.081543f, 0.934570f, 0.095947f, 0.920898f, + 0.109680f, 0.907715f, 0.123047f, 0.893555f, 0.136230f, 0.880371f, 0.150391f, 0.866211f, + 0.164185f, 0.852051f, 0.177490f, 0.838379f, 0.191528f, 0.823730f, 0.205933f, 0.809570f, + 0.218140f, 0.795898f, 0.230957f, 0.782227f, 0.244385f, 0.768066f, 0.258301f, 0.753906f, + 0.269043f, 0.740723f, 0.282959f, 0.726562f, 0.294189f, 0.713379f, 0.307617f, 0.699219f, + 0.319092f, 0.685547f, 0.330566f, 0.672363f, 0.342285f, 0.658691f, 0.354492f, 0.645508f, + 0.367188f, 0.631836f, 0.377197f, 0.618652f, 0.388184f, 0.605957f, 0.399658f, 0.592773f, + 0.410400f, 0.580078f, 0.420654f, 0.566895f, 0.430176f, 0.555176f, 0.440918f, 0.541992f, + 0.451172f, 0.529785f, 0.460693f, 0.517578f, 0.470215f, 0.505371f, 0.478271f, 0.493896f, + 0.486572f, 0.482178f, 0.495605f, 0.470703f, 0.504395f, 0.459229f, 0.512695f, 0.447754f, + 0.520996f, 0.436523f, 0.526855f, 0.426270f, 0.534180f, 0.415771f, 0.540039f, 0.405518f, + 0.546387f, 0.394531f, 0.553223f, 0.383545f, 0.559082f, 0.371826f, 0.562500f, 0.360596f, + 0.567871f, 0.348389f, 0.571777f, 0.335205f, 0.575195f, 0.321533f, 0.578613f, 0.306641f, + 0.580566f, 0.290527f, 0.580566f, 0.272705f, 0.581055f, 0.252686f, 0.579102f, 0.229614f, + 0.575684f, 0.202515f, 0.569336f, 0.169189f, 0.557617f, 0.121826f, 0.531250f, 0.044739f, + 0.000000f, 1.000000f, 0.011620f, 0.993652f, 0.025833f, 0.983398f, 0.040833f, 0.970703f, + 0.054504f, 0.959473f, 0.068237f, 0.947266f, 0.081787f, 0.934570f, 0.096069f, 0.920898f, + 0.110229f, 0.906738f, 0.124023f, 0.893066f, 0.138306f, 0.879395f, 0.152100f, 0.865723f, + 0.165405f, 0.852051f, 0.178467f, 0.837891f, 0.192139f, 0.823730f, 0.206055f, 0.809570f, + 0.220703f, 0.794922f, 0.232666f, 0.781250f, 0.246582f, 0.766602f, 0.259277f, 0.752930f, + 0.272949f, 0.739258f, 0.285645f, 0.724609f, 0.298828f, 0.710938f, 0.311279f, 0.697266f, + 0.323242f, 0.683594f, 0.335938f, 0.669434f, 0.347412f, 0.655762f, 0.360352f, 0.642090f, + 0.373047f, 0.628418f, 0.383545f, 0.615234f, 0.394531f, 0.602051f, 0.406006f, 0.588867f, + 0.418457f, 0.575195f, 0.429199f, 0.562012f, 0.439697f, 0.549805f, 0.449951f, 0.536621f, + 0.458740f, 0.524414f, 0.470947f, 0.511719f, 0.481445f, 0.498779f, 0.491211f, 0.486328f, + 0.499512f, 0.474609f, 0.509277f, 0.462646f, 0.516602f, 0.451172f, 0.526367f, 0.439209f, + 0.533691f, 0.427734f, 0.543945f, 0.415771f, 0.550781f, 0.405029f, 0.558594f, 0.394043f, + 0.565918f, 0.383301f, 0.572266f, 0.372070f, 0.578125f, 0.360840f, 0.584473f, 0.348877f, + 0.589844f, 0.336914f, 0.595215f, 0.323730f, 0.599121f, 0.310547f, 0.603027f, 0.295898f, + 0.607422f, 0.280273f, 0.608887f, 0.262939f, 0.610352f, 0.243286f, 0.609375f, 0.221436f, + 0.607910f, 0.194702f, 0.604492f, 0.162842f, 0.593262f, 0.118347f, 0.570312f, 0.043488f, + 0.000000f, 1.000000f, 0.011742f, 0.993652f, 0.026215f, 0.982910f, 0.040924f, 0.971191f, + 0.054016f, 0.959961f, 0.067322f, 0.947754f, 0.082031f, 0.934082f, 0.096375f, 0.920410f, + 0.110352f, 0.906738f, 0.124390f, 0.893555f, 0.137329f, 0.879883f, 0.152466f, 0.864746f, + 0.166626f, 0.851074f, 0.180298f, 0.836914f, 0.193604f, 0.823242f, 0.208008f, 0.808105f, + 0.221802f, 0.794434f, 0.235107f, 0.780273f, 0.247437f, 0.766602f, 0.262451f, 0.751465f, + 0.275635f, 0.737305f, 0.288330f, 0.723633f, 0.301758f, 0.708984f, 0.313965f, 0.695312f, + 0.327881f, 0.681152f, 0.340088f, 0.666992f, 0.353027f, 0.652832f, 0.364746f, 0.639160f, + 0.376709f, 0.625488f, 0.389893f, 0.611816f, 0.401611f, 0.598145f, 0.413330f, 0.584473f, + 0.426270f, 0.570801f, 0.437500f, 0.557617f, 0.449463f, 0.543945f, 0.460205f, 0.530762f, + 0.470215f, 0.518066f, 0.481445f, 0.504883f, 0.492188f, 0.492432f, 0.501953f, 0.479736f, + 0.512695f, 0.466553f, 0.522949f, 0.454346f, 0.532715f, 0.442139f, 0.540527f, 0.430176f, + 0.551270f, 0.417725f, 0.557617f, 0.406494f, 0.567383f, 0.394287f, 0.575684f, 0.383057f, + 0.583496f, 0.371582f, 0.592285f, 0.360352f, 0.599121f, 0.348877f, 0.605957f, 0.336914f, + 0.612305f, 0.324951f, 0.618652f, 0.312012f, 0.622559f, 0.298584f, 0.629395f, 0.284180f, + 0.632324f, 0.268799f, 0.636719f, 0.251953f, 0.638672f, 0.233398f, 0.641602f, 0.212036f, + 0.639648f, 0.187134f, 0.638184f, 0.155273f, 0.630859f, 0.112732f, 0.611816f, 0.041626f, + 0.000000f, 1.000000f, 0.011772f, 0.993652f, 0.026489f, 0.982422f, 0.040741f, 0.971680f, + 0.053833f, 0.959961f, 0.068054f, 0.947266f, 0.082886f, 0.933594f, 0.096436f, 0.920410f, + 0.110229f, 0.907227f, 0.123840f, 0.893555f, 0.139038f, 0.878906f, 0.152832f, 0.865234f, + 0.166626f, 0.851074f, 0.181641f, 0.835938f, 0.195557f, 0.821777f, 0.208130f, 0.808594f, + 0.223022f, 0.793457f, 0.237305f, 0.778809f, 0.249878f, 0.765137f, 0.264893f, 0.750488f, + 0.278320f, 0.735840f, 0.291992f, 0.721191f, 0.304688f, 0.707520f, 0.319336f, 0.692383f, + 0.331543f, 0.678711f, 0.344971f, 0.664551f, 0.358643f, 0.650391f, 0.369873f, 0.636230f, + 0.383789f, 0.622070f, 0.396484f, 0.607910f, 0.408691f, 0.594238f, 0.420654f, 0.580566f, + 0.433105f, 0.566406f, 0.445068f, 0.552734f, 0.457520f, 0.538574f, 0.469238f, 0.525391f, + 0.480713f, 0.512207f, 0.490479f, 0.499512f, 0.502930f, 0.485596f, 0.514160f, 0.472656f, + 0.524414f, 0.459473f, 0.535645f, 0.446289f, 0.544922f, 0.433838f, 0.555664f, 0.420654f, + 0.564453f, 0.408936f, 0.575195f, 0.395996f, 0.584961f, 0.383545f, 0.593750f, 0.371094f, + 0.604004f, 0.359131f, 0.611816f, 0.347656f, 0.620117f, 0.336182f, 0.627441f, 0.324707f, + 0.634766f, 0.312012f, 0.641113f, 0.300049f, 0.647949f, 0.286133f, 0.654297f, 0.271973f, + 0.660156f, 0.256836f, 0.664551f, 0.240845f, 0.668945f, 0.222168f, 0.671875f, 0.201904f, + 0.673340f, 0.177734f, 0.672363f, 0.147827f, 0.666992f, 0.106750f, 0.651367f, 0.039673f, + 0.000000f, 1.000000f, 0.011971f, 0.993652f, 0.026947f, 0.982422f, 0.040131f, 0.972168f, + 0.053833f, 0.960449f, 0.068359f, 0.946777f, 0.083008f, 0.933594f, 0.096802f, 0.920410f, + 0.111511f, 0.906738f, 0.125488f, 0.892578f, 0.139038f, 0.879395f, 0.153442f, 0.864746f, + 0.168457f, 0.850098f, 0.181641f, 0.836426f, 0.196777f, 0.821289f, 0.211792f, 0.806641f, + 0.224243f, 0.792480f, 0.238647f, 0.778320f, 0.252930f, 0.763184f, 0.267334f, 0.749023f, + 0.281006f, 0.734375f, 0.295410f, 0.719238f, 0.307617f, 0.705566f, 0.321045f, 0.691406f, + 0.335205f, 0.676758f, 0.348877f, 0.662109f, 0.363037f, 0.647461f, 0.375244f, 0.633789f, + 0.389404f, 0.618652f, 0.402100f, 0.604492f, 0.414551f, 0.590332f, 0.428223f, 0.576172f, + 0.441406f, 0.562012f, 0.453857f, 0.547852f, 0.465820f, 0.534180f, 0.478516f, 0.520020f, + 0.490479f, 0.506348f, 0.501953f, 0.492920f, 0.513184f, 0.479248f, 0.525879f, 0.465332f, + 0.537109f, 0.451660f, 0.548340f, 0.438477f, 0.559082f, 0.425049f, 0.569824f, 0.412354f, + 0.581543f, 0.398682f, 0.591309f, 0.385742f, 0.602051f, 0.373047f, 0.612793f, 0.359863f, + 0.621582f, 0.347412f, 0.631348f, 0.335205f, 0.638672f, 0.323730f, 0.648438f, 0.311523f, + 0.659180f, 0.298584f, 0.666016f, 0.285400f, 0.673340f, 0.272705f, 0.680176f, 0.259277f, + 0.688965f, 0.243530f, 0.693848f, 0.228271f, 0.699707f, 0.210327f, 0.703613f, 0.191040f, + 0.707031f, 0.168701f, 0.708984f, 0.139893f, 0.705566f, 0.101440f, 0.691406f, 0.037720f, + 0.000000f, 1.000000f, 0.012199f, 0.993164f, 0.027023f, 0.982910f, 0.040283f, 0.972168f, + 0.054169f, 0.959961f, 0.069092f, 0.946289f, 0.082886f, 0.933594f, 0.097168f, 0.920410f, + 0.111694f, 0.906250f, 0.126099f, 0.892578f, 0.140259f, 0.878418f, 0.155640f, 0.863770f, + 0.169067f, 0.849609f, 0.184570f, 0.834961f, 0.197876f, 0.820801f, 0.211792f, 0.806641f, + 0.226807f, 0.791504f, 0.241455f, 0.776855f, 0.254883f, 0.762695f, 0.269775f, 0.747559f, + 0.283691f, 0.733398f, 0.298340f, 0.717773f, 0.311279f, 0.703613f, 0.326172f, 0.688477f, + 0.339111f, 0.674316f, 0.353760f, 0.659668f, 0.368652f, 0.644043f, 0.380615f, 0.630371f, + 0.394531f, 0.615723f, 0.407959f, 0.601074f, 0.422607f, 0.586426f, 0.435059f, 0.571777f, + 0.447266f, 0.558105f, 0.460693f, 0.543945f, 0.473877f, 0.529297f, 0.486572f, 0.515137f, + 0.499756f, 0.500488f, 0.512695f, 0.486328f, 0.524902f, 0.472168f, 0.537598f, 0.458008f, + 0.549316f, 0.444580f, 0.560547f, 0.430664f, 0.572754f, 0.416504f, 0.584473f, 0.402832f, + 0.596680f, 0.389160f, 0.607910f, 0.375732f, 0.618652f, 0.362305f, 0.629395f, 0.349121f, + 0.640625f, 0.335693f, 0.650879f, 0.322510f, 0.662109f, 0.309326f, 0.671387f, 0.297119f, + 0.680664f, 0.284668f, 0.690430f, 0.271729f, 0.698730f, 0.258301f, 0.708008f, 0.244507f, + 0.715332f, 0.230103f, 0.722168f, 0.214722f, 0.730469f, 0.197876f, 0.735840f, 0.179321f, + 0.741211f, 0.157349f, 0.744141f, 0.130249f, 0.744141f, 0.094849f, 0.734863f, 0.035278f, + 0.000000f, 1.000000f, 0.012444f, 0.993164f, 0.027298f, 0.982422f, 0.040283f, 0.972168f, + 0.055054f, 0.958984f, 0.068970f, 0.946777f, 0.082336f, 0.934082f, 0.097351f, 0.919922f, + 0.112183f, 0.906250f, 0.126343f, 0.892578f, 0.141113f, 0.877930f, 0.155396f, 0.863770f, + 0.170532f, 0.848633f, 0.184448f, 0.834473f, 0.199707f, 0.820312f, 0.214355f, 0.804688f, + 0.228149f, 0.791016f, 0.242432f, 0.775879f, 0.256592f, 0.761230f, 0.272461f, 0.746094f, + 0.285645f, 0.731445f, 0.300781f, 0.716797f, 0.314453f, 0.701660f, 0.329590f, 0.687012f, + 0.344727f, 0.671875f, 0.357422f, 0.657227f, 0.372803f, 0.642090f, 0.387207f, 0.626953f, + 0.399902f, 0.612305f, 0.413086f, 0.597656f, 0.428467f, 0.583008f, 0.441162f, 0.568359f, + 0.455811f, 0.553223f, 0.469238f, 0.538574f, 0.482666f, 0.523926f, 0.496094f, 0.509277f, + 0.509277f, 0.494873f, 0.521973f, 0.480469f, 0.534668f, 0.466064f, 0.548340f, 0.451416f, + 0.561035f, 0.437256f, 0.573730f, 0.422607f, 0.587402f, 0.407715f, 0.600586f, 0.393799f, + 0.612305f, 0.379639f, 0.625488f, 0.365234f, 0.636230f, 0.351807f, 0.648438f, 0.337646f, + 0.659668f, 0.323730f, 0.671875f, 0.310059f, 0.682129f, 0.296387f, 0.693359f, 0.282715f, + 0.704590f, 0.269287f, 0.714355f, 0.256104f, 0.725098f, 0.242798f, 0.734375f, 0.229614f, + 0.743164f, 0.215088f, 0.752441f, 0.200073f, 0.760254f, 0.184570f, 0.768555f, 0.166260f, + 0.773926f, 0.145630f, 0.780762f, 0.120667f, 0.782715f, 0.086487f, 0.776367f, 0.031677f, + 0.000000f, 1.000000f, 0.012665f, 0.992676f, 0.026840f, 0.982910f, 0.039856f, 0.972168f, + 0.054871f, 0.959473f, 0.068848f, 0.946777f, 0.083618f, 0.933105f, 0.098145f, 0.919922f, + 0.112549f, 0.906250f, 0.127075f, 0.891602f, 0.141724f, 0.877930f, 0.156250f, 0.863281f, + 0.170776f, 0.849121f, 0.186401f, 0.833496f, 0.200073f, 0.819824f, 0.214600f, 0.804688f, + 0.229980f, 0.790039f, 0.245361f, 0.774414f, 0.259277f, 0.760254f, 0.275391f, 0.744629f, + 0.290039f, 0.729980f, 0.303711f, 0.714844f, 0.318604f, 0.699707f, 0.333740f, 0.684570f, + 0.347656f, 0.669434f, 0.362305f, 0.654785f, 0.377197f, 0.639160f, 0.391113f, 0.624023f, + 0.406982f, 0.608887f, 0.420166f, 0.594238f, 0.435547f, 0.578613f, 0.448730f, 0.563965f, + 0.463379f, 0.548828f, 0.477051f, 0.534180f, 0.491699f, 0.518555f, 0.505371f, 0.503906f, + 0.520020f, 0.489014f, 0.532715f, 0.473877f, 0.546875f, 0.458984f, 0.560059f, 0.444092f, + 0.573730f, 0.429199f, 0.587402f, 0.414307f, 0.600098f, 0.399658f, 0.614258f, 0.384766f, + 0.627441f, 0.370361f, 0.640137f, 0.355713f, 0.651855f, 0.341553f, 0.666016f, 0.326416f, + 0.679199f, 0.312012f, 0.691406f, 0.297363f, 0.702637f, 0.283447f, 0.715820f, 0.268799f, + 0.728516f, 0.254150f, 0.739258f, 0.240234f, 0.750000f, 0.226807f, 0.760254f, 0.213135f, + 0.772461f, 0.199219f, 0.782715f, 0.183716f, 0.791504f, 0.168945f, 0.801758f, 0.151123f, + 0.810059f, 0.132446f, 0.815918f, 0.109253f, 0.823242f, 0.079285f, 0.820312f, 0.029144f, + 0.000000f, 1.000000f, 0.013290f, 0.992188f, 0.026016f, 0.983887f, 0.040649f, 0.971680f, + 0.054962f, 0.959473f, 0.068970f, 0.946777f, 0.083130f, 0.933594f, 0.098511f, 0.919434f, + 0.112671f, 0.905762f, 0.128174f, 0.891602f, 0.141968f, 0.877441f, 0.157349f, 0.862793f, + 0.171997f, 0.848145f, 0.186646f, 0.833496f, 0.202148f, 0.818848f, 0.216797f, 0.803711f, + 0.231934f, 0.789062f, 0.246338f, 0.773926f, 0.261719f, 0.759277f, 0.277344f, 0.743652f, + 0.291992f, 0.728516f, 0.306152f, 0.713379f, 0.322510f, 0.697754f, 0.337158f, 0.682617f, + 0.352539f, 0.666992f, 0.367188f, 0.651855f, 0.382324f, 0.636719f, 0.397461f, 0.621094f, + 0.410645f, 0.605957f, 0.426270f, 0.590332f, 0.441650f, 0.575195f, 0.456299f, 0.560059f, + 0.471191f, 0.544434f, 0.485352f, 0.529297f, 0.499512f, 0.513672f, 0.514160f, 0.498535f, + 0.529297f, 0.483398f, 0.543457f, 0.468018f, 0.558594f, 0.452393f, 0.573242f, 0.437012f, + 0.586914f, 0.421875f, 0.601562f, 0.406494f, 0.615234f, 0.391357f, 0.629395f, 0.376221f, + 0.642578f, 0.360840f, 0.656250f, 0.345703f, 0.670410f, 0.330078f, 0.684570f, 0.314697f, + 0.698242f, 0.299805f, 0.711914f, 0.284668f, 0.725586f, 0.269775f, 0.737793f, 0.255127f, + 0.750000f, 0.240112f, 0.763672f, 0.224854f, 0.775879f, 0.210083f, 0.788574f, 0.195435f, + 0.800293f, 0.181030f, 0.812012f, 0.166504f, 0.823730f, 0.151611f, 0.834473f, 0.135010f, + 0.844238f, 0.117065f, 0.854980f, 0.096191f, 0.861328f, 0.069702f, 0.862793f, 0.025696f, + 0.000000f, 1.000000f, 0.013832f, 0.991699f, 0.026260f, 0.983398f, 0.041382f, 0.971191f, + 0.054626f, 0.959961f, 0.069336f, 0.946289f, 0.083618f, 0.933594f, 0.098633f, 0.919434f, + 0.112976f, 0.905762f, 0.128296f, 0.891602f, 0.142578f, 0.876953f, 0.158203f, 0.862793f, + 0.172974f, 0.847656f, 0.189087f, 0.832520f, 0.202759f, 0.818359f, 0.218384f, 0.803223f, + 0.234619f, 0.787598f, 0.248169f, 0.772949f, 0.264893f, 0.757324f, 0.279541f, 0.742188f, + 0.294678f, 0.727051f, 0.310791f, 0.710938f, 0.326660f, 0.695801f, 0.341064f, 0.680176f, + 0.356934f, 0.664551f, 0.371582f, 0.648926f, 0.387207f, 0.633789f, 0.402588f, 0.618164f, + 0.418457f, 0.602539f, 0.433105f, 0.586914f, 0.448242f, 0.571289f, 0.462891f, 0.555664f, + 0.478027f, 0.540039f, 0.492920f, 0.524414f, 0.508789f, 0.508789f, 0.525391f, 0.492920f, + 0.539551f, 0.477051f, 0.555664f, 0.461182f, 0.569824f, 0.445557f, 0.584473f, 0.429932f, + 0.599609f, 0.414307f, 0.614258f, 0.398438f, 0.628906f, 0.382568f, 0.644531f, 0.366455f, + 0.659180f, 0.350830f, 0.673828f, 0.335205f, 0.687500f, 0.319580f, 0.703125f, 0.303711f, + 0.717285f, 0.287842f, 0.731934f, 0.272217f, 0.746582f, 0.256592f, 0.760254f, 0.240967f, + 0.772949f, 0.225586f, 0.788086f, 0.209351f, 0.800781f, 0.194092f, 0.815430f, 0.178467f, + 0.830566f, 0.161865f, 0.842285f, 0.146606f, 0.854980f, 0.131592f, 0.868652f, 0.115723f, + 0.879883f, 0.100159f, 0.891113f, 0.081482f, 0.901855f, 0.057465f, 0.908203f, 0.020493f, + 0.000000f, 1.000000f, 0.013168f, 0.993164f, 0.026703f, 0.982910f, 0.040466f, 0.972168f, + 0.055054f, 0.959473f, 0.070007f, 0.946289f, 0.083313f, 0.933594f, 0.099060f, 0.919434f, + 0.114380f, 0.904785f, 0.128052f, 0.891602f, 0.143677f, 0.876953f, 0.159058f, 0.861816f, + 0.173462f, 0.847656f, 0.188965f, 0.832520f, 0.204956f, 0.817383f, 0.220825f, 0.801758f, + 0.235596f, 0.787109f, 0.251709f, 0.771484f, 0.266113f, 0.756348f, 0.282715f, 0.740723f, + 0.297852f, 0.725098f, 0.313477f, 0.709473f, 0.329834f, 0.693848f, 0.344482f, 0.678711f, + 0.360596f, 0.662598f, 0.375732f, 0.646973f, 0.391846f, 0.630859f, 0.407227f, 0.615234f, + 0.423340f, 0.599121f, 0.438965f, 0.583496f, 0.455078f, 0.567383f, 0.470947f, 0.551270f, + 0.486328f, 0.535645f, 0.501465f, 0.519531f, 0.518066f, 0.503418f, 0.533203f, 0.487549f, + 0.549316f, 0.471436f, 0.564941f, 0.455322f, 0.581055f, 0.438965f, 0.596680f, 0.422852f, + 0.612793f, 0.406738f, 0.628418f, 0.390381f, 0.644531f, 0.374023f, 0.660156f, 0.357666f, + 0.675293f, 0.341553f, 0.690918f, 0.324951f, 0.706055f, 0.308838f, 0.721191f, 0.292236f, + 0.737305f, 0.275879f, 0.752441f, 0.259277f, 0.768066f, 0.243042f, 0.783691f, 0.226562f, + 0.797363f, 0.210327f, 0.812500f, 0.193848f, 0.827637f, 0.177368f, 0.843262f, 0.160645f, + 0.857910f, 0.144043f, 0.872070f, 0.127686f, 0.887207f, 0.111084f, 0.902344f, 0.093933f, + 0.915527f, 0.077881f, 0.929688f, 0.061188f, 0.942383f, 0.042114f, 0.953125f, 0.014633f, + 0.000000f, 1.000000f, 0.013443f, 0.993164f, 0.026764f, 0.983398f, 0.040497f, 0.971680f, + 0.055206f, 0.959473f, 0.070374f, 0.945801f, 0.085266f, 0.932129f, 0.100281f, 0.918457f, + 0.115479f, 0.904297f, 0.130737f, 0.890137f, 0.145752f, 0.875977f, 0.161011f, 0.861328f, + 0.175903f, 0.846680f, 0.191528f, 0.831543f, 0.206665f, 0.816406f, 0.222168f, 0.801270f, + 0.237915f, 0.785645f, 0.253418f, 0.770508f, 0.269043f, 0.754883f, 0.285156f, 0.739258f, + 0.301270f, 0.723633f, 0.316895f, 0.708008f, 0.333252f, 0.691895f, 0.348877f, 0.676270f, + 0.365723f, 0.660156f, 0.381592f, 0.644043f, 0.397461f, 0.628418f, 0.413574f, 0.612305f, + 0.429443f, 0.596191f, 0.445557f, 0.580078f, 0.461914f, 0.563477f, 0.478027f, 0.547363f, + 0.494141f, 0.531250f, 0.510254f, 0.514648f, 0.526367f, 0.498535f, 0.542480f, 0.481934f, + 0.558594f, 0.465576f, 0.575195f, 0.448975f, 0.591309f, 0.432617f, 0.607422f, 0.416016f, + 0.624512f, 0.399414f, 0.641113f, 0.382568f, 0.657227f, 0.365967f, 0.673340f, 0.349121f, + 0.689941f, 0.332275f, 0.706543f, 0.315430f, 0.722656f, 0.298584f, 0.738770f, 0.281494f, + 0.754883f, 0.264648f, 0.771484f, 0.247681f, 0.787109f, 0.230591f, 0.803711f, 0.213501f, + 0.819336f, 0.196289f, 0.834961f, 0.179077f, 0.851562f, 0.161743f, 0.868164f, 0.144287f, + 0.884766f, 0.126709f, 0.901367f, 0.109131f, 0.917480f, 0.091248f, 0.935059f, 0.073059f, + 0.952637f, 0.054260f, 0.968262f, 0.035858f, 0.983887f, 0.017548f, 0.999512f, 0.000115f, + }, +}; diff --git a/source/blender/draw/engines/eevee/eevee_lut.h b/source/blender/draw/engines/eevee/eevee_lut.h index d5dbf8ce690..8e107adfe0a 100644 --- a/source/blender/draw/engines/eevee/eevee_lut.h +++ b/source/blender/draw/engines/eevee/eevee_lut.h @@ -27,5 +27,5 @@ extern const float ltc_mat_ggx[64 * 64 * 4]; extern const float ltc_mag_ggx[64 * 64 * 2]; extern const float bsdf_split_sum_ggx[64 * 64 * 2]; extern const float ltc_disk_integral[64 * 64]; -extern const float btdf_split_sum_ggx[32][64 * 64]; +extern const float btdf_split_sum_ggx[16][64 * 64 * 2]; extern const float blue_noise[64 * 64][4]; diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 841da7fd076..3bdc8755e18 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -142,7 +142,7 @@ static void eevee_init_noise_texture(void) e_data.noise_tex = DRW_texture_create_2d(64, 64, GPU_RGBA16F, 0, (float *)blue_noise); } -#define RUNTIME_LUT_CREATION 1 +#define RUNTIME_LUT_CREATION 0 static void eevee_init_util_texture(void) { From aaf1650b099393c4cdcf44faf8e3a699e021f817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:54:54 +0100 Subject: [PATCH 151/519] EEVEE: Change cubemap roughness fit This changes the roughness mapping to better utilize the mip chain resolution. This improves glossy reflections with small roughness. Lightcache version bumped because old data does not have the same roughness mapping and cannot be used. --- source/blender/draw/engines/eevee/eevee_lightprobes.c | 6 ++++-- .../draw/engines/eevee/shaders/lightprobe_lib.glsl | 8 +++++--- source/blender/makesdna/DNA_lightprobe_types.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 395d4dc790d..7688039d0a8 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -1040,8 +1040,10 @@ void EEVEE_lightbake_filter_glossy(EEVEE_ViewLayerData *sldata, pinfo->padding_size *= pinfo->texel_size; pinfo->layer = probe_idx * 6; pinfo->roughness = i / (float)maxlevel; - pinfo->roughness *= pinfo->roughness; /* Disney Roughness */ - pinfo->roughness *= pinfo->roughness; /* Distribute Roughness across lod more evenly. */ + /* Disney Roughness */ + pinfo->roughness = square_f(pinfo->roughness); + /* Distribute Roughness across lod more evenly */ + pinfo->roughness = square_f(square_f(pinfo->roughness)); CLAMP(pinfo->roughness, 1e-8f, 0.99999f); /* Avoid artifacts */ #if 1 /* Variable Sample count and bias (fast) */ diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index fe4f3dcaa2f..5e78fae5b82 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -167,7 +167,7 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) * http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */ float original_roughness = roughness; - float linear_roughness = sqrt(roughness); + float linear_roughness = fast_sqrt(roughness); float distance_roughness = saturate(dist * linear_roughness / length(intersection)); linear_roughness = mix(distance_roughness, linear_roughness, linear_roughness); roughness = linear_roughness * linear_roughness; @@ -175,12 +175,14 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) float fac = saturate(original_roughness * 2.0 - 1.0); R = mix(intersection, R, fac * fac); - return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), roughness * prbLodCubeMax).rgb; + float lod = linear_roughness * prbLodCubeMax; + return textureLod_cubemapArray(probeCubes, vec4(R, float(pd_id)), lod).rgb; } vec3 probe_evaluate_world_spec(vec3 R, float roughness) { - return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), roughness * prbLodCubeMax).rgb; + float lod = fast_sqrt(roughness) * prbLodCubeMax; + return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), lod).rgb; } vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness) diff --git a/source/blender/makesdna/DNA_lightprobe_types.h b/source/blender/makesdna/DNA_lightprobe_types.h index 3830919bfd3..4fdce6d5f45 100644 --- a/source/blender/makesdna/DNA_lightprobe_types.h +++ b/source/blender/makesdna/DNA_lightprobe_types.h @@ -185,7 +185,7 @@ typedef struct LightCache { } LightCache; /* Bump the version number for lightcache data structure changes. */ -#define LIGHTCACHE_STATIC_VERSION 1 +#define LIGHTCACHE_STATIC_VERSION 2 /* LightCache->type */ enum { From 9e81e1c33f44d6d49956a220f6feaa51bf8cba7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 19:08:16 +0100 Subject: [PATCH 152/519] EEVEE: Fix glass with sharp distribution not ignoring roughness --- source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c index e0fcce6f617..5fc946e3509 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c @@ -49,6 +49,10 @@ static int node_shader_gpu_bsdf_glass(GPUMaterial *mat, GPU_link(mat, "world_normals_get", &in[3].link); } + if (node->custom1 == SHD_GLOSSY_SHARP) { + GPU_link(mat, "set_value_zero", &in[1].link); + } + GPU_material_flag_set(mat, GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT); float use_multi_scatter = (node->custom1 == SHD_GLOSSY_MULTI_GGX) ? 1.0f : 0.0f; From f362dad19bf47dad43dd099b76a0eb80f75c4619 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Sat, 13 Feb 2021 15:23:49 -0800 Subject: [PATCH 153/519] Cleanup: Source Code Typos Corrects approximately 36 spelling errors in source variable names. Differential Revision: https://developer.blender.org/D10347 Reviewed by Hans Goudey --- .../scripts/startup/bl_operators/userpref.py | 8 ++--- source/blender/blenkernel/intern/gpencil.c | 16 +++++----- source/blender/blenkernel/intern/unit.c | 2 +- .../compositor/nodes/COM_KeyingNode.cpp | 4 +-- .../engines/gpencil/gpencil_cache_utils.c | 4 +-- .../overlay/shaders/edit_mesh_geom.glsl | 4 +-- .../overlay/shaders/edit_mesh_vert.glsl | 6 ++-- .../blender/editors/gpencil/annotate_paint.c | 32 +++++++++---------- .../sculpt_paint/sculpt_filter_color.c | 2 +- 9 files changed, 39 insertions(+), 39 deletions(-) diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index 0cd97ca6a9e..fa6338fa614 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -1042,7 +1042,7 @@ class PREFERENCES_OT_studiolight_new(Operator): default="StudioLight", ) - ask_overide = False + ask_override = False def execute(self, context): import os @@ -1057,8 +1057,8 @@ class PREFERENCES_OT_studiolight_new(Operator): filepath_final = os.path.join(path_studiolights, filename) if os.path.isfile(filepath_final): - if not self.ask_overide: - self.ask_overide = True + if not self.ask_override: + self.ask_override = True return wm.invoke_props_dialog(self, width=320) else: for studio_light in prefs.studio_lights: @@ -1078,7 +1078,7 @@ class PREFERENCES_OT_studiolight_new(Operator): def draw(self, _context): layout = self.layout - if self.ask_overide: + if self.ask_override: layout.label(text="Warning, file already exists. Overwrite existing file?") else: layout.prop(self, "filename") diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 3d0152a6c7d..ea7d961a573 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -98,9 +98,9 @@ static void greasepencil_copy_data(Main *UNUSED(bmain), /* Apply local layer transform to all frames. Calc the active frame is not enough * because onion skin can use more frames. This is more slow but required here. */ if (gpl_dst->actframe != NULL) { - bool transfomed = ((!is_zero_v3(gpl_dst->location)) || (!is_zero_v3(gpl_dst->rotation)) || - (!is_one_v3(gpl_dst->scale))); - if (transfomed) { + bool transformed = ((!is_zero_v3(gpl_dst->location)) || (!is_zero_v3(gpl_dst->rotation)) || + (!is_one_v3(gpl_dst->scale))); + if (transformed) { loc_eul_size_to_mat4( gpl_dst->layer_mat, gpl_dst->location, gpl_dst->rotation, gpl_dst->scale); bool do_onion = ((gpl_dst->onion_flag & GP_LAYER_ONIONSKIN) != 0); @@ -2902,14 +2902,14 @@ void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob) } /* Calc local layer transform. */ - bool transfomed = ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) || - (!is_one_v3(gpl->scale))); - if (transfomed) { + bool transformed = ((!is_zero_v3(gpl->location)) || (!is_zero_v3(gpl->rotation)) || + (!is_one_v3(gpl->scale))); + if (transformed) { loc_eul_size_to_mat4(gpl->layer_mat, gpl->location, gpl->rotation, gpl->scale); } /* only redo if any change */ - if (changed || transfomed) { + if (changed || transformed) { LISTBASE_FOREACH (bGPDstroke *, gps, &gpl->actframe->strokes) { bGPDspoint *pt; int i; @@ -2919,7 +2919,7 @@ void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob) mul_m4_v3(cur_mat, &pt->x); } - if (transfomed) { + if (transformed) { mul_m4_v3(gpl->layer_mat, &pt->x); } } diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index e98fae9d92a..9ae1c754846 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -333,7 +333,7 @@ static struct bUnitCollection buPowerCollection = {buPowerDef, 3, 0, UNIT_COLLEC /* Temperature */ static struct bUnitDef buMetricTempDef[] = { {"kelvin", "kelvin", "K", NULL, "Kelvin", "KELVIN", 1.0f, 0.0, B_UNIT_DEF_NONE}, /* Base unit. */ - {"celsius", "celsius", "°C", "C", "Celsius", "CELCIUS", 1.0f, 273.15, B_UNIT_DEF_NONE}, + {"celsius", "celsius", "°C", "C", "Celsius", "CELSIUS", 1.0f, 273.15, B_UNIT_DEF_NONE}, NULL_UNIT, }; static struct bUnitCollection buMetricTempCollection = {buMetricTempDef, 0, 0, UNIT_COLLECTION_LENGTH(buMetricTempDef)}; diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cpp b/source/blender/compositor/nodes/COM_KeyingNode.cpp index 13bdabcdfd8..9b493d3f332 100644 --- a/source/blender/compositor/nodes/COM_KeyingNode.cpp +++ b/source/blender/compositor/nodes/COM_KeyingNode.cpp @@ -240,9 +240,9 @@ void KeyingNode::convertToOperations(NodeConverter &converter, if (keying_data->blur_pre) { /* Chroma pre-blur operation for input of keying operation. */ - NodeOperationOutput *preBluredImage = setupPreBlur( + NodeOperationOutput *preBlurredImage = setupPreBlur( converter, inputImage, keying_data->blur_pre); - converter.addLink(preBluredImage, keyingOperation->getInputSocket(0)); + converter.addLink(preBlurredImage, keyingOperation->getInputSocket(0)); } else { converter.mapInputSocket(inputImage, keyingOperation->getInputSocket(0)); diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c index 33b91efc848..ee51b751187 100644 --- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c +++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c @@ -270,12 +270,12 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, const bool is_in_front = (ob->dtx & OB_DRAW_IN_FRONT); const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0; - const bool overide_vertcol = (pd->v3d_color_type != -1); + const bool override_vertcol = (pd->v3d_color_type != -1); const bool is_vert_col_mode = (pd->v3d_color_type == V3D_SHADING_VERTEX_COLOR) || GPENCIL_VERTEX_MODE(gpd) || pd->is_render; bool is_masked = (gpl->flag & GP_LAYER_USE_MASK) && !BLI_listbase_is_empty(&gpl->mask_layers); - float vert_col_opacity = (overide_vertcol) ? + float vert_col_opacity = (override_vertcol) ? (is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) : pd->is_render ? gpl->vertex_paint_opacity : pd->vertex_paint_opacity; diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl index 92252bbd223..66fa85685e2 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl @@ -4,7 +4,7 @@ layout(triangle_strip, max_vertices = 4) out; in vec4 finalColor[2]; in vec4 finalColorOuter[2]; -in int selectOveride[2]; +in int selectOverride[2]; flat out vec4 finalColorOuter_f; out vec4 finalColor_f; @@ -80,7 +80,7 @@ void main() #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); #endif - vec4 final_color = (selectOveride[0] == 0) ? finalColor[1] : finalColor[0]; + vec4 final_color = (selectOverride[0] == 0) ? finalColor[1] : finalColor[0]; do_vertex(final_color, pos1, half_size, edge_ofs.xy); do_vertex(final_color, pos1, -half_size, -edge_ofs.xy); diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl index 2cefab56722..a3ff277b714 100644 --- a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl @@ -17,7 +17,7 @@ out vec4 finalColor; out vec4 finalColorOuter; #endif #ifdef USE_GEOM_SHADER -out int selectOveride; +out int selectOverride; #endif bool test_occlusion() @@ -59,10 +59,10 @@ void main() #elif defined(EDGE) # ifdef FLAT finalColor = EDIT_MESH_edge_color_inner(m_data.y); - selectOveride = 1; + selectOverride = 1; # else finalColor = EDIT_MESH_edge_vertex_color(m_data.y); - selectOveride = (m_data.y & EDGE_SELECTED); + selectOverride = (m_data.y & EDGE_SELECTED); # endif float crease = float(m_data.z) / 255.0; diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c index 1b53141294e..c8bd38d58fe 100644 --- a/source/blender/editors/gpencil/annotate_paint.c +++ b/source/blender/editors/gpencil/annotate_paint.c @@ -444,13 +444,13 @@ static void annotation_stroke_arrow_calc_points_segment(float stroke_points[8], const float ref_point[2], const float dir_cw[2], const float dir_ccw[2], - const float lenght, + const float length, const float sign) { - stroke_points[0] = ref_point[0] + dir_cw[0] * lenght * sign; - stroke_points[1] = ref_point[1] + dir_cw[1] * lenght * sign; - stroke_points[2] = ref_point[0] + dir_ccw[0] * lenght * sign; - stroke_points[3] = ref_point[1] + dir_ccw[1] * lenght * sign; + stroke_points[0] = ref_point[0] + dir_cw[0] * length * sign; + stroke_points[1] = ref_point[1] + dir_cw[1] * length * sign; + stroke_points[2] = ref_point[0] + dir_ccw[0] * length * sign; + stroke_points[3] = ref_point[1] + dir_ccw[1] * length * sign; } static void annotation_stroke_arrow_calc_points(tGPspoint *point, @@ -459,7 +459,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, float stroke_points[8], const int arrow_style) { - const int arrow_lenght = 8; + const int arrow_length = 8; float norm_dir[2]; copy_v2_v2(norm_dir, stroke_dir); normalize_v2(norm_dir); @@ -468,22 +468,22 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, switch (arrow_style) { case GP_STROKE_ARROWSTYLE_OPEN: - mul_v2_fl(norm_dir, arrow_lenght); - stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_lenght + norm_dir[0]; - stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_lenght + norm_dir[1]; - stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_lenght + norm_dir[0]; - stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_lenght + norm_dir[1]; + mul_v2_fl(norm_dir, arrow_length); + stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_length + norm_dir[0]; + stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_length + norm_dir[1]; + stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_length + norm_dir[0]; + stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_length + norm_dir[1]; break; case GP_STROKE_ARROWSTYLE_SEGMENT: annotation_stroke_arrow_calc_points_segment(stroke_points, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght, + arrow_length, 1.0f); break; case GP_STROKE_ARROWSTYLE_CLOSED: - mul_v2_fl(norm_dir, arrow_lenght); + mul_v2_fl(norm_dir, arrow_length); if (point != NULL) { add_v2_v2(&point->x, norm_dir); copy_v2_v2(corner, &point->x); @@ -492,13 +492,13 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght, + arrow_length, -1.0f); stroke_points[4] = corner[0] - norm_dir[0]; stroke_points[5] = corner[1] - norm_dir[1]; break; case GP_STROKE_ARROWSTYLE_SQUARE: - mul_v2_fl(norm_dir, arrow_lenght * 1.5f); + mul_v2_fl(norm_dir, arrow_length * 1.5f); if (point != NULL) { add_v2_v2(&point->x, norm_dir); copy_v2_v2(corner, &point->x); @@ -507,7 +507,7 @@ static void annotation_stroke_arrow_calc_points(tGPspoint *point, corner, inv_norm_dir_clockwise, inv_norm_dir_counterclockwise, - arrow_lenght * 0.75f, + arrow_length * 0.75f, -1.0f); stroke_points[4] = stroke_points[0] - norm_dir[0]; stroke_points[5] = stroke_points[1] - norm_dir[1]; diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_color.c b/source/blender/editors/sculpt_paint/sculpt_filter_color.c index 76a6b05cdff..b5fade32a25 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_color.c +++ b/source/blender/editors/sculpt_paint/sculpt_filter_color.c @@ -86,7 +86,7 @@ static EnumPropertyItem prop_color_filter_types[] = { {COLOR_FILTER_SATURATION, "SATURATION", 0, "Saturation", "Change saturation"}, {COLOR_FILTER_VALUE, "VALUE", 0, "Value", "Change value"}, - {COLOR_FILTER_BRIGHTNESS, "BRIGTHNESS", 0, "Brightness", "Change brightness"}, + {COLOR_FILTER_BRIGHTNESS, "BRIGHTNESS", 0, "Brightness", "Change brightness"}, {COLOR_FILTER_CONTRAST, "CONTRAST", 0, "Contrast", "Change contrast"}, {COLOR_FILTER_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth colors"}, From 3c1e70dedfc649180460ac869def657226c61653 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:19:06 +1100 Subject: [PATCH 154/519] Cleanup: spelling --- source/blender/draw/engines/overlay/shaders/grid_frag.glsl | 4 ++-- source/blender/draw/intern/draw_common.c | 2 +- source/blender/draw/intern/draw_common.h | 2 +- source/blender/draw/intern/shaders/common_globals_lib.glsl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl index 9cf6898cf18..3220adbff36 100644 --- a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl @@ -187,8 +187,8 @@ void main() FragColor = colorGrid; FragColor.a *= gridA * blend; - FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasise, blend), gridB); - FragColor = mix(FragColor, colorGridEmphasise, gridC); + FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasis, blend), gridB); + FragColor = mix(FragColor, colorGridEmphasis, gridC); } else { FragColor = vec4(colorGrid.rgb, 0.0); diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index fef8ba4b606..132b5274517 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -168,7 +168,7 @@ void DRW_globals_update(void) gb->colorBackground[0] + gb->colorBackground[1] + gb->colorBackground[2]) ? 20 : -10, - gb->colorGridEmphasise); + gb->colorGridEmphasis); /* Grid Axis */ UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_X, 0.5f, -10, gb->colorGridAxisX); UI_GetThemeColorBlendShade4fv(TH_GRID, TH_AXIS_Y, 0.5f, -10, gb->colorGridAxisY); diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index a059ac32311..6e3a73a8314 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -131,7 +131,7 @@ typedef struct GlobalsUboStorage { float colorCurrentFrame[4]; float colorGrid[4]; - float colorGridEmphasise[4]; + float colorGridEmphasis[4]; float colorGridAxisX[4]; float colorGridAxisY[4]; float colorGridAxisZ[4]; diff --git a/source/blender/draw/intern/shaders/common_globals_lib.glsl b/source/blender/draw/intern/shaders/common_globals_lib.glsl index 91fb822edac..3c76c8a5b28 100644 --- a/source/blender/draw/intern/shaders/common_globals_lib.glsl +++ b/source/blender/draw/intern/shaders/common_globals_lib.glsl @@ -95,7 +95,7 @@ layout(std140) uniform globalsBlock vec4 colorCurrentFrame; vec4 colorGrid; - vec4 colorGridEmphasise; + vec4 colorGridEmphasis; vec4 colorGridAxisX; vec4 colorGridAxisY; vec4 colorGridAxisZ; From 90c23078260bb66d0d2e27bb58852fe833ab2714 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:20:29 +1100 Subject: [PATCH 155/519] Cleanup: remove commented logic for Alt-Pad0 to use previous camera While this could be useful, it's been removed since 2.4x, keeping this here doesn't help add it back since it would need to be re-implemented. --- source/blender/editors/space_view3d/view3d_edit.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 2f8cd5a7517..5c2969f47d7 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4105,8 +4105,6 @@ static int view_camera_exec(bContext *C, wmOperator *op) ED_view3d_smooth_view_force_finish(C, v3d, region); if ((RV3D_LOCK_FLAGS(rv3d) & RV3D_LOCK_ANY_TRANSFORM) == 0) { - /* lastview - */ - ViewLayer *view_layer = CTX_data_view_layer(C); Scene *scene = CTX_data_scene(C); @@ -4120,15 +4118,6 @@ static int view_camera_exec(bContext *C, wmOperator *op) ED_view3d_lastview_store(rv3d); } -#if 0 - if (G.qual == LR_ALTKEY) { - if (oldcamera && is_an_active_object(oldcamera)) { - v3d->camera = oldcamera; - } - handle_view3d_lock(); - } -#endif - /* first get the default camera for the view lock type */ if (v3d->scenelock) { /* sets the camera view if available */ From c2b73dfe916d4ba9377ec7e756d75ff28bb61536 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:27:33 +1100 Subject: [PATCH 156/519] Cleanup: unused function --- source/blender/io/collada/GeometryExporter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/io/collada/GeometryExporter.h b/source/blender/io/collada/GeometryExporter.h index 51879f43272..948aafa760d 100644 --- a/source/blender/io/collada/GeometryExporter.h +++ b/source/blender/io/collada/GeometryExporter.h @@ -90,7 +90,6 @@ class GeometryExporter : COLLADASW::LibraryGeometries { /* creates for texcoords */ void createTexcoordsSource(std::string geom_id, Mesh *me); - void createTesselatedTexcoordsSource(std::string geom_id, Mesh *me); /* creates for normals */ void createNormalsSource(std::string geom_id, Mesh *me, std::vector &nor); From fa093ef2ffee1c2cf4464711504c1ee030581959 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:35:55 +1100 Subject: [PATCH 157/519] Cleanup: correct/update comments --- source/blender/blenkernel/intern/curve.c | 15 +++++++++------ .../blender/blenloader/intern/versioning_legacy.c | 4 ++-- source/blender/editors/mesh/editmesh_tools.c | 3 ++- .../sculpt_paint/paint_vertex_color_utils.c | 4 +++- .../sculpt_paint/paint_vertex_weight_utils.c | 11 ++++++++--- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 5632ae28960..f4485b2565e 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -4337,14 +4337,17 @@ void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag) } } +/** + * \param code: + * - 1 (#HD_AUTO): set auto-handle. + * - 2 (#HD_VECT): set vector-handle. + * - 3 (#HD_ALIGN) it toggle, vector-handles become #HD_FREE. + * + * - 5: Set align, like 3 but no toggle. + * - 6: Clear align (setting #HD_FREE), like 3 but no toggle. + */ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) { - /* code==1: set autohandle */ - /* code==2: set vectorhandle */ - /* code==3 (HD_ALIGN) it toggle, vectorhandles become HD_FREE */ - /* code==4: sets icu flag to become IPO_AUTO_HORIZ, horizontal extremes on auto-handles */ - /* code==5: Set align, like 3 but no toggle */ - /* code==6: Clear align, like 3 but no toggle */ BezTriple *bezt; int a; diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index dc8f7a0305a..5bbdb2ccfd1 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -1316,13 +1316,13 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) } } - /* btw. armature_rebuild_pose is further only called on leave editmode */ + /* Note: #BKE_pose_rebuild is further only called on leave edit-mode. */ if (ob->type == OB_ARMATURE) { if (ob->pose) { BKE_pose_tag_recalc(bmain, ob->pose); } - /* cannot call stuff now (pointers!), done in setup_app_data */ + /* Cannot call stuff now (pointers!), done in #setup_app_data. */ ob->id.recalc |= ID_RECALC_ALL; /* new generic xray option */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index de37ddec885..231e6fbc2d9 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3101,7 +3101,8 @@ static bool merge_firstlast(BMEditMesh *em, * so do extra check for data here */ - /* do sanity check in mergemenu in edit.c ?*/ + /* While #merge_type_itemf does a sanity check, this operation runs on all edit-mode objects. + * Some of them may not have the expected selection state. */ if (use_first == false) { if (!em->bm->selected.last || ((BMEditSelection *)em->bm->selected.last)->htype != BM_VERT) { return false; diff --git a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c index 7120f6a8748..dbc6044d2d8 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c @@ -610,7 +610,9 @@ BLI_INLINE uint mcol_alpha_sub(uint col_src, int fac) return col_mix; } -/* wpaint has 'ED_wpaint_blend_tool' */ +/** + * \note weight-paint has an equivalent function: #ED_wpaint_blend_tool + */ uint ED_vpaint_blend_tool(const int tool, const uint col, const uint paintcol, const int alpha_i) { switch ((IMB_BlendMode)tool) { diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c index dc777572858..a65895a3405 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c @@ -273,10 +273,15 @@ BLI_INLINE float wval_exclusion(float weight, float paintval, float fac) return temp * fac + weight * mfac; } -/* vpaint has 'vpaint_blend_tool' */ -/* result is not clamped from [0-1] */ +/** + * \param weight: Typically the current weight: #MDeformWeight.weight + * + * \return The final weight, not that this is _not_ clamped from [0-1]. + * Clamping must be done on the final #MDeformWeight.weight + * + * \note vertex-paint has an equivalent function: #ED_vpaint_blend_tool + */ float ED_wpaint_blend_tool(const int tool, - /* dw->weight */ const float weight, const float paintval, const float alpha) From 2ff2900f7fa65110222544a5e14fac9876058ad6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:38:04 +1100 Subject: [PATCH 158/519] Cleanup: use return argument prefix --- source/blender/editors/space_action/action_edit.c | 12 ++++++------ source/blender/editors/space_nla/nla_edit.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index f8389d40831..5c061518570 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -312,11 +312,11 @@ void ACTION_OT_previewrange_set(wmOperatorType *ot) /** * Find the extents of the active channel * - * \param[out] min: Bottom y-extent of channel - * \param[out] max: Top y-extent of channel - * \return Success of finding a selected channel + * \param r_min: Bottom y-extent of channel. + * \param r_max: Top y-extent of channel. + * \return Success of finding a selected channel. */ -static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min, float *max) +static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -339,8 +339,8 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min, if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) { /* update best estimate */ - *min = ymax - ACHANNEL_HEIGHT(ac); - *max = ymax; + *r_min = ymax - ACHANNEL_HEIGHT(ac); + *r_max = ymax; /* is this high enough priority yet? */ found = acf->channel_role; diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 893d2c0e2c8..7bfb753474d 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -406,11 +406,11 @@ void NLA_OT_previewrange_set(wmOperatorType *ot) /** * Find the extents of the active channel * - * \param[out] min: Bottom y-extent of channel. - * \param[out] max: Top y-extent of channel. - * \return Success of finding a selected channel + * \param r_min: Bottom y-extent of channel. + * \param r_max: Top y-extent of channel. + * \return Success of finding a selected channel. */ -static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, float *max) +static bool nla_channels_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -434,8 +434,8 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) { /* update best estimate */ - *min = ymax - NLACHANNEL_HEIGHT(snla); - *max = ymax; + *r_min = ymax - NLACHANNEL_HEIGHT(snla); + *r_max = ymax; /* is this high enough priority yet? */ found = acf->channel_role; From 237175e7470c7a7bda7a5bd128bcbcb059c84073 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 11:59:31 +1100 Subject: [PATCH 159/519] Cleanup: use doxy sections --- source/blender/blenlib/intern/noise.c | 50 +-- .../blender/editors/physics/particle_edit.c | 303 +++++++++++++----- source/blender/editors/space_nla/nla_edit.c | 230 +++++++++---- .../editors/space_view3d/view3d_draw.c | 42 ++- 4 files changed, 455 insertions(+), 170 deletions(-) diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index b770a267eee..996a1622239 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -36,6 +36,10 @@ static float noise3_perlin(const float vec[3]); /* UNUSED */ // #define HASHVEC(x, y, z) hashvectf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255] +/* -------------------------------------------------------------------- */ +/** \name Static Data + * \{ */ + /* needed for voronoi */ #define HASHPNT(x, y, z) hashpntf + 3 * hash[(hash[(hash[(z)&255] + (y)) & 255] + (x)) & 255] static const float hashpntf[768] = { @@ -263,9 +267,11 @@ static const float hashvectf[768] = { 0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764, }; -/**************************/ -/* IMPROVED PERLIN NOISE */ -/**************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Improved Perlin Noise Implementation (New) + * \{ */ BLI_INLINE float lerp(float t, float a, float b) { @@ -328,9 +334,11 @@ static float newPerlinU(float x, float y, float z) return (0.5f + 0.5f * newPerlin(x, y, z)); } -/**************************/ -/* END OF IMPROVED PERLIN */ -/**************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Improved Perlin Noise Implementation (Original) + * \{ */ /* Was BLI_noise_hnoise(), removed noisesize, so other functions can call it without scaling. */ static float orgBlenderNoise(float x, float y, float z) @@ -855,9 +863,11 @@ float BLI_noise_hnoisep(float noisesize, float x, float y, float z) return noise3_perlin(vec); } -/******************/ -/* VORONOI/WORLEY */ -/******************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Voronoi/Worley Implementation + * \{ */ /* distance metrics for voronoi, e parameter only used in Minkowski */ /* Camberra omitted, didn't seem useful */ @@ -1105,13 +1115,11 @@ static float voronoi_CrS(float x, float y, float z) return (2.0f * t - 1.0f); } -/***************/ -/* voronoi end */ -/***************/ +/** \} */ -/*************/ -/* CELLNOISE */ -/*************/ +/* -------------------------------------------------------------------- */ +/** \name Cell-Noise Implementation + * \{ */ /* returns unsigned cellnoise */ static float BLI_cellNoiseU(float x, float y, float z) @@ -1152,9 +1160,11 @@ void BLI_noise_cell_v3(float x, float y, float z, float ca[3]) ca[2] = p[2]; } -/*****************/ -/* end cellnoise */ -/*****************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API's + * \{ */ /* newnoise: generic noise function for use with different noisebases */ float BLI_noise_generic_noise( @@ -1747,6 +1757,4 @@ float BLI_noise_mg_variable_lacunarity( return noisefunc2(x + rv[0], y + rv[1], z + rv[2]); /* distorted-domain noise */ } -/****************/ -/* musgrave end */ -/****************/ +/** \} */ diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index d7e30f2b65c..ec3eb9c6a3a 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -88,7 +88,9 @@ #include "particle_edit_utildefines.h" -/**************************** utilities *******************************/ +/* -------------------------------------------------------------------- */ +/** \name Public Utilities + * \{ */ bool PE_poll(bContext *C) { @@ -178,9 +180,56 @@ void PE_free_ptcache_edit(PTCacheEdit *edit) MEM_freeN(edit); } -/************************************************/ -/* Edit Mode Helpers */ -/************************************************/ +int PE_minmax( + Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3]) +{ + Object *ob = OBACT(view_layer); + PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); + ParticleSystem *psys; + ParticleSystemModifierData *psmd_eval = NULL; + POINT_P; + KEY_K; + float co[3], mat[4][4]; + int ok = 0; + + if (!edit) { + return ok; + } + + if ((psys = edit->psys)) { + psmd_eval = edit->psmd_eval; + } + else { + unit_m4(mat); + } + + LOOP_VISIBLE_POINTS { + if (psys) { + psys_mat_hair_to_global( + ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat); + } + + LOOP_SELECTED_KEYS { + copy_v3_v3(co, key->co); + mul_m4_v3(mat, co); + DO_MINMAX(co, min, max); + ok = 1; + } + } + + if (!ok) { + BKE_object_minmax(ob, min, max, true); + ok = 1; + } + + return ok; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Mode Helpers + * \{ */ int PE_start_edit(PTCacheEdit *edit) { @@ -409,7 +458,11 @@ static int pe_x_mirror(Object *ob) return 0; } -/****************** common struct passed to callbacks ******************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common Struct Passed to Callbacks + * \{ */ typedef struct PEData { ViewContext vc; @@ -519,7 +572,11 @@ static void PE_free_random_generator(PEData *data) } } -/*************************** selection utilities *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Selection Utilities + * \{ */ static bool key_test_depth(const PEData *data, const float co[3], const int screen_co[2]) { @@ -632,7 +689,11 @@ static bool point_is_selected(PTCacheEditPoint *point) return 0; } -/*************************** iterators *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Iterators + * \{ */ typedef void (*ForPointFunc)(PEData *data, int point_index); typedef void (*ForHitPointFunc)(PEData *data, int point_index, float mouse_distance); @@ -905,9 +966,11 @@ static int count_selected_keys(Scene *scene, PTCacheEdit *edit) return sel; } -/************************************************/ -/* Particle Edit Mirroring */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Particle Edit Mirroring + * \{ */ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys) { @@ -1115,9 +1178,11 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys) } } -/************************************************/ -/* Edit Calculation */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Calculation + * \{ */ typedef struct DeflectEmitterIter { Object *object; @@ -1605,9 +1670,11 @@ void PE_update_object(Depsgraph *depsgraph, Scene *scene, Object *ob, int usefla } } -/************************************************/ -/* Edit Selections */ -/************************************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Edit Selections + * \{ */ /*-----selection callbacks-----*/ @@ -1703,7 +1770,11 @@ static void toggle_key_select(PEData *data, int point_index, int key_index, bool data->is_changed = true; } -/************************ de select all operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name De-Select All Operator + * \{ */ static bool select_action_apply(PTCacheEditPoint *point, PTCacheEditKey *key, int action) { @@ -1794,7 +1865,11 @@ void PARTICLE_OT_select_all(wmOperatorType *ot) WM_operator_properties_select_all(ot); } -/************************ pick select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pick Select Operator + * \{ */ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle) { @@ -1843,7 +1918,11 @@ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool desele return true; } -/************************ select root operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Root Operator + * \{ */ static void select_root(PEData *data, int point_index) { @@ -1906,7 +1985,11 @@ void PARTICLE_OT_select_roots(wmOperatorType *ot) WM_operator_properties_select_action(ot, SEL_SELECT, false); } -/************************ select tip operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Tip Operator + * \{ */ static void select_tip(PEData *data, int point_index) { @@ -1977,7 +2060,11 @@ void PARTICLE_OT_select_tips(wmOperatorType *ot) WM_operator_properties_select_action(ot, SEL_SELECT, false); } -/*********************** select random operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Random Operator + * \{ */ enum { RAN_HAIR, RAN_POINTS }; @@ -2064,7 +2151,11 @@ void PARTICLE_OT_select_random(wmOperatorType *ot) "Select either hair or points"); } -/************************ select linked operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Linked operator + * \{ */ static int select_linked_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2146,7 +2237,12 @@ void PARTICLE_OT_select_linked_pick(wmOperatorType *ot) RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384); } -/************************ box select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Box Select Operator + * \{ */ + bool PE_deselect_all_visible_ex(PTCacheEdit *edit) { bool changed = false; @@ -2211,7 +2307,11 @@ bool PE_box_select(bContext *C, const rcti *rect, const int sel_op) return data.is_changed; } -/************************ circle select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Circle Select Operator + * \{ */ bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float rad) { @@ -2244,7 +2344,11 @@ bool PE_circle_select(bContext *C, const int sel_op, const int mval[2], float ra return data.is_changed; } -/************************ lasso select operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Lasso Select Operator + * \{ */ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, const int sel_op) { @@ -2331,7 +2435,11 @@ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, return OPERATOR_CANCELLED; } -/*************************** hide operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Hide Operator + * \{ */ static int hide_exec(bContext *C, wmOperator *op) { @@ -2388,7 +2496,11 @@ void PARTICLE_OT_hide(wmOperatorType *ot) RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected"); } -/*************************** reveal operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Reveal Operator + * \{ */ static int reveal_exec(bContext *C, wmOperator *op) { @@ -2435,7 +2547,11 @@ void PARTICLE_OT_reveal(wmOperatorType *ot) RNA_def_boolean(ot->srna, "select", true, "Select", ""); } -/************************ select less operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select Less Operator + * \{ */ static void select_less_keys(PEData *data, int point_index) { @@ -2498,7 +2614,11 @@ void PARTICLE_OT_select_less(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ select more operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Select More Operator + * \{ */ static void select_more_keys(PEData *data, int point_index) { @@ -2566,7 +2686,11 @@ void PARTICLE_OT_select_more(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ rekey operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Re-Key Operator + * \{ */ static void rekey_particle(PEData *data, int pa_index) { @@ -2723,7 +2847,11 @@ static void rekey_particle_to_time( pa->flag &= ~PARS_REKEY; } -/************************* utilities **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Internal Utilities + * \{ */ static int remove_tagged_particles(Object *ob, ParticleSystem *psys, int mirror) { @@ -2905,7 +3033,11 @@ static void remove_tagged_keys(Depsgraph *depsgraph, Object *ob, ParticleSystem } } -/************************ subdivide operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Subdivide Operator + * \{ */ /* works like normal edit mode subdivide, inserts keys between neighboring selected keys */ static void subdivide_particle(PEData *data, int pa_index) @@ -3029,7 +3161,11 @@ void PARTICLE_OT_subdivide(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ remove doubles operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Remove Doubles Operator + * \{ */ static int remove_doubles_exec(bContext *C, wmOperator *op) { @@ -3192,7 +3328,11 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot) 1); } -/************************ cursor drawing *******************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Cursor Drawing + * \{ */ static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata)) { @@ -3238,7 +3378,11 @@ static void toggle_particle_cursor(Scene *scene, bool enable) } } -/*************************** delete operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Delete Operator + * \{ */ enum { DEL_PARTICLE, DEL_KEY }; @@ -3314,7 +3458,11 @@ void PARTICLE_OT_delete(wmOperatorType *ot) "Delete a full particle or only keys"); } -/*************************** mirror operator **************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Mirror Operator + * \{ */ static void PE_mirror_x(Depsgraph *depsgraph, Scene *scene, Object *ob, int tagged) { @@ -3526,7 +3674,11 @@ void PARTICLE_OT_mirror(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************* brush edit callbacks ********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Brush Edit Callbacks + * \{ */ static void brush_comb(PEData *data, float UNUSED(mat[4][4]), @@ -4474,7 +4626,11 @@ static int brush_add(const bContext *C, PEData *data, short number) return n; } -/************************* brush edit operator ********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Brush Edit Operator + * \{ */ typedef struct BrushEdit { Scene *scene; @@ -4864,7 +5020,11 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } -/*********************** cut shape ***************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Cut Shape + * \{ */ static bool shape_cut_poll(bContext *C) { @@ -5070,54 +5230,11 @@ void PARTICLE_OT_shape_cut(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ utilities ******************************/ +/** \} */ -int PE_minmax( - Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3]) -{ - Object *ob = OBACT(view_layer); - PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); - ParticleSystem *psys; - ParticleSystemModifierData *psmd_eval = NULL; - POINT_P; - KEY_K; - float co[3], mat[4][4]; - int ok = 0; - - if (!edit) { - return ok; - } - - if ((psys = edit->psys)) { - psmd_eval = edit->psmd_eval; - } - else { - unit_m4(mat); - } - - LOOP_VISIBLE_POINTS { - if (psys) { - psys_mat_hair_to_global( - ob, psmd_eval->mesh_final, psys->part->from, psys->particles + p, mat); - } - - LOOP_SELECTED_KEYS { - copy_v3_v3(co, key->co); - mul_m4_v3(mat, co); - DO_MINMAX(co, min, max); - ok = 1; - } - } - - if (!ok) { - BKE_object_minmax(ob, min, max, true); - ok = 1; - } - - return ok; -} - -/************************ particle edit toggle operator ************************/ +/* -------------------------------------------------------------------- */ +/** \name Particle Edit Toggle Operator + * \{ */ /* initialize needed data for bake edit */ void PE_create_particle_edit( @@ -5371,7 +5488,11 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ set editable operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Set Editable Operator + * \{ */ static int clear_edited_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -5421,7 +5542,11 @@ void PARTICLE_OT_edited_clear(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/************************ Unify length operator ************************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Unify length operator + * \{ */ static float calculate_point_length(PTCacheEditPoint *point) { @@ -5533,3 +5658,5 @@ void PARTICLE_OT_unify_length(struct wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } + +/** \} */ diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 7bfb753474d..dd381cc92fb 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -67,8 +67,9 @@ #include "nla_intern.h" /* own include */ #include "nla_private.h" /* FIXME... maybe this shouldn't be included? */ -/* *********************************************** */ -/* Utilities exported to other places... */ +/* -------------------------------------------------------------------- */ +/** \name Public Utilities + * \{ */ /* Perform validation for blending/extend settings */ void ED_nla_postop_refresh(bAnimContext *ac) @@ -92,14 +93,18 @@ void ED_nla_postop_refresh(bAnimContext *ac) ANIM_animdata_freelist(&anim_data); } -/* *********************************************** */ +/** \} */ + /* 'Special' Editing */ -/* ******************** Tweak-Mode Operators ***************************** */ /* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited * as if it were the normal Active-Action of its AnimData block. */ +/* -------------------------------------------------------------------- */ +/** \name Enable Tweak-Mode Operator + * \{ */ + static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op) { bAnimContext ac; @@ -195,7 +200,11 @@ void NLA_OT_tweakmode_enter(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_SKIP_SAVE); } -/* ------------- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Disable Tweak-Mode Operator + * \{ */ /* NLA Editor internal API function for exiting tweakmode */ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo) @@ -297,10 +306,13 @@ void NLA_OT_tweakmode_exit(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_SKIP_SAVE); } -/* *********************************************** */ +/** \} */ + /* NLA Strips Range Stuff */ -/* *************************** Calculate Range ************************** */ +/* -------------------------------------------------------------------- */ +/** \name Calculate NLA Strip Range + * \{ */ /* Get the min/max strip extents */ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bool only_sel) @@ -354,7 +366,11 @@ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const } } -/* ****************** Automatic Preview-Range Operator ****************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Automatic Preview-Range Operator + * \{ */ static int nlaedit_previewrange_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -401,7 +417,11 @@ void NLA_OT_previewrange_set(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ****************** View-All Operator ****************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name View-All Operator + * \{ */ /** * Find the extents of the active channel @@ -549,7 +569,11 @@ void NLA_OT_view_selected(wmOperatorType *ot) ot->flag = 0; } -/* *********************************************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name View-Frame Operator + * \{ */ static int nlaedit_viewframe_exec(bContext *C, wmOperator *op) { @@ -573,12 +597,16 @@ void NLA_OT_view_frame(wmOperatorType *ot) ot->flag = 0; } -/* *********************************************** */ +/** \} */ + /* NLA Editing Operations (Constructive/Destructive) */ -/* ******************** Add Action-Clip Operator ***************************** */ -/* Add a new Action-Clip strip to the active track - * (or the active block if no space in the track) */ +/* -------------------------------------------------------------------- */ +/** \name Add Action-Clip Operator + * + * Add a new Action-Clip strip to the active track + * (or the active block if no space in the track). + * \{ */ /* add the specified action as new strip */ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) @@ -724,8 +752,13 @@ void NLA_OT_actionclip_add(wmOperatorType *ot) ot->prop = prop; } -/* ******************** Add Transition Operator ***************************** */ -/* Add a new transition strip between selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Transition Operator + * + * Add a new transition strip between selected strips. + * \{ */ static int nlaedit_add_transition_exec(bContext *C, wmOperator *op) { @@ -849,8 +882,11 @@ void NLA_OT_transition_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Add Sound Clip Operator ***************************** */ -/* Add a new sound clip */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Sound Clip Operator + * \{ */ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -940,8 +976,13 @@ void NLA_OT_soundclip_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Add Meta-Strip Operator ***************************** */ -/* Add new meta-strips incorporating the selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Meta-Strip Operator + * + * Add new meta-strips incorporating the selected strips. + * \{ */ /* add the specified action as new strip */ static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op)) @@ -1012,8 +1053,13 @@ void NLA_OT_meta_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Remove Meta-Strip Operator ***************************** */ -/* Separate out the strips held by the selected meta-strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Remove Meta-Strip Operator + * + * Separate out the strips held by the selected meta-strips. + * \{ */ static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1073,10 +1119,14 @@ void NLA_OT_meta_remove(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Duplicate Strips Operator ************************** */ -/* Duplicates the selected NLA-Strips, putting them on new tracks above the one - * the originals were housed in. - */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Duplicate Strips Operator + * + * Duplicates the selected NLA-Strips, + * putting them on new tracks above the one the originals were housed in. + * \{ */ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) { @@ -1200,8 +1250,13 @@ void NLA_OT_duplicate(wmOperatorType *ot) RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", ""); } -/* ******************** Delete Strips Operator ***************************** */ -/* Deletes the selected NLA-Strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Delete Strips Operator + * + * Deletes the selected NLA-Strips. + * \{ */ static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1280,11 +1335,17 @@ void NLA_OT_delete(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Split Strips Operator ***************************** */ -/* Splits the selected NLA-Strips into two strips at the midpoint of the strip */ -/* TODO's? - * - multiple splits - * - variable-length splits? */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Split Strips Operator + * + * Splits the selected NLA-Strips into two strips at the midpoint of the strip. + * + * TODO's? + * - multiple splits + * - variable-length splits? + * \{ */ /* split a given Action-Clip strip */ static void nlaedit_split_strip_actclip( @@ -1435,11 +1496,15 @@ void NLA_OT_split(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* *********************************************** */ +/** \} */ + /* NLA Editing Operations (Modifying) */ -/* ******************** Toggle Muting Operator ************************** */ -/* Toggles whether strips are muted or not */ +/* -------------------------------------------------------------------- */ +/** \name Toggle Muting Operator + * + * Toggles whether strips are muted or not. + * \{ */ static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1502,8 +1567,13 @@ void NLA_OT_mute_toggle(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Swap Strips Operator ************************** */ -/* Tries to exchange strips within their owner tracks */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Swap Strips Operator + * + * Tries to exchange strips within their owner tracks. + * \{ */ static int nlaedit_swap_exec(bContext *C, wmOperator *op) { @@ -1679,8 +1749,13 @@ void NLA_OT_swap(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Move Strips Up Operator ************************** */ -/* Tries to move the selected strips into the track above if possible. */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Move Strips Up Operator + * + * Tries to move the selected strips into the track above if possible. + * \{ */ static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1765,8 +1840,13 @@ void NLA_OT_move_up(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Move Strips Down Operator ************************** */ -/* Tries to move the selected strips into the track above if possible. */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Move Strips Down Operator + * + * Tries to move the selected strips into the track above if possible. + * \{ */ static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -1851,8 +1931,13 @@ void NLA_OT_move_down(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Sync Action Length Operator ***************************** */ -/* Recalculate the extents of the action ranges used for the selected strips */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Sync Action Length Operator + * + * Recalculate the extents of the action ranges used for the selected strips. + * \{ */ static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op) { @@ -1940,8 +2025,13 @@ void NLA_OT_action_sync_length(wmOperatorType *ot) "Only sync the active length for the active strip"); } -/* ******************** Make Single User ********************************* */ -/* Ensure that each strip has its own action */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Make Single User + * + * Ensure that each strip has its own action. + * \{ */ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2026,8 +2116,13 @@ void NLA_OT_make_single_user(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Apply Scale Operator ***************************** */ -/* Reset the scaling of the selected strips to 1.0f */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Apply Scale Operator + * + * Reset the scaling of the selected strips to 1.0f. + * \{ */ /* apply scaling to keyframe */ static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt) @@ -2139,8 +2234,13 @@ void NLA_OT_apply_scale(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Clear Scale Operator ***************************** */ -/* Reset the scaling of the selected strips to 1.0f */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Clear Scale Operator + * + * Reset the scaling of the selected strips to 1.0f. + * \{ */ static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op)) { @@ -2204,8 +2304,13 @@ void NLA_OT_clear_scale(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ******************** Snap Strips Operator ************************** */ -/* Moves the start-point of the selected strips to the specified places */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Snap Strips Operator + * + * Moves the start-point of the selected strips to the specified places. + * \{ */ /* defines for snap keyframes tool */ static const EnumPropertyItem prop_nlaedit_snap_types[] = { @@ -2366,10 +2471,13 @@ void NLA_OT_snap(wmOperatorType *ot) ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", ""); } -/* *********************************************** */ +/** \} */ + /* NLA Modifiers */ -/* ******************** Add F-Modifier Operator *********************** */ +/* -------------------------------------------------------------------- */ +/** \name Add F-Modifier Operator + * \{ */ static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C, PointerRNA *UNUSED(ptr), @@ -2515,7 +2623,11 @@ void NLA_OT_fmodifier_add(wmOperatorType *ot) "Only add a F-Modifier of the specified type to the active strip"); } -/* ******************** Copy F-Modifiers Operator *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Copy F-Modifiers Operator + * \{ */ static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op) { @@ -2590,7 +2702,11 @@ void NLA_OT_fmodifier_copy(wmOperatorType *ot) #endif } -/* ******************** Paste F-Modifiers Operator *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Paste F-Modifiers Operator + * \{ */ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) { @@ -2682,4 +2798,4 @@ void NLA_OT_fmodifier_paste(wmOperatorType *ot) "Replace existing F-Modifiers, instead of just appending to the end of the existing list"); } -/* *********************************************** */ +/** \} */ diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 478f48700ea..ddb57a916af 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -878,7 +878,11 @@ void ED_view3d_draw_depth(Depsgraph *depsgraph, ARegion *region, View3D *v3d, bo UI_Theme_Restore(&theme_state); } -/* ******************** other elements ***************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Other Elements + * \{ */ /** could move this elsewhere, but tied into #ED_view3d_grid_scale */ float ED_scene_grid_scale(const Scene *scene, const char **r_grid_unit) @@ -2149,7 +2153,11 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const return view3d_clipping_test(co, is_local ? rv3d->clip_local : rv3d->clip); } -/* *********************** backdraw for selection *************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Backdraw for Selection + * \{ */ /** * \note Only use in object mode. @@ -2251,7 +2259,11 @@ int ED_view3d_backbuf_sample_size_clamp(ARegion *region, const float dist) return (int)min_ff(ceilf(dist), (float)max_ii(region->winx, region->winx)); } -/* *********************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Z-Depth Utilities + * \{ */ void view3d_update_depths_rect(ARegion *region, ViewDepths *d, rcti *rect) { @@ -2383,7 +2395,11 @@ void ED_view3d_draw_depth_gpencil(Depsgraph *depsgraph, Scene *scene, ARegion *r GPU_depth_test(GPU_DEPTH_NONE); } -/* *********************** customdata **************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Custom-data Utilities + * \{ */ void ED_view3d_datamask(const bContext *C, const Scene *UNUSED(scene), @@ -2430,6 +2446,12 @@ void ED_view3d_screen_datamask(const bContext *C, } } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Region View Matrix Backup/Restore + * \{ */ + /** * Store values from #RegionView3D, set when drawing. * This is needed when we draw with to a viewport using a different matrix @@ -2472,6 +2494,12 @@ void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixSto rv3d->pixsize = rv3dmat->pixsize; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name FPS Drawing + * \{ */ + /** * \note The info that this uses is updated in #ED_refresh_viewport_fps, * which currently gets called during #SCREEN_OT_animation_step. @@ -2531,6 +2559,12 @@ void ED_scene_draw_fps(const Scene *scene, int xoffset, int *yoffset) BLF_disable(font_id, BLF_SHADOW); } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Calculate Render Border + * \{ */ + static bool view3d_main_region_do_render_draw(const Scene *scene) { RenderEngineType *type = RE_engines_find(scene->r.engine); From 0bc281a6dd12308f17b3d41bdc4cc1104a3e6f18 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sat, 13 Feb 2021 21:27:39 -0600 Subject: [PATCH 160/519] Cleanup: Simplify geometry nodes attribute API usage Getting an "ouput" attribute is equivalent to creating an attribute and then getting a write attribute. Replace the latter with the former for consistency with other code, and to decrease the used surface area of the attribute API to hopefully facilitate future cleanup. --- .../blender/nodes/geometry/nodes/node_geo_join_geometry.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index 4fec14ec9c9..ed99fc95018 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -201,8 +201,8 @@ static void join_attributes(Span src_components, AttributeDomain domain; determine_final_data_type_and_domain(src_components, attribute_name, &data_type, &domain); - result.attribute_try_create(attribute_name, domain, data_type); - WriteAttributePtr write_attribute = result.attribute_try_get_for_write(attribute_name); + OutputAttributePtr write_attribute = result.attribute_try_get_for_output( + attribute_name, domain, data_type); if (!write_attribute || &write_attribute->cpp_type() != bke::custom_data_type_to_cpp_type(data_type) || write_attribute->domain() != domain) { @@ -210,7 +210,7 @@ static void join_attributes(Span src_components, } fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); fill_new_attribute(src_components, attribute_name, data_type, domain, dst_span); - write_attribute->apply_span(); + write_attribute.apply_span_and_save(); } } From 07c6a57507e81fe68a7fb3ee23c951fc80f3a042 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 15:09:32 +1100 Subject: [PATCH 161/519] cmake/deps: Update mesa to 20.3.4 This resolves build error with Py3.9x, use meson build system since autoconf/automake are no longer supported. This adds ninja & meson as dependencies for Linux. Reviewed By: brecht, sybren Ref D10282 --- .../cmake/check_software.cmake | 12 ++++- .../build_environment/cmake/mesa.cmake | 47 +++++++++++++------ .../build_environment/cmake/versions.cmake | 4 +- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/build_files/build_environment/cmake/check_software.cmake b/build_files/build_environment/cmake/check_software.cmake index 50b98ac447c..b942e32c8b7 100644 --- a/build_files/build_environment/cmake/check_software.cmake +++ b/build_files/build_environment/cmake/check_software.cmake @@ -33,6 +33,16 @@ if(UNIX) yasm ) + if(NOT APPLE) + set(_required_software + ${_required_software} + + # Needed for Mesa. + meson + ninja + ) + endif() + foreach(_software ${_required_software}) find_program(_software_find NAMES ${_software}) if(NOT _software_find) @@ -60,7 +70,7 @@ if(UNIX) " ${_software_missing}\n" "\n" "On Debian and Ubuntu:\n" - " apt install autoconf automake libtool yasm tcl\n" + " apt install autoconf automake libtool yasm tcl ninja-build meson python3-mako\n" "\n" "On macOS (with homebrew):\n" " brew install autoconf automake bison libtool pkg-config yasm\n" diff --git a/build_files/build_environment/cmake/mesa.cmake b/build_files/build_environment/cmake/mesa.cmake index 6994d1c5813..e9782a0976f 100644 --- a/build_files/build_environment/cmake/mesa.cmake +++ b/build_files/build_environment/cmake/mesa.cmake @@ -20,19 +20,36 @@ set(MESA_CFLAGS "-static-libgcc") set(MESA_CXXFLAGS "-static-libgcc -static-libstdc++ -Bstatic -lstdc++ -Bdynamic -l:libstdc++.a") set(MESA_LDFLAGS "-L${LIBDIR}/zlib/lib -pthread -static-libgcc -static-libstdc++ -Bstatic -lstdc++ -Bdynamic -l:libstdc++.a -l:libz_pic.a") +# The 'native-file', used for overrides with the meson build system. +# meson does not provide a way to do this using command line arguments. +# +# Note that we can't output to "${BUILD_DIR}/mesa/src/external_mesa" as +# it doesn't exist when CMake first executes. +file(WRITE ${BUILD_DIR}/mesa/tmp/native-file.ini "\ +[binaries] +llvm-config = '${LIBDIR}/llvm/bin/llvm-config'" +) + set(MESA_EXTRA_FLAGS - CFLAGS=${MESA_CFLAGS} - CXXFLAGS=${MESA_CXXFLAGS} - LDFLAGS=${MESA_LDFLAGS} - --enable-glx=gallium-xlib - --with-gallium-drivers=swrast - --disable-dri - --disable-gbm - --disable-egl - --disable-gles1 - --disable-gles2 - --disable-llvm-shared-libs - --with-llvm-prefix=${LIBDIR}/llvm + -Dbuildtype=release + -Dc_args=${MESA_CFLAGS} + -Dcpp_args=${MESA_CXXFLAGS} + -Dc_link_args=${MESA_LDFLAGS} + -Dcpp_link_args=${MESA_LDFLAGS} + -Dglx=gallium-xlib + -Dgallium-drivers=swrast + -Ddri-drivers= + -Dvulkan-drivers= + -Dgbm=disabled + -Degl=disabled + -Dgles1=disabled + -Dgles2=disabled + -Dshared-llvm=disabled + # Without this, the build fails when: `wayland-scanner` is not found. + # At some point we will likely want to support Wayland. + # Disable for now since it's not officially supported. + -Dplatforms=x11 + --native-file ${BUILD_DIR}/mesa/tmp/native-file.ini ) ExternalProject_Add(external_mesa @@ -42,9 +59,9 @@ ExternalProject_Add(external_mesa PREFIX ${BUILD_DIR}/mesa CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && - ${CONFIGURE_COMMAND_NO_TARGET} --prefix=${LIBDIR}/mesa ${MESA_EXTRA_FLAGS} - BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && make -j${MAKE_THREADS} - INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && make install + meson ${BUILD_DIR}/mesa/src/external_mesa-build --prefix=${LIBDIR}/mesa ${MESA_EXTRA_FLAGS} + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa-build && ninja -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa-build && ninja install INSTALL_DIR ${LIBDIR}/mesa ) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 3a44977e4d3..f61f02b8669 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -309,9 +309,9 @@ set(LIBGLU_VERSION 9.0.1) set(LIBGLU_URI ftp://ftp.freedesktop.org/pub/mesa/glu/glu-${LIBGLU_VERSION}.tar.xz) set(LIBGLU_HASH 151aef599b8259efe9acd599c96ea2a3) -set(MESA_VERSION 18.3.1) +set(MESA_VERSION 20.3.4) set(MESA_URI ftp://ftp.freedesktop.org/pub/mesa/mesa-${MESA_VERSION}.tar.xz) -set(MESA_HASH d60828056d77bfdbae0970f9b15fb1be) +set(MESA_HASH 556338446aef8ae947a789b3e0b5e056) set(NASM_VERSION 2.15.02) set(NASM_URI https://github.com/netwide-assembler/nasm/archive/nasm-${NASM_VERSION}.tar.gz) From 67c8d97db36b285303abc5dce83b1bc8dc209651 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Feb 2021 20:58:04 +1100 Subject: [PATCH 162/519] Cleanup: spelling --- intern/cycles/kernel/shaders/node_math.h | 2 +- intern/ghost/intern/GHOST_WindowWin32.h | 2 +- source/blender/blenfont/intern/blf.c | 2 +- source/blender/blenfont/intern/blf_dir.c | 2 +- source/blender/blenlib/intern/dot_export.cc | 2 +- .../blenloader/intern/versioning_250.c | 2 +- .../blenloader/intern/versioning_280.c | 2 +- .../blenloader/intern/versioning_legacy.c | 2 +- .../blender/draw/engines/eevee/eevee_render.c | 2 +- .../draw/engines/overlay/overlay_grid.c | 2 +- source/blender/editors/curve/editcurve.c | 2 +- .../blender/editors/curve/editcurve_select.c | 4 +- source/blender/editors/curve/editfont_undo.c | 2 +- source/blender/editors/gpencil/gpencil_data.c | 2 +- source/blender/editors/gpencil/gpencil_edit.c | 13 +- .../blender/editors/gpencil/gpencil_intern.h | 4 +- source/blender/editors/gpencil/gpencil_mesh.c | 2 +- .../blender/editors/gpencil/gpencil_paint.c | 4 +- .../blender/editors/gpencil/gpencil_select.c | 24 +-- source/blender/editors/gpencil/gpencil_undo.c | 2 +- source/blender/editors/include/ED_view3d.h | 4 +- .../interface/interface_region_menu_popup.c | 2 +- source/blender/editors/mesh/editmesh_undo.c | 2 +- source/blender/editors/object/object_add.c | 2 +- source/blender/editors/object/object_ops.c | 2 +- source/blender/editors/object/object_remesh.c | 2 +- source/blender/editors/screen/screen_edit.c | 2 +- .../sculpt_paint/paint_vertex_weight_utils.c | 2 +- .../editors/space_outliner/outliner_select.c | 2 +- .../editors/space_view3d/view3d_view.c | 7 +- .../freestyle/intern/geometry/FitCurve.cpp | 2 +- .../BPy_PolygonalizationShader.cpp | 2 +- .../intern/MOD_gpencilnoise.c | 4 +- .../intern/MOD_gpencilsmooth.c | 4 +- source/blender/makesdna/DNA_anim_types.h | 2 +- source/blender/makesdna/DNA_boid_types.h | 2 +- source/blender/makesdna/DNA_cloth_types.h | 19 +- .../makesdna/DNA_gpencil_modifier_defaults.h | 2 +- source/blender/makesdna/DNA_gpencil_types.h | 24 +-- .../blender/makesdna/DNA_lightprobe_types.h | 2 +- source/blender/makesdna/DNA_mask_types.h | 2 +- source/blender/makesdna/DNA_modifier_types.h | 2 +- .../blender/makesdna/DNA_object_force_types.h | 2 +- source/blender/makesdna/DNA_rigidbody_types.h | 4 +- source/blender/makesdna/DNA_scene_types.h | 184 +++++++++--------- .../makesdna/DNA_windowmanager_types.h | 2 +- source/blender/windowmanager/WM_toolsystem.h | 2 +- source/blender/windowmanager/WM_types.h | 2 +- .../windowmanager/intern/wm_init_exit.c | 14 +- .../blender/windowmanager/intern/wm_keymap.c | 2 +- .../windowmanager/intern/wm_playanim.c | 4 +- 51 files changed, 202 insertions(+), 187 deletions(-) diff --git a/intern/cycles/kernel/shaders/node_math.h b/intern/cycles/kernel/shaders/node_math.h index 4b1a6c5bc16..3a008721d5e 100644 --- a/intern/cycles/kernel/shaders/node_math.h +++ b/intern/cycles/kernel/shaders/node_math.h @@ -74,7 +74,7 @@ vector snap(vector a, vector b) return floor(safe_divide(a, b)) * b; } -/* Adapted from godotengine math_funcs.h. */ +/* Adapted from GODOT-engine math_funcs.h. */ float wrap(float value, float max, float min) { float range = max - min; diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 661d80c02aa..12eed243438 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -602,7 +602,7 @@ class GHOST_WindowWin32 : public GHOST_Window { /* Wintab API */ struct { - /** WinTab dll handle */ + /** WinTab DLL handle. */ HMODULE handle = NULL; /** API functions */ diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 48f283e67b9..4d483934717 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -560,7 +560,7 @@ void BLF_draw_ascii_ex(int fontid, const char *str, size_t len, struct ResultBLF if (font) { blf_draw_gl__start(font); if (font->flags & BLF_WORD_WRAP) { - /* use non-ascii draw function for word-wrap */ + /* Use non-ASCII draw function for word-wrap. */ blf_font_draw__wrap(font, str, len, r_info); } else { diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 25235097505..4fa915826b3 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -140,7 +140,7 @@ char *blf_dir_search(const char *file) } if (!s) { - /* Assume file is either an abslute path, or a relative path to current directory. */ + /* Assume file is either an absolute path, or a relative path to current directory. */ BLI_strncpy(full_path, file, sizeof(full_path)); BLI_path_abs(full_path, BKE_main_blendfile_path(G_MAIN)); if (BLI_exists(full_path)) { diff --git a/source/blender/blenlib/intern/dot_export.cc b/source/blender/blenlib/intern/dot_export.cc index 13a2341a9d5..93075a23c07 100644 --- a/source/blender/blenlib/intern/dot_export.cc +++ b/source/blender/blenlib/intern/dot_export.cc @@ -221,7 +221,7 @@ void Attributes::export__as_bracket_list(std::stringstream &ss) const ss << "["; attributes_.foreach_item([&](StringRef key, StringRef value) { if (StringRef(value).startswith("<")) { - /* Don't draw the quotes, this is an html-like value. */ + /* Don't draw the quotes, this is an HTML-like value. */ ss << key << "=" << value << ", "; } else { diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index 23f46e15f51..983fdce15f1 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -412,7 +412,7 @@ static void do_versions_windowmanager_2_50(bScreen *screen) area_add_window_regions(area, area->spacedata.first, &area->regionbase); - /* space imageselect is deprecated */ + /* Space image-select is deprecated. */ for (sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_IMASEL) { sl->spacetype = SPACE_EMPTY; /* spacedata then matches */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 0e90d9b6045..ef2e196094e 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -4912,7 +4912,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } - /* Boundary Edges Automasking. */ + /* Boundary Edges Auto-masking. */ if (!DNA_struct_elem_find( fd->filesdna, "Brush", "int", "automasking_boundary_edges_propagation_steps")) { for (Brush *br = bmain->brushes.first; br; br = br->id.next) { diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index 5bbdb2ccfd1..e43f8153bd1 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -2378,7 +2378,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) Object *ob; bActionStrip *strip; - /* nla-strips - scale */ + /* NLA-strips - scale. */ for (ob = bmain->objects.first; ob; ob = ob->id.next) { for (strip = ob->nlastrips.first; strip; strip = strip->next) { float length, actlength, repeat; diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 66e3d8ebd22..bc05b7915c3 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -157,7 +157,7 @@ void EEVEE_render_view_sync(EEVEE_Data *vedata, RenderEngine *engine, struct Dep { EEVEE_PrivateData *g_data = vedata->stl->g_data; - /* Set the pers & view matrix. */ + /* Set the perspective & view matrix. */ float winmat[4][4], viewmat[4][4], viewinv[4][4]; /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */ struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, g_data->cam_original_ob); diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c index 87aa013f03a..5bb157ed081 100644 --- a/source/blender/draw/engines/overlay/overlay_grid.c +++ b/source/blender/draw/engines/overlay/overlay_grid.c @@ -93,7 +93,7 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata) DRW_view_viewmat_get(NULL, viewmat, false); DRW_view_viewmat_get(NULL, viewinv, true); - /* if perps */ + /* If perspective view or non-axis aligned view. */ if (winmat[3][3] == 0.0f || rv3d->view == RV3D_VIEW_USER) { if (show_axis_x) { shd->grid_flag |= PLANE_XY | SHOW_AXIS_X; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 8ebc2077619..439515ed80f 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -2474,7 +2474,7 @@ static void adduplicateflagNurb( memcpy(&newnu->bp[b * newu], &nu->bp[b * nu->pntsu], newu * sizeof(BPoint)); } - /* check for actvert in the unused cyclicuv selection */ + /* Check for `actvert` in the unused cyclic-UV selection. */ if (cu->actnu == i) { if (cu->actvert == -1) { calc_duplicate_actnurb(editnurb, newnurb, cu); diff --git a/source/blender/editors/curve/editcurve_select.c b/source/blender/editors/curve/editcurve_select.c index 82f7b456284..d362ec23370 100644 --- a/source/blender/editors/curve/editcurve_select.c +++ b/source/blender/editors/curve/editcurve_select.c @@ -501,7 +501,7 @@ void CURVE_OT_de_select_first(wmOperatorType *ot) ot->idname = "CURVE_OT_de_select_first"; ot->description = "(De)select first of visible part of each NURBS"; - /* api cfirstbacks */ + /* api callbacks */ ot->exec = de_select_first_exec; ot->poll = ED_operator_editcurve; @@ -535,7 +535,7 @@ void CURVE_OT_de_select_last(wmOperatorType *ot) ot->idname = "CURVE_OT_de_select_last"; ot->description = "(De)select last of visible part of each NURBS"; - /* api clastbacks */ + /* api callbacks */ ot->exec = de_select_last_exec; ot->poll = ED_operator_editcurve; diff --git a/source/blender/editors/curve/editfont_undo.c b/source/blender/editors/curve/editfont_undo.c index 07f062e7a53..88f3ed0582c 100644 --- a/source/blender/editors/curve/editfont_undo.c +++ b/source/blender/editors/curve/editfont_undo.c @@ -279,7 +279,7 @@ static void *undofont_from_editfont(UndoFont *uf, Curve *cu) ((LinkData *)uf_arraystore.local_links.last)->data : NULL; - /* add oursrlves */ + /* Add ourselves. */ BLI_addtail(&uf_arraystore.local_links, BLI_genericNodeN(uf)); uf_arraystore_compact_with_info(uf, uf_ref); diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index d33545f5b22..4c9bde77103 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -1589,7 +1589,7 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op) continue; } } - /* some stroke is already at botom */ + /* Some stroke is already at bottom. */ if (ELEM(direction, GP_STROKE_MOVE_BOTTOM, GP_STROKE_MOVE_DOWN)) { if (gps == gpf->strokes.first) { gpf_lock = true; diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index aeff2acb04d..bf1aff5a34a 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -1111,7 +1111,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp BKE_gpencil_stroke_geometry_update(gpd, gps); BKE_gpencil_stroke_geometry_update(gpd, gps_new); - /* deselect orinal point */ + /* Deselect original point. */ pt->flag &= ~GP_SPOINT_SELECT; } } @@ -1241,7 +1241,7 @@ static void gpencil_curve_extrude_points(bGPdata *gpd, } } - /* Edgcase for single curve point. */ + /* Edge-case for single curve point. */ if (gpc->tot_curve_points == 1) { last_select = false; } @@ -1331,7 +1331,7 @@ static int gpencil_extrude_exec(bContext *C, wmOperator *op) changed = true; } - /* if not multiedit, exit loop*/ + /* If not multi-edit, exit loop. */ if (!is_multiedit) { break; } @@ -1379,8 +1379,11 @@ void GPENCIL_OT_extrude(wmOperatorType *ot) * from several different layers into a single layer. * \{ */ -/* list of bGPDstroke instances */ -/* NOTE: is exposed within the editors/gpencil module so that other tools can use it too */ +/** + * list of #bGPDstroke instances + * + * \note is exposed within the editors/gpencil module so that other tools can use it too. + */ ListBase gpencil_strokes_copypastebuf = {NULL, NULL}; /* Hash for hanging on to all the colors used by strokes in the buffer diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index f3e6129b8ae..454f8d21590 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -611,7 +611,7 @@ typedef struct bActListElem { struct bActionGroup *grp; /* action group that owns the channel */ - void *owner; /* will either be an action channel or fake ipo-channel (for keys) */ + void *owner; /* will either be an action channel or fake IPO-channel (for keys) */ short ownertype; /* type of owner */ } bActListElem; @@ -624,7 +624,7 @@ typedef enum ACTFILTER_FLAGS { ACTFILTER_SEL = (1 << 1), /* should channels be selected */ ACTFILTER_FOREDIT = (1 << 2), /* does editable status matter */ ACTFILTER_CHANNELS = (1 << 3), /* do we only care that it is a channel */ - ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing ipo's */ + ACTFILTER_IPOKEYS = (1 << 4), /* only channels referencing IPO's */ ACTFILTER_ONLYICU = (1 << 5), /* only reference ipo-curves */ ACTFILTER_FORDRAWING = (1 << 6), /* make list for interface drawing */ ACTFILTER_ACTGROUPED = (1 << 7), /* belongs to the active group */ diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c index ffe676f0520..7e6b42f284b 100644 --- a/source/blender/editors/gpencil/gpencil_mesh.c +++ b/source/blender/editors/gpencil/gpencil_mesh.c @@ -318,7 +318,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) use_seams, use_faces); - /* Reproject all untaged created strokes. */ + /* Reproject all un-tagged created strokes. */ if (project_type != GP_REPROJECT_KEEP) { LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { bGPDframe *gpf = gpl->actframe; diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 33910c057b3..974f51ff90b 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1877,7 +1877,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p) BKE_brush_gpencil_paint_presets(bmain, ts, true); changed = true; } - /* Be sure curves are initializated. */ + /* Be sure curves are initialized. */ BKE_curvemapping_init(paint->brush->gpencil_settings->curve_sensitivity); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_strength); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_jitter); @@ -1888,7 +1888,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p) BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_saturation); BKE_curvemapping_init(paint->brush->gpencil_settings->curve_rand_value); - /* assign to temp tGPsdata */ + /* Assign to temp #tGPsdata */ p->brush = paint->brush; if (paint->brush->gpencil_tool != GPAINT_TOOL_ERASE) { p->eraser = gpencil_get_default_eraser(p->bmain, ts); diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index a85b84f462f..d1d8abd6775 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -120,7 +120,8 @@ static bool gpencil_select_poll(bContext *C) } } - /* we just need some visible strokes, and to be in editmode or other modes only to catch event */ + /* We just need some visible strokes, + * and to be in edit-mode or other modes only to catch event. */ if (GPENCIL_ANY_MODE(gpd)) { /* TODO: include a check for visible strokes? */ if (gpd->layers.first) { @@ -220,7 +221,8 @@ static bool gpencil_select_all_poll(bContext *C) { bGPdata *gpd = ED_gpencil_data_get_active(C); - /* we just need some visible strokes, and to be in editmode or other modes only to catch event */ + /* We just need some visible strokes, + * and to be in edit-mode or other modes only to catch event. */ if (GPENCIL_ANY_MODE(gpd)) { if (gpd->layers.first) { return true; @@ -241,7 +243,7 @@ static int gpencil_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -305,7 +307,7 @@ static int gpencil_select_linked_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -382,7 +384,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -659,7 +661,7 @@ static int gpencil_select_grouped_exec(bContext *C, wmOperator *op) { eGP_SelectGrouped mode = RNA_enum_get(op->ptr, "type"); bGPdata *gpd = ED_gpencil_data_get_active(C); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -729,7 +731,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -836,7 +838,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -943,7 +945,7 @@ static int gpencil_select_more_exec(bContext *C, wmOperator *UNUSED(op)) { bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -1083,7 +1085,7 @@ static int gpencil_select_less_exec(bContext *C, wmOperator *UNUSED(op)) bGPdata *gpd = ED_gpencil_data_get_active(C); const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd); - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } @@ -1434,7 +1436,7 @@ static int gpencil_circle_select_exec(bContext *C, wmOperator *op) const float scale = ts->gp_sculpt.isect_threshold; - /* if not edit/sculpt mode, the event is catched but not processed */ + /* If not edit/sculpt mode, the event has been caught but not processed. */ if (GPENCIL_NONE_EDIT_MODE(gpd)) { return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c index 4e172104ce7..583878883fa 100644 --- a/source/blender/editors/gpencil/gpencil_undo.c +++ b/source/blender/editors/gpencil/gpencil_undo.c @@ -132,7 +132,7 @@ void gpencil_undo_push(bGPdata *gpd) // printf("\t\tGP - undo push\n"); if (cur_node) { - /* remove all un-done nodes from stack */ + /* Remove all undone nodes from stack. */ undo_node = cur_node->next; while (undo_node) { diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index a4856845a65..a63b133cc22 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -465,7 +465,7 @@ float ED_view3d_radius_to_dist(const struct View3D *v3d, void imm_drawcircball(const float cent[3], float rad, const float tmat[4][4], unsigned int pos); -/* backbuffer select and draw support */ +/* Back-buffer select and draw support. */ void ED_view3d_backbuf_depth_validate(struct ViewContext *vc); int ED_view3d_backbuf_sample_size_clamp(struct ARegion *region, const float dist); @@ -479,7 +479,7 @@ bool ED_view3d_autodist(struct Depsgraph *depsgraph, const bool alphaoverride, const float fallback_depth_pt[3]); -/* only draw so ED_view3d_autodist_simple can be called many times after */ +/* Only draw so #ED_view3d_autodist_simple can be called many times after. */ void ED_view3d_autodist_init(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c index 1789af2d2ce..f234f0fbbf5 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.c +++ b/source/blender/editors/interface/interface_region_menu_popup.c @@ -188,7 +188,7 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi minwidth = uiLayoutGetUnitsX(pup->layout) * UI_UNIT_X; } else if (pup->but) { - /* minimum width to enforece */ + /* Minimum width to enforce. */ if (pup->but->drawstr[0]) { minwidth = BLI_rctf_size_x(&pup->but->rect); } diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index dd51d63961c..cea006f0faa 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -565,7 +565,7 @@ static void *undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key) ((LinkData *)um_arraystore.local_links.last)->data : NULL; - /* add oursrlves */ + /* Add ourselves. */ BLI_addtail(&um_arraystore.local_links, BLI_genericNodeN(um)); # ifdef USE_ARRAY_STORE_THREAD diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 5c69e21e14e..82c0316093a 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1854,7 +1854,7 @@ void ED_object_base_free_and_unlink(Main *bmain, Scene *scene, Object *ob) ID_EXTRA_USERS(ob) == 0) { /* We cannot delete indirectly used object... */ printf( - "WARNING, undeletable object '%s', should have been catched before reaching this " + "WARNING, undeletable object '%s', should have been caught before reaching this " "function!", ob->id.name + 2); return; diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 2124d242ee2..57676cf5c76 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -154,7 +154,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy); WM_operatortype_append(OBJECT_OT_gpencil_modifier_copy_to_selected); - /* shader fx */ + /* Shader FX. */ WM_operatortype_append(OBJECT_OT_shaderfx_add); WM_operatortype_append(OBJECT_OT_shaderfx_remove); WM_operatortype_append(OBJECT_OT_shaderfx_move_up); diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index f55ce88b426..9ef2cce875f 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -467,7 +467,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev cd->voxel_size = mesh->remesh_voxel_size; op->customdata = cd; - /* Select the front facing face of the mesh boundig box. */ + /* Select the front facing face of the mesh bounding box. */ BoundBox *bb = BKE_mesh_boundbox_get(cd->active_object); /* Indices of the Bounding Box faces. */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index c25b572d200..1735b02ffe3 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1556,7 +1556,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable) /* Seek audio to ensure playback in preview range with AV sync. */ DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); - /* notifier catched by top header, for button */ + /* Notifier caught by top header, for button. */ WM_event_add_notifier(C, NC_SCREEN | ND_ANIMPLAY, NULL); } diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c index a65895a3405..a8ba87ac483 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c @@ -276,7 +276,7 @@ BLI_INLINE float wval_exclusion(float weight, float paintval, float fac) /** * \param weight: Typically the current weight: #MDeformWeight.weight * - * \return The final weight, not that this is _not_ clamped from [0-1]. + * \return The final weight, note that this is _not_ clamped from [0-1]. * Clamping must be done on the final #MDeformWeight.weight * * \note vertex-paint has an equivalent function: #ED_vpaint_blend_tool diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 4a58736966c..c09334b0e86 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -718,7 +718,7 @@ static eOLDrawState tree_element_active_bone(bContext *C, return OL_DRAWSEL_NONE; } -/* ebones only draw in editmode armature */ +/** Edit-bones only draw in edit-mode armature. */ static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone *ebone, short sel) { if (sel) { diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 5c0ca1582a6..21cb8560e9b 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -277,8 +277,7 @@ void ED_view3d_smooth_view_ex( if (rv3d->smooth_timer) { WM_event_remove_timer(wm, win, rv3d->smooth_timer); } - /* TIMER1 is hardcoded in keymap */ - /* max 30 frs/sec */ + /* #TIMER1 is hard-coded in key-map. */ rv3d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0); ok = true; @@ -1210,8 +1209,8 @@ static uint free_localview_bit(Main *bmain) ushort local_view_bits = 0; - /* sometimes we lose a localview: when an area is closed */ - /* check all areas: which localviews are in use? */ + /* Sometimes we lose a local-view: when an area is closed. + * Check all areas: which local-views are in use? */ for (screen = bmain->screens.first; screen; screen = screen->id.next) { for (area = screen->areabase.first; area; area = area->next) { SpaceLink *sl = area->spacedata.first; diff --git a/source/blender/freestyle/intern/geometry/FitCurve.cpp b/source/blender/freestyle/intern/geometry/FitCurve.cpp index 5768f88e95f..7c0b3bf0224 100644 --- a/source/blender/freestyle/intern/geometry/FitCurve.cpp +++ b/source/blender/freestyle/intern/geometry/FitCurve.cpp @@ -134,7 +134,7 @@ static BezierCurve GenerateBezier( double alpha_l; /* Alpha values, left and right */ double alpha_r; Vector2 tmp; /* Utility variable */ - BezierCurve bezCurve; /* RETURN bezier curve ctl pts */ + BezierCurve bezCurve; /* RETURN bezier curve control points. */ bezCurve = (Vector2 *)malloc(4 * sizeof(Vector2)); nPts = last - first + 1; diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp index a576bc35006..68c14e1151c 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_PolygonalizationShader.cpp @@ -43,7 +43,7 @@ static char PolygonalizationShader___doc__[] = "\n" " :arg error: The error we want our polygonal approximation to have\n" " with respect to the original geometry. The smaller, the closer\n" - " the new stroke is to the orinal one. This error corresponds to\n" + " the new stroke is to the original one. This error corresponds to\n" " the maximum distance between the new stroke and the old one.\n" " :type error: float\n" "\n" diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c index f80ad60eb07..686bd8c38e5 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c @@ -124,7 +124,9 @@ BLI_INLINE float table_sample(float *table, float x) return interpf(table[(int)ceilf(x)], table[(int)floor(x)], fractf(x)); } -/* aply noise effect based on stroke direction */ +/** + * Apply noise effect based on stroke direction. + */ static void deformStroke(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c index df2c838140e..54ff8d21633 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c @@ -83,7 +83,9 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target) tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity); } -/* aply smooth effect based on stroke direction */ +/** + * Apply smooth effect based on stroke direction. + */ static void deformStroke(GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), Object *ob, diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index c66618c0acd..4e37a6652a5 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -82,7 +82,7 @@ typedef enum eFModifier_Types { FMODIFIER_TYPE_ENVELOPE = 3, FMODIFIER_TYPE_CYCLES = 4, FMODIFIER_TYPE_NOISE = 5, - /** Unimplemented - for applying: fft, high/low pass filters, etc. */ + /** Unimplemented - for applying: FFT, high/low pass filters, etc. */ FMODIFIER_TYPE_FILTER = 6, FMODIFIER_TYPE_PYTHON = 7, FMODIFIER_TYPE_LIMITS = 8, diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h index 7e010f27ce6..882d4eb1b3b 100644 --- a/source/blender/makesdna/DNA_boid_types.h +++ b/source/blender/makesdna/DNA_boid_types.h @@ -35,7 +35,7 @@ typedef enum eBoidRuleType { eBoidRuleType_Goal = 1, /** get away from assigned object or loudest assigned signal source */ eBoidRuleType_Avoid = 2, - /** manoeuver to avoid collisions with other boids and deflector object in near future */ + /** Maneuver to avoid collisions with other boids and deflector object in near future. */ eBoidRuleType_AvoidCollision = 3, /** keep from going through other boids */ eBoidRuleType_Separate = 4, diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 386590ad26c..aae29e5fddc 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -104,16 +104,19 @@ typedef struct ClothSimSettings { float shrink_max; /* Air pressure */ - /* The uniform pressure that is constanty applied to the mesh. Can be negative */ + /** The uniform pressure that is constantly applied to the mesh. Can be negative. */ float uniform_pressure_force; - /* User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */ + /** User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */ float target_volume; - /* The scaling factor to apply to the actual pressure. - * pressure=( (current_volume/target_volume) - 1 + uniform_pressure_force) * - * pressure_factor */ + /** + * The scaling factor to apply to the actual pressure. + * `pressure = ((current_volume/target_volume) - 1 + uniform_pressure_force) * pressure_factor` + */ float pressure_factor; - /* Density of the fluid inside or outside the object for use in the hydrostatic pressure - * gradient. */ + /** + * Density of the fluid inside or outside the object + * for use in the hydro-static pressure gradient. + */ float fluid_density; short vgroup_pressure; char _pad7[6]; @@ -168,7 +171,7 @@ typedef struct ClothSimSettings { /** The maximum length an internal spring can have during creation. */ float internal_spring_max_length; - /** How much the interal spring can diverge from the vertex normal during creation. */ + /** How much the internal spring can diverge from the vertex normal during creation. */ float internal_spring_max_diversion; /** Vertex group for scaling structural stiffness. */ short vgroup_intern; diff --git a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h index 399bf6f0a6d..11d4ee1b2cd 100644 --- a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h +++ b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h @@ -20,7 +20,7 @@ #pragma once -/* Note that some struct members for colormapping and colorbands are not initialized here. */ +/* Note that some struct members for color-mapping and color-bands are not initialized here. */ /* Struct members on own line. */ /* clang-format off */ diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index e02757c1249..835761bf6e9 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -102,7 +102,7 @@ typedef struct bGPDspoint { bGPDspoint_Runtime runtime; } bGPDspoint; -/* bGPDspoint->flag */ +/** #bGPDspoint.flag */ typedef enum eGPDspoint_Flag { /* stroke point is selected (for editing) */ GP_SPOINT_SELECT = (1 << 0), @@ -144,7 +144,7 @@ typedef struct bGPDpalettecolor { char _pad[6]; } bGPDpalettecolor; -/* bGPDpalettecolor->flag */ +/** #bGPDpalettecolor.flag */ typedef enum eGPDpalettecolor_Flag { /* color is active */ /* PC_COLOR_ACTIVE = (1 << 0), */ /* UNUSED */ @@ -171,7 +171,7 @@ typedef struct bGPDpalette { char _pad[6]; } bGPDpalette; -/* bGPDpalette->flag */ +/** #bGPDpalette.flag */ typedef enum eGPDpalette_Flag { /* palette is active */ PL_PALETTE_ACTIVE = (1 << 0), @@ -319,7 +319,7 @@ typedef struct bGPDstroke { bGPDstroke_Runtime runtime; } bGPDstroke; -/* bGPDstroke->flag */ +/** #bGPDstroke.flag */ typedef enum eGPDstroke_Flag { /* stroke is in 3d-space */ GP_STROKE_3DSPACE = (1 << 0), @@ -347,19 +347,19 @@ typedef enum eGPDstroke_Flag { GP_STROKE_ERASER = (1 << 15), } eGPDstroke_Flag; -/* bGPDstroke->caps */ +/** #bGPDstroke.caps */ typedef enum eGPDstroke_Caps { /* type of extreme */ GP_STROKE_CAP_ROUND = 0, GP_STROKE_CAP_FLAT = 1, - /* Keeo last. */ + /* Keep last. */ GP_STROKE_CAP_MAX, } GPDstroke_Caps; /* Arrows ----------------------- */ -/* bGPDataRuntime.arrowstyle */ +/** #bGPDataRuntime.arrowstyle */ typedef enum eGPDstroke_Arrowstyle { GP_STROKE_ARROWSTYLE_NONE = 0, GP_STROKE_ARROWSTYLE_SEGMENT = 2, @@ -553,13 +553,13 @@ typedef enum eGPDlayer_Flag { GP_LAYER_IS_RULER = (1 << 14), } eGPDlayer_Flag; -/* bGPDlayer->onion_flag */ +/** #bGPDlayer.onion_flag */ typedef enum eGPDlayer_OnionFlag { /* do onion skinning */ GP_LAYER_ONIONSKIN = (1 << 0), } eGPDlayer_OnionFlag; -/* layer blend_mode */ +/** #bGPDlayer.blend_mode */ typedef enum eGPLayerBlendModes { eGplBlendMode_Regular = 0, eGplBlendMode_HardLight = 1, @@ -706,8 +706,10 @@ typedef struct bGPdata { bGPdata_Runtime runtime; } bGPdata; -/* bGPdata->flag */ -/* NOTE: A few flags have been deprecated since early 2.5, +/** + * #bGPdata.flag + * + * NOTE: A few flags have been deprecated since early 2.5, * since they have been made redundant by interaction * changes made during the porting process. */ diff --git a/source/blender/makesdna/DNA_lightprobe_types.h b/source/blender/makesdna/DNA_lightprobe_types.h index 4fdce6d5f45..48e3c44e2c9 100644 --- a/source/blender/makesdna/DNA_lightprobe_types.h +++ b/source/blender/makesdna/DNA_lightprobe_types.h @@ -141,7 +141,7 @@ typedef struct LightGridCache { float visibility_bias, visibility_bleed, visibility_range, _pad5; } LightGridCache; -/* These are used as ubo data. They need to be aligned to size of vec4. */ +/* These are used as UBO data. They need to be aligned to size of vec4. */ BLI_STATIC_ASSERT_ALIGN(LightProbeCache, 16) BLI_STATIC_ASSERT_ALIGN(LightGridCache, 16) diff --git a/source/blender/makesdna/DNA_mask_types.h b/source/blender/makesdna/DNA_mask_types.h index 79ac655300e..8868ac1ea12 100644 --- a/source/blender/makesdna/DNA_mask_types.h +++ b/source/blender/makesdna/DNA_mask_types.h @@ -131,7 +131,7 @@ typedef struct MaskLayerShape { /** U coordinate along spline segment and weight of this point. */ float *data; - /** To ensure no buffer overruns's: alloc size is (tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE). */ + /** To ensure no buffer overrun's: alloc size is `(tot_vert * MASK_OBJECT_SHAPE_ELEM_SIZE)`. */ int tot_vert; /** Different flags of this point. */ int frame; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 6e1c00bfca8..dbcb6ce45ea 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1721,7 +1721,7 @@ typedef enum eRemeshModifierMode { typedef struct RemeshModifierData { ModifierData modifier; - /* floodfill option, controls how small components can be before they are removed */ + /** Flood-fill option, controls how small components can be before they are removed. */ float threshold; /* ratio between size of model and grid */ diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h index 7812ff6a4f1..37013f5b4d6 100644 --- a/source/blender/makesdna/DNA_object_force_types.h +++ b/source/blender/makesdna/DNA_object_force_types.h @@ -224,7 +224,7 @@ typedef struct SoftBody { * rather find them by name tag to find it -> jow20090613. * MAX_VGROUP_NAME */ char namedVG_Mass[64]; - /** Softbody amount of gravitaion to apply. */ + /** Softbody amount of gravitation to apply. */ float grav; /** Friction to env. */ float mediafrict; diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 9a3b9e7d365..740dc35517a 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -312,7 +312,7 @@ typedef enum eRigidBodyCon_Type { RBC_TYPE_HINGE = 1, /** simulates wheel suspension */ /* RBC_TYPE_HINGE2 = 2, */ /* UNUSED */ - /** restricts movent to a specified axis */ + /** Restricts moment to a specified axis. */ RBC_TYPE_SLIDER = 3, /** lets object rotate within a specified cone */ /* RBC_TYPE_CONE_TWIST = 4, */ /* UNUSED */ @@ -329,7 +329,7 @@ typedef enum eRigidBodyCon_Type { /** Simplified spring constraint with only once axis that's * automatically placed between the connected bodies */ /* RBC_TYPE_SPRING = 10, */ /* UNUSED */ - /** dirves bodies by applying linear and angular forces */ + /** Drives bodies by applying linear and angular forces. */ RBC_TYPE_MOTOR = 11, } eRigidBodyCon_Type; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 33d31df4210..2362686cfce 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -231,7 +231,7 @@ typedef struct SceneRenderLayer { struct FreestyleConfig freestyleConfig DNA_DEPRECATED; } SceneRenderLayer; -/* SceneRenderLayer.layflag */ +/** #SceneRenderLayer.layflag */ #define SCE_LAY_SOLID (1 << 0) #define SCE_LAY_ZTRA (1 << 1) #define SCE_LAY_HALO (1 << 2) @@ -249,7 +249,7 @@ typedef struct SceneRenderLayer { #define SCE_LAY_ZMASK (1 << 18) #define SCE_LAY_NEG_ZMASK (1 << 19) -/* SceneRenderLayer.passflag */ +/** #SceneRenderLayer.passflag */ typedef enum eScenePassType { SCE_PASS_COMBINED = (1 << 0), SCE_PASS_Z = (1 << 1), @@ -334,16 +334,16 @@ typedef struct SceneRenderView { } SceneRenderView; -/* SceneRenderView.viewflag */ +/** #SceneRenderView.viewflag */ #define SCE_VIEW_DISABLE (1 << 0) -/* RenderData.views_format */ +/** #RenderData.views_format */ enum { SCE_VIEWS_FORMAT_STEREO_3D = 0, SCE_VIEWS_FORMAT_MULTIVIEW = 1, }; -/* ImageFormatData.views_format (also used for Sequence.views_format) */ +/** #ImageFormatData.views_format (also used for #Sequence.views_format) */ enum { R_IMF_VIEWS_INDIVIDUAL = 0, R_IMF_VIEWS_STEREO_3D = 1, @@ -361,7 +361,7 @@ typedef struct Stereo3dFormat { char _pad[3]; } Stereo3dFormat; -/* Stereo3dFormat.display_mode */ +/** #Stereo3dFormat.display_mode */ typedef enum eStereoDisplayMode { S3D_DISPLAY_ANAGLYPH = 0, S3D_DISPLAY_INTERLACE = 1, @@ -370,21 +370,21 @@ typedef enum eStereoDisplayMode { S3D_DISPLAY_TOPBOTTOM = 4, } eStereoDisplayMode; -/* Stereo3dFormat.flag */ +/** #Stereo3dFormat.flag */ typedef enum eStereo3dFlag { S3D_INTERLACE_SWAP = (1 << 0), S3D_SIDEBYSIDE_CROSSEYED = (1 << 1), S3D_SQUEEZED_FRAME = (1 << 2), } eStereo3dFlag; -/* Stereo3dFormat.anaglyph_type */ +/** #Stereo3dFormat.anaglyph_type */ typedef enum eStereo3dAnaglyphType { S3D_ANAGLYPH_REDCYAN = 0, S3D_ANAGLYPH_GREENMAGENTA = 1, S3D_ANAGLYPH_YELLOWBLUE = 2, } eStereo3dAnaglyphType; -/* Stereo3dFormat.interlace_type */ +/** #Stereo3dFormat.interlace_type */ typedef enum eStereo3dInterlaceType { S3D_INTERLACE_ROW = 0, S3D_INTERLACE_COLUMN = 1, @@ -449,26 +449,26 @@ typedef struct ImageFormatData { ColorManagedDisplaySettings display_settings; } ImageFormatData; -/* ImageFormatData.imtype */ +/** #ImageFormatData.imtype */ #define R_IMF_IMTYPE_TARGA 0 #define R_IMF_IMTYPE_IRIS 1 -/* #define R_HAMX 2 */ /* hamx is nomore */ -/* #define R_FTYPE 3 */ /* ftype is nomore */ +/* #define R_HAMX 2 */ /* DEPRECATED */ +/* #define R_FTYPE 3 */ /* DEPRECATED */ #define R_IMF_IMTYPE_JPEG90 4 -/* #define R_MOVIE 5 */ /* movie is nomore */ +/* #define R_MOVIE 5 */ /* DEPRECATED */ #define R_IMF_IMTYPE_IRIZ 7 #define R_IMF_IMTYPE_RAWTGA 14 #define R_IMF_IMTYPE_AVIRAW 15 #define R_IMF_IMTYPE_AVIJPEG 16 #define R_IMF_IMTYPE_PNG 17 -/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* avicodec is nomore */ -/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* quicktime is nomore */ +/* #define R_IMF_IMTYPE_AVICODEC 18 */ /* DEPRECATED */ +/* #define R_IMF_IMTYPE_QUICKTIME 19 */ /* DEPRECATED */ #define R_IMF_IMTYPE_BMP 20 #define R_IMF_IMTYPE_RADHDR 21 #define R_IMF_IMTYPE_TIFF 22 #define R_IMF_IMTYPE_OPENEXR 23 #define R_IMF_IMTYPE_FFMPEG 24 -/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* frame server is nomore */ +/* #define R_IMF_IMTYPE_FRAMESERVER 25 */ /* DEPRECATED */ #define R_IMF_IMTYPE_CINEON 26 #define R_IMF_IMTYPE_DPX 27 #define R_IMF_IMTYPE_MULTILAYER 28 @@ -481,12 +481,12 @@ typedef struct ImageFormatData { #define R_IMF_IMTYPE_INVALID 255 -/* ImageFormatData.flag */ +/** #ImageFormatData.flag */ #define R_IMF_FLAG_ZBUF (1 << 0) /* was R_OPENEXR_ZBUF */ #define R_IMF_FLAG_PREVIEW_JPG (1 << 1) /* was R_PREVIEW_JPG */ -/* return values from BKE_imtype_valid_depths, note this is depts per channel */ -/* ImageFormatData.depth */ +/* Return values from #BKE_imtype_valid_depths, note this is depths per channel. */ +/** #ImageFormatData.depth */ typedef enum eImageFormatDepth { /* 1bits (unused) */ R_IMF_CHAN_DEPTH_1 = (1 << 0), @@ -504,12 +504,12 @@ typedef enum eImageFormatDepth { R_IMF_CHAN_DEPTH_32 = (1 << 6), } eImageFormatDepth; -/* ImageFormatData.planes */ +/** #ImageFormatData.planes */ #define R_IMF_PLANES_RGB 24 #define R_IMF_PLANES_RGBA 32 #define R_IMF_PLANES_BW 8 -/* ImageFormatData.exr_codec */ +/** #ImageFormatData.exr_codec */ #define R_IMF_EXR_CODEC_NONE 0 #define R_IMF_EXR_CODEC_PXR24 1 #define R_IMF_EXR_CODEC_ZIP 2 @@ -522,19 +522,19 @@ typedef enum eImageFormatDepth { #define R_IMF_EXR_CODEC_DWAB 9 #define R_IMF_EXR_CODEC_MAX 10 -/* ImageFormatData.jp2_flag */ +/** #ImageFormatData.jp2_flag */ #define R_IMF_JP2_FLAG_YCC (1 << 0) /* when disabled use RGB */ /* was R_JPEG2K_YCC */ #define R_IMF_JP2_FLAG_CINE_PRESET (1 << 1) /* was R_JPEG2K_CINE_PRESET */ #define R_IMF_JP2_FLAG_CINE_48 (1 << 2) /* was R_JPEG2K_CINE_48FPS */ -/* ImageFormatData.jp2_codec */ +/** #ImageFormatData.jp2_codec */ #define R_IMF_JP2_CODEC_JP2 0 #define R_IMF_JP2_CODEC_J2K 1 -/* ImageFormatData.cineon_flag */ +/** #ImageFormatData.cineon_flag */ #define R_IMF_CINEON_FLAG_LOG (1 << 0) /* was R_CINEON_LOG */ -/* ImageFormatData.tiff_codec */ +/** #ImageFormatData.tiff_codec */ enum { R_IMF_TIFF_CODEC_DEFLATE = 0, R_IMF_TIFF_CODEC_LZW = 1, @@ -565,7 +565,7 @@ typedef struct BakeData { struct Object *cage_object; } BakeData; -/* BakeData.normal_swizzle (char) */ +/** #BakeData.normal_swizzle (char) */ typedef enum eBakeNormalSwizzle { R_BAKE_POSX = 0, R_BAKE_POSY = 1, @@ -575,19 +575,19 @@ typedef enum eBakeNormalSwizzle { R_BAKE_NEGZ = 5, } eBakeNormalSwizzle; -/* BakeData.target (char) */ +/** #BakeData.target (char) */ typedef enum eBakeTarget { R_BAKE_TARGET_IMAGE_TEXTURES = 0, R_BAKE_TARGET_VERTEX_COLORS = 1, } eBakeTarget; -/* BakeData.save_mode (char) */ +/** #BakeData.save_mode (char) */ typedef enum eBakeSaveMode { R_BAKE_SAVE_INTERNAL = 0, R_BAKE_SAVE_EXTERNAL = 1, } eBakeSaveMode; -/* BakeData.pass_filter */ +/** #BakeData.pass_filter */ typedef enum eBakePassFilter { R_BAKE_PASS_FILTER_NONE = 0, R_BAKE_PASS_FILTER_AO = (1 << 0), @@ -794,7 +794,7 @@ typedef enum eHairType { } eHairType; /* *************************************************************** */ -/* Render Conversion/Simplfication Settings */ +/* Render Conversion/Simplification Settings */ /* control render convert and shading engine */ typedef struct RenderProfile { @@ -812,11 +812,11 @@ typedef struct RenderProfile { } RenderProfile; /* UV Paint */ -/* ToolSettings.uv_sculpt_settings */ +/** #ToolSettings.uv_sculpt_settings */ #define UV_SCULPT_LOCK_BORDERS 1 #define UV_SCULPT_ALL_ISLANDS 2 -/* ToolSettings.uv_relax_method */ +/** #ToolSettings.uv_relax_method */ #define UV_SCULPT_TOOL_RELAX_LAPLACIAN 1 #define UV_SCULPT_TOOL_RELAX_HC 2 @@ -1010,7 +1010,7 @@ typedef struct GpPaint { int mode; } GpPaint; -/* GpPaint.flag */ +/** #GpPaint.flag */ enum { GPPAINT_FLAG_USE_MATERIAL = 0, GPPAINT_FLAG_USE_VERTEXCOLOR = 1, @@ -1049,7 +1049,7 @@ typedef struct VPaint { int radial_symm[3]; } VPaint; -/* VPaint.flag */ +/** #VPaint.flag */ enum { /* weight paint only */ VP_FLAG_VGROUP_RESTRICT = (1 << 7), @@ -1152,7 +1152,7 @@ typedef struct GP_Interpolate_Settings { struct CurveMapping *custom_ipo; } GP_Interpolate_Settings; -/* GP_Interpolate_Settings.flag */ +/** #GP_Interpolate_Settings.flag */ typedef enum eGP_Interpolate_SettingsFlag { /* apply interpolation to all layers */ GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS = (1 << 0), @@ -1160,7 +1160,7 @@ typedef enum eGP_Interpolate_SettingsFlag { GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED = (1 << 1), } eGP_Interpolate_SettingsFlag; -/* GP_Interpolate_Settings.type */ +/** #GP_Interpolate_Settings.type */ typedef enum eGP_Interpolate_Type { /* Traditional Linear Interpolation */ GP_IPO_LINEAR = 0, @@ -1295,7 +1295,7 @@ typedef struct CurvePaintSettings { float corner_angle; } CurvePaintSettings; -/* CurvePaintSettings.flag */ +/** #CurvePaintSettings.flag */ enum { CURVE_PAINT_FLAG_CORNERS_DETECT = (1 << 0), CURVE_PAINT_FLAG_PRESSURE_RADIUS = (1 << 1), @@ -1303,19 +1303,19 @@ enum { CURVE_PAINT_FLAG_DEPTH_STROKE_OFFSET_ABS = (1 << 3), }; -/* CurvePaintSettings.fit_method */ +/** #CurvePaintSettings.fit_method */ enum { CURVE_PAINT_FIT_METHOD_REFIT = 0, CURVE_PAINT_FIT_METHOD_SPLIT = 1, }; -/* CurvePaintSettings.depth_mode */ +/** #CurvePaintSettings.depth_mode */ enum { CURVE_PAINT_PROJECT_CURSOR = 0, CURVE_PAINT_PROJECT_SURFACE = 1, }; -/* CurvePaintSettings.surface_plane */ +/** #CurvePaintSettings.surface_plane */ enum { CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW = 0, CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE = 1, @@ -1361,7 +1361,7 @@ typedef enum eSeqImageFitMethod { /* *************************************************************** */ /* Tool Settings */ -/* CurvePaintSettings.surface_plane */ +/** #CurvePaintSettings.surface_plane */ enum { AUTO_MERGE = 1 << 0, AUTO_MERGE_AND_SPLIT = 1 << 1, @@ -1938,7 +1938,7 @@ enum { }; /* bake_mode: same as RE_BAKE_xxx defines */ -/* RenderData.bake_flag */ +/** #RenderData.bake_flag */ #define R_BAKE_CLEAR (1 << 0) /* #define R_BAKE_OSA (1 << 1) */ /* deprecated */ #define R_BAKE_TO_ACTIVE (1 << 2) @@ -1951,19 +1951,19 @@ enum { #define R_BAKE_SPLIT_MAT (1 << 9) #define R_BAKE_AUTO_NAME (1 << 10) -/* RenderData.bake_normal_space */ +/** #RenderData.bake_normal_space */ #define R_BAKE_SPACE_CAMERA 0 #define R_BAKE_SPACE_WORLD 1 #define R_BAKE_SPACE_OBJECT 2 #define R_BAKE_SPACE_TANGENT 3 -/* RenderData.line_thickness_mode */ +/** #RenderData.line_thickness_mode */ #define R_LINE_THICKNESS_ABSOLUTE 1 #define R_LINE_THICKNESS_RELATIVE 2 /* sequencer seq_prev_type seq_rend_type */ -/* RenderData.engine (scene.c) */ +/** #RenderData.engine (scene.c) */ extern const char *RE_engine_id_BLENDER_EEVEE; extern const char *RE_engine_id_BLENDER_WORKBENCH; extern const char *RE_engine_id_CYCLES; @@ -2025,25 +2025,25 @@ extern const char *RE_engine_id_CYCLES; /* Base.flag is in DNA_object_types.h */ -/* ToolSettings.transform_flag */ +/** #ToolSettings.transform_flag */ enum { SCE_XFORM_AXIS_ALIGN = (1 << 0), SCE_XFORM_DATA_ORIGIN = (1 << 1), SCE_XFORM_SKIP_CHILDREN = (1 << 2), }; -/* ToolSettings.object_flag */ +/** #ToolSettings.object_flag */ enum { SCE_OBJECT_MODE_LOCK = (1 << 0), }; -/* ToolSettings.workspace_tool_flag */ +/** #ToolSettings.workspace_tool_flag */ enum { SCE_WORKSPACE_TOOL_FALLBACK = 0, SCE_WORKSPACE_TOOL_DEFAULT = 1, }; -/* ToolSettings.snap_flag */ +/** #ToolSettings.snap_flag */ #define SCE_SNAP (1 << 0) #define SCE_SNAP_ROTATE (1 << 1) #define SCE_SNAP_PEEL_OBJECT (1 << 2) @@ -2052,13 +2052,13 @@ enum { #define SCE_SNAP_ABS_GRID (1 << 5) #define SCE_SNAP_BACKFACE_CULLING (1 << 6) -/* ToolSettings.snap_target */ +/** #ToolSettings.snap_target */ #define SCE_SNAP_TARGET_CLOSEST 0 #define SCE_SNAP_TARGET_CENTER 1 #define SCE_SNAP_TARGET_MEDIAN 2 #define SCE_SNAP_TARGET_ACTIVE 3 -/* ToolSettings.snap_mode */ +/** #ToolSettings.snap_mode */ #define SCE_SNAP_MODE_VERTEX (1 << 0) #define SCE_SNAP_MODE_EDGE (1 << 1) #define SCE_SNAP_MODE_FACE (1 << 2) @@ -2067,11 +2067,11 @@ enum { #define SCE_SNAP_MODE_EDGE_MIDPOINT (1 << 5) #define SCE_SNAP_MODE_EDGE_PERPENDICULAR (1 << 6) -/* ToolSettings.snap_node_mode */ +/** #ToolSettings.snap_node_mode */ #define SCE_SNAP_MODE_NODE_X (1 << 5) #define SCE_SNAP_MODE_NODE_Y (1 << 6) -/* ToolSettings.snap_mode and ToolSettings.snap_node_mode */ +/** #ToolSettings.snap_mode and #ToolSettings.snap_node_mode */ #define SCE_SNAP_MODE_GRID (1 << 7) /** #ToolSettings.snap_transform_mode_flag */ @@ -2081,24 +2081,24 @@ enum { SCE_SNAP_TRANSFORM_MODE_SCALE = (1 << 2), }; -/* ToolSettings.selectmode */ +/** #ToolSettings.selectmode */ #define SCE_SELECT_VERTEX (1 << 0) /* for mesh */ #define SCE_SELECT_EDGE (1 << 1) #define SCE_SELECT_FACE (1 << 2) -/* MeshStatVis.type */ +/** #MeshStatVis.type */ #define SCE_STATVIS_OVERHANG 0 #define SCE_STATVIS_THICKNESS 1 #define SCE_STATVIS_INTERSECT 2 #define SCE_STATVIS_DISTORT 3 #define SCE_STATVIS_SHARP 4 -/* ParticleEditSettings.selectmode for particles */ +/** #ParticleEditSettings.selectmode for particles */ #define SCE_SELECT_PATH (1 << 0) #define SCE_SELECT_POINT (1 << 1) #define SCE_SELECT_END (1 << 2) -/* ToolSettings.prop_mode (proportional falloff) */ +/** #ToolSettings.prop_mode (proportional falloff) */ #define PROP_SMOOTH 0 #define PROP_SPHERE 1 #define PROP_ROOT 2 @@ -2116,7 +2116,7 @@ enum { PROP_EDIT_PROJECTED = (1 << 2), }; -/* ToolSettings.weightuser */ +/** #ToolSettings.weightuser */ enum { OB_DRAW_GROUPUSER_NONE = 0, OB_DRAW_GROUPUSER_ACTIVE = 1, @@ -2124,7 +2124,7 @@ enum { }; /* object_vgroup.c */ -/* ToolSettings.vgroupsubset */ +/** #ToolSettings.vgroupsubset */ typedef enum eVGroupSelect { WT_VGROUP_ALL = 0, WT_VGROUP_ACTIVE = 1, @@ -2137,7 +2137,7 @@ typedef enum eVGroupSelect { ((1 << WT_VGROUP_ACTIVE) | (1 << WT_VGROUP_BONE_SELECT) | (1 << WT_VGROUP_BONE_DEFORM) | \ (1 << WT_VGROUP_BONE_DEFORM_OFF) | (1 << WT_VGROUP_ALL)) -/* Scene.flag */ +/** #Scene.flag */ #define SCE_DS_SELECTED (1 << 0) #define SCE_DS_COLLAPSED (1 << 1) #define SCE_NLA_EDIT_ON (1 << 2) @@ -2151,13 +2151,13 @@ typedef enum eVGroupSelect { #define F_SCENE 1 #define F_DUPLI 3 -/* AudioData.flag */ +/** #AudioData.flag */ #define AUDIO_MUTE (1 << 0) #define AUDIO_SYNC (1 << 1) #define AUDIO_SCRUB (1 << 2) #define AUDIO_VOLUME_ANIMATED (1 << 3) -/* FFMpegCodecData.flags */ +/** #FFMpegCodecData.flags */ enum { #ifdef DNA_DEPRECATED_ALLOW FFMPEG_MULTIPLEX_AUDIO = (1 << 0), /* deprecated, you can choose none as audiocodec now */ @@ -2167,7 +2167,7 @@ enum { FFMPEG_USE_MAX_B_FRAMES = (1 << 3), }; -/* Paint.flags */ +/** #Paint.flags */ typedef enum ePaintFlags { PAINT_SHOW_BRUSH = (1 << 0), PAINT_FAST_NAVIGATE = (1 << 1), @@ -2176,8 +2176,10 @@ typedef enum ePaintFlags { PAINT_SCULPT_DELAY_UPDATES = (1 << 4), } ePaintFlags; -/* Paint.symmetry_flags - * (for now just a duplicate of sculpt symmetry flags) */ +/** + * #Paint.symmetry_flags + * (for now just a duplicate of sculpt symmetry flags). + */ typedef enum ePaintSymmetryFlags { PAINT_SYMM_X = (1 << 0), PAINT_SYMM_Y = (1 << 1), @@ -2190,8 +2192,10 @@ typedef enum ePaintSymmetryFlags { #define PAINT_SYMM_AXIS_ALL (PAINT_SYMM_X | PAINT_SYMM_Y | PAINT_SYMM_Z) -/* Sculpt.flags */ -/* These can eventually be moved to paint flags? */ +/** + * #Sculpt.flags + * These can eventually be moved to paint flags? + */ typedef enum eSculptFlags { SCULPT_FLAG_UNUSED_0 = (1 << 0), /* cleared */ SCULPT_FLAG_UNUSED_1 = (1 << 1), /* cleared */ @@ -2228,25 +2232,25 @@ typedef enum eSculptFlags { SCULPT_HIDE_FACE_SETS = (1 << 17), } eSculptFlags; -/* ImagePaintSettings.mode */ +/** #ImagePaintSettings.mode */ typedef enum eImagePaintMode { IMAGEPAINT_MODE_MATERIAL = 0, /* detect texture paint slots from the material */ IMAGEPAINT_MODE_IMAGE = 1, /* select texture paint image directly */ } eImagePaintMode; -/* ImagePaintSettings.interp */ +/** #ImagePaintSettings.interp */ enum { IMAGEPAINT_INTERP_LINEAR = 0, IMAGEPAINT_INTERP_CLOSEST = 1, }; -/* ImagePaintSettings.flag */ +/** #ImagePaintSettings.flag */ #define IMAGEPAINT_DRAWING (1 << 0) // #define IMAGEPAINT_DRAW_TOOL (1 << 1) /* deprecated */ // #define IMAGEPAINT_DRAW_TOOL_DRAWING (1 << 2) /* deprecated */ /* projection painting only */ -/* ImagePaintSettings.flag */ +/** #ImagePaintSettings.flag */ #define IMAGEPAINT_PROJECT_XRAY (1 << 4) #define IMAGEPAINT_PROJECT_BACKFACE (1 << 5) #define IMAGEPAINT_PROJECT_FLAT (1 << 6) @@ -2254,13 +2258,13 @@ enum { #define IMAGEPAINT_PROJECT_LAYER_STENCIL (1 << 8) #define IMAGEPAINT_PROJECT_LAYER_STENCIL_INV (1 << 9) -/* ImagePaintSettings.missing_data */ +/** #ImagePaintSettings.missing_data */ #define IMAGEPAINT_MISSING_UVS (1 << 0) #define IMAGEPAINT_MISSING_MATERIAL (1 << 1) #define IMAGEPAINT_MISSING_TEX (1 << 2) #define IMAGEPAINT_MISSING_STENCIL (1 << 3) -/* ToolSettings.uvcalc_flag */ +/** #ToolSettings.uvcalc_flag */ #define UVCALC_FILLHOLES (1 << 0) /** would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */ #define UVCALC_NO_ASPECT_CORRECT (1 << 1) @@ -2273,17 +2277,17 @@ enum { /** Keep equal values merged while correcting custom-data. */ #define UVCALC_TRANSFORM_CORRECT_KEEP_CONNECTED (1 << 5) -/* ToolSettings.uv_flag */ +/** #ToolSettings.uv_flag */ #define UV_SYNC_SELECTION 1 #define UV_SHOW_SAME_IMAGE 2 -/* ToolSettings.uv_selectmode */ +/** #ToolSettings.uv_selectmode */ #define UV_SELECT_VERTEX 1 #define UV_SELECT_EDGE 2 #define UV_SELECT_FACE 4 #define UV_SELECT_ISLAND 8 -/* ToolSettings.gpencil_flags */ +/** #ToolSettings.gpencil_flags */ typedef enum eGPencil_Flags { /* When creating new frames, the last frame gets used as the basis for the new one */ GP_TOOL_FLAG_RETAIN_LAST = (1 << 1), @@ -2297,7 +2301,7 @@ typedef enum eGPencil_Flags { GP_TOOL_FLAG_AUTOMERGE_STROKE = (1 << 5), } eGPencil_Flags; -/* scene->r.simplify_gpencil */ +/** #Scene.r.simplify_gpencil */ typedef enum eGPencil_SimplifyFlags { /* Simplify */ SIMPLIFY_GPENCIL_ENABLE = (1 << 0), @@ -2315,7 +2319,7 @@ typedef enum eGPencil_SimplifyFlags { SIMPLIFY_GPENCIL_AA = (1 << 8), } eGPencil_SimplifyFlags; -/* ToolSettings.gpencil_*_align - Stroke Placement mode flags */ +/** `ToolSettings.gpencil_*_align` - Stroke Placement mode flags */ typedef enum eGPencil_Placement_Flags { /* New strokes are added in viewport/data space (i.e. not screen space) */ GP_PROJECT_VIEWSPACE = (1 << 0), @@ -2333,14 +2337,14 @@ typedef enum eGPencil_Placement_Flags { GP_PROJECT_DEPTH_STROKE_FIRST = (1 << 6), } eGPencil_Placement_Flags; -/* ToolSettings.gpencil_selectmode */ +/** #ToolSettings.gpencil_selectmode */ typedef enum eGPencil_Selectmode_types { GP_SELECTMODE_POINT = 0, GP_SELECTMODE_STROKE = 1, GP_SELECTMODE_SEGMENT = 2, } eGPencil_Selectmode_types; -/* ToolSettings.gpencil_guide_types */ +/** #ToolSettings.gpencil_guide_types */ typedef enum eGPencil_GuideTypes { GP_GUIDE_CIRCULAR = 0, GP_GUIDE_RADIAL = 1, @@ -2349,14 +2353,14 @@ typedef enum eGPencil_GuideTypes { GP_GUIDE_ISO = 4, } eGPencil_GuideTypes; -/* ToolSettings.gpencil_guide_references */ +/** #ToolSettings.gpencil_guide_references */ typedef enum eGPencil_Guide_Reference { GP_GUIDE_REF_CURSOR = 0, GP_GUIDE_REF_CUSTOM = 1, GP_GUIDE_REF_OBJECT = 2, } eGPencil_Guide_Reference; -/* ToolSettings.particle flag */ +/** #ToolSettings.particle flag */ #define PE_KEEP_LENGTHS (1 << 0) #define PE_LOCK_FIRST (1 << 1) #define PE_DEFLECT_EMITTER (1 << 2) @@ -2366,7 +2370,7 @@ typedef enum eGPencil_Guide_Reference { #define PE_FADE_TIME (1 << 7) #define PE_AUTO_VELOCITY (1 << 8) -/* ParticleEditSettings.brushtype */ +/** #ParticleEditSettings.brushtype */ #define PE_BRUSH_NONE -1 #define PE_BRUSH_COMB 0 #define PE_BRUSH_CUT 1 @@ -2376,15 +2380,15 @@ typedef enum eGPencil_Guide_Reference { #define PE_BRUSH_SMOOTH 5 #define PE_BRUSH_WEIGHT 6 -/* ParticleBrushData.flag */ +/** #ParticleBrushData.flag */ #define PE_BRUSH_DATA_PUFF_VOLUME 1 -/* ParticleBrushData.edittype */ +/** #ParticleBrushData.edittype */ #define PE_TYPE_PARTICLES 0 #define PE_TYPE_SOFTBODY 1 #define PE_TYPE_CLOTH 2 -/* PhysicsSettings.flag */ +/** #PhysicsSettings.flag */ #define PHYS_GLOBAL_GRAVITY 1 /* UnitSettings */ @@ -2398,7 +2402,7 @@ typedef enum eGPencil_Guide_Reference { #define USER_UNIT_OPT_SPLIT 1 #define USER_UNIT_ROT_RADIANS 2 -/* SceneEEVEE->flag */ +/** #SceneEEVEE.flag */ enum { // SCE_EEVEE_VOLUMETRIC_ENABLED = (1 << 0), /* Unused */ SCE_EEVEE_VOLUMETRIC_LIGHTS = (1 << 1), @@ -2426,21 +2430,21 @@ enum { SCE_EEVEE_DOF_JITTER = (1 << 23), }; -/* SceneEEVEE->shadow_method */ +/** #SceneEEVEE.shadow_method */ enum { SHADOW_ESM = 1, /* SHADOW_VSM = 2, */ /* UNUSED */ /* SHADOW_METHOD_MAX = 3, */ /* UNUSED */ }; -/* SceneEEVEE->motion_blur_position */ +/** #SceneEEVEE.motion_blur_position */ enum { SCE_EEVEE_MB_CENTER = 0, SCE_EEVEE_MB_START = 1, SCE_EEVEE_MB_END = 2, }; -/* SceneDisplay->render_aa, SceneDisplay->viewport_aa */ +/** #SceneDisplay->render_aa and #SceneDisplay->viewport_aa */ enum { SCE_DISPLAY_AA_OFF = 0, SCE_DISPLAY_AA_FXAA = 1, diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index a3aaf3ee937..1635aa7646b 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -472,7 +472,7 @@ typedef struct wmKeyConfig { /** Unique name. */ char idname[64]; - /** Idname of configuration this is derives from, "" if none. */ + /** ID-name of configuration this is derives from, "" if none. */ char basename[64]; ListBase keymaps; diff --git a/source/blender/windowmanager/WM_toolsystem.h b/source/blender/windowmanager/WM_toolsystem.h index 451f0ecd424..d2e2b9c8f3b 100644 --- a/source/blender/windowmanager/WM_toolsystem.h +++ b/source/blender/windowmanager/WM_toolsystem.h @@ -42,7 +42,7 @@ struct wmOperatorType; #define WM_TOOLSYSTEM_SPACE_MASK \ ((1 << SPACE_IMAGE) | (1 << SPACE_NODE) | (1 << SPACE_VIEW3D) | (1 << SPACE_SEQ)) -/* Values that define a categoey of active tool. */ +/* Values that define a category of active tool. */ typedef struct bToolKey { int space_type; int mode; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 0a32d2f0405..24aa5bc4869 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -549,7 +549,7 @@ typedef struct wmEvent { /** Event code itself (short, is also in keymap). */ short type; - /** Press, release, scrollvalue. */ + /** Press, release, scroll-value. */ short val; /** Mouse pointer position, screen coord. */ int x, y; diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 918836041df..56fd51ac6fd 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -624,13 +624,13 @@ void WM_exit_ex(bContext *C, const bool do_python) #ifdef WITH_PYTHON /* option not to close python so we can use 'atexit' */ if (do_python && ((C == NULL) || CTX_py_init_get(C))) { - /* XXX - old note */ - /* before BKE_blender_free so py's gc happens while library still exists */ - /* needed at least for a rare sigsegv that can happen in pydrivers */ - - /* Update for blender 2.5, move after BKE_blender_free because Blender now holds references to - * PyObject's so decref'ing them after python ends causes bad problems every time - * the py-driver bug can be fixed if it happens again we can deal with it then. */ + /* NOTE: (old note) + * before BKE_blender_free so Python's garbage-collection happens while library still exists. + * Needed at least for a rare crash that can happen in python-drivers. + * + * Update for Blender 2.5, move after #BKE_blender_free because Blender now holds references + * to #PyObject's so #Py_DECREF'ing them after Python ends causes bad problems every time + * the python-driver bug can be fixed if it happens again we can deal with it then. */ BPY_python_end(); } #else diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index fcb13fff0a5..6cc9a4c9b64 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -1333,7 +1333,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, if (IDP_EqualsProperties_ex(properties, properties_default, is_strict)) { char kmi_str[128]; WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str)); - /* Note gievn properties could come from other things than menu entry... */ + /* NOTE: given properties could come from other things than menu entry. */ printf( "%s: Some set values in menu entry match default op values, " "this might not be desired!\n", diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c index 1b1ebc70fd9..02a8951e60e 100644 --- a/source/blender/windowmanager/intern/wm_playanim.c +++ b/source/blender/windowmanager/intern/wm_playanim.c @@ -1146,7 +1146,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) PlayState ps = {0}; - /* ps.doubleb = true;*/ /* UNUSED */ ps.go = true; ps.direction = true; ps.next_frame = 1; @@ -1162,7 +1161,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) ps.indicator = false; ps.dropped_file[0] = 0; ps.zoom = 1.0f; - /* resetmap = false */ ps.draw_flip[0] = false; ps.draw_flip[1] = false; @@ -1423,7 +1421,7 @@ static char *wm_main_playanim_intern(int argc, const char **argv) #endif #ifdef USE_FRAME_CACHE_LIMIT - /* really basic memory conservation scheme. Keep frames in a fifo queue */ + /* Really basic memory conservation scheme. Keep frames in a FIFO queue. */ node = inmempicsbase.last; while (node && added_images > PLAY_FRAME_CACHE_MAX) { From 2f6d62bf88621c9a33aa01fae6548d89d0eaccd9 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Thu, 14 Jan 2021 20:55:52 +0100 Subject: [PATCH 163/519] Cycles: Implement Dwivedi guiding for path-traced subsurface scattering Cycles has supported path-traced subsurface scattering for a while, but while it's more accurate than other approaches, the increase in noise makes it an expensive option. To improve this, this patch implements Dwivedi guiding, a technique that is based on zero-variance random walk theory from particle physics and helps to produce shorter random walks with more consistent throughput. The idea behind this is that in non-white materials, each scattering event inside the medium reduces the path throughput. Therefore, the darker the material is, the lower the contribution of paths that travel far from the origin is. In order to reduce variance, Dwivedi guiding uses modified direction and distance sampling functions that favor paths which go back towards the medium interface. By carefully selecting these sampling distributions, variance can be greatly reduced, and as a neat side effect shorter paths are produced, which speeds up the process. One limitation of just blindly applying this is that the guiding is derived from the assumption of a medium that covers an infinite half-space. Therefore, at corners or thin geometry where this does not hold, the algorithm might lead to fireflies. To avoid this, the implementation here uses MIS to combine the classic and guided sampling. Since each of those works on one of the three color channels, the final estimator combines six sampling techniques. This results in some unintuitive math, but I tried to structure it in a way that makes some sense. Another improvement is that in areas where the other side of the mesh is close (e.g. ears), the algorithm has a chance to switch to guiding towards the other side. This chance is based on how deep the random walk is inside the object, and once again MIS is applied to the decision, giving a total of nine techniques. Combining all this, the noise of path-traced subsurface scattering is reduced significantly. In my testing with the Rain character model and a simple lighting setup, the path-traced SSS is now actually less noisy than the Christensen-Burley approximation at same render time while of course still being significantly more realistic. Differential Revision: https://developer.blender.org/D9932 --- intern/cycles/kernel/kernel_subsurface.h | 246 +++++++++++++++++++---- 1 file changed, 205 insertions(+), 41 deletions(-) diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index 917f35d37dc..50a232dd82e 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -336,38 +336,95 @@ ccl_device_noinline void subsurface_scatter_multi_setup( ccl_device void subsurface_random_walk_remap(const float A, const float d, float *sigma_t, - float *sigma_s) + float *alpha) { /* Compute attenuation and scattering coefficients from albedo. */ - const float a = 1.0f - expf(A * (-5.09406f + A * (2.61188f - A * 4.31805f))); + *alpha = 1.0f - expf(A * (-5.09406f + A * (2.61188f - A * 4.31805f))); const float s = 1.9f - A + 3.5f * sqr(A - 0.8f); *sigma_t = 1.0f / fmaxf(d * s, 1e-16f); - *sigma_s = *sigma_t * a; } ccl_device void subsurface_random_walk_coefficients(const ShaderClosure *sc, float3 *sigma_t, - float3 *sigma_s, + float3 *alpha, float3 *weight) { const Bssrdf *bssrdf = (const Bssrdf *)sc; const float3 A = bssrdf->albedo; const float3 d = bssrdf->radius; float sigma_t_x, sigma_t_y, sigma_t_z; - float sigma_s_x, sigma_s_y, sigma_s_z; + float alpha_x, alpha_y, alpha_z; - subsurface_random_walk_remap(A.x, d.x, &sigma_t_x, &sigma_s_x); - subsurface_random_walk_remap(A.y, d.y, &sigma_t_y, &sigma_s_y); - subsurface_random_walk_remap(A.z, d.z, &sigma_t_z, &sigma_s_z); + subsurface_random_walk_remap(A.x, d.x, &sigma_t_x, &alpha_x); + subsurface_random_walk_remap(A.y, d.y, &sigma_t_y, &alpha_y); + subsurface_random_walk_remap(A.z, d.z, &sigma_t_z, &alpha_z); *sigma_t = make_float3(sigma_t_x, sigma_t_y, sigma_t_z); - *sigma_s = make_float3(sigma_s_x, sigma_s_y, sigma_s_z); + *alpha = make_float3(alpha_x, alpha_y, alpha_z); /* Closure mixing and Fresnel weights separate from albedo. */ *weight = safe_divide_color(bssrdf->weight, A); } +/* References for Dwivedi sampling: + * + * [1] "A Zero-variance-based Sampling Scheme for Monte Carlo Subsurface Scattering" + * by Jaroslav KÅ™ivánek and Eugene d'Eon (SIGGRAPH 2014) + * https://cgg.mff.cuni.cz/~jaroslav/papers/2014-zerovar/ + * + * [2] "Improving the Dwivedi Sampling Scheme" + * by Johannes Meng, Johannes Hanika, and Carsten Dachsbacher (EGSR 2016) + * https://cg.ivd.kit.edu/1951.php + * + * [3] "Zero-Variance Theory for Efficient Subsurface Scattering" + * by Eugene d'Eon and Jaroslav KÅ™ivánek (SIGGRAPH 2020) + * https://iliyan.com/publications/RenderingCourse2020 + */ + +ccl_device_forceinline float eval_phase_dwivedi(float v, float phase_log, float cos_theta) +{ + /* Eq. 9 from [2] using precomputed log((v + 1) / (v - 1))*/ + return 1.0f / ((v - cos_theta) * phase_log); +} + +ccl_device_forceinline float sample_phase_dwivedi(float v, float phase_log, float rand) +{ + /* Based on Eq. 10 from [2]: v - (v + 1) * pow((v - 1) / (v + 1), rand) + * Since we're already precomputing phase_log = log((v + 1) / (v - 1)) for the evaluation, + * we can implement the power function like this. */ + return v - (v + 1) * expf(-rand * phase_log); +} + +ccl_device_forceinline float diffusion_length_dwivedi(float alpha) +{ + /* Eq. 67 from [3] */ + return 1.0f / sqrtf(1.0f - powf(alpha, 2.44294f - 0.0215813f * alpha + 0.578637f / alpha)); +} + +ccl_device_forceinline float3 direction_from_cosine(float3 D, float cos_theta, float randv) +{ + float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta); + float phi = M_2PI_F * randv; + float3 dir = make_float3(sin_theta * cosf(phi), sin_theta * sinf(phi), cos_theta); + + float3 T, B; + make_orthonormals(D, &T, &B); + return dir.x * T + dir.y * B + dir.z * D; +} + +ccl_device_forceinline float3 subsurface_random_walk_pdf(float3 sigma_t, + float t, + bool hit, + float3 *transmittance) +{ + float3 T = volume_color_transmittance(sigma_t, t); + if (transmittance) { + *transmittance = T; + } + return hit ? T : sigma_t * T; +} + #ifdef __KERNEL_OPTIX__ ccl_device_inline /* inline trace calls */ #else @@ -390,10 +447,24 @@ ccl_device_noinline return 0; } - /* Convert subsurface to volume coefficients. */ - float3 sigma_t, sigma_s; + /* Convert subsurface to volume coefficients. + * The single-scattering albedo is named alpha to avoid confusion with the surface albedo. */ + float3 sigma_t, alpha; float3 throughput = make_float3(1.0f, 1.0f, 1.0f); - subsurface_random_walk_coefficients(sc, &sigma_t, &sigma_s, &throughput); + subsurface_random_walk_coefficients(sc, &sigma_t, &alpha, &throughput); + float3 sigma_s = sigma_t * alpha; + + /* Theoretically it should be better to use the exact alpha for the channel we're sampling at + * each bounce, but in practise there doesn't seem to be a noticeable difference in exchange + * for making the code significantly more complex and slower (if direction sampling depends on + * the sampled channel, we need to compute its PDF per-channel and consider it for MIS later on). + * + * Since the strength of the guided sampling increases as alpha gets lower, using a value that + * is too low results in fireflies while one that's too high just gives a bit more noise. + * Therefore, the code here uses the highest of the three albedos to be safe. */ + float diffusion_length = diffusion_length_dwivedi(max3(alpha)); + /* Precompute term for phase sampling. */ + float phase_log = logf((diffusion_length + 1) / (diffusion_length - 1)); /* Setup ray. */ #ifdef __SPLIT_KERNEL__ @@ -414,68 +485,161 @@ ccl_device_noinline /* Random walk until we hit the surface again. */ bool hit = false; + bool have_opposite_interface = false; + float opposite_distance = 0.0f; + + /* Todo: Disable for alpha>0.999 or so? */ + const float guided_fraction = 0.75f; for (int bounce = 0; bounce < BSSRDF_MAX_BOUNCES; bounce++) { /* Advance random number offset. */ state->rng_offset += PRNG_BOUNCE_NUM; - if (bounce > 0) { - /* Sample scattering direction. */ - const float anisotropy = 0.0f; - float scatter_u, scatter_v; - path_state_rng_2D(kg, state, PRNG_BSDF_U, &scatter_u, &scatter_v); - ray->D = henyey_greenstrein_sample(ray->D, anisotropy, scatter_u, scatter_v, NULL); - } - /* Sample color channel, use MIS with balance heuristic. */ float rphase = path_state_rng_1D(kg, state, PRNG_PHASE_CHANNEL); - float3 albedo = safe_divide_color(sigma_s, sigma_t); float3 channel_pdf; - int channel = kernel_volume_sample_channel(albedo, throughput, rphase, &channel_pdf); - - /* Distance sampling. */ - float rdist = path_state_rng_1D(kg, state, PRNG_SCATTER_DISTANCE); + int channel = kernel_volume_sample_channel(alpha, throughput, rphase, &channel_pdf); float sample_sigma_t = kernel_volume_channel_get(sigma_t, channel); - float t = -logf(1.0f - rdist) / sample_sigma_t; + float randt = path_state_rng_1D(kg, state, PRNG_SCATTER_DISTANCE); - ray->t = t; + /* We need the result of the raycast to compute the full guided PDF, so just remember the + * relevant terms to avoid recomputing them later. */ + float backward_fraction = 0.0f; + float forward_pdf_factor = 0.0f; + float forward_stretching = 1.0f; + float backward_pdf_factor = 0.0f; + float backward_stretching = 1.0f; + + /* For the initial ray, we already know the direction, so just do classic distance sampling. */ + if (bounce > 0) { + /* Decide whether we should use guided or classic sampling. */ + bool guided = (path_state_rng_1D(kg, state, PRNG_LIGHT_TERMINATE) < guided_fraction); + + /* Determine if we want to sample away from the incoming interface. + * This only happens if we found a nearby opposite interface, and the probability for it + * depends on how close we are to it already. + * This probability term comes from the recorded presentation of [3]. */ + bool guide_backward = false; + if (have_opposite_interface) { + /* Compute distance of the random walk between the tangent plane at the starting point + * and the assumed opposite interface (the parallel plane that contains the point we + * found in our ray query for the opposite side). */ + float x = clamp(dot(ray->P - sd->P, -sd->N), 0.0f, opposite_distance); + backward_fraction = 1.0f / (1.0f + expf((opposite_distance - 2 * x) / diffusion_length)); + guide_backward = path_state_rng_1D(kg, state, PRNG_TERMINATE) < backward_fraction; + } + + /* Sample scattering direction. */ + float scatter_u, scatter_v; + path_state_rng_2D(kg, state, PRNG_BSDF_U, &scatter_u, &scatter_v); + float cos_theta; + if (guided) { + cos_theta = sample_phase_dwivedi(diffusion_length, phase_log, scatter_u); + /* The backwards guiding distribution is just mirrored along sd->N, so swapping the + * sign here is enough to sample from that instead. */ + if (guide_backward) { + cos_theta = -cos_theta; + } + } + else { + cos_theta = 2.0f * scatter_u - 1.0f; + } + ray->D = direction_from_cosine(sd->N, cos_theta, scatter_v); + + /* Compute PDF factor caused by phase sampling (as the ratio of guided / classic). + * Since phase sampling is channel-independent, we can get away with applying a factor + * to the guided PDF, which implicitly means pulling out the classic PDF term and letting + * it cancel with an equivalent term in the numerator of the full estimator. + * For the backward PDF, we again reuse the same probability distribution with a sign swap. + */ + forward_pdf_factor = 2.0f * eval_phase_dwivedi(diffusion_length, phase_log, cos_theta); + backward_pdf_factor = 2.0f * eval_phase_dwivedi(diffusion_length, phase_log, -cos_theta); + + /* Prepare distance sampling. + * For the backwards case, this also needs the sign swapped since now directions against + * sd->N (and therefore with negative cos_theta) are preferred. */ + forward_stretching = (1.0f - cos_theta / diffusion_length); + backward_stretching = (1.0f + cos_theta / diffusion_length); + if (guided) { + sample_sigma_t *= guide_backward ? backward_stretching : forward_stretching; + } + } + + /* Sample direction along ray. */ + float t = -logf(1.0f - randt) / sample_sigma_t; + + /* On the first bounce, we use the raycast to check if the opposite side is nearby. + * If yes, we will later use backwards guided sampling in order to have a decent + * chance of connecting to it. + * Todo: Maybe use less than 10 times the mean free path? */ + ray->t = (bounce == 0) ? max(t, 10.0f / (min3(sigma_t))) : t; scene_intersect_local(kg, ray, ss_isect, sd->object, NULL, 1); hit = (ss_isect->num_hits > 0); if (hit) { #ifdef __KERNEL_OPTIX__ /* t is always in world space with OptiX. */ - t = ss_isect->hits[0].t; + ray->t = ss_isect->hits[0].t; #else /* Compute world space distance to surface hit. */ float3 D = ray->D; object_inverse_dir_transform(kg, sd, &D); D = normalize(D) * ss_isect->hits[0].t; object_dir_transform(kg, sd, &D); - t = len(D); + ray->t = len(D); #endif } + if (bounce == 0) { + /* Check if we hit the opposite side. */ + if (hit) { + have_opposite_interface = true; + opposite_distance = dot(ray->P + ray->t * ray->D - sd->P, -sd->N); + } + /* Apart from the opposite side check, we were supposed to only trace up to distance t, + * so check if there would have been a hit in that case. */ + hit = ray->t < t; + } + + /* Use the distance to the exit point for the throughput update if we found one. */ + if (hit) { + t = ray->t; + } + /* Advance to new scatter location. */ ray->P += t * ray->D; - /* Update throughput. */ - float3 transmittance = volume_color_transmittance(sigma_t, t); - float pdf = dot(channel_pdf, (hit) ? transmittance : sigma_t * transmittance); - throughput *= ((hit) ? transmittance : sigma_s * transmittance) / pdf; + float3 transmittance; + float3 pdf = subsurface_random_walk_pdf(sigma_t, t, hit, &transmittance); + if (bounce > 0) { + /* Compute PDF just like we do for classic sampling, but with the stretched sigma_t. */ + float3 guided_pdf = subsurface_random_walk_pdf(forward_stretching * sigma_t, t, hit, NULL); + + if (have_opposite_interface) { + /* First step of MIS: Depending on geometry we might have two methods for guided + * sampling, so perform MIS between them. */ + float3 back_pdf = subsurface_random_walk_pdf(backward_stretching * sigma_t, t, hit, NULL); + guided_pdf = mix( + guided_pdf * forward_pdf_factor, back_pdf * backward_pdf_factor, backward_fraction); + } + else { + /* Just include phase sampling factor otherwise. */ + guided_pdf *= forward_pdf_factor; + } + + /* Now we apply the MIS balance heuristic between the classic and guided sampling. */ + pdf = mix(pdf, guided_pdf, guided_fraction); + } + + /* Finally, we're applying MIS again to combine the three color channels. + * Altogether, the MIS computation combines up to nine different estimators: + * {classic, guided, backward_guided} x {r, g, b} */ + throughput *= (hit ? transmittance : sigma_s * transmittance) / dot(channel_pdf, pdf); if (hit) { /* If we hit the surface, we are done. */ break; } - - /* Russian roulette. */ - float terminate = path_state_rng_1D(kg, state, PRNG_TERMINATE); - float probability = min(max3(fabs(throughput)), 1.0f); - if (terminate >= probability) { - break; - } - throughput /= probability; } kernel_assert(isfinite_safe(throughput.x) && isfinite_safe(throughput.y) && From 2d3b29de4fc72d5e293deccd2317c001ede703e3 Mon Sep 17 00:00:00 2001 From: Falk David Date: Tue, 9 Feb 2021 10:33:21 +0100 Subject: [PATCH 164/519] Fix T85488: Display units inset operator The inset operator would display the inset thickness and depth as Blender units during transform. This meant that when the scene units were set to something different than meters, the display value would give different results than entering the same number using the value input. (Similar to D10325) The fix makes sure that the numbers are always displayed in the correct scene units. Reviewed By: campbellbarton Maniphest Tasks: T85488 Differential Revision: https://developer.blender.org/D10366 --- source/blender/editors/mesh/editmesh_inset.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_inset.c b/source/blender/editors/mesh/editmesh_inset.c index 8427458d9cc..9000a942e50 100644 --- a/source/blender/editors/mesh/editmesh_inset.c +++ b/source/blender/editors/mesh/editmesh_inset.c @@ -97,9 +97,20 @@ static void edbm_inset_update_header(wmOperator *op, bContext *C) outputNumInput(&opdata->num_input, flts_str, &sce->unit); } else { - BLI_snprintf(flts_str, NUM_STR_REP_LEN, "%f", RNA_float_get(op->ptr, "thickness")); - BLI_snprintf( - flts_str + NUM_STR_REP_LEN, NUM_STR_REP_LEN, "%f", RNA_float_get(op->ptr, "depth")); + BKE_unit_value_as_string(flts_str, + NUM_STR_REP_LEN, + RNA_float_get(op->ptr, "thickness"), + 4, + B_UNIT_LENGTH, + &sce->unit, + true); + BKE_unit_value_as_string(flts_str + NUM_STR_REP_LEN, + NUM_STR_REP_LEN, + RNA_float_get(op->ptr, "depth"), + 4, + B_UNIT_LENGTH, + &sce->unit, + true); } BLI_snprintf(msg, sizeof(msg), From 7a608f88a713c162d5a8b6d3a31795d1d92aa1ac Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 14 Feb 2021 15:31:01 -0600 Subject: [PATCH 165/519] Fix T85633: Misspelling of "neighborhood" in description --- .../engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl | 2 +- source/blender/makesrna/intern/rna_scene.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl index d52a9e6757f..22e6f929f36 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_dilate_tiles_frag.glsl @@ -1,7 +1,7 @@ /** * Tile dilate pass: Takes the 8x8 Tiles buffer and converts dilates the tiles with large CoC to - * their neighboorhod. This pass is repeated multiple time until the maximum CoC can be covered. + * their neighborhood. This pass is repeated multiple time until the maximum CoC can be covered. **/ #pragma BLENDER_REQUIRE(effect_dof_lib.glsl) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 938f051cd55..9479d15c2cc 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -7388,7 +7388,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Neighbor Rejection", "Maximum brightness to consider when rejecting bokeh sprites " - "based on neighboorhod (lower is faster)"); + "based on neighborhood (lower is faster)"); RNA_def_property_range(prop, 0.0f, 100000.0f); RNA_def_property_ui_range(prop, 0.0f, 40.0f, 10, 2); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); From 7c864388fc0de1e92b8ad9394966d38ffea17daf Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 8 Feb 2021 12:26:50 +0100 Subject: [PATCH 166/519] Fix T71960: Malformed .bmp files lead to crash Add a boundary check, avoiding access past actual data. Ideally would need to report error to the user somehow, but it doesn't seem to be easy to do. This is a minimal safe patch. The proper complete fix is being worked on by Jesse. Differential Revision: https://developer.blender.org/D10357 --- source/blender/imbuf/intern/bmp.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c index 58ce02f28ae..a5c558fc216 100644 --- a/source/blender/imbuf/intern/bmp.c +++ b/source/blender/imbuf/intern/bmp.c @@ -111,6 +111,14 @@ bool imb_is_a_bmp(const uchar *buf, size_t size) return checkbmp(buf, size); } +static size_t imb_bmp_calc_row_size_in_bytes(size_t x, size_t depth) +{ + if (depth <= 8) { + return (depth * x + 31) / 32 * 4; + } + return (depth >> 3) * x; +} + ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE]) { ImBuf *ibuf = NULL; @@ -130,7 +138,8 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ colorspace_set_default_role(colorspace, IM_MAX_SPACE, COLOR_ROLE_DEFAULT_BYTE); - bmp = mem + LITTLE_LONG(*(int *)(mem + 10)); + const size_t pixel_data_offset = LITTLE_LONG(*(int *)(mem + 10)); + bmp = mem + pixel_data_offset; if (CHECK_HEADER_FIELD_BMP(mem)) { /* skip fileheader */ @@ -150,6 +159,13 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ xppm = LITTLE_LONG(bmi.biXPelsPerMeter); yppm = LITTLE_LONG(bmi.biYPelsPerMeter); + const size_t row_size_in_bytes = imb_bmp_calc_row_size_in_bytes(x, depth); + const size_t num_expected_data_bytes = row_size_in_bytes * y; + const size_t num_actual_data_bytes = size - pixel_data_offset; + if (num_actual_data_bytes < num_expected_data_bytes) { + return NULL; + } + if (depth <= 8) { ibuf_depth = 24; } @@ -179,7 +195,6 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ rect = (uchar *)ibuf->rect; if (depth <= 8) { - const int rowsize = (depth * x + 31) / 32 * 4; const char(*palette)[4] = (void *)(mem + skip); const int startmask = ((1 << depth) - 1) << 8; for (size_t i = y; i > 0; i--) { @@ -212,7 +227,7 @@ ImBuf *imb_bmp_decode(const uchar *mem, size_t size, int flags, char colorspace[ } } /* Advance to the next row */ - bmp += (rowsize - nbytes); + bmp += (row_size_in_bytes - nbytes); } } else if (depth == 16) { From 32060ca1f137d2d92fca9a73a75a877431ece0a0 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 10:31:41 +0100 Subject: [PATCH 167/519] Cleanup: unused variable --- .../blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index dc924ede3a1..8a098c366a0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -154,6 +154,7 @@ static void randomize_attribute_bool(MutableSpan span, const GeometryNodeAttributeRandomizeMode operation) { BLI_assert(operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); + UNUSED_VARS_NDEBUG(operation); for (const int i : span.index_range()) { const bool random_value = get_random_value(ids[i], seed); span[i] = random_value; From ef02e1be5dd38c59e7be5ed740ad936f60003188 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 10:36:35 +0100 Subject: [PATCH 168/519] Fix: incorrect versioning for Attribute Randomize node --- source/blender/blenloader/intern/versioning_290.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 4980d748d0f..b8ca2f17fd2 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1711,7 +1711,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) continue; } LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - if (node->type == GEO_NODE_POINT_INSTANCE && node->storage == NULL) { + if (node->type == GEO_NODE_ATTRIBUTE_RANDOMIZE && node->storage == NULL) { NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN( sizeof(NodeAttributeRandomize), __func__); data->data_type = node->custom1; From 853c4e74ee27cfc5d876b8d8bd5cdcc283556406 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 15 Feb 2021 11:07:11 +0100 Subject: [PATCH 169/519] Cleanup: Grammar in comments --- source/blender/blenkernel/intern/cryptomatte.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index ef7f5963bee..477c7c34d06 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -182,7 +182,7 @@ uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *o * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. * * The conversion uses as many 32 bit floating point values as possible to minimize hash - * collisions. Unfortunately not all 32 bits can be as NaN and Inf can be problematic. + * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. * * Note that this conversion assumes to be running on a L-endian system. */ float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash) From 0ed0b1164a9b149924baba78ec31404f5da24287 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 15 Feb 2021 11:09:17 +0100 Subject: [PATCH 170/519] Cleanup: Use enum class for CryptomatteLayerState. --- source/blender/blenkernel/intern/cryptomatte.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index 477c7c34d06..db83547fe36 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -47,7 +47,7 @@ #include #include -enum CryptomatteLayerState { +enum class CryptomatteLayerState { EMPTY, FILLED, CLOSED, From d6b2c184816419385b591dfba4d1303cb445d91e Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 12:06:21 +0100 Subject: [PATCH 171/519] Attributes: return refined Attribute from attributes.new method Previously `mesh.attributes.new(...)` would return a generic attribute that one could not do much with. Now it returns refined attributes like `FloatAttribute`. --- .../blender/makesrna/intern/rna_attribute.c | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c index 21b26b51e0a..28c65992236 100644 --- a/source/blender/makesrna/intern/rna_attribute.c +++ b/source/blender/makesrna/intern/rna_attribute.c @@ -79,6 +79,34 @@ static char *rna_Attribute_path(PointerRNA *ptr) return BLI_sprintfN("attributes['%s']", layer->name); } +static StructRNA *srna_by_custom_data_layer_type(const CustomDataType type) +{ + switch (type) { + case CD_PROP_FLOAT: + return &RNA_FloatAttribute; + case CD_PROP_INT32: + return &RNA_IntAttribute; + case CD_PROP_FLOAT3: + return &RNA_FloatVectorAttribute; + case CD_PROP_COLOR: + return &RNA_FloatColorAttribute; + case CD_MLOOPCOL: + return &RNA_ByteColorAttribute; + case CD_PROP_STRING: + return &RNA_StringAttribute; + case CD_PROP_BOOL: + return &RNA_BoolAttribute; + default: + return NULL; + } +} + +static StructRNA *rna_Attribute_refine(PointerRNA *ptr) +{ + CustomDataLayer *layer = ptr->data; + return srna_by_custom_data_layer_type(layer->type); +} + static void rna_Attribute_name_set(PointerRNA *ptr, const char *value) { BKE_id_attribute_rename(ptr->owner_id, ptr->data, value, NULL); @@ -280,35 +308,11 @@ void rna_AttributeGroup_iterator_next(CollectionPropertyIterator *iter) PointerRNA rna_AttributeGroup_iterator_get(CollectionPropertyIterator *iter) { /* refine to the proper type */ - StructRNA *type; CustomDataLayer *layer = rna_iterator_array_get(iter); - - switch (layer->type) { - case CD_PROP_FLOAT: - type = &RNA_FloatAttribute; - break; - case CD_PROP_INT32: - type = &RNA_IntAttribute; - break; - case CD_PROP_FLOAT3: - type = &RNA_FloatVectorAttribute; - break; - case CD_PROP_COLOR: - type = &RNA_FloatColorAttribute; - break; - case CD_MLOOPCOL: - type = &RNA_ByteColorAttribute; - break; - case CD_PROP_STRING: - type = &RNA_StringAttribute; - break; - case CD_PROP_BOOL: - type = &RNA_BoolAttribute; - break; - default: - return PointerRNA_NULL; + StructRNA *type = srna_by_custom_data_layer_type(layer->type); + if (type == NULL) { + return PointerRNA_NULL; } - return rna_pointer_inherit_refine(&iter->parent, type, layer); } @@ -598,6 +602,7 @@ static void rna_def_attribute(BlenderRNA *brna) RNA_def_struct_sdna(srna, "CustomDataLayer"); RNA_def_struct_ui_text(srna, "Attribute", "Geometry attribute"); RNA_def_struct_path_func(srna, "rna_Attribute_path"); + RNA_def_struct_refine_func(srna, "rna_Attribute_refine"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Attribute_name_set"); From 3ba20aa866e5bebc7050cd8956daa5bd44b60467 Mon Sep 17 00:00:00 2001 From: Ray molenkamp Date: Tue, 9 Feb 2021 13:43:43 +0000 Subject: [PATCH 172/519] CMake/Deps: Boost 1.73 Just a simple version bump. Maniphest Tasks: T85365 Differential Revision: https://developer.blender.org/D10314 --- build_files/build_environment/cmake/boost.cmake | 2 +- build_files/build_environment/cmake/versions.cmake | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build_files/build_environment/cmake/boost.cmake b/build_files/build_environment/cmake/boost.cmake index d01c62b679c..3a90add9539 100644 --- a/build_files/build_environment/cmake/boost.cmake +++ b/build_files/build_environment/cmake/boost.cmake @@ -23,7 +23,7 @@ if(WIN32) set(BOOST_COMPILER_STRING -vc141) set(BOOST_CONFIGURE_COMMAND bootstrap.bat) - set(BOOST_BUILD_COMMAND bjam) + set(BOOST_BUILD_COMMAND b2) set(BOOST_BUILD_OPTIONS runtime-link=shared ) set(BOOST_HARVEST_CMD ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/boost/lib/ ${HARVEST_TARGET}/boost/lib/ ) if(BUILD_MODE STREQUAL Release) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index f61f02b8669..6d8c13fb88d 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -32,11 +32,11 @@ set(JPEG_VERSION 2.0.4) set(JPEG_URI https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${JPEG_VERSION}.tar.gz) set(JPEG_HASH 44c43e4a9fb352f47090804529317c88) -set(BOOST_VERSION 1.70.0) -set(BOOST_VERSION_NODOTS 1_70_0) -set(BOOST_VERSION_NODOTS_SHORT 1_70) +set(BOOST_VERSION 1.73.0) +set(BOOST_VERSION_NODOTS 1_73_0) +set(BOOST_VERSION_NODOTS_SHORT 1_73) set(BOOST_URI https://dl.bintray.com/boostorg/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_NODOTS}.tar.gz) -set(BOOST_HASH fea771fe8176828fabf9c09242ee8c26) +set(BOOST_HASH 4036cd27ef7548b8d29c30ea10956196) # Using old version as recommended by OpenVDB build documentation. set(BLOSC_VERSION 1.5.0) From 227fa68696a25adbd010b7c759e30191fa36d0c9 Mon Sep 17 00:00:00 2001 From: Ray molenkamp Date: Tue, 9 Feb 2021 14:14:00 +0000 Subject: [PATCH 173/519] CMake/Deps: TBB 2020U2 Straight forward version bump. 2020U2 is significantly louder in the deprecated header usage warning department, we should probably see if we need to act on this: P1949 Differential Revision: https://developer.blender.org/D10359 --- build_files/build_environment/cmake/tbb.cmake | 3 ++- build_files/build_environment/cmake/versions.cmake | 4 ++-- .../build_environment/patches/cmakelists_tbb.txt | 1 + build_files/build_environment/patches/tbb.diff | 13 +++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 build_files/build_environment/patches/tbb.diff diff --git a/build_files/build_environment/cmake/tbb.cmake b/build_files/build_environment/cmake/tbb.cmake index 82cd9291ddf..99614f18d83 100644 --- a/build_files/build_environment/cmake/tbb.cmake +++ b/build_files/build_environment/cmake/tbb.cmake @@ -42,7 +42,8 @@ ExternalProject_Add(external_tbb URL_HASH MD5=${TBB_HASH} PREFIX ${BUILD_DIR}/tbb PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_tbb.txt ${BUILD_DIR}/tbb/src/external_tbb/CMakeLists.txt && - ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/tbb/src/external_tbb/build/vs2013/version_string.ver ${BUILD_DIR}/tbb/src/external_tbb/src/tbb/version_string.ver + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/tbb/src/external_tbb/build/vs2013/version_string.ver ${BUILD_DIR}/tbb/src/external_tbb/src/tbb/version_string.ver && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/tbb/src/external_tbb < ${PATCH_DIR}/tbb.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tbb ${DEFAULT_CMAKE_FLAGS} ${TBB_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/tbb ) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 6d8c13fb88d..b335f4accc7 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -144,9 +144,9 @@ set(PYTHON_SHORT_VERSION_NO_DOTS 39) set(PYTHON_URI https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz) set(PYTHON_HASH 61981498e75ac8f00adcb908281fadb6) -set(TBB_VERSION 2019_U9) +set(TBB_VERSION 2020_U2) set(TBB_URI https://github.com/oneapi-src/oneTBB/archive/${TBB_VERSION}.tar.gz) -set(TBB_HASH 26263622e9187212ec240dcf01b66207) +set(TBB_HASH 1b711ae956524855088df3bbf5ec65dc) set(OPENVDB_VERSION 7.0.0) set(OPENVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/v${OPENVDB_VERSION}.tar.gz) diff --git a/build_files/build_environment/patches/cmakelists_tbb.txt b/build_files/build_environment/patches/cmakelists_tbb.txt index 7edf3aa2785..4032e5d6f83 100644 --- a/build_files/build_environment/patches/cmakelists_tbb.txt +++ b/build_files/build_environment/patches/cmakelists_tbb.txt @@ -20,6 +20,7 @@ if(APPLE) endif() file(GLOB tbb_src "${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/old/*.cpp") +list(REMOVE_ITEM tbb_src ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/tbb_bind.cpp) list(APPEND tbb_src ${CMAKE_CURRENT_SOURCE_DIR}/src/rml/client/rml_tbb.cpp) file(GLOB to_remove "${CMAKE_CURRENT_SOURCE_DIR}/src/old/test*.cpp") list(REMOVE_ITEM tbb_src ${to_remove}) diff --git a/build_files/build_environment/patches/tbb.diff b/build_files/build_environment/patches/tbb.diff new file mode 100644 index 00000000000..c05c35bca95 --- /dev/null +++ b/build_files/build_environment/patches/tbb.diff @@ -0,0 +1,13 @@ +diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h +index 7a8d06a0..886699d8 100644 +--- a/include/tbb/tbb_config.h ++++ b/include/tbb/tbb_config.h +@@ -620,7 +620,7 @@ There are four cases that are supported: + // instantiation site, which is too late for suppression of the corresponding messages for internal + // stuff. + #if !defined(__INTEL_COMPILER) && (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) +- #if (__cplusplus >= 201402L) ++ #if (__cplusplus >= 201402L && (!defined(_MSC_VER) || _MSC_VER >= 1920)) + #define __TBB_DEPRECATED [[deprecated]] + #define __TBB_DEPRECATED_MSG(msg) [[deprecated(msg)]] + #elif _MSC_VER \ No newline at end of file From 649f99b6bc9906b7b752f4b981f67bfbf3ea3e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 9 Feb 2021 14:06:44 +0000 Subject: [PATCH 174/519] CMake/Deps: Alembic 1.7.16 Version bump + no longer using Boost. Building Alembic with Boost gave compiler errors, and having one less inter-dependency is good as well. Reviewed By: sebbas, sybren Differential Revision: https://developer.blender.org/D10329 --- build_files/build_environment/cmake/alembic.cmake | 11 ----------- build_files/build_environment/cmake/versions.cmake | 4 ++-- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/build_files/build_environment/cmake/alembic.cmake b/build_files/build_environment/cmake/alembic.cmake index 94b7b56d58f..d865382eff3 100644 --- a/build_files/build_environment/cmake/alembic.cmake +++ b/build_files/build_environment/cmake/alembic.cmake @@ -19,16 +19,6 @@ set(ALEMBIC_EXTRA_ARGS -DBUILDSTATIC=ON -DLINKSTATIC=ON - -DALEMBIC_LIB_USES_BOOST=ON - -DBoost_COMPILER:STRING=${BOOST_COMPILER_STRING} - -DBoost_USE_MULTITHREADED=ON - -DUSE_STATIC_BOOST=On - -DBoost_USE_STATIC_LIBS=ON - -DBoost_USE_STATIC_RUNTIME=OFF - -DBoost_DEBUG=ON - -DBOOST_ROOT=${LIBDIR}/boost - -DBoost_NO_SYSTEM_PATHS=ON - -DBoost_NO_BOOST_CMAKE=ON -DILMBASE_ROOT=${LIBDIR}/openexr -DALEMBIC_ILMBASE_INCLUDE_DIRECTORY=${LIBDIR}/openexr/include/OpenEXR -DALEMBIC_ILMBASE_HALF_LIB=${LIBDIR}/openexr/lib/${LIBPREFIX}Half${OPENEXR_VERSION_POSTFIX}${LIBEXT} @@ -81,7 +71,6 @@ endif() add_dependencies( external_alembic - external_boost external_zlib external_openexr ) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index b335f4accc7..87c00e517db 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -78,9 +78,9 @@ set(FREEGLUT_VERSION 3.0.0) set(FREEGLUT_URI http://pilotfiber.dl.sourceforge.net/project/freeglut/freeglut/${FREEGLUT_VERSION}/freeglut-${FREEGLUT_VERSION}.tar.gz) set(FREEGLUT_HASH 90c3ca4dd9d51cf32276bc5344ec9754) -set(ALEMBIC_VERSION 1.7.12) +set(ALEMBIC_VERSION 1.7.16) set(ALEMBIC_URI https://github.com/alembic/alembic/archive/${ALEMBIC_VERSION}.tar.gz) -set(ALEMBIC_MD5 e2b3777f23c5c09481a008cc6f0f8a40) +set(ALEMBIC_MD5 effcc86e42fe6605588e3de57bde6677) # hash is for 3.1.2 set(GLFW_GIT_UID 30306e54705c3adae9fe082c816a3be71963485c) From 0a3b076961443266ff9d24fd6bbe302f71a85c4b Mon Sep 17 00:00:00 2001 From: Ray molenkamp Date: Tue, 9 Feb 2021 14:13:07 +0000 Subject: [PATCH 175/519] CMake/Deps: OpenVDB 8.0.1 Straight forward version bump, some of the variables to detect a static OpenEXR changed and the folder structure seemingly changed a little requiring updates to the diff Reviewed By: sebbas, sybren Differential Revision: https://developer.blender.org/D10340 --- .../build_environment/cmake/openvdb.cmake | 2 + .../build_environment/cmake/versions.cmake | 4 +- .../build_environment/patches/openvdb.diff | 56 +++++++++---------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake index 2962f085e1b..704a8269c22 100644 --- a/build_files/build_environment/cmake/openvdb.cmake +++ b/build_files/build_environment/cmake/openvdb.cmake @@ -54,6 +54,8 @@ set(OPENVDB_EXTRA_ARGS -DOPENVDB_CORE_STATIC=${OPENVDB_STATIC} -DOPENVDB_BUILD_BINARIES=Off -DCMAKE_DEBUG_POSTFIX=_d + -DILMBASE_USE_STATIC_LIBS=On + -DOPENEXR_USE_STATIC_LIBS=On ) if(WIN32) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 87c00e517db..c04a815b09b 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -148,9 +148,9 @@ set(TBB_VERSION 2020_U2) set(TBB_URI https://github.com/oneapi-src/oneTBB/archive/${TBB_VERSION}.tar.gz) set(TBB_HASH 1b711ae956524855088df3bbf5ec65dc) -set(OPENVDB_VERSION 7.0.0) +set(OPENVDB_VERSION 8.0.1) set(OPENVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/v${OPENVDB_VERSION}.tar.gz) -set(OPENVDB_HASH fd6c4f168282f7e0e494d290cd531fa8) +set(OPENVDB_HASH 01b490be16cc0e15c690f9a153c21461) set(NANOVDB_GIT_UID e62f7a0bf1e27397223c61ddeaaf57edf111b77f) set(NANOVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/${NANOVDB_GIT_UID}.tar.gz) diff --git a/build_files/build_environment/patches/openvdb.diff b/build_files/build_environment/patches/openvdb.diff index db4506025ea..2f6f735946b 100644 --- a/build_files/build_environment/patches/openvdb.diff +++ b/build_files/build_environment/patches/openvdb.diff @@ -1,10 +1,10 @@ -diff -Naur orig/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake ---- orig/cmake/FindIlmBase.cmake 2019-12-06 12:11:33 -0700 -+++ openvdb/cmake/FindIlmBase.cmake 2020-08-12 12:48:44 -0600 -@@ -225,6 +225,12 @@ - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES - "-${IlmBase_VERSION_MAJOR}_${IlmBase_VERSION_MINOR}.lib" - ) +diff -Naur openvdb-8.0.0/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake +--- openvdb-8.0.0/cmake/FindIlmBase.cmake 2020-12-24 10:13:14 -0700 ++++ openvdb/cmake/FindIlmBase.cmake 2021-02-05 12:07:49 -0700 +@@ -217,6 +217,12 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib") + endif() + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}.lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES + "_s.lib" + ) @@ -13,14 +13,14 @@ diff -Naur orig/cmake/FindIlmBase.cmake openvdb/cmake/FindIlmBase.cmake + ) else() if(ILMBASE_USE_STATIC_LIBS) - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES -diff -Naur orig/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake ---- orig/cmake/FindOpenEXR.cmake 2019-12-06 12:11:33 -0700 -+++ openvdb/cmake/FindOpenEXR.cmake 2020-08-12 12:48:44 -0600 -@@ -218,6 +218,12 @@ - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES - "-${OpenEXR_VERSION_MAJOR}_${OpenEXR_VERSION_MINOR}.lib" - ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +diff -Naur openvdb-8.0.0/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake +--- openvdb-8.0.0/cmake/FindOpenEXR.cmake 2020-12-24 10:13:14 -0700 ++++ openvdb/cmake/FindOpenEXR.cmake 2021-02-05 12:23:39 -0700 +@@ -210,6 +210,12 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib") + endif() + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}.lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES + "_s.lib" + ) @@ -29,11 +29,11 @@ diff -Naur orig/cmake/FindOpenEXR.cmake openvdb/cmake/FindOpenEXR.cmake + ) else() if(OPENEXR_USE_STATIC_LIBS) - list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES -diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt ---- orig/openvdb/CMakeLists.txt 2019-12-06 12:11:33 -0700 -+++ openvdb/openvdb/CMakeLists.txt 2020-08-12 14:12:26 -0600 -@@ -105,7 +105,9 @@ + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +diff -Naur openvdb-8.0.0/openvdb/openvdb/CMakeLists.txt openvdb/openvdb/openvdb/CMakeLists.txt +--- openvdb-8.0.0/openvdb/openvdb/CMakeLists.txt 2020-12-24 10:13:14 -0700 ++++ openvdb/openvdb/openvdb/CMakeLists.txt 2021-02-05 11:18:33 -0700 +@@ -107,7 +107,9 @@ # http://boost.2283326.n4.nabble.com/CMake-config-scripts-broken-in-1-70-td4708957.html # https://github.com/boostorg/boost_install/commit/160c7cb2b2c720e74463865ef0454d4c4cd9ae7c set(BUILD_SHARED_LIBS ON) @@ -44,15 +44,15 @@ diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt endif() find_package(Boost ${MINIMUM_BOOST_VERSION} REQUIRED COMPONENTS iostreams system) -@@ -193,6 +195,7 @@ - if(OPENVDB_DISABLE_BOOST_IMPLICIT_LINKING) - add_definitions(-DBOOST_ALL_NO_LIB) +@@ -146,6 +148,7 @@ + Boost::disable_autolinking # add -DBOOST_ALL_NO_LIB + ) endif() + add_definitions(-D__TBB_NO_IMPLICIT_LINKAGE -DOPENVDB_OPENEXR_STATICLIB) endif() - # @todo Should be target definitions -@@ -383,7 +386,12 @@ + if(USE_EXR) +@@ -379,7 +382,12 @@ # imported targets. if(OPENVDB_CORE_SHARED) @@ -66,9 +66,9 @@ diff -Naur orig/openvdb/CMakeLists.txt openvdb/openvdb/CMakeLists.txt endif() if(OPENVDB_CORE_STATIC) -diff -Naur orig/openvdb/version.rc.in openvdb/openvdb/version.rc.in ---- orig/openvdb/version.rc.in 1969-12-31 17:00:00 -0700 -+++ openvdb/openvdb/version.rc.in 2020-08-12 14:15:01 -0600 +diff -Naur openvdb-8.0.0/openvdb/openvdb/version.rc.in openvdb/openvdb/openvdb/version.rc.in +--- openvdb-8.0.0/openvdb/openvdb/version.rc.in 1969-12-31 17:00:00 -0700 ++++ openvdb/openvdb/openvdb/version.rc.in 2021-02-05 11:18:33 -0700 @@ -0,0 +1,48 @@ +#include + From da0c5e7224e1ad48586d218a2b4a9480442ce3e9 Mon Sep 17 00:00:00 2001 From: Ray molenkamp Date: Tue, 9 Feb 2021 14:20:57 +0000 Subject: [PATCH 176/519] CMake/Deps: XR_OpenXR v1.0.14 Straight up version bump Things of note: They started using API calls only available in windows 8, however given the Python 3.9 update will forcibly bump us to 8.1+ anyhow this is not an issue. Will require some minor tweaks to platform_win32.cmake after adding the libs to svn which are not included in this diff so this diff can land without having to have the libs in place yet. Reviewed By: sebbas, sybren Differential Revision: https://developer.blender.org/D10349 --- build_files/build_environment/cmake/versions.cmake | 4 ++-- build_files/build_environment/cmake/xr_openxr.cmake | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index c04a815b09b..42f858a31c1 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -317,9 +317,9 @@ set(NASM_VERSION 2.15.02) set(NASM_URI https://github.com/netwide-assembler/nasm/archive/nasm-${NASM_VERSION}.tar.gz) set(NASM_HASH aded8b796c996a486a56e0515c83e414116decc3b184d88043480b32eb0a8589) -set(XR_OPENXR_SDK_VERSION 1.0.8) +set(XR_OPENXR_SDK_VERSION 1.0.14) set(XR_OPENXR_SDK_URI https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_SDK_VERSION}.tar.gz) -set(XR_OPENXR_SDK_HASH c6de63d2e0f9029aa58dfa97cad8ce07) +set(XR_OPENXR_SDK_HASH 0df6b2fd6045423451a77ff6bc3e1a75) set(ISPC_VERSION v1.14.1) set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/xr_openxr.cmake b/build_files/build_environment/cmake/xr_openxr.cmake index 16da266c3d2..0ab685f8da8 100644 --- a/build_files/build_environment/cmake/xr_openxr.cmake +++ b/build_files/build_environment/cmake/xr_openxr.cmake @@ -53,7 +53,7 @@ if(WIN32) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_xr_openxr_sdk after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/xr_openxr_sdk/lib/openxr_loader.lib ${HARVEST_TARGET}/xr_openxr_sdk/lib/openxr_loader_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/xr_openxr_sdk/lib/openxr_loaderd.lib ${HARVEST_TARGET}/xr_openxr_sdk/lib/openxr_loaderd.lib DEPENDEES install ) endif() From ebdf68a0bb37f4f3765521fcc78646c250cd9269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 12 Feb 2021 13:34:22 +0100 Subject: [PATCH 177/519] =?UTF-8?q?CMake/Deps:=20OpenImageDenoise=201.2.3?= =?UTF-8?q?=20=E2=86=92=201.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_files/build_environment/cmake/versions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 42f858a31c1..8eff4c3180d 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -301,9 +301,9 @@ set(USD_VERSION 20.05) set(USD_URI https://github.com/PixarAnimationStudios/USD/archive/v${USD_VERSION}.tar.gz) set(USD_HASH 6d679e739e7f65725d9c029e37dda9fc) -set(OIDN_VERSION 1.2.3) +set(OIDN_VERSION 1.3.0) set(OIDN_URI https://github.com/OpenImageDenoise/oidn/releases/download/v${OIDN_VERSION}/oidn-${OIDN_VERSION}.src.tar.gz) -set(OIDN_HASH 1f11466c2c3efc27faba5ec7078d12b2) +set(OIDN_HASH 301a5a0958d375a942014df0679b9270) set(LIBGLU_VERSION 9.0.1) set(LIBGLU_URI ftp://ftp.freedesktop.org/pub/mesa/glu/glu-${LIBGLU_VERSION}.tar.xz) From a923a34de19cc83a9a687995de7203e64a4a5b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 9 Feb 2021 10:38:41 +0100 Subject: [PATCH 178/519] =?UTF-8?q?CMake/Deps:=20upgrade=20USD=2020.05=20?= =?UTF-8?q?=E2=86=92=2021.02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit USD version 21.02 includes two of the changes Blender used to patch in, which have now been removed from `usd.diff`. Unfortunately 21.02 introduces another issue where LZ4 symbols are accidentally exported, causing linker errors. Fortunately these symbols are only used for resting, so I added a patch hunk that simply removes their `extern "C"` declaration. The LZ4 linker issue has been reported upstream at https://github.com/PixarAnimationStudios/USD/issues/1447. Reviewed By: sebbas, mont29 Differential Revision: https://developer.blender.org/D10367 --- .../build_environment/cmake/versions.cmake | 4 +- .../build_environment/patches/usd.diff | 58 +++++++++---------- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 8eff4c3180d..4a879c793a1 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -297,9 +297,9 @@ set(EMBREE_VERSION 3.10.0) set(EMBREE_URI https://github.com/embree/embree/archive/v${EMBREE_VERSION}.zip) set(EMBREE_HASH 4bbe29e7eaa46417efc75fc5f1e8eb87) -set(USD_VERSION 20.05) +set(USD_VERSION 21.02) set(USD_URI https://github.com/PixarAnimationStudios/USD/archive/v${USD_VERSION}.tar.gz) -set(USD_HASH 6d679e739e7f65725d9c029e37dda9fc) +set(USD_HASH 1dd1e2092d085ed393c1f7c450a4155a) set(OIDN_VERSION 1.3.0) set(OIDN_URI https://github.com/OpenImageDenoise/oidn/releases/download/v${OIDN_VERSION}/oidn-${OIDN_VERSION}.src.tar.gz) diff --git a/build_files/build_environment/patches/usd.diff b/build_files/build_environment/patches/usd.diff index 27b4955f849..42527a4f443 100644 --- a/build_files/build_environment/patches/usd.diff +++ b/build_files/build_environment/patches/usd.diff @@ -26,36 +26,30 @@ diff -Naur external_usd_base/cmake/macros/Public.cmake external_usd/cmake/macros endforeach() foreach(lib ${PXR_OBJECT_LIBS}) set(objects "${objects};\$") - -diff --git a/pxr/base/arch/align.h b/pxr/base/arch/align.h -index f3cabf4..ebc8a69 100644 ---- a/pxr/base/arch/align.h -+++ b/pxr/base/arch/align.h -@@ -77,7 +77,11 @@ ArchAlignMemory(void *base) - /// The size of a CPU cache line on the current processor architecture in bytes. - /// - /// \hideinitializer -+#if defined(ARCH_OS_DARWIN) && defined(ARCH_CPU_ARM) -+#define ARCH_CACHE_LINE_SIZE 128 -+#else - #define ARCH_CACHE_LINE_SIZE 64 -+#endif +diff -ru USD-20.11/pxr/base/tf/pxrLZ4/lz4.cpp external_usd/pxr/base/tf/pxrLZ4/lz4.cpp +--- USD-20.11/pxr/base/tf/pxrLZ4/lz4.cpp 2020-10-14 19:25:19.000000000 +0100 ++++ external_usd/pxr/base/tf/pxrLZ4/lz4.cpp 2021-02-09 09:28:51.496190085 +0000 +@@ -614,6 +614,15 @@ + /*-************************************ + * Internal Definitions used in Tests + **************************************/ ++ ++/******************************************************************* ++ * Disabled in Blender. The BLOSC library also exposes these ++ * functions, and this causes 'duplicate symbol' linker errors. ++ * ++ * This problem has been reported upstream at ++ * https://github.com/PixarAnimationStudios/USD/issues/1447 ++ * ++ ******************************************************************* + #if defined (__cplusplus) + extern "C" { + #endif +@@ -627,6 +636,7 @@ + #if defined (__cplusplus) + } + #endif ++********************************************************************/ - ///@} - -diff --git a/pxr/base/arch/math.h b/pxr/base/arch/math.h -index 3e66c37..64a052c 100644 ---- a/pxr/base/arch/math.h -+++ b/pxr/base/arch/math.h -@@ -42,7 +42,7 @@ PXR_NAMESPACE_OPEN_SCOPE - /// \addtogroup group_arch_Math - ///@{ - --#if defined (ARCH_CPU_INTEL) || defined(doxygen) -+#if defined (ARCH_CPU_INTEL) || defined(ARCH_CPU_ARM) || defined(doxygen) - - /// This is the smallest value e such that 1+e^2 == 1, using floats. - /// True for all IEEE754 chipsets. - - - + /*-****************************** + * Compression functions From 5b2bfb2fed03274bd0bc2007c66118ca33c9f1ca Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 19 Aug 2020 15:39:00 +0200 Subject: [PATCH 179/519] FFmpeg: Improve multi-threading settings Allow use all system threads for frame encoding/decoding. This is very straightforward: the value of zero basically disables threading. Change threading policy to slice when decoding frames. The reason for this is because decoding happens frame-by-frame, so inter-frame threading policy will not bring any speedup. The change for threading policy to slice is less obvious and is based on benchmark of the demo files from T78986. This gives best performance so far. Rendering the following file went down from 190sec down to 160sec. https://storage.googleapis.com/institute-storage/vse_simplified_example.zip This change makes both reading and writing faster. The animation render is just easiest to get actual time metrics. Differential Revision: https://developer.blender.org/D8627 --- source/blender/blenkernel/intern/writeffmpeg.c | 9 +++++---- source/blender/imbuf/intern/anim_movie.c | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index e6adad765c3..0991d804882 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -37,6 +37,7 @@ # endif # include "BLI_math_base.h" +# include "BLI_threads.h" # include "BLI_utildefines.h" # include "BKE_global.h" @@ -566,8 +567,8 @@ static AVStream *alloc_video_stream(FFMpegContext *context, /* Set up the codec context */ c = st->codec; - c->thread_count = 0; - c->thread_type = FF_THREAD_FRAME; + c->thread_count = BLI_system_thread_count(); + c->thread_type = FF_THREAD_SLICE; c->codec_id = codec_id; c->codec_type = AVMEDIA_TYPE_VIDEO; @@ -780,8 +781,8 @@ static AVStream *alloc_audio_stream(FFMpegContext *context, st->id = 1; c = st->codec; - c->thread_count = 0; - c->thread_type = FF_THREAD_FRAME; + c->thread_count = BLI_system_thread_count(); + c->thread_type = FF_THREAD_SLICE; c->codec_id = codec_id; c->codec_type = AVMEDIA_TYPE_AUDIO; diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 3a7570cd320..28bf26aa343 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -55,6 +55,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" @@ -573,6 +574,9 @@ static int startffmpeg(struct anim *anim) pCodecCtx->workaround_bugs = 1; + pCodecCtx->thread_count = BLI_system_thread_count(); + pCodecCtx->thread_type = FF_THREAD_SLICE; + if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { avformat_close_input(&pFormatCtx); return -1; From d8754de7c31bc2ec775a73001132862e007f4c9a Mon Sep 17 00:00:00 2001 From: Peter Fog Date: Mon, 15 Feb 2021 11:49:19 +0100 Subject: [PATCH 180/519] FFmpeg: Improve multi-threading settings for VSE proxies Following code from D8627 this patch corrects multi threaded processing of proxies, where a 60 sec proxy generation drops to 35 sec. Differential Revision: https://developer.blender.org/D8659 --- source/blender/imbuf/intern/indexer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index 20e1febedd7..f10e3b31141 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -40,6 +40,8 @@ #include "BKE_global.h" +# include "BLI_threads.h" + #ifdef WITH_AVI # include "AVI_avi.h" #endif @@ -495,6 +497,8 @@ static struct proxy_output_ctx *alloc_proxy_output_ffmpeg( rv->st->id = 0; rv->c = rv->st->codec; + rv->c->thread_count = BLI_system_thread_count(); + rv->c->thread_type = FF_THREAD_SLICE; rv->c->codec_type = AVMEDIA_TYPE_VIDEO; rv->c->codec_id = AV_CODEC_ID_MJPEG; rv->c->width = width; From b55e7e489504f43076eec423bc8dfb7efbeb4fac Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 15 Feb 2021 14:25:21 +0100 Subject: [PATCH 181/519] Cleanup: Spelling in function name --- source/blender/editors/space_clip/clip_ops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 38a05eef6e3..0c54a042a1a 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -1837,7 +1837,7 @@ void CLIP_OT_cursor_set(wmOperatorType *ot) /** \name Toggle Lock To Selection Operator * \{ */ -static int lock_selection_togglee_exec(bContext *C, wmOperator *UNUSED(op)) +static int lock_selection_toggle_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceClip *space_clip = CTX_wm_space_clip(C); @@ -1862,7 +1862,7 @@ void CLIP_OT_lock_selection_toggle(wmOperatorType *ot) /* api callbacks */ ot->poll = ED_space_clip_poll; - ot->exec = lock_selection_togglee_exec; + ot->exec = lock_selection_toggle_exec; /* flags */ ot->flag = OPTYPE_LOCK_BYPASS; From d3960164163c910d5031a8f076c41b39e0a5503d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 15:30:17 +0100 Subject: [PATCH 182/519] Cleanup: clang tidy --- source/blender/blenkernel/BKE_displist.h | 2 +- source/blender/blenkernel/intern/asset.cc | 2 +- source/blender/blenlib/intern/mesh_boolean.cc | 2 +- .../draw/engines/eevee/eevee_depth_of_field.c | 10 ++--- .../editors/interface/interface_utils.c | 38 +++++++++---------- .../blender/editors/space_clip/clip_utils.c | 13 +++---- source/blender/editors/util/ed_util_ops.cc | 2 +- .../io/alembic/exporter/abc_archive.cc | 4 +- .../node_geo_align_rotation_to_vector.cc | 2 +- .../nodes/node_geo_attribute_color_ramp.cc | 2 +- .../node_geo_attribute_sample_texture.cc | 2 +- .../nodes/node_geo_collection_info.cc | 2 +- .../geometry/nodes/node_geo_object_info.cc | 2 +- .../geometry/nodes/node_geo_point_instance.cc | 4 +- .../geometry/nodes/node_geo_point_rotate.cc | 4 +- 15 files changed, 42 insertions(+), 49 deletions(-) diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 86145fdfb41..83adbf6f1fd 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -116,7 +116,7 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i void BKE_displist_fill(const struct ListBase *dispbase, struct ListBase *to, const float normal_proj[3], - const bool flipnormal); + const bool flip_normal); float BKE_displist_calc_taper( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *taperobj, int cur, int tot); diff --git a/source/blender/blenkernel/intern/asset.cc b/source/blender/blenkernel/intern/asset.cc index 89c3523285d..b5a7f5e37a6 100644 --- a/source/blender/blenkernel/intern/asset.cc +++ b/source/blender/blenkernel/intern/asset.cc @@ -18,7 +18,7 @@ * \ingroup bke */ -#include +#include #include "DNA_ID.h" #include "DNA_asset_types.h" diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 6ca5be743f0..bfc1e4b01d3 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -2385,7 +2385,7 @@ static void inside_shape_callback(void *userdata, std::cout << " fv2=(" << fv2[0] << "," << fv2[1] << "," << fv2[2] << ")\n"; } if (isect_ray_tri_epsilon_v3( - ray->origin, ray->direction, fv0, fv1, fv2, &dist, NULL, FLT_EPSILON)) { + ray->origin, ray->direction, fv0, fv1, fv2, &dist, nullptr, FLT_EPSILON)) { /* Count parity as +1 if ray is in the same direction as tri's normal, * and -1 if the directions are opposite. */ double3 o_db{double(ray->origin[0]), double(ray->origin[1]), double(ray->origin[2])}; diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index 8c0a44b2c9b..bd6c6242f86 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -56,12 +56,10 @@ static float coc_radius_from_camera_depth(bool is_ortho, EEVEE_EffectsInfo *fx, if (multiplier == 0.0f || bias == 0.0f) { return 0.0f; } - else if (is_ortho) { + if (is_ortho) { return (camera_depth + multiplier / bias) * multiplier; } - else { - return multiplier / camera_depth - bias; - } + return multiplier / camera_depth - bias; } static float polygon_sides_length(float sides_count) @@ -164,11 +162,11 @@ bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *fx, return true; } -int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *fx, +int EEVEE_depth_of_field_sample_count_get(EEVEE_EffectsInfo *effects, int sample_count, int *r_ring_count) { - if (fx->dof_jitter_radius == 0.0f) { + if (effects->dof_jitter_radius == 0.0f) { if (r_ring_count != NULL) { *r_ring_count = 0; } diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index f9eba9eeb6f..af058264f25 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -546,19 +546,19 @@ int UI_icon_from_report_type(int type) if (type & RPT_ERROR_ALL) { return ICON_CANCEL; } - else if (type & RPT_WARNING_ALL) { + if (type & RPT_WARNING_ALL) { return ICON_ERROR; } - else if (type & RPT_INFO_ALL) { + if (type & RPT_INFO_ALL) { return ICON_INFO; } - else if (type & RPT_DEBUG_ALL) { + if (type & RPT_DEBUG_ALL) { return ICON_SYSTEM; } - else if (type & RPT_PROPERTY) { + if (type & RPT_PROPERTY) { return ICON_OPTIONS; } - else if (type & RPT_OPERATOR) { + if (type & RPT_OPERATOR) { return ICON_CHECKMARK; } return ICON_INFO; @@ -569,24 +569,22 @@ int UI_icon_colorid_from_report_type(int type) if (type & RPT_ERROR_ALL) { return TH_INFO_ERROR; } - else if (type & RPT_WARNING_ALL) { + if (type & RPT_WARNING_ALL) { return TH_INFO_WARNING; } - else if (type & RPT_INFO_ALL) { + if (type & RPT_INFO_ALL) { return TH_INFO_INFO; } - else if (type & RPT_DEBUG_ALL) { + if (type & RPT_DEBUG_ALL) { return TH_INFO_DEBUG; } - else if (type & RPT_PROPERTY) { + if (type & RPT_PROPERTY) { return TH_INFO_PROPERTY; } - else if (type & RPT_OPERATOR) { + if (type & RPT_OPERATOR) { return TH_INFO_OPERATOR; } - else { - return TH_INFO_WARNING; - } + return TH_INFO_WARNING; } int UI_text_colorid_from_report_type(int type) @@ -594,24 +592,22 @@ int UI_text_colorid_from_report_type(int type) if (type & RPT_ERROR_ALL) { return TH_INFO_ERROR_TEXT; } - else if (type & RPT_WARNING_ALL) { + if (type & RPT_WARNING_ALL) { return TH_INFO_WARNING_TEXT; } - else if (type & RPT_INFO_ALL) { + if (type & RPT_INFO_ALL) { return TH_INFO_INFO_TEXT; } - else if (type & RPT_DEBUG_ALL) { + if (type & RPT_DEBUG_ALL) { return TH_INFO_DEBUG_TEXT; } - else if (type & RPT_PROPERTY) { + if (type & RPT_PROPERTY) { return TH_INFO_PROPERTY_TEXT; } - else if (type & RPT_OPERATOR) { + if (type & RPT_OPERATOR) { return TH_INFO_OPERATOR_TEXT; } - else { - return TH_INFO_WARNING_TEXT; - } + return TH_INFO_WARNING_TEXT; } /********************************** Misc **************************************/ diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index bb79eb34129..dbf733413e5 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -509,13 +509,12 @@ static bool mask_has_selection(const bContext *C) if (BKE_mask_point_handles_mode_get(point) == MASK_HANDLE_MODE_STICK) { return true; } - else { - if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { - return true; - } - if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { - return true; - } + + if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) { + return true; + } + if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) { + return true; } } } diff --git a/source/blender/editors/util/ed_util_ops.cc b/source/blender/editors/util/ed_util_ops.cc index cb7ff9f3a63..5b2e1a16bc2 100644 --- a/source/blender/editors/util/ed_util_ops.cc +++ b/source/blender/editors/util/ed_util_ops.cc @@ -20,7 +20,7 @@ * Utility operators for UI data or for the UI to use. */ -#include +#include #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" diff --git a/source/blender/io/alembic/exporter/abc_archive.cc b/source/blender/io/alembic/exporter/abc_archive.cc index 90a4baf97bc..6c6ad985c9b 100644 --- a/source/blender/io/alembic/exporter/abc_archive.cc +++ b/source/blender/io/alembic/exporter/abc_archive.cc @@ -141,13 +141,13 @@ static TimeSamplingPtr create_time_sampling(double scene_fps, std::vector samples; if (params.frame_start == params.frame_end) { - return TimeSamplingPtr(new TimeSampling()); + return std::make_shared(); } get_shutter_samples(scene_fps, params, nr_of_samples, true, samples); TimeSamplingType ts(static_cast(samples.size()), 1.0 / scene_fps); - return TimeSamplingPtr(new TimeSampling(ts, samples)); + return std::make_shared(ts, samples); } static void get_frames(double scene_fps, diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index 02a6ac49c29..a81adbbd754 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -39,7 +39,7 @@ static void geo_node_align_rotation_to_vector_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); uiItemR(layout, ptr, "pivot_axis", 0, IFACE_("Pivot"), ICON_NONE); uiLayout *col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc index 0309fb83bd7..98bf612f589 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc @@ -37,7 +37,7 @@ static void geo_node_attribute_color_ramp_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiTemplateColorRamp(layout, ptr, "color_ramp", 0); + uiTemplateColorRamp(layout, ptr, "color_ramp", false); } namespace blender::nodes { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc index dd8f0adb740..d0b2595b5b9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc @@ -43,7 +43,7 @@ static void geo_node_attribute_sample_texture_layout(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); + uiTemplateID(layout, C, ptr, "texture", "texture.new", nullptr, nullptr, 0, ICON_NONE, nullptr); } namespace blender::nodes { diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc index 8391c4e2bc0..d8e95faec27 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -35,7 +35,7 @@ static bNodeSocketTemplate geo_node_collection_info_out[] = { static void geo_node_collection_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "transform_space", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "transform_space", 0, nullptr, ICON_NONE); } namespace blender::nodes { diff --git a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc index 7249a34134f..54ecb20dae7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc @@ -41,7 +41,7 @@ static bNodeSocketTemplate geo_node_object_info_out[] = { static void geo_node_object_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); } namespace blender::nodes { diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index 5cb98901d8d..11921acdb68 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -44,9 +44,9 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = { static void geo_node_point_instance_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "instance_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "instance_type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); if (RNA_enum_get(ptr, "instance_type") == GEO_NODE_POINT_INSTANCE_TYPE_COLLECTION) { - uiItemR(layout, ptr, "use_whole_collection", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "use_whole_collection", 0, nullptr, ICON_NONE); } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc index 013dbf5045f..fc2a5edc675 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc @@ -41,8 +41,8 @@ static void geo_node_point_rotate_layout(uiLayout *layout, bContext *UNUSED(C), { NodeGeometryRotatePoints *storage = (NodeGeometryRotatePoints *)((bNode *)ptr->data)->storage; - uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, NULL, ICON_NONE); - uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); uiLayout *col = uiLayoutColumn(layout, false); if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { From 0df76ecbf3468ba2f23f671009cbdea9fe83c928 Mon Sep 17 00:00:00 2001 From: Falk David Date: Mon, 15 Feb 2021 15:44:52 +0100 Subject: [PATCH 183/519] Cleanup: Remove code duplication (merge error) --- source/blender/draw/engines/gpencil/gpencil_engine.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index e738b0d063c..e35b8bc2bbe 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -629,14 +629,6 @@ void GPENCIL_cache_populate(void *ved, Object *ob) } } - /* When render in background the active frame could not be properly set due thread priority - * better set again. This is not required in viewport. */ - if (txl->render_depth_tx) { - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); - } - } - BKE_gpencil_visible_stroke_iter(is_final_render ? pd->view_layer : NULL, ob, gpencil_layer_cache_populate, From e2ab535e6f9289299727a067a162f9e546d0cc3f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 15 Feb 2021 14:09:06 +0100 Subject: [PATCH 184/519] install_deps: Bump OpenEXR to 2.5.5 version. --- build_files/build_environment/install_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 318da4f6183..8ae08fa0c9c 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -462,9 +462,9 @@ OCIO_FORCE_BUILD=false OCIO_FORCE_REBUILD=false OCIO_SKIP=false -OPENEXR_VERSION="2.4.0" -OPENEXR_VERSION_SHORT="2.4" -OPENEXR_VERSION_MIN="2.3" +OPENEXR_VERSION="2.5.5" +OPENEXR_VERSION_SHORT="2.5" +OPENEXR_VERSION_MIN="2.4" OPENEXR_VERSION_MAX="3.0" OPENEXR_FORCE_BUILD=false OPENEXR_FORCE_REBUILD=false From cab8a76abf73e61034eed685dd0c77178025f401 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 19:03:27 +0100 Subject: [PATCH 185/519] Fix: wrong clang tidy cleanup This reverts a part of rBd3960164163c910d5031a8f076c41b39e0a5503d. It is not a `std::shared_ptr` but a `boost::shared_ptr`. This could probably be fixed differently, but `NOLINT` is fine now. --- source/blender/io/alembic/exporter/abc_archive.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/io/alembic/exporter/abc_archive.cc b/source/blender/io/alembic/exporter/abc_archive.cc index 6c6ad985c9b..e066704cd24 100644 --- a/source/blender/io/alembic/exporter/abc_archive.cc +++ b/source/blender/io/alembic/exporter/abc_archive.cc @@ -141,13 +141,13 @@ static TimeSamplingPtr create_time_sampling(double scene_fps, std::vector samples; if (params.frame_start == params.frame_end) { - return std::make_shared(); + return TimeSamplingPtr(new TimeSampling()); // NOLINT: modernize-make-shared } get_shutter_samples(scene_fps, params, nr_of_samples, true, samples); TimeSamplingType ts(static_cast(samples.size()), 1.0 / scene_fps); - return std::make_shared(ts, samples); + return TimeSamplingPtr(new TimeSampling(ts, samples)); // NOLINT: modernize-make-shared } static void get_frames(double scene_fps, From 9cccbbebaa3f03aa5137bd54f991f2cd824a3977 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 15 Feb 2021 19:29:09 +0100 Subject: [PATCH 186/519] Fix T84624: node group data-block has phantom user This is because the node editor added a "real user" to the node group that it displays. It was mainly added as a hack to solve issues with custom tree types (T36024). Since we can store id references in custom properties now, this "real user" is not really necessary anymore. Given that we are close to a release, I'll only disable line for geometry nodes, for which the bug has been reported. Discussed this solution with Hans Goudey. --- source/blender/editors/space_node/space_node.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index ad7632377a3..5960360dc33 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -80,7 +80,12 @@ void ED_node_tree_start(SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from) BLI_addtail(&snode->treepath, path); - id_us_ensure_real(&ntree->id); + if (ntree->type != NTREE_GEOMETRY) { + /* This can probably be removed for all node tree types. It mainly exists because it was not + * possible to store id references in custom properties. Also see T36024. I don't want to + * remove it for all tree types in bcon3 though. */ + id_us_ensure_real(&ntree->id); + } } /* update current tree */ From 604e61d81d6326e665de6ec81dca2619e2cd5dbc Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 15 Feb 2021 19:35:24 +0100 Subject: [PATCH 187/519] UI/Nodes: Adding node groups via drag & drop (e.g. from Asset Browser) Adds `NODE_OT_add_group` operator to add a node group from a given name, and uses that to register a node editor drop-box. When dropping a node-group asset, the ID will be appended. This is what we do for other ID assets too. Should the node group insertion fail (e.g. the group is not compatible with the current tree, as checked by the poll), the appended data-block is removed. Differential Revision: https://developer.blender.org/D10405 Reviewed by: Jacques Lucke --- source/blender/editors/space_node/node_add.c | 105 ++++++++++++++++++ .../blender/editors/space_node/node_group.c | 10 +- .../blender/editors/space_node/node_intern.h | 2 + source/blender/editors/space_node/node_ops.c | 1 + .../blender/editors/space_node/space_node.c | 20 ++++ 5 files changed, 133 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c index e665f7b1d52..74fa5cdeb9d 100644 --- a/source/blender/editors/space_node/node_add.c +++ b/source/blender/editors/space_node/node_add.c @@ -309,6 +309,111 @@ void NODE_OT_add_reroute(wmOperatorType *ot) RNA_def_int(ot->srna, "cursor", WM_CURSOR_CROSS, 0, INT_MAX, "Cursor", "", 0, INT_MAX); } +/* ****************** Add Node Group Operator ******************* */ + +static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain, + wmOperator *op, + bNodeTree *ntree) +{ + char name[MAX_ID_NAME - 2]; + RNA_string_get(op->ptr, "name", name); + + bNodeTree *node_group = (bNodeTree *)BKE_libblock_find_name(bmain, ID_NT, name); + if (!node_group) { + return NULL; + } + if ((node_group->type != ntree->type) || !nodeGroupPoll(ntree, node_group)) { + if (RNA_boolean_get(op->ptr, "free_id_on_error")) { + BKE_id_delete(bmain, node_group); + } + return NULL; + } + + return node_group; +} + +static int node_add_group_exec(bContext *C, wmOperator *op) +{ + Main *bmain = CTX_data_main(C); + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNodeTree *node_group; + + if (!(node_group = node_add_group_get_and_poll_group_node_tree(bmain, op, ntree))) { + return OPERATOR_CANCELLED; + } + + ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); + + bNode *group_node = node_add_node(C, + node_group_idname(C), + (node_group->type == NTREE_CUSTOM) ? NODE_CUSTOM_GROUP : + NODE_GROUP, + snode->runtime->cursor[0], + snode->runtime->cursor[1]); + if (!group_node) { + BKE_report(op->reports, RPT_WARNING, "Could not add node group"); + return OPERATOR_CANCELLED; + } + + group_node->id = &node_group->id; + id_us_plus(group_node->id); + + nodeSetActive(ntree, group_node); + ntreeUpdateTree(bmain, node_group); + ntreeUpdateTree(bmain, ntree); + + snode_notify(C, snode); + snode_dag_update(C, snode); + + return OPERATOR_FINISHED; +} + +static int node_add_group_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + ARegion *region = CTX_wm_region(C); + SpaceNode *snode = CTX_wm_space_node(C); + + /* Convert mouse coordinates to v2d space. */ + UI_view2d_region_to_view(®ion->v2d, + event->mval[0], + event->mval[1], + &snode->runtime->cursor[0], + &snode->runtime->cursor[1]); + + snode->runtime->cursor[0] /= UI_DPI_FAC; + snode->runtime->cursor[1] /= UI_DPI_FAC; + + return node_add_group_exec(C, op); +} + +void NODE_OT_add_group(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name = "Add Node Group"; + ot->description = "Add an existing node group to the current node editor"; + ot->idname = "NODE_OT_add_group"; + + /* callbacks */ + ot->exec = node_add_group_exec; + ot->invoke = node_add_group_invoke; + ot->poll = ED_operator_node_editable; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; + + RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); + prop = RNA_def_boolean( + ot->srna, + "free_id_on_error", + false, + "Free Group on Error", + "Free the named node group data-block if it could not be added to the tree"); + RNA_def_property_flag(prop, PROP_HIDDEN); +} + /* ****************** Add File Node Operator ******************* */ static bool node_add_file_poll(bContext *C) diff --git a/source/blender/editors/space_node/node_group.c b/source/blender/editors/space_node/node_group.c index 7f530408ec7..b3ae336aadf 100644 --- a/source/blender/editors/space_node/node_group.c +++ b/source/blender/editors/space_node/node_group.c @@ -107,7 +107,7 @@ static const char *group_ntree_idname(bContext *C) return snode->tree_idname; } -static const char *group_node_idname(bContext *C) +const char *node_group_idname(bContext *C) { SpaceNode *snode = CTX_wm_space_node(C); @@ -147,7 +147,7 @@ static bNode *node_group_get_active(bContext *C, const char *node_idname) static int node_group_edit_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); const bool exit = RNA_boolean_get(op->ptr, "exit"); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); @@ -400,7 +400,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); SpaceNode *snode = CTX_wm_space_node(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); ED_preview_kill_jobs(CTX_wm_manager(C), bmain); @@ -1013,7 +1013,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op) SpaceNode *snode = CTX_wm_space_node(C); bNodeTree *ntree = snode->edittree; const char *ntree_idname = group_ntree_idname(C); - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); Main *bmain = CTX_data_main(C); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); @@ -1070,7 +1070,7 @@ static int node_group_insert_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); bNodeTree *ntree = snode->edittree; - const char *node_idname = group_node_idname(C); + const char *node_idname = node_group_idname(C); Main *bmain = CTX_data_main(C); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 2f3fa6996af..ee1193af8d0 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -194,11 +194,13 @@ void draw_nodespace_back_pix(const struct bContext *C, bNode *node_add_node( const struct bContext *C, const char *idname, int type, float locx, float locy); void NODE_OT_add_reroute(struct wmOperatorType *ot); +void NODE_OT_add_group(struct wmOperatorType *ot); void NODE_OT_add_file(struct wmOperatorType *ot); void NODE_OT_add_mask(struct wmOperatorType *ot); void NODE_OT_new_node_tree(struct wmOperatorType *ot); /* node_group.c */ +const char *node_group_idname(struct bContext *C); void NODE_OT_group_make(struct wmOperatorType *ot); void NODE_OT_group_insert(struct wmOperatorType *ot); void NODE_OT_group_ungroup(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index d55fd06ddea..7671547363b 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -88,6 +88,7 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_backimage_fit); WM_operatortype_append(NODE_OT_backimage_sample); + WM_operatortype_append(NODE_OT_add_group); WM_operatortype_append(NODE_OT_add_file); WM_operatortype_append(NODE_OT_add_mask); diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 74aff6a290b..6e6b0a584cf 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -659,6 +659,14 @@ static void node_main_region_draw(const bContext *C, ARegion *region) /* ************* dropboxes ************* */ +static bool node_group_drop_poll(bContext *UNUSED(C), + wmDrag *drag, + const wmEvent *UNUSED(event), + const char **UNUSED(r_tooltip)) +{ + return WM_drag_is_ID_type(drag, ID_NT); +} + static bool node_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), @@ -679,6 +687,17 @@ static bool node_mask_drop_poll(bContext *UNUSED(C), return WM_drag_is_ID_type(drag, ID_MSK); } +static void node_group_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0); + + RNA_string_set(drop->ptr, "name", id->name + 2); + if (drag->type == WM_DRAG_ASSET) { + /* ID just appended, so free it when dropping fails. */ + RNA_boolean_set(drop->ptr, "free_id_on_error", true); + } +} + static void node_id_drop_copy(wmDrag *drag, wmDropBox *drop) { ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0); @@ -705,6 +724,7 @@ static void node_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); + WM_dropbox_add(lb, "NODE_OT_add_group", node_group_drop_poll, node_group_drop_copy); WM_dropbox_add(lb, "NODE_OT_add_file", node_ima_drop_poll, node_id_path_drop_copy); WM_dropbox_add(lb, "NODE_OT_add_mask", node_mask_drop_poll, node_id_drop_copy); } From 3e55d7d60542bd00fe0a200da66d99582cc387e0 Mon Sep 17 00:00:00 2001 From: Falk David Date: Mon, 15 Feb 2021 20:08:42 +0100 Subject: [PATCH 188/519] Fix T85499: Crash on switching to edit mode with uv editor open A fix for T83187 (rBf83aa830) assumed in the overlay code of the uv editor that the object was a mesh when it did not have to be - causing a crash. The fix makes sure that the object is a mesh. Reviewed By: jbakker, campbellbarton Maniphest Tasks: T85499, T85495 Differential Revision: https://developer.blender.org/D10369 --- source/blender/draw/engines/overlay/overlay_edit_uv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c index 22433905b75..336b03ee284 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.c +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c @@ -401,7 +401,8 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) /* HACK: When editing objects that share the same mesh we should only draw the * first one in the order that is used during uv editing. We can only trust that the first object * has the correct batches with the correct selection state. See T83187. */ - if (pd->edit_uv.do_uv_overlay || pd->edit_uv.do_uv_shadow_overlay) { + if ((pd->edit_uv.do_uv_overlay || pd->edit_uv.do_uv_shadow_overlay) && + draw_ctx->obact->type == OB_MESH) { uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data( draw_ctx->view_layer, NULL, &objects_len, draw_ctx->object_mode); From 7baf796886b26e638c87c8c6533b7dc6e9b3803c Mon Sep 17 00:00:00 2001 From: Ankit Meel Date: Tue, 16 Feb 2021 00:47:50 +0530 Subject: [PATCH 189/519] macOS Deps: NumPy: Remove buggy Accelerate framework Building NumPy from source with default options of builder causes it to link against Accelerate framework which is buggy and raises a warning mentioned in [2]. "RankWarning: Polyfit may be poorly conditioned" Accelerate is deprecated with NumPy 1.20+.[1] So either we build OpenBLAS in dependencies also and set appropriate env variables suggested in [1] while building NumPy for it to find OpenBLAS. Or download NumPy wheel from pip and never allow pip to build NumPy from source while installing. After this change, pip wheels are used for NumPy for macOS with x86_64. [1] https://numpy.org/doc/stable/user/building.html#lapack [2] https://github.com/numpy/numpy/issues/15947 Reviewed By: #platform_macos, sebbas Differential Revision: https://developer.blender.org/D10368 --- build_files/build_environment/CMakeLists.txt | 7 ++++++- .../build_environment/cmake/python_site_packages.cmake | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 8d6fd3ab4c3..10dbc41bef4 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -86,9 +86,14 @@ include(cmake/tbb.cmake) include(cmake/openvdb.cmake) include(cmake/nanovdb.cmake) include(cmake/python.cmake) +option(USE_PIP_NUMPY "Install NumPy using pip wheel instead of building from source" OFF) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) + set(USE_PIP_NUMPY ON) +else() + include(cmake/numpy.cmake) +endif() include(cmake/python_site_packages.cmake) include(cmake/package_python.cmake) -include(cmake/numpy.cmake) include(cmake/usd.cmake) include(cmake/potrace.cmake) include(cmake/haru.cmake) diff --git a/build_files/build_environment/cmake/python_site_packages.cmake b/build_files/build_environment/cmake/python_site_packages.cmake index a3b9c3bf796..2b75a6a244f 100644 --- a/build_files/build_environment/cmake/python_site_packages.cmake +++ b/build_files/build_environment/cmake/python_site_packages.cmake @@ -28,6 +28,15 @@ ExternalProject_Add(external_python_site_packages INSTALL_COMMAND ${PYTHON_BINARY} -m pip install ${SITE_PACKAGES_EXTRA} cython==${CYTHON_VERSION} idna==${IDNA_VERSION} chardet==${CHARDET_VERSION} urllib3==${URLLIB3_VERSION} certifi==${CERTIFI_VERSION} requests==${REQUESTS_VERSION} --no-binary :all: ) +if(USE_PIP_NUMPY) + # Use only wheel (and not build from source) to stop NumPy from linking against buggy + # Accelerate framework backend on macOS. Official wheels are built with OpenBLAS. + ExternalProject_Add_Step(external_python_site_packages after_install + COMMAND ${PYTHON_BINARY} -m pip install --no-cache-dir numpy==${NUMPY_VERSION} --only-binary :all: + DEPENDEES install + ) +endif() + add_dependencies( external_python_site_packages external_python From 4ce57f6eb82c0c6d3a23201c8df008d29b18b5f7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 15 Feb 2021 17:41:30 +0100 Subject: [PATCH 190/519] macOS: fix Cycles not detecting 64 bit and failing to build with Embree Contributed by Apple Ref D9527, T78710 --- intern/cycles/bvh/bvh_embree.cpp | 5 +---- intern/cycles/util/util_defines.h | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp index c082478e5b1..07d5d672dce 100644 --- a/intern/cycles/bvh/bvh_embree.cpp +++ b/intern/cycles/bvh/bvh_embree.cpp @@ -31,8 +31,6 @@ #ifdef WITH_EMBREE # include -# include -# include # include "bvh/bvh_embree.h" @@ -306,8 +304,7 @@ BVHEmbree::BVHEmbree(const BVHParams ¶ms_, rtc_device(NULL), build_quality(RTC_BUILD_QUALITY_REFIT) { - _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); - _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); + SIMD_SET_FLUSH_TO_ZERO; } BVHEmbree::~BVHEmbree() diff --git a/intern/cycles/util/util_defines.h b/intern/cycles/util/util_defines.h index e8e414587fb..0a239a944a5 100644 --- a/intern/cycles/util/util_defines.h +++ b/intern/cycles/util/util_defines.h @@ -26,7 +26,7 @@ /* Bitness */ #if defined(__ppc64__) || defined(__PPC64__) || defined(__x86_64__) || defined(__ia64__) || \ - defined(_M_X64) + defined(_M_X64) || defined(__aarch64__) # define __KERNEL_64_BIT__ #endif From ae370e292af2f7092db02301e9deb6dd9d7a1441 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 15 Feb 2021 17:30:59 +0100 Subject: [PATCH 191/519] macOS: add Embree, OpenImageDenoise and sse2neon libraries for ARM This required using a fork of Embree, newer LLVM version, unreleased ISPC version and sse2neon directly from Git. Hopefully over time all the required changes end up in official releases. For now we deviate from other platforms. Based on contributions by Apple and Stefan Werner. Ref D9527, D8237, T78710 --- build_files/build_environment/CMakeLists.txt | 12 +++-- .../build_environment/cmake/embree.cmake | 30 +++++++---- .../build_environment/cmake/harvest.cmake | 13 ++--- .../build_environment/cmake/ispc.cmake | 16 +++--- .../build_environment/cmake/llvm.cmake | 2 +- .../cmake/openimagedenoise.cmake | 1 + .../build_environment/cmake/sse2neon.cmake | 30 +++++++++++ .../build_environment/cmake/versions.cmake | 51 ++++++++++++++----- .../build_environment/patches/oidn.diff | 40 +++++++++++++++ build_files/cmake/Modules/FindEmbree.cmake | 11 ++-- build_files/cmake/Modules/Findsse2neon.cmake | 49 ++++++++++++++++++ .../cmake/platform/platform_apple.cmake | 13 ++--- intern/cycles/util/util_openimagedenoise.h | 5 ++ .../operations/COM_DenoiseOperation.cpp | 6 ++- 14 files changed, 230 insertions(+), 49 deletions(-) create mode 100644 build_files/build_environment/cmake/sse2neon.cmake create mode 100644 build_files/build_environment/patches/oidn.diff create mode 100644 build_files/cmake/Modules/Findsse2neon.cmake diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 10dbc41bef4..b2f16508bb5 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -100,11 +100,9 @@ include(cmake/haru.cmake) # Boost needs to be included after python.cmake due to the PYTHON_BINARY variable being needed. include(cmake/boost.cmake) include(cmake/pugixml.cmake) -if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) - include(cmake/ispc.cmake) - include(cmake/openimagedenoise.cmake) - include(cmake/embree.cmake) -endif() +include(cmake/ispc.cmake) +include(cmake/openimagedenoise.cmake) +include(cmake/embree.cmake) if(NOT APPLE) include(cmake/xr_openxr.cmake) endif() @@ -114,6 +112,10 @@ include(cmake/expat.cmake) include(cmake/yamlcpp.cmake) include(cmake/opencolorio.cmake) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + include(cmake/sse2neon.cmake) +endif() + if(WITH_WEBP) include(cmake/webp.cmake) endif() diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake index 66a86cd5dbd..86b8256f98f 100644 --- a/build_files/build_environment/cmake/embree.cmake +++ b/build_files/build_environment/cmake/embree.cmake @@ -29,6 +29,7 @@ set(EMBREE_EXTRA_ARGS -DEMBREE_MAX_ISA=AVX2 -DEMBREE_TASKING_SYSTEM=TBB -DEMBREE_TBB_ROOT=${LIBDIR}/tbb + -DTBB_ROOT=${LIBDIR}/tbb -DTBB_STATIC_LIB=${TBB_STATIC_LIBRARY} ) @@ -46,15 +47,26 @@ else() set(EMBREE_BUILD_DIR) endif() -ExternalProject_Add(external_embree - URL ${EMBREE_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${EMBREE_HASH} - PREFIX ${BUILD_DIR}/embree - PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/embree -) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + ExternalProject_Add(external_embree + GIT_REPOSITORY ${EMBREE_ARM_GIT} + GIT_TAG "blender-arm" + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/embree + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/embree + ) +else() + ExternalProject_Add(external_embree + URL ${EMBREE_URI} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH MD5=${EMBREE_HASH} + PREFIX ${BUILD_DIR}/embree + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/embree + ) +endif() add_dependencies( external_embree diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 308cb77144c..93e6fbbf393 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -109,6 +109,9 @@ harvest(llvm/lib llvm/lib "libLLVM*.a") if(APPLE) harvest(openmp/lib openmp/lib "*") harvest(openmp/include openmp/include "*.h") + if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + harvest(sse2neon sse2neon "*.h") + endif() endif() harvest(ogg/lib ffmpeg/lib "*.a") harvest(openal/include openal/include "*.h") @@ -139,12 +142,10 @@ harvest(openimageio/bin openimageio/bin "maketx") harvest(openimageio/bin openimageio/bin "oiiotool") harvest(openimageio/include openimageio/include "*") harvest(openimageio/lib openimageio/lib "*.a") -if((NOT APPLE) OR ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")) - harvest(openimagedenoise/include openimagedenoise/include "*") - harvest(openimagedenoise/lib openimagedenoise/lib "*.a") - harvest(embree/include embree/include "*.h") - harvest(embree/lib embree/lib "*.a") -endif() +harvest(openimagedenoise/include openimagedenoise/include "*") +harvest(openimagedenoise/lib openimagedenoise/lib "*.a") +harvest(embree/include embree/include "*.h") +harvest(embree/lib embree/lib "*.a") harvest(openjpeg/include/openjpeg-2.3 openjpeg/include "*.h") harvest(openjpeg/lib openjpeg/lib "*.a") harvest(opensubdiv/include opensubdiv/include "*.h") diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 56c3cecae17..440f6e5bace 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -21,27 +21,31 @@ if(WIN32) -DFLEX_EXECUTABLE=${LIBDIR}/flexbison/win_flex.exe -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe -DM4_EXECUTABLE=${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/m4.exe + -DARM_ENABLED=Off ) elseif(APPLE) # Use bison installed via Homebrew. # The one which comes which Xcode toolset is too old. if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "arm64") - set(HOMEBREW_LOCATION "/opt/homebrew") + set(ISPC_EXTRA_ARGS_APPLE + -DBISON_EXECUTABLE=/opt/homebrew/opt/bison/bin/bison + -DARM_ENABLED=On + ) else() - set(HOMEBREW_LOCATION "/usr/local") + set(ISPC_EXTRA_ARGS_APPLE + -DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison + -DARM_ENABLED=Off + ) endif() - set(ISPC_EXTRA_ARGS_APPLE - -DBISON_EXECUTABLE=${HOMEBREW_LOCATION}/opt/bison/bin/bison - ) elseif(UNIX) set(ISPC_EXTRA_ARGS_UNIX -DCMAKE_C_COMPILER=${LIBDIR}/clang/bin/clang -DCMAKE_CXX_COMPILER=${LIBDIR}/clang/bin/clang++ + -DARM_ENABLED=Off ) endif() set(ISPC_EXTRA_ARGS - -DARM_ENABLED=Off -DISPC_NO_DUMPS=On -DISPC_INCLUDE_EXAMPLES=Off -DISPC_INCLUDE_TESTS=Off diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index 8c9a6076068..a4c7ccd9e27 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -17,7 +17,7 @@ # ***** END GPL LICENSE BLOCK ***** if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") - set(LLVM_TARGETS AArch64) + set(LLVM_TARGETS AArch64$ARM) else() set(LLVM_TARGETS X86) endif() diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index 65f12199952..7947fc31470 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -45,6 +45,7 @@ ExternalProject_Add(external_openimagedenoise DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${OIDN_HASH} PREFIX ${BUILD_DIR}/openimagedenoise + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimagedenoise/src/external_openimagedenoise < ${PATCH_DIR}/oidn.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimagedenoise ${DEFAULT_CMAKE_FLAGS} ${OIDN_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openimagedenoise ) diff --git a/build_files/build_environment/cmake/sse2neon.cmake b/build_files/build_environment/cmake/sse2neon.cmake new file mode 100644 index 00000000000..dca2d94f913 --- /dev/null +++ b/build_files/build_environment/cmake/sse2neon.cmake @@ -0,0 +1,30 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ***** END GPL LICENSE BLOCK ***** + +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + ExternalProject_Add(external_sse2neon + GIT_REPOSITORY ${SSE2NEON_GIT} + GIT_TAG ${SSE2NEON_GIT_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/sse2neon + CONFIGURE_COMMAND echo sse2neon - Nothing to configure + BUILD_COMMAND echo sse2neon - nothing to build + INSTALL_COMMAND mkdir -p ${LIBDIR}/sse2neon && cp ${BUILD_DIR}/sse2neon/src/external_sse2neon/sse2neon.h ${LIBDIR}/sse2neon + INSTALL_DIR ${LIBDIR}/sse2neon + ) +endif() diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 4a879c793a1..361c9fd9843 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -113,18 +113,35 @@ set(OPENCOLORIO_VERSION 2.0.0) set(OPENCOLORIO_URI https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v${OPENCOLORIO_VERSION}.tar.gz) set(OPENCOLORIO_HASH 1a2e3478b6cd9a1549f24e1b2205e3f0) -set(LLVM_VERSION 9.0.1) -set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) -set(LLVM_HASH 31eb9ce73dd2a0f8dcab8319fb03f8fc) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + # Newer version required by ISPC with arm support. + set(LLVM_VERSION 11.0.1) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) + set(LLVM_HASH 6ec7ae9fd43da9b87cda15b3ab9cc7af) -set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) -set(CLANG_HASH 13468e4a44940efef1b75e8641752f90) + set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) + set(CLANG_HASH b4cb0b74b1f3292a89c9720f3e1e2934) -set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) -set(CLANG_TOOLS_HASH c76293870b564c6a7968622b475b7646) + set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) + set(CLANG_TOOLS_HASH 1e577a85948a0f07483b7c405e59a0ca) -set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/openmp-${LLVM_VERSION}.src.tar.xz) -set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) + set(OPENMP_VERSION 9.0.1) + set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${OPENMP_VERSION}/openmp-${OPENMP_VERSION}.src.tar.xz) + set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) +else() + set(LLVM_VERSION 9.0.1) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) + set(LLVM_HASH 31eb9ce73dd2a0f8dcab8319fb03f8fc) + + set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) + set(CLANG_HASH 13468e4a44940efef1b75e8641752f90) + + set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) + set(CLANG_TOOLS_HASH c76293870b564c6a7968622b475b7646) + + set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/openmp-${LLVM_VERSION}.src.tar.xz) + set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) +endif() set(OPENIMAGEIO_VERSION 2.1.15.0) set(OPENIMAGEIO_URI https://github.com/OpenImageIO/oiio/archive/Release-${OPENIMAGEIO_VERSION}.tar.gz) @@ -296,6 +313,7 @@ set(SQLITE_HASH fb558c49ee21a837713c4f1e7e413309aabdd9c7) set(EMBREE_VERSION 3.10.0) set(EMBREE_URI https://github.com/embree/embree/archive/v${EMBREE_VERSION}.zip) set(EMBREE_HASH 4bbe29e7eaa46417efc75fc5f1e8eb87) +set(EMBREE_ARM_GIT https://github.com/brechtvl/embree.git) set(USD_VERSION 21.02) set(USD_URI https://github.com/PixarAnimationStudios/USD/archive/v${USD_VERSION}.tar.gz) @@ -321,9 +339,15 @@ set(XR_OPENXR_SDK_VERSION 1.0.14) set(XR_OPENXR_SDK_URI https://github.com/KhronosGroup/OpenXR-SDK/archive/release-${XR_OPENXR_SDK_VERSION}.tar.gz) set(XR_OPENXR_SDK_HASH 0df6b2fd6045423451a77ff6bc3e1a75) -set(ISPC_VERSION v1.14.1) -set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) -set(ISPC_HASH 968fbc8dfd16a60ba4e32d2e0e03ea7a) +if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) + # Unreleased version with macOS arm support. + set(ISPC_URI https://github.com/ispc/ispc/archive/f5949c055eb9eeb93696978a3da4bfb3a6a30b35.zip) + set(ISPC_HASH d382fea18d01dbd0cd05d9e1ede36d7d) +else() + set(ISPC_VERSION v1.14.1) + set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) + set(ISPC_HASH 968fbc8dfd16a60ba4e32d2e0e03ea7a) +endif() set(GMP_VERSION 6.2.0) set(GMP_URI https://gmplib.org/download/gmp/gmp-${GMP_VERSION}.tar.xz) @@ -336,3 +360,6 @@ set(POTRACE_HASH 5f0bd87ddd9a620b0c4e65652ef93d69) set(HARU_VERSION 2_3_0) set(HARU_URI https://github.com/libharu/libharu/archive/RELEASE_${HARU_VERSION}.tar.gz) set(HARU_HASH 4f916aa49c3069b3a10850013c507460) + +set(SSE2NEON_GIT https://github.com/DLTcollab/sse2neon.git) +set(SSE2NEON_GIT_HASH fe5ff00bb8d19b327714a3c290f3e2ce81ba3525) diff --git a/build_files/build_environment/patches/oidn.diff b/build_files/build_environment/patches/oidn.diff new file mode 100644 index 00000000000..10d21d7764b --- /dev/null +++ b/build_files/build_environment/patches/oidn.diff @@ -0,0 +1,40 @@ +diff -Naur oidn-1.3.0/cmake/FindTBB.cmake external_openimagedenoise/cmake/FindTBB.cmake +--- oidn-1.3.0/cmake/FindTBB.cmake 2021-02-04 16:20:26 -0700 ++++ external_openimagedenoise/cmake/FindTBB.cmake 2021-02-12 09:35:53 -0700 +@@ -332,20 +332,22 @@ + ${TBB_ROOT}/lib/${TBB_ARCH}/${TBB_VCVER} + ${TBB_ROOT}/lib + ) +- + # On Windows, also search the DLL so that the client may install it. + file(GLOB DLL_NAMES + ${TBB_ROOT}/bin/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/bin/${LIB_NAME}.dll ++ ${TBB_ROOT}/lib/${LIB_NAME}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME_GLOB1}.dll + ${TBB_ROOT}/redist/${TBB_ARCH}/${TBB_VCVER}/${LIB_NAME_GLOB2}.dll + ${TBB_ROOT}/../redist/${TBB_ARCH}/tbb/${TBB_VCVER}/${LIB_NAME}.dll + ${TBB_ROOT}/../redist/${TBB_ARCH}_win/tbb/${TBB_VCVER}/${LIB_NAME}.dll + ) +- list(GET DLL_NAMES 0 DLL_NAME) +- get_filename_component(${BIN_DIR_VAR} "${DLL_NAME}" DIRECTORY) +- set(${DLL_VAR} "${DLL_NAME}" CACHE PATH "${COMPONENT_NAME} ${BUILD_CONFIG} dll path") ++ if (DLL_NAMES) ++ list(GET DLL_NAMES 0 DLL_NAME) ++ get_filename_component(${BIN_DIR_VAR} "${DLL_NAME}" DIRECTORY) ++ set(${DLL_VAR} "${DLL_NAME}" CACHE PATH "${COMPONENT_NAME} ${BUILD_CONFIG} dll path") ++ endif() + elseif(APPLE) + set(LIB_PATHS ${TBB_ROOT}/lib) + else() +--- external_openimagedenoise/cmake/oidn_ispc.cmake 2021-02-15 17:29:34.000000000 +0100 ++++ external_openimagedenoise/cmake/oidn_ispc.cmake2 2021-02-15 17:29:28.000000000 +0100 +@@ -98,7 +98,7 @@ + elseif(OIDN_ARCH STREQUAL "ARM64") + set(ISPC_ARCHITECTURE "aarch64") + if(APPLE) +- set(ISPC_TARGET_OS "--target-os=ios") ++ set(ISPC_TARGET_OS "--target-os=macos") + endif() + endif() diff --git a/build_files/cmake/Modules/FindEmbree.cmake b/build_files/cmake/Modules/FindEmbree.cmake index af545cee00c..7f7f2ae0fb3 100644 --- a/build_files/cmake/Modules/FindEmbree.cmake +++ b/build_files/cmake/Modules/FindEmbree.cmake @@ -34,12 +34,17 @@ FIND_PATH(EMBREE_INCLUDE_DIR include ) +IF(NOT (APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64"))) + SET(_embree_SIMD_COMPONENTS + embree_sse42 + embree_avx + embree_avx2 + ) +ENDIF() SET(_embree_FIND_COMPONENTS embree3 - embree_sse42 - embree_avx - embree_avx2 + ${_embree_SIMD_COMPONENTS} lexers math simd diff --git a/build_files/cmake/Modules/Findsse2neon.cmake b/build_files/cmake/Modules/Findsse2neon.cmake new file mode 100644 index 00000000000..2159dfac114 --- /dev/null +++ b/build_files/cmake/Modules/Findsse2neon.cmake @@ -0,0 +1,49 @@ +# - Find sse2neon library +# Find the native sse2neon includes and library +# This module defines +# SSE2NEON_INCLUDE_DIRS, where to find sse2neon.h, Set when +# SSE2NEON_INCLUDE_DIR is found. +# SSE2NEON_ROOT_DIR, The base directory to search for sse2neon. +# This can also be an environment variable. +# SSE2NEON_FOUND, If false, do not try to use sse2neon. + +#============================================================================= +# Copyright 2020 Blender Foundation. +# +# Distributed under the OSI-approved BSD 3-Clause License, +# see accompanying file BSD-3-Clause-license.txt for details. +#============================================================================= + +# If SSE2NEON_ROOT_DIR was defined in the environment, use it. +IF(NOT SSE2NEON_ROOT_DIR AND NOT $ENV{SSE2NEON_ROOT_DIR} STREQUAL "") + SET(SSE2NEON_ROOT_DIR $ENV{SSE2NEON_ROOT_DIR}) +ENDIF() + +SET(_sse2neon_SEARCH_DIRS + ${SSE2NEON_ROOT_DIR} +) + +FIND_PATH(SSE2NEON_INCLUDE_DIR + NAMES + sse2neon.h + HINTS + ${_sse2neon_SEARCH_DIRS} + PATH_SUFFIXES + include +) + +# handle the QUIETLY and REQUIRED arguments and set SSE2NEON_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(sse2neon DEFAULT_MSG + SSE2NEON_INCLUDE_DIR) + +IF(SSE2NEON_FOUND) + SET(SSE2NEON_INCLUDE_DIRS ${SSE2NEON_INCLUDE_DIR}) +ENDIF(SSE2NEON_FOUND) + +MARK_AS_ADVANCED( + SSE2NEON_INCLUDE_DIR +) + +UNSET(_sse2neon_SEARCH_DIRS) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index b95b21da946..5203ba10863 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -206,6 +206,13 @@ set(PLATFORM_LINKFLAGS list(APPEND PLATFORM_LINKLIBS c++) +if(WITH_OPENIMAGEDENOISE) + if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + # OpenImageDenoise uses BNNS from the Accelerate framework. + string(APPEND PLATFORM_LINKFLAGS " -framework Accelerate") + endif() +endif() + if(WITH_JACK) string(APPEND PLATFORM_LINKFLAGS " -F/Library/Frameworks -weak_framework jackmp") endif() @@ -345,12 +352,6 @@ if(WITH_CYCLES_OSL) endif() endif() -if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") - set(WITH_CYCLES_EMBREE OFF) - set(WITH_OPENIMAGEDENOISE OFF) - set(WITH_CPU_SSE OFF) -endif() - if(WITH_CYCLES_EMBREE) find_package(Embree 3.8.0 REQUIRED) # Increase stack size for Embree, only works for executables. diff --git a/intern/cycles/util/util_openimagedenoise.h b/intern/cycles/util/util_openimagedenoise.h index aafa69cb530..898c634141e 100644 --- a/intern/cycles/util/util_openimagedenoise.h +++ b/intern/cycles/util/util_openimagedenoise.h @@ -28,7 +28,12 @@ CCL_NAMESPACE_BEGIN static inline bool openimagedenoise_supported() { #ifdef WITH_OPENIMAGEDENOISE +# ifdef __APPLE__ + /* Always supported through Accelerate framework BNNS. */ + return true; +# else return system_cpu_support_sse41(); +# endif #else return false; #endif diff --git a/source/blender/compositor/operations/COM_DenoiseOperation.cpp b/source/blender/compositor/operations/COM_DenoiseOperation.cpp index bc33e5f75c4..d08f238c4c1 100644 --- a/source/blender/compositor/operations/COM_DenoiseOperation.cpp +++ b/source/blender/compositor/operations/COM_DenoiseOperation.cpp @@ -94,7 +94,11 @@ void DenoiseOperation::generateDenoise(float *data, return; } #ifdef WITH_OPENIMAGEDENOISE - if (BLI_cpu_support_sse41()) { + /* Always supported through Accelerate framework BNNS on macOS. */ +# ifndef __APPLE__ + if (BLI_cpu_support_sse41()) +# endif + { oidn::DeviceRef device = oidn::newDevice(); device.commit(); From c53022768b13831c38d2b687f99b7f9cbb919892 Mon Sep 17 00:00:00 2001 From: Falk David Date: Mon, 15 Feb 2021 20:29:52 +0100 Subject: [PATCH 192/519] Fix T85587: Crash on selecting multiple frames Blender would crash when selecting multiple keyframes while multiframe edit was active. This was due to the active frame being NULL in some instances. The fix checks if the active frame is not NULL. Reviewed By: antoniov Maniphest Tasks: T85587 Differential Revision: https://developer.blender.org/D10421 --- source/blender/blenkernel/intern/gpencil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index ea7d961a573..1aec1ad296d 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -2605,7 +2605,7 @@ void BKE_gpencil_visible_stroke_iter(ViewLayer *view_layer, sta_gpf = end_gpf = NULL; /* Check the whole range and tag the editable frames. */ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { - if (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT)) { + if (act_gpf != NULL && (gpf == act_gpf || (gpf->flag & GP_FRAME_SELECT))) { gpf->runtime.onion_id = 0; if (do_onion) { if (gpf->framenum < act_gpf->framenum) { From c63df3b33f011d524fc8dd1b8fc28f896e876a99 Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Tue, 5 Jan 2021 13:55:32 -0700 Subject: [PATCH 193/519] UI: Clarify descriptions in properties popover Updates the descriptions and labels for outliner sync in the properties editor popover to be more clear. Differential Revision: https://developer.blender.org/D10010 --- .../scripts/startup/bl_ui/space_properties.py | 2 +- .../editors/space_buttons/buttons_context.c | 2 +- source/blender/makesdna/DNA_space_types.h | 4 ++-- source/blender/makesrna/intern/rna_space.c | 18 ++++++++++++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py index b2a7246af75..053df113dd7 100644 --- a/release/scripts/startup/bl_ui/space_properties.py +++ b/release/scripts/startup/bl_ui/space_properties.py @@ -74,7 +74,7 @@ class PROPERTIES_PT_navigation_bar(Panel): class PROPERTIES_PT_options(Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'HEADER' - bl_label = 'Options' + bl_label = 'Show options for the properties editor' def draw(self, context): layout = self.layout diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index e2b889bece1..76c0fc07429 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -759,7 +759,7 @@ bool ED_buttons_should_sync_with_outliner(const bContext *C, ScrArea *active_area = CTX_wm_area(C); const bool auto_sync = ED_area_has_shared_border(active_area, area) && sbuts->outliner_sync == PROPERTIES_SYNC_AUTO; - return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ON; + return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ALWAYS; } void ED_buttons_set_context(const bContext *C, diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 03f5d3f8d47..13989467db3 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -238,8 +238,8 @@ typedef enum eSpaceButtons_Flag { /* SpaceProperties.outliner_sync */ typedef enum eSpaceButtons_OutlinerSync { PROPERTIES_SYNC_AUTO = 0, - PROPERTIES_SYNC_OFF = 1, - PROPERTIES_SYNC_ON = 2, + PROPERTIES_SYNC_NEVER = 1, + PROPERTIES_SYNC_ALWAYS = 2, } eSpaceButtons_OutlinerSync; /** \} */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 251845ee5b0..f5abe681d91 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4787,13 +4787,21 @@ static void rna_def_space_properties(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem tab_sync_items[] = { - {PROPERTIES_SYNC_ON, "ON", 0, "On", "Always sync from outliner editors to this editor"}, - {PROPERTIES_SYNC_OFF, "OFF", 0, "Off", "Never sync from outliner editors to this editor"}, + {PROPERTIES_SYNC_ALWAYS, + "ALWAYS", + 0, + "Always", + "Always change tabs when clicking an icon in an outliner"}, + {PROPERTIES_SYNC_NEVER, + "NEVER", + 0, + "Never", + "Never change tabs when clicking an icon in an outliner"}, {PROPERTIES_SYNC_AUTO, "AUTO", 0, "Auto", - "Sync when this editor shares an edge with an outliner editor"}, + "Change tabs only when this editor shares a border the outliner"}, {0, NULL, 0, NULL, NULL}, }; @@ -4852,7 +4860,9 @@ static void rna_def_space_properties(BlenderRNA *brna) prop = RNA_def_property(srna, "outliner_sync", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "outliner_sync"); RNA_def_property_enum_items(prop, tab_sync_items); - RNA_def_property_ui_text(prop, "Outliner Sync", "Sync tabs from outliner datablock selection"); + RNA_def_property_ui_text(prop, + "Outliner Sync", + "Change to the corresponding tab when outliner data icons are clicked"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_PROPERTIES, NULL); } From 23de16414ad6eeebab7d8840a6626c1fd7a6e08d Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Tue, 5 Jan 2021 13:55:32 -0700 Subject: [PATCH 194/519] UI: Clarify descriptions in properties popover Updates the descriptions and labels for outliner sync in the properties editor popover to be more clear. Differential Revision: https://developer.blender.org/D10010 --- .../scripts/startup/bl_ui/space_properties.py | 2 +- .../editors/space_buttons/buttons_context.c | 2 +- source/blender/makesdna/DNA_space_types.h | 4 ++-- source/blender/makesrna/intern/rna_space.c | 18 ++++++++++++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py index b2a7246af75..053df113dd7 100644 --- a/release/scripts/startup/bl_ui/space_properties.py +++ b/release/scripts/startup/bl_ui/space_properties.py @@ -74,7 +74,7 @@ class PROPERTIES_PT_navigation_bar(Panel): class PROPERTIES_PT_options(Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'HEADER' - bl_label = 'Options' + bl_label = 'Show options for the properties editor' def draw(self, context): layout = self.layout diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index 5f347451c4a..3efaff72637 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -756,7 +756,7 @@ bool ED_buttons_should_sync_with_outliner(const bContext *C, ScrArea *active_area = CTX_wm_area(C); const bool auto_sync = ED_area_has_shared_border(active_area, area) && sbuts->outliner_sync == PROPERTIES_SYNC_AUTO; - return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ON; + return auto_sync || sbuts->outliner_sync == PROPERTIES_SYNC_ALWAYS; } void ED_buttons_set_context(const bContext *C, diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 4d705f3aa34..dc1775b09c6 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -241,8 +241,8 @@ typedef enum eSpaceButtons_Flag { /* SpaceProperties.outliner_sync */ typedef enum eSpaceButtons_OutlinerSync { PROPERTIES_SYNC_AUTO = 0, - PROPERTIES_SYNC_OFF = 1, - PROPERTIES_SYNC_ON = 2, + PROPERTIES_SYNC_NEVER = 1, + PROPERTIES_SYNC_ALWAYS = 2, } eSpaceButtons_OutlinerSync; /** \} */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index c56ddeb9053..9578c5d8228 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4805,13 +4805,21 @@ static void rna_def_space_properties(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem tab_sync_items[] = { - {PROPERTIES_SYNC_ON, "ON", 0, "On", "Always sync from outliner editors to this editor"}, - {PROPERTIES_SYNC_OFF, "OFF", 0, "Off", "Never sync from outliner editors to this editor"}, + {PROPERTIES_SYNC_ALWAYS, + "ALWAYS", + 0, + "Always", + "Always change tabs when clicking an icon in an outliner"}, + {PROPERTIES_SYNC_NEVER, + "NEVER", + 0, + "Never", + "Never change tabs when clicking an icon in an outliner"}, {PROPERTIES_SYNC_AUTO, "AUTO", 0, "Auto", - "Sync when this editor shares an edge with an outliner editor"}, + "Change tabs only when this editor shares a border the outliner"}, {0, NULL, 0, NULL, NULL}, }; @@ -4870,7 +4878,9 @@ static void rna_def_space_properties(BlenderRNA *brna) prop = RNA_def_property(srna, "outliner_sync", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "outliner_sync"); RNA_def_property_enum_items(prop, tab_sync_items); - RNA_def_property_ui_text(prop, "Outliner Sync", "Sync tabs from outliner datablock selection"); + RNA_def_property_ui_text(prop, + "Outliner Sync", + "Change to the corresponding tab when outliner data icons are clicked"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_PROPERTIES, NULL); } From 4a784f32fe1ef2792e05c9a4fc277f6f84baaaec Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 15 Feb 2021 17:43:54 -0800 Subject: [PATCH 195/519] Calm Win32 Window Creation Warning Removing warning that 'GHOST_TUns32' to 'LONG' requires a narrowing conversion. Differential Revision: https://developer.blender.org/D9971 Own Code --- intern/ghost/intern/GHOST_WindowWin32.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 377eb61874d..2de86ff21fb 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -92,7 +92,7 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_debug_context(is_debug) { wchar_t *title_16 = alloc_utf16_from_8((char *)title, 0); - RECT win_rect = {left, top, left + width, top + height}; + RECT win_rect = {left, top, (long)(left + width), (long)(top + height)}; RECT parent_rect = {0, 0, 0, 0}; if (parentwindow) { GetWindowRect(m_parentWindowHwnd, &parent_rect); From f34d5d99dce8dde6559e7d5ebd8060cc942a7491 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Feb 2021 14:02:56 +1100 Subject: [PATCH 196/519] Cleanup: remove local copy of shutil.copytree from Python 3.8 --- .../scripts/startup/bl_operators/userpref.py | 49 +------------------ 1 file changed, 2 insertions(+), 47 deletions(-) diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index fa6338fa614..7f2fa1292ee 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -50,49 +50,6 @@ def module_filesystem_remove(path_base, module_name): os.remove(f_full) -# This duplicates shutil.copytree from Python 3.8, with the new dirs_exist_ok -# argument that we need. Once we upgrade to 3.8 we can remove this. -def _preferences_copytree(entries, src, dst): - import os - import shutil - from shutil import Error - - os.makedirs(dst, exist_ok=True) - errors = [] - - for srcentry in entries: - srcname = os.path.join(src, srcentry.name) - dstname = os.path.join(dst, srcentry.name) - srcobj = srcentry - try: - if srcentry.is_symlink(): - linkto = os.readlink(srcname) - os.symlink(linkto, dstname) - shutil.copystat(srcobj, dstname, follow_symlinks=False) - elif srcentry.is_dir(): - preferences_copytree(srcobj, dstname) - else: - shutil.copy2(srcentry, dstname) - except Error as err: - errors.extend(err.args[0]) - except OSError as why: - errors.append((srcname, dstname, str(why))) - try: - shutil.copystat(src, dst) - except OSError as why: - if getattr(why, 'winerror', None) is None: - errors.append((src, dst, str(why))) - if errors: - raise Error(errors) - return dst - - -def preferences_copytree(src, dst): - import os - with os.scandir(src) as entries: - return _preferences_copytree(entries=entries, src=src, dst=dst) - - class PREFERENCES_OT_keyconfig_activate(Operator): bl_idname = "preferences.keyconfig_activate" bl_label = "Activate Keyconfig" @@ -168,10 +125,8 @@ class PREFERENCES_OT_copy_prev(Operator): return os.path.isfile(old_userpref) and not os.path.isfile(new_userpref) def execute(self, _context): - # Use this instead once we upgrade to Python 3.8 with dirs_exist_ok. - # import shutil - # shutil.copytree(self._old_path(), self._new_path(), dirs_exist_ok=True) - preferences_copytree(self._old_path(), self._new_path()) + import shutil + shutil.copytree(self._old_path(), self._new_path(), dirs_exist_ok=True) # reload preferences and recent-files.txt bpy.ops.wm.read_userpref() From 7bb5e4a3c192a0c09d2877eed7808b215fff5abb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Feb 2021 15:51:04 +1100 Subject: [PATCH 197/519] Fix reloading preferences ignoring 'script_directory' Reloading preferences didn't update Python's `sys.path` to account for the modified `script_directory`. This meant the operator to load settings from a previous version required a restart to initialize Python when this directory was set. --- release/scripts/modules/bpy/utils/__init__.py | 19 ++++++++++++++++++- .../blender/windowmanager/intern/wm_files.c | 17 ++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py index 7f39cc5d422..d984a6f54a4 100644 --- a/release/scripts/modules/bpy/utils/__init__.py +++ b/release/scripts/modules/bpy/utils/__init__.py @@ -121,15 +121,25 @@ def _test_import(module_name, loaded_modules): return mod -# Reloading would add twice. +# Check before adding paths as reloading would add twice. + +# Storing and restoring the full `sys.path` is risky as this may be intentionally modified +# by technical users/developers. +# +# Instead, track which paths have been added, clearing them before refreshing. +# This supports the case of loading a new preferences file which may reset scripts path. +_sys_path_ensure_paths = set() + def _sys_path_ensure_prepend(path): if path not in _sys.path: _sys.path.insert(0, path) + _sys_path_ensure_paths.add(path) def _sys_path_ensure_append(path): if path not in _sys.path: _sys.path.append(path) + _sys_path_ensure_paths.add(path) def modules_from_path(path, loaded_modules): @@ -391,6 +401,13 @@ def refresh_script_paths(): Run this after creating new script paths to update sys.path """ + for path in _sys_path_ensure_paths: + try: + _sys.path.remove(path) + except ValueError: + pass + _sys_path_ensure_paths.clear() + for base_path in script_paths(): for path_subdir in _script_module_dirs: path = _os.path.join(base_path, path_subdir) diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 42d17387d77..090c28a81a6 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -580,7 +580,10 @@ static void wm_file_read_post(bContext *C, #ifdef WITH_PYTHON if (is_startup_file) { - /* possible python hasn't been initialized */ + /* On startup (by default), Python won't have been initialized. + * + * The following block handles data & preferences being reloaded + * which requires resetting some internal variables. */ if (CTX_py_init_get(C)) { bool reset_all = use_userdef; if (use_userdef || reset_app_template) { @@ -592,8 +595,16 @@ static void wm_file_read_post(bContext *C, } } if (reset_all) { - /* sync addons, these may have changed from the defaults */ - BPY_run_string_eval(C, (const char *[]){"addon_utils", NULL}, "addon_utils.reset_all()"); + BPY_run_string_exec( + C, + (const char *[]){"bpy", "addon_utils", NULL}, + /* Refresh scripts as the preferences may have changed the user-scripts path. + * + * This is needed when loading settings from the previous version, + * otherwise the script path stored in the preferences would be ignored. */ + "bpy.utils.refresh_script_paths()\n" + /* Sync add-ons, these may have changed from the defaults. */ + "addon_utils.reset_all()"); } if (use_data) { BPY_python_reset(C); From 63fb53ad95dc21cc6f8647e4a157ddefa938e28f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Feb 2021 16:26:05 +1100 Subject: [PATCH 198/519] Docs: add a docstring for UserDef.pythondir --- source/blender/makesdna/DNA_userdef_types.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index e6e2b6553c0..d304641e112 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -673,6 +673,21 @@ typedef struct UserDef { /** 768 = FILE_MAXDIR. */ char render_cachedir[768]; char textudir[768]; + /** + * Optional user location for scripts. + * + * This supports the same layout as Blender's scripts directory `release/scripts`. + * + * \note Unlike most paths, changing this is not fully supported at run-time, + * requiring a restart to properly take effect. Supporting this would cause complications as + * the script path can contain `startup`, `addons` & `modules` etc. properly unwinding the + * Python environment to the state it _would_ have been in gets complicated. + * + * Although this is partially supported as the `sys.path` is refreshed when loading preferences. + * This is done to support #PREFERENCES_OT_copy_prev which is available to the user when they + * launch with a new version of Blender. In this case setting the script path on top of + * factory settings will work without problems. + */ char pythondir[768]; char sounddir[768]; char i18ndir[768]; From 2e81f2c01abd21fdbc79625f3f7a0778103fa199 Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Mon, 15 Feb 2021 22:47:52 -0800 Subject: [PATCH 199/519] Revert Wintab High Frequency Input. This revert removes handling of cursor move and button press events during Wintab's WT_PACKET event, instead storing pressure and tilt information to be combined with Window's WM_MOUSEMOVE events. This also reverts dynamic enabling and disabling of Wintab, dependent on the chosen Tablet API. If the Tablet API is not explictly Windows Ink during startup, Wintab is loaded and enabled. Left in place is a fallback to Windows Ink when the Tablet API is set to Automatic and no Wintab devices are present. This allows devices with Wintab installed but not active to fallback to Windows Ink. Using position provided by Wintab was found to have too many regressions to include in Blender 2.93. The primary source of regressions was tablets which mapped coordinates incorrectly on multi- monitor and scaled displays. This resulted in an offset between what the driver controlled Win32 cursor position and the Wintab reported position. A special case of this included tablets set to mouse mode, where Wintab reported absolute position while the system cursor moved as a relative mouse with mouse acceleration. --- intern/ghost/intern/GHOST_System.h | 2 +- intern/ghost/intern/GHOST_SystemWin32.cpp | 228 ++-------- intern/ghost/intern/GHOST_SystemWin32.h | 19 - intern/ghost/intern/GHOST_WindowWin32.cpp | 450 +++++++------------ intern/ghost/intern/GHOST_WindowWin32.h | 122 ++--- source/blender/makesrna/intern/rna_userdef.c | 6 +- 6 files changed, 242 insertions(+), 585 deletions(-) diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index 279f90b9641..2a7123b293e 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -239,7 +239,7 @@ class GHOST_System : public GHOST_ISystem { * Set which tablet API to use. Only affects Windows, other platforms have a single API. * \param api: Enum indicating which API to use. */ - virtual void setTabletAPI(GHOST_TTabletAPI api); + void setTabletAPI(GHOST_TTabletAPI api); GHOST_TTabletAPI getTabletAPI(void); #ifdef WITH_INPUT_NDOF diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 718ace9db4a..c86b332d228 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -237,11 +237,6 @@ GHOST_SystemWin32::~GHOST_SystemWin32() toggleConsole(1); } -GHOST_TUns64 GHOST_SystemWin32::millisSinceStart(__int64 ms) const -{ - return (GHOST_TUns64)(ms - m_start * 1000 / m_freq); -} - GHOST_TUns64 GHOST_SystemWin32::performanceCounterToMillis(__int64 perf_ticks) const { // Calculate the time passed since system initialization. @@ -955,99 +950,23 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, { GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = window->m_tabletInRange ? window->getLastTabletData() : - GHOST_TABLET_DATA_NONE; + GHOST_TabletData td = GHOST_TABLET_DATA_NONE; - /* Move mouse to button event position. */ - if (!window->m_tabletInRange) { - processCursorEvent(window); - } - else { - /* Tablet should be hadling inbetween mouse moves, only move to event position. */ + if (window->m_tabletInRange) { + td = window->getTabletData(); + + /* Check if tablet cursor position is in sync with Win32 cursor position, if not then move + * cursor to position where button event occurred. */ DWORD msgPos = ::GetMessagePos(); int msgPosX = GET_X_LPARAM(msgPos); int msgPosY = GET_Y_LPARAM(msgPos); - system->pushEvent(new GHOST_EventCursor( - ::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td)); - } - - window->updateMouseCapture(type == GHOST_kEventButtonDown ? MousePressed : MouseReleased); - return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); -} - -void GHOST_SystemWin32::processWintabEvent(GHOST_WindowWin32 *window) -{ - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - - std::vector wintabInfo; - if (!window->getWintabInfo(wintabInfo)) { - return; - } - - for (auto info : wintabInfo) { - switch (info.type) { - case GHOST_kEventCursorMove: { - system->pushEvent(new GHOST_EventCursor( - info.time, GHOST_kEventCursorMove, window, info.x, info.y, info.tabletData)); - break; - } - case GHOST_kEventButtonDown: { - system->pushEvent(new GHOST_EventCursor( - info.time, GHOST_kEventCursorMove, window, info.x, info.y, info.tabletData)); - - UINT message; - switch (info.button) { - case GHOST_kButtonMaskLeft: - message = WM_LBUTTONDOWN; - break; - case GHOST_kButtonMaskRight: - message = WM_RBUTTONDOWN; - break; - case GHOST_kButtonMaskMiddle: - message = WM_MBUTTONDOWN; - break; - default: - continue; - } - - MSG msg; - if (PeekMessage(&msg, window->getHWND(), message, message, PM_REMOVE | PM_NOYIELD) && - WM_QUIT != msg.message) { - window->updateMouseCapture(MousePressed); - system->pushEvent( - new GHOST_EventButton(info.time, info.type, window, info.button, info.tabletData)); - } - break; - } - case GHOST_kEventButtonUp: { - UINT message; - switch (info.button) { - case GHOST_kButtonMaskLeft: - message = WM_LBUTTONUP; - break; - case GHOST_kButtonMaskRight: - message = WM_RBUTTONUP; - break; - case GHOST_kButtonMaskMiddle: - message = WM_MBUTTONUP; - break; - default: - continue; - } - - MSG msg; - if (PeekMessage(&msg, window->getHWND(), message, message, PM_REMOVE | PM_NOYIELD) && - WM_QUIT != msg.message) { - window->updateMouseCapture(MouseReleased); - system->pushEvent( - new GHOST_EventButton(info.time, info.type, window, info.button, info.tabletData)); - } - break; - } - default: - break; + if (msgPosX != system->m_mousePosX || msgPosY != system->m_mousePosY) { + system->pushEvent(new GHOST_EventCursor( + ::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td)); } } + + return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); } void GHOST_SystemWin32::processPointerEvent( @@ -1129,12 +1048,15 @@ void GHOST_SystemWin32::processPointerEvent( void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) { - /* Cursor moves handled by tablets while active. */ - if (window->m_tabletInRange) { + if (window->m_tabletInRange && window->useTabletAPI(GHOST_kTabletNative)) { + /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet + * input aren't normally generated when using WM_POINTER events, but manually moving the + * system cursor as we do in WM_POINTER handling does. */ return; } GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); + GHOST_TabletData td = window->getTabletData(); DWORD msgPos = ::GetMessagePos(); LONG msgTime = ::GetMessageTime(); @@ -1185,13 +1107,13 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) window, points[i].x + x_accum, points[i].y + y_accum, - GHOST_TABLET_DATA_NONE)); + td)); } DWORD lastTimestamp = points[0].time; /* Check if we need to wrap the cursor. */ - if (window->getCursorGrabModeIsWarp()) { + if (window->getCursorGrabModeIsWarp() && !window->m_tabletInRange) { /* Wrap based on current cursor position in case Win32 mouse move queue is out of order due to * prior wrap. */ POINT point; @@ -1334,23 +1256,6 @@ GHOST_EventKey *GHOST_SystemWin32::processKeyEvent(GHOST_WindowWin32 *window, RA return event; } -GHOST_Event *GHOST_SystemWin32::processWindowSizeEvent(GHOST_WindowWin32 *window) -{ - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_Event *sizeEvent = new GHOST_Event( - system->getMilliSeconds(), GHOST_kEventWindowSize, window); - - /* We get WM_SIZE before we fully init. Do not dispatch before we are continuously resizing. */ - if (window->m_inLiveResize) { - system->pushEvent(sizeEvent); - system->dispatchEvents(); - return NULL; - } - else { - return sizeEvent; - } -} - GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, GHOST_WindowWin32 *window) { @@ -1358,6 +1263,7 @@ GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, if (type == GHOST_kEventWindowActivate) { system->getWindowManager()->setActiveWindow(window); + window->bringTabletContextToFront(); } return new GHOST_Event(system->getMilliSeconds(), type, window); @@ -1385,18 +1291,6 @@ GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType, system->getMilliSeconds(), eventType, draggedObjectType, window, mouseX, mouseY, data)); } -void GHOST_SystemWin32::setTabletAPI(GHOST_TTabletAPI api) -{ - GHOST_System::setTabletAPI(api); - - GHOST_WindowManager *wm = getWindowManager(); - - for (GHOST_IWindow *win : wm->getWindows()) { - GHOST_WindowWin32 *windowWin32 = (GHOST_WindowWin32 *)win; - windowWin32->setWintabEnabled(windowWin32->useTabletAPI(GHOST_kTabletWintab)); - } -} - void GHOST_SystemWin32::processMinMaxInfo(MINMAXINFO *minmax) { minmax->ptMinTrackSize.x = 320; @@ -1636,30 +1530,16 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, //////////////////////////////////////////////////////////////////////// // Wintab events, processed //////////////////////////////////////////////////////////////////////// - case WT_INFOCHANGE: { + case WT_INFOCHANGE: window->processWintabInfoChangeEvent(lParam); eventHandled = true; break; - } - case WT_CSRCHANGE: - window->updateWintabCursorInfo(); - eventHandled = true; - break; - case WT_PROXIMITY: { - if (window->useTabletAPI(GHOST_kTabletWintab)) { - if (LOWORD(lParam)) { - window->m_tabletInRange = true; - } - else { - window->processWintabLeave(); - } - } - eventHandled = true; - break; - } case WT_PACKET: - processWintabEvent(window); - eventHandled = true; + window->processWin32TabletEvent(wParam, lParam); + break; + case WT_CSRCHANGE: + case WT_PROXIMITY: + window->processWin32TabletInitEvent(); break; //////////////////////////////////////////////////////////////////////// // Pointer events, processed @@ -1675,53 +1555,52 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Mouse events, processed //////////////////////////////////////////////////////////////////////// case WM_LBUTTONDOWN: + window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONDOWN: + window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONDOWN: + window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONDOWN: if ((short)HIWORD(wParam) == XBUTTON1) { + window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { + window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton5); } break; case WM_LBUTTONUP: + window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONUP: + window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONUP: + window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONUP: if ((short)HIWORD(wParam) == XBUTTON1) { + window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { + window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton5); } break; case WM_MOUSEMOVE: - if (!window->m_mousePresent) { - TRACKMOUSEEVENT tme = {sizeof(tme)}; - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hwnd; - TrackMouseEvent(&tme); - window->m_mousePresent = true; - window->setWintabOverlap(true); - } - - if (!window->m_tabletInRange) { - processCursorEvent(window); - eventHandled = true; - } + processCursorEvent(window); + eventHandled = true; break; case WM_MOUSEWHEEL: { /* The WM_MOUSEWHEEL message is sent to the focus window @@ -1763,13 +1642,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, window->loadCursor(true, GHOST_kStandardCursorDefault); } break; - case WM_MOUSELEAVE: - window->m_mousePresent = false; - window->setWintabOverlap(false); - if (!window->m_tabletInRange) { - processCursorEvent(window); - } - break; + //////////////////////////////////////////////////////////////////////// // Mouse events, ignored //////////////////////////////////////////////////////////////////////// @@ -1785,6 +1658,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * is sent to the window that has captured the mouse. */ break; + //////////////////////////////////////////////////////////////////////// // Window events, processed //////////////////////////////////////////////////////////////////////// @@ -1816,7 +1690,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * will not be dispatched to OUR active window if we minimize one of OUR windows. */ if (LOWORD(wParam) == WA_INACTIVE) window->lostMouseCapture(); - + window->processWin32TabletActivateEvent(GET_WM_ACTIVATE_STATE(wParam, lParam)); lResult = ::DefWindowProc(hwnd, msg, wParam, lParam); break; } @@ -1858,8 +1732,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, /* Let DefWindowProc handle it. */ break; case WM_SIZING: - event = processWindowSizeEvent(window); - break; case WM_SIZE: /* The WM_SIZE message is sent to a window after its size has changed. * The WM_SIZE and WM_MOVE messages are not sent if an application handles the @@ -1867,15 +1739,15 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * to perform any move or size change processing during the WM_WINDOWPOSCHANGED * message without calling DefWindowProc. */ - event = processWindowSizeEvent(window); - - if (wParam == SIZE_MINIMIZED) { - window->setWintabEnabled(false); + /* we get first WM_SIZE before we fully init. + * So, do not dispatch before we continuously resizing. */ + if (window->m_inLiveResize) { + system->pushEvent(processWindowEvent(GHOST_kEventWindowSize, window)); + system->dispatchEvents(); } - else if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED) { - window->setWintabEnabled(true); + else { + event = processWindowEvent(GHOST_kEventWindowSize, window); } - break; case WM_CAPTURECHANGED: window->lostMouseCapture(); @@ -1926,12 +1798,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, SWP_NOZORDER | SWP_NOACTIVATE); } break; - case WM_DISPLAYCHANGE: - for (GHOST_IWindow *iter_win : system->getWindowManager()->getWindows()) { - GHOST_WindowWin32 *iter_win32win = (GHOST_WindowWin32 *)iter_win; - iter_win32win->processWintabDisplayChangeEvent(); - } - break; //////////////////////////////////////////////////////////////////////// // Window events, ignored //////////////////////////////////////////////////////////////////////// diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 8ae0b0927c3..86c443bb1c7 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -64,8 +64,6 @@ class GHOST_SystemWin32 : public GHOST_System { ** Time(r) functionality ***************************************************************************************/ - GHOST_TUns64 millisSinceStart(__int64 ms) const; - /** * This method converts performance counter measurements into milliseconds since the start of the * system process. @@ -267,16 +265,6 @@ class GHOST_SystemWin32 : public GHOST_System { int mouseY, void *data); - /*************************************************************************************** - ** Modify tablet API - ***************************************************************************************/ - - /** - * Set which tablet API to use. - * \param api: Enum indicating which API to use. - */ - void setTabletAPI(GHOST_TTabletAPI api) override; - protected: /** * Initializes the system. @@ -368,13 +356,6 @@ class GHOST_SystemWin32 : public GHOST_System { */ GHOST_TKey processSpecialKey(short vKey, short scanCode) const; - /** - * Creates a window size event. - * \param window: The window receiving the event (the active window). - * \return The event created. - */ - static GHOST_Event *processWindowSizeEvent(GHOST_WindowWin32 *window); - /** * Creates a window event. * \param type: The type of event to create. diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 255d487649b..f443fc3153f 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -72,7 +72,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, bool is_debug, bool dialog) : GHOST_Window(width, height, state, wantStereoVisual, false), - m_mousePresent(false), m_tabletInRange(false), m_inLiveResize(false), m_system(system), @@ -82,7 +81,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_nPressedButtons(0), m_customCursor(0), m_wantAlphaBackground(alphaBackground), - m_wintab(), m_normal_state(GHOST_kWindowStateNormal), m_user32(NULL), m_fpGetPointerInfoHistory(NULL), @@ -91,6 +89,10 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_parentWindowHwnd(parentwindow ? parentwindow->m_hWnd : NULL), m_debug_context(is_debug) { + // Initialize tablet variables + memset(&m_wintab, 0, sizeof(m_wintab)); + m_tabletData = GHOST_TABLET_DATA_NONE; + // Create window if (state != GHOST_kWindowStateFullScreen) { RECT rect; @@ -295,24 +297,68 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_user32, "GetPointerTouchInfoHistory"); } - if ((m_wintab.handle = ::LoadLibrary("Wintab32.dll")) && - (m_wintab.info = (GHOST_WIN32_WTInfo)::GetProcAddress(m_wintab.handle, "WTInfoA")) && - (m_wintab.open = (GHOST_WIN32_WTOpen)::GetProcAddress(m_wintab.handle, "WTOpenA")) && - (m_wintab.get = (GHOST_WIN32_WTGet)::GetProcAddress(m_wintab.handle, "WTGetA")) && - (m_wintab.set = (GHOST_WIN32_WTSet)::GetProcAddress(m_wintab.handle, "WTSetA")) && - (m_wintab.close = (GHOST_WIN32_WTClose)::GetProcAddress(m_wintab.handle, "WTClose")) && - (m_wintab.packetsGet = (GHOST_WIN32_WTPacketsGet)::GetProcAddress(m_wintab.handle, - "WTPacketsGet")) && - (m_wintab.queueSizeGet = (GHOST_WIN32_WTQueueSizeGet)::GetProcAddress(m_wintab.handle, - "WTQueueSizeGet")) && - (m_wintab.queueSizeSet = (GHOST_WIN32_WTQueueSizeSet)::GetProcAddress(m_wintab.handle, - "WTQueueSizeSet")) && - (m_wintab.enable = (GHOST_WIN32_WTEnable)::GetProcAddress(m_wintab.handle, "WTEnable")) && - (m_wintab.overlap = (GHOST_WIN32_WTOverlap)::GetProcAddress(m_wintab.handle, "WTOverlap"))) { - initializeWintab(); - setWintabEnabled(true); - } + // Initialize Wintab + m_wintab.handle = ::LoadLibrary("Wintab32.dll"); + if (m_wintab.handle && m_system->getTabletAPI() != GHOST_kTabletNative) { + // Get API functions + m_wintab.info = (GHOST_WIN32_WTInfo)::GetProcAddress(m_wintab.handle, "WTInfoA"); + m_wintab.open = (GHOST_WIN32_WTOpen)::GetProcAddress(m_wintab.handle, "WTOpenA"); + m_wintab.close = (GHOST_WIN32_WTClose)::GetProcAddress(m_wintab.handle, "WTClose"); + m_wintab.packet = (GHOST_WIN32_WTPacket)::GetProcAddress(m_wintab.handle, "WTPacket"); + m_wintab.enable = (GHOST_WIN32_WTEnable)::GetProcAddress(m_wintab.handle, "WTEnable"); + m_wintab.overlap = (GHOST_WIN32_WTOverlap)::GetProcAddress(m_wintab.handle, "WTOverlap"); + // Let's see if we can initialize tablet here. + // Check if WinTab available by getting system context info. + LOGCONTEXT lc = {0}; + lc.lcOptions |= CXO_SYSTEM; + if (m_wintab.open && m_wintab.info && m_wintab.info(WTI_DEFSYSCTX, 0, &lc)) { + // Now init the tablet + /* The maximum tablet size, pressure and orientation (tilt) */ + AXIS TabletX, TabletY, Pressure, Orientation[3]; + + // Open a Wintab context + + // Open the context + lc.lcPktData = PACKETDATA; + lc.lcPktMode = PACKETMODE; + lc.lcOptions |= CXO_MESSAGES; + lc.lcMoveMask = PACKETDATA; + + /* Set the entire tablet as active */ + m_wintab.info(WTI_DEVICES, DVC_X, &TabletX); + m_wintab.info(WTI_DEVICES, DVC_Y, &TabletY); + + /* get the max pressure, to divide into a float */ + BOOL pressureSupport = m_wintab.info(WTI_DEVICES, DVC_NPRESSURE, &Pressure); + if (pressureSupport) + m_wintab.maxPressure = Pressure.axMax; + else + m_wintab.maxPressure = 0; + + /* get the max tilt axes, to divide into floats */ + BOOL tiltSupport = m_wintab.info(WTI_DEVICES, DVC_ORIENTATION, &Orientation); + if (tiltSupport) { + /* does the tablet support azimuth ([0]) and altitude ([1]) */ + if (Orientation[0].axResolution && Orientation[1].axResolution) { + /* all this assumes the minimum is 0 */ + m_wintab.maxAzimuth = Orientation[0].axMax; + m_wintab.maxAltitude = Orientation[1].axMax; + } + else { /* no so dont do tilt stuff */ + m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + } + } + + // The Wintab spec says we must open the context disabled if we are using cursor masks. + m_wintab.tablet = m_wintab.open(m_hWnd, &lc, FALSE); + if (m_wintab.enable && m_wintab.tablet) { + m_wintab.enable(m_wintab.tablet, TRUE); + } + + m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); + } + } CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (LPVOID *)&m_Bar); } @@ -326,12 +372,12 @@ GHOST_WindowWin32::~GHOST_WindowWin32() } if (m_wintab.handle) { - setWintabEnabled(false); - if (m_wintab.close && m_wintab.context) { - m_wintab.close(m_wintab.context); + if (m_wintab.close && m_wintab.tablet) { + m_wintab.close(m_wintab.tablet); } FreeLibrary(m_wintab.handle); + memset(&m_wintab, 0, sizeof(m_wintab)); } if (m_user32) { @@ -973,62 +1019,6 @@ GHOST_TSuccess GHOST_WindowWin32::hasCursorShape(GHOST_TStandardCursor cursorSha return (getStandardCursor(cursorShape)) ? GHOST_kSuccess : GHOST_kFailure; } -void GHOST_WindowWin32::initializeWintab() -{ - /* Return if wintab library handle doesn't exist or wintab is already initialized. */ - if (!m_wintab.handle || m_wintab.context) { - return; - } - - /* Check if WinTab available by getting system context info. */ - LOGCONTEXT lc = {0}; - if (m_wintab.open && m_wintab.info && m_wintab.queueSizeGet && m_wintab.queueSizeSet && - m_wintab.info(WTI_DEFSYSCTX, 0, &lc)) { - - lc.lcPktData = PACKETDATA; - lc.lcPktMode = PACKETMODE; - lc.lcMoveMask = PACKETDATA; - lc.lcOptions |= CXO_CSRMESSAGES | CXO_MESSAGES; - /* Wacom maps y origin to the tablet's bottom. Invert to match Windows y origin mapping to the - * screen top. */ - lc.lcOutExtY = -lc.lcOutExtY; - - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - - updateWintabCursorInfo(); - - /* The Wintab spec says we must open the context disabled if we are using cursor masks. */ - m_wintab.context = m_wintab.open(m_hWnd, &lc, FALSE); - - /* Wintab provides no way to determine the maximum queue size aside from checking if attempts - * to change the queue size are successful. */ - const int maxQueue = 500; - int queueSize = m_wintab.queueSizeGet(m_wintab.context); - - while (queueSize < maxQueue) { - int testSize = min(queueSize + 16, maxQueue); - if (m_wintab.queueSizeSet(m_wintab.context, testSize)) { - queueSize = testSize; - } - else { - /* From Windows Wintab Documentation for WTQueueSizeSet: - * "If the return value is zero, the context has no queue because the function deletes the - * original queue before attempting to create a new one. The application must continue - * calling the function with a smaller queue size until the function returns a non - zero - * value." - * - * In our case we start with a known valid queue size and in the event of failure roll - * back to the last valid queue size. The Wintab spec dates back to 16 bit Windows, thus - * assumes memory recently deallocated may not be available, which is no longer a practical - * concern. */ - m_wintab.queueSizeSet(m_wintab.context, queueSize); - break; - } - } - m_wintab.pkts.resize(queueSize); - } -} - GHOST_TSuccess GHOST_WindowWin32::getPointerInfo( std::vector &outPointerInfo, WPARAM wParam, LPARAM lParam) { @@ -1108,85 +1098,24 @@ GHOST_TSuccess GHOST_WindowWin32::getPointerInfo( } } - if (!outPointerInfo.empty()) { - lastTabletData = outPointerInfo.back().tabletData; - } - return GHOST_kSuccess; } -void GHOST_WindowWin32::setWintabEnabled(bool enable) +void GHOST_WindowWin32::processWin32TabletActivateEvent(WORD state) { - if (m_wintab.enable && m_wintab.get && m_wintab.context) { - LOGCONTEXT context = {0}; - - if (m_wintab.get(m_wintab.context, &context)) { - if (enable && context.lcStatus & CXS_DISABLED && useTabletAPI(GHOST_kTabletWintab)) { - m_wintab.enable(m_wintab.context, true); - - POINT cursorPos; - ::GetCursorPos(&cursorPos); - GHOST_Rect bounds; - getClientBounds(bounds); - if (bounds.isInside(cursorPos.x, cursorPos.y)) { - setWintabOverlap(true); - } - } - else if (!enable && !(context.lcStatus & CXS_DISABLED)) { - setWintabOverlap(false); - m_wintab.enable(m_wintab.context, false); - } - } + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; } -} -void GHOST_WindowWin32::setWintabOverlap(bool overlap) -{ - if (m_wintab.overlap && m_wintab.get && m_wintab.packetsGet && m_wintab.context) { - LOGCONTEXT context = {0}; + if (m_wintab.enable && m_wintab.tablet) { + m_wintab.enable(m_wintab.tablet, state); - if (m_wintab.get(m_wintab.context, &context)) { - if (overlap && context.lcStatus & CXS_OBSCURED && useTabletAPI(GHOST_kTabletWintab)) { - m_wintab.overlap(m_wintab.context, true); - } - else if (!overlap && context.lcStatus & CXS_ONTOP) { - m_wintab.overlap(m_wintab.context, false); - - /* If context is disabled, Windows Ink may be active and managing m_tabletInRange. Don't - * modify it. */ - if (!(context.lcStatus & CXS_DISABLED)) { - processWintabLeave(); - } - } + if (m_wintab.overlap && state) { + m_wintab.overlap(m_wintab.tablet, TRUE); } } } -void GHOST_WindowWin32::processWintabLeave() -{ - m_tabletInRange = false; - m_wintab.buttons = 0; - /* Clear the packet queue. */ - m_wintab.packetsGet(m_wintab.context, m_wintab.pkts.size(), m_wintab.pkts.data()); -} - -void GHOST_WindowWin32::processWintabDisplayChangeEvent() -{ - LOGCONTEXT lc_sys = {0}, lc_curr = {0}; - - if (m_wintab.info && m_wintab.get && m_wintab.set && m_wintab.info(WTI_DEFSYSCTX, 0, &lc_sys)) { - - m_wintab.get(m_wintab.context, &lc_curr); - - lc_curr.lcOutOrgX = lc_sys.lcOutOrgX; - lc_curr.lcOutOrgY = lc_sys.lcOutOrgY; - lc_curr.lcOutExtX = lc_sys.lcOutExtX; - lc_curr.lcOutExtY = -lc_sys.lcOutExtY; - - m_wintab.set(m_wintab.context, &lc_curr); - } -} - bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const { if (m_system->getTabletAPI() == api) { @@ -1203,24 +1132,36 @@ bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const } } -void GHOST_WindowWin32::updateWintabCursorInfo() +void GHOST_WindowWin32::processWin32TabletInitEvent() { - if (m_wintab.info && m_wintab.context) { - AXIS Pressure, Orientation[3]; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; + } + + // Let's see if we can initialize tablet here + if (m_wintab.info && m_wintab.tablet) { + AXIS Pressure, Orientation[3]; /* The maximum tablet size */ BOOL pressureSupport = m_wintab.info(WTI_DEVICES, DVC_NPRESSURE, &Pressure); - m_wintab.maxPressure = pressureSupport ? Pressure.axMax : 0; + if (pressureSupport) + m_wintab.maxPressure = Pressure.axMax; + else + m_wintab.maxPressure = 0; BOOL tiltSupport = m_wintab.info(WTI_DEVICES, DVC_ORIENTATION, &Orientation); - /* Does the tablet support azimuth ([0]) and altitude ([1]). */ - if (tiltSupport && Orientation[0].axResolution && Orientation[1].axResolution) { - m_wintab.maxAzimuth = Orientation[0].axMax; - m_wintab.maxAltitude = Orientation[1].axMax; - } - else { - m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + if (tiltSupport) { + /* does the tablet support azimuth ([0]) and altitude ([1]) */ + if (Orientation[0].axResolution && Orientation[1].axResolution) { + m_wintab.maxAzimuth = Orientation[0].axMax; + m_wintab.maxAltitude = Orientation[1].axMax; + } + else { /* no so dont do tilt stuff */ + m_wintab.maxAzimuth = m_wintab.maxAltitude = 0; + } } } + + m_tabletData.Active = GHOST_kTabletModeNone; } void GHOST_WindowWin32::processWintabInfoChangeEvent(LPARAM lParam) @@ -1228,151 +1169,86 @@ void GHOST_WindowWin32::processWintabInfoChangeEvent(LPARAM lParam) /* Update number of connected Wintab digitizers */ if (LOWORD(lParam) == WTI_INTERFACE && HIWORD(lParam) == IFC_NDEVICES) { m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - if (useTabletAPI(GHOST_kTabletWintab)) { - setWintabEnabled(true); - } } } -GHOST_TButtonMask GHOST_WindowWin32::wintabMouseToGhost(UINT cursor, WORD physicalButton) +void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) { - const WORD numButtons = 32; - BYTE logicalButtons[numButtons] = {0}; - BYTE systemButtons[numButtons] = {0}; - - m_wintab.info(WTI_CURSORS + cursor, CSR_BUTTONMAP, &logicalButtons); - m_wintab.info(WTI_CURSORS + cursor, CSR_SYSBTNMAP, &systemButtons); - - if (physicalButton >= numButtons) { - return GHOST_kButtonMaskNone; - } - BYTE lb = logicalButtons[physicalButton]; - - if (lb >= numButtons) { - return GHOST_kButtonMaskNone; - } - switch (systemButtons[lb]) { - case SBN_LCLICK: - return GHOST_kButtonMaskLeft; - case SBN_RCLICK: - return GHOST_kButtonMaskRight; - case SBN_MCLICK: - return GHOST_kButtonMaskMiddle; - default: - return GHOST_kButtonMaskNone; - } -} - -GHOST_TSuccess GHOST_WindowWin32::getWintabInfo(std::vector &outWintabInfo) -{ - if (!(useTabletAPI(GHOST_kTabletWintab) && m_wintab.packetsGet && m_wintab.context)) { - return GHOST_kFailure; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; } - GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)GHOST_System::getSystem(); - - const int numPackets = m_wintab.packetsGet( - m_wintab.context, m_wintab.pkts.size(), m_wintab.pkts.data()); - outWintabInfo.resize(numPackets); - - for (int i = 0; i < numPackets; i++) { - PACKET pkt = m_wintab.pkts[i]; - GHOST_WintabInfoWin32 &out = outWintabInfo[i]; - - out.tabletData = GHOST_TABLET_DATA_NONE; - /* % 3 for multiple devices ("DualTrack"). */ - switch (pkt.pkCursor % 3) { - case 0: - /* Puck - processed as mouse. */ - out.tabletData.Active = GHOST_kTabletModeNone; - break; - case 1: - out.tabletData.Active = GHOST_kTabletModeStylus; - break; - case 2: - out.tabletData.Active = GHOST_kTabletModeEraser; - break; - } - - out.x = pkt.pkX; - out.y = pkt.pkY; - - if (m_wintab.maxPressure > 0) { - out.tabletData.Pressure = (float)pkt.pkNormalPressure / (float)m_wintab.maxPressure; - } - - if ((m_wintab.maxAzimuth > 0) && (m_wintab.maxAltitude > 0)) { - ORIENTATION ort = pkt.pkOrientation; - float vecLen; - float altRad, azmRad; /* In radians. */ - - /* - * From the wintab spec: - * orAzimuth: Specifies the clockwise rotation of the cursor about the z axis through a - * full circular range. - * orAltitude: Specifies the angle with the x-y plane through a signed, semicircular range. - * Positive values specify an angle upward toward the positive z axis; negative values - * specify an angle downward toward the negative z axis. - * - * wintab.h defines orAltitude as a UINT but documents orAltitude as positive for upward - * angles and negative for downward angles. WACOM uses negative altitude values to show that - * the pen is inverted; therefore we cast orAltitude as an (int) and then use the absolute - * value. - */ - - /* Convert raw fixed point data to radians. */ - altRad = (float)((fabs((float)ort.orAltitude) / (float)m_wintab.maxAltitude) * M_PI / 2.0); - azmRad = (float)(((float)ort.orAzimuth / (float)m_wintab.maxAzimuth) * M_PI * 2.0); - - /* Find length of the stylus' projected vector on the XY plane. */ - vecLen = cos(altRad); - - /* From there calculate X and Y components based on azimuth. */ - out.tabletData.Xtilt = sin(azmRad) * vecLen; - out.tabletData.Ytilt = (float)(sin(M_PI / 2.0 - azmRad) * vecLen); - } - - /* Some Wintab libraries don't handle relative button input, so we track button presses - * manually. */ - out.button = GHOST_kButtonMaskNone; - out.type = GHOST_kEventCursorMove; - - DWORD buttonsChanged = m_wintab.buttons ^ pkt.pkButtons; - if (buttonsChanged) { - /* Find the index for the changed button from the button map. */ - WORD physicalButton = 0; - for (DWORD diff = (unsigned)buttonsChanged >> 1; diff > 0; diff = (unsigned)diff >> 1) { - physicalButton++; + if (m_wintab.packet && m_wintab.tablet) { + PACKET pkt; + if (m_wintab.packet((HCTX)lParam, wParam, &pkt)) { + switch (pkt.pkCursor % 3) { /* % 3 for multiple devices ("DualTrack") */ + case 0: + m_tabletData.Active = GHOST_kTabletModeNone; /* puck - not yet supported */ + break; + case 1: + m_tabletData.Active = GHOST_kTabletModeStylus; /* stylus */ + break; + case 2: + m_tabletData.Active = GHOST_kTabletModeEraser; /* eraser */ + break; } - out.button = wintabMouseToGhost(pkt.pkCursor, physicalButton); - - if (out.button != GHOST_kButtonMaskNone) { - if (buttonsChanged & pkt.pkButtons) { - out.type = GHOST_kEventButtonDown; - } - else { - out.type = GHOST_kEventButtonUp; - } + if (m_wintab.maxPressure > 0) { + m_tabletData.Pressure = (float)pkt.pkNormalPressure / (float)m_wintab.maxPressure; + } + else { + m_tabletData.Pressure = 1.0f; } - /* Only update handled button, in case multiple button events arrived simultaneously. */ - m_wintab.buttons ^= 1 << physicalButton; + if ((m_wintab.maxAzimuth > 0) && (m_wintab.maxAltitude > 0)) { + ORIENTATION ort = pkt.pkOrientation; + float vecLen; + float altRad, azmRad; /* in radians */ + + /* + * from the wintab spec: + * orAzimuth Specifies the clockwise rotation of the + * cursor about the z axis through a full circular range. + * + * orAltitude Specifies the angle with the x-y plane + * through a signed, semicircular range. Positive values + * specify an angle upward toward the positive z axis; + * negative values specify an angle downward toward the negative z axis. + * + * wintab.h defines .orAltitude as a UINT but documents .orAltitude + * as positive for upward angles and negative for downward angles. + * WACOM uses negative altitude values to show that the pen is inverted; + * therefore we cast .orAltitude as an (int) and then use the absolute value. + */ + + /* convert raw fixed point data to radians */ + altRad = (float)((fabs((float)ort.orAltitude) / (float)m_wintab.maxAltitude) * M_PI / 2.0); + azmRad = (float)(((float)ort.orAzimuth / (float)m_wintab.maxAzimuth) * M_PI * 2.0); + + /* find length of the stylus' projected vector on the XY plane */ + vecLen = cos(altRad); + + /* from there calculate X and Y components based on azimuth */ + m_tabletData.Xtilt = sin(azmRad) * vecLen; + m_tabletData.Ytilt = (float)(sin(M_PI / 2.0 - azmRad) * vecLen); + } + else { + m_tabletData.Xtilt = 0.0f; + m_tabletData.Ytilt = 0.0f; + } } - - out.time = system->tickCountToMillis(pkt.pkTime); } - - if (!outWintabInfo.empty()) { - lastTabletData = outWintabInfo.back().tabletData; - } - - return GHOST_kSuccess; } -GHOST_TabletData GHOST_WindowWin32::getLastTabletData() +void GHOST_WindowWin32::bringTabletContextToFront() { - return lastTabletData; + if (!useTabletAPI(GHOST_kTabletWintab)) { + return; + } + + if (m_wintab.overlap && m_wintab.tablet) { + m_wintab.overlap(m_wintab.tablet, TRUE); + } } GHOST_TUns16 GHOST_WindowWin32::getDPIHint() diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index a7e7cdc6602..c65f6a3319f 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -34,14 +34,12 @@ # include "GHOST_ImeWin32.h" #endif -#include #include #include // PACKETDATA and PACKETMODE modify structs in pktdef.h, so make sure they come first -#define PACKETDATA \ - (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR | PK_X | PK_Y | PK_TIME) -#define PACKETMODE 0 +#define PACKETDATA (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR) +#define PACKETMODE PK_BUTTONS #include class GHOST_SystemWin32; @@ -49,13 +47,9 @@ class GHOST_DropTargetWin32; // typedefs for WinTab functions to allow dynamic loading typedef UINT(API *GHOST_WIN32_WTInfo)(UINT, UINT, LPVOID); -typedef BOOL(API *GHOST_WIN32_WTGet)(HCTX, LPLOGCONTEXTA); -typedef BOOL(API *GHOST_WIN32_WTSet)(HCTX, LPLOGCONTEXTA); typedef HCTX(API *GHOST_WIN32_WTOpen)(HWND, LPLOGCONTEXTA, BOOL); typedef BOOL(API *GHOST_WIN32_WTClose)(HCTX); -typedef int(API *GHOST_WIN32_WTPacketsGet)(HCTX, int, LPVOID); -typedef int(API *GHOST_WIN32_WTQueueSizeGet)(HCTX); -typedef BOOL(API *GHOST_WIN32_WTQueueSizeSet)(HCTX, int); +typedef BOOL(API *GHOST_WIN32_WTPacket)(HCTX, UINT, LPVOID); typedef BOOL(API *GHOST_WIN32_WTEnable)(HCTX, BOOL); typedef BOOL(API *GHOST_WIN32_WTOverlap)(HCTX, BOOL); @@ -236,14 +230,7 @@ struct GHOST_PointerInfoWin32 { GHOST_TButtonMask buttonMask; POINT pixelLocation; GHOST_TUns64 time; - GHOST_TabletData tabletData; -}; -struct GHOST_WintabInfoWin32 { - GHOST_TInt32 x, y; - GHOST_TEventType type; - GHOST_TButtonMask button; - GHOST_TUns64 time; GHOST_TabletData tabletData; }; @@ -437,6 +424,11 @@ class GHOST_WindowWin32 : public GHOST_Window { HCURSOR getStandardCursor(GHOST_TStandardCursor shape) const; void loadCursor(bool visible, GHOST_TStandardCursor cursorShape) const; + const GHOST_TabletData &getTabletData() + { + return m_tabletData; + } + /** * Query whether given tablet API should be used. * \param api: Tablet API to test. @@ -454,51 +446,16 @@ class GHOST_WindowWin32 : public GHOST_Window { WPARAM wParam, LPARAM lParam); - /** - * Enables or disables Wintab context. - * \param enable: Whether the context should be enabled. - */ - void setWintabEnabled(bool enable); - - /** - * Changes Wintab context overlap. - * \param overlap: Whether context should be brought to top of overlap order. - */ - void setWintabOverlap(bool overlap); - - /** - * Resets Wintab state. - */ - void processWintabLeave(); - - /** - * Handle Wintab coordinate changes when DisplayChange events occur. - */ - void processWintabDisplayChangeEvent(); - - /** - * Updates cached Wintab properties for current cursor. - */ - void updateWintabCursorInfo(); - /** * Handle Wintab info changes such as change in number of connected tablets. * \param lParam: LPARAM of the event. */ void processWintabInfoChangeEvent(LPARAM lParam); - /** - * Translate Wintab packets into GHOST_WintabInfoWin32 structs. - * \param outWintabInfo: Storage to return resulting GHOST_WintabInfoWin32 structs. - * \return Success if able to read packets, even if there are none. - */ - GHOST_TSuccess getWintabInfo(std::vector &outWintabInfo); - - /** - * Get the most recent tablet data. - * \return Most recent tablet data. - */ - GHOST_TabletData getLastTabletData(); + void processWin32TabletActivateEvent(WORD state); + void processWin32TabletInitEvent(); + void processWin32TabletEvent(WPARAM wParam, LPARAM lParam); + void bringTabletContextToFront(); GHOST_TSuccess beginFullScreen() const { @@ -512,9 +469,6 @@ class GHOST_WindowWin32 : public GHOST_Window { GHOST_TUns16 getDPIHint() override; - /** Whether the mouse is either over or captured by the window. */ - bool m_mousePresent; - /** Whether a tablet stylus is being tracked. */ bool m_tabletInRange; @@ -598,51 +552,29 @@ class GHOST_WindowWin32 : public GHOST_Window { static const wchar_t *s_windowClassName; static const int s_maxTitleLength; + /** Tablet data for GHOST */ + GHOST_TabletData m_tabletData; + /* Wintab API */ struct { /** WinTab dll handle */ - HMODULE handle = NULL; + HMODULE handle; /** API functions */ - GHOST_WIN32_WTInfo info = NULL; - GHOST_WIN32_WTGet get = NULL; - GHOST_WIN32_WTSet set = NULL; - GHOST_WIN32_WTOpen open = NULL; - GHOST_WIN32_WTClose close = NULL; - GHOST_WIN32_WTPacketsGet packetsGet = NULL; - GHOST_WIN32_WTQueueSizeGet queueSizeGet = NULL; - GHOST_WIN32_WTQueueSizeSet queueSizeSet = NULL; - GHOST_WIN32_WTEnable enable = NULL; - GHOST_WIN32_WTOverlap overlap = NULL; + GHOST_WIN32_WTInfo info; + GHOST_WIN32_WTOpen open; + GHOST_WIN32_WTClose close; + GHOST_WIN32_WTPacket packet; + GHOST_WIN32_WTEnable enable; + GHOST_WIN32_WTOverlap overlap; - /** Stores the Tablet context if detected Tablet features using WinTab.dll. */ - HCTX context = NULL; - /** Number of connected Wintab digitizers. */ - UINT numDevices = 0; - /** Pressed button map. */ - GHOST_TUns8 buttons = 0; - LONG maxPressure = 0; - LONG maxAzimuth = 0, maxAltitude = 0; - /** Reusable buffer to read in Wintab Packets. */ - std::vector pkts; + /** Stores the Tablet context if detected Tablet features using WinTab.dll */ + HCTX tablet; + LONG maxPressure; + LONG maxAzimuth, maxAltitude; + UINT numDevices; } m_wintab; - /** Most recent tablet data. */ - GHOST_TabletData lastTabletData = GHOST_TABLET_DATA_NONE; - - /** - * Wintab setup. - */ - void initializeWintab(); - - /** - * Convert Wintab system mapped (mouse) buttons into Ghost button mask. - * \param cursor: The Wintab cursor associated to the button. - * \param physicalButton: The physical button ID to inspect. - * \return The system mapped button. - */ - GHOST_TButtonMask wintabMouseToGhost(UINT cursor, WORD physicalButton); - GHOST_TWindowState m_normal_state; /** user32 dll handle*/ diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 8a836eb7376..2994de69f1a 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -5824,8 +5824,10 @@ static void rna_def_userdef_input(BlenderRNA *brna) prop = RNA_def_property(srna, "tablet_api", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, tablet_api); - RNA_def_property_ui_text( - prop, "Tablet API", "Select the tablet API to use for pressure sensitivity"); + RNA_def_property_ui_text(prop, + "Tablet API", + "Select the tablet API to use for pressure sensitivity (may require " + "restarting Blender for changes to take effect)"); RNA_def_property_update(prop, 0, "rna_userdef_tablet_api_update"); # ifdef WITH_INPUT_NDOF From 36814ddc94b56a66675b854bc0d7485828ddcd31 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 16 Feb 2021 08:59:17 +0100 Subject: [PATCH 200/519] Workbench: Improve AntiAliasing sampling This improves stability and convergence speed of Workbench Temporal AntiAliasing. This adds a filtering kernel (blackmann-haris, same as EEVEE/Cycles) to the temporal antialiasing sampling. We also gather neighbor pixels since they might end up in the pixel footprint. We use a 1px radius for the filter window which is a bit less than the 1.5 default of cycles and EEVEE since it does blur quite a bit more than what we have now. Another improvement is that the filtering is now in log space which improves AntiAliasing around highlights. Theses improvement may not be very useful for every day case but it was an experiment to try to make TAA usable for GPencil. Test file used : {F9798807} |filtered+logspace|filtered|original| |{F9798847}|{F9798848}|{F9798849}| Reviewed By: jbakker Differential Revision: https://developer.blender.org/D10414 --- .../shaders/workbench_effect_smaa_frag.glsl | 10 +++- .../shaders/workbench_effect_taa_frag.glsl | 17 +++++-- .../workbench/workbench_effect_antialiasing.c | 46 +++++++++++++++++-- .../engines/workbench/workbench_private.h | 9 +++- 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl index 2dea2fc4883..9797a5e3301 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl @@ -5,7 +5,7 @@ uniform sampler2D searchTex; uniform sampler2D blendTex; uniform sampler2D colorTex; uniform float mixFactor; -uniform float taaSampleCountInv; +uniform float taaAccumulatedWeight; in vec2 uvs; in vec2 pixcoord; @@ -39,6 +39,12 @@ void main() if (mixFactor < 1.0) { fragColor += texture(colorTex, uvs) * (1.0 - mixFactor); } - fragColor *= taaSampleCountInv; + fragColor /= taaAccumulatedWeight; + fragColor = exp2(fragColor) - 0.5; + + /* Avoid float precision issue. */ + if (fragColor.a > 0.999) { + fragColor.a = 1.0; + } #endif } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl index b877c2c3f76..d021e4696f7 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl @@ -1,11 +1,22 @@ uniform sampler2D colorBuffer; - -in vec4 uvcoordsvar; +uniform float samplesWeights[9]; out vec4 fragColor; void main() { - fragColor = texture(colorBuffer, uvcoordsvar.st); + vec2 texel_size = 1.0 / vec2(textureSize(colorBuffer, 0)); + vec2 uv = gl_FragCoord.xy * texel_size; + + fragColor = vec4(0.0); + int i = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++, i++) { + /* Use log2 space to avoid highlights creating too much aliasing. */ + vec4 color = log2(texture(colorBuffer, uv + vec2(x, y) * texel_size) + 0.5); + + fragColor += color * samplesWeights[i]; + } + } } diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index feb48b2623d..83aa7f6e344 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -264,6 +264,37 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata) } } +static float filter_blackman_harris(float x, const float width) +{ + if (x > width * 0.5f) { + return 0.0f; + } + x = 2.0f * M_PI * clamp_f((x / width + 0.5f), 0.0f, 1.0f); + return 0.35875f - 0.48829f * cosf(x) + 0.14128f * cosf(2.0f * x) - 0.01168f * cosf(3.0f * x); +} + +/* Compute weights for the 3x3 neighborhood using a 1.5px filter. */ +static void workbench_antialiasing_weights_get(const float offset[2], + float r_weights[9], + float *r_weight_sum) +{ + /* NOTE: If filter width is bigger than 2.0f, then we need to sample more neighborhood. */ + const float filter_width = 2.0f; + *r_weight_sum = 0.0f; + int i = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++, i++) { + float sample_co[2] = {x, y}; + add_v2_v2(sample_co, offset); + float r = len_v2(sample_co); + /* fclem: is radial distance ok here? */ + float weight = filter_blackman_harris(r, filter_width); + *r_weight_sum += weight; + r_weights[i] = weight; + } + } +} + void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) { WORKBENCH_TextureList *txl = vedata->txl; @@ -278,10 +309,12 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) { DRW_PASS_CREATE(psl->aa_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); + DRW_PASS_INSTANCE_CREATE(psl->aa_accum_replace_ps, psl->aa_accum_ps, DRW_STATE_WRITE_COLOR); GPUShader *shader = workbench_shader_antialiasing_accumulation_get(); grp = DRW_shgroup_create(shader, psl->aa_accum_ps); - DRW_shgroup_uniform_texture(grp, "colorBuffer", dtxl->color); + DRW_shgroup_uniform_texture_ex(grp, "colorBuffer", dtxl->color, GPU_SAMPLER_DEFAULT); + DRW_shgroup_uniform_float(grp, "samplesWeights", wpd->taa_weights, 9); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } @@ -325,7 +358,7 @@ void workbench_antialiasing_cache_init(WORKBENCH_Data *vedata) DRW_shgroup_uniform_texture(grp, "colorTex", txl->history_buffer_tx); DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics); DRW_shgroup_uniform_float(grp, "mixFactor", &wpd->smaa_mix_factor, 1); - DRW_shgroup_uniform_float(grp, "taaSampleCountInv", &wpd->taa_sample_inv, 1); + DRW_shgroup_uniform_float(grp, "taaAccumulatedWeight", &wpd->taa_weight_accum, 1); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } @@ -369,6 +402,8 @@ bool workbench_antialiasing_setup(WORKBENCH_Data *vedata) break; } + workbench_antialiasing_weights_get(transform_offset, wpd->taa_weights, &wpd->taa_weights_sum); + /* construct new matrices from transform delta */ float winmat[4][4], viewmat[4][4], persmat[4][4]; DRW_view_winmat_get(default_view, winmat, false); @@ -419,8 +454,11 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) const bool last_sample = wpd->taa_sample + 1 == wpd->taa_sample_len; const bool taa_finished = wpd->taa_sample >= wpd->taa_sample_len; if (wpd->taa_sample == 0) { + wpd->taa_weight_accum = wpd->taa_weights_sum; wpd->valid_history = true; - GPU_texture_copy(txl->history_buffer_tx, dtxl->color); + + GPU_framebuffer_bind(fbl->antialiasing_fb); + DRW_draw_pass(psl->aa_accum_replace_ps); /* In playback mode, we are sure the next redraw will not use the same viewmatrix. * In this case no need to save the depth buffer. */ if (!wpd->is_playback) { @@ -435,6 +473,7 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) /* Accumulate result to the TAA buffer. */ GPU_framebuffer_bind(fbl->antialiasing_fb); DRW_draw_pass(psl->aa_accum_ps); + wpd->taa_weight_accum += wpd->taa_weights_sum; } /* Copy back the saved depth buffer for correct overlays. */ GPU_texture_copy(dtxl->depth, txl->depth_buffer_tx); @@ -446,7 +485,6 @@ void workbench_antialiasing_draw_pass(WORKBENCH_Data *vedata) if (!DRW_state_is_image_render() || last_sample) { /* After a certain point SMAA is no longer necessary. */ wpd->smaa_mix_factor = 1.0f - clamp_f(wpd->taa_sample / 4.0f, 0.0f, 1.0f); - wpd->taa_sample_inv = 1.0f / min_ii(wpd->taa_sample + 1, wpd->taa_sample_len); if (wpd->smaa_mix_factor > 0.0f) { GPU_framebuffer_bind(fbl->smaa_edge_fb); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 522aae7f542..6247436feea 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -164,6 +164,7 @@ typedef struct WORKBENCH_PassList { struct DRWPass *volume_ps; struct DRWPass *aa_accum_ps; + struct DRWPass *aa_accum_replace_ps; struct DRWPass *aa_edge_ps; struct DRWPass *aa_weight_ps; struct DRWPass *aa_resolve_ps; @@ -286,8 +287,12 @@ typedef struct WORKBENCH_PrivateData { int taa_sample_len_previous; /** Current TAA sample index in [0..taa_sample_len[ range. */ int taa_sample; - /** Inverse of taa_sample to divide the accumulation buffer. */ - float taa_sample_inv; + /** Weight accumulated. */ + float taa_weight_accum; + /** Samples weight for this iteration. */ + float taa_weights[9]; + /** Sum of taa_weights. */ + float taa_weights_sum; /** If the view has been updated and TAA needs to be reset. */ bool view_updated; /** True if the history buffer contains relevant data and false if it could contain garbage. */ From a059f072741d671ad882c44e93f6f62bb38f27d8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Feb 2021 19:53:24 +1100 Subject: [PATCH 201/519] Fix add-on & app-template installation logic for overwriting modules The logic to remove one Python module before installing another only worked in simple cases where a file replaced a file. - Installing a single file add-on over a Python package with the same name caused an error as the directory isn't empty. - Removing existing module directories from the zip-file did nothing as the directories from the zip-file that end with a slash were compared with directories from `os.listdir` that don't. - `module_filesystem_remove` assumed ZipFile.namelist() was a list of files in the root of the zip-file when it's a list of all files. While I couldn't find any bugs caused by this, it performed checks that don't make sense, comparing files at different depths of the file-system. --- .../scripts/startup/bl_operators/userpref.py | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index 7f2fa1292ee..7c51d49d8e7 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -36,16 +36,36 @@ from bpy.props import ( from bpy.app.translations import pgettext_tip as tip_ -def module_filesystem_remove(path_base, module_name): +def _zipfile_root_namelist(file_to_extract): + # Return a list of root paths from zipfile.ZipFile.namelist. import os + root_paths = [] + for f in file_to_extract.namelist(): + # Python's `zipfile` API always adds a separate at the end of directories. + # use `os.path.normpath` instead of `f.removesuffix(os.sep)` + # since paths could be stored as `./paths/./`. + # + # Note that `..` prefixed paths can exist in ZIP files but they don't write to parent directory when extracting. + # Nor do they pass the `os.sep not in f` test, this is important, + # otherwise `shutil.rmtree` below could made to remove directories outside the installation directory. + f = os.path.normpath(f) + if os.sep not in f: + root_paths.append(f) + return root_paths + + +def _module_filesystem_remove(path_base, module_name): + # Remove all Python modules with `module_name` in `base_path`. + # The `module_name` is expected to be a result from `_zipfile_root_namelist`. + import os + import shutil module_name = os.path.splitext(module_name)[0] for f in os.listdir(path_base): f_base = os.path.splitext(f)[0] if f_base == module_name: f_full = os.path.join(path_base, f) - if os.path.isdir(f_full): - os.rmdir(f_full) + shutil.rmtree(f_full) else: os.remove(f_full) @@ -635,11 +655,12 @@ class PREFERENCES_OT_addon_install(Operator): traceback.print_exc() return {'CANCELLED'} + file_to_extract_root = _zipfile_root_namelist(file_to_extract) if self.overwrite: - for f in file_to_extract.namelist(): - module_filesystem_remove(path_addons, f) + for f in file_to_extract_root: + _module_filesystem_remove(path_addons, f) else: - for f in file_to_extract.namelist(): + for f in file_to_extract_root: path_dest = os.path.join(path_addons, os.path.basename(f)) if os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) @@ -655,7 +676,7 @@ class PREFERENCES_OT_addon_install(Operator): path_dest = os.path.join(path_addons, os.path.basename(pyfile)) if self.overwrite: - module_filesystem_remove(path_addons, os.path.basename(pyfile)) + _module_filesystem_remove(path_addons, os.path.basename(pyfile)) elif os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) return {'CANCELLED'} @@ -878,11 +899,13 @@ class PREFERENCES_OT_app_template_install(Operator): traceback.print_exc() return {'CANCELLED'} + # _module_extract_prepare(file_to_extract) + file_to_extract_root = _zipfile_root_namelist(file_to_extract) if self.overwrite: - for f in file_to_extract.namelist(): - module_filesystem_remove(path_app_templates, f) + for f in file_to_extract_root: + _module_filesystem_remove(path_app_templates, f) else: - for f in file_to_extract.namelist(): + for f in file_to_extract_root: path_dest = os.path.join(path_app_templates, os.path.basename(f)) if os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) From c03650073e60194500e13dc996168c4930970f5b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Feb 2021 21:15:45 +1100 Subject: [PATCH 202/519] Cleanup: spelling --- intern/cycles/kernel/closure/bsdf_microfacet.h | 4 ++-- intern/cycles/kernel/kernel_subsurface.h | 6 +++--- intern/cycles/util/util_string.h | 2 +- intern/ghost/intern/GHOST_SystemCocoa.mm | 2 +- release/scripts/startup/bl_operators/userpref.py | 3 --- source/blender/blenkernel/intern/geometry_set.cc | 2 +- .../blender/blenloader/intern/versioning_defaults.c | 2 +- .../draw/engines/eevee/eevee_depth_of_field.c | 12 ++++++------ source/blender/draw/engines/eevee/eevee_effects.c | 2 +- .../draw/engines/eevee/eevee_temporal_sampling.c | 6 +++--- source/blender/editors/animation/keyframing.c | 2 +- source/blender/editors/armature/armature_edit.c | 6 +++--- source/blender/editors/curve/editcurve.c | 6 +++--- source/blender/editors/interface/view2d_ops.c | 3 +-- source/blender/editors/mesh/editmesh_select.c | 2 +- source/blender/editors/object/object_vgroup.c | 4 ++-- source/blender/editors/screen/screen_ops.c | 2 +- source/blender/editors/space_file/file_ops.c | 3 +-- source/blender/editors/space_view3d/view3d_draw.c | 6 +++--- .../nodes/geometry/nodes/node_geo_point_separate.cc | 2 +- 20 files changed, 36 insertions(+), 41 deletions(-) diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h index 32639ba24ec..aed4b849aca 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet.h @@ -487,11 +487,11 @@ ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc, float3 out = F * G * common; /* eq. 2 in distribution of visible normals sampling - * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */ + * `pm = Dw = G1o * dot(m, I) * D / dot(N, I);` */ /* eq. 38 - but see also: * eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf - * pdf = pm * 0.25 / dot(m, I); */ + * `pdf = pm * 0.25 / dot(m, I);` */ *pdf = G1o * common; return out; diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index 50a232dd82e..d8258a8336c 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -390,8 +390,8 @@ ccl_device_forceinline float eval_phase_dwivedi(float v, float phase_log, float ccl_device_forceinline float sample_phase_dwivedi(float v, float phase_log, float rand) { - /* Based on Eq. 10 from [2]: v - (v + 1) * pow((v - 1) / (v + 1), rand) - * Since we're already precomputing phase_log = log((v + 1) / (v - 1)) for the evaluation, + /* Based on Eq. 10 from [2]: `v - (v + 1) * pow((v - 1) / (v + 1), rand)` + * Since we're already pre-computing `phase_log = log((v + 1) / (v - 1))` for the evaluation, * we can implement the power function like this. */ return v - (v + 1) * expf(-rand * phase_log); } @@ -455,7 +455,7 @@ ccl_device_noinline float3 sigma_s = sigma_t * alpha; /* Theoretically it should be better to use the exact alpha for the channel we're sampling at - * each bounce, but in practise there doesn't seem to be a noticeable difference in exchange + * each bounce, but in practice there doesn't seem to be a noticeable difference in exchange * for making the code significantly more complex and slower (if direction sampling depends on * the sampled channel, we need to compute its PDF per-channel and consider it for MIS later on). * diff --git a/intern/cycles/util/util_string.h b/intern/cycles/util/util_string.h index 6b6f493bd94..f2272819b2f 100644 --- a/intern/cycles/util/util_string.h +++ b/intern/cycles/util/util_string.h @@ -52,7 +52,7 @@ string string_remove_trademark(const string &s); string string_from_bool(const bool var); string to_string(const char *str); -/* Wide char strings are only used on Windows to deal with non-ascii +/* Wide char strings are only used on Windows to deal with non-ASCII * characters in file names and such. No reason to use such strings * for something else at this moment. * diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index d7dbfbe8813..f42d4af109a 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1286,7 +1286,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType return GHOST_kFailure; } - /* Then get Alpha values by getting the RGBA image (that is premultiplied btw) */ + /* Then get Alpha values by getting the RGBA image (that is pre-multiplied BTW) */ blBitmapFormatImageRGBA = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:imgSize.width diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index 7c51d49d8e7..7547184dc04 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -18,8 +18,6 @@ # -# TODO, use PREFERENCES_OT_* prefix for operators. - import bpy from bpy.types import ( Operator, @@ -899,7 +897,6 @@ class PREFERENCES_OT_app_template_install(Operator): traceback.print_exc() return {'CANCELLED'} - # _module_extract_prepare(file_to_extract) file_to_extract_root = _zipfile_root_namelist(file_to_extract) if self.overwrite: for f in file_to_extract_root: diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index 0bc248299ca..e6ecb6e5821 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -612,7 +612,7 @@ static GeometrySet object_get_geometry_set_for_read(const Object &object) } } - /* TODO: Cover the case of pointclouds without modifiers-- they may not be covered by the + /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the * #geometry_set_eval case above. */ /* TODO: Add volume support. */ diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index 198f65b9794..52efeb1e822 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -330,7 +330,7 @@ static void blo_update_defaults_scene(Main *bmain, Scene *scene) /* Enable Soft Shadows by default. */ scene->eevee.flag |= SCE_EEVEE_SHADOW_SOFT; - /* Be sure curfalloff and primitive are initializated */ + /* Be sure `curfalloff` and primitive are initialized. */ ToolSettings *ts = scene->toolsettings; if (ts->gp_sculpt.cur_falloff == NULL) { ts->gp_sculpt.cur_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index bd6c6242f86..91214f6c437 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -23,7 +23,7 @@ * * There are 2 methods to achieve this effect. * - The first uses projection matrix offsetting and sample accumulation to give reference quality - * depth of field. But this needs many samples to hide the undersampling. + * depth of field. But this needs many samples to hide the under-sampling. * - The second one is a post-processing based one. It follows the implementation described in * the presentation "Life of a Bokeh - Siggraph 2018" from Guillaume Abadie. There are some * difference with our actual implementation that prioritize quality. @@ -139,7 +139,7 @@ bool EEVEE_depth_of_field_jitter_get(EEVEE_EffectsInfo *fx, r_jitter[1] = (float)ring_sample / ring_sample_count; { - /* Bokeh shape parametrisation */ + /* Bokeh shape parameterization. */ float r = r_jitter[0]; float T = r_jitter[1] * 2.0f * M_PI; @@ -388,7 +388,7 @@ static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl, } /** - * Ouputs halfResColorBuffer and halfResCocBuffer. + * Outputs halfResColorBuffer and halfResCocBuffer. **/ static void dof_setup_pass_init(EEVEE_FramebufferList *fbl, EEVEE_PassList *psl, @@ -422,7 +422,7 @@ static void dof_setup_pass_init(EEVEE_FramebufferList *fbl, } /** - * Ouputs min & max coc in each 8x8 half res pixel tiles (so 1/16th of fullres). + * Outputs min & max COC in each 8x8 half res pixel tiles (so 1/16th of full resolution). **/ static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl, EEVEE_PassList *psl, @@ -453,7 +453,7 @@ static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl, } /** - * Dilates the min & max cocs to cover maximum coc values. + * Dilates the min & max COCS to cover maximum COC values. * Output format/dimensions should be the same as coc_flatten_pass as they are swapped for * doing multiple dilation passes. **/ @@ -536,7 +536,7 @@ static void dof_dilate_tiles_pass_draw(EEVEE_FramebufferList *fbl, } /** - * Create mipmaped color & coc textures for gather passes. + * Create mipmaped color & COC textures for gather passes. **/ static void dof_reduce_pass_init(EEVEE_FramebufferList *fbl, EEVEE_PassList *psl, diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 77586f4b43a..18d3e453c5d 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -517,7 +517,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_viewport_request_redraw(); } - /* Record pers matrix for the next frame. */ + /* Record perspective matrix for the next frame. */ DRW_view_persmat_get(effects->taa_view, effects->prev_persmat, false); /* Update double buffer status if render mode. */ diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 8fa7d899b6b..226d98cc50d 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -173,14 +173,14 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou /* Get focus distance in NDC. */ float focus_pt[3] = {0.0f, 0.0f, -focus_distance}; mul_project_m4_v3(winmat, focus_pt); - /* Get pixel footprint in viewspace. */ + /* Get pixel footprint in view-space. */ float jitter_scaled[3] = {dof_jitter[0], dof_jitter[1], focus_pt[2]}; float center[3] = {0.0f, 0.0f, focus_pt[2]}; mul_project_m4_v3(wininv, jitter_scaled); mul_project_m4_v3(wininv, center); - /* FIXME(fclem) The offset is noticeably large and the culling might make object pop out - * of the bluring radius. To fix this, use custom enlarged culling matrix. */ + /* FIXME(fclem): The offset is noticeably large and the culling might make object pop out + * of the blurring radius. To fix this, use custom enlarged culling matrix. */ sub_v2_v2v2(jitter_scaled, jitter_scaled, center); add_v2_v2(viewmat[3], jitter_scaled); diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 0d1633ab3a2..4cc0413be5b 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -639,7 +639,7 @@ int insert_vert_fcurve( /* don't recalculate handles if fast is set * - this is a hack to make importers faster - * - we may calculate twice (due to autohandle needing to be calculated twice) + * - we may calculate twice (due to auto-handle needing to be calculated twice) */ if ((flag & INSERTKEY_FAST) == 0) { calchandles_fcurve(fcu); diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c index a07e73d6266..912aafbd6e3 100644 --- a/source/blender/editors/armature/armature_edit.c +++ b/source/blender/editors/armature/armature_edit.c @@ -126,12 +126,12 @@ void ED_armature_origin_set( bArmature *arm = ob->data; float cent[3]; - /* Put the armature into editmode */ + /* Put the armature into edit-mode. */ if (is_editmode == false) { ED_armature_to_edit(arm); } - /* Find the centerpoint */ + /* Find the center-point. */ if (centermode == 2) { copy_v3_v3(cent, cursor); invert_m4_m4(ob->imat, ob->obmat); @@ -173,7 +173,7 @@ void ED_armature_origin_set( ED_armature_edit_free(arm); } - /* Adjust object location for new centerpoint */ + /* Adjust object location for new center-point. */ if (centermode && (is_editmode == false)) { mul_mat3_m4_v3(ob->obmat, cent); /* omit translation part */ add_v3_v3(ob->loc, cent); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 439515ed80f..0593cedb5a1 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3111,7 +3111,7 @@ void CURVE_OT_smooth_weight(wmOperatorType *ot) ot->description = "Interpolate weight of selected points"; ot->idname = "CURVE_OT_smooth_weight"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_weight_exec; ot->poll = ED_operator_editsurfcurve; @@ -3154,7 +3154,7 @@ void CURVE_OT_smooth_radius(wmOperatorType *ot) ot->description = "Interpolate radii of selected points"; ot->idname = "CURVE_OT_smooth_radius"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_radius_exec; ot->poll = ED_operator_editsurfcurve; @@ -3197,7 +3197,7 @@ void CURVE_OT_smooth_tilt(wmOperatorType *ot) ot->description = "Interpolate tilt of selected points"; ot->idname = "CURVE_OT_smooth_tilt"; - /* api clastbacks */ + /* api callbacks */ ot->exec = curve_smooth_tilt_exec; ot->poll = ED_operator_editsurfcurve; diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index e234ab5dcdc..7453cd17868 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1746,8 +1746,7 @@ void UI_view2d_smooth_view(bContext *C, ARegion *region, const rctf *cur, const if (v2d->smooth_timer) { WM_event_remove_timer(wm, win, v2d->smooth_timer); } - /* TIMER1 is hardcoded in keymap */ - /* max 30 frs/sec */ + /* TIMER1 is hard-coded in key-map. */ v2d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0); ok = true; diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index c8449644dd0..903e50bf668 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -995,7 +995,7 @@ bool EDBM_unified_findnearest(ViewContext *vc, /* -------------------------------------------------------------------- */ /** \name Alternate Find Nearest Vert/Edge (optional boundary) * - * \note This uses ray-cast method instead of backbuffer, + * \note This uses ray-cast method instead of back-buffer, * currently used for poly-build. * \{ */ diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 6362662c4e7..2296e158cc8 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -2422,7 +2422,7 @@ void ED_vgroup_mirror(Object *ob, BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false); - /* Go through the list of editverts and assign them */ + /* Go through the list of edit-vertices and assign them. */ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (!BM_elem_flag_test(eve, BM_ELEM_TAG)) { if ((eve_mirr = EDBM_verts_mirror_get(em, eve))) { @@ -2602,7 +2602,7 @@ static void vgroup_assign_verts(Object *ob, const float weight) cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT); - /* Go through the list of editverts and assign them */ + /* Go through the list of edit-vertices and assign them. */ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { MDeformVert *dv; diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 244d8c10e4e..0fc7e713bac 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -5083,7 +5083,7 @@ static void SCREEN_OT_delete(wmOperatorType *ot) /** \name Region Alpha Blending Operator * * Implementation note: a disappearing region needs at least 1 last draw with - * 100% backbuffer texture over it - then triple buffer will clear it entirely. + * 100% back-buffer texture over it - then triple buffer will clear it entirely. * This because flag #RGN_FLAG_HIDDEN is set in end - region doesn't draw at all then. * * \{ */ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 1ba9716a194..985c92f19b6 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -2230,8 +2230,7 @@ static int file_directory_new_exec(bContext *C, wmOperator *op) params->rename_flag = FILE_PARAMS_RENAME_PENDING; } - /* set timer to smoothly view newly generated file */ - /* max 30 frs/sec */ + /* Set timer to smoothly view newly generated file. */ if (sfile->smoothscroll_timer != NULL) { WM_event_remove_timer(wm, CTX_wm_window(C), sfile->smoothscroll_timer); } diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index ddb57a916af..12fb96c0737 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2156,7 +2156,7 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const /** \} */ /* -------------------------------------------------------------------- */ -/** \name Backdraw for Selection +/** \name Back-Draw for Selection * \{ */ /** @@ -2200,7 +2200,7 @@ static void validate_object_select_id(struct Depsgraph *depsgraph, } /* TODO: Create a flag in `DRW_manager` because the drawing is no longer - * made on the backbuffer in this case. */ + * made on the back-buffer in this case. */ v3d->flag &= ~V3D_INVALID_BACKBUF; } @@ -2229,7 +2229,7 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void void ED_view3d_select_id_validate(ViewContext *vc) { /* TODO: Create a flag in `DRW_manager` because the drawing is no longer - * made on the backbuffer in this case. */ + * made on the back-buffer in this case. */ if (vc->v3d->flag & V3D_INVALID_BACKBUF) { validate_object_select_id(vc->depsgraph, vc->view_layer, vc->region, vc->v3d, vc->obact); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc index 8bb8c5e980a..53d0fe1e112 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc @@ -178,7 +178,7 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params) GeometrySet out_set_a(geometry_set); GeometrySet out_set_b; - /* TODO: This is not necessary-- the input goemetry set can be read only, + /* TODO: This is not necessary-- the input geometry set can be read only, * but it must be rewritten to handle instance groups. */ geometry_set = geometry_set_realize_instances(geometry_set); From 39f60e6909e61b8b7982e637a2091a84d618ddd7 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 16 Feb 2021 11:55:00 +0100 Subject: [PATCH 203/519] Geometry Nodes: move some attribute utilities to blenkernel I need to access these utilities from modifier code as well. Therefore, they should not live in the nodes module. --- .../blenkernel/BKE_attribute_access.hh | 2 + .../blenkernel/intern/attribute_access.cc | 90 ++++++++++++++++++ .../nodes/geometry/node_geometry_util.cc | 93 +------------------ .../nodes/geometry/node_geometry_util.hh | 3 - .../nodes/node_geo_attribute_compare.cc | 2 +- .../geometry/nodes/node_geo_attribute_mix.cc | 2 +- .../nodes/node_geo_attribute_separate_xyz.cc | 2 +- .../geometry/nodes/node_geo_join_geometry.cc | 4 +- .../nodes/intern/node_geometry_exec.cc | 2 +- 9 files changed, 100 insertions(+), 100 deletions(-) diff --git a/source/blender/blenkernel/BKE_attribute_access.hh b/source/blender/blenkernel/BKE_attribute_access.hh index 55c8b36669d..653c0f0d85d 100644 --- a/source/blender/blenkernel/BKE_attribute_access.hh +++ b/source/blender/blenkernel/BKE_attribute_access.hh @@ -33,6 +33,8 @@ using fn::CPPType; const CPPType *custom_data_type_to_cpp_type(const CustomDataType type); CustomDataType cpp_type_to_custom_data_type(const CPPType &type); +CustomDataType attribute_data_type_highest_complexity(Span data_types); +AttributeDomain attribute_domain_highest_priority(Span domains); /** * This class offers an indirection for reading an attribute. diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 17f8b5ba2b3..f594ec54a7e 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -508,6 +508,96 @@ CustomDataType cpp_type_to_custom_data_type(const blender::fn::CPPType &type) return static_cast(-1); } +static int attribute_data_type_complexity(const CustomDataType data_type) +{ + switch (data_type) { + case CD_PROP_BOOL: + return 0; + case CD_PROP_INT32: + return 1; + case CD_PROP_FLOAT: + return 2; + case CD_PROP_FLOAT2: + return 3; + case CD_PROP_FLOAT3: + return 4; + case CD_PROP_COLOR: + return 5; +#if 0 /* These attribute types are not supported yet. */ + case CD_MLOOPCOL: + return 3; + case CD_PROP_STRING: + return 6; +#endif + default: + /* Only accept "generic" custom data types used by the attribute system. */ + BLI_assert(false); + return 0; + } +} + +CustomDataType attribute_data_type_highest_complexity(Span data_types) +{ + int highest_complexity = INT_MIN; + CustomDataType most_complex_type = CD_PROP_COLOR; + + for (const CustomDataType data_type : data_types) { + const int complexity = attribute_data_type_complexity(data_type); + if (complexity > highest_complexity) { + highest_complexity = complexity; + most_complex_type = data_type; + } + } + + return most_complex_type; +} + +/** + * \note Generally the order should mirror the order of the domains + * established in each component's ComponentAttributeProviders. + */ +static int attribute_domain_priority(const AttributeDomain domain) +{ + switch (domain) { +#if 0 + case ATTR_DOMAIN_CURVE: + return 0; +#endif + case ATTR_DOMAIN_POLYGON: + return 1; + case ATTR_DOMAIN_EDGE: + return 2; + case ATTR_DOMAIN_POINT: + return 3; + case ATTR_DOMAIN_CORNER: + return 4; + default: + /* Domain not supported in nodes yet. */ + BLI_assert(false); + return 0; + } +} + +/** + * Domains with a higher "information density" have a higher priority, in order + * to choose a domain that will not lose data through domain conversion. + */ +AttributeDomain attribute_domain_highest_priority(Span domains) +{ + int highest_priority = INT_MIN; + AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER; + + for (const AttributeDomain domain : domains) { + const int priority = attribute_domain_priority(domain); + if (priority > highest_priority) { + highest_priority = priority; + highest_priority_domain = domain; + } + } + + return highest_priority_domain; +} + /** * A #BuiltinAttributeProvider is responsible for exactly one attribute on a geometry component. * The attribute is identified by its name and has a fixed domain and type. Builtin attributes do diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index c0f8fbade49..08de467cd55 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -55,7 +55,8 @@ void gather_attribute_info(Map &attributes, }; auto modify_info = [&, data_type, domain](AttributeInfo *info) { info->domain = domain; /* TODO: Use highest priority domain. */ - info->data_type = attribute_data_type_highest_complexity({info->data_type, data_type}); + info->data_type = bke::attribute_data_type_highest_complexity( + {info->data_type, data_type}); }; attributes.add_or_modify(name, add_info, modify_info); @@ -294,96 +295,6 @@ void update_attribute_input_socket_availabilities(bNode &node, } } -static int attribute_data_type_complexity(const CustomDataType data_type) -{ - switch (data_type) { - case CD_PROP_BOOL: - return 0; - case CD_PROP_INT32: - return 1; - case CD_PROP_FLOAT: - return 2; - case CD_PROP_FLOAT2: - return 3; - case CD_PROP_FLOAT3: - return 4; - case CD_PROP_COLOR: - return 5; -#if 0 /* These attribute types are not supported yet. */ - case CD_MLOOPCOL: - return 3; - case CD_PROP_STRING: - return 6; -#endif - default: - /* Only accept "generic" custom data types used by the attribute system. */ - BLI_assert(false); - return 0; - } -} - -CustomDataType attribute_data_type_highest_complexity(Span data_types) -{ - int highest_complexity = INT_MIN; - CustomDataType most_complex_type = CD_PROP_COLOR; - - for (const CustomDataType data_type : data_types) { - const int complexity = attribute_data_type_complexity(data_type); - if (complexity > highest_complexity) { - highest_complexity = complexity; - most_complex_type = data_type; - } - } - - return most_complex_type; -} - -/** - * \note Generally the order should mirror the order of the domains - * established in each component's ComponentAttributeProviders. - */ -static int attribute_domain_priority(const AttributeDomain domain) -{ - switch (domain) { -#if 0 - case ATTR_DOMAIN_CURVE: - return 0; -#endif - case ATTR_DOMAIN_POLYGON: - return 1; - case ATTR_DOMAIN_EDGE: - return 2; - case ATTR_DOMAIN_POINT: - return 3; - case ATTR_DOMAIN_CORNER: - return 4; - default: - /* Domain not supported in nodes yet. */ - BLI_assert(false); - return 0; - } -} - -/** - * Domains with a higher "information density" have a higher priority, in order - * to choose a domain that will not lose data through domain conversion. - */ -AttributeDomain attribute_domain_highest_priority(Span domains) -{ - int highest_priority = INT_MIN; - AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER; - - for (const AttributeDomain domain : domains) { - const int priority = attribute_domain_priority(domain); - if (priority > highest_priority) { - highest_priority = priority; - highest_priority_domain = domain; - } - } - - return highest_priority_domain; -} - } // namespace blender::nodes bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree) diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index 13a58be86f6..687763b4728 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -44,9 +44,6 @@ void update_attribute_input_socket_availabilities(bNode &node, const GeometryNodeAttributeInputMode mode, const bool name_is_available = true); -CustomDataType attribute_data_type_highest_complexity(Span); -AttributeDomain attribute_domain_highest_priority(Span domains); - Array get_geometry_element_ids_as_uints(const GeometryComponent &component, const AttributeDomain domain); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index a6cd0dd7779..350935c75d1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -230,7 +230,7 @@ static CustomDataType get_data_type(GeometryComponent &component, if (operation_tests_equality(node_storage)) { /* Convert the input attributes to the same data type for the equality tests. Use the higher * complexity attribute type, otherwise information necessary to the comparison may be lost. */ - return attribute_data_type_highest_complexity({ + return bke::attribute_data_type_highest_complexity({ params.get_input_attribute_data_type("A", component, CD_PROP_FLOAT), params.get_input_attribute_data_type("B", component, CD_PROP_FLOAT), }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index e515f253a46..34503b8525e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -148,7 +148,7 @@ static void attribute_mix_calc(GeometryComponent &component, const GeoNodeExecPa /* Use the highest complexity data type among the inputs and outputs, that way the node will * never "remove information". Use CD_PROP_BOOL as the lowest complexity data type, but in any * real situation it won't be returned. */ - const CustomDataType result_type = attribute_data_type_highest_complexity({ + const CustomDataType result_type = bke::attribute_data_type_highest_complexity({ params.get_input_attribute_data_type("A", component, CD_PROP_BOOL), params.get_input_attribute_data_type("B", component, CD_PROP_BOOL), params.get_input_attribute_data_type("Result", component, CD_PROP_BOOL), diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc index 2e02ad9836d..970cf71f8fc 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -90,7 +90,7 @@ static AttributeDomain get_result_domain(const GeometryComponent &component, output_domains.append(attribute_z->domain()); } if (output_domains.size() > 0) { - return attribute_domain_highest_priority(output_domains); + return bke::attribute_domain_highest_priority(output_domains); } /* Otherwise use the domain of the input attribute, or the default. */ diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index ed99fc95018..3f6f28f2826 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -156,8 +156,8 @@ static void determine_final_data_type_and_domain(Span } } - *r_type = attribute_data_type_highest_complexity(data_types); - *r_domain = attribute_domain_highest_priority(domains); + *r_type = bke::attribute_data_type_highest_complexity(data_types); + *r_domain = bke::attribute_domain_highest_priority(domains); } static void fill_new_attribute(Span src_components, diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index 6ddeb73e31f..3de8209859b 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -134,7 +134,7 @@ AttributeDomain GeoNodeExecParams::get_highest_priority_input_domain( } if (input_domains.size() > 0) { - return attribute_domain_highest_priority(input_domains); + return bke::attribute_domain_highest_priority(input_domains); } return default_domain; From 21de1f91480ac2165517a4ba244fa0708a939baf Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 16 Feb 2021 12:07:10 +0100 Subject: [PATCH 204/519] Geometry Nodes: move geometry set instance handling to separate file In an upcoming commit I'll also move the make-instances-real functionality to this file. This code is not essential to working with geometry sets in general, so it makes sense to move it to a separate header. --- source/blender/blenkernel/BKE_geometry_set.hh | 22 --- .../blenkernel/BKE_geometry_set_instances.hh | 42 +++++ source/blender/blenkernel/CMakeLists.txt | 2 + .../blender/blenkernel/intern/geometry_set.cc | 143 --------------- .../intern/geometry_set_instances.cc | 163 ++++++++++++++++++ .../nodes/geometry/node_geometry_util.cc | 4 +- .../nodes/geometry/node_geometry_util.hh | 3 +- 7 files changed, 212 insertions(+), 167 deletions(-) create mode 100644 source/blender/blenkernel/BKE_geometry_set_instances.hh create mode 100644 source/blender/blenkernel/intern/geometry_set_instances.cc diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 5b429a61b3f..02b3c88183a 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -467,25 +467,3 @@ class VolumeComponent : public GeometryComponent { static constexpr inline GeometryComponentType static_type = GeometryComponentType::Volume; }; - -/** - * Used to keep track of a group of instances using the same geometry data. - */ -struct GeometryInstanceGroup { - /** - * The geometry set instanced on each of the transforms. The components are not necessarily - * owned here. For example, they may be owned by the instanced object. This cannot be a - * reference because not all instanced data will necessarily have a #geometry_set_eval. - */ - GeometrySet geometry_set; - - /** - * As an optimization to avoid copying, the same geometry set can be associated with multiple - * instances. Each instance is stored as a transform matrix here. Again, these must be owned - * because they may be transformed from the original data. TODO: Validate that last statement. - */ - blender::Vector transforms; -}; - -blender::Vector BKE_geometry_set_gather_instances( - const GeometrySet &geometry_set); diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh new file mode 100644 index 00000000000..11725d75df9 --- /dev/null +++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh @@ -0,0 +1,42 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BKE_geometry_set.hh" + +namespace blender::bke { + +/** + * Used to keep track of a group of instances using the same geometry data. + */ +struct GeometryInstanceGroup { + /** + * The geometry set instanced on each of the transforms. The components are not necessarily + * owned here. For example, they may be owned by the instanced object. This cannot be a + * reference because not all instanced data will necessarily have a #geometry_set_eval. + */ + GeometrySet geometry_set; + + /** + * As an optimization to avoid copying, the same geometry set can be associated with multiple + * instances. Each instance is stored as a transform matrix here. Again, these must be owned + * because they may be transformed from the original data. TODO: Validate that last statement. + */ + Vector transforms; +}; + +Vector geometry_set_gather_instances(const GeometrySet &geometry_set); + +} // namespace blender::bke diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 6b6d2b45d02..ead01dbd6cb 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -130,6 +130,7 @@ set(SRC intern/font.c intern/freestyle.c intern/geometry_set.cc + intern/geometry_set_instances.cc intern/gpencil.c intern/gpencil_curve.c intern/gpencil_geom.c @@ -327,6 +328,7 @@ set(SRC BKE_freestyle.h BKE_geometry_set.h BKE_geometry_set.hh + BKE_geometry_set_instances.hh BKE_global.h BKE_gpencil.h BKE_gpencil_curve.h diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index e6ecb6e5821..74d8b9afd82 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -586,149 +586,6 @@ bool InstancesComponent::is_empty() const return transforms_.size() == 0; } -/** - * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. - */ -static GeometrySet object_get_geometry_set_for_read(const Object &object) -{ - /* Objects evaluated with a nodes modifier will have a geometry set already. */ - if (object.runtime.geometry_set_eval != nullptr) { - return *object.runtime.geometry_set_eval; - } - - /* Otherwise, construct a new geometry set with the component based on the object type. */ - GeometrySet new_geometry_set; - - if (object.type == OB_MESH) { - Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object( - &const_cast(object), false); - - if (mesh != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh); - - MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); - mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly); - mesh_component.copy_vertex_group_names_from_object(object); - } - } - - /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the - * #geometry_set_eval case above. */ - - /* TODO: Add volume support. */ - - /* Return by value since there is not always an existing geometry set owned elsewhere to use. */ - return new_geometry_set; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Geometry Set Gather Recursive Instances - * \{ */ - -static void geometry_set_collect_recursive(const GeometrySet &geometry_set, - const float4x4 &transform, - Vector &r_sets); - -static void geometry_set_collect_recursive_collection(const Collection &collection, - const float4x4 &transform, - Vector &r_sets); - -static void geometry_set_collect_recursive_collection_instance( - const Collection &collection, const float4x4 &transform, Vector &r_sets) -{ - float4x4 offset_matrix; - unit_m4(offset_matrix.values); - sub_v3_v3(offset_matrix.values[3], collection.instance_offset); - const float4x4 instance_transform = transform * offset_matrix; - geometry_set_collect_recursive_collection(collection, instance_transform, r_sets); -} - -static void geometry_set_collect_recursive_object(const Object &object, - const float4x4 &transform, - Vector &r_sets) -{ - GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object); - geometry_set_collect_recursive(instance_geometry_set, transform, r_sets); - - if (object.type == OB_EMPTY) { - const Collection *collection_instance = object.instance_collection; - if (collection_instance != nullptr) { - geometry_set_collect_recursive_collection_instance(*collection_instance, transform, r_sets); - } - } -} - -static void geometry_set_collect_recursive_collection(const Collection &collection, - const float4x4 &transform, - Vector &r_sets) -{ - LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) { - BLI_assert(collection_object->ob != nullptr); - const Object &object = *collection_object->ob; - const float4x4 object_transform = transform * object.obmat; - geometry_set_collect_recursive_object(object, object_transform, r_sets); - } - LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) { - BLI_assert(collection_child->collection != nullptr); - const Collection &collection = *collection_child->collection; - geometry_set_collect_recursive_collection(collection, transform, r_sets); - } -} - -static void geometry_set_collect_recursive(const GeometrySet &geometry_set, - const float4x4 &transform, - Vector &r_sets) -{ - r_sets.append({geometry_set, {transform}}); - - if (geometry_set.has_instances()) { - const InstancesComponent &instances_component = - *geometry_set.get_component_for_read(); - - Span transforms = instances_component.transforms(); - Span instances = instances_component.instanced_data(); - for (const int i : instances.index_range()) { - const InstancedData &data = instances[i]; - const float4x4 instance_transform = transform * transforms[i]; - - if (data.type == INSTANCE_DATA_TYPE_OBJECT) { - BLI_assert(data.data.object != nullptr); - const Object &object = *data.data.object; - geometry_set_collect_recursive_object(object, instance_transform, r_sets); - } - else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) { - BLI_assert(data.data.collection != nullptr); - const Collection &collection = *data.data.collection; - geometry_set_collect_recursive_collection_instance(collection, instance_transform, r_sets); - } - } - } -} - -/** - * Return flattened vector of the geometry component's recursive instances. I.e. all collection - * instances and object instances will be expanded into the instances of their geometry components. - * Even the instances in those geometry components' will be included. - * - * \note For convenience (to avoid duplication in the caller), the returned vector also contains - * the argument geometry set. - * - * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. - */ -Vector BKE_geometry_set_gather_instances(const GeometrySet &geometry_set) -{ - Vector result_vector; - - float4x4 unit_transform; - unit_m4(unit_transform.values); - - geometry_set_collect_recursive(geometry_set, unit_transform, result_vector); - - return result_vector; -} - static blender::Array generate_unique_instance_ids(Span original_ids) { using namespace blender; diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc new file mode 100644 index 00000000000..6410aeb49fa --- /dev/null +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -0,0 +1,163 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BKE_geometry_set_instances.hh" +#include "BKE_mesh_wrapper.h" +#include "BKE_modifier.h" + +#include "DNA_collection_types.h" +#include "DNA_object_types.h" + +namespace blender::bke { + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets); + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets); + +/** + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +static GeometrySet object_get_geometry_set_for_read(const Object &object) +{ + /* Objects evaluated with a nodes modifier will have a geometry set already. */ + if (object.runtime.geometry_set_eval != nullptr) { + return *object.runtime.geometry_set_eval; + } + + /* Otherwise, construct a new geometry set with the component based on the object type. */ + GeometrySet new_geometry_set; + + if (object.type == OB_MESH) { + Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object( + &const_cast(object), false); + + if (mesh != nullptr) { + BKE_mesh_wrapper_ensure_mdata(mesh); + + MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); + mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly); + mesh_component.copy_vertex_group_names_from_object(object); + } + } + + /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the + * #geometry_set_eval case above. */ + + /* TODO: Add volume support. */ + + /* Return by value since there is not always an existing geometry set owned elsewhere to use. */ + return new_geometry_set; +} + +static void geometry_set_collect_recursive_collection_instance( + const Collection &collection, const float4x4 &transform, Vector &r_sets) +{ + float4x4 offset_matrix; + unit_m4(offset_matrix.values); + sub_v3_v3(offset_matrix.values[3], collection.instance_offset); + const float4x4 instance_transform = transform * offset_matrix; + geometry_set_collect_recursive_collection(collection, instance_transform, r_sets); +} + +static void geometry_set_collect_recursive_object(const Object &object, + const float4x4 &transform, + Vector &r_sets) +{ + GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object); + geometry_set_collect_recursive(instance_geometry_set, transform, r_sets); + + if (object.type == OB_EMPTY) { + const Collection *collection_instance = object.instance_collection; + if (collection_instance != nullptr) { + geometry_set_collect_recursive_collection_instance(*collection_instance, transform, r_sets); + } + } +} + +static void geometry_set_collect_recursive_collection(const Collection &collection, + const float4x4 &transform, + Vector &r_sets) +{ + LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) { + BLI_assert(collection_object->ob != nullptr); + const Object &object = *collection_object->ob; + const float4x4 object_transform = transform * object.obmat; + geometry_set_collect_recursive_object(object, object_transform, r_sets); + } + LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) { + BLI_assert(collection_child->collection != nullptr); + const Collection &collection = *collection_child->collection; + geometry_set_collect_recursive_collection(collection, transform, r_sets); + } +} + +static void geometry_set_collect_recursive(const GeometrySet &geometry_set, + const float4x4 &transform, + Vector &r_sets) +{ + r_sets.append({geometry_set, {transform}}); + + if (geometry_set.has_instances()) { + const InstancesComponent &instances_component = + *geometry_set.get_component_for_read(); + + Span transforms = instances_component.transforms(); + Span instances = instances_component.instanced_data(); + for (const int i : instances.index_range()) { + const InstancedData &data = instances[i]; + const float4x4 instance_transform = transform * transforms[i]; + + if (data.type == INSTANCE_DATA_TYPE_OBJECT) { + BLI_assert(data.data.object != nullptr); + const Object &object = *data.data.object; + geometry_set_collect_recursive_object(object, instance_transform, r_sets); + } + else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) { + BLI_assert(data.data.collection != nullptr); + const Collection &collection = *data.data.collection; + geometry_set_collect_recursive_collection_instance(collection, instance_transform, r_sets); + } + } + } +} + +/** + * Return flattened vector of the geometry component's recursive instances. I.e. all collection + * instances and object instances will be expanded into the instances of their geometry components. + * Even the instances in those geometry components' will be included. + * + * \note For convenience (to avoid duplication in the caller), the returned vector also contains + * the argument geometry set. + * + * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances. + */ +Vector geometry_set_gather_instances(const GeometrySet &geometry_set) +{ + Vector result_vector; + + float4x4 unit_transform; + unit_m4(unit_transform.values); + + geometry_set_collect_recursive(geometry_set, unit_transform, result_vector); + + return result_vector; +} + +} // namespace blender::bke diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index 08de467cd55..daee693c24f 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -26,6 +26,8 @@ namespace blender::nodes { +using bke::GeometryInstanceGroup; + void gather_attribute_info(Map &attributes, const GeometryComponentType component_type, Span set_groups, @@ -261,7 +263,7 @@ GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) GeometrySet new_geometry_set; - Vector set_groups = BKE_geometry_set_gather_instances(geometry_set); + Vector set_groups = bke::geometry_set_gather_instances(geometry_set); join_instance_groups_mesh(set_groups, new_geometry_set); join_instance_groups_pointcloud(set_groups, new_geometry_set); join_instance_groups_volume(set_groups, new_geometry_set); diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index 687763b4728..78418b37011 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -25,6 +25,7 @@ #include "DNA_node_types.h" +#include "BKE_geometry_set_instances.hh" #include "BKE_node.h" #include "BLT_translation.h" @@ -61,7 +62,7 @@ struct AttributeInfo { */ void gather_attribute_info(Map &attributes, const GeometryComponentType component_type, - Span set_groups, + Span set_groups, const Set &ignored_attributes); } // namespace blender::nodes From 5688f791f51827d77f4479bee90c4e88add72ce6 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 16 Feb 2021 12:30:42 +0100 Subject: [PATCH 205/519] Geometry Nodes: move realize-instances code to blenkernel I need to access this functionality from modifier code. Therefore it should not be in the nodes module. --- .../blenkernel/BKE_geometry_set_instances.hh | 19 ++ .../intern/geometry_set_instances.cc | 247 ++++++++++++++++++ source/blender/nodes/NOD_geometry_exec.hh | 2 + .../nodes/geometry/node_geometry_util.cc | 243 ----------------- .../nodes/geometry/node_geometry_util.hh | 18 -- 5 files changed, 268 insertions(+), 261 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh index 11725d75df9..4f3c9c65203 100644 --- a/source/blender/blenkernel/BKE_geometry_set_instances.hh +++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh @@ -14,6 +14,8 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#pragma once + #include "BKE_geometry_set.hh" namespace blender::bke { @@ -39,4 +41,21 @@ struct GeometryInstanceGroup { Vector geometry_set_gather_instances(const GeometrySet &geometry_set); +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); + +struct AttributeInfo { + CustomDataType data_type; + AttributeDomain domain; +}; + +/** + * Add information about all the attributes on every component of the type. The resulting info + * will contain the highest complexity data type and the highest priority domain among every + * attribute with the given name on all of the input components. + */ +void gather_attribute_info(Map &attributes, + const GeometryComponentType component_type, + Span set_groups, + const Set &ignored_attributes); + } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 6410aeb49fa..8e9edc86bca 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -15,10 +15,14 @@ */ #include "BKE_geometry_set_instances.hh" +#include "BKE_mesh.h" #include "BKE_mesh_wrapper.h" #include "BKE_modifier.h" +#include "BKE_pointcloud.h" #include "DNA_collection_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" namespace blender::bke { @@ -160,4 +164,247 @@ Vector geometry_set_gather_instances(const GeometrySet &g return result_vector; } +void gather_attribute_info(Map &attributes, + const GeometryComponentType component_type, + Span set_groups, + const Set &ignored_attributes) +{ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (!set.has(component_type)) { + continue; + } + const GeometryComponent &component = *set.get_component_for_read(component_type); + + for (const std::string &name : component.attribute_names()) { + if (ignored_attributes.contains(name)) { + continue; + } + const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); + if (!read_attribute) { + continue; + } + const AttributeDomain domain = read_attribute->domain(); + const CustomDataType data_type = read_attribute->custom_data_type(); + + auto add_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; + info->data_type = data_type; + }; + auto modify_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; /* TODO: Use highest priority domain. */ + info->data_type = bke::attribute_data_type_highest_complexity( + {info->data_type, data_type}); + }; + + attributes.add_or_modify(name, add_info, modify_info); + } + } +} + +static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups) +{ + int totverts = 0; + int totloops = 0; + int totedges = 0; + int totpolys = 0; + int64_t cd_dirty_vert = 0; + int64_t cd_dirty_poly = 0; + int64_t cd_dirty_edge = 0; + int64_t cd_dirty_loop = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + totverts += mesh.totvert * set_group.transforms.size(); + totloops += mesh.totloop * set_group.transforms.size(); + totedges += mesh.totedge * set_group.transforms.size(); + totpolys += mesh.totpoly * set_group.transforms.size(); + cd_dirty_vert |= mesh.runtime.cd_dirty_vert; + cd_dirty_poly |= mesh.runtime.cd_dirty_poly; + cd_dirty_edge |= mesh.runtime.cd_dirty_edge; + cd_dirty_loop |= mesh.runtime.cd_dirty_loop; + } + } + + Mesh *new_mesh = BKE_mesh_new_nomain(totverts, totedges, 0, totloops, totpolys); + /* Copy settings from the first input geometry set with a mesh. */ + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + BKE_mesh_copy_settings(new_mesh, &mesh); + break; + } + } + new_mesh->runtime.cd_dirty_vert = cd_dirty_vert; + new_mesh->runtime.cd_dirty_poly = cd_dirty_poly; + new_mesh->runtime.cd_dirty_edge = cd_dirty_edge; + new_mesh->runtime.cd_dirty_loop = cd_dirty_loop; + + int vert_offset = 0; + int loop_offset = 0; + int edge_offset = 0; + int poly_offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has_mesh()) { + const Mesh &mesh = *set.get_mesh_for_read(); + for (const float4x4 &transform : set_group.transforms) { + for (const int i : IndexRange(mesh.totvert)) { + const MVert &old_vert = mesh.mvert[i]; + MVert &new_vert = new_mesh->mvert[vert_offset + i]; + + new_vert = old_vert; + + const float3 new_position = transform * float3(old_vert.co); + copy_v3_v3(new_vert.co, new_position); + } + for (const int i : IndexRange(mesh.totedge)) { + const MEdge &old_edge = mesh.medge[i]; + MEdge &new_edge = new_mesh->medge[edge_offset + i]; + new_edge = old_edge; + new_edge.v1 += vert_offset; + new_edge.v2 += vert_offset; + } + for (const int i : IndexRange(mesh.totloop)) { + const MLoop &old_loop = mesh.mloop[i]; + MLoop &new_loop = new_mesh->mloop[loop_offset + i]; + new_loop = old_loop; + new_loop.v += vert_offset; + new_loop.e += edge_offset; + } + for (const int i : IndexRange(mesh.totpoly)) { + const MPoly &old_poly = mesh.mpoly[i]; + MPoly &new_poly = new_mesh->mpoly[poly_offset + i]; + new_poly = old_poly; + new_poly.loopstart += loop_offset; + } + + vert_offset += mesh.totvert; + loop_offset += mesh.totloop; + edge_offset += mesh.totedge; + poly_offset += mesh.totpoly; + } + } + } + + return new_mesh; +} + +static void join_attributes(Span set_groups, + const GeometryComponentType component_type, + const Map &attribute_info, + GeometryComponent &result) +{ + for (Map::Item entry : attribute_info.items()) { + StringRef name = entry.key; + const AttributeDomain domain_output = entry.value.domain; + const CustomDataType data_type_output = entry.value.data_type; + const CPPType *cpp_type = bke::custom_data_type_to_cpp_type(data_type_output); + BLI_assert(cpp_type != nullptr); + + result.attribute_try_create(entry.key, domain_output, data_type_output); + WriteAttributePtr write_attribute = result.attribute_try_get_for_write(name); + if (!write_attribute || &write_attribute->cpp_type() != cpp_type || + write_attribute->domain() != domain_output) { + continue; + } + fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); + + int offset = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has(component_type)) { + const GeometryComponent &component = *set.get_component_for_read(component_type); + const int domain_size = component.attribute_domain_size(domain_output); + if (domain_size == 0) { + continue; /* Domain size is 0, so no need to increment the offset. */ + } + ReadAttributePtr source_attribute = component.attribute_try_get_for_read( + name, domain_output, data_type_output); + + if (source_attribute) { + fn::GSpan src_span = source_attribute->get_span(); + const void *src_buffer = src_span.data(); + for (const int UNUSED(i) : set_group.transforms.index_range()) { + void *dst_buffer = dst_span[offset]; + cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); + offset += domain_size; + } + } + else { + offset += domain_size * set_group.transforms.size(); + } + } + } + + write_attribute->apply_span(); + } +} + +static void join_instance_groups_mesh(Span set_groups, GeometrySet &result) +{ + Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups); + + MeshComponent &dst_component = result.get_component_for_write(); + dst_component.replace(new_mesh); + + /* The position attribute is handled above already. */ + Map attributes; + gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {"position"}); + join_attributes(set_groups, + GeometryComponentType::Mesh, + attributes, + static_cast(dst_component)); +} + +static void join_instance_groups_pointcloud(Span set_groups, + GeometrySet &result) +{ + int totpoint = 0; + for (const GeometryInstanceGroup &set_group : set_groups) { + const GeometrySet &set = set_group.geometry_set; + if (set.has()) { + const PointCloudComponent &component = *set.get_component_for_read(); + totpoint += component.attribute_domain_size(ATTR_DOMAIN_POINT); + } + } + + PointCloudComponent &dst_component = result.get_component_for_write(); + PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); + dst_component.replace(pointcloud); + Map attributes; + gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {}); + join_attributes(set_groups, + GeometryComponentType::PointCloud, + attributes, + static_cast(dst_component)); +} + +static void join_instance_groups_volume(Span set_groups, + GeometrySet &result) +{ + /* Not yet supported. Joining volume grids with the same name requires resampling of at least + * one of the grids. The cell size of the resulting volume has to be determined somehow. */ + VolumeComponent &dst_component = result.get_component_for_write(); + UNUSED_VARS(set_groups, dst_component); +} + +GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) +{ + if (!geometry_set.has_instances()) { + return geometry_set; + } + + GeometrySet new_geometry_set; + + Vector set_groups = bke::geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, new_geometry_set); + join_instance_groups_pointcloud(set_groups, new_geometry_set); + join_instance_groups_volume(set_groups, new_geometry_set); + + return new_geometry_set; +} + } // namespace blender::bke diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 222aa559e8a..1149ab51ad0 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -20,6 +20,7 @@ #include "BKE_attribute_access.hh" #include "BKE_geometry_set.hh" +#include "BKE_geometry_set_instances.hh" #include "BKE_persistent_data_handle.hh" #include "DNA_node_types.h" @@ -38,6 +39,7 @@ using bke::Float3ReadAttribute; using bke::Float3WriteAttribute; using bke::FloatReadAttribute; using bke::FloatWriteAttribute; +using bke::geometry_set_realize_instances; using bke::Int32ReadAttribute; using bke::Int32WriteAttribute; using bke::PersistentDataHandleMap; diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index daee693c24f..0f725ecf211 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -28,249 +28,6 @@ namespace blender::nodes { using bke::GeometryInstanceGroup; -void gather_attribute_info(Map &attributes, - const GeometryComponentType component_type, - Span set_groups, - const Set &ignored_attributes) -{ - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (!set.has(component_type)) { - continue; - } - const GeometryComponent &component = *set.get_component_for_read(component_type); - - for (const std::string &name : component.attribute_names()) { - if (ignored_attributes.contains(name)) { - continue; - } - const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); - if (!read_attribute) { - continue; - } - const AttributeDomain domain = read_attribute->domain(); - const CustomDataType data_type = read_attribute->custom_data_type(); - - auto add_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; - info->data_type = data_type; - }; - auto modify_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; /* TODO: Use highest priority domain. */ - info->data_type = bke::attribute_data_type_highest_complexity( - {info->data_type, data_type}); - }; - - attributes.add_or_modify(name, add_info, modify_info); - } - } -} - -static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups) -{ - int totverts = 0; - int totloops = 0; - int totedges = 0; - int totpolys = 0; - int64_t cd_dirty_vert = 0; - int64_t cd_dirty_poly = 0; - int64_t cd_dirty_edge = 0; - int64_t cd_dirty_loop = 0; - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (set.has_mesh()) { - const Mesh &mesh = *set.get_mesh_for_read(); - totverts += mesh.totvert * set_group.transforms.size(); - totloops += mesh.totloop * set_group.transforms.size(); - totedges += mesh.totedge * set_group.transforms.size(); - totpolys += mesh.totpoly * set_group.transforms.size(); - cd_dirty_vert |= mesh.runtime.cd_dirty_vert; - cd_dirty_poly |= mesh.runtime.cd_dirty_poly; - cd_dirty_edge |= mesh.runtime.cd_dirty_edge; - cd_dirty_loop |= mesh.runtime.cd_dirty_loop; - } - } - - Mesh *new_mesh = BKE_mesh_new_nomain(totverts, totedges, 0, totloops, totpolys); - /* Copy settings from the first input geometry set with a mesh. */ - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (set.has_mesh()) { - const Mesh &mesh = *set.get_mesh_for_read(); - BKE_mesh_copy_settings(new_mesh, &mesh); - break; - } - } - new_mesh->runtime.cd_dirty_vert = cd_dirty_vert; - new_mesh->runtime.cd_dirty_poly = cd_dirty_poly; - new_mesh->runtime.cd_dirty_edge = cd_dirty_edge; - new_mesh->runtime.cd_dirty_loop = cd_dirty_loop; - - int vert_offset = 0; - int loop_offset = 0; - int edge_offset = 0; - int poly_offset = 0; - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (set.has_mesh()) { - const Mesh &mesh = *set.get_mesh_for_read(); - for (const float4x4 &transform : set_group.transforms) { - for (const int i : IndexRange(mesh.totvert)) { - const MVert &old_vert = mesh.mvert[i]; - MVert &new_vert = new_mesh->mvert[vert_offset + i]; - - new_vert = old_vert; - - const float3 new_position = transform * float3(old_vert.co); - copy_v3_v3(new_vert.co, new_position); - } - for (const int i : IndexRange(mesh.totedge)) { - const MEdge &old_edge = mesh.medge[i]; - MEdge &new_edge = new_mesh->medge[edge_offset + i]; - new_edge = old_edge; - new_edge.v1 += vert_offset; - new_edge.v2 += vert_offset; - } - for (const int i : IndexRange(mesh.totloop)) { - const MLoop &old_loop = mesh.mloop[i]; - MLoop &new_loop = new_mesh->mloop[loop_offset + i]; - new_loop = old_loop; - new_loop.v += vert_offset; - new_loop.e += edge_offset; - } - for (const int i : IndexRange(mesh.totpoly)) { - const MPoly &old_poly = mesh.mpoly[i]; - MPoly &new_poly = new_mesh->mpoly[poly_offset + i]; - new_poly = old_poly; - new_poly.loopstart += loop_offset; - } - - vert_offset += mesh.totvert; - loop_offset += mesh.totloop; - edge_offset += mesh.totedge; - poly_offset += mesh.totpoly; - } - } - } - - return new_mesh; -} - -static void join_attributes(Span set_groups, - const GeometryComponentType component_type, - const Map &attribute_info, - GeometryComponent &result) -{ - for (Map::Item entry : attribute_info.items()) { - StringRef name = entry.key; - const AttributeDomain domain_output = entry.value.domain; - const CustomDataType data_type_output = entry.value.data_type; - const CPPType *cpp_type = bke::custom_data_type_to_cpp_type(data_type_output); - BLI_assert(cpp_type != nullptr); - - result.attribute_try_create(entry.key, domain_output, data_type_output); - WriteAttributePtr write_attribute = result.attribute_try_get_for_write(name); - if (!write_attribute || &write_attribute->cpp_type() != cpp_type || - write_attribute->domain() != domain_output) { - continue; - } - fn::GMutableSpan dst_span = write_attribute->get_span_for_write_only(); - - int offset = 0; - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (set.has(component_type)) { - const GeometryComponent &component = *set.get_component_for_read(component_type); - const int domain_size = component.attribute_domain_size(domain_output); - if (domain_size == 0) { - continue; /* Domain size is 0, so no need to increment the offset. */ - } - ReadAttributePtr source_attribute = component.attribute_try_get_for_read( - name, domain_output, data_type_output); - - if (source_attribute) { - fn::GSpan src_span = source_attribute->get_span(); - const void *src_buffer = src_span.data(); - for (const int UNUSED(i) : set_group.transforms.index_range()) { - void *dst_buffer = dst_span[offset]; - cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); - offset += domain_size; - } - } - else { - offset += domain_size * set_group.transforms.size(); - } - } - } - - write_attribute->apply_span(); - } -} - -static void join_instance_groups_mesh(Span set_groups, GeometrySet &result) -{ - Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups); - - MeshComponent &dst_component = result.get_component_for_write(); - dst_component.replace(new_mesh); - - /* The position attribute is handled above already. */ - Map attributes; - gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {"position"}); - join_attributes(set_groups, - GeometryComponentType::Mesh, - attributes, - static_cast(dst_component)); -} - -static void join_instance_groups_pointcloud(Span set_groups, - GeometrySet &result) -{ - int totpoint = 0; - for (const GeometryInstanceGroup &set_group : set_groups) { - const GeometrySet &set = set_group.geometry_set; - if (set.has()) { - const PointCloudComponent &component = *set.get_component_for_read(); - totpoint += component.attribute_domain_size(ATTR_DOMAIN_POINT); - } - } - - PointCloudComponent &dst_component = result.get_component_for_write(); - PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); - dst_component.replace(pointcloud); - Map attributes; - gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {}); - join_attributes(set_groups, - GeometryComponentType::PointCloud, - attributes, - static_cast(dst_component)); -} - -static void join_instance_groups_volume(Span set_groups, - GeometrySet &result) -{ - /* Not yet supported. Joining volume grids with the same name requires resampling of at least - * one of the grids. The cell size of the resulting volume has to be determined somehow. */ - VolumeComponent &dst_component = result.get_component_for_write(); - UNUSED_VARS(set_groups, dst_component); -} - -GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) -{ - if (!geometry_set.has_instances()) { - return geometry_set; - } - - GeometrySet new_geometry_set; - - Vector set_groups = bke::geometry_set_gather_instances(geometry_set); - join_instance_groups_mesh(set_groups, new_geometry_set); - join_instance_groups_pointcloud(set_groups, new_geometry_set); - join_instance_groups_volume(set_groups, new_geometry_set); - - return new_geometry_set; -} - /** * Update the availability of a group of input sockets with the same name, * used for switching between attribute inputs or single values. diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index 78418b37011..271e3771006 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -25,7 +25,6 @@ #include "DNA_node_types.h" -#include "BKE_geometry_set_instances.hh" #include "BKE_node.h" #include "BLT_translation.h" @@ -48,21 +47,4 @@ void update_attribute_input_socket_availabilities(bNode &node, Array get_geometry_element_ids_as_uints(const GeometryComponent &component, const AttributeDomain domain); -GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); - -struct AttributeInfo { - CustomDataType data_type; - AttributeDomain domain; -}; - -/** - * Add information about all the attributes on every component of the type. The resulting info - * will contain the highest complexity data type and the highest priority domain among every - * attribute with the given name on all of the input components. - */ -void gather_attribute_info(Map &attributes, - const GeometryComponentType component_type, - Span set_groups, - const Set &ignored_attributes); - } // namespace blender::nodes From 1ec30d4b15684df333926aae78516b07dab428ad Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 16 Feb 2021 13:35:06 +0100 Subject: [PATCH 206/519] Fix T85697: subdivision surface node output does not contain vertex group names The vertex weights were actually interpolated correctly. The issue was that vertex group names were removed from the output geometry set. We have to keep track of these names separately from the mesh, for legacy reasons. Vertex group names are not stored on meshes but objects instead. --- .../nodes/geometry/nodes/node_geo_subdivision_surface.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc index 4cdb669f964..47304a0de68 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc @@ -109,7 +109,8 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params) Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in); BKE_mesh_calc_normals(mesh_out); - geometry_set.replace_mesh(mesh_out); + MeshComponent &mesh_component = geometry_set.get_component_for_write(); + mesh_component.replace_mesh_but_keep_vertex_group_names(mesh_out); // BKE_subdiv_stats_print(&subdiv->stats); BKE_subdiv_free(subdiv); From c13754e6475e438ebd2fbafa2e51aa58504dc5f9 Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Tue, 16 Feb 2021 13:21:28 +0100 Subject: [PATCH 207/519] Fixes T84928 : Lattice vertices at unexpected positions when changing lattice resolution from 1 to 3 or more. Fix for T84928 . Considering the changes , issue is resolved ( Ignoring readability issues) . **Changes **: - `Change in value assignment of fu/v/w :` Observing previous code , I noticed ,value assigned to them is equivalent to -0.5 ( i.e. co-ordinate of left most vertex of lattice size =1 where centre of lattice is origin ) . - `Change in value assignment of du/v/w :` Margin ( distance ) between each division of surface along any axis is equivalent to **( (length of surface along axis ) / (no of division line - 1) )** . that's why is changed it to (default_size/unew -1) . - ` New variable declared "default_size" :` As far as I gone through the code , I noticed values 1 < du ,fu < 1 , which indicates these values were calculated with respect to default lattice of size 1 . - `removed pntsu/v/w != 1 check :` Following changes inside the if block worked properly for pntsu/v/w = 1 . Reviewed By: lichtwerk, campbellbarton Differential Revision: https://developer.blender.org/D10353 --- source/blender/blenkernel/intern/lattice.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 74f78106be5..84ffd8c636b 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -319,19 +319,21 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) * size first. */ if (ltOb) { - if (uNew != 1 && lt->pntsu != 1) { - fu = lt->fu; - du = (lt->pntsu - 1) * lt->du / (uNew - 1); + const float default_size = 1.0; + + if (uNew != 1) { + fu = -default_size / 2.0; + du = default_size / (uNew - 1); } - if (vNew != 1 && lt->pntsv != 1) { - fv = lt->fv; - dv = (lt->pntsv - 1) * lt->dv / (vNew - 1); + if (vNew != 1) { + fv = -default_size / 2.0; + dv = default_size / (vNew - 1); } - if (wNew != 1 && lt->pntsw != 1) { - fw = lt->fw; - dw = (lt->pntsw - 1) * lt->dw / (wNew - 1); + if (wNew != 1) { + fw = -default_size / 2.0; + dw = default_size / (wNew - 1); } } From 82ade44299083e86acbaafbcb21ac350d861881d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 16 Feb 2021 14:22:44 +0100 Subject: [PATCH 208/519] LibOverride: Add support for rotation mode of PoseBones. Request from the studio. --- source/blender/makesrna/intern/rna_pose.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 89a6c7cdf9d..bd45990fe30 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -1142,6 +1142,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "rotmode"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_enum_items(prop, rna_enum_object_rotation_mode_items); RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL); /* XXX... disabled, since proxy-locked layers are currently From 500bc99da5dbcdf7c728833326fc29babaf529e0 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 16 Feb 2021 14:25:35 +0100 Subject: [PATCH 209/519] Fix T85697: implement interpolation for float custom data type This just hasn't been implemented before. --- source/blender/blenkernel/intern/customdata.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 782b4fc200e..9188d8c1afd 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -473,6 +473,21 @@ static void layerCopy_propFloat(const void *source, void *dest, int count) memcpy(dest, source, sizeof(MFloatProperty) * count); } +static void layerInterp_propFloat(const void **sources, + const float *weights, + const float *UNUSED(sub_weights), + int count, + void *dest) +{ + float result = 0.0f; + for (int i = 0; i < count; i++) { + const float interp_weight = weights[i]; + const float src = *(const float *)sources[i]; + result += src * interp_weight; + } + *(float *)dest = result; +} + static bool layerValidate_propFloat(void *data, const uint totitems, const bool do_fixes) { MFloatProperty *fp = data; @@ -1553,7 +1568,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { N_("Float"), layerCopy_propFloat, NULL, - NULL, + layerInterp_propFloat, NULL, NULL, layerValidate_propFloat}, From e81fca1ed38ea447a1023dae3841f8980def28e4 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Tue, 16 Feb 2021 15:24:22 +0100 Subject: [PATCH 210/519] Assets: Remove appended asset when dropping operation fails When dropping an asset somewhere, it is appended and then a drop operation is called to actually add it to the scene based on current context. If this drop operation fails, the appended data-block is now still in the .blend. The user may not notice and not expect this. Instead idea is to rollback any changes done by dropping code if the operation fails, namely removing the appended data-block again. Adds a new `cancel()` callback which is called if the drop operator returns `OPERATOR_CANCELLED` to drop-boxes and a generic function to deal with assets on drop failure. Also removes the `free_id_on_error` property of the `NODE_OT_add_group` operator, which was used as ad-hoc solution to get this same behavior. --- source/blender/editors/screen/screen_ops.c | 4 +- .../blender/editors/space_clip/space_clip.c | 2 +- .../editors/space_console/space_console.c | 4 +- .../blender/editors/space_file/space_file.c | 2 +- .../blender/editors/space_image/space_image.c | 2 +- source/blender/editors/space_node/node_add.c | 12 ------ .../blender/editors/space_node/space_node.c | 22 ++++++---- .../space_outliner/outliner_dragdrop.c | 12 +++--- .../editors/space_sequencer/space_sequencer.c | 6 +-- .../blender/editors/space_text/space_text.c | 4 +- .../editors/space_view3d/space_view3d.c | 38 +++++++++++++---- source/blender/windowmanager/WM_api.h | 7 +++- source/blender/windowmanager/WM_types.h | 6 +++ .../windowmanager/intern/wm_dragdrop.c | 41 ++++++++++++++++++- .../windowmanager/intern/wm_event_system.c | 8 +++- 15 files changed, 121 insertions(+), 49 deletions(-) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 0fc7e713bac..47feb49bd44 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -5567,8 +5567,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) /* dropbox for entire window */ ListBase *lb = WM_dropboxmap_find("Window", 0, 0); - WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy); - WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy); + WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy, NULL); + WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy, NULL); keymap_modal_set(keyconf); } diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 2a7c64a83f7..e0a524a79c1 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -639,7 +639,7 @@ static void clip_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Clip", SPACE_CLIP, 0); - WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy); + WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy, NULL); } static void clip_refresh(const bContext *C, ScrArea *area) diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index b24579d9871..56a6204b385 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -196,8 +196,8 @@ static void console_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy); - WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy); + WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy, NULL); + WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index 178ca264182..66d24c7ab53 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -766,7 +766,7 @@ static void file_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Window", SPACE_EMPTY, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy); + WM_dropbox_add(lb, "FILE_OT_filepath_drop", filepath_drop_poll, filepath_drop_copy, NULL); } static int file_space_subtype_get(ScrArea *area) diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 69976bc088c..95ca8aba399 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -280,7 +280,7 @@ static void image_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Image", SPACE_IMAGE, 0); - WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy); + WM_dropbox_add(lb, "IMAGE_OT_open", image_drop_poll, image_drop_copy, NULL); } /** diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c index 74fa5cdeb9d..699e5c1d165 100644 --- a/source/blender/editors/space_node/node_add.c +++ b/source/blender/editors/space_node/node_add.c @@ -323,9 +323,6 @@ static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain, return NULL; } if ((node_group->type != ntree->type) || !nodeGroupPoll(ntree, node_group)) { - if (RNA_boolean_get(op->ptr, "free_id_on_error")) { - BKE_id_delete(bmain, node_group); - } return NULL; } @@ -389,8 +386,6 @@ static int node_add_group_invoke(bContext *C, wmOperator *op, const wmEvent *eve void NODE_OT_add_group(wmOperatorType *ot) { - PropertyRNA *prop; - /* identifiers */ ot->name = "Add Node Group"; ot->description = "Add an existing node group to the current node editor"; @@ -405,13 +400,6 @@ void NODE_OT_add_group(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); - prop = RNA_def_boolean( - ot->srna, - "free_id_on_error", - false, - "Free Group on Error", - "Free the named node group data-block if it could not be added to the tree"); - RNA_def_property_flag(prop, PROP_HIDDEN); } /* ****************** Add File Node Operator ******************* */ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 6e6b0a584cf..289b7d9efa1 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -692,10 +692,6 @@ static void node_group_drop_copy(wmDrag *drag, wmDropBox *drop) ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0); RNA_string_set(drop->ptr, "name", id->name + 2); - if (drag->type == WM_DRAG_ASSET) { - /* ID just appended, so free it when dropping fails. */ - RNA_boolean_set(drop->ptr, "free_id_on_error", true); - } } static void node_id_drop_copy(wmDrag *drag, wmDropBox *drop) @@ -724,9 +720,21 @@ static void node_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "NODE_OT_add_group", node_group_drop_poll, node_group_drop_copy); - WM_dropbox_add(lb, "NODE_OT_add_file", node_ima_drop_poll, node_id_path_drop_copy); - WM_dropbox_add(lb, "NODE_OT_add_mask", node_mask_drop_poll, node_id_drop_copy); + WM_dropbox_add(lb, + "NODE_OT_add_group", + node_group_drop_poll, + node_group_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "NODE_OT_add_file", + node_ima_drop_poll, + node_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "NODE_OT_add_mask", + node_mask_drop_poll, + node_id_drop_copy, + WM_drag_free_imported_drag_ID); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c index 70aeef76234..5ae94cf2e64 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.c +++ b/source/blender/editors/space_outliner/outliner_dragdrop.c @@ -1504,10 +1504,10 @@ void outliner_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Outliner", SPACE_OUTLINER, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL); - WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_parent_drop", parent_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_parent_clear", parent_clear_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_scene_drop", scene_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_material_drop", material_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_datastack_drop", datastack_drop_poll, NULL, NULL); + WM_dropbox_add(lb, "OUTLINER_OT_collection_drop", collection_drop_poll, NULL, NULL); } diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index b17482cd3a4..cf26d1e3243 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -448,9 +448,9 @@ static void sequencer_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy); - WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy); - WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy); + WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy, NULL); + WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy, NULL); + WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index ea55eaea388..98faf89f8ae 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -367,8 +367,8 @@ static void text_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy); - WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste); + WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy, NULL); + WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste, NULL); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 98e1d927daf..3d260a9a05b 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -689,21 +689,41 @@ static void view3d_dropboxes(void) { ListBase *lb = WM_dropboxmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "OBJECT_OT_add_named", view3d_ob_drop_poll, view3d_ob_drop_copy); - WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy); - WM_dropbox_add( - lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy); - WM_dropbox_add( - lb, "OBJECT_OT_drop_named_image", view3d_ima_empty_drop_poll, view3d_id_path_drop_copy); - WM_dropbox_add(lb, "OBJECT_OT_volume_import", view3d_volume_drop_poll, view3d_id_path_drop_copy); + WM_dropbox_add(lb, + "OBJECT_OT_add_named", + view3d_ob_drop_poll, + view3d_ob_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_drop_named_material", + view3d_mat_drop_poll, + view3d_id_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "VIEW3D_OT_background_image_add", + view3d_ima_bg_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_drop_named_image", + view3d_ima_empty_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); + WM_dropbox_add(lb, + "OBJECT_OT_volume_import", + view3d_volume_drop_poll, + view3d_id_path_drop_copy, + WM_drag_free_imported_drag_ID); WM_dropbox_add(lb, "OBJECT_OT_collection_instance_add", view3d_collection_drop_poll, - view3d_collection_drop_copy); + view3d_collection_drop_copy, + WM_drag_free_imported_drag_ID); WM_dropbox_add(lb, "OBJECT_OT_data_instance_add", view3d_object_data_drop_poll, - view3d_id_drop_copy_with_type); + view3d_id_drop_copy_with_type, + WM_drag_free_imported_drag_ID); } static void view3d_widgets(void) diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 69177f39c04..d5de45c74fd 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -678,7 +678,8 @@ struct wmDropBox *WM_dropbox_add( ListBase *lb, const char *idname, bool (*poll)(struct bContext *, struct wmDrag *, const struct wmEvent *event, const char **), - void (*copy)(struct wmDrag *, struct wmDropBox *)); + void (*copy)(struct wmDrag *, struct wmDropBox *), + void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *)); ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid); /* ID drag and drop */ @@ -690,6 +691,10 @@ bool WM_drag_is_ID_type(const struct wmDrag *drag, int idcode); struct wmDragAsset *WM_drag_get_asset_data(const struct wmDrag *drag, int idcode); struct ID *WM_drag_get_local_ID_or_import_from_asset(const struct wmDrag *drag, int idcode); +void WM_drag_free_imported_drag_ID(struct Main *bmain, + struct wmDrag *drag, + struct wmDropBox *drop); + /* Set OpenGL viewport and scissor */ void wmViewport(const struct rcti *winrct); void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 24aa5bc4869..d40c0715a09 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -903,6 +903,12 @@ typedef struct wmDropBox { /** Before exec, this copies drag info to #wmDrop properties. */ void (*copy)(struct wmDrag *, struct wmDropBox *); + /** + * If the operator is cancelled (returns `OPERATOR_CANCELLED`), this can be used for cleanup of + * `copy()` resources. + */ + void (*cancel)(struct Main *, struct wmDrag *, struct wmDropBox *); + /** * If poll succeeds, operator is called. * Not saved in file, so can be pointer. diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index 6fdcbab889c..9684c21605a 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_idtype.h" +#include "BKE_lib_id.h" #include "GPU_shader.h" #include "GPU_state.h" @@ -95,11 +96,13 @@ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid) wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, bool (*poll)(bContext *, wmDrag *, const wmEvent *, const char **), - void (*copy)(wmDrag *, wmDropBox *)) + void (*copy)(wmDrag *, wmDropBox *), + void (*cancel)(struct Main *, wmDrag *, wmDropBox *)) { wmDropBox *drop = MEM_callocN(sizeof(wmDropBox), "wmDropBox"); drop->poll = poll; drop->copy = copy; + drop->cancel = cancel; drop->ot = WM_operatortype_find(idname, 0); drop->opcontext = WM_OP_INVOKE_DEFAULT; @@ -382,6 +385,9 @@ static ID *wm_drag_asset_id_import(wmDragAsset *asset_drag) /** * When dragging a local ID, return that. Otherwise, if dragging an asset-handle, link or append * that depending on what was chosen by the drag-box (currently append only in fact). + * + * Use #WM_drag_free_imported_drag_ID() as cancel callback of the drop-box, so that the asset + * import is rolled back if the drop operator fails. */ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode) { @@ -402,6 +408,39 @@ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode) return wm_drag_asset_id_import(asset_drag); } +/** + * \brief Free asset ID imported for cancelled drop. + * + * If the asset was imported (linked/appended) using #WM_drag_get_local_ID_or_import_from_asset()` + * (typically via a #wmDropBox.copy() callback), we want the ID to be removed again if the drop + * operator cancels. + * This is for use as #wmDropBox.cancel() callback. + */ +void WM_drag_free_imported_drag_ID(struct Main *bmain, wmDrag *drag, wmDropBox *drop) +{ + if (drag->type != WM_DRAG_ASSET) { + return; + } + + wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0); + if (!asset_drag) { + return; + } + + /* Get name from property, not asset data - it may have changed after importing to ensure + * uniqueness (name is assumed to be set from the imported ID name). */ + char name[MAX_ID_NAME - 2]; + RNA_string_get(drop->ptr, "name", name); + if (!name[0]) { + return; + } + + ID *id = BKE_libblock_find_name(bmain, asset_drag->id_type, name); + if (id) { + BKE_id_delete(bmain, id); + } +} + /* ************** draw ***************** */ static void wm_drop_operator_draw(const char *name, int x, int y) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index e132caede0d..7b047e68aee 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2820,8 +2820,14 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers ListBase single_lb = {drag, drag}; event->customdata = &single_lb; - wm_operator_call_internal( + int op_retval = wm_operator_call_internal( C, drop->ot, drop->ptr, NULL, drop->opcontext, false, event); + OPERATOR_RETVAL_CHECK(op_retval); + + if ((op_retval & OPERATOR_CANCELLED) && drop->cancel) { + drop->cancel(CTX_data_main(C), drag, drop); + } + action |= WM_HANDLER_BREAK; /* Free the drags. */ From 8971018eb64a68119687c74db875fd45f89cbdf8 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Tue, 16 Feb 2021 09:38:42 -0500 Subject: [PATCH 211/519] UI: Add support for bl_description for panels This commit adds support for `bl_description` and python docstrings for panels. This is useful for pop-over panel types so they can have a label and description. This commit also includes an example use case. Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D10429 --- .../scripts/startup/bl_ui/space_properties.py | 3 +- source/blender/blenkernel/BKE_screen.h | 1 + .../editors/interface/interface_layout.c | 3 +- source/blender/makesrna/intern/rna_ui.c | 40 ++++++++++++++++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py index 053df113dd7..b7d5b5007d6 100644 --- a/release/scripts/startup/bl_ui/space_properties.py +++ b/release/scripts/startup/bl_ui/space_properties.py @@ -72,9 +72,10 @@ class PROPERTIES_PT_navigation_bar(Panel): class PROPERTIES_PT_options(Panel): + """Show options for the properties editor""" bl_space_type = 'PROPERTIES' bl_region_type = 'HEADER' - bl_label = 'Show options for the properties editor' + bl_label = "Options" def draw(self, context): layout = self.layout diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 2fc0caf1a2c..32c888b058f 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -240,6 +240,7 @@ typedef struct PanelType { char idname[BKE_ST_MAXNAME]; /* unique name */ char label[BKE_ST_MAXNAME]; /* for panel header */ + char *description; /* for panel tooltip */ char translation_context[BKE_ST_MAXNAME]; char context[BKE_ST_MAXNAME]; /* for buttons window */ char category[BKE_ST_MAXNAME]; /* for category tabs */ diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index fef243d7193..8f90dc7f801 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -3057,7 +3057,8 @@ void uiItemPopoverPanel_ptr( }; pt->draw_header(C, &panel); } - uiBut *but = ui_item_menu(layout, name, icon, ui_item_paneltype_func, pt, NULL, NULL, true); + uiBut *but = ui_item_menu( + layout, name, icon, ui_item_paneltype_func, pt, NULL, pt->description, true); but->type = UI_BTYPE_POPOVER; if (!ok) { but->flag |= UI_BUT_DISABLED; diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 1d3a7750c39..5e5b3549986 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -261,9 +261,14 @@ static StructRNA *rna_Panel_register(Main *bmain, Panel dummypanel = {NULL}; PointerRNA dummyptr; int have_function[4]; + size_t over_alloc = 0; /* Warning, if this becomes a mess, we better do another allocation. */ + char _panel_descr[RNA_DYN_DESCR_MAX]; + size_t description_size = 0; /* setup dummy panel & panel type to store static properties in */ dummypanel.type = &dummypt; + _panel_descr[0] = '\0'; + dummypanel.type->description = _panel_descr; RNA_pointer_create(NULL, &RNA_Panel, &dummypanel, &dummyptr); /* We have to set default context! Else we get a void string... */ @@ -355,9 +360,22 @@ static StructRNA *rna_Panel_register(Main *bmain, } /* create a new panel type */ - pt = MEM_mallocN(sizeof(PanelType), "python buttons panel"); + if (_panel_descr[0]) { + description_size = strlen(_panel_descr) + 1; + over_alloc += description_size; + } + pt = MEM_callocN(sizeof(PanelType) + over_alloc, "python buttons panel"); memcpy(pt, &dummypt, sizeof(dummypt)); + if (_panel_descr[0]) { + char *buf = (char *)(pt + 1); + memcpy(buf, _panel_descr, description_size); + pt->description = buf; + } + else { + pt->description = NULL; + } + pt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, pt->idname, &RNA_Panel); RNA_def_struct_translation_context(pt->rna_ext.srna, pt->translation_context); pt->rna_ext.data = data; @@ -993,6 +1011,18 @@ static StructRNA *rna_Menu_refine(PointerRNA *mtr) return (menu->type && menu->type->rna_ext.srna) ? menu->type->rna_ext.srna : &RNA_Menu; } +static void rna_Panel_bl_description_set(PointerRNA *ptr, const char *value) +{ + Panel *data = (Panel *)(ptr->data); + char *str = (char *)data->type->description; + if (!str[0]) { + BLI_strncpy(str, value, RNA_DYN_DESCR_MAX); /* utf8 already ensured */ + } + else { + BLI_assert(!"setting the bl_description on a non-builtin panel"); + } +} + static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value) { Menu *data = (Menu *)(ptr->data); @@ -1408,6 +1438,14 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); RNA_define_verify_sdna(true); + prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "type->description"); + RNA_def_property_string_maxlength(prop, RNA_DYN_DESCR_MAX); /* else it uses the pointer size! */ + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Panel_bl_description_set"); + /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */ + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */ + prop = RNA_def_property(srna, "bl_category", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "type->category"); RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); From 520d965c77f9109492013d33cff659cd6055ff11 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 10:55:10 -0600 Subject: [PATCH 212/519] Cleanup: Compile node_draw.c with C++ This will allow using C++ data structures to draw node error messages. This required removing a forward declared enum for grease pencil undo. Compiles with clang tidy. --- source/blender/editors/gpencil/gpencil_undo.c | 10 +- source/blender/editors/include/ED_gpencil.h | 4 +- source/blender/editors/include/ED_node.h | 2 +- .../blender/editors/space_node/CMakeLists.txt | 2 +- .../space_node/{node_draw.c => node_draw.cc} | 149 ++++++++---------- .../blender/editors/space_node/node_intern.h | 10 +- 6 files changed, 88 insertions(+), 89 deletions(-) rename source/blender/editors/space_node/{node_draw.c => node_draw.cc} (95%) diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c index 583878883fa..ede1d3eefaa 100644 --- a/source/blender/editors/gpencil/gpencil_undo.c +++ b/source/blender/editors/gpencil/gpencil_undo.c @@ -62,19 +62,23 @@ int ED_gpencil_session_active(void) return (BLI_listbase_is_empty(&undo_nodes) == false); } -int ED_undo_gpencil_step(bContext *C, const eUndoStepDir step) +/** + * \param step: eUndoStepDir. + */ +int ED_undo_gpencil_step(bContext *C, const int step) { bGPdata **gpd_ptr = NULL, *new_gpd = NULL; gpd_ptr = ED_gpencil_data_get_pointers(C, NULL); - if (step == STEP_UNDO) { + const eUndoStepDir undo_step = (eUndoStepDir)step; + if (undo_step == STEP_UNDO) { if (cur_node->prev) { cur_node = cur_node->prev; new_gpd = cur_node->gpd; } } - else if (step == STEP_REDO) { + else if (undo_step == STEP_REDO) { if (cur_node->next) { cur_node = cur_node->next; new_gpd = cur_node->gpd; diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 12aef6e9464..2fbf280475b 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -62,8 +62,6 @@ struct bAnimContext; struct wmKeyConfig; struct wmOperator; -enum eUndoStepDir; - #define GPENCIL_MINIMUM_JOIN_DIST 20.0f /* Reproject stroke modes. */ @@ -215,7 +213,7 @@ bool ED_gpencil_anim_copybuf_paste(struct bAnimContext *ac, const short copy_mod /* ------------ Grease-Pencil Undo System ------------------ */ int ED_gpencil_session_active(void); -int ED_undo_gpencil_step(struct bContext *C, const enum eUndoStepDir step); +int ED_undo_gpencil_step(struct bContext *C, const int step); /* eUndoStepDir. */ /* ------------ Grease-Pencil Armature ------------------ */ bool ED_gpencil_add_armature(const struct bContext *C, diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 78f354a300d..ea2383457c2 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -80,7 +80,7 @@ void ED_node_sample_set(const float col[4]); void ED_node_draw_snap( struct View2D *v2d, const float cent[2], float size, NodeBorder border, unsigned int pos); -/* node_draw.c */ +/* node_draw.cc */ void ED_node_socket_draw(struct bNodeSocket *sock, const struct rcti *rect, const float color[4], diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index f4a3bb96aeb..c640b076ba4 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -40,7 +40,7 @@ set(SRC drawnode.c node_add.c node_buttons.c - node_draw.c + node_draw.cc node_edit.c node_gizmo.c node_group.c diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.cc similarity index 95% rename from source/blender/editors/space_node/node_draw.c rename to source/blender/editors/space_node/node_draw.cc index c7be5f848f7..044f3882d07 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.cc @@ -74,9 +74,11 @@ # include "COM_compositor.h" #endif +extern "C" { /* XXX interface.h */ extern void ui_draw_dropshadow( const rctf *rct, float radius, float aspect, float alpha, int select); +} float ED_node_grid_size(void) { @@ -103,13 +105,13 @@ static bNodeTree *node_tree_from_ID(ID *id) return ntreeFromID(id); } - return NULL; + return nullptr; } void ED_node_tag_update_id(ID *id) { bNodeTree *ntree = node_tree_from_ID(id); - if (id == NULL || ntree == NULL) { + if (id == nullptr || ntree == nullptr) { return; } @@ -156,7 +158,7 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node) } bool do_tag_update = true; - if (node != NULL) { + if (node != nullptr) { if (!node_connected_to_output(bmain, ntree, node)) { do_tag_update = false; } @@ -196,10 +198,10 @@ static bool compare_nodes(const bNode *a, const bNode *b) } /* any selected ancestor moves the node forward */ if (parent->flag & NODE_ACTIVE) { - a_active = 1; + a_active = true; } if (parent->flag & NODE_SELECT) { - a_select = 1; + a_select = true; } } for (bNode *parent = b->parent; parent; parent = parent->parent) { @@ -209,10 +211,10 @@ static bool compare_nodes(const bNode *a, const bNode *b) } /* any selected ancestor moves the node forward */ if (parent->flag & NODE_ACTIVE) { - b_active = 1; + b_active = true; } if (parent->flag & NODE_SELECT) { - b_select = 1; + b_select = true; } } @@ -245,7 +247,7 @@ void ED_node_sort(bNodeTree *ntree) int k = 1; while (k < totnodes) { - bNode *first_a = ntree->nodes.first; + bNode *first_a = (bNode *)ntree->nodes.first; bNode *first_b = first_a; do { @@ -254,7 +256,7 @@ void ED_node_sort(bNodeTree *ntree) first_b = first_b->next; } /* all batches merged? */ - if (first_b == NULL) { + if (first_b == nullptr) { break; } @@ -281,7 +283,7 @@ void ED_node_sort(bNodeTree *ntree) first_b = node_b; for (; b < k; b++) { /* all nodes sorted? */ - if (first_b == NULL) { + if (first_b == nullptr) { break; } first_b = first_b->next; @@ -399,7 +401,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label)); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); /* ensure minimum socket height in case layout is empty */ buty = min_ii(buty, dy - NODE_DY); @@ -488,7 +490,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->typeinfo->draw_buttons(layout, (bContext *)C, &nodeptr); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); dy = buty - NODE_DYS / 2; } @@ -536,7 +538,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label)); UI_block_align_end(node->block); - UI_block_layout_resolve(node->block, NULL, &buty); + UI_block_layout_resolve(node->block, nullptr, &buty); /* ensure minimum socket height in case layout is empty */ buty = min_ii(buty, dy - NODE_DY); @@ -781,7 +783,7 @@ static void node_socket_draw_multi_input(const float color[4], UI_draw_roundbox_corner_set(UI_CNR_ALL); UI_draw_roundbox_4fv_ex( - &rect, color, NULL, 1.0f, color_outline, outline_width, width - outline_width * 0.5f); + &rect, color, nullptr, 1.0f, color_outline, outline_width, width - outline_width * 0.5f); } static void node_socket_outline_color_get(bool selected, float r_outline_color[4]) @@ -807,7 +809,7 @@ void node_socket_color_get( sock->typeinfo->draw_color(C, &ptr, node_ptr, r_color); - bNode *node = node_ptr->data; + bNode *node = (bNode *)node_ptr->data; if (node->flag & NODE_MUTED) { r_color[3] *= 0.25f; } @@ -957,7 +959,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) preview->rect, scale, scale, - NULL); + nullptr); GPU_blend(GPU_BLEND_NONE); @@ -977,7 +979,7 @@ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_ /* select & activate only the button's node */ node_select_single(C, node); - WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL); + WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, nullptr); } void node_draw_shadow(const SpaceNode *snode, const bNode *node, float radius, float alpha) @@ -1022,7 +1024,7 @@ void node_draw_sockets(const View2D *v2d, /* set handle size */ float scale; - UI_view2d_scale_get(v2d, &scale, NULL); + UI_view2d_scale_get(v2d, &scale, nullptr); scale *= 2.25f * NODE_SOCKSIZE; if (!select_all) { @@ -1184,12 +1186,12 @@ static void node_draw_basis(const bContext *C, bNodeInstanceKey key) { /* float socket_size = NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */ - float iconbutw = 0.8f * UI_UNIT_X; + const float iconbutw = 0.8f * U.widget_unit; /* skip if out of view */ - if (BLI_rctf_isect(&node->totr, &v2d->cur, NULL) == false) { + if (BLI_rctf_isect(&node->totr, &v2d->cur, nullptr) == false) { UI_block_end(C, node->block); - node->block = NULL; + node->block = nullptr; return; } @@ -1213,16 +1215,16 @@ static void node_draw_basis(const bContext *C, rctf *rct = &node->totr; UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymax - NODE_DY, - .ymax = rct->ymax, - }, - true, - BASIS_RAD, - color); + + { + const rctf rect = { + rct->xmin, + rct->xmax, + rct->ymax - NODE_DY, + rct->ymax, + }; + UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); + } /* show/hide icons */ float iconofs = rct->xmax - 0.35f * U.widget_unit; @@ -1239,7 +1241,7 @@ static void node_draw_basis(const bContext *C, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1266,7 +1268,7 @@ static void node_draw_basis(const bContext *C, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1286,7 +1288,7 @@ static void node_draw_basis(const bContext *C, rct->ymax - NODE_DY, iconbutw, UI_UNIT_Y, - NULL, + nullptr, 0, 0, 0, @@ -1316,7 +1318,7 @@ static void node_draw_basis(const bContext *C, rct->ymax - NODE_DY / 2.2f - but_size / 2, but_size, but_size, - NULL, + nullptr, 0, 0, 0, @@ -1341,7 +1343,7 @@ static void node_draw_basis(const bContext *C, (int)(rct->ymax - NODE_DY), (short)(iconofs - rct->xmin - (18.0f * U.dpi_fac)), (short)NODE_DY, - NULL, + nullptr, 0, 0, 0, @@ -1371,17 +1373,16 @@ static void node_draw_basis(const bContext *C, color[3] = 0.5f; } - UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymin, - .ymax = rct->ymax - NODE_DY, - }, - true, - BASIS_RAD, - color); + { + UI_draw_roundbox_corner_set(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); + const rctf rect = { + rct->xmin, + rct->xmax, + rct->ymin, + rct->ymax - NODE_DY, + }; + UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); + } /* outline active and selected emphasis */ if (node->flag & SELECT) { @@ -1389,16 +1390,7 @@ static void node_draw_basis(const bContext *C, (node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_aa( - &(const rctf){ - .xmin = rct->xmin, - .xmax = rct->xmax, - .ymin = rct->ymin, - .ymax = rct->ymax, - }, - false, - BASIS_RAD, - color); + UI_draw_roundbox_aa(rct, false, BASIS_RAD, color); } /* disable lines */ @@ -1409,9 +1401,9 @@ static void node_draw_basis(const bContext *C, node_draw_sockets(v2d, C, ntree, node, true, false); /* preview */ - bNodeInstanceHash *previews = CTX_data_pointer_get(C, "node_previews").data; + bNodeInstanceHash *previews = (bNodeInstanceHash *)CTX_data_pointer_get(C, "node_previews").data; if (node->flag & NODE_PREVIEW && previews) { - bNodePreview *preview = BKE_node_instance_hash_lookup(previews, key); + bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_lookup(previews, key); if (preview && (preview->xsize && preview->ysize)) { if (preview->rect && !BLI_rctf_is_empty(&node->prvr)) { node_draw_preview(preview, &node->prvr); @@ -1421,7 +1413,7 @@ static void node_draw_basis(const bContext *C, UI_block_end(C, node->block); UI_block_draw(C, node->block); - node->block = NULL; + node->block = nullptr; } static void node_draw_hidden(const bContext *C, @@ -1436,7 +1428,7 @@ static void node_draw_hidden(const bContext *C, float hiddenrad = BLI_rctf_size_y(rct) / 2.0f; float scale; - UI_view2d_scale_get(v2d, &scale, NULL); + UI_view2d_scale_get(v2d, &scale, nullptr); /* shadow */ node_draw_shadow(snode, node, hiddenrad, 1.0f); @@ -1468,17 +1460,13 @@ static void node_draw_hidden(const bContext *C, GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); - UI_draw_roundbox_3fv_alpha( - &(const rctf){ - .xmin = rct->xmin + 1, - .xmax = rct->xmax - 1, - .ymin = rct->ymin + 1, - .ymax = rct->ymax - 1, - }, - false, - hiddenrad, - node->color, - 1.0f); + const rctf rect = { + rct->xmin + 1, + rct->xmax - 1, + rct->ymin + 1, + rct->ymax - 1, + }; + UI_draw_roundbox_3fv_alpha(&rect, false, hiddenrad, node->color, 1.0f); GPU_line_smooth(false); GPU_blend(GPU_BLEND_NONE); @@ -1505,7 +1493,7 @@ static void node_draw_hidden(const bContext *C, centy - but_size / 2, but_size, but_size, - NULL, + nullptr, 0, 0, 0, @@ -1539,7 +1527,7 @@ static void node_draw_hidden(const bContext *C, round_fl_to_int(centy - NODE_DY * 0.5f), (short)(BLI_rctf_size_x(rct) - ((18.0f + 12.0f) * U.dpi_fac)), (short)NODE_DY, - NULL, + nullptr, 0, 0, 0, @@ -1581,7 +1569,7 @@ static void node_draw_hidden(const bContext *C, UI_block_end(C, node->block); UI_block_draw(C, node->block); - node->block = NULL; + node->block = nullptr; } int node_get_resize_cursor(int directions) @@ -1611,7 +1599,7 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2]) } else { /* check nodes front to back */ - for (node = ntree->nodes.last; node; node = node->prev) { + for (node = (bNode *)ntree->nodes.last; node; node = node->prev) { if (BLI_rctf_isect_pt(&node->totr, cursor[0], cursor[1])) { break; /* first hit on node stops */ } @@ -1734,7 +1722,8 @@ static void sort_multi_input_socket_links(bNodeTree *ntree, SpaceNode *snode) if (socket->flag & SOCK_MULTI_INPUT) { /* The total is calculated in #node_update_nodetree, which runs before this draw step. */ const int total_inputs = socket->total_inputs; - bNodeLink **input_links = MEM_malloc_arrayN(total_inputs, sizeof(bNodeLink *), __func__); + bNodeLink **input_links = (bNodeLink **)MEM_malloc_arrayN( + total_inputs, sizeof(bNodeLink *), __func__); int index = 0; LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { @@ -1770,7 +1759,7 @@ void node_draw_nodetree(const bContext *C, bNodeTree *ntree, bNodeInstanceKey parent_key) { - if (ntree == NULL) { + if (ntree == nullptr) { return; /* groups... */ } @@ -1921,7 +1910,7 @@ void node_draw_space(const bContext *C, ARegion *region) if (snode->treepath.last) { static const int max_depth = 2; - bNodeTreePath *path = snode->treepath.last; + bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last; /* update tree path name (drawn in the bottom left) */ ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id : @@ -2032,5 +2021,5 @@ void node_draw_space(const bContext *C, ARegion *region) draw_tree_path(snode); /* scrollers */ - UI_view2d_scrollers_draw(v2d, NULL); + UI_view2d_scrollers_draw(v2d, nullptr); } diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index ee1193af8d0..a7704c5d22c 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -42,6 +42,10 @@ struct wmGizmoGroupType; struct wmKeyConfig; struct wmWindow; +#ifdef __cplusplus +extern "C" { +#endif + /* temp data to pass on to modal */ typedef struct bNodeLinkDrag { struct bNodeLinkDrag *next, *prev; @@ -77,7 +81,7 @@ typedef struct SpaceNode_Runtime { /* transform between View2Ds in the tree path */ void space_node_group_offset(struct SpaceNode *snode, float *x, float *y); -/* node_draw.c */ +/* node_draw.cc */ float node_socket_calculate_height(const bNodeSocket *socket); void node_link_calculate_multi_input_position(const bNodeLink *link, float r[2]); @@ -322,3 +326,7 @@ enum eNodeSpace_ButEvents { B_NODE_LOADIMAGE, B_NODE_SETIMAGE, }; + +#ifdef __cplusplus +} +#endif From c075b8bff22073b890679855b3342a57640bfba4 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 12:02:45 -0600 Subject: [PATCH 213/519] Cleanup: Remove use of designated initializers in C++ --- source/blender/editors/space_node/node_draw.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 044f3882d07..8662217961c 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -775,10 +775,10 @@ static void node_socket_draw_multi_input(const float color[4], const float outline_width = 1.0f; /* UI_draw_roundbox draws the outline on the outer side, so compensate for the outline width. */ const rctf rect = { - .xmin = locx - width + outline_width * 0.5f, - .xmax = locx + width - outline_width * 0.5f, - .ymin = locy - height + outline_width * 0.5f, - .ymax = locy + height - outline_width * 0.5f, + locx - width + outline_width * 0.5f, + locx + width - outline_width * 0.5f, + locy - height + outline_width * 0.5f, + locy + height - outline_width * 0.5f, }; UI_draw_roundbox_corner_set(UI_CNR_ALL); From eb2e260540439e75cd8fb74e9bb41d1e87213496 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 13:06:18 -0600 Subject: [PATCH 214/519] Cleanup: Used derived node in geometry exec params Since the derived node tree is already build for the evaluation system, it's simpler to pass a derived node to the params struct. This will also allow context lookups in nested node groups for node error messages, since the derived node has that information readily accessible. --- source/blender/modifiers/intern/MOD_nodes.cc | 3 +- source/blender/nodes/NOD_geometry_exec.hh | 8 +++-- .../nodes/intern/node_geometry_exec.cc | 36 +++++++++---------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 0fec7cfe937..706ef8578ac 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -331,7 +331,6 @@ class GeometryNodesEvaluator { void compute_output_and_forward(const DOutputSocket &socket_to_compute) { const DNode &node = socket_to_compute.node(); - const bNode &bnode = *node.bnode(); if (!socket_to_compute.is_available()) { /* If the output is not available, use a default value. */ @@ -360,7 +359,7 @@ class GeometryNodesEvaluator { /* Execute the node. */ GValueMap node_outputs_map{allocator_}; GeoNodeExecParams params{ - bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_}; + node, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_}; this->execute_node(node, params); /* Forward computed outputs to linked input sockets. */ diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 1149ab51ad0..18de52ed6d4 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -25,6 +25,8 @@ #include "DNA_node_types.h" +#include "NOD_derived_node_tree.hh" + struct Depsgraph; namespace blender::nodes { @@ -55,7 +57,7 @@ using fn::GValueMap; class GeoNodeExecParams { private: - const bNode &node_; + const DNode &node_; GValueMap &input_values_; GValueMap &output_values_; const PersistentDataHandleMap &handle_map_; @@ -63,7 +65,7 @@ class GeoNodeExecParams { Depsgraph *depsgraph_; public: - GeoNodeExecParams(const bNode &node, + GeoNodeExecParams(const DNode &node, GValueMap &input_values, GValueMap &output_values, const PersistentDataHandleMap &handle_map, @@ -178,7 +180,7 @@ class GeoNodeExecParams { */ const bNode &node() const { - return node_; + return *node_.bnode(); } const PersistentDataHandleMap &handle_map() const diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index 3de8209859b..7f4f75c294f 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -14,6 +14,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "NOD_derived_node_tree.hh" #include "NOD_geometry_exec.hh" #include "NOD_type_callbacks.hh" @@ -23,12 +24,9 @@ namespace blender::nodes { const bNodeSocket *GeoNodeExecParams::find_available_socket(const StringRef name) const { - LISTBASE_FOREACH (const bNodeSocket *, socket, &node_.inputs) { - if ((socket->flag & SOCK_UNAVAIL) != 0) { - continue; - } - if (name == socket->name) { - return socket; + for (const DSocket *socket : node_.inputs()) { + if (socket->is_available() && socket->name() == name) { + return socket->bsocket(); } } @@ -144,18 +142,19 @@ void GeoNodeExecParams::check_extract_input(StringRef identifier, const CPPType *requested_type) const { bNodeSocket *found_socket = nullptr; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) { - if (identifier == socket->identifier) { - found_socket = socket; + for (const DSocket *socket : node_.inputs()) { + if (socket->identifier() == identifier) { + found_socket = socket->bsocket(); break; } } + if (found_socket == nullptr) { std::cout << "Did not find an input socket with the identifier '" << identifier << "'.\n"; std::cout << "Possible identifiers are: "; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.inputs) { - if ((socket->flag & SOCK_UNAVAIL) == 0) { - std::cout << "'" << socket->identifier << "', "; + for (const DSocket *socket : node_.inputs()) { + if (socket->is_available()) { + std::cout << "'" << socket->identifier() << "', "; } } std::cout << "\n"; @@ -185,18 +184,19 @@ void GeoNodeExecParams::check_extract_input(StringRef identifier, void GeoNodeExecParams::check_set_output(StringRef identifier, const CPPType &value_type) const { bNodeSocket *found_socket = nullptr; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) { - if (identifier == socket->identifier) { - found_socket = socket; + for (const DSocket *socket : node_.outputs()) { + if (socket->identifier() == identifier) { + found_socket = socket->bsocket(); break; } } + if (found_socket == nullptr) { std::cout << "Did not find an output socket with the identifier '" << identifier << "'.\n"; std::cout << "Possible identifiers are: "; - LISTBASE_FOREACH (bNodeSocket *, socket, &node_.outputs) { - if ((socket->flag & SOCK_UNAVAIL) == 0) { - std::cout << "'" << socket->identifier << "', "; + for (const DSocket *socket : node_.outputs()) { + if (socket->is_available()) { + std::cout << "'" << socket->identifier() << "', "; } } std::cout << "\n"; From ba79b8013f1f1f47b7d3db3f0a1d82826c607281 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 16:17:03 -0600 Subject: [PATCH 215/519] Cleanup: Use consistent order placement for include --- source/blender/imbuf/intern/indexer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index f10e3b31141..c9581c108c0 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -29,6 +29,7 @@ #include "BLI_ghash.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #ifdef _WIN32 # include "BLI_winstuff.h" @@ -40,8 +41,6 @@ #include "BKE_global.h" -# include "BLI_threads.h" - #ifdef WITH_AVI # include "AVI_avi.h" #endif From c9c4802c1c26d1125d9bb41ff9187b61e167cc42 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 16 Feb 2021 22:37:27 +0100 Subject: [PATCH 216/519] Fix T85671: color management crash with Medium Contrast look --- intern/opencolorio/ocio_impl.cc | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index 69a8d8b17af..c4d7a0c4fe9 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -682,19 +682,25 @@ OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr } /* Add look transform. */ - const bool use_look = (strlen(look) != 0); + bool use_look = (look != nullptr && look[0] != 0); if (use_look) { const char *look_output = LookTransform::GetLooksResultColorSpace( config, config->getCurrentContext(), look); - LookTransformRcPtr lt = LookTransform::Create(); - lt->setSrc(input); - lt->setDst(look_output); - lt->setLooks(look); - group->appendTransform(lt); + if (look_output != nullptr && look_output[0] != 0) { + LookTransformRcPtr lt = LookTransform::Create(); + lt->setSrc(input); + lt->setDst(look_output); + lt->setLooks(look); + group->appendTransform(lt); - /* Make further transforms aware of the color space change. */ - input = look_output; + /* Make further transforms aware of the color space change. */ + input = look_output; + } + else { + /* For empty looks, no output color space is returned. */ + use_look = false; + } } /* Add view and display transform. */ From 461d4fc1aae200a6310a254b6e7c08070d9e94a7 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 17:15:08 -0600 Subject: [PATCH 217/519] Geometry Nodes: Node error messages This patch adds icons to the right side of nodes when they encounter a a problem. When hovered, a tooltip displays describing the encountered while evaluating the node. Some examples are: attribute doesn't exist, mesh has no faces, incorrect attribute type, etc. Exposing more messages to the system will be an ongoing process. Multiple warnings per node are supported. The system is implemented somewhat generically so that the basic structure can also be used to store more information from evaluation for the interface, like a list of available attributes. Currently the messages are just button tooltips. They could be styled differently in the future. Another limitation is that every instance of a node group in a parent node tree will have the same error messages, the "evaluation context" used to decide when to display the tooltips must be extended to support node tree paths. Differential Revision: https://developer.blender.org/D10290 --- .../blender/blenkernel/BKE_node_ui_storage.hh | 95 ++++++++++++ source/blender/blenkernel/CMakeLists.txt | 1 + source/blender/blenkernel/intern/node.cc | 10 ++ .../blenkernel/intern/node_ui_storage.cc | 104 +++++++++++++ .../blender/editors/space_node/node_draw.cc | 145 +++++++++++++++++- source/blender/makesdna/DNA_node_types.h | 3 + source/blender/modifiers/intern/MOD_nodes.cc | 31 +++- source/blender/nodes/NOD_geometry_exec.hh | 16 +- .../nodes/node_geo_attribute_randomize.cc | 2 + .../nodes/node_geo_point_distribute.cc | 4 +- .../geometry/nodes/node_geo_point_instance.cc | 6 + .../nodes/intern/node_geometry_exec.cc | 37 ++++- 12 files changed, 447 insertions(+), 7 deletions(-) create mode 100644 source/blender/blenkernel/BKE_node_ui_storage.hh create mode 100644 source/blender/blenkernel/intern/node_ui_storage.cc diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh new file mode 100644 index 00000000000..0b8ef60a603 --- /dev/null +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -0,0 +1,95 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "BLI_hash.hh" +#include "BLI_map.hh" +#include "BLI_session_uuid.h" + +#include "DNA_ID.h" +#include "DNA_modifier_types.h" +#include "DNA_session_uuid_types.h" + +struct bNode; +struct bNodeTree; +struct Object; +struct ModifierData; + +using blender::Map; + +/** + * Contains the context necessary to determine when to display settings for a certain node tree + * that may be used for multiple modifiers and objects. The object name and modifier session UUID + * are used instead of pointers because they are re-allocated between evaluations. + * + * \note This does not yet handle the context of nested node trees. + */ +class NodeTreeEvaluationContext { + private: + std::string object_name_; + SessionUUID modifier_session_uuid_; + + public: + NodeTreeEvaluationContext(const Object &object, const ModifierData &modifier) + { + object_name_ = reinterpret_cast(object).name; + modifier_session_uuid_ = modifier.session_uuid; + } + + uint64_t hash() const + { + const uint64_t hash1 = blender::DefaultHash{}(object_name_); + const uint64_t hash2 = BLI_session_uuid_hash_uint64(&modifier_session_uuid_); + return hash1 ^ (hash2 * 33); /* Copied from DefaultHash for std::pair. */ + } + + bool operator==(const NodeTreeEvaluationContext &other) const + { + return other.object_name_ == object_name_ && + BLI_session_uuid_is_equal(&other.modifier_session_uuid_, &modifier_session_uuid_); + } +}; + +enum class NodeWarningType { + Error, + Warning, + Info, +}; + +struct NodeWarning { + NodeWarningType type; + std::string message; +}; + +struct NodeUIStorage { + blender::Vector warnings; +}; + +struct NodeTreeUIStorage { + Map> context_map; +}; + +void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, + const NodeTreeEvaluationContext &context); + +void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree); + +void BKE_nodetree_error_message_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const NodeWarningType type, + std::string message); diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index ead01dbd6cb..f288bf9aabc 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -200,6 +200,7 @@ set(SRC intern/multires_versioning.c intern/nla.c intern/node.cc + intern/node_ui_storage.cc intern/object.c intern/object_deform.c intern/object_dupli.c diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index e34afd1ce17..f455f83f5c5 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -49,6 +49,7 @@ #include "BLI_ghash.h" #include "BLI_listbase.h" +#include "BLI_map.hh" #include "BLI_math.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -68,6 +69,7 @@ #include "BKE_lib_query.h" #include "BKE_main.h" #include "BKE_node.h" +#include "BKE_node_ui_storage.hh" #include "BLI_ghash.h" #include "BLI_threads.h" @@ -215,6 +217,10 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c /* node tree will generate its own interface type */ ntree_dst->interface_type = nullptr; + + /* Don't copy error messages in the runtime struct. + * They should be filled during execution anyway. */ + ntree_dst->ui_storage = nullptr; } static void ntree_free_data(ID *id) @@ -268,6 +274,8 @@ static void ntree_free_data(ID *id) if (ntree->id.tag & LIB_TAG_LOCALIZED) { BKE_libblock_free_data(&ntree->id, true); } + + delete ntree->ui_storage; } static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock) @@ -557,6 +565,7 @@ static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_addres ntree->interface_type = nullptr; ntree->progress = nullptr; ntree->execdata = nullptr; + ntree->ui_storage = nullptr; BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id); @@ -588,6 +597,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) ntree->progress = nullptr; ntree->execdata = nullptr; + ntree->ui_storage = nullptr; BLO_read_data_address(reader, &ntree->adt); BKE_animdata_blend_read_data(reader, ntree->adt); diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc new file mode 100644 index 00000000000..4c8a5c824c4 --- /dev/null +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -0,0 +1,104 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "CLG_log.h" + +#include "BLI_map.hh" +#include "BLI_string_ref.hh" +#include "BLI_vector.hh" + +#include "DNA_node_types.h" +#include "DNA_object_types.h" + +#include "BKE_node_ui_storage.hh" + +static CLG_LogRef LOG = {"bke.node_ui_storage"}; + +using blender::Map; +using blender::StringRef; +using blender::Vector; + +void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree) +{ + if (ntree.ui_storage == nullptr) { + ntree.ui_storage = new NodeTreeUIStorage(); + } +} + +/** + * Removes only the UI data associated with a particular evaluation context. The same node tree + * can be used for execution in multiple places, but the entire UI storage can't be removed when + * one execution starts, or all of the data associated with the node tree would be lost. + */ +void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, + const NodeTreeEvaluationContext &context) +{ + NodeTreeUIStorage *ui_storage = ntree.ui_storage; + if (ui_storage != nullptr) { + ui_storage->context_map.remove(context); + } +} + +static void node_error_message_log(bNodeTree &ntree, + const bNode &node, + const StringRef message, + const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + CLOG_ERROR(&LOG, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + case NodeWarningType::Warning: + CLOG_WARN(&LOG, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + case NodeWarningType::Info: + CLOG_INFO(&LOG, + 2, + "Node Tree: \"%s\", Node: \"%s\", %s", + ntree.id.name + 2, + node.name, + message.data()); + break; + } +} + +void BKE_nodetree_error_message_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const NodeWarningType type, + std::string message) +{ + BLI_assert(ntree.ui_storage != nullptr); + NodeTreeUIStorage &ui_storage = *ntree.ui_storage; + + node_error_message_log(ntree, node, message, type); + + Map &node_tree_ui_storage = + ui_storage.context_map.lookup_or_add_default(context); + + NodeUIStorage &node_ui_storage = node_tree_ui_storage.lookup_or_add_default_as( + StringRef(node.name)); + + node_ui_storage.warnings.append({type, std::move(message)}); +} diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 8662217961c..f85d29f99d5 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -27,6 +27,7 @@ #include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" +#include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -34,7 +35,11 @@ #include "DNA_world_types.h" #include "BLI_blenlib.h" +#include "BLI_map.hh" #include "BLI_math.h" +#include "BLI_span.hh" +#include "BLI_string_ref.hh" +#include "BLI_vector.hh" #include "BLT_translation.h" @@ -42,6 +47,8 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_node.h" +#include "BKE_node_ui_storage.hh" +#include "BKE_object.h" #include "DEG_depsgraph.h" @@ -74,6 +81,11 @@ # include "COM_compositor.h" #endif +using blender::Map; +using blender::Span; +using blender::StringRef; +using blender::Vector; + extern "C" { /* XXX interface.h */ extern void ui_draw_dropshadow( @@ -1178,6 +1190,135 @@ void node_draw_sockets(const View2D *v2d, } } +static int node_error_type_to_icon(const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + return ICON_ERROR; + case NodeWarningType::Warning: + return ICON_ERROR; + case NodeWarningType::Info: + return ICON_INFO; + } + + BLI_assert(false); + return ICON_ERROR; +} + +static uint8_t node_error_type_priority(const NodeWarningType type) +{ + switch (type) { + case NodeWarningType::Error: + return 3; + case NodeWarningType::Warning: + return 2; + case NodeWarningType::Info: + return 1; + } + + BLI_assert(false); + return 0; +} + +static NodeWarningType node_error_highest_priority(Span warnings) +{ + uint8_t highest_priority = 0; + NodeWarningType highest_priority_type = NodeWarningType::Info; + for (const NodeWarning &warning : warnings) { + const uint8_t priority = node_error_type_priority(warning.type); + if (priority > highest_priority) { + highest_priority = priority; + highest_priority_type = warning.type; + } + } + return highest_priority_type; +} + +static char *node_errrors_tooltip_fn(bContext *UNUSED(C), void *argN, const char *UNUSED(tip)) +{ + const NodeUIStorage **storage_pointer_alloc = static_cast(argN); + const NodeUIStorage *node_ui_storage = *storage_pointer_alloc; + Span warnings = node_ui_storage->warnings; + + std::string complete_string; + + for (const NodeWarning &warning : warnings.drop_back(1)) { + complete_string += warning.message; + complete_string += '\n'; + } + + complete_string += warnings.last().message; + + /* Remove the last period-- the tooltip system adds this automatically. */ + if (complete_string.back() == '.') { + complete_string.pop_back(); + } + + return BLI_strdupn(complete_string.c_str(), complete_string.size()); +} + +#define NODE_HEADER_ICON_SIZE (0.8f * U.widget_unit) + +static const NodeUIStorage *node_ui_storage_get_from_context(const bContext *C, + const bNodeTree &ntree, + const bNode &node) +{ + const NodeTreeUIStorage *ui_storage = ntree.ui_storage; + if (ui_storage == nullptr) { + return nullptr; + } + + const Object *active_object = CTX_data_active_object(C); + const ModifierData *active_modifier = BKE_object_active_modifier(active_object); + if (active_object == nullptr || active_modifier == nullptr) { + return nullptr; + } + + const NodeTreeEvaluationContext context(*active_object, *active_modifier); + const Map *storage = ui_storage->context_map.lookup_ptr(context); + if (storage == nullptr) { + return nullptr; + } + + return storage->lookup_ptr_as(StringRef(node.name)); +} + +static void node_add_error_message_button( + const bContext *C, bNodeTree &ntree, bNode &node, const rctf &rect, float &icon_offset) +{ + const NodeUIStorage *node_ui_storage = node_ui_storage_get_from_context(C, ntree, node); + if (node_ui_storage == nullptr) { + return; + } + + /* The UI API forces us to allocate memory for each error button, because the + * ownership of #UI_but_func_tooltip_set's argument is transferred to the button. */ + const NodeUIStorage **storage_pointer_alloc = (const NodeUIStorage **)MEM_mallocN( + sizeof(NodeUIStorage *), __func__); + *storage_pointer_alloc = node_ui_storage; + + const NodeWarningType display_type = node_error_highest_priority(node_ui_storage->warnings); + + icon_offset -= NODE_HEADER_ICON_SIZE; + UI_block_emboss_set(node.block, UI_EMBOSS_NONE); + uiBut *but = uiDefIconBut(node.block, + UI_BTYPE_BUT, + 0, + node_error_type_to_icon(display_type), + icon_offset, + rect.ymax - NODE_DY, + NODE_HEADER_ICON_SIZE, + UI_UNIT_Y, + nullptr, + 0, + 0, + 0, + 0, + nullptr); + UI_but_func_tooltip_set(but, node_errrors_tooltip_fn, storage_pointer_alloc); + UI_block_emboss_set(node.block, UI_EMBOSS); +} + static void node_draw_basis(const bContext *C, const View2D *v2d, const SpaceNode *snode, @@ -1186,7 +1327,7 @@ static void node_draw_basis(const bContext *C, bNodeInstanceKey key) { /* float socket_size = NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */ - const float iconbutw = 0.8f * U.widget_unit; + const float iconbutw = NODE_HEADER_ICON_SIZE; /* skip if out of view */ if (BLI_rctf_isect(&node->totr, &v2d->cur, nullptr) == false) { @@ -1297,6 +1438,8 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); } + node_add_error_message_button(C, *ntree, *node, *rct, iconofs); + /* title */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index a7b5be753d1..3f1f8328cef 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -43,6 +43,7 @@ struct bNodeLink; struct bNodePreview; struct bNodeTreeExec; struct bNodeType; +struct NodeTreeUIStorage; struct uiBlock; #define NODE_MAXSTR 64 @@ -501,6 +502,8 @@ typedef struct bNodeTree { int (*test_break)(void *); void (*update_draw)(void *); void *tbh, *prh, *sdh, *udh; + + struct NodeTreeUIStorage *ui_storage; } bNodeTree; /* ntree->type, index */ diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 706ef8578ac..9ec7bdf3b80 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -50,6 +50,7 @@ #include "BKE_lib_query.h" #include "BKE_mesh.h" #include "BKE_modifier.h" +#include "BKE_node_ui_storage.hh" #include "BKE_pointcloud.h" #include "BKE_screen.h" #include "BKE_simulation.h" @@ -244,6 +245,7 @@ class GeometryNodesEvaluator { const blender::nodes::DataTypeConversions &conversions_; const PersistentDataHandleMap &handle_map_; const Object *self_object_; + const ModifierData *modifier_; Depsgraph *depsgraph_; public: @@ -252,12 +254,14 @@ class GeometryNodesEvaluator { blender::nodes::MultiFunctionByNode &mf_by_node, const PersistentDataHandleMap &handle_map, const Object *self_object, + const ModifierData *modifier, Depsgraph *depsgraph) : group_outputs_(std::move(group_outputs)), mf_by_node_(mf_by_node), conversions_(blender::nodes::get_implicit_type_conversions()), handle_map_(handle_map), self_object_(self_object), + modifier_(modifier), depsgraph_(depsgraph) { for (auto item : group_input_data.items()) { @@ -359,7 +363,7 @@ class GeometryNodesEvaluator { /* Execute the node. */ GValueMap node_outputs_map{allocator_}; GeoNodeExecParams params{ - node, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_}; + node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_}; this->execute_node(node, params); /* Forward computed outputs to linked input sockets. */ @@ -946,6 +950,19 @@ static void fill_data_handle_map(const NodesModifierSettings &settings, } } +static void reset_tree_ui_storage(Span trees, + const Object &object, + const ModifierData &modifier) +{ + const NodeTreeEvaluationContext context = {object, modifier}; + + for (const blender::nodes::NodeTreeRef *tree : trees) { + bNodeTree *btree_cow = tree->btree(); + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + BKE_nodetree_ui_storage_free_for_context(*btree_original, context); + } +} + /** * Evaluate a node group to compute the output geometry. * Currently, this uses a fairly basic and inefficient algorithm that might compute things more @@ -992,8 +1009,14 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree, Vector group_outputs; group_outputs.append(&socket_to_compute); - GeometryNodesEvaluator evaluator{ - group_inputs, group_outputs, mf_by_node, handle_map, ctx->object, ctx->depsgraph}; + GeometryNodesEvaluator evaluator{group_inputs, + group_outputs, + mf_by_node, + handle_map, + ctx->object, + (ModifierData *)nmd, + ctx->depsgraph}; + Vector results = evaluator.execute(); BLI_assert(results.size() == 1); GMutablePointer result = results[0]; @@ -1091,6 +1114,8 @@ static void modifyGeometry(ModifierData *md, return; } + reset_tree_ui_storage(tree.used_node_tree_refs(), *ctx->object, *md); + geometry_set = compute_geometry( tree, group_inputs, *group_outputs[0], std::move(geometry_set), nmd, ctx); } diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 18de52ed6d4..d5fd3ff0abb 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -21,6 +21,7 @@ #include "BKE_attribute_access.hh" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" +#include "BKE_node_ui_storage.hh" #include "BKE_persistent_data_handle.hh" #include "DNA_node_types.h" @@ -28,6 +29,7 @@ #include "NOD_derived_node_tree.hh" struct Depsgraph; +struct ModifierData; namespace blender::nodes { @@ -62,6 +64,7 @@ class GeoNodeExecParams { GValueMap &output_values_; const PersistentDataHandleMap &handle_map_; const Object *self_object_; + const ModifierData *modifier_; Depsgraph *depsgraph_; public: @@ -70,12 +73,14 @@ class GeoNodeExecParams { GValueMap &output_values, const PersistentDataHandleMap &handle_map, const Object *self_object, + const ModifierData *modifier, Depsgraph *depsgraph) : node_(node), input_values_(input_values), output_values_(output_values), handle_map_(handle_map), self_object_(self_object), + modifier_(modifier), depsgraph_(depsgraph) { } @@ -198,9 +203,18 @@ class GeoNodeExecParams { return depsgraph_; } + /** + * Add an error message displayed at the top of the node when displaying the node tree, + * and potentially elsewhere in Blender. + */ + void error_message_add(const NodeWarningType type, std::string message) const; + /** * Creates a read-only attribute based on node inputs. The method automatically detects which - * input with the given name is available. + * input socket with the given name is available. + * + * \note This will add an error message if the string socket is active and + * the input attribute does not exist. */ ReadAttributePtr get_input_attribute(const StringRef name, const GeometryComponent &component, diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index 8a098c366a0..d7b85953a44 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -214,6 +214,8 @@ static void randomize_attribute_on_component(GeometryComponent &component, * doesn't already exist, don't do the operation. */ if (operation != GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) { if (!component.attribute_exists(attribute_name)) { + params.error_message_add(NodeWarningType::Error, + "No attribute with name '" + attribute_name + "'."); return; } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index 581c356742b..40187490c23 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -426,6 +426,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) static_cast(params.node().custom1); if (!geometry_set.has_mesh()) { + params.error_message_add(NodeWarningType::Error, "Geometry must contain a mesh."); params.set_output("Geometry", std::move(geometry_set_out)); return; } @@ -441,7 +442,8 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) const MeshComponent &mesh_component = *geometry_set.get_component_for_read(); const Mesh *mesh_in = mesh_component.get_for_read(); - if (mesh_in == nullptr || mesh_in->mpoly == nullptr) { + if (mesh_in->mpoly == nullptr) { + params.error_message_add(NodeWarningType::Error, "Mesh has no faces."); params.set_output("Geometry", std::move(geometry_set_out)); return; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index 11921acdb68..669b5ee4614 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -101,6 +101,12 @@ static void get_instanced_data__collection( return; } + if (BLI_listbase_is_empty(&collection->children) && + BLI_listbase_is_empty(&collection->gobject)) { + params.error_message_add(NodeWarningType::Info, "Collection is empty."); + return; + } + const bool use_whole_collection = (node_storage->flag & GEO_NODE_POINT_INSTANCE_WHOLE_COLLECTION) != 0; if (use_whole_collection) { diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index 7f4f75c294f..ebbb6f60b78 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -14,6 +14,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "DNA_modifier_types.h" + +#include "BKE_node_ui_storage.hh" + +#include "DEG_depsgraph_query.h" + #include "NOD_derived_node_tree.hh" #include "NOD_geometry_exec.hh" #include "NOD_type_callbacks.hh" @@ -22,6 +28,23 @@ namespace blender::nodes { +void GeoNodeExecParams::error_message_add(const NodeWarningType type, std::string message) const +{ + bNodeTree *btree_cow = node_.node_ref().tree().btree(); + BLI_assert(btree_cow != nullptr); + if (btree_cow == nullptr) { + return; + } + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + + BKE_nodetree_ui_storage_ensure(*btree_original); + + const NodeTreeEvaluationContext context(*self_object_, *modifier_); + + BKE_nodetree_error_message_add( + *btree_original, context, *node_.bnode(), type, std::move(message)); +} + const bNodeSocket *GeoNodeExecParams::find_available_socket(const StringRef name) const { for (const DSocket *socket : node_.inputs()) { @@ -47,7 +70,19 @@ ReadAttributePtr GeoNodeExecParams::get_input_attribute(const StringRef name, if (found_socket->type == SOCK_STRING) { const std::string name = this->get_input(found_socket->identifier); - return component.attribute_get_for_read(name, domain, type, default_value); + /* Try getting the attribute without the default value. */ + ReadAttributePtr attribute = component.attribute_try_get_for_read(name, domain, type); + if (attribute) { + return attribute; + } + + /* If the attribute doesn't exist, use the default value and output an error message + * (except when the field is empty, to avoid spamming error messages). */ + if (!name.empty()) { + this->error_message_add(NodeWarningType::Error, + std::string("No attribute with name '") + name + "'."); + } + return component.attribute_get_constant_for_read(domain, type, default_value); } if (found_socket->type == SOCK_FLOAT) { const float value = this->get_input(found_socket->identifier); From ab210098424bf53b1fdac3de2d016d3e4aa04bfe Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 16 Feb 2021 17:45:57 -0800 Subject: [PATCH 218/519] Fix T84701: Popup closes on release while dragging parameter. Windows Ghost cursor movement was previously changed to use SendInput because SetCursorPos sporadically allows the cursor to escape the window. This is now reverted because SendInput causes mouse history via GetMouseMovePointsEx to contain invalid movement history, likely due to interaction with mouse acceleration. This resulted in popups closing when the cursor appeared to leave their range. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index c86b332d228..43780b6d618 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -531,20 +531,7 @@ GHOST_TSuccess GHOST_SystemWin32::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 { if (!::GetActiveWindow()) return GHOST_kFailure; - - INPUT input; - input.type = INPUT_MOUSE; - input.mi.mouseData = 0; - input.mi.time = ::GetTickCount(); - /* Map from virtual screen to 0-65535 inclusive. */ - input.mi.dx = (x - GetSystemMetrics(SM_XVIRTUALSCREEN)) * 65535 / - (GetSystemMetrics(SM_CXVIRTUALSCREEN) - 1); - input.mi.dy = (y - GetSystemMetrics(SM_YVIRTUALSCREEN)) * 65535 / - (GetSystemMetrics(SM_CYVIRTUALSCREEN) - 1); - input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK; - SendInput(1, &input, sizeof(input)); - - return GHOST_kSuccess; + return ::SetCursorPos(x, y) == TRUE ? GHOST_kSuccess : GHOST_kFailure; } GHOST_TSuccess GHOST_SystemWin32::getModifierKeys(GHOST_ModifierKeys &keys) const From ab484ff22f4d9a1651f1b5b3475a222a056b001d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 21:40:16 -0600 Subject: [PATCH 219/519] Fix T85664: 3D Viewport issues with curve poly splines Caused by cleanup in rBcdb3cbd64401, where an index was used to index `float *` instead of `float[3]`. --- source/blender/blenkernel/intern/displist.c | 167 +++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index dc274e25823..19ead2d972a 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -292,6 +292,170 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i /* ICC with the optimization -02 causes crashes. */ # pragma intel optimization_level 1 #endif + +// static void curve_to_displist(Curve *cu, +// ListBase *nubase, +// const bool for_render, +// ListBase *dispbase) +// { +// DispList *dl; +// BezTriple *bezt, *prevbezt; +// BPoint *bp; +// float *data; +// int a, len, resolu; +// const bool editmode = (!for_render && (cu->editnurb || cu->editfont)); + +// LISTBASE_FOREACH (Nurb *, nu, nubase) { +// if (nu->hide != 0 && editmode) { +// continue; +// } + +// if (for_render && cu->resolu_ren != 0) { +// resolu = cu->resolu_ren; +// } +// else { +// resolu = nu->resolu; +// } + +// if (!BKE_nurb_check_valid_u(nu)) { +// /* pass */ +// } +// else if (nu->type == CU_BEZIER) { +// /* count */ +// len = 0; +// a = nu->pntsu - 1; +// if (nu->flagu & CU_NURB_CYCLIC) { +// a++; +// } + +// prevbezt = nu->bezt; +// bezt = prevbezt + 1; +// while (a--) { +// if (a == 0 && (nu->flagu & CU_NURB_CYCLIC)) { +// bezt = nu->bezt; +// } + +// if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { +// len++; +// } +// else { +// len += resolu; +// } + +// if (a == 0 && (nu->flagu & CU_NURB_CYCLIC) == 0) { +// len++; +// } + +// prevbezt = bezt; +// bezt++; +// } + +// dl = MEM_callocN(sizeof(DispList), "makeDispListbez"); +// /* len+1 because of 'forward_diff_bezier' function */ +// dl->verts = MEM_mallocN((len + 1) * sizeof(float[3]), "dlverts"); +// BLI_addtail(dispbase, dl); +// dl->parts = 1; +// dl->nr = len; +// dl->col = nu->mat_nr; +// dl->charidx = nu->charidx; + +// data = dl->verts; + +// /* check that (len != 2) so we don't immediately loop back on ourselves */ +// if (nu->flagu & CU_NURB_CYCLIC && (dl->nr != 2)) { +// dl->type = DL_POLY; +// a = nu->pntsu; +// } +// else { +// dl->type = DL_SEGM; +// a = nu->pntsu - 1; +// } + +// prevbezt = nu->bezt; +// bezt = prevbezt + 1; + +// while (a--) { +// if (a == 0 && dl->type == DL_POLY) { +// bezt = nu->bezt; +// } + +// if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { +// copy_v3_v3(data, prevbezt->vec[1]); +// data += 3; +// } +// else { +// int j; +// for (j = 0; j < 3; j++) { +// BKE_curve_forward_diff_bezier(prevbezt->vec[1][j], +// prevbezt->vec[2][j], +// bezt->vec[0][j], +// bezt->vec[1][j], +// data + j, +// resolu, +// sizeof(float[3])); +// } + +// data += 3 * resolu; +// } + +// if (a == 0 && dl->type == DL_SEGM) { +// copy_v3_v3(data, bezt->vec[1]); +// } + +// prevbezt = bezt; +// bezt++; +// } +// } +// else if (nu->type == CU_NURBS) { +// len = (resolu * SEGMENTSU(nu)); + +// dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); +// dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); +// BLI_addtail(dispbase, dl); +// dl->parts = 1; + +// dl->nr = len; +// dl->col = nu->mat_nr; +// dl->charidx = nu->charidx; + +// data = dl->verts; +// if (nu->flagu & CU_NURB_CYCLIC) { +// dl->type = DL_POLY; +// } +// else { +// dl->type = DL_SEGM; +// } +// BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, sizeof(float[3])); +// } +// else if (nu->type == CU_POLY) { +// len = nu->pntsu; +// dl = MEM_callocN(sizeof(DispList), "makeDispListpoly"); +// dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); +// BLI_addtail(dispbase, dl); +// dl->parts = 1; +// dl->nr = len; +// dl->col = nu->mat_nr; +// dl->charidx = nu->charidx; + +// data = dl->verts; +// if ((nu->flagu & CU_NURB_CYCLIC) && (dl->nr != 2)) { +// dl->type = DL_POLY; +// } +// else { +// dl->type = DL_SEGM; +// } + +// a = len; +// bp = nu->bp; +// while (a--) { +// copy_v3_v3(data, bp->vec); +// bp++; +// data += 3; +// } +// } +// } +// } + static void curve_to_displist(const Curve *cu, const ListBase *nubase, const bool for_render, @@ -420,9 +584,10 @@ static void curve_to_displist(const Curve *cu, dl->charidx = nu->charidx; dl->type = (is_cyclic && (dl->nr != 2)) ? DL_POLY : DL_SEGM; + float(*coords)[3] = (float(*)[3])dl->verts; for (int i = 0; i < len; i++) { const BPoint *bp = &nu->bp[i]; - copy_v3_v3(&dl->verts[i], bp->vec); + copy_v3_v3(coords[i], bp->vec); } } } From 99b4c856ef9140e96eb48c95cff04031ae36eeef Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Feb 2021 14:49:34 +1100 Subject: [PATCH 220/519] Cleanup: remove commented function --- source/blender/blenkernel/intern/displist.c | 163 -------------------- 1 file changed, 163 deletions(-) diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 19ead2d972a..1fcc1b1bcef 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -293,169 +293,6 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i # pragma intel optimization_level 1 #endif -// static void curve_to_displist(Curve *cu, -// ListBase *nubase, -// const bool for_render, -// ListBase *dispbase) -// { -// DispList *dl; -// BezTriple *bezt, *prevbezt; -// BPoint *bp; -// float *data; -// int a, len, resolu; -// const bool editmode = (!for_render && (cu->editnurb || cu->editfont)); - -// LISTBASE_FOREACH (Nurb *, nu, nubase) { -// if (nu->hide != 0 && editmode) { -// continue; -// } - -// if (for_render && cu->resolu_ren != 0) { -// resolu = cu->resolu_ren; -// } -// else { -// resolu = nu->resolu; -// } - -// if (!BKE_nurb_check_valid_u(nu)) { -// /* pass */ -// } -// else if (nu->type == CU_BEZIER) { -// /* count */ -// len = 0; -// a = nu->pntsu - 1; -// if (nu->flagu & CU_NURB_CYCLIC) { -// a++; -// } - -// prevbezt = nu->bezt; -// bezt = prevbezt + 1; -// while (a--) { -// if (a == 0 && (nu->flagu & CU_NURB_CYCLIC)) { -// bezt = nu->bezt; -// } - -// if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { -// len++; -// } -// else { -// len += resolu; -// } - -// if (a == 0 && (nu->flagu & CU_NURB_CYCLIC) == 0) { -// len++; -// } - -// prevbezt = bezt; -// bezt++; -// } - -// dl = MEM_callocN(sizeof(DispList), "makeDispListbez"); -// /* len+1 because of 'forward_diff_bezier' function */ -// dl->verts = MEM_mallocN((len + 1) * sizeof(float[3]), "dlverts"); -// BLI_addtail(dispbase, dl); -// dl->parts = 1; -// dl->nr = len; -// dl->col = nu->mat_nr; -// dl->charidx = nu->charidx; - -// data = dl->verts; - -// /* check that (len != 2) so we don't immediately loop back on ourselves */ -// if (nu->flagu & CU_NURB_CYCLIC && (dl->nr != 2)) { -// dl->type = DL_POLY; -// a = nu->pntsu; -// } -// else { -// dl->type = DL_SEGM; -// a = nu->pntsu - 1; -// } - -// prevbezt = nu->bezt; -// bezt = prevbezt + 1; - -// while (a--) { -// if (a == 0 && dl->type == DL_POLY) { -// bezt = nu->bezt; -// } - -// if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { -// copy_v3_v3(data, prevbezt->vec[1]); -// data += 3; -// } -// else { -// int j; -// for (j = 0; j < 3; j++) { -// BKE_curve_forward_diff_bezier(prevbezt->vec[1][j], -// prevbezt->vec[2][j], -// bezt->vec[0][j], -// bezt->vec[1][j], -// data + j, -// resolu, -// sizeof(float[3])); -// } - -// data += 3 * resolu; -// } - -// if (a == 0 && dl->type == DL_SEGM) { -// copy_v3_v3(data, bezt->vec[1]); -// } - -// prevbezt = bezt; -// bezt++; -// } -// } -// else if (nu->type == CU_NURBS) { -// len = (resolu * SEGMENTSU(nu)); - -// dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); -// dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); -// BLI_addtail(dispbase, dl); -// dl->parts = 1; - -// dl->nr = len; -// dl->col = nu->mat_nr; -// dl->charidx = nu->charidx; - -// data = dl->verts; -// if (nu->flagu & CU_NURB_CYCLIC) { -// dl->type = DL_POLY; -// } -// else { -// dl->type = DL_SEGM; -// } -// BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, sizeof(float[3])); -// } -// else if (nu->type == CU_POLY) { -// len = nu->pntsu; -// dl = MEM_callocN(sizeof(DispList), "makeDispListpoly"); -// dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); -// BLI_addtail(dispbase, dl); -// dl->parts = 1; -// dl->nr = len; -// dl->col = nu->mat_nr; -// dl->charidx = nu->charidx; - -// data = dl->verts; -// if ((nu->flagu & CU_NURB_CYCLIC) && (dl->nr != 2)) { -// dl->type = DL_POLY; -// } -// else { -// dl->type = DL_SEGM; -// } - -// a = len; -// bp = nu->bp; -// while (a--) { -// copy_v3_v3(data, bp->vec); -// bp++; -// data += 3; -// } -// } -// } -// } - static void curve_to_displist(const Curve *cu, const ListBase *nubase, const bool for_render, From 62592af84349629bccaa1c81df7965f4deb39fd4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Feb 2021 10:27:50 +1100 Subject: [PATCH 221/519] Cleanup: pass scene as const --- source/blender/blenkernel/BKE_modifier.h | 10 +++++----- source/blender/blenkernel/intern/modifier.c | 10 +++++----- source/blender/draw/intern/draw_cache_impl_mesh.c | 3 +-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 32b74d161b2..ab2ecbe2507 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -453,7 +453,7 @@ void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *u struct ModifierData *BKE_modifiers_findby_type(struct Object *ob, ModifierType type); struct ModifierData *BKE_modifiers_findby_name(struct Object *ob, const char *name); void BKE_modifiers_clear_errors(struct Object *ob); -int BKE_modifiers_get_cage_index(struct Scene *scene, +int BKE_modifiers_get_cage_index(const struct Scene *scene, struct Object *ob, int *r_lastPossibleCageIndex, bool is_virtual); @@ -469,8 +469,8 @@ struct Object *BKE_modifiers_is_deformed_by_lattice(struct Object *ob); struct Object *BKE_modifiers_is_deformed_by_curve(struct Object *ob); bool BKE_modifiers_uses_multires(struct Object *ob); bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm); -bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, struct Object *ob); -bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, struct Object *ob); +bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, struct Object *ob); +bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob); void BKE_modifier_free_temporary_data(struct ModifierData *md); typedef struct CDMaskLink { @@ -484,14 +484,14 @@ typedef struct CDMaskLink { * pointed to by md for correct evaluation, assuming the data indicated by * final_datamask is required at the end of the stack. */ -struct CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, +struct CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene, struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const struct CustomData_MeshMasks *previewmask); -struct ModifierData *BKE_modifier_get_last_preview(struct Scene *scene, +struct ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene, struct ModifierData *md, int required_mode); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index a2a0bd84234..34b7c4234ec 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -464,7 +464,7 @@ void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_for * then is NULL) * also used for some mesh tools to give warnings */ -int BKE_modifiers_get_cage_index(struct Scene *scene, +int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual) @@ -587,7 +587,7 @@ bool BKE_modifier_is_nonlocal_in_liboverride(const Object *ob, const ModifierDat (md == NULL || (md->flag & eModifierFlag_OverrideLibrary_Local) == 0)); } -CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, +CDMaskLink *BKE_modifier_calc_data_masks(const struct Scene *scene, Object *ob, ModifierData *md, CustomData_MeshMasks *final_datamask, @@ -655,7 +655,7 @@ CDMaskLink *BKE_modifier_calc_data_masks(struct Scene *scene, return dataMasks; } -ModifierData *BKE_modifier_get_last_preview(struct Scene *scene, +ModifierData *BKE_modifier_get_last_preview(const struct Scene *scene, ModifierData *md, int required_mode) { @@ -878,7 +878,7 @@ bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm) return false; } -bool BKE_modifiers_uses_subsurf_facedots(struct Scene *scene, Object *ob) +bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, Object *ob) { /* Search (backward) in the modifier stack to find if we have a subsurf modifier (enabled) before * the last modifier displayed on cage (or if the subsurf is the last). */ @@ -919,7 +919,7 @@ bool BKE_modifier_is_correctable_deformed(ModifierData *md) return mti->deformMatricesEM != NULL; } -bool BKE_modifiers_is_correctable_deformed(struct Scene *scene, Object *ob) +bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, Object *ob) { VirtualModifierData virtualModifierData; ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 1a1caa2943a..79fce24076e 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -1522,8 +1522,7 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, } /* Meh loose Scene const correctness here. */ - const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots((Scene *)scene, ob) : - false; + const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots(scene, ob) : false; if (do_uvcage) { mesh_buffer_cache_create_requested(task_graph, From 20a6255d49aaa1ca0ad72e75be064b2c1a56353f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Feb 2021 15:04:29 +1100 Subject: [PATCH 222/519] Cleanup: spelling --- intern/cycles/kernel/svm/svm_noise.h | 2 +- intern/ghost/intern/GHOST_ImeWin32.h | 2 +- intern/ghost/intern/GHOST_WindowWin32.h | 2 +- source/blender/blenfont/intern/blf_dir.c | 5 +++-- source/blender/blenlib/intern/uvproject.c | 4 ++-- source/blender/bmesh/intern/bmesh_marking.c | 2 +- .../blender/draw/engines/eevee/eevee_depth_of_field.c | 10 +++++----- source/blender/draw/engines/eevee/eevee_renderpasses.c | 2 +- source/blender/editors/animation/keyframes_edit.c | 2 +- source/blender/editors/armature/pose_select.c | 6 ++++-- source/blender/editors/mesh/editmesh_loopcut.c | 4 ++-- source/blender/editors/space_node/node_draw.cc | 6 +++--- .../blender/editors/space_outliner/outliner_dragdrop.c | 2 +- .../editors/transform/transform_convert_armature.c | 4 ++-- .../editors/transform/transform_gizmo_extrude_3d.c | 2 +- source/blender/gpu/intern/gpu_matrix.cc | 2 +- source/blender/gpu/intern/gpu_shader_interface.hh | 2 +- source/blender/gpu/opengl/gl_texture.cc | 6 +++--- source/blender/makesdna/DNA_color_types.h | 2 +- 19 files changed, 35 insertions(+), 32 deletions(-) diff --git a/intern/cycles/kernel/svm/svm_noise.h b/intern/cycles/kernel/svm/svm_noise.h index 7ad61f23cc1..94d8bfde555 100644 --- a/intern/cycles/kernel/svm/svm_noise.h +++ b/intern/cycles/kernel/svm/svm_noise.h @@ -616,7 +616,7 @@ ccl_device_noinline float perlin_3d(float x, float y, float z) * Point Offset from v0 * v0 (0, 0, 0, 0) * v1 (0, 0, 1, 0) The full AVX type is computed by inserting the following - * v2 (0, 1, 0, 0) sse types into both the low and high parts of the AVX. + * v2 (0, 1, 0, 0) SSE types into both the low and high parts of the AVX. * v3 (0, 1, 1, 0) * v4 (1, 0, 0, 0) * v5 (1, 0, 1, 0) (0, 1, 0, 1) = shuffle<0, 2, 0, 2>(shuffle<2, 2, 2, 2>(V, V + 1)) diff --git a/intern/ghost/intern/GHOST_ImeWin32.h b/intern/ghost/intern/GHOST_ImeWin32.h index cbef0f0edc4..cd13ee1a8ae 100644 --- a/intern/ghost/intern/GHOST_ImeWin32.h +++ b/intern/ghost/intern/GHOST_ImeWin32.h @@ -365,7 +365,7 @@ class GHOST_ImeWin32 { * MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED); * * "ja-JP" (0x0411) * MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), etc. - * (See for other available values.) + * (See `winnt.h` for other available values.) * This Language ID is used for processing language-specific operations in * IME functions. */ diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 71c97091189..d2d251fa2f2 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -570,7 +570,7 @@ class GHOST_WindowWin32 : public GHOST_Window { GHOST_WIN32_WTEnable enable; GHOST_WIN32_WTOverlap overlap; - /** Stores the Tablet context if detected Tablet features using WinTab.dll */ + /** Stores the Tablet context if detected Tablet features using `WinTab.dll` */ HCTX tablet; LONG maxPressure; LONG maxAzimuth, maxAltitude; diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 4fa915826b3..9520e971148 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -151,8 +151,9 @@ char *blf_dir_search(const char *file) return s; } -/* Some font have additional file with metrics information, - * in general, the extension of the file is: .afm or .pfm +/** + * Some font have additional file with metrics information, + * in general, the extension of the file is: `.afm` or `.pfm` */ char *blf_dir_metrics_search(const char *filename) { diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index 00fef29587c..329c4d48fe8 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -132,8 +132,8 @@ void BLI_uvproject_from_view(float target[2], target[1] = (y + target[1]) / winy; } -/* 'rotmat' can be obedit->obmat when uv project is used. - * 'winx' and 'winy' can be from scene->r.xsch/ysch */ +/* 'rotmat' can be `obedit->obmat` when uv project is used. + * 'winx' and 'winy' can be from `scene->r.xsch/ysch` */ ProjCameraInfo *BLI_uvproject_camera_info(Object *ob, float (*rotmat)[4], float winx, float winy) { ProjCameraInfo uci; diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 4fe6e6aee58..9cd1a2fd4ec 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -888,7 +888,7 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3]) sub_v3_v3v3(r_plane, vec, eve->co); } else { - /* make a fake plane that's at rightangles to the normal + /* make a fake plane that's at right-angles to the normal * we can't make a crossvec from a vec that's the same as the vec * unlikely but possible, so make sure if the normal is (0, 0, 1) * that vec isn't the same or in the same direction even. */ diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index 91214f6c437..33d45d61d42 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -274,7 +274,7 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), float user_overblur = scene_eval->eevee.bokeh_overblur / 100.0f; effects->dof_coc_params[1] *= minimal_overblur + user_overblur; - /* Avoid dilating the shape. Overblur only soften. */ + /* Avoid dilating the shape. Over-blur only soften. */ effects->dof_jitter_radius -= effects->dof_coc_params[1]; } } @@ -536,7 +536,7 @@ static void dof_dilate_tiles_pass_draw(EEVEE_FramebufferList *fbl, } /** - * Create mipmaped color & COC textures for gather passes. + * Create mipmapped color & COC textures for gather passes. **/ static void dof_reduce_pass_init(EEVEE_FramebufferList *fbl, EEVEE_PassList *psl, @@ -820,7 +820,7 @@ static void dof_filter_pass_init(EEVEE_FramebufferList *fbl, } /** - * Do the Scatter convolution. A sprite is emited for every 4 pixels but is only expanded if the + * Do the Scatter convolution. A sprite is emitted for every 4 pixels but is only expanded if the * pixels are bright enough to be scattered. **/ static void dof_scatter_pass_init(EEVEE_FramebufferList *fbl, @@ -1028,11 +1028,11 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata) } { - /* Holefill convolution. */ + /* Hole-fill convolution. */ GPU_framebuffer_bind(fbl->dof_gather_fg_holefill_fb); DRW_draw_pass(psl->dof_gather_fg_holefill); - /* NOTE: do not filter the holefill pass as we use it as out filter input buffer. */ + /* NOTE: do not filter the hole-fill pass as we use it as out filter input buffer. */ } GPU_framebuffer_bind(fx->target_buffer); diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c index 9dec551e4b9..1ed0ecf5cd4 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.c +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c @@ -442,7 +442,7 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) EEVEE_EffectsInfo *effects = stl->effects; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); - /* We can only draw a single renderpass. Lightpasses also select their color pass + /* We can only draw a single render-pass. Light-passes also select their color pass * (a second pass). We mask the light pass when a light pass is selected. */ const eViewLayerEEVEEPassType render_pass = ((stl->g_data->render_passes & EEVEE_RENDERPASSES_LIGHT_PASS) != 0) ? diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index d5260cac0c9..636f0d3cbea 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -86,7 +86,7 @@ short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, return 0; } - /* set the F-Curve into the editdata so that it can be accessed */ + /* Set the F-Curve into the edit-data so that it can be accessed. */ if (ked) { ked->fcu = fcu; ked->curIndex = 0; diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index 6a03207b3b0..a3f97000509 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -138,8 +138,10 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select) } } -/* called from editview.c, for mode-less pose selection */ -/* assumes scene obact and basact is still on old situation */ +/** + * Called for mode-less pose selection. + * assumes the active object is still on old situation. + */ bool ED_armature_pose_select_pick_with_buffer(ViewLayer *view_layer, View3D *v3d, Base *base, diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c index 373d82883d1..2057738221b 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.c +++ b/source/blender/editors/mesh/editmesh_loopcut.c @@ -189,8 +189,8 @@ static void ringsel_finish(bContext *C, wmOperator *op) const int seltype = is_edge_wire ? SUBDIV_SELECT_INNER : is_single ? SUBDIV_SELECT_NONE : SUBDIV_SELECT_LOOPCUT; - /* Enable gridfill, so that intersecting loopcut works as one would expect. - * Note though that it will break edgeslide in this specific case. + /* Enable grid-fill, so that intersecting loop-cut works as one would expect. + * Note though that it will break edge-slide in this specific case. * See T31939. */ BM_mesh_esubdivide(em->bm, BM_ELEM_SELECT, diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index f85d29f99d5..aaceadcc011 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -477,7 +477,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) if (node->typeinfo->draw_buttons && (node->flag & NODE_OPTIONS)) { dy -= NODE_DYS / 2; - /* set this for uifunc() that don't use layout engine yet */ + /* Set this for `uifunc()` that don't use layout engine yet. */ node->butr.xmin = 0; node->butr.xmax = NODE_WIDTH(node) - 2 * NODE_DYS; node->butr.ymin = 0; @@ -2029,8 +2029,8 @@ void node_draw_space(const bContext *C, ARegion *region) GPU_depth_test(GPU_DEPTH_NONE); GPU_scissor_test(true); - /* XXX snode->runtime->cursor set in coordspace for placing new nodes, used for drawing noodles - * too */ + /* XXX `snode->runtime->cursor` set in coordinate-space for placing new nodes, + * used for drawing noodles too. */ UI_view2d_region_to_view(®ion->v2d, win->eventstate->x - region->winrct.xmin, win->eventstate->y - region->winrct.ymin, diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c index 5ae94cf2e64..6df1e449b97 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.c +++ b/source/blender/editors/space_outliner/outliner_dragdrop.c @@ -1483,7 +1483,7 @@ static int outliner_item_drag_drop_invoke(bContext *C, /* Outliner drag and drop. This operator mostly exists to support dragging * from outliner text instead of only from the icon, and also to show a - * hint in the statusbar keymap. */ + * hint in the status-bar key-map. */ void OUTLINER_OT_item_drag_drop(wmOperatorType *ot) { diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c index 71b9e11b51f..a4edf51ffee 100644 --- a/source/blender/editors/transform/transform_convert_armature.c +++ b/source/blender/editors/transform/transform_convert_armature.c @@ -672,7 +672,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr } } - /* for axismat we use bone's own transform */ + /* For `axismtx` we use bone's own transform. */ copy_m3_m4(pmat, pchan->pose_mat); mul_m3_m3m3(td->axismtx, omat, pmat); normalize_m3(td->axismtx); @@ -1341,7 +1341,7 @@ static void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, O } BKE_pchan_apply_mat4(pchan, pchan_mtx_final, false); - /* Set flag to let autokeyframe know to keyframe the mirrred bone. */ + /* Set flag to let auto key-frame know to key-frame the mirrored bone. */ pchan->bone->flag |= BONE_TRANSFORM_MIRROR; /* In this case we can do target-less IK grabbing. */ diff --git a/source/blender/editors/transform/transform_gizmo_extrude_3d.c b/source/blender/editors/transform/transform_gizmo_extrude_3d.c index ae7cda0bd03..63c8efdd475 100644 --- a/source/blender/editors/transform/transform_gizmo_extrude_3d.c +++ b/source/blender/editors/transform/transform_gizmo_extrude_3d.c @@ -151,7 +151,7 @@ static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup) { const char *op_idname = NULL; - /* grease pencil does not use obedit */ + /* Grease pencil does not use `obedit`. */ /* GPXX: Remove if OB_MODE_EDIT_GPENCIL is merged with OB_MODE_EDIT */ const Object *obact = CTX_data_active_object(C); if (obact->type == OB_GPENCIL) { diff --git a/source/blender/gpu/intern/gpu_matrix.cc b/source/blender/gpu/intern/gpu_matrix.cc index 4ccb28fedbd..24cdea74347 100644 --- a/source/blender/gpu/intern/gpu_matrix.cc +++ b/source/blender/gpu/intern/gpu_matrix.cc @@ -732,7 +732,7 @@ float GPU_polygon_offset_calc(const float (*winmat)[4], float viewdist, float di #else static float depth_fac = 0.0f; if (depth_fac == 0.0f) { - /* Hardcode for 24 bit precision. */ + /* Hard-code for 24 bit precision. */ int depthbits = 24; depth_fac = 1.0f / (float)((1 << depthbits) - 1); } diff --git a/source/blender/gpu/intern/gpu_shader_interface.hh b/source/blender/gpu/intern/gpu_shader_interface.hh index 942be84caae..aec58544111 100644 --- a/source/blender/gpu/intern/gpu_shader_interface.hh +++ b/source/blender/gpu/intern/gpu_shader_interface.hh @@ -60,7 +60,7 @@ class ShaderInterface { uint attr_len_ = 0; uint ubo_len_ = 0; uint uniform_len_ = 0; - /** Enabled bindpoints that needs to be fed with data. */ + /** Enabled bind-points that needs to be fed with data. */ uint16_t enabled_attr_mask_ = 0; uint16_t enabled_ubo_mask_ = 0; uint8_t enabled_ima_mask_ = 0; diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index ef38e964c7b..51cfcd20a6c 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -297,15 +297,15 @@ void GLTexture::update_sub( void GLTexture::generate_mipmap() { this->ensure_mipmaps(9999); - /* Some drivers have bugs when using glGenerateMipmap with depth textures (see T56789). + /* Some drivers have bugs when using #glGenerateMipmap with depth textures (see T56789). * In this case we just create a complete texture with mipmaps manually without * down-sampling. You must initialize the texture levels using other methods like - * GPU_framebuffer_recursive_downsample(). */ + * #GPU_framebuffer_recursive_downsample(). */ if (format_flag_ & GPU_FORMAT_DEPTH) { return; } - /* Downsample from mip 0 using implementation. */ + /* Down-sample from mip 0 using implementation. */ if (GLContext::direct_state_access_support) { glGenerateTextureMipmap(tex_id_); } diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h index bcebbf32ebd..e4f6a1eea41 100644 --- a/source/blender/makesdna/DNA_color_types.h +++ b/source/blender/makesdna/DNA_color_types.h @@ -196,7 +196,7 @@ typedef struct ColorManagedViewSettings { char look[64]; /** View transform which is being applied when displaying buffer on the screen. */ char view_transform[64]; - /** Fstop exposure. */ + /** F-stop exposure. */ float exposure; /** Post-display gamma transform. */ float gamma; From 6ce06957c9bf9c752f0a7ee2cb186948d0d67983 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Feb 2021 15:12:39 +1100 Subject: [PATCH 223/519] Fix T85680: Crash displaying UV stretch/area with modifiers This uses the same logic as drawing UV's, where non-bmesh defaults to mesh. --- .../draw/intern/draw_cache_extract_mesh.c | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index 9e2ac26f9f0..40d7614f93f 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -3903,7 +3903,8 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, area_ratio[f] = area_ratio_get(area, uvarea); } } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { + else { + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); const MLoopUV *uv_data = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); const MPoly *mp = mr->mpoly; for (int mp_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { @@ -3914,10 +3915,6 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, area_ratio[mp_index] = area_ratio_get(area, uvarea); } } - else { - /* Should not happen. */ - BLI_assert(0); - } cache->tot_area = tot_area; cache->tot_uv_area = tot_uv_area; @@ -3942,7 +3939,8 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, } } } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { + else { + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); const MPoly *mp = mr->mpoly; for (int mp_index = 0, l_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { for (int i = 0; i < mp->totloop; i++, l_index++) { @@ -3950,10 +3948,6 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, } } } - else { - /* Should not happen. */ - BLI_assert(0); - } MEM_freeN(area_ratio); } @@ -4047,11 +4041,9 @@ static void *extract_stretch_angle_init(const MeshRenderData *mr, if (mr->extract_type == MR_EXTRACT_BMESH) { data->cd_ofs = CustomData_get_offset(&mr->bm->ldata, CD_MLOOPUV); } - else if (mr->extract_type == MR_EXTRACT_MAPPED) { - data->luv = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); - } else { - BLI_assert(0); + BLI_assert(ELEM(mr->extract_type, MR_EXTRACT_MAPPED, MR_EXTRACT_MESH)); + data->luv = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); } return data; } From bfc7994d937910e8d26112788e5283b9c975cc06 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Feb 2021 15:36:18 +1100 Subject: [PATCH 224/519] Cleanup: use edituv prefix for stretch area/angle data --- .../blender/draw/intern/draw_cache_extract.h | 4 +- .../draw/intern/draw_cache_extract_mesh.c | 74 +++++++++---------- .../draw/intern/draw_cache_impl_mesh.c | 8 +- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h index a0679ba6442..c929fe7dfd3 100644 --- a/source/blender/draw/intern/draw_cache_extract.h +++ b/source/blender/draw/intern/draw_cache_extract.h @@ -109,8 +109,8 @@ typedef struct MeshBufferCache { /* Only for edit mode. */ GPUVertBuf *edit_data; /* extend */ GPUVertBuf *edituv_data; - GPUVertBuf *stretch_area; - GPUVertBuf *stretch_angle; + GPUVertBuf *edituv_stretch_area; + GPUVertBuf *edituv_stretch_angle; GPUVertBuf *mesh_analysis; GPUVertBuf *fdots_pos; GPUVertBuf *fdots_nor; diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index c1087918840..f167ea3d540 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -3849,9 +3849,9 @@ static const MeshExtract extract_edituv_data = { /** \name Extract Edit UV area stretch * \{ */ -static void *extract_stretch_area_init(const MeshRenderData *mr, - struct MeshBatchCache *UNUSED(cache), - void *buf) +static void *extract_edituv_stretch_area_init(const MeshRenderData *mr, + struct MeshBatchCache *UNUSED(cache), + void *buf) { static GPUVertFormat format = {0}; if (format.attr_len == 0) { @@ -3880,10 +3880,10 @@ BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_t return (ratio > 1.0f) ? (1.0f / ratio) : ratio; } -static void mesh_stretch_area_finish(const MeshRenderData *mr, - struct MeshBatchCache *cache, - void *buf, - void *UNUSED(data)) +static void mesh_edituv_stretch_area_finish(const MeshRenderData *mr, + struct MeshBatchCache *cache, + void *buf, + void *UNUSED(data)) { float tot_area = 0.0f, tot_uv_area = 0.0f; float *area_ratio = MEM_mallocN(sizeof(float) * mr->poly_len, __func__); @@ -3952,9 +3952,9 @@ static void mesh_stretch_area_finish(const MeshRenderData *mr, MEM_freeN(area_ratio); } -static const MeshExtract extract_stretch_area = { - .init = extract_stretch_area_init, - .finish = mesh_stretch_area_finish, +static const MeshExtract extract_edituv_stretch_area = { + .init = extract_edituv_stretch_area_init, + .finish = mesh_edituv_stretch_area_finish, .data_flag = 0, .use_threading = false, }; @@ -4001,9 +4001,9 @@ static short v2_to_short_angle(const float v[2]) return atan2f(v[1], v[0]) * (float)M_1_PI * SHRT_MAX; } -static void edituv_get_stretch_angle(float auv[2][2], - const float av[2][3], - UVStretchAngle *r_stretch) +static void edituv_get_edituv_stretch_angle(float auv[2][2], + const float av[2][3], + UVStretchAngle *r_stretch) { /* Send UV's to the shader and let it compute the aspect corrected angle. */ r_stretch->uv_angles[0] = v2_to_short_angle(auv[0]); @@ -4019,9 +4019,9 @@ static void edituv_get_stretch_angle(float auv[2][2], #endif } -static void *extract_stretch_angle_init(const MeshRenderData *mr, - struct MeshBatchCache *UNUSED(cache), - void *buf) +static void *extract_edituv_stretch_angle_init(const MeshRenderData *mr, + struct MeshBatchCache *UNUSED(cache), + void *buf) { static GPUVertFormat format = {0}; if (format.attr_len == 0) { @@ -4048,9 +4048,9 @@ static void *extract_stretch_angle_init(const MeshRenderData *mr, return data; } -static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr, - const ExtractPolyBMesh_Params *params, - void *_data) +static void extract_edituv_stretch_angle_iter_poly_bm(const MeshRenderData *mr, + const ExtractPolyBMesh_Params *params, + void *_data) { MeshExtract_StretchAngle_Data *data = _data; float(*auv)[2] = data->auv, *last_auv = data->last_auv; @@ -4090,14 +4090,14 @@ static void extract_stretch_angle_iter_poly_bm(const MeshRenderData *mr, compute_normalize_edge_vectors( auv, av, luv->uv, luv_next->uv, bm_vert_co_get(mr, l->v), bm_vert_co_get(mr, l_next->v)); } - edituv_get_stretch_angle(auv, av, &data->vbo_data[l_index]); + edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[l_index]); } EXTRACT_POLY_AND_LOOP_FOREACH_BM_END(l); } -static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, - const ExtractPolyMesh_Params *params, - void *_data) +static void extract_edituv_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, + const ExtractPolyMesh_Params *params, + void *_data) { MeshExtract_StretchAngle_Data *data = _data; @@ -4134,24 +4134,24 @@ static void extract_stretch_angle_iter_poly_mesh(const MeshRenderData *mr, compute_normalize_edge_vectors( auv, av, data->luv[ml_index].uv, data->luv[l_next].uv, v->co, v_next->co); } - edituv_get_stretch_angle(auv, av, &data->vbo_data[ml_index]); + edituv_get_edituv_stretch_angle(auv, av, &data->vbo_data[ml_index]); } EXTRACT_POLY_AND_LOOP_FOREACH_MESH_END; } -static void extract_stretch_angle_finish(const MeshRenderData *UNUSED(mr), - struct MeshBatchCache *UNUSED(cache), - void *UNUSED(buf), - void *data) +static void extract_edituv_stretch_angle_finish(const MeshRenderData *UNUSED(mr), + struct MeshBatchCache *UNUSED(cache), + void *UNUSED(buf), + void *data) { MEM_freeN(data); } -static const MeshExtract extract_stretch_angle = { - .init = extract_stretch_angle_init, - .iter_poly_bm = extract_stretch_angle_iter_poly_bm, - .iter_poly_mesh = extract_stretch_angle_iter_poly_mesh, - .finish = extract_stretch_angle_finish, +static const MeshExtract extract_edituv_stretch_angle = { + .init = extract_edituv_stretch_angle_init, + .iter_poly_bm = extract_edituv_stretch_angle_iter_poly_bm, + .iter_poly_mesh = extract_edituv_stretch_angle_iter_poly_mesh, + .finish = extract_edituv_stretch_angle_finish, .data_flag = 0, .use_threading = false, }; @@ -5976,8 +5976,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, TEST_ASSIGN(VBO, vbo, weights); TEST_ASSIGN(VBO, vbo, edit_data); TEST_ASSIGN(VBO, vbo, edituv_data); - TEST_ASSIGN(VBO, vbo, stretch_area); - TEST_ASSIGN(VBO, vbo, stretch_angle); + TEST_ASSIGN(VBO, vbo, edituv_stretch_area); + TEST_ASSIGN(VBO, vbo, edituv_stretch_angle); TEST_ASSIGN(VBO, vbo, mesh_analysis); TEST_ASSIGN(VBO, vbo, fdots_pos); TEST_ASSIGN(VBO, vbo, fdots_nor); @@ -6070,8 +6070,8 @@ void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, EXTRACT(vbo, weights); EXTRACT(vbo, edit_data); EXTRACT(vbo, edituv_data); - EXTRACT(vbo, stretch_area); - EXTRACT(vbo, stretch_angle); + EXTRACT(vbo, edituv_stretch_area); + EXTRACT(vbo, edituv_stretch_angle); EXTRACT(vbo, mesh_analysis); EXTRACT(vbo, fdots_pos); EXTRACT(vbo, fdots_nor); diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 79fce24076e..04bfb667d24 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -570,8 +570,8 @@ static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache) static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache) { FOREACH_MESH_BUFFER_CACHE (cache, mbufcache) { - GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_angle); - GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.stretch_area); + GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_angle); + GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_stretch_area); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.uv); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.edituv_data); GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.fdots_uv); @@ -1497,13 +1497,13 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, DRW_ibo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->ibo.edituv_tris); DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.uv); DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_data); - DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.stretch_area); + DRW_vbo_request(cache->batch.edituv_faces_stretch_area, &mbufcache->vbo.edituv_stretch_area); } if (DRW_batch_requested(cache->batch.edituv_faces_stretch_angle, GPU_PRIM_TRIS)) { DRW_ibo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->ibo.edituv_tris); DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.uv); DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_data); - DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.stretch_angle); + DRW_vbo_request(cache->batch.edituv_faces_stretch_angle, &mbufcache->vbo.edituv_stretch_angle); } if (DRW_batch_requested(cache->batch.edituv_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache->batch.edituv_edges, &mbufcache->ibo.edituv_lines); From 585db47d992700698cedc3e8eee03df92d067833 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 23:02:33 -0600 Subject: [PATCH 225/519] Cleanup: Return bool instead of int --- source/blender/editors/include/ED_object.h | 28 +++++----- .../editors/object/object_gpencil_modifier.c | 56 +++++++++---------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 73326a2d5f2..5dfce6071f0 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -462,25 +462,25 @@ bool ED_object_gpencil_modifier_remove(struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md); void ED_object_gpencil_modifier_clear(struct Main *bmain, struct Object *ob); -int ED_object_gpencil_modifier_move_down(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); -int ED_object_gpencil_modifier_move_up(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); +bool ED_object_gpencil_modifier_move_down(struct ReportList *reports, + struct Object *ob, + struct GpencilModifierData *md); +bool ED_object_gpencil_modifier_move_up(struct ReportList *reports, + struct Object *ob, + struct GpencilModifierData *md); bool ED_object_gpencil_modifier_move_to_index(struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md, const int index); -int ED_object_gpencil_modifier_apply(struct Main *bmain, - struct ReportList *reports, - struct Depsgraph *depsgraph, +bool ED_object_gpencil_modifier_apply(struct Main *bmain, + struct ReportList *reports, + struct Depsgraph *depsgraph, + struct Object *ob, + struct GpencilModifierData *md, + int mode); +bool ED_object_gpencil_modifier_copy(struct ReportList *reports, struct Object *ob, - struct GpencilModifierData *md, - int mode); -int ED_object_gpencil_modifier_copy(struct ReportList *reports, - struct Object *ob, - struct GpencilModifierData *md); + struct GpencilModifierData *md); void ED_object_gpencil_modifier_copy_to_object(struct Object *ob_dst, struct GpencilModifierData *md); diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c index f70e86bcb05..a869a4c2583 100644 --- a/source/blender/editors/object/object_gpencil_modifier.c +++ b/source/blender/editors/object/object_gpencil_modifier.c @@ -173,28 +173,28 @@ void ED_object_gpencil_modifier_clear(Main *bmain, Object *ob) DEG_relations_tag_update(bmain); } -int ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports), - Object *ob, - GpencilModifierData *md) +bool ED_object_gpencil_modifier_move_up(ReportList *UNUSED(reports), + Object *ob, + GpencilModifierData *md) { if (md->prev) { BLI_remlink(&ob->greasepencil_modifiers, md); BLI_insertlinkbefore(&ob->greasepencil_modifiers, md->prev, md); } - return 1; + return true; } -int ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), - Object *ob, - GpencilModifierData *md) +bool ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), + Object *ob, + GpencilModifierData *md) { if (md->next) { BLI_remlink(&ob->greasepencil_modifiers, md); BLI_insertlinkafter(&ob->greasepencil_modifiers, md->next, md); } - return 1; + return true; } bool ED_object_gpencil_modifier_move_to_index(ReportList *reports, @@ -234,57 +234,57 @@ bool ED_object_gpencil_modifier_move_to_index(ReportList *reports, return true; } -static int gpencil_modifier_apply_obdata( +static bool gpencil_modifier_apply_obdata( ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md) { const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); - return 0; + return false; } if (ob->type == OB_GPENCIL) { if (ELEM(NULL, ob, ob->data)) { - return 0; + return false; } if (mti->bakeModifier == NULL) { BKE_report(reports, RPT_ERROR, "Not implemented"); - return 0; + return false; } mti->bakeModifier(bmain, depsgraph, md, ob); DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } else { BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type"); - return 0; + return false; } - return 1; + return true; } -int ED_object_gpencil_modifier_apply(Main *bmain, - ReportList *reports, - Depsgraph *depsgraph, - Object *ob, - GpencilModifierData *md, - int UNUSED(mode)) +bool ED_object_gpencil_modifier_apply(Main *bmain, + ReportList *reports, + Depsgraph *depsgraph, + Object *ob, + GpencilModifierData *md, + int UNUSED(mode)) { if (ob->type == OB_GPENCIL) { if (ob->mode != OB_MODE_OBJECT) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied in paint, sculpt or edit mode"); - return 0; + return false; } if (((ID *)ob->data)->us > 1) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data"); - return 0; + return false; } } else if (((ID *)ob->data)->us > 1) { BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data"); - return 0; + return false; } if (md != ob->greasepencil_modifiers.first) { @@ -292,16 +292,16 @@ int ED_object_gpencil_modifier_apply(Main *bmain, } if (!gpencil_modifier_apply_obdata(reports, bmain, depsgraph, ob, md)) { - return 0; + return false; } BLI_remlink(&ob->greasepencil_modifiers, md); BKE_gpencil_modifier_free(md); - return 1; + return true; } -int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md) +bool ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md) { GpencilModifierData *nmd; const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); @@ -310,7 +310,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi if (mti->flags & eGpencilModifierTypeFlag_Single) { if (BKE_gpencil_modifiers_findby_type(ob, type)) { BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed"); - return 0; + return false; } } @@ -321,7 +321,7 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi nmd->flag |= eGpencilModifierFlag_OverrideLibrary_Local; - return 1; + return true; } void ED_object_gpencil_modifier_copy_to_object(Object *ob_dst, GpencilModifierData *md) From c48360c2559acbe1cb8014ca0e81152f2febf199 Mon Sep 17 00:00:00 2001 From: Wayde Moss Date: Tue, 16 Feb 2021 23:58:29 -0500 Subject: [PATCH 226/519] Fix: NLA Blends Non-Animated Upper Channel Values Issue introduced by my commit: rB40b7929cc040 **User-level Problem**: The issue resulted in a full-replace upper strip with only a Z location channel full-replacing the XY location channels of the lower stack. replaced to default. The expected behavior is that only the Z location channel is affected. **Technical-level Problem**: Before the problematic commit, fcurves were blended as they were read. So only existing animated channels would blend. My recent commit changed the process to read all fcurve values into an isolated upper_snapshot then blend with the lower stack. There is no data stored to know whether the upper snapshot channel values were sampled from fcurves or were default values. Only those sampled from fcurves should be blended. **Solution**: Added a `blend_domain` bitmask member to NlaEvalChannelSnapshot. The blending function only blends values within the `blend_domain`. Sampled fcurve values are now marked as within the `blend_domain`. We also now always copy the lower snapshot to the result snapshot which only matters when they aren't the same. Currently, it's always the same so the change is more for future unseen cases. Reviewed By: sybren, #animation_rigging Differential Revision: https://developer.blender.org/D10339 --- source/blender/blenkernel/intern/anim_sys.c | 50 +++++++++++++++++++-- source/blender/blenkernel/nla_private.h | 5 +++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 965dc4e0bec..1d4893f5700 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -1050,6 +1050,7 @@ static NlaEvalChannelSnapshot *nlaevalchan_snapshot_new(NlaEvalChannel *nec) nec_snapshot->channel = nec; nec_snapshot->length = length; + nlavalidmask_init(&nec_snapshot->blend_domain, length); return nec_snapshot; } @@ -1059,6 +1060,7 @@ static void nlaevalchan_snapshot_free(NlaEvalChannelSnapshot *nec_snapshot) { BLI_assert(!nec_snapshot->is_base); + nlavalidmask_free(&nec_snapshot->blend_domain); MEM_freeN(nec_snapshot); } @@ -1751,14 +1753,22 @@ static void nlasnapshot_from_action(PointerRNA *ptr, continue; } - NlaEvalChannelSnapshot *necs = nlaeval_snapshot_ensure_channel(r_snapshot, nec); if (!nlaevalchan_validate_index_ex(nec, fcu->array_index)) { continue; } + NlaEvalChannelSnapshot *necs = nlaeval_snapshot_ensure_channel(r_snapshot, nec); + float value = evaluate_fcurve(fcu, modified_evaltime); evaluate_value_fmodifiers(&storage, modifiers, fcu, &value, evaltime); necs->values[fcu->array_index] = value; + + if (nec->mix_mode == NEC_MIX_QUATERNION) { + BLI_bitmap_set_all(necs->blend_domain.ptr, true, 4); + } + else { + BLI_BITMAP_ENABLE(necs->blend_domain.ptr, fcu->array_index); + } } } @@ -1863,6 +1873,8 @@ static void nlastrip_evaluate_transition(PointerRNA *ptr, /** Replace \a snapshot2 NULL channels with base or default values so all channels blend. */ nlasnapshot_ensure_channels(channels, &snapshot2); + /** Mark all \a snapshot2 channel's values to blend. */ + nlasnapshot_enable_all_blend_domain(&snapshot2); nlasnapshot_blend( channels, &snapshot1, &snapshot2, NLASTRIP_MODE_REPLACE, nes->strip_time, snapshot); @@ -2471,6 +2483,18 @@ static void animsys_calculate_nla(PointerRNA *ptr, /* ---------------------- */ +void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot) +{ + for (int i = 0; i < snapshot->size; i++) { + NlaEvalChannelSnapshot *necs = nlaeval_snapshot_get(snapshot, i); + if (necs == NULL) { + continue; + } + + BLI_bitmap_set_all(necs->blend_domain.ptr, true, 4); + } +} + void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot) { LISTBASE_FOREACH (NlaEvalChannel *, nec, &eval_data->channels) { @@ -2479,7 +2503,12 @@ void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapsh } /** Blends the \a lower_snapshot with the \a upper_snapshot into \a r_blended_snapshot according - * to the given \a upper_blendmode and \a upper_influence. */ + * to the given \a upper_blendmode and \a upper_influence. + * + * For \a upper_snapshot, blending limited to values in the \a blend_domain. For Replace blendmode, + * this allows the upper snapshot to have a location XYZ channel where only a subset of values are + * blended. + */ void nlasnapshot_blend(NlaEvalData *eval_data, NlaEvalSnapshot *lower_snapshot, NlaEvalSnapshot *upper_snapshot, @@ -2507,19 +2536,30 @@ void nlasnapshot_blend(NlaEvalData *eval_data, NlaEvalChannelSnapshot *result_necs = nlaeval_snapshot_ensure_channel(r_blended_snapshot, nec); + /** Always copy \a lower_snapshot to result, irrelevant of whether \a upper_snapshot has a + * corresponding channel. This only matters when \a lower_snapshot not the same as + * \a r_blended_snapshot. */ + memcpy(result_necs->values, lower_necs->values, length * sizeof(float)); if (upper_necs == NULL || zero_upper_influence) { - memcpy(result_necs->values, lower_necs->values, length * sizeof(float)); continue; } if (upper_blendmode == NLASTRIP_MODE_COMBINE) { const int mix_mode = nec->mix_mode; if (mix_mode == NEC_MIX_QUATERNION) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, 0)) { + continue; + } + nla_combine_quaternion( lower_necs->values, upper_necs->values, upper_influence, result_necs->values); } else { for (int j = 0; j < length; j++) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) { + continue; + } + result_necs->values[j] = nla_combine_value(mix_mode, nec->base_snapshot.values[j], lower_necs->values[j], @@ -2530,6 +2570,10 @@ void nlasnapshot_blend(NlaEvalData *eval_data, } else { for (int j = 0; j < length; j++) { + if (!BLI_BITMAP_TEST_BOOL(upper_necs->blend_domain.ptr, j)) { + continue; + } + result_necs->values[j] = nla_blend_value( upper_blendmode, lower_necs->values[j], upper_necs->values[j], upper_influence); } diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h index 79c16e321be..706bcac4f17 100644 --- a/source/blender/blenkernel/nla_private.h +++ b/source/blender/blenkernel/nla_private.h @@ -79,6 +79,9 @@ typedef struct NlaValidMask { typedef struct NlaEvalChannelSnapshot { struct NlaEvalChannel *channel; + /** For an upper snapshot channel, marks values that should be blended. */ + NlaValidMask blend_domain; + int length; /* Number of values in the property. */ bool is_base; /* Base snapshot of the channel. */ @@ -182,6 +185,8 @@ void nladata_flush_channels(PointerRNA *ptr, NlaEvalSnapshot *snapshot, const bool flush_to_original); +void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot); + void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot); void nlasnapshot_blend(NlaEvalData *eval_data, From 47a269745ef2a6181fd139dca4d6975d6a8e1038 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 16 Feb 2021 23:39:58 -0600 Subject: [PATCH 227/519] Fix T85716: "Applied Modifier:" report hides more important message Since "Applied Modifier" was always added last, it obscured more important messages when using the shortcut to delete modifiers. The purpose of the report when using the shortcut was to make it clear that something happened. Since another report does that anyway, only display the "Applied Modifier" report if the report list length hasn't changed. --- .../editors/object/object_gpencil_modifier.c | 16 ++++++++++++---- source/blender/editors/object/object_modifier.c | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c index a869a4c2583..3995728c428 100644 --- a/source/blender/editors/object/object_gpencil_modifier.c +++ b/source/blender/editors/object/object_gpencil_modifier.c @@ -730,14 +730,18 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op) Object *ob = ED_object_active_context(C); GpencilModifierData *md = gpencil_edit_modifier_property_get(op, ob, 0); int apply_as = RNA_enum_get(op->ptr, "apply_as"); + const bool do_report = RNA_boolean_get(op->ptr, "report"); if (md == NULL) { return OPERATOR_CANCELLED; } - /* Store name temporarily for report. */ + int reports_len; char name[MAX_NAME]; - strcpy(name, md->name); + if (do_report) { + reports_len = BLI_listbase_count(&op->reports->list); + strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */ + } if (!ED_object_gpencil_modifier_apply(bmain, op->reports, depsgraph, ob, md, apply_as)) { return OPERATOR_CANCELLED; @@ -746,8 +750,12 @@ static int gpencil_modifier_apply_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - if (RNA_boolean_get(op->ptr, "report")) { - BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + if (do_report) { + /* Only add this report if the operator didn't cause another one. The purpose here is + * to alert that something happened, and the previous report will do that anyway. */ + if (BLI_listbase_count(&op->reports->list) == reports_len) { + BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + } } return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 7e0e52d3874..7673649c261 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1383,14 +1383,18 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo Scene *scene = CTX_data_scene(C); Object *ob = ED_object_active_context(C); ModifierData *md = edit_modifier_property_get(op, ob, 0); + const bool do_report = RNA_boolean_get(op->ptr, "report"); if (md == NULL) { return OPERATOR_CANCELLED; } - /* Store name temporarily for report. */ + int reports_len; char name[MAX_NAME]; - strcpy(name, md->name); + if (do_report) { + reports_len = BLI_listbase_count(&op->reports->list); + strcpy(name, md->name); /* Store name temporarily since the modifier is removed. */ + } if (!ED_object_modifier_apply( bmain, op->reports, depsgraph, scene, ob, md, apply_as, keep_modifier)) { @@ -1401,8 +1405,12 @@ static int modifier_apply_exec_ex(bContext *C, wmOperator *op, int apply_as, boo DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - if (RNA_boolean_get(op->ptr, "report")) { - BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + if (do_report) { + /* Only add this report if the operator didn't cause another one. The purpose here is + * to alert that something happened, and the previous report will do that anyway. */ + if (BLI_listbase_count(&op->reports->list) == reports_len) { + BKE_reportf(op->reports, RPT_INFO, "Applied modifier: %s", name); + } } return OPERATOR_FINISHED; From 2da0f3e523f723743f73895941072b301edb596e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 00:01:33 -0600 Subject: [PATCH 228/519] Geometry Nodes: Support integer type in the Attribute Fill Node This will be used by the material index attribute when it is added. --- source/blender/makesrna/intern/rna_nodetree.c | 3 ++- .../nodes/geometry/nodes/node_geo_attribute_fill.cc | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index e72f50e813d..b372ff4c273 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -1931,7 +1931,8 @@ static void rna_GeometryNodeAttributeRandomize_data_type_update(Main *bmain, static bool attribute_fill_type_supported(const EnumPropertyItem *item) { - return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL); + return ELEM( + item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_PROP_BOOL, CD_PROP_INT32); } static const EnumPropertyItem *rna_GeometryNodeAttributeFill_type_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index d2a7e40877f..e4cdd04b46b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -31,6 +31,7 @@ static bNodeSocketTemplate geo_node_attribute_fill_in[] = { {SOCK_FLOAT, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_RGBA, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, {SOCK_BOOLEAN, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, + {SOCK_INT, N_("Value"), 0, 0, 0, 0, -10000000.0f, 10000000.0f}, {-1, ""}, }; @@ -56,6 +57,7 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node bNodeSocket *socket_value_float = socket_value_vector->next; bNodeSocket *socket_value_color4f = socket_value_float->next; bNodeSocket *socket_value_boolean = socket_value_color4f->next; + bNodeSocket *socket_value_int32 = socket_value_boolean->next; const CustomDataType data_type = static_cast(node->custom1); @@ -63,6 +65,7 @@ static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node nodeSetSocketAvailability(socket_value_float, data_type == CD_PROP_FLOAT); nodeSetSocketAvailability(socket_value_color4f, data_type == CD_PROP_COLOR); nodeSetSocketAvailability(socket_value_boolean, data_type == CD_PROP_BOOL); + nodeSetSocketAvailability(socket_value_int32, data_type == CD_PROP_INT32); } namespace blender::nodes { @@ -124,6 +127,11 @@ static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams attribute_span.fill(value); break; } + case CD_PROP_INT32: { + const int value = params.get_input("Value_004"); + MutableSpan attribute_span = attribute->get_span_for_write_only(); + attribute_span.fill(value); + } default: break; } From 17dddc94171497c616eea8bcf47215ae118dd162 Mon Sep 17 00:00:00 2001 From: Wayde Moss Date: Wed, 17 Feb 2021 01:06:41 -0500 Subject: [PATCH 229/519] Fix: NLA Blend Domain Enable All Typo Introduced by my recent commit: rBc48360c2559a Accidentally used 4 instead of `necs->length`. --- source/blender/blenkernel/intern/anim_sys.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 1d4893f5700..4d490f8f76a 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -2491,7 +2491,7 @@ void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot) continue; } - BLI_bitmap_set_all(necs->blend_domain.ptr, true, 4); + BLI_bitmap_set_all(necs->blend_domain.ptr, true, necs->length); } } From 9419452f859117aa17dda7d89810c83bbdcda288 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 17 Feb 2021 12:04:45 +0100 Subject: [PATCH 230/519] Cycles: detect when attributes have changed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch has originally been written by Kévin Dietrich, thanks! It is part of D10210. As Brecht noted in D10210, this might not handle all cases yet. I better solution should come soonish. --- intern/cycles/render/attribute.cpp | 6 ++++++ intern/cycles/render/attribute.h | 1 + intern/cycles/render/geometry.cpp | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index ce4ae6e4295..331d30802f1 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -440,6 +440,7 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme Attribute new_attr(name, type, element, geometry, prim); attributes.emplace_back(std::move(new_attr)); + modified = true; return &attributes.back(); } @@ -461,6 +462,7 @@ void AttributeSet::remove(ustring name) for (it = attributes.begin(); it != attributes.end(); it++) { if (&*it == attr) { + modified = true; attributes.erase(it); return; } @@ -606,6 +608,7 @@ void AttributeSet::remove(AttributeStandard std) for (it = attributes.begin(); it != attributes.end(); it++) { if (&*it == attr) { + modified = true; attributes.erase(it); return; } @@ -671,12 +674,14 @@ void AttributeSet::update(AttributeSet &&new_attributes) for (it = attributes.begin(); it != attributes.end();) { if (it->std != ATTR_STD_NONE) { if (new_attributes.find(it->std) == nullptr) { + modified = true; attributes.erase(it++); continue; } } else if (it->name != "") { if (new_attributes.find(it->name) == nullptr) { + modified = true; attributes.erase(it++); continue; } @@ -691,6 +696,7 @@ void AttributeSet::clear_modified() foreach (Attribute &attr, attributes) { attr.modified = false; } + modified = false; } /* AttributeRequest */ diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index f9997d3c422..c1be62addc0 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -179,6 +179,7 @@ class AttributeSet { Geometry *geometry; AttributePrimitive prim; list attributes; + bool modified = true; AttributeSet(Geometry *geometry, AttributePrimitive prim); AttributeSet(AttributeSet &&) = default; diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index f79b1689c14..575042360aa 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1440,6 +1440,18 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro foreach (Geometry *geom, scene->geometry) { geom->has_volume = false; + if (geom->attributes.modified) { + device_update_flags |= ATTRS_NEED_REALLOC; + } + + if (geom->is_mesh()) { + Mesh *mesh = static_cast(geom); + + if (mesh->subd_attributes.modified) { + device_update_flags |= ATTRS_NEED_REALLOC; + } + } + foreach (Node *node, geom->get_used_shaders()) { Shader *shader = static_cast(node); if (shader->has_volume) { From 3a6d6299d7a0f2a6a156bce6731a0b29804d911d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 17 Feb 2021 12:07:59 +0100 Subject: [PATCH 231/519] Cycles: support accessing custom mesh attributes This makes custom mesh attributes available in Cycles. Typically, these attributes are generated by Geometry Nodes, but they can also be created with a Python script. * The `subdivision` code path is not yet supported. * This does not make vertex weights and some other builtin attributes available in Cycles, even though they are accesible in Geometry Nodes. All attributes generated in Geometry Nodes should be accessible though. * In some cases memory consumption could be removed by not storing all attributes in floats. E.g. booleans and integer attributes for which all values are within a certain range, could be stored in less than 4 bytes per element. Differential Revision: https://developer.blender.org/D10210 --- intern/cycles/blender/blender_mesh.cpp | 128 +++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 7edf797e096..e2b18c22d95 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -310,6 +310,133 @@ static void attr_create_sculpt_vertex_color(Scene *scene, } } +template +static void fill_generic_attribute(BL::Mesh &b_mesh, + TypeInCycles *data, + const AttributeElement element, + const GetValueAtIndex &get_value_at_index) +{ + switch (element) { + case ATTR_ELEMENT_CORNER: { + for (BL::MeshLoopTriangle &t : b_mesh.loop_triangles) { + const int index = t.index() * 3; + BL::Array loops = t.loops(); + data[index] = get_value_at_index(loops[0]); + data[index + 1] = get_value_at_index(loops[1]); + data[index + 2] = get_value_at_index(loops[2]); + } + break; + } + case ATTR_ELEMENT_VERTEX: { + const int num_verts = b_mesh.vertices.length(); + for (int i = 0; i < num_verts; i++) { + data[i] = get_value_at_index(i); + } + break; + } + case ATTR_ELEMENT_FACE: { + for (BL::MeshLoopTriangle &t : b_mesh.loop_triangles) { + data[t.index()] = get_value_at_index(t.polygon_index()); + } + break; + } + default: { + assert(false); + break; + } + } +} + +static void attr_create_generic(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision) +{ + if (subdivision) { + /* TODO: Handle subdivison correctly. */ + return; + } + AttributeSet &attributes = mesh->attributes; + + for (BL::Attribute &b_attribute : b_mesh.attributes) { + const ustring name{b_attribute.name().c_str()}; + if (!mesh->need_attribute(scene, name)) { + continue; + } + if (attributes.find(name)) { + continue; + } + + const BL::Attribute::domain_enum b_domain = b_attribute.domain(); + const BL::Attribute::data_type_enum b_data_type = b_attribute.data_type(); + + AttributeElement element = ATTR_ELEMENT_NONE; + switch (b_domain) { + case BL::Attribute::domain_CORNER: + element = ATTR_ELEMENT_CORNER; + break; + case BL::Attribute::domain_POINT: + element = ATTR_ELEMENT_VERTEX; + break; + case BL::Attribute::domain_POLYGON: + element = ATTR_ELEMENT_FACE; + break; + default: + break; + } + if (element == ATTR_ELEMENT_NONE) { + /* Not supported. */ + continue; + } + switch (b_data_type) { + case BL::Attribute::data_type_FLOAT: { + BL::FloatAttribute b_float_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return b_float_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_BOOLEAN: { + BL::BoolAttribute b_bool_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return (float)b_bool_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_INT: { + BL::IntAttribute b_int_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat, element); + float *data = attr->data_float(); + fill_generic_attribute( + b_mesh, data, element, [&](int i) { return (float)b_int_attribute.data[i].value(); }); + break; + } + case BL::Attribute::data_type_FLOAT_VECTOR: { + BL::FloatVectorAttribute b_vector_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeVector, element); + float3 *data = attr->data_float3(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_vector_attribute.data[i].vector(); + return make_float3(v[0], v[1], v[2]); + }); + break; + } + case BL::Attribute::data_type_FLOAT_COLOR: { + BL::FloatColorAttribute b_color_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeRGBA, element); + float4 *data = attr->data_float4(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_color_attribute.data[i].color(); + return make_float4(v[0], v[1], v[2], v[3]); + }); + break; + } + default: + /* Not supported. */ + break; + } + } +} + /* Create vertex color attributes. */ static void attr_create_vertex_color(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision) { @@ -837,6 +964,7 @@ static void create_mesh(Scene *scene, attr_create_vertex_color(scene, mesh, b_mesh, subdivision); attr_create_sculpt_vertex_color(scene, mesh, b_mesh, subdivision); attr_create_random_per_island(scene, mesh, b_mesh, subdivision); + attr_create_generic(scene, mesh, b_mesh, subdivision); if (subdivision) { attr_create_subd_uv_map(scene, mesh, b_mesh, subdivide_uvs); From 96da8e9ca302b8d879744318c5ad12c64a5b3c2c Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 17 Feb 2021 12:27:32 +0100 Subject: [PATCH 232/519] Geometry Nodes: realize instances before passing geometry to constructive mesh modifier Previously, when the output of a Geometry Nodes modifier would contain instances, those could not be accessed by other existing modifiers (e.g. the Array modifier). That is because those modifiers don't know about instances. Upcoming commits will improve an this in two ways: * Also realize instances before deform modifiers. * Convert a point cloud in the geometry to mesh vertices so that they can be accessed as well. Note, making instances real can result in loosing some information that we do not support in Geometry Nodes yet. That includes some special builtin attributes like bevel weights. Ref T85281. Differential Revision: https://developer.blender.org/D10432 --- .../blender/blenkernel/intern/DerivedMesh.cc | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index ecc41e3f0df..3aef53de64e 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -51,6 +51,7 @@ #include "BKE_deform.h" #include "BKE_editmesh.h" #include "BKE_geometry_set.hh" +#include "BKE_geometry_set_instances.hh" #include "BKE_key.h" #include "BKE_layer.h" #include "BKE_lib_id.h" @@ -882,6 +883,32 @@ void BKE_mesh_wrapper_deferred_finalize(Mesh *me_eval, BLI_assert(me_eval->runtime.wrapper_type_finalize == 0); } +/** + * Some modifiers don't work on geometry sets directly, but expect a single mesh as input. + * Therefore, we convert data from the geometry set into a single mesh, so that those + * modifiers can work on it as well. + */ +static Mesh *prepare_geometry_set_for_mesh_modifier(Mesh *mesh, GeometrySet &r_geometry_set) +{ + if (!r_geometry_set.has_instances()) { + return mesh; + } + + { + /* Add the mesh to the geometry set. */ + MeshComponent &mesh_component = r_geometry_set.get_component_for_write(); + mesh_component.replace_mesh_but_keep_vertex_group_names(mesh, GeometryOwnershipType::Editable); + } + { + /* Combine mesh and all instances into a single mesh that can be passed to the modifier. */ + GeometrySet new_geometry_set = blender::bke::geometry_set_realize_instances(r_geometry_set); + MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); + Mesh *new_mesh = mesh_component.release(); + r_geometry_set = new_geometry_set; + return new_mesh; + } +} + /** * Modifies the given mesh and geometry set. The mesh is not passed as part of the mesh component * in the \a geometry_set input, it is only passed in \a input_mesh and returned in the return @@ -898,7 +925,14 @@ static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md, Mesh *mesh_output = nullptr; const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); if (mti->modifyGeometrySet == nullptr) { - mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh); + Mesh *new_input_mesh = prepare_geometry_set_for_mesh_modifier(input_mesh, geometry_set); + mesh_output = BKE_modifier_modify_mesh(md, &mectx, new_input_mesh); + + /* The caller is responsible for freeing `input_mesh` and `mesh_output`. The intermediate + * `new_input_mesh` has to be freed here. */ + if (!ELEM(new_input_mesh, input_mesh, mesh_output)) { + BKE_id_free(nullptr, new_input_mesh); + } } else { /* For performance reasons, this should be called by the modifier and/or nodes themselves at From 55a69d5707ffef12a0f423ba4fa646f45af82375 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 17 Feb 2021 13:17:50 +0100 Subject: [PATCH 233/519] Geometry Nodes: realize instances before deform modifier This is a follow up commit for rB96da8e9ca302b8d879744. Ref T85281. --- source/blender/blenkernel/intern/DerivedMesh.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 3aef53de64e..213e72d496b 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -1189,6 +1189,14 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, /* No existing verts to deform, need to build them. */ if (!deformed_verts) { if (mesh_final) { + Mesh *mesh_final_new = prepare_geometry_set_for_mesh_modifier(mesh_final, + geometry_set_final); + if (mesh_final_new != mesh_final) { + BLI_assert(mesh_final != mesh_input); + BKE_id_free(nullptr, mesh_final); + mesh_final = mesh_final_new; + } + /* Deforming a mesh, read the vertex locations * out of the mesh and deform them. Once done with this * run of deformers verts will be written back. */ From 09f7c93858297ab8beafc9cf9bfa06f7d8e68ea6 Mon Sep 17 00:00:00 2001 From: Jamell Moore Date: Wed, 17 Feb 2021 13:24:00 +0100 Subject: [PATCH 234/519] Fix T80862: Small stroke opacity modulation is best done in the fragment shader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To avoid anti-aliasing artifacts on GPencil strokes that have a size smaller than 1 the thickness is clamped and the opacity reduced. This was done in vertex shader but this had the side effect of causing strokes that go from large to small to fade across their lengths. **Solution** The opacity modulation has now been moved to the fragment shader as advised by Clément Foucault. The strokeThickness that was passed to the shader was clamped to prevent it from being too small so an additional unclamped thickness has been passed to the fragment to calculate the opacity modulation. Alternatively I could have chosen strokeThickness and clampedThickness but I decided against renaming the variables in the current code. Reviewed By: fclem Differential Revision: https://developer.blender.org/D10438 --- .../gpencil/shaders/gpencil_common_lib.glsl | 28 ++++++++++++------- .../engines/gpencil/shaders/gpencil_frag.glsl | 3 ++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl index 3065d553dce..f1705dfcd8c 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl @@ -156,6 +156,7 @@ IN_OUT ShaderStageInterface vec3 finalPos; vec2 finalUvs; noperspective float strokeThickness; + noperspective float unclampedThickness; noperspective float strokeHardeness; flat vec2 strokeAspect; flat vec2 strokePt1; @@ -324,7 +325,7 @@ vec2 safe_normalize_len(vec2 v, out float len) } } -float stroke_thickness_modulate(float thickness, out float opacity) +float stroke_thickness_modulate(float thickness) { /* Modify stroke thickness by object and layer factors.-*/ thickness *= thicknessScale; @@ -340,9 +341,14 @@ float stroke_thickness_modulate(float thickness, out float opacity) /* World space point size. */ thickness *= thicknessWorldScale * ProjectionMatrix[1][1] * sizeViewport.y; } - /* To avoid aliasing artifact, we clamp the line thickness and reduce its opacity. */ + return thickness; +} + +float clamp_small_stroke_thickness(float thickness) +{ + /* To avoid aliasing artifacts, we clamp the line thickness and + * the reduce its opacity in the fragment shader.*/ float min_thickness = gl_Position.w * 1.3; - opacity = smoothstep(0.0, gl_Position.w * 1.0, thickness); thickness = max(min_thickness, thickness); return thickness; @@ -426,9 +432,9 @@ void stroke_vertex() vec2 line = safe_normalize_len(ss2 - ss1, line_len); vec2 line_adj = safe_normalize((use_curr) ? (ss1 - ss_adj) : (ss_adj - ss2)); - float small_line_opacity; float thickness = abs((use_curr) ? thickness1 : thickness2); - thickness = stroke_thickness_modulate(thickness, small_line_opacity); + thickness = stroke_thickness_modulate(thickness); + float clampedThickness = clamp_small_stroke_thickness(thickness); finalUvs = vec2(x, y) * 0.5 + 0.5; strokeHardeness = decode_hardness(use_curr ? hardness1 : hardness2); @@ -479,11 +485,12 @@ void stroke_vertex() /* Invert for vertex shader. */ strokeAspect = 1.0 / strokeAspect; - gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * thickness; + gl_Position.xy += (x * x_axis + y * y_axis) * sizeViewportInv.xy * clampedThickness; strokePt1 = ss1; strokePt2 = ss1 + x_axis * 0.5; - strokeThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w); + strokeThickness = (is_squares) ? 1e18 : (clampedThickness / gl_Position.w); + unclampedThickness = (is_squares) ? 1e18 : (thickness / gl_Position.w); } else { bool is_stroke_start = (ma.x == -1 && x == -1); @@ -501,7 +508,8 @@ void stroke_vertex() strokePt1.xy = ss1; strokePt2.xy = ss2; - strokeThickness = thickness / gl_Position.w; + strokeThickness = clampedThickness / gl_Position.w; + unclampedThickness = thickness / gl_Position.w; strokeAspect = vec2(1.0); vec2 screen_ofs = miter * y; @@ -512,7 +520,7 @@ void stroke_vertex() screen_ofs += line * x; } - gl_Position.xy += screen_ofs * sizeViewportInv.xy * thickness; + gl_Position.xy += screen_ofs * sizeViewportInv.xy * clampedThickness; finalUvs.x = (use_curr) ? uv1.z : uv2.z; # ifdef GP_MATERIAL_BUFFER_LEN @@ -531,7 +539,7 @@ void stroke_vertex() vert_col = vec4(0.0); } - color_output(stroke_col, vert_col, vert_strength * small_line_opacity, mix_tex); + color_output(stroke_col, vert_col, vert_strength, mix_tex); matFlag = GP_FLAG(m) & ~GP_FILL_FLAGS; # endif diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl index 31e6df80d23..87365c2844d 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl @@ -89,6 +89,9 @@ void main() fragColor *= stroke_round_cap_mask( strokePt1, strokePt2, strokeAspect, strokeThickness, strokeHardeness); + /* To avoid aliasing artifacts, we reduce the opacity of small strokes. */ + fragColor *= smoothstep(0.0, 1.0, unclampedThickness); + /* Holdout materials. */ if (GP_FLAG_TEST(matFlag, GP_STROKE_HOLDOUT | GP_FILL_HOLDOUT)) { revealColor = fragColor.aaaa; From 1ea6394fc8446cb54ec011d0e210135b8b5a4d33 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 17 Feb 2021 13:30:11 +0100 Subject: [PATCH 235/519] Cleanup: Fix typo error --- .../draw/engines/gpencil/shaders/gpencil_common_lib.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl index f1705dfcd8c..59f07ccb82b 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl @@ -347,7 +347,7 @@ float stroke_thickness_modulate(float thickness) float clamp_small_stroke_thickness(float thickness) { /* To avoid aliasing artifacts, we clamp the line thickness and - * the reduce its opacity in the fragment shader.*/ + * reduce its opacity in the fragment shader.*/ float min_thickness = gl_Position.w * 1.3; thickness = max(min_thickness, thickness); From b7e1660d405d9d73f1aff54358a6d2d1461a75d0 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 17 Feb 2021 10:16:41 -0300 Subject: [PATCH 236/519] Cleanup: Use 'pygpu_' prefix in the cpython GPU module `py_` prefix can be confused with the Python's own API's. --- source/blender/python/gpu/gpu_py_api.c | 8 +- source/blender/python/gpu/gpu_py_batch.c | 60 +++--- source/blender/python/gpu/gpu_py_element.c | 12 +- source/blender/python/gpu/gpu_py_matrix.c | 191 ++++++++--------- source/blender/python/gpu/gpu_py_offscreen.c | 109 +++++----- source/blender/python/gpu/gpu_py_select.c | 18 +- source/blender/python/gpu/gpu_py_shader.c | 195 ++++++++++-------- source/blender/python/gpu/gpu_py_types.c | 4 +- .../blender/python/gpu/gpu_py_vertex_buffer.c | 54 ++--- .../blender/python/gpu/gpu_py_vertex_format.c | 42 ++-- 10 files changed, 358 insertions(+), 335 deletions(-) diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index eb2fd1f7304..dcc8484319e 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -105,13 +105,13 @@ success: /** \name GPU Module * \{ */ -PyDoc_STRVAR(GPU_doc, +PyDoc_STRVAR(pygpu_doc, "This module provides Python wrappers for the GPU implementation in Blender.\n" "Some higher level functions can be found in the `gpu_extras` module."); -static struct PyModuleDef GPU_module_def = { +static struct PyModuleDef pygpu_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu", - .m_doc = GPU_doc, + .m_doc = pygpu_doc, }; PyObject *BPyInit_gpu(void) @@ -120,7 +120,7 @@ PyObject *BPyInit_gpu(void) PyObject *submodule; PyObject *mod; - mod = PyModule_Create(&GPU_module_def); + mod = PyModule_Create(&pygpu_module_def); PyModule_AddObject(mod, "types", (submodule = bpygpu_types_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c index 9fb7aea162a..0e4cc4d2219 100644 --- a/source/blender/python/gpu/gpu_py_batch.c +++ b/source/blender/python/gpu/gpu_py_batch.c @@ -48,7 +48,7 @@ /** \name Utility Functions * \{ */ -static bool py_batch_is_program_or_error(BPyGPUBatch *self) +static bool pygpu_batch_is_program_or_error(BPyGPUBatch *self) { if (!self->batch->shader) { PyErr_SetString(PyExc_RuntimeError, "batch does not have any program assigned to it"); @@ -63,7 +63,7 @@ static bool py_batch_is_program_or_error(BPyGPUBatch *self) /** \name GPUBatch Type * \{ */ -static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_batch__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -121,7 +121,7 @@ static PyObject *py_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObje return (PyObject *)ret; } -PyDoc_STRVAR(py_Batch_vertbuf_add_doc, +PyDoc_STRVAR(pygpu_batch_vertbuf_add_doc, ".. method:: vertbuf_add(buf)\n" "\n" " Add another vertex buffer to the Batch.\n" @@ -134,7 +134,7 @@ PyDoc_STRVAR(py_Batch_vertbuf_add_doc, " :param buf: The vertex buffer that will be added to the batch.\n" " :type buf: :class:`gpu.types.GPUVertBuf`\n" ); -static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) +static PyObject *pygpu_batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) { if (!BPyGPUVertBuf_Check(py_buf)) { PyErr_Format(PyExc_TypeError, "Expected a GPUVertBuf, got %s", Py_TYPE(py_buf)->tp_name); @@ -167,7 +167,7 @@ static PyObject *py_Batch_vertbuf_add(BPyGPUBatch *self, BPyGPUVertBuf *py_buf) } PyDoc_STRVAR( - py_Batch_program_set_doc, + pygpu_batch_program_set_doc, ".. method:: program_set(program)\n" "\n" " Assign a shader to this batch that will be used for drawing when not overwritten later.\n" @@ -177,7 +177,7 @@ PyDoc_STRVAR( "\n" " :param program: The program/shader the batch will use in future draw calls.\n" " :type program: :class:`gpu.types.GPUShader`\n"); -static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader) +static PyObject *pygpu_batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader) { if (!BPyGPUShader_Check(py_shader)) { PyErr_Format(PyExc_TypeError, "Expected a GPUShader, got %s", Py_TYPE(py_shader)->tp_name); @@ -208,7 +208,7 @@ static PyObject *py_Batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader Py_RETURN_NONE; } -PyDoc_STRVAR(py_Batch_draw_doc, +PyDoc_STRVAR(pygpu_batch_draw_doc, ".. method:: draw(program=None)\n" "\n" " Run the drawing program with the parameters assigned to the batch.\n" @@ -216,7 +216,7 @@ PyDoc_STRVAR(py_Batch_draw_doc, " :param program: Program that performs the drawing operations.\n" " If ``None`` is passed, the last program set to this batch will run.\n" " :type program: :class:`gpu.types.GPUShader`\n"); -static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) +static PyObject *pygpu_batch_draw(BPyGPUBatch *self, PyObject *args) { BPyGPUShader *py_program = NULL; @@ -224,7 +224,7 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) return NULL; } if (py_program == NULL) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } } @@ -236,42 +236,42 @@ static PyObject *py_Batch_draw(BPyGPUBatch *self, PyObject *args) Py_RETURN_NONE; } -static PyObject *py_Batch_program_use_begin(BPyGPUBatch *self) +static PyObject *pygpu_batch_program_use_begin(BPyGPUBatch *self) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } GPU_shader_bind(self->batch->shader); Py_RETURN_NONE; } -static PyObject *py_Batch_program_use_end(BPyGPUBatch *self) +static PyObject *pygpu_batch_program_use_end(BPyGPUBatch *self) { - if (!py_batch_is_program_or_error(self)) { + if (!pygpu_batch_is_program_or_error(self)) { return NULL; } GPU_shader_unbind(); Py_RETURN_NONE; } -static struct PyMethodDef py_Batch_methods[] = { - {"vertbuf_add", (PyCFunction)py_Batch_vertbuf_add, METH_O, py_Batch_vertbuf_add_doc}, - {"program_set", (PyCFunction)py_Batch_program_set, METH_O, py_Batch_program_set_doc}, - {"draw", (PyCFunction)py_Batch_draw, METH_VARARGS, py_Batch_draw_doc}, - {"_program_use_begin", (PyCFunction)py_Batch_program_use_begin, METH_NOARGS, ""}, - {"_program_use_end", (PyCFunction)py_Batch_program_use_end, METH_NOARGS, ""}, +static struct PyMethodDef pygpu_batch__tp_methods[] = { + {"vertbuf_add", (PyCFunction)pygpu_batch_vertbuf_add, METH_O, pygpu_batch_vertbuf_add_doc}, + {"program_set", (PyCFunction)pygpu_batch_program_set, METH_O, pygpu_batch_program_set_doc}, + {"draw", (PyCFunction)pygpu_batch_draw, METH_VARARGS, pygpu_batch_draw_doc}, + {"_program_use_begin", (PyCFunction)pygpu_batch_program_use_begin, METH_NOARGS, ""}, + {"_program_use_end", (PyCFunction)pygpu_batch_program_use_end, METH_NOARGS, ""}, {NULL, NULL, 0, NULL}, }; #ifdef USE_GPU_PY_REFERENCES -static int py_Batch_traverse(BPyGPUBatch *self, visitproc visit, void *arg) +static int pygpu_batch__tp_traverse(BPyGPUBatch *self, visitproc visit, void *arg) { Py_VISIT(self->references); return 0; } -static int py_Batch_clear(BPyGPUBatch *self) +static int pygpu_batch__tp_clear(BPyGPUBatch *self) { Py_CLEAR(self->references); return 0; @@ -279,14 +279,14 @@ static int py_Batch_clear(BPyGPUBatch *self) #endif -static void py_Batch_dealloc(BPyGPUBatch *self) +static void pygpu_batch__tp_dealloc(BPyGPUBatch *self) { GPU_batch_discard(self->batch); #ifdef USE_GPU_PY_REFERENCES if (self->references) { PyObject_GC_UnTrack(self); - py_Batch_clear(self); + pygpu_batch__tp_clear(self); Py_XDECREF(self->references); } #endif @@ -295,7 +295,7 @@ static void py_Batch_dealloc(BPyGPUBatch *self) } PyDoc_STRVAR( - py_gpu_batch_doc, + pygpu_batch__tp_doc, ".. class:: GPUBatch(type, buf, elem=None)\n" "\n" " Reusable container for drawable geometry.\n" @@ -319,17 +319,17 @@ PyDoc_STRVAR( PyTypeObject BPyGPUBatch_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUBatch", .tp_basicsize = sizeof(BPyGPUBatch), - .tp_dealloc = (destructor)py_Batch_dealloc, + .tp_dealloc = (destructor)pygpu_batch__tp_dealloc, #ifdef USE_GPU_PY_REFERENCES .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, - .tp_doc = py_gpu_batch_doc, - .tp_traverse = (traverseproc)py_Batch_traverse, - .tp_clear = (inquiry)py_Batch_clear, + .tp_doc = pygpu_batch__tp_doc, + .tp_traverse = (traverseproc)pygpu_batch__tp_traverse, + .tp_clear = (inquiry)pygpu_batch__tp_clear, #else .tp_flags = Py_TPFLAGS_DEFAULT, #endif - .tp_methods = py_Batch_methods, - .tp_new = py_Batch_new, + .tp_methods = pygpu_batch__tp_methods, + .tp_new = pygpu_batch__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c index 0a1aecde986..f43338c42d2 100644 --- a/source/blender/python/gpu/gpu_py_element.c +++ b/source/blender/python/gpu/gpu_py_element.c @@ -39,7 +39,7 @@ /** \name IndexBuf Type * \{ */ -static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -175,13 +175,13 @@ static PyObject *py_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyO return BPyGPUIndexBuf_CreatePyObject(GPU_indexbuf_build(&builder)); } -static void py_IndexBuf_dealloc(BPyGPUIndexBuf *self) +static void pygpu_IndexBuf__tp_dealloc(BPyGPUIndexBuf *self) { GPU_indexbuf_discard(self->elem); Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_gpu_element_doc, +PyDoc_STRVAR(pygpu_IndexBuf__tp_doc, ".. class:: GPUIndexBuf(type, seq)\n" "\n" " Contains an index buffer.\n" @@ -199,10 +199,10 @@ PyDoc_STRVAR(py_gpu_element_doc, PyTypeObject BPyGPUIndexBuf_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUIndexBuf", .tp_basicsize = sizeof(BPyGPUIndexBuf), - .tp_dealloc = (destructor)py_IndexBuf_dealloc, + .tp_dealloc = (destructor)pygpu_IndexBuf__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_gpu_element_doc, - .tp_new = py_IndexBuf_new, + .tp_doc = pygpu_IndexBuf__tp_doc, + .tp_new = pygpu_IndexBuf__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_matrix.c b/source/blender/python/gpu/gpu_py_matrix.c index 05e0a416b94..df7c82379b3 100644 --- a/source/blender/python/gpu/gpu_py_matrix.c +++ b/source/blender/python/gpu/gpu_py_matrix.c @@ -44,7 +44,7 @@ /** \name Helper Functions * \{ */ -static bool py_stack_is_push_model_view_ok_or_error(void) +static bool pygpu_stack_is_push_model_view_ok_or_error(void) { if (GPU_matrix_stack_level_get_model_view() >= GPU_PY_MATRIX_STACK_LEN) { PyErr_SetString( @@ -55,7 +55,7 @@ static bool py_stack_is_push_model_view_ok_or_error(void) return true; } -static bool py_stack_is_push_projection_ok_or_error(void) +static bool pygpu_stack_is_push_projection_ok_or_error(void) { if (GPU_matrix_stack_level_get_projection() >= GPU_PY_MATRIX_STACK_LEN) { PyErr_SetString( @@ -66,7 +66,7 @@ static bool py_stack_is_push_projection_ok_or_error(void) return true; } -static bool py_stack_is_pop_model_view_ok_or_error(void) +static bool pygpu_stack_is_pop_model_view_ok_or_error(void) { if (GPU_matrix_stack_level_get_model_view() == 0) { PyErr_SetString(PyExc_RuntimeError, "Minimum model-view stack depth reached"); @@ -75,7 +75,7 @@ static bool py_stack_is_pop_model_view_ok_or_error(void) return true; } -static bool py_stack_is_pop_projection_ok_or_error(void) +static bool pygpu_stack_is_pop_projection_ok_or_error(void) { if (GPU_matrix_stack_level_get_projection() == 0) { PyErr_SetString(PyExc_RuntimeError, "Minimum projection stack depth reached"); @@ -90,52 +90,52 @@ static bool py_stack_is_pop_projection_ok_or_error(void) /** \name Manage Stack * \{ */ -PyDoc_STRVAR(py_matrix_push_doc, +PyDoc_STRVAR(pygpu_matrix_push_doc, ".. function:: push()\n" "\n" " Add to the model-view matrix stack.\n"); -static PyObject *py_matrix_push(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push(PyObject *UNUSED(self)) { - if (!py_stack_is_push_model_view_ok_or_error()) { + if (!pygpu_stack_is_push_model_view_ok_or_error()) { return NULL; } GPU_matrix_push(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_pop_doc, +PyDoc_STRVAR(pygpu_matrix_pop_doc, ".. function:: pop()\n" "\n" " Remove the last model-view matrix from the stack.\n"); -static PyObject *py_matrix_pop(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_pop(PyObject *UNUSED(self)) { - if (!py_stack_is_pop_model_view_ok_or_error()) { + if (!pygpu_stack_is_pop_model_view_ok_or_error()) { return NULL; } GPU_matrix_pop(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_push_projection_doc, +PyDoc_STRVAR(pygpu_matrix_push_projection_doc, ".. function:: push_projection()\n" "\n" " Add to the projection matrix stack.\n"); -static PyObject *py_matrix_push_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_projection(PyObject *UNUSED(self)) { - if (!py_stack_is_push_projection_ok_or_error()) { + if (!pygpu_stack_is_push_projection_ok_or_error()) { return NULL; } GPU_matrix_push_projection(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_pop_projection_doc, +PyDoc_STRVAR(pygpu_matrix_pop_projection_doc, ".. function:: pop_projection()\n" "\n" " Remove the last projection matrix from the stack.\n"); -static PyObject *py_matrix_pop_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_pop_projection(PyObject *UNUSED(self)) { - if (!py_stack_is_pop_projection_ok_or_error()) { + if (!pygpu_stack_is_pop_projection_ok_or_error()) { return NULL; } GPU_matrix_pop_projection(); @@ -162,23 +162,23 @@ enum { PYGPU_MATRIX_TYPE_PROJECTION = 2, }; -static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self); -static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args); +static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self); +static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args); -static PyMethodDef py_matrix_stack_context_methods[] = { - {"__enter__", (PyCFunction)py_matrix_stack_context_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)py_matrix_stack_context_exit, METH_VARARGS}, +static PyMethodDef pygpu_matrix_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_matrix_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_matrix_stack_context_exit, METH_VARARGS}, {NULL}, }; -static PyTypeObject BPyGPU_matrix_stack_context_Type = { +static PyTypeObject PyGPUMatrixStackContext_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUMatrixStackContext", .tp_basicsize = sizeof(BPyGPU_MatrixStackContext), .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_methods = py_matrix_stack_context_methods, + .tp_methods = pygpu_matrix_stack_context__tp_methods, }; -static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) +static PyObject *pygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) { /* sanity - should never happen */ if (self->level != -1) { @@ -187,14 +187,14 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) } if (self->type == PYGPU_MATRIX_TYPE_MODEL_VIEW) { - if (!py_stack_is_push_model_view_ok_or_error()) { + if (!pygpu_stack_is_push_model_view_ok_or_error()) { return NULL; } GPU_matrix_push(); self->level = GPU_matrix_stack_level_get_model_view(); } else if (self->type == PYGPU_MATRIX_TYPE_PROJECTION) { - if (!py_stack_is_push_projection_ok_or_error()) { + if (!pygpu_stack_is_push_projection_ok_or_error()) { return NULL; } GPU_matrix_push_projection(); @@ -206,8 +206,8 @@ static PyObject *py_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self) Py_RETURN_NONE; } -static PyObject *py_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, - PyObject *UNUSED(args)) +static PyObject *pygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, + PyObject *UNUSED(args)) { /* sanity - should never happen */ if (self->level == -1) { @@ -240,33 +240,33 @@ finally: Py_RETURN_NONE; } -static PyObject *py_matrix_push_pop_impl(int type) +static PyObject *pygpu_matrix_push_pop_impl(int type) { BPyGPU_MatrixStackContext *ret = PyObject_New(BPyGPU_MatrixStackContext, - &BPyGPU_matrix_stack_context_Type); + &PyGPUMatrixStackContext_Type); ret->type = type; ret->level = -1; return (PyObject *)ret; } PyDoc_STRVAR( - py_matrix_push_pop_doc, + pygpu_matrix_push_pop_doc, ".. function:: push_pop()\n" "\n" " Context manager to ensure balanced push/pop calls, even in the case of an error.\n"); -static PyObject *py_matrix_push_pop(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_pop(PyObject *UNUSED(self)) { - return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW); + return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW); } PyDoc_STRVAR( - py_matrix_push_pop_projection_doc, + pygpu_matrix_push_pop_projection_doc, ".. function:: push_pop_projection()\n" "\n" " Context manager to ensure balanced push/pop calls, even in the case of an error.\n"); -static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_push_pop_projection(PyObject *UNUSED(self)) { - return py_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION); + return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION); } /** \} */ @@ -275,14 +275,14 @@ static PyObject *py_matrix_push_pop_projection(PyObject *UNUSED(self)) /** \name Manipulate State * \{ */ -PyDoc_STRVAR(py_matrix_multiply_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_multiply_matrix_doc, ".. function:: multiply_matrix(matrix)\n" "\n" " Multiply the current stack matrix.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -292,14 +292,14 @@ static PyObject *py_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *val Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_scale_doc, +PyDoc_STRVAR(pygpu_matrix_scale_doc, ".. function:: scale(scale)\n" "\n" " Scale the current stack matrix.\n" "\n" " :param scale: Scale the current stack matrix.\n" " :type scale: sequence of 2 or 3 floats\n"); -static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value) { float scale[3]; int len; @@ -316,12 +316,12 @@ static PyObject *py_matrix_scale(PyObject *UNUSED(self), PyObject *value) Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_scale_uniform_doc, +PyDoc_STRVAR(pygpu_matrix_scale_uniform_doc, ".. function:: scale_uniform(scale)\n" "\n" " :param scale: Scale the current stack matrix.\n" " :type scale: float\n"); -static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value) { float scalar; if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) { @@ -332,14 +332,14 @@ static PyObject *py_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_translate_doc, +PyDoc_STRVAR(pygpu_matrix_translate_doc, ".. function:: translate(offset)\n" "\n" " Scale the current stack matrix.\n" "\n" " :param offset: Translate the current stack matrix.\n" " :type offset: sequence of 2 or 3 floats\n"); -static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value) { float offset[3]; int len; @@ -362,34 +362,34 @@ static PyObject *py_matrix_translate(PyObject *UNUSED(self), PyObject *value) /** \name Write State * \{ */ -PyDoc_STRVAR(py_matrix_reset_doc, +PyDoc_STRVAR(pygpu_matrix_reset_doc, ".. function:: reset()\n" "\n" " Empty stack and set to identity.\n"); -static PyObject *py_matrix_reset(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_reset(PyObject *UNUSED(self)) { GPU_matrix_reset(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_identity_doc, +PyDoc_STRVAR(pygpu_matrix_load_identity_doc, ".. function:: load_identity()\n" "\n" " Empty stack and set to identity.\n"); -static PyObject *py_matrix_load_identity(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_load_identity(PyObject *UNUSED(self)) { GPU_matrix_identity_set(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_load_matrix_doc, ".. function:: load_matrix(matrix)\n" "\n" " Load a matrix into the stack.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -399,14 +399,14 @@ static PyObject *py_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value) Py_RETURN_NONE; } -PyDoc_STRVAR(py_matrix_load_projection_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_load_projection_matrix_doc, ".. function:: load_projection_matrix(matrix)\n" "\n" " Load a projection matrix into the stack.\n" "\n" " :param matrix: A 4x4 matrix.\n" " :type matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value) { MatrixObject *pymat; if (!Matrix_Parse4x4(value, &pymat)) { @@ -422,42 +422,42 @@ static PyObject *py_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObje /** \name Read State * \{ */ -PyDoc_STRVAR(py_matrix_get_projection_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_projection_matrix_doc, ".. function:: get_projection_matrix()\n" "\n" " Return a copy of the projection matrix.\n" "\n" " :return: A 4x4 projection matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_projection_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_projection_matrix(PyObject *UNUSED(self)) { float matrix[4][4]; GPU_matrix_projection_get(matrix); return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL); } -PyDoc_STRVAR(py_matrix_get_model_view_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_model_view_matrix_doc, ".. function:: get_model_view_matrix()\n" "\n" " Return a copy of the model-view matrix.\n" "\n" " :return: A 4x4 view matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_model_view_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_model_view_matrix(PyObject *UNUSED(self)) { float matrix[4][4]; GPU_matrix_model_view_get(matrix); return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL); } -PyDoc_STRVAR(py_matrix_get_normal_matrix_doc, +PyDoc_STRVAR(pygpu_matrix_get_normal_matrix_doc, ".. function:: get_normal_matrix()\n" "\n" " Return a copy of the normal matrix.\n" "\n" " :return: A 3x3 normal matrix.\n" " :rtype: :class:`mathutils.Matrix`\n"); -static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self)) +static PyObject *pygpu_matrix_get_normal_matrix(PyObject *UNUSED(self)) { float matrix[3][3]; GPU_matrix_normal_get(matrix); @@ -470,87 +470,90 @@ static PyObject *py_matrix_get_normal_matrix(PyObject *UNUSED(self)) /** \name Module * \{ */ -static struct PyMethodDef py_matrix_methods[] = { +static struct PyMethodDef pygpu_matrix__tp_methods[] = { /* Manage Stack */ - {"push", (PyCFunction)py_matrix_push, METH_NOARGS, py_matrix_push_doc}, - {"pop", (PyCFunction)py_matrix_pop, METH_NOARGS, py_matrix_pop_doc}, + {"push", (PyCFunction)pygpu_matrix_push, METH_NOARGS, pygpu_matrix_push_doc}, + {"pop", (PyCFunction)pygpu_matrix_pop, METH_NOARGS, pygpu_matrix_pop_doc}, {"push_projection", - (PyCFunction)py_matrix_push_projection, + (PyCFunction)pygpu_matrix_push_projection, METH_NOARGS, - py_matrix_push_projection_doc}, + pygpu_matrix_push_projection_doc}, {"pop_projection", - (PyCFunction)py_matrix_pop_projection, + (PyCFunction)pygpu_matrix_pop_projection, METH_NOARGS, - py_matrix_pop_projection_doc}, + pygpu_matrix_pop_projection_doc}, /* Stack (Context Manager) */ - {"push_pop", (PyCFunction)py_matrix_push_pop, METH_NOARGS, py_matrix_push_pop_doc}, + {"push_pop", (PyCFunction)pygpu_matrix_push_pop, METH_NOARGS, pygpu_matrix_push_pop_doc}, {"push_pop_projection", - (PyCFunction)py_matrix_push_pop_projection, + (PyCFunction)pygpu_matrix_push_pop_projection, METH_NOARGS, - py_matrix_push_pop_projection_doc}, + pygpu_matrix_push_pop_projection_doc}, /* Manipulate State */ {"multiply_matrix", - (PyCFunction)py_matrix_multiply_matrix, + (PyCFunction)pygpu_matrix_multiply_matrix, METH_O, - py_matrix_multiply_matrix_doc}, - {"scale", (PyCFunction)py_matrix_scale, METH_O, py_matrix_scale_doc}, - {"scale_uniform", (PyCFunction)py_matrix_scale_uniform, METH_O, py_matrix_scale_uniform_doc}, - {"translate", (PyCFunction)py_matrix_translate, METH_O, py_matrix_translate_doc}, + pygpu_matrix_multiply_matrix_doc}, + {"scale", (PyCFunction)pygpu_matrix_scale, METH_O, pygpu_matrix_scale_doc}, + {"scale_uniform", + (PyCFunction)pygpu_matrix_scale_uniform, + METH_O, + pygpu_matrix_scale_uniform_doc}, + {"translate", (PyCFunction)pygpu_matrix_translate, METH_O, pygpu_matrix_translate_doc}, /* TODO */ #if 0 - {"rotate", (PyCFunction)py_matrix_rotate, METH_O, py_matrix_rotate_doc}, - {"rotate_axis", (PyCFunction)py_matrix_rotate_axis, METH_O, py_matrix_rotate_axis_doc}, - {"look_at", (PyCFunction)py_matrix_look_at, METH_O, py_matrix_look_at_doc}, + {"rotate", (PyCFunction)pygpu_matrix_rotate, METH_O, pygpu_matrix_rotate_doc}, + {"rotate_axis", (PyCFunction)pygpu_matrix_rotate_axis, METH_O, pygpu_matrix_rotate_axis_doc}, + {"look_at", (PyCFunction)pygpu_matrix_look_at, METH_O, pygpu_matrix_look_at_doc}, #endif /* Write State */ - {"reset", (PyCFunction)py_matrix_reset, METH_NOARGS, py_matrix_reset_doc}, + {"reset", (PyCFunction)pygpu_matrix_reset, METH_NOARGS, pygpu_matrix_reset_doc}, {"load_identity", - (PyCFunction)py_matrix_load_identity, + (PyCFunction)pygpu_matrix_load_identity, METH_NOARGS, - py_matrix_load_identity_doc}, - {"load_matrix", (PyCFunction)py_matrix_load_matrix, METH_O, py_matrix_load_matrix_doc}, + pygpu_matrix_load_identity_doc}, + {"load_matrix", (PyCFunction)pygpu_matrix_load_matrix, METH_O, pygpu_matrix_load_matrix_doc}, {"load_projection_matrix", - (PyCFunction)py_matrix_load_projection_matrix, + (PyCFunction)pygpu_matrix_load_projection_matrix, METH_O, - py_matrix_load_projection_matrix_doc}, + pygpu_matrix_load_projection_matrix_doc}, /* Read State */ {"get_projection_matrix", - (PyCFunction)py_matrix_get_projection_matrix, + (PyCFunction)pygpu_matrix_get_projection_matrix, METH_NOARGS, - py_matrix_get_projection_matrix_doc}, + pygpu_matrix_get_projection_matrix_doc}, {"get_model_view_matrix", - (PyCFunction)py_matrix_get_model_view_matrix, + (PyCFunction)pygpu_matrix_get_model_view_matrix, METH_NOARGS, - py_matrix_get_model_view_matrix_doc}, + pygpu_matrix_get_model_view_matrix_doc}, {"get_normal_matrix", - (PyCFunction)py_matrix_get_normal_matrix, + (PyCFunction)pygpu_matrix_get_normal_matrix, METH_NOARGS, - py_matrix_get_normal_matrix_doc}, + pygpu_matrix_get_normal_matrix_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_matrix_doc, "This module provides access to the matrix stack."); -static PyModuleDef py_matrix_module_def = { +PyDoc_STRVAR(pygpu_matrix__tp_doc, "This module provides access to the matrix stack."); +static PyModuleDef pygpu_matrix_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.matrix", - .m_doc = py_matrix_doc, - .m_methods = py_matrix_methods, + .m_doc = pygpu_matrix__tp_doc, + .m_methods = pygpu_matrix__tp_methods, }; PyObject *bpygpu_matrix_init(void) { PyObject *submodule; - submodule = PyModule_Create(&py_matrix_module_def); + submodule = PyModule_Create(&pygpu_matrix_module_def); - if (PyType_Ready(&BPyGPU_matrix_stack_context_Type) < 0) { + if (PyType_Ready(&PyGPUMatrixStackContext_Type) < 0) { return NULL; } diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 8d2df826722..2431a1fca5b 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -58,9 +58,9 @@ /** \name GPUOffScreen Common Utilities * \{ */ -static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) +static int pygpu_offscreen_valid_check(BPyGPUOffScreen *pygpu_ofs) { - if (UNLIKELY(py_ofs->ofs == NULL)) { + if (UNLIKELY(pygpu_ofs->ofs == NULL)) { PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid"); return -1; } @@ -69,7 +69,7 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) #define BPY_GPU_OFFSCREEN_CHECK_OBJ(bpygpu) \ { \ - if (UNLIKELY(py_offscreen_valid_check(bpygpu) == -1)) { \ + if (UNLIKELY(pygpu_offscreen_valid_check(bpygpu) == -1)) { \ return NULL; \ } \ } \ @@ -81,7 +81,7 @@ static int py_offscreen_valid_check(BPyGPUOffScreen *py_ofs) /** \name GPUOffscreen Type * \{ */ -static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -112,23 +112,23 @@ static PyObject *py_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, Py return BPyGPUOffScreen_CreatePyObject(ofs); } -PyDoc_STRVAR(py_offscreen_width_doc, "Width of the texture.\n\n:type: `int`"); -static PyObject *py_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type)) +PyDoc_STRVAR(pygpu_offscreen_width_doc, "Width of the texture.\n\n:type: `int`"); +static PyObject *pygpu_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type)) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); return PyLong_FromLong(GPU_offscreen_width(self->ofs)); } -PyDoc_STRVAR(py_offscreen_height_doc, "Height of the texture.\n\n:type: `int`"); -static PyObject *py_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type)) +PyDoc_STRVAR(pygpu_offscreen_height_doc, "Height of the texture.\n\n:type: `int`"); +static PyObject *pygpu_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type)) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); return PyLong_FromLong(GPU_offscreen_height(self->ofs)); } -PyDoc_STRVAR(py_offscreen_color_texture_doc, +PyDoc_STRVAR(pygpu_offscreen_color_texture_doc, "OpenGL bindcode for the color texture.\n\n:type: `int`"); -static PyObject *py_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type)) +static PyObject *pygpu_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type)) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); GPUTexture *texture = GPU_offscreen_color_texture(self->ofs); @@ -136,7 +136,7 @@ static PyObject *py_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNU } PyDoc_STRVAR( - py_offscreen_bind_doc, + pygpu_offscreen_bind_doc, ".. method:: bind(save=True)\n" "\n" " Bind the offscreen object.\n" @@ -145,7 +145,7 @@ PyDoc_STRVAR( "\n" " :arg save: Save the current OpenGL state, so that it can be restored when unbinding.\n" " :type save: `bool`\n"); -static PyObject *py_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); bool save = true; @@ -165,7 +165,7 @@ static PyObject *py_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObje return (PyObject *)self; } -PyDoc_STRVAR(py_offscreen_unbind_doc, +PyDoc_STRVAR(pygpu_offscreen_unbind_doc, ".. method:: unbind(restore=True)\n" "\n" " Unbind the offscreen object.\n" @@ -173,7 +173,7 @@ PyDoc_STRVAR(py_offscreen_unbind_doc, " :arg restore: Restore the OpenGL state, can only be used when the state has been " "saved before.\n" " :type restore: `bool`\n"); -static PyObject *py_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { bool restore = true; @@ -191,7 +191,7 @@ static PyObject *py_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyOb } PyDoc_STRVAR( - py_offscreen_draw_view3d_doc, + pygpu_offscreen_draw_view3d_doc, ".. method:: draw_view3d(scene, view_layer, view3d, region, view_matrix, projection_matrix)\n" "\n" " Draw the 3d viewport in the offscreen object.\n" @@ -208,10 +208,10 @@ PyDoc_STRVAR( " :type view_matrix: :class:`mathutils.Matrix`\n" " :arg projection_matrix: Projection Matrix (e.g. ``camera.calc_matrix_camera(...)``).\n" " :type projection_matrix: :class:`mathutils.Matrix`\n"); -static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { - MatrixObject *py_mat_view, *py_mat_projection; - PyObject *py_scene, *py_view_layer, *py_region, *py_view3d; + MatrixObject *pygpu_mat_view, *pygpu_mat_projection; + PyObject *pygpu_scene, *pygpu_view_layer, *pygpu_region, *pygpu_view3d; struct Depsgraph *depsgraph; struct Scene *scene; @@ -228,18 +228,18 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - &py_scene, - &py_view_layer, - &py_view3d, - &py_region, + &pygpu_scene, + &pygpu_view_layer, + &pygpu_view3d, + &pygpu_region, Matrix_Parse4x4, - &py_mat_view, + &pygpu_mat_view, Matrix_Parse4x4, - &py_mat_projection) || - (!(scene = PyC_RNA_AsPointer(py_scene, "Scene")) || - !(view_layer = PyC_RNA_AsPointer(py_view_layer, "ViewLayer")) || - !(v3d = PyC_RNA_AsPointer(py_view3d, "SpaceView3D")) || - !(region = PyC_RNA_AsPointer(py_region, "Region")))) { + &pygpu_mat_projection) || + (!(scene = PyC_RNA_AsPointer(pygpu_scene, "Scene")) || + !(view_layer = PyC_RNA_AsPointer(pygpu_view_layer, "ViewLayer")) || + !(v3d = PyC_RNA_AsPointer(pygpu_view3d, "SpaceView3D")) || + !(region = PyC_RNA_AsPointer(pygpu_region, "Region")))) { return NULL; } @@ -262,8 +262,8 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, region, GPU_offscreen_width(self->ofs), GPU_offscreen_height(self->ofs), - (float(*)[4])py_mat_view->matrix, - (float(*)[4])py_mat_projection->matrix, + (float(*)[4])pygpu_mat_view->matrix, + (float(*)[4])pygpu_mat_projection->matrix, true, true, "", @@ -281,12 +281,12 @@ static PyObject *py_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, Py_RETURN_NONE; } -PyDoc_STRVAR(py_offscreen_free_doc, +PyDoc_STRVAR(pygpu_offscreen_free_doc, ".. method:: free()\n" "\n" " Free the offscreen object.\n" " The framebuffer, texture and render objects will no longer be accessible.\n"); -static PyObject *py_offscreen_free(BPyGPUOffScreen *self) +static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); @@ -295,12 +295,12 @@ static PyObject *py_offscreen_free(BPyGPUOffScreen *self) Py_RETURN_NONE; } -static PyObject *py_offscreen_bind_context_enter(BPyGPUOffScreen *UNUSED(self)) +static PyObject *pygpu_offscreen_bind_context_enter(BPyGPUOffScreen *UNUSED(self)) { Py_RETURN_NONE; } -static PyObject *py_offscreen_bind_context_exit(BPyGPUOffScreen *self, PyObject *UNUSED(args)) +static PyObject *pygpu_offscreen_bind_context_exit(BPyGPUOffScreen *self, PyObject *UNUSED(args)) { GPU_offscreen_unbind(self->ofs, self->is_saved); Py_RETURN_NONE; @@ -314,34 +314,37 @@ static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) Py_TYPE(self)->tp_free((PyObject *)self); } -static PyGetSetDef py_offscreen_getseters[] = { +static PyGetSetDef pygpu_offscreen_getseters[] = { {"color_texture", - (getter)py_offscreen_color_texture_get, + (getter)pygpu_offscreen_color_texture_get, (setter)NULL, - py_offscreen_color_texture_doc, + pygpu_offscreen_color_texture_doc, NULL}, - {"width", (getter)py_offscreen_width_get, (setter)NULL, py_offscreen_width_doc, NULL}, - {"height", (getter)py_offscreen_height_get, (setter)NULL, py_offscreen_height_doc, NULL}, + {"width", (getter)pygpu_offscreen_width_get, (setter)NULL, pygpu_offscreen_width_doc, NULL}, + {"height", (getter)pygpu_offscreen_height_get, (setter)NULL, pygpu_offscreen_height_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -static struct PyMethodDef py_offscreen_methods[] = { - {"bind", (PyCFunction)py_offscreen_bind, METH_VARARGS | METH_KEYWORDS, py_offscreen_bind_doc}, +static struct PyMethodDef pygpu_offscreen_methods[] = { + {"bind", + (PyCFunction)pygpu_offscreen_bind, + METH_VARARGS | METH_KEYWORDS, + pygpu_offscreen_bind_doc}, {"unbind", - (PyCFunction)py_offscreen_unbind, + (PyCFunction)pygpu_offscreen_unbind, METH_VARARGS | METH_KEYWORDS, - py_offscreen_unbind_doc}, + pygpu_offscreen_unbind_doc}, {"draw_view3d", - (PyCFunction)py_offscreen_draw_view3d, + (PyCFunction)pygpu_offscreen_draw_view3d, METH_VARARGS | METH_KEYWORDS, - py_offscreen_draw_view3d_doc}, - {"free", (PyCFunction)py_offscreen_free, METH_NOARGS, py_offscreen_free_doc}, - {"__enter__", (PyCFunction)py_offscreen_bind_context_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)py_offscreen_bind_context_exit, METH_VARARGS}, + pygpu_offscreen_draw_view3d_doc}, + {"free", (PyCFunction)pygpu_offscreen_free, METH_NOARGS, pygpu_offscreen_free_doc}, + {"__enter__", (PyCFunction)pygpu_offscreen_bind_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_offscreen_bind_context_exit, METH_VARARGS}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_offscreen_doc, +PyDoc_STRVAR(pygpu_offscreen_doc, ".. class:: GPUOffScreen(width, height)\n" "\n" " This object gives access to off screen buffers.\n" @@ -355,10 +358,10 @@ PyTypeObject BPyGPUOffScreen_Type = { .tp_basicsize = sizeof(BPyGPUOffScreen), .tp_dealloc = (destructor)BPyGPUOffScreen__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_offscreen_doc, - .tp_methods = py_offscreen_methods, - .tp_getset = py_offscreen_getseters, - .tp_new = py_offscreen_new, + .tp_doc = pygpu_offscreen_doc, + .tp_methods = pygpu_offscreen_methods, + .tp_getset = pygpu_offscreen_getseters, + .tp_new = pygpu_offscreen_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_select.c b/source/blender/python/gpu/gpu_py_select.c index e92ef9f7504..b72aca6a792 100644 --- a/source/blender/python/gpu/gpu_py_select.c +++ b/source/blender/python/gpu/gpu_py_select.c @@ -40,14 +40,14 @@ /** \name Methods * \{ */ -PyDoc_STRVAR(py_select_load_id_doc, +PyDoc_STRVAR(pygpu_select_load_id_doc, ".. function:: load_id(id)\n" "\n" " Set the selection ID.\n" "\n" " :param id: Number (32-bit uint).\n" " :type select: int\n"); -static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value) +static PyObject *pygpu_select_load_id(PyObject *UNUSED(self), PyObject *value) { uint id; if ((id = PyC_Long_AsU32(value)) == (uint)-1) { @@ -62,25 +62,25 @@ static PyObject *py_select_load_id(PyObject *UNUSED(self), PyObject *value) /** \name Module * \{ */ -static struct PyMethodDef py_select_methods[] = { +static struct PyMethodDef pygpu_select__tp_methods[] = { /* Manage Stack */ - {"load_id", (PyCFunction)py_select_load_id, METH_O, py_select_load_id_doc}, + {"load_id", (PyCFunction)pygpu_select_load_id, METH_O, pygpu_select_load_id_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_select_doc, "This module provides access to selection."); -static PyModuleDef py_select_module_def = { +PyDoc_STRVAR(pygpu_select__tp_doc, "This module provides access to selection."); +static PyModuleDef pygpu_select_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.select", - .m_doc = py_select_doc, - .m_methods = py_select_methods, + .m_doc = pygpu_select__tp_doc, + .m_methods = pygpu_select__tp_methods, }; PyObject *bpygpu_select_init(void) { PyObject *submodule; - submodule = PyModule_Create(&py_select_module_def); + submodule = PyModule_Create(&pygpu_select_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index e5ffbd5e9e3..ddc3ccd9827 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -32,14 +32,15 @@ #include "../mathutils/mathutils.h" #include "gpu_py_api.h" -#include "gpu_py_shader.h" /* own include */ #include "gpu_py_vertex_format.h" +#include "gpu_py_shader.h" /* own include */ + /* -------------------------------------------------------------------- */ /** \name Enum Conversion. * \{ */ -static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = { +static const struct PyC_StringEnumItems pygpu_shader_builtin_items[] = { {GPU_SHADER_2D_UNIFORM_COLOR, "2D_UNIFORM_COLOR"}, {GPU_SHADER_2D_FLAT_COLOR, "2D_FLAT_COLOR"}, {GPU_SHADER_2D_SMOOTH_COLOR, "2D_SMOOTH_COLOR"}, @@ -51,7 +52,9 @@ static const struct PyC_StringEnumItems pygpu_bultinshader_items[] = { {0, NULL}, }; -static int py_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix) +static int pygpu_shader_uniform_location_get(GPUShader *shader, + const char *name, + const char *error_prefix) { const int uniform = GPU_shader_get_uniform(shader, name); @@ -68,7 +71,7 @@ static int py_uniform_location_get(GPUShader *shader, const char *name, const ch /** \name Shader Type * \{ */ -static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_shader__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -107,17 +110,17 @@ static PyObject *py_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObj } PyDoc_STRVAR( - py_shader_bind_doc, + pygpu_shader_bind_doc, ".. method:: bind()\n" "\n" " Bind the shader object. Required to be able to change uniforms of this shader.\n"); -static PyObject *py_shader_bind(BPyGPUShader *self) +static PyObject *pygpu_shader_bind(BPyGPUShader *self) { GPU_shader_bind(self->shader); Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_from_name_doc, +PyDoc_STRVAR(pygpu_shader_uniform_from_name_doc, ".. method:: uniform_from_name(name)\n" "\n" " Get uniform location by name.\n" @@ -126,14 +129,15 @@ PyDoc_STRVAR(py_shader_uniform_from_name_doc, " :type name: `str`\n" " :return: Location of the uniform variable.\n" " :rtype: `int`\n"); -static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { return NULL; } - const int uniform = py_uniform_location_get(self->shader, name, "GPUShader.get_uniform"); + const int uniform = pygpu_shader_uniform_location_get( + self->shader, name, "GPUShader.get_uniform"); if (uniform == -1) { return NULL; @@ -143,7 +147,7 @@ static PyObject *py_shader_uniform_from_name(BPyGPUShader *self, PyObject *arg) } PyDoc_STRVAR( - py_shader_uniform_block_from_name_doc, + pygpu_shader_uniform_block_from_name_doc, ".. method:: uniform_block_from_name(name)\n" "\n" " Get uniform block location by name.\n" @@ -152,7 +156,7 @@ PyDoc_STRVAR( " :type name: `str`\n" " :return: The location of the uniform block variable.\n" " :rtype: `int`\n"); -static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_uniform_block_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { @@ -169,12 +173,12 @@ static PyObject *py_shader_uniform_block_from_name(BPyGPUShader *self, PyObject return PyLong_FromLong(uniform); } -static bool py_shader_uniform_vector_impl(PyObject *args, - int elem_size, - int *r_location, - int *r_length, - int *r_count, - Py_buffer *r_pybuffer) +static bool pygpu_shader_uniform_vector_impl(PyObject *args, + int elem_size, + int *r_location, + int *r_length, + int *r_count, + Py_buffer *r_pybuffer) { PyObject *buffer; @@ -197,7 +201,7 @@ static bool py_shader_uniform_vector_impl(PyObject *args, return true; } -PyDoc_STRVAR(py_shader_uniform_vector_float_doc, +PyDoc_STRVAR(pygpu_shader_uniform_vector_float_doc, ".. method:: uniform_vector_float(location, buffer, length, count)\n" "\n" " Set the buffer to fill the uniform.\n" @@ -217,13 +221,14 @@ PyDoc_STRVAR(py_shader_uniform_vector_float_doc, " :param count: Specifies the number of elements, vector or matrices that are to " "be modified.\n" " :type count: int\n"); -static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_vector_float(BPyGPUShader *self, PyObject *args) { int location, length, count; Py_buffer pybuffer; - if (!py_shader_uniform_vector_impl(args, sizeof(float), &location, &length, &count, &pybuffer)) { + if (!pygpu_shader_uniform_vector_impl( + args, sizeof(float), &location, &length, &count, &pybuffer)) { return NULL; } @@ -234,17 +239,18 @@ static PyObject *py_shader_uniform_vector_float(BPyGPUShader *self, PyObject *ar Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_vector_int_doc, +PyDoc_STRVAR(pygpu_shader_uniform_vector_int_doc, ".. method:: uniform_vector_int(location, buffer, length, count)\n" "\n" " See GPUShader.uniform_vector_float(...) description.\n"); -static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args) { int location, length, count; Py_buffer pybuffer; - if (!py_shader_uniform_vector_impl(args, sizeof(int), &location, &length, &count, &pybuffer)) { + if (!pygpu_shader_uniform_vector_impl( + args, sizeof(int), &location, &length, &count, &pybuffer)) { return NULL; } @@ -255,7 +261,7 @@ static PyObject *py_shader_uniform_vector_int(BPyGPUShader *self, PyObject *args Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_bool_doc, +PyDoc_STRVAR(pygpu_shader_uniform_bool_doc, ".. method:: uniform_bool(name, seq)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -264,7 +270,7 @@ PyDoc_STRVAR(py_shader_uniform_bool_doc, " :type name: str\n" " :param seq: Value that will be used to update the specified uniform variable.\n" " :type seq: sequence of bools\n"); -static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_bool(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_bool"; @@ -308,7 +314,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -319,7 +325,7 @@ static PyObject *py_shader_uniform_bool(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_float_doc, +PyDoc_STRVAR(pygpu_shader_uniform_float_doc, ".. method:: uniform_float(name, value)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -328,7 +334,7 @@ PyDoc_STRVAR(py_shader_uniform_float_doc, " :type name: str\n" " :param value: Value that will be used to update the specified uniform variable.\n" " :type value: single number or sequence of numbers\n"); -static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_float(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_float"; @@ -377,7 +383,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -388,7 +394,7 @@ static PyObject *py_shader_uniform_float(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_uniform_int_doc, +PyDoc_STRVAR(pygpu_shader_uniform_int_doc, ".. method:: uniform_int(name, seq)\n" "\n" " Specify the value of a uniform variable for the current program object.\n" @@ -397,7 +403,7 @@ PyDoc_STRVAR(py_shader_uniform_int_doc, " :type name: str\n" " :param seq: Value that will be used to update the specified uniform variable.\n" " :type seq: sequence of numbers\n"); -static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_int(BPyGPUShader *self, PyObject *args) { const char *error_prefix = "GPUShader.uniform_int"; @@ -447,7 +453,7 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) return NULL; } - const int location = py_uniform_location_get(self->shader, params.id, error_prefix); + const int location = pygpu_shader_uniform_location_get(self->shader, params.id, error_prefix); if (location == -1) { return NULL; @@ -459,7 +465,7 @@ static PyObject *py_shader_uniform_int(BPyGPUShader *self, PyObject *args) } PyDoc_STRVAR( - py_shader_attr_from_name_doc, + pygpu_shader_attr_from_name_doc, ".. method:: attr_from_name(name)\n" "\n" " Get attribute location by name.\n" @@ -468,7 +474,7 @@ PyDoc_STRVAR( " :type name: str\n" " :return: The location of an attribute variable.\n" " :rtype: int\n"); -static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) +static PyObject *pygpu_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) { const char *name = PyUnicode_AsUTF8(arg); if (name == NULL) { @@ -485,69 +491,75 @@ static PyObject *py_shader_attr_from_name(BPyGPUShader *self, PyObject *arg) return PyLong_FromLong(attr); } -PyDoc_STRVAR(py_shader_calc_format_doc, +PyDoc_STRVAR(pygpu_shader_calc_format_doc, ".. method:: calc_format()\n" "\n" " Build a new format based on the attributes of the shader.\n" "\n" " :return: vertex attribute format for the shader\n" " :rtype: GPUVertFormat\n"); -static PyObject *py_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg)) +static PyObject *pygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg)) { BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL); GPU_vertformat_from_shader(&ret->fmt, self->shader); return (PyObject *)ret; } -static struct PyMethodDef py_shader_methods[] = { - {"bind", (PyCFunction)py_shader_bind, METH_NOARGS, py_shader_bind_doc}, +static struct PyMethodDef pygpu_shader__tp_methods[] = { + {"bind", (PyCFunction)pygpu_shader_bind, METH_NOARGS, pygpu_shader_bind_doc}, {"uniform_from_name", - (PyCFunction)py_shader_uniform_from_name, + (PyCFunction)pygpu_shader_uniform_from_name, METH_O, - py_shader_uniform_from_name_doc}, + pygpu_shader_uniform_from_name_doc}, {"uniform_block_from_name", - (PyCFunction)py_shader_uniform_block_from_name, + (PyCFunction)pygpu_shader_uniform_block_from_name, METH_O, - py_shader_uniform_block_from_name_doc}, + pygpu_shader_uniform_block_from_name_doc}, {"uniform_vector_float", - (PyCFunction)py_shader_uniform_vector_float, + (PyCFunction)pygpu_shader_uniform_vector_float, METH_VARARGS, - py_shader_uniform_vector_float_doc}, + pygpu_shader_uniform_vector_float_doc}, {"uniform_vector_int", - (PyCFunction)py_shader_uniform_vector_int, + (PyCFunction)pygpu_shader_uniform_vector_int, METH_VARARGS, - py_shader_uniform_vector_int_doc}, + pygpu_shader_uniform_vector_int_doc}, {"uniform_bool", - (PyCFunction)py_shader_uniform_bool, + (PyCFunction)pygpu_shader_uniform_bool, METH_VARARGS, - py_shader_uniform_bool_doc}, + pygpu_shader_uniform_bool_doc}, {"uniform_float", - (PyCFunction)py_shader_uniform_float, + (PyCFunction)pygpu_shader_uniform_float, METH_VARARGS, - py_shader_uniform_float_doc}, - {"uniform_int", (PyCFunction)py_shader_uniform_int, METH_VARARGS, py_shader_uniform_int_doc}, + pygpu_shader_uniform_float_doc}, + {"uniform_int", + (PyCFunction)pygpu_shader_uniform_int, + METH_VARARGS, + pygpu_shader_uniform_int_doc}, {"attr_from_name", - (PyCFunction)py_shader_attr_from_name, + (PyCFunction)pygpu_shader_attr_from_name, METH_O, - py_shader_attr_from_name_doc}, - {"format_calc", (PyCFunction)py_shader_calc_format, METH_NOARGS, py_shader_calc_format_doc}, + pygpu_shader_attr_from_name_doc}, + {"format_calc", + (PyCFunction)pygpu_shader_calc_format, + METH_NOARGS, + pygpu_shader_calc_format_doc}, {NULL, NULL, 0, NULL}, }; PyDoc_STRVAR( - py_shader_program_doc, + pygpu_shader_program_doc, "The name of the program object for use by the OpenGL API (read-only).\n\n:type: int"); -static PyObject *py_shader_program_get(BPyGPUShader *self, void *UNUSED(closure)) +static PyObject *pygpu_shader_program_get(BPyGPUShader *self, void *UNUSED(closure)) { return PyLong_FromLong(GPU_shader_get_program(self->shader)); } -static PyGetSetDef py_shader_getseters[] = { - {"program", (getter)py_shader_program_get, (setter)NULL, py_shader_program_doc, NULL}, +static PyGetSetDef pygpu_shader__tp_getseters[] = { + {"program", (getter)pygpu_shader_program_get, (setter)NULL, pygpu_shader_program_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -static void py_shader_dealloc(BPyGPUShader *self) +static void pygpu_shader__tp_dealloc(BPyGPUShader *self) { if (self->is_builtin == false) { GPU_shader_free(self->shader); @@ -556,7 +568,7 @@ static void py_shader_dealloc(BPyGPUShader *self) } PyDoc_STRVAR( - py_shader_doc, + pygpu_shader__tp_doc, ".. class:: GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None)\n" "\n" " GPUShader combines multiple GLSL shaders into a program used for drawing.\n" @@ -587,12 +599,12 @@ PyDoc_STRVAR( PyTypeObject BPyGPUShader_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUShader", .tp_basicsize = sizeof(BPyGPUShader), - .tp_dealloc = (destructor)py_shader_dealloc, + .tp_dealloc = (destructor)pygpu_shader__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_shader_doc, - .tp_methods = py_shader_methods, - .tp_getset = py_shader_getseters, - .tp_new = py_shader_new, + .tp_doc = pygpu_shader__tp_doc, + .tp_methods = pygpu_shader__tp_methods, + .tp_getset = pygpu_shader__tp_getseters, + .tp_new = pygpu_shader__tp_new, }; /** \} */ @@ -601,18 +613,18 @@ PyTypeObject BPyGPUShader_Type = { /** \name gpu.shader Module API * \{ */ -PyDoc_STRVAR(py_shader_unbind_doc, +PyDoc_STRVAR(pygpu_shader_unbind_doc, ".. function:: unbind()\n" "\n" " Unbind the bound shader object.\n"); -static PyObject *py_shader_unbind(BPyGPUShader *UNUSED(self)) +static PyObject *pygpu_shader_unbind(BPyGPUShader *UNUSED(self)) { GPU_shader_unbind(); Py_RETURN_NONE; } -PyDoc_STRVAR(py_shader_from_builtin_doc, - ".. function:: from_builtin(shader_name)\n" +PyDoc_STRVAR(pygpu_shader_from_builtin_doc, + ".. function:: from_builtin(pygpu_shader_name)\n" "\n" " Shaders that are embedded in the blender internal code.\n" " They all read the uniform ``mat4 ModelViewProjectionMatrix``,\n" @@ -620,7 +632,7 @@ PyDoc_STRVAR(py_shader_from_builtin_doc, " For more details, you can check the shader code with the\n" " :func:`gpu.shader.code_from_builtin` function.\n" "\n" - " :param shader_name: One of these builtin shader names:\n\n" + " :param pygpu_shader_name: One of these builtin shader names:\n\n" " - ``2D_UNIFORM_COLOR``\n" " - ``2D_FLAT_COLOR``\n" " - ``2D_SMOOTH_COLOR``\n" @@ -628,14 +640,14 @@ PyDoc_STRVAR(py_shader_from_builtin_doc, " - ``3D_UNIFORM_COLOR``\n" " - ``3D_FLAT_COLOR``\n" " - ``3D_SMOOTH_COLOR``\n" - " :type shader_name: str\n" + " :type pygpu_shader_name: str\n" " :return: Shader object corresponding to the given name.\n" " :rtype: :class:`bpy.types.GPUShader`\n"); -static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) +static PyObject *pygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) { BPYGPU_IS_INIT_OR_ERROR_OBJ; - struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items}; + struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items}; if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) { return NULL; } @@ -645,12 +657,12 @@ static PyObject *py_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) return BPyGPUShader_CreatePyObject(shader, true); } -PyDoc_STRVAR(py_shader_code_from_builtin_doc, - ".. function:: code_from_builtin(shader_name)\n" +PyDoc_STRVAR(pygpu_shader_code_from_builtin_doc, + ".. function:: code_from_builtin(pygpu_shader_name)\n" "\n" " Exposes the internal shader code for query.\n" "\n" - " :param shader_name: One of these builtin shader names:\n\n" + " :param pygpu_shader_name: One of these builtin shader names:\n\n" " - ``2D_UNIFORM_COLOR``\n" " - ``2D_FLAT_COLOR``\n" " - ``2D_SMOOTH_COLOR``\n" @@ -658,10 +670,10 @@ PyDoc_STRVAR(py_shader_code_from_builtin_doc, " - ``3D_UNIFORM_COLOR``\n" " - ``3D_FLAT_COLOR``\n" " - ``3D_SMOOTH_COLOR``\n" - " :type shader_name: str\n" + " :type pygpu_shader_name: str\n" " :return: Vertex, fragment and geometry shader codes.\n" " :rtype: dict\n"); -static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg) +static PyObject *pygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg) { const char *vert; const char *frag; @@ -670,7 +682,7 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec PyObject *item, *r_dict; - struct PyC_StringEnum pygpu_bultinshader = {pygpu_bultinshader_items}; + struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items}; if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) { return NULL; } @@ -697,17 +709,20 @@ static PyObject *py_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObjec return r_dict; } -static struct PyMethodDef py_shader_module_methods[] = { - {"unbind", (PyCFunction)py_shader_unbind, METH_NOARGS, py_shader_unbind_doc}, - {"from_builtin", (PyCFunction)py_shader_from_builtin, METH_O, py_shader_from_builtin_doc}, - {"code_from_builtin", - (PyCFunction)py_shader_code_from_builtin, +static struct PyMethodDef pygpu_shader_module__tp_methods[] = { + {"unbind", (PyCFunction)pygpu_shader_unbind, METH_NOARGS, pygpu_shader_unbind_doc}, + {"from_builtin", + (PyCFunction)pygpu_shader_from_builtin, METH_O, - py_shader_code_from_builtin_doc}, + pygpu_shader_from_builtin_doc}, + {"code_from_builtin", + (PyCFunction)pygpu_shader_code_from_builtin, + METH_O, + pygpu_shader_code_from_builtin_doc}, {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(py_shader_module_doc, +PyDoc_STRVAR(pygpu_shader_module__tp_doc, "This module provides access to GPUShader internal functions.\n" "\n" ".. rubric:: Built-in shaders\n" @@ -736,11 +751,11 @@ PyDoc_STRVAR(py_shader_module_doc, "3D_SMOOTH_COLOR\n" " :Attributes: vec3 pos, vec4 color\n" " :Uniforms: none\n"); -static PyModuleDef py_shader_module_def = { +static PyModuleDef pygpu_shader_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.shader", - .m_doc = py_shader_module_doc, - .m_methods = py_shader_module_methods, + .m_doc = pygpu_shader_module__tp_doc, + .m_methods = pygpu_shader_module__tp_methods, }; /** \} */ @@ -764,7 +779,7 @@ PyObject *bpygpu_shader_init(void) { PyObject *submodule; - submodule = PyModule_Create(&py_shader_module_def); + submodule = PyModule_Create(&pygpu_shader_module_def); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c index f0208d3993e..5829cd8c088 100644 --- a/source/blender/python/gpu/gpu_py_types.c +++ b/source/blender/python/gpu/gpu_py_types.c @@ -32,7 +32,7 @@ /** \name GPU Types Module * \{ */ -static struct PyModuleDef py_types_module_def = { +static struct PyModuleDef pygpu_types_module_def = { PyModuleDef_HEAD_INIT, .m_name = "gpu.types", }; @@ -41,7 +41,7 @@ PyObject *bpygpu_types_init(void) { PyObject *submodule; - submodule = PyModule_Create(&py_types_module_def); + submodule = PyModule_Create(&pygpu_types_module_def); if (PyType_Ready(&BPyGPUVertFormat_Type) < 0) { return NULL; diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c index 8e19eac76d0..160931393ed 100644 --- a/source/blender/python/gpu/gpu_py_vertex_buffer.c +++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c @@ -39,7 +39,7 @@ /** \name Utility Functions * \{ */ -#define PY_AS_NATIVE_SWITCH(attr) \ +#define PYGPU_AS_NATIVE_SWITCH(attr) \ switch (attr->comp_type) { \ case GPU_COMP_I8: { \ PY_AS_NATIVE(int8_t, PyC_Long_AsI8); \ @@ -75,7 +75,7 @@ ((void)0) /* No error checking, callers must run PyErr_Occurred */ -static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr) +static void pygpu_fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr) { #define PY_AS_NATIVE(ty_dst, py_as_native) \ { \ @@ -84,13 +84,13 @@ static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVer } \ ((void)0) - PY_AS_NATIVE_SWITCH(attr); + PYGPU_AS_NATIVE_SWITCH(attr); #undef PY_AS_NATIVE } /* No error checking, callers must run PyErr_Occurred */ -static void fill_format_sequence(void *data_dst_void, +static void pygpu_fill_format_sequence(void *data_dst_void, PyObject *py_seq_fast, const GPUVertAttr *attr) { @@ -107,19 +107,19 @@ static void fill_format_sequence(void *data_dst_void, } \ ((void)0) - PY_AS_NATIVE_SWITCH(attr); + PYGPU_AS_NATIVE_SWITCH(attr); #undef PY_AS_NATIVE } -#undef PY_AS_NATIVE_SWITCH +#undef PYGPU_AS_NATIVE_SWITCH #undef WARN_TYPE_LIMIT_PUSH #undef WARN_TYPE_LIMIT_POP -static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, - uint data_id, - PyObject *seq, - const char *error_prefix) +static bool pygpu_vertbuf_fill_impl(GPUVertBuf *vbo, + uint data_id, + PyObject *seq, + const char *error_prefix) { const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u"; @@ -173,7 +173,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, for (uint i = 0; i < seq_len; i++) { uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step); PyObject *item = seq_items[i]; - fill_format_elem(data, item, attr); + pygpu_fill_format_elem(data, item, attr); } } else { @@ -197,7 +197,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, } /* May trigger error, check below */ - fill_format_sequence(data, seq_fast_item, attr); + pygpu_fill_format_sequence(data, seq_fast_item, attr); Py_DECREF(seq_fast_item); } } @@ -213,7 +213,7 @@ static bool py_vertbuf_fill_impl(GPUVertBuf *vbo, return ok; } -static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix) +static int pygpu_vertbuf_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix) { if (id < 0 || id >= GPU_vertbuf_get_format(buf)->attr_len) { PyErr_Format(PyExc_ValueError, "Format id %d out of range", id); @@ -225,7 +225,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch return 0; } - if (!py_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) { + if (!pygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) { return 0; } @@ -238,7 +238,7 @@ static int py_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const ch /** \name VertBuf Type * \{ */ -static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertbuf__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { struct { PyObject *py_fmt; @@ -260,7 +260,7 @@ static PyObject *py_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyOb return BPyGPUVertBuf_CreatePyObject(vbo); } -PyDoc_STRVAR(py_VertBuf_attr_fill_doc, +PyDoc_STRVAR(pygpu_vertbuf_attr_fill_doc, ".. method:: attr_fill(id, data)\n" "\n" " Insert data into the buffer for a single attribute.\n" @@ -269,7 +269,7 @@ PyDoc_STRVAR(py_VertBuf_attr_fill_doc, " :type id: int or str\n" " :param data: Sequence of data that should be stored in the buffer\n" " :type data: sequence of values or tuples\n"); -static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertbuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds) { PyObject *data; PyObject *identifier; @@ -299,28 +299,28 @@ static PyObject *py_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObj return NULL; } - if (!py_attr_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) { + if (!pygpu_vertbuf_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) { return NULL; } Py_RETURN_NONE; } -static struct PyMethodDef py_VertBuf_methods[] = { +static struct PyMethodDef pygpu_vertbuf__tp_methods[] = { {"attr_fill", - (PyCFunction)py_VertBuf_attr_fill, + (PyCFunction)pygpu_vertbuf_attr_fill, METH_VARARGS | METH_KEYWORDS, - py_VertBuf_attr_fill_doc}, + pygpu_vertbuf_attr_fill_doc}, {NULL, NULL, 0, NULL}, }; -static void py_VertBuf_dealloc(BPyGPUVertBuf *self) +static void pygpu_vertbuf__tp_dealloc(BPyGPUVertBuf *self) { GPU_vertbuf_discard(self->buf); Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_gpu_vertex_buffer_doc, +PyDoc_STRVAR(pygpu_vertbuf__tp_doc, ".. class:: GPUVertBuf(len, format)\n" "\n" " Contains a VBO.\n" @@ -332,11 +332,11 @@ PyDoc_STRVAR(py_gpu_vertex_buffer_doc, PyTypeObject BPyGPUVertBuf_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertBuf", .tp_basicsize = sizeof(BPyGPUVertBuf), - .tp_dealloc = (destructor)py_VertBuf_dealloc, + .tp_dealloc = (destructor)pygpu_vertbuf__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_gpu_vertex_buffer_doc, - .tp_methods = py_VertBuf_methods, - .tp_new = py_VertBuf_new, + .tp_doc = pygpu_vertbuf__tp_doc, + .tp_methods = pygpu_vertbuf__tp_methods, + .tp_new = pygpu_vertbuf__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c index 52e1a720f97..67f612f8ba3 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.c +++ b/source/blender/python/gpu/gpu_py_vertex_format.c @@ -50,7 +50,7 @@ * Use with PyArg_ParseTuple's "O&" formatting. * \{ */ -static int py_parse_component_type(const char *str, int length) +static int pygpu_vertformat_parse_component_type(const char *str, int length) { if (length == 2) { switch (*((ushort *)str)) { @@ -83,7 +83,7 @@ static int py_parse_component_type(const char *str, int length) return -1; } -static int py_parse_fetch_mode(const char *str, int length) +static int pygpu_vertformat_parse_fetch_mode(const char *str, int length) { #define MATCH_ID(id) \ if (length == strlen(STRINGIFY(id))) { \ @@ -102,7 +102,7 @@ static int py_parse_fetch_mode(const char *str, int length) return -1; } -static int py_ParseVertCompType(PyObject *o, void *p) +static int pygpu_ParseVertCompType(PyObject *o, void *p) { Py_ssize_t length; const char *str = PyUnicode_AsUTF8AndSize(o, &length); @@ -112,7 +112,7 @@ static int py_ParseVertCompType(PyObject *o, void *p) return 0; } - const int comp_type = py_parse_component_type(str, length); + const int comp_type = pygpu_vertformat_parse_component_type(str, length); if (comp_type == -1) { PyErr_Format(PyExc_ValueError, "unknown component type: '%s", str); return 0; @@ -122,7 +122,7 @@ static int py_ParseVertCompType(PyObject *o, void *p) return 1; } -static int py_ParseVertFetchMode(PyObject *o, void *p) +static int pygpu_ParseVertFetchMode(PyObject *o, void *p) { Py_ssize_t length; const char *str = PyUnicode_AsUTF8AndSize(o, &length); @@ -132,7 +132,7 @@ static int py_ParseVertFetchMode(PyObject *o, void *p) return 0; } - const int fetch_mode = py_parse_fetch_mode(str, length); + const int fetch_mode = pygpu_vertformat_parse_fetch_mode(str, length); if (fetch_mode == -1) { PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", str); return 0; @@ -148,7 +148,9 @@ static int py_ParseVertFetchMode(PyObject *o, void *p) /** \name VertFormat Type * \{ */ -static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertformat__tp_new(PyTypeObject *UNUSED(type), + PyObject *args, + PyObject *kwds) { if (PyTuple_GET_SIZE(args) || (kwds && PyDict_Size(kwds))) { PyErr_SetString(PyExc_ValueError, "This function takes no arguments"); @@ -158,7 +160,7 @@ static PyObject *py_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, P } PyDoc_STRVAR( - py_VertFormat_attr_add_doc, + pygpu_vertformat_attr_add_doc, ".. method:: attr_add(id, comp_type, len, fetch_mode)\n" "\n" " Add a new attribute to the format.\n" @@ -177,7 +179,7 @@ PyDoc_STRVAR( " converted to a normal 4 byte float when used.\n" " Possible values are `FLOAT`, `INT`, `INT_TO_FLOAT_UNIT` and `INT_TO_FLOAT`.\n" " :type fetch_mode: `str`\n"); -static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds) +static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds) { struct { const char *id; @@ -197,10 +199,10 @@ static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, kwds, &_parser, ¶ms.id, - py_ParseVertCompType, + pygpu_ParseVertCompType, ¶ms.comp_type, ¶ms.len, - py_ParseVertFetchMode, + pygpu_ParseVertFetchMode, ¶ms.fetch_mode)) { return NULL; } @@ -210,31 +212,31 @@ static PyObject *py_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, return PyLong_FromLong(attr_id); } -static struct PyMethodDef py_VertFormat_methods[] = { +static struct PyMethodDef pygpu_vertformat__tp_methods[] = { {"attr_add", - (PyCFunction)py_VertFormat_attr_add, + (PyCFunction)pygpu_vertformat_attr_add, METH_VARARGS | METH_KEYWORDS, - py_VertFormat_attr_add_doc}, + pygpu_vertformat_attr_add_doc}, {NULL, NULL, 0, NULL}, }; -static void py_VertFormat_dealloc(BPyGPUVertFormat *self) +static void pygpu_vertformat__tp_dealloc(BPyGPUVertFormat *self) { Py_TYPE(self)->tp_free(self); } -PyDoc_STRVAR(py_VertFormat_doc, +PyDoc_STRVAR(pygpu_vertformat__tp_doc, ".. class:: GPUVertFormat()\n" "\n" " This object contains information about the structure of a vertex buffer.\n"); PyTypeObject BPyGPUVertFormat_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUVertFormat", .tp_basicsize = sizeof(BPyGPUVertFormat), - .tp_dealloc = (destructor)py_VertFormat_dealloc, + .tp_dealloc = (destructor)pygpu_vertformat__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = py_VertFormat_doc, - .tp_methods = py_VertFormat_methods, - .tp_new = py_VertFormat_new, + .tp_doc = pygpu_vertformat__tp_doc, + .tp_methods = pygpu_vertformat__tp_methods, + .tp_new = pygpu_vertformat__tp_new, }; /** \} */ From 2217719feb250458bef461d405985e79d3c72a14 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 16 Feb 2021 20:45:19 +0100 Subject: [PATCH 237/519] Fix T85440: crash with displacement shaders and updating geometry in viewport When primitive offsets change we need to rebuild or refit BVHs, however this was also tagging other data as modified too late in the geometry update process. Now ensure only the BVHs are updated. Ref D10441 --- intern/cycles/render/geometry.cpp | 9 +++++++-- intern/cycles/render/geometry.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index 6fc217f2d76..74907292943 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -61,6 +61,7 @@ Geometry::Geometry(const NodeType *node_type, const Type type) : Node(node_type), geometry_type(type), attributes(this, ATTR_PRIM_GEOMETRY) { need_update_rebuild = false; + need_update_bvh_for_offset = false; transform_applied = false; transform_negative_scaled = false; @@ -242,6 +243,7 @@ void Geometry::compute_bvh( clear_modified(); need_update_rebuild = false; + need_update_bvh_for_offset = false; } bool Geometry::has_motion_blur() const @@ -944,7 +946,8 @@ void GeometryManager::mesh_calc_offset(Scene *scene, BVHLayout bvh_layout) const bool has_optix_bvh = bvh_layout == BVH_LAYOUT_OPTIX || bvh_layout == BVH_LAYOUT_MULTI_OPTIX || bvh_layout == BVH_LAYOUT_MULTI_OPTIX_EMBREE; - geom->tag_bvh_update(has_optix_bvh); + geom->need_update_rebuild |= has_optix_bvh; + geom->need_update_bvh_for_offset = true; } if (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) { @@ -1590,7 +1593,9 @@ void GeometryManager::device_update(Device *device, displacement_done = true; } } + } + if (geom->is_modified() || geom->need_update_bvh_for_offset) { if (geom->need_build_bvh(bvh_layout)) { num_bvh++; } @@ -1632,7 +1637,7 @@ void GeometryManager::device_update(Device *device, size_t i = 0; foreach (Geometry *geom, scene->geometry) { - if (geom->is_modified()) { + if (geom->is_modified() || geom->need_update_bvh_for_offset) { pool.push(function_bind( &Geometry::compute_bvh, geom, device, dscene, &scene->params, &progress, i, num_bvh)); if (geom->need_build_bvh(bvh_layout)) { diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h index b124e950ad2..0e7c839d3d9 100644 --- a/intern/cycles/render/geometry.h +++ b/intern/cycles/render/geometry.h @@ -90,6 +90,7 @@ class Geometry : public Node { /* Update Flags */ bool need_update_rebuild; + bool need_update_bvh_for_offset; /* Index into scene->geometry (only valid during update) */ size_t index; From 8bca03056cac5a4d24e6aa1cf05448d372cf01d9 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 14:55:23 +0100 Subject: [PATCH 238/519] Cleanup: Make ChunkOrder a struct. --- .../compositor/intern/COM_ChunkOrder.cpp | 24 +++++----- .../compositor/intern/COM_ChunkOrder.h | 45 +++++++------------ .../compositor/intern/COM_ExecutionGroup.cpp | 20 ++++----- 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp index 7c9e5013c5d..91437aff9e0 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp @@ -21,27 +21,27 @@ ChunkOrder::ChunkOrder() { - this->m_distance = 0.0; - this->m_number = 0; - this->m_x = 0; - this->m_y = 0; + distance = 0.0; + number = 0; + x = 0; + y = 0; } -void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots) +void ChunkOrder::update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots) { unsigned int index; - double distance = FLT_MAX; - for (index = 0; index < numberOfHotspots; index++) { + double new_distance = FLT_MAX; + for (index = 0; index < len_hotspots; index++) { ChunkOrderHotspot *hotspot = hotspots[index]; - double ndistance = hotspot->determineDistance(this->m_x, this->m_y); - if (ndistance < distance) { - distance = ndistance; + double ndistance = hotspot->determineDistance(x, y); + if (ndistance < new_distance) { + new_distance = ndistance; } } - this->m_distance = distance; + this->distance = new_distance; } bool operator<(const ChunkOrder &a, const ChunkOrder &b) { - return a.m_distance < b.m_distance; + return a.distance < b.distance; } diff --git a/source/blender/compositor/intern/COM_ChunkOrder.h b/source/blender/compositor/intern/COM_ChunkOrder.h index 32d8c07de83..993622b346c 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.h +++ b/source/blender/compositor/intern/COM_ChunkOrder.h @@ -18,37 +18,24 @@ #pragma once -#include "COM_ChunkOrderHotspot.h" -class ChunkOrder { - private: - unsigned int m_number; - int m_x; - int m_y; - double m_distance; +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +#include "COM_ChunkOrderHotspot.h" +struct ChunkOrder { + unsigned int number; + int x; + int y; + double distance; - public: ChunkOrder(); - void determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots); + friend bool operator<(const ChunkOrder &a, const ChunkOrder &b); - void setChunkNumber(unsigned int chunknumber) - { - this->m_number = chunknumber; - } - void setX(int x) - { - this->m_x = x; - } - void setY(int y) - { - this->m_y = y; - } - unsigned int getChunkNumber() - { - return this->m_number; - } - double getDistance() - { - return this->m_distance; - } + void update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots); + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") +#endif }; diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index b026d2e60d9..9c21c91c370 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -251,15 +251,15 @@ void ExecutionGroup::execute(ExecutionSystem *graph) sizeof(ChunkOrder) * this->m_numberOfChunks, __func__); for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); - chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); - chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); - chunkOrders[index].determineDistance(hotspots, 1); + chunkOrders[index].number = index; + chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin; + chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin; + chunkOrders[index].update_distance(hotspots, 1); } std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks - 1]); for (index = 0; index < this->m_numberOfChunks; index++) { - chunkOrder[index] = chunkOrders[index].getChunkNumber(); + chunkOrder[index] = chunkOrders[index].number; } delete hotspots[0]; @@ -290,16 +290,16 @@ void ExecutionGroup::execute(ExecutionSystem *graph) sizeof(ChunkOrder) * this->m_numberOfChunks, __func__); for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); - chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); - chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); - chunkOrders[index].determineDistance(hotspots, 9); + chunkOrders[index].number = index; + chunkOrders[index].x = rect.xmin - this->m_viewerBorder.xmin; + chunkOrders[index].y = rect.ymin - this->m_viewerBorder.ymin; + chunkOrders[index].update_distance(hotspots, 9); } std::sort(&chunkOrders[0], &chunkOrders[this->m_numberOfChunks]); for (index = 0; index < this->m_numberOfChunks; index++) { - chunkOrder[index] = chunkOrders[index].getChunkNumber(); + chunkOrder[index] = chunkOrders[index].number; } delete hotspots[0]; From ef53859d24a9720882e3ca6c5415faefec6fb82c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:00:04 +0100 Subject: [PATCH 239/519] Cleanup: Make ChunkOrderHotspot a struct --- .../blender/compositor/intern/COM_ChunkOrder.cpp | 9 ++++----- .../compositor/intern/COM_ChunkOrderHotspot.cpp | 14 +++++++------- .../compositor/intern/COM_ChunkOrderHotspot.h | 12 ++++++------ 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp index 91437aff9e0..3baa50da487 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp @@ -29,13 +29,12 @@ ChunkOrder::ChunkOrder() void ChunkOrder::update_distance(ChunkOrderHotspot **hotspots, unsigned int len_hotspots) { - unsigned int index; double new_distance = FLT_MAX; - for (index = 0; index < len_hotspots; index++) { + for (int index = 0; index < len_hotspots; index++) { ChunkOrderHotspot *hotspot = hotspots[index]; - double ndistance = hotspot->determineDistance(x, y); - if (ndistance < new_distance) { - new_distance = ndistance; + double distance_to_hotspot = hotspot->calc_distance(x, y); + if (distance_to_hotspot < new_distance) { + new_distance = distance_to_hotspot; } } this->distance = new_distance; diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp index b111fba44b7..bbc98d086a6 100644 --- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp @@ -21,16 +21,16 @@ ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition) { - this->m_x = x; - this->m_y = y; - this->m_addition = addition; + x = x; + y = y; + addition = addition; } -double ChunkOrderHotspot::determineDistance(int x, int y) +double ChunkOrderHotspot::calc_distance(int x, int y) { - int dx = x - this->m_x; - int dy = y - this->m_y; + int dx = x - x; + int dy = y - y; double result = sqrt((double)(dx * dx + dy * dy)); - result += (double)this->m_addition; + result += (double)addition; return result; } diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h index afacf5fc672..af0cf897673 100644 --- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h @@ -22,15 +22,15 @@ # include "MEM_guardedalloc.h" #endif -class ChunkOrderHotspot { - private: - int m_x; - int m_y; - float m_addition; +struct ChunkOrderHotspot { + int x; + int y; + float addition; public: ChunkOrderHotspot(int x, int y, float addition); - double determineDistance(int x, int y); + + double calc_distance(int x, int y); #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") From 6afc04f2a016eb6b20a6d31ebf1068c25a60768d Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:10:23 +0100 Subject: [PATCH 240/519] Cleanup: Allocate Execution System on stack. --- source/blender/compositor/intern/COM_compositor.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index bccdd026ead..d0f8edaaede 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -87,10 +87,9 @@ void COM_execute(RenderData *rd, bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; /* initialize execution system */ if (twopass) { - ExecutionSystem *system = new ExecutionSystem( - rd, scene, editingtree, rendering, twopass, viewSettings, displaySettings, viewName); - system->execute(); - delete system; + ExecutionSystem fast_pass( + rd, scene, editingtree, rendering, true, viewSettings, displaySettings, viewName); + fast_pass.execute(); if (editingtree->test_break(editingtree->tbh)) { // during editing multiple calls to this method can be triggered. @@ -100,10 +99,9 @@ void COM_execute(RenderData *rd, } } - ExecutionSystem *system = new ExecutionSystem( + ExecutionSystem system( rd, scene, editingtree, rendering, false, viewSettings, displaySettings, viewName); - system->execute(); - delete system; + system.execute(); BLI_mutex_unlock(&s_compositorMutex); } From 52b2cb6ea3a0c786ec8c713443d50ac1155cc3cc Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:15:37 +0100 Subject: [PATCH 241/519] Cleanup: Comment style --- .../blender/compositor/intern/COM_compositor.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index d0f8edaaede..70031f4b9f5 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -40,9 +40,9 @@ void COM_execute(RenderData *rd, const ColorManagedDisplaySettings *displaySettings, const char *viewName) { - /* initialize mutex, TODO this mutex init is actually not thread safe and + /* Initialize mutex, TODO this mutex init is actually not thread safe and * should be done somewhere as part of blender startup, all the other - * initializations can be done lazily */ + * initializations can be done lazily. */ if (is_compositorMutex_init == false) { BLI_mutex_init(&s_compositorMutex); is_compositorMutex_init = true; @@ -51,8 +51,8 @@ void COM_execute(RenderData *rd, BLI_mutex_lock(&s_compositorMutex); if (editingtree->test_break(editingtree->tbh)) { - // during editing multiple calls to this method can be triggered. - // make sure one the last one will be doing the work. + /* During editing multiple compositor executions can be triggered. + * Make sure this is the most recent one. */ BLI_mutex_unlock(&s_compositorMutex); return; } @@ -76,24 +76,22 @@ void COM_execute(RenderData *rd, } BKE_node_preview_init_tree(editingtree, preview_width, preview_height, false); - /* initialize workscheduler, will check if already done. TODO deinitialize somewhere */ + /* Initialize workscheduler. */ bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0; WorkScheduler::initialize(use_opencl, BKE_render_num_threads(rd)); - /* set progress bar to 0% and status to init compositing */ + /* Reset progress bar and status. */ editingtree->progress(editingtree->prh, 0.0); editingtree->stats_draw(editingtree->sdh, IFACE_("Compositing")); + /* Execute. */ bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; - /* initialize execution system */ if (twopass) { ExecutionSystem fast_pass( rd, scene, editingtree, rendering, true, viewSettings, displaySettings, viewName); fast_pass.execute(); if (editingtree->test_break(editingtree->tbh)) { - // during editing multiple calls to this method can be triggered. - // make sure one the last one will be doing the work. BLI_mutex_unlock(&s_compositorMutex); return; } From 4329a01d3788c34ca3233197225d63d476c6d3ea Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:20:34 +0100 Subject: [PATCH 242/519] Cleanup: Bundle static globals in struct --- .../compositor/intern/COM_compositor.cpp | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index 70031f4b9f5..198093b25be 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -29,8 +29,10 @@ #include "COM_compositor.h" #include "clew.h" -static ThreadMutex s_compositorMutex; -static bool is_compositorMutex_init = false; +static struct { + bool is_initialized = false; + ThreadMutex mutex; +} g_compositor; void COM_execute(RenderData *rd, Scene *scene, @@ -43,17 +45,17 @@ void COM_execute(RenderData *rd, /* Initialize mutex, TODO this mutex init is actually not thread safe and * should be done somewhere as part of blender startup, all the other * initializations can be done lazily. */ - if (is_compositorMutex_init == false) { - BLI_mutex_init(&s_compositorMutex); - is_compositorMutex_init = true; + if (!g_compositor.is_initialized) { + BLI_mutex_init(&g_compositor.mutex); + g_compositor.is_initialized = true; } - BLI_mutex_lock(&s_compositorMutex); + BLI_mutex_lock(&g_compositor.mutex); if (editingtree->test_break(editingtree->tbh)) { /* During editing multiple compositor executions can be triggered. * Make sure this is the most recent one. */ - BLI_mutex_unlock(&s_compositorMutex); + BLI_mutex_unlock(&g_compositor.mutex); return; } @@ -92,7 +94,7 @@ void COM_execute(RenderData *rd, fast_pass.execute(); if (editingtree->test_break(editingtree->tbh)) { - BLI_mutex_unlock(&s_compositorMutex); + BLI_mutex_unlock(&g_compositor.mutex); return; } } @@ -101,16 +103,16 @@ void COM_execute(RenderData *rd, rd, scene, editingtree, rendering, false, viewSettings, displaySettings, viewName); system.execute(); - BLI_mutex_unlock(&s_compositorMutex); + BLI_mutex_unlock(&g_compositor.mutex); } void COM_deinitialize() { - if (is_compositorMutex_init) { - BLI_mutex_lock(&s_compositorMutex); + if (g_compositor.is_initialized) { + BLI_mutex_lock(&g_compositor.mutex); WorkScheduler::deinitialize(); - is_compositorMutex_init = false; - BLI_mutex_unlock(&s_compositorMutex); - BLI_mutex_end(&s_compositorMutex); + g_compositor.is_initialized = false; + BLI_mutex_unlock(&g_compositor.mutex); + BLI_mutex_end(&g_compositor.mutex); } } From 37de612104dfae77ad34e3f76e77b3aa277c78fa Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:24:10 +0100 Subject: [PATCH 243/519] Cleanup: make local vars const. --- source/blender/compositor/intern/COM_compositor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index 198093b25be..8cf5f961378 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -79,7 +79,7 @@ void COM_execute(RenderData *rd, BKE_node_preview_init_tree(editingtree, preview_width, preview_height, false); /* Initialize workscheduler. */ - bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0; + const bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0; WorkScheduler::initialize(use_opencl, BKE_render_num_threads(rd)); /* Reset progress bar and status. */ @@ -87,7 +87,7 @@ void COM_execute(RenderData *rd, editingtree->stats_draw(editingtree->sdh, IFACE_("Compositing")); /* Execute. */ - bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; + const bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; if (twopass) { ExecutionSystem fast_pass( rd, scene, editingtree, rendering, true, viewSettings, displaySettings, viewName); From 53bf04f2844b64cd9f79bedd047eac9690f872e3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 08:30:15 -0600 Subject: [PATCH 244/519] Geometry Nodes: Expose material index attribute The `material_index` attribute can adjust which material in the list will be applied to each face of the mesh. There are two new things about this attribute that haven't been exposed by the attribute API yet. Each comes with limitations: 1. Integer data type: Most attribute nodes are currently written to use float data types. This means that they can't write to this attribute because they can't change the type of a built-in attribute. 2. Polygon domain: This is our first attribute using the polygon domain, meaning until some of the interpolations are implemented, some operations may not work as expected. Currently the two nodes that work with this attribute are Attribute Fill and Attribute Randomize. Differential Revision: https://developer.blender.org/D10444 --- .../blenkernel/intern/attribute_access.cc | 38 ++++++++++++++++++- .../intern/geometry_set_instances.cc | 5 ++- .../geometry/nodes/node_geo_join_geometry.cc | 5 ++- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index f594ec54a7e..aa721a0b4ca 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -1292,6 +1292,29 @@ static void tag_normals_dirty_when_writing_position(GeometryComponent &component } } +static int get_material_index(const MPoly &mpoly) +{ + return static_cast(mpoly.mat_nr); +} + +static void set_material_index(MPoly &mpoly, const int &index) +{ + mpoly.mat_nr = static_cast(std::clamp(index, 0, SHRT_MAX)); +} + +static ReadAttributePtr make_material_index_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_POLYGON, Span((const MPoly *)data, domain_size)); +} + +static WriteAttributePtr make_material_index_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_POLYGON, MutableSpan((MPoly *)data, domain_size)); +} + template static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size) { @@ -1355,6 +1378,19 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() make_vertex_position_read_attribute, make_vertex_position_write_attribute, tag_normals_dirty_when_writing_position); + + static BuiltinCustomDataLayerProvider material_index("material_index", + ATTR_DOMAIN_POLYGON, + CD_PROP_INT32, + CD_MPOLY, + BuiltinAttributeProvider::NonCreatable, + BuiltinAttributeProvider::Writable, + BuiltinAttributeProvider::NonDeletable, + polygon_access, + make_material_index_read_attribute, + make_material_index_write_attribute, + nullptr); + static MeshUVsAttributeProvider uvs; static VertexGroupsAttributeProvider vertex_groups; static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access); @@ -1362,7 +1398,7 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() static CustomDataAttributeProvider edge_custom_data(ATTR_DOMAIN_EDGE, edge_access); static CustomDataAttributeProvider polygon_custom_data(ATTR_DOMAIN_POLYGON, polygon_access); - return ComponentAttributeProviders({&position}, + return ComponentAttributeProviders({&position, &material_index}, {&uvs, &corner_custom_data, &vertex_groups, diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 8e9edc86bca..436fc0f1d1d 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -350,9 +350,10 @@ static void join_instance_groups_mesh(Span set_groups, Ge MeshComponent &dst_component = result.get_component_for_write(); dst_component.replace(new_mesh); - /* The position attribute is handled above already. */ + /* Don't copy attributes that are stored directly in the mesh data structs. */ Map attributes; - gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {"position"}); + gather_attribute_info( + attributes, GeometryComponentType::Mesh, set_groups, {"position", "material_index"}); join_attributes(set_groups, GeometryComponentType::Mesh, attributes, diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index 3f6f28f2826..4e15f232934 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -221,8 +221,9 @@ static void join_components(Span src_components, Geometry MeshComponent &dst_component = result.get_component_for_write(); dst_component.replace(new_mesh); - /* The position attribute is handled above already. */ - join_attributes(to_base_components(src_components), dst_component, {"position"}); + /* Don't copy attributes that are stored directly in the mesh data structs. */ + join_attributes( + to_base_components(src_components), dst_component, {"position", "material_index"}); } static void join_components(Span src_components, GeometrySet &result) From 0cbbb9edd79d69a4925289bfe8e92ea9d599a3e2 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 15:40:32 +0100 Subject: [PATCH 245/519] Cleanup: Split COM_compositor into multiple functions. --- .../compositor/intern/COM_compositor.cpp | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index 8cf5f961378..68e4f80f91f 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -34,9 +34,37 @@ static struct { ThreadMutex mutex; } g_compositor; -void COM_execute(RenderData *rd, +/* Make sure node tree has previews. + * Don't create previews in advance, this is done when adding preview operations. + * Reserved preview size is determined by render output for now. */ +static void compositor_init_node_previews(const RenderData *render_data, bNodeTree *node_tree) +{ + /* We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid + * insane preview resolution, which might even overflow preview dimensions. */ + const float aspect = render_data->xsch > 0 ? + (float)render_data->ysch / (float)render_data->xsch : + 1.0f; + int preview_width, preview_height; + if (aspect < 1.0f) { + preview_width = COM_PREVIEW_SIZE; + preview_height = (int)(COM_PREVIEW_SIZE * aspect); + } + else { + preview_width = (int)(COM_PREVIEW_SIZE / aspect); + preview_height = COM_PREVIEW_SIZE; + } + BKE_node_preview_init_tree(node_tree, preview_width, preview_height, false); +} + +static void compositor_reset_node_tree_status(bNodeTree *node_tree) +{ + node_tree->progress(node_tree->prh, 0.0); + node_tree->stats_draw(node_tree->sdh, IFACE_("Compositing")); +} + +void COM_execute(RenderData *render_data, Scene *scene, - bNodeTree *editingtree, + bNodeTree *node_tree, int rendering, const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings, @@ -52,55 +80,35 @@ void COM_execute(RenderData *rd, BLI_mutex_lock(&g_compositor.mutex); - if (editingtree->test_break(editingtree->tbh)) { + if (node_tree->test_break(node_tree->tbh)) { /* During editing multiple compositor executions can be triggered. * Make sure this is the most recent one. */ BLI_mutex_unlock(&g_compositor.mutex); return; } - /* Make sure node tree has previews. - * Don't create previews in advance, this is done when adding preview operations. - * Reserved preview size is determined by render output for now. - * - * We fit the aspect into COM_PREVIEW_SIZE x COM_PREVIEW_SIZE image to avoid - * insane preview resolution, which might even overflow preview dimensions. - */ - const float aspect = rd->xsch > 0 ? (float)rd->ysch / (float)rd->xsch : 1.0f; - int preview_width, preview_height; - if (aspect < 1.0f) { - preview_width = COM_PREVIEW_SIZE; - preview_height = (int)(COM_PREVIEW_SIZE * aspect); - } - else { - preview_width = (int)(COM_PREVIEW_SIZE / aspect); - preview_height = COM_PREVIEW_SIZE; - } - BKE_node_preview_init_tree(editingtree, preview_width, preview_height, false); + compositor_init_node_previews(render_data, node_tree); + compositor_reset_node_tree_status(node_tree); /* Initialize workscheduler. */ - const bool use_opencl = (editingtree->flag & NTREE_COM_OPENCL) != 0; - WorkScheduler::initialize(use_opencl, BKE_render_num_threads(rd)); - - /* Reset progress bar and status. */ - editingtree->progress(editingtree->prh, 0.0); - editingtree->stats_draw(editingtree->sdh, IFACE_("Compositing")); + const bool use_opencl = (node_tree->flag & NTREE_COM_OPENCL) != 0; + WorkScheduler::initialize(use_opencl, BKE_render_num_threads(render_data)); /* Execute. */ - const bool twopass = (editingtree->flag & NTREE_TWO_PASS) && !rendering; + const bool twopass = (node_tree->flag & NTREE_TWO_PASS) && !rendering; if (twopass) { ExecutionSystem fast_pass( - rd, scene, editingtree, rendering, true, viewSettings, displaySettings, viewName); + render_data, scene, node_tree, rendering, true, viewSettings, displaySettings, viewName); fast_pass.execute(); - if (editingtree->test_break(editingtree->tbh)) { + if (node_tree->test_break(node_tree->tbh)) { BLI_mutex_unlock(&g_compositor.mutex); return; } } ExecutionSystem system( - rd, scene, editingtree, rendering, false, viewSettings, displaySettings, viewName); + render_data, scene, node_tree, rendering, false, viewSettings, displaySettings, viewName); system.execute(); BLI_mutex_unlock(&g_compositor.mutex); From 6247b8cc77131ec52501ec8585e9f3de6056a746 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Wed, 17 Feb 2021 15:09:05 +0100 Subject: [PATCH 246/519] Fix T85722: missing updates adding modifiers via python Was reported for Geometry Nodes Editor "New" button, but was true for any modifier added via modifiers.new(). Now just add appropriate nofifier. Maniphest Tasks: T85722 Differential Revision: https://developer.blender.org/D10450 --- source/blender/makesrna/intern/rna_object.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index faa20e642cf..6e534868120 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1600,7 +1600,12 @@ bool rna_Object_constraints_override_apply(Main *UNUSED(bmain), static ModifierData *rna_Object_modifier_new( Object *object, bContext *C, ReportList *reports, const char *name, int type) { - return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type); + ModifierData *md = ED_object_modifier_add( + reports, CTX_data_main(C), CTX_data_scene(C), object, name, type); + + WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_ADDED, object); + + return md; } static void rna_Object_modifier_remove(Object *object, From e3dad811647a59979383f7e13d37137dfc8ff9fb Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Wed, 17 Feb 2021 08:06:58 -0700 Subject: [PATCH 247/519] Cleanup: Missing word in rna description One of the sentences changed recently in rBc63df3b33f01 was missing a word. No functional changes. --- source/blender/makesrna/intern/rna_space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index f5abe681d91..38d0fa85555 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4801,7 +4801,7 @@ static void rna_def_space_properties(BlenderRNA *brna) "AUTO", 0, "Auto", - "Change tabs only when this editor shares a border the outliner"}, + "Change tabs only when this editor shares a border with an outliner"}, {0, NULL, 0, NULL, NULL}, }; From 859118d8f6ff022a16acbc6435488883424bad25 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Feb 2021 14:20:51 +0100 Subject: [PATCH 248/519] BLI: add BLI_simd.h header to wrap SSE includes In preparation of adding Neon support. Ref D8237, T78710 --- .../blenkernel/intern/lattice_deform.c | 11 +++----- source/blender/blenlib/BLI_simd.h | 28 +++++++++++++++++++ .../blender/blenlib/intern/math_base_inline.c | 11 +++----- .../blenlib/intern/math_color_inline.c | 6 ++-- source/blender/blenlib/intern/math_geom.c | 2 +- source/blender/blenlib/intern/math_matrix.c | 2 +- .../operations/COM_BlurBaseOperation.cpp | 2 +- .../operations/COM_BlurBaseOperation.h | 6 ++-- .../operations/COM_GaussianXBlurOperation.cpp | 10 +++---- .../operations/COM_GaussianXBlurOperation.h | 2 +- .../operations/COM_GaussianYBlurOperation.cpp | 10 +++---- .../operations/COM_GaussianYBlurOperation.h | 2 +- .../blender/modifiers/intern/MOD_meshdeform.c | 11 +++----- 13 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 source/blender/blenlib/BLI_simd.h diff --git a/source/blender/blenkernel/intern/lattice_deform.c b/source/blender/blenkernel/intern/lattice_deform.c index 81c2f492f7e..2651042939f 100644 --- a/source/blender/blenkernel/intern/lattice_deform.c +++ b/source/blender/blenkernel/intern/lattice_deform.c @@ -31,6 +31,7 @@ #include "MEM_guardedalloc.h" #include "BLI_math.h" +#include "BLI_simd.h" #include "BLI_task.h" #include "BLI_utildefines.h" @@ -49,10 +50,6 @@ #include "BKE_deform.h" -#ifdef __SSE2__ -# include -#endif - /* -------------------------------------------------------------------- */ /** \name Lattice Deform API * \{ */ @@ -171,7 +168,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, /* vgroup influence */ float co_prev[4] = {0}, weight_blend = 0.0f; copy_v3_v3(co_prev, co); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 co_vec = _mm_loadu_ps(co_prev); #endif @@ -232,7 +229,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, u = v * tu[uu - ui + 1]; idx_u = CLAMPIS(uu, 0, idx_u_max); const int idx = idx_w + idx_v + idx_u; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { __m128 weight_vec = _mm_set1_ps(u); /* We need to address special case for last item to avoid accessing invalid memory. */ @@ -256,7 +253,7 @@ void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, } } } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { copy_v3_v3(co, (float *)&co_vec); } diff --git a/source/blender/blenlib/BLI_simd.h b/source/blender/blenlib/BLI_simd.h new file mode 100644 index 00000000000..1518b6c1de2 --- /dev/null +++ b/source/blender/blenlib/BLI_simd.h @@ -0,0 +1,28 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +/** \file + * \ingroup bli + * + * SIMD instruction support. + */ + +#if defined(__SSE2__) +# include +# define BLI_HAVE_SSE2 +#endif diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c index 28aa81e5858..39945960e68 100644 --- a/source/blender/blenlib/intern/math_base_inline.c +++ b/source/blender/blenlib/intern/math_base_inline.c @@ -31,11 +31,8 @@ #include #include -#ifdef __SSE2__ -# include -#endif - #include "BLI_math_base.h" +#include "BLI_simd.h" #ifdef __cplusplus extern "C" { @@ -685,10 +682,10 @@ MINLINE int integer_digits_i(const int i) /* Internal helpers for SSE2 implementation. * - * NOTE: Are to be called ONLY from inside `#ifdef __SSE2__` !!! + * NOTE: Are to be called ONLY from inside `#ifdef BLI_HAVE_SSE2` !!! */ -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 /* Calculate initial guess for arg^exp based on float representation * This method gives a constant bias, which can be easily compensated by @@ -769,7 +766,7 @@ MALWAYS_INLINE __m128 _bli_math_blend_sse(const __m128 mask, const __m128 a, con return _mm_or_ps(_mm_and_ps(mask, a), _mm_andnot_ps(mask, b)); } -#endif /* __SSE2__ */ +#endif /* BLI_HAVE_SSE2 */ /* Low level conversion functions */ MINLINE unsigned char unit_float_to_uchar_clamp(float val) diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c index 26828cb8717..4c50c1c7af8 100644 --- a/source/blender/blenlib/intern/math_color_inline.c +++ b/source/blender/blenlib/intern/math_color_inline.c @@ -34,7 +34,7 @@ /******************************** Color Space ********************************/ -# ifdef __SSE2__ +# ifdef BLI_HAVE_SSE2 MALWAYS_INLINE __m128 srgb_to_linearrgb_v4_simd(const __m128 c) { @@ -75,7 +75,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3]) srgb[2] = r[2]; } -# else /* __SSE2__ */ +# else /* BLI_HAVE_SSE2 */ MINLINE void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3]) { @@ -90,7 +90,7 @@ MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3]) srgb[1] = linearrgb_to_srgb(linear[1]); srgb[2] = linearrgb_to_srgb(linear[2]); } -# endif /* __SSE2__ */ +# endif /* BLI_HAVE_SSE2 */ MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4]) { diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 5d78bb0b901..b7e94e6c512 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -5907,7 +5907,7 @@ static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float #if 0 -# include +# include "BLI_simd.h" static __m128 sse_approx_acos(__m128 x) { diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 6b5efc3f8c4..b460d75d77f 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -277,7 +277,7 @@ void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4]) BLI_assert(!ELEM(R, A, B)); /* matrix product: R[j][k] = A[j][i] . B[i][k] */ -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 A0 = _mm_loadu_ps(A[0]); __m128 A1 = _mm_loadu_ps(A[1]); __m128 A2 = _mm_loadu_ps(A[2]); diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp index 3fe154c397e..612a71037f7 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp @@ -88,7 +88,7 @@ float *BlurBaseOperation::make_gausstab(float rad, int size) return gausstab; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *BlurBaseOperation::convert_gausstab_sse(const float *gausstab, int size) { int n = 2 * size + 1; diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h index c452b2e4ea1..56dacc96710 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h @@ -23,16 +23,14 @@ #define MAX_GAUSSTAB_RADIUS 30000 -#ifdef __SSE2__ -# include -#endif +#include "BLI_simd.h" class BlurBaseOperation : public NodeOperation, public QualityStepHelper { private: protected: BlurBaseOperation(DataType data_type); float *make_gausstab(float rad, int size); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *convert_gausstab_sse(const float *gausstab, int size); #endif float *make_dist_fac_inverse(float rad, int size, int falloff); diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index e08d30e5ddf..90333f7dd79 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -26,7 +26,7 @@ GaussianXBlurOperation::GaussianXBlurOperation() : BlurBaseOperation(COM_DT_COLOR) { this->m_gausstab = nullptr; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = nullptr; #endif this->m_filtersize = 0; @@ -55,7 +55,7 @@ void GaussianXBlurOperation::initExecution() /* TODO(sergey): De-duplicate with the case below and Y blur. */ this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -70,7 +70,7 @@ void GaussianXBlurOperation::updateGauss() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -95,7 +95,7 @@ void GaussianXBlurOperation::executePixel(float output[4], int x, int y, void *d int offsetadd = getOffsetAdd(); int bufferindex = ((xmin - bufferstartx) * 4) + ((ymin - bufferstarty) * 4 * bufferwidth); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 accum_r = _mm_load_ps(color_accum); for (int nx = xmin, index = (xmin - x) + this->m_filtersize; nx < xmax; nx += step, index += step) { @@ -162,7 +162,7 @@ void GaussianXBlurOperation::deinitExecution() MEM_freeN(this->m_gausstab); this->m_gausstab = nullptr; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 if (this->m_gausstab_sse) { MEM_freeN(this->m_gausstab_sse); this->m_gausstab_sse = nullptr; diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h index 9348c05f906..b2bcd79e716 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h @@ -24,7 +24,7 @@ class GaussianXBlurOperation : public BlurBaseOperation { private: float *m_gausstab; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *m_gausstab_sse; #endif int m_filtersize; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 7710b065ccd..c5b3cf24239 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -26,7 +26,7 @@ GaussianYBlurOperation::GaussianYBlurOperation() : BlurBaseOperation(COM_DT_COLOR) { this->m_gausstab = nullptr; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = nullptr; #endif this->m_filtersize = 0; @@ -54,7 +54,7 @@ void GaussianYBlurOperation::initExecution() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -69,7 +69,7 @@ void GaussianYBlurOperation::updateGauss() m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 this->m_gausstab_sse = BlurBaseOperation::convert_gausstab_sse(this->m_gausstab, m_filtersize); #endif } @@ -94,7 +94,7 @@ void GaussianYBlurOperation::executePixel(float output[4], int x, int y, void *d int step = getStep(); const int bufferIndexx = ((xmin - bufferstartx) * 4); -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 accum_r = _mm_load_ps(color_accum); for (int ny = ymin; ny < ymax; ny += step) { index = (ny - y) + this->m_filtersize; @@ -162,7 +162,7 @@ void GaussianYBlurOperation::deinitExecution() MEM_freeN(this->m_gausstab); this->m_gausstab = nullptr; } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 if (this->m_gausstab_sse) { MEM_freeN(this->m_gausstab_sse); this->m_gausstab_sse = nullptr; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h index 7ab4ecb5506..d921780876a 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h @@ -24,7 +24,7 @@ class GaussianYBlurOperation : public BlurBaseOperation { private: float *m_gausstab; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 *m_gausstab_sse; #endif int m_filtersize; diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 4bd306e7679..a94dd6da477 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -24,6 +24,7 @@ #include "BLI_utildefines.h" #include "BLI_math.h" +#include "BLI_simd.h" #include "BLI_task.h" #include "BLT_translation.h" @@ -61,10 +62,6 @@ #include "MOD_ui_common.h" #include "MOD_util.h" -#ifdef __SSE2__ -# include -#endif - static void initData(ModifierData *md) { MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; @@ -188,7 +185,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 float gridvec[3], dvec[3], ivec[3], wx, wy, wz; float weight, cageweight, totweight, *cageco; int i, j, a, x, y, z, size; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 __m128 co = _mm_setzero_ps(); #else float co[3] = {0.0f, 0.0f, 0.0f}; @@ -243,7 +240,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 for (j = 0; j < cell->totinfluence; j++, inf++) { cageco = dco[inf->vertex]; cageweight = weight * inf->weight; -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 { __m128 cageweight_r = _mm_set1_ps(cageweight); /* This will load one extra element, this is ok because @@ -261,7 +258,7 @@ static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3 } } -#ifdef __SSE2__ +#ifdef BLI_HAVE_SSE2 copy_v3_v3(vec, (float *)&co); #else copy_v3_v3(vec, co); From db28411fd90b77035dddc1682bb2786da34f73e9 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Feb 2021 04:16:39 +0100 Subject: [PATCH 249/519] BLI: use sse2neon to emulate SSE instructions with Arm Neon * WITH_CPU_SSE was renamed to WITH_CPU_SIMD, and now covers both SSE and Neon. * For macOS sse2neon.h is included as part of the precompiled libraries. * For Linux it is enabled if the sse2neon.h header file is detected. However this library does not have official releases and is not shipped with any Linux distribution, so manual installation and configuration is required to get this working. Ref D8237, T78710 --- CMakeLists.txt | 71 +++++++++++++------ build_files/cmake/macros.cmake | 20 +++--- .../cmake/platform/platform_apple.cmake | 7 +- .../cmake/platform/platform_unix.cmake | 4 ++ intern/cycles/CMakeLists.txt | 2 +- source/blender/blenlib/BLI_simd.h | 10 ++- 6 files changed, 75 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6fb6dbd9dc..c95b8f0f7af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,8 +370,8 @@ if(WITH_PYTHON_INSTALL) endif() endif() -option(WITH_CPU_SSE "Enable SIMD instruction if they're detected on the host machine" ON) -mark_as_advanced(WITH_CPU_SSE) +option(WITH_CPU_SIMD "Enable SIMD instruction if they're detected on the host machine" ON) +mark_as_advanced(WITH_CPU_SIMD) # Cycles option(WITH_CYCLES "Enable Cycles Render Engine" ON) @@ -775,14 +775,6 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS) set(WITH_XR_OPENXR OFF) endif() -if(WITH_CPU_SSE) - TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG) -else() - message(STATUS "SSE and SSE2 optimizations are DISABLED!") - set(COMPILER_SSE_FLAG) - set(COMPILER_SSE2_FLAG) -endif() - if(WITH_BUILDINFO) find_package(Git) if(NOT GIT_FOUND) @@ -962,22 +954,55 @@ if(WITH_INTERNATIONAL) endif() endif() -# See TEST_SSE_SUPPORT() for how this is defined. +# See TEST_SSE_SUPPORT() and TEST_NEON_SUPPORT() for how these are defined. +# +# This is done globally, so that all modules can use it if available, and +# because these are used in headers used by many modules. +if(WITH_CPU_SIMD) + set(COMPILER_SSE_FLAG) + set(COMPILER_SSE2_FLAG) -# Do it globally, SSE2 is required for quite some time now. -# Doing it now allows to use SSE/SSE2 in inline headers. -if(SUPPORT_SSE_BUILD) - string(PREPEND PLATFORM_CFLAGS "${COMPILER_SSE_FLAG} ") - add_definitions(-D__SSE__ -D__MMX__) -endif() -if(SUPPORT_SSE2_BUILD) - string(APPEND PLATFORM_CFLAGS " ${COMPILER_SSE2_FLAG}") - add_definitions(-D__SSE2__) - if(NOT SUPPORT_SSE_BUILD) # don't double up - add_definitions(-D__MMX__) + # Test Neon first since macOS Arm can compile and run x86-64 SSE binaries. + TEST_NEON_SUPPORT() + if(SUPPORT_NEON_BUILD) + # Neon + if(SSE2NEON_FOUND) + blender_include_dirs_sys("${SSE2NEON_INCLUDE_DIRS}") + add_definitions(-DWITH_SSE2NEON) + endif() + else() + # SSE + TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG) + if(SUPPORT_SSE_BUILD) + string(PREPEND PLATFORM_CFLAGS "${COMPILER_SSE_FLAG} ") + add_definitions(-D__SSE__ -D__MMX__) + endif() + if(SUPPORT_SSE2_BUILD) + string(APPEND PLATFORM_CFLAGS " ${COMPILER_SSE2_FLAG}") + add_definitions(-D__SSE2__) + if(NOT SUPPORT_SSE_BUILD) # don't double up + add_definitions(-D__MMX__) + endif() + endif() endif() -endif() + # Print instructions used + if(SUPPORT_NEON_BUILD) + if(SSE2NEON_FOUND) + message(STATUS "Neon SIMD instructions enabled") + else() + message(STATUS "Neon SIMD instructions detected but unused, requires sse2neon") + endif() + elseif(SUPPORT_SSE2_BUILD) + message(STATUS "SSE2 SIMD instructions enabled") + elseif(SUPPORT_SSE_BUILD) + message(STATUS "SSE SIMD instructions enabled") + else() + message(STATUS "No SIMD instructions detected") + endif() +else() + message(STATUS "SIMD instructions disabled") +endif() # set the endian define if(MSVC) diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index aebcd25e3b6..b8f92a10761 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -668,12 +668,6 @@ macro(TEST_SSE_SUPPORT #include int main(void) { __m128 v = _mm_setzero_ps(); return 0; }" SUPPORT_SSE_BUILD) - - if(SUPPORT_SSE_BUILD) - message(STATUS "SSE Support: detected.") - else() - message(STATUS "SSE Support: missing.") - endif() endif() if(NOT DEFINED SUPPORT_SSE2_BUILD) @@ -682,17 +676,19 @@ macro(TEST_SSE_SUPPORT #include int main(void) { __m128d v = _mm_setzero_pd(); return 0; }" SUPPORT_SSE2_BUILD) - - if(SUPPORT_SSE2_BUILD) - message(STATUS "SSE2 Support: detected.") - else() - message(STATUS "SSE2 Support: missing.") - endif() endif() unset(CMAKE_REQUIRED_FLAGS) endmacro() +macro(TEST_NEON_SUPPORT) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles( + "#include + int main() {return vaddvq_s32(vdupq_n_s32(1));}" + SUPPORT_NEON_BUILD) +endmacro() + # Only print message if running CMake first time macro(message_first_run) if(FIRST_RUN) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 5203ba10863..e7b0097a137 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -321,8 +321,11 @@ if(WITH_OPENVDB) endif() if(WITH_NANOVDB) - set(NANOVDB ${LIBDIR}/nanovdb) - set(NANOVDB_INCLUDE_DIR ${NANOVDB}/include) + find_package(NanoVDB) +endif() + +if(WITH_CPU_SIMD) + find_package(sse2neon) endif() if(WITH_LLVM) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index f212741f0b6..5d3f074bdda 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -284,6 +284,10 @@ if(WITH_NANOVDB) endif() endif() +if(WITH_CPU_SIMD) + find_package_wrapper(sse2neon) +endif() + if(WITH_ALEMBIC) find_package_wrapper(Alembic) diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 2a28d905144..b01bf1bd1e2 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -64,7 +64,7 @@ if(WITH_CYCLES_NATIVE_ONLY) endif() set(CYCLES_KERNEL_FLAGS "${MSVC_NATIVE_ARCH_FLAGS}") endif() -elseif(NOT WITH_CPU_SSE) +elseif(NOT WITH_CPU_SIMD OR (SUPPORT_NEON_BUILD AND SSE2NEON_FOUND)) set(CXX_HAS_SSE FALSE) set(CXX_HAS_AVX FALSE) set(CXX_HAS_AVX2 FALSE) diff --git a/source/blender/blenlib/BLI_simd.h b/source/blender/blenlib/BLI_simd.h index 1518b6c1de2..2ebbd7a2250 100644 --- a/source/blender/blenlib/BLI_simd.h +++ b/source/blender/blenlib/BLI_simd.h @@ -22,7 +22,15 @@ * SIMD instruction support. */ -#if defined(__SSE2__) +#if defined(__ARM_NEON) && defined(WITH_SSE2NEON) +/* SSE/SSE2 emulation on ARM Neon. Match SSE precision. */ +# define SSE2NEON_PRECISE_MINMAX 1 +# define SSE2NEON_PRECISE_DIV 1 +# define SSE2NEON_PRECISE_SQRT 1 +# include +# define BLI_HAVE_SSE2 +#elif defined(__SSE2__) +/* Native SSE2 on Intel/AMD. */ # include # define BLI_HAVE_SSE2 #endif From 8119f0aad21c3ce88e82d68ed20cd5a8edc99703 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Feb 2021 15:34:23 +0100 Subject: [PATCH 250/519] Cycles: refactor intrinsic functions implementation * Add processor independent fallbacks * Use uint32_t and uint64_t types * Remove unused functions * Better comments and less indentation Ref D8237, T78710 --- intern/cycles/bvh/bvh.cpp | 2 +- intern/cycles/bvh/bvh_build.cpp | 2 +- intern/cycles/util/util_avxb.h | 8 +- intern/cycles/util/util_avxi.h | 8 +- intern/cycles/util/util_color.h | 2 +- intern/cycles/util/util_half.h | 2 +- intern/cycles/util/util_simd.h | 536 ++++++++++++-------------------- intern/cycles/util/util_sseb.h | 8 +- intern/cycles/util/util_ssef.h | 10 +- intern/cycles/util/util_ssei.h | 8 +- intern/cycles/util/util_types.h | 21 +- 11 files changed, 228 insertions(+), 379 deletions(-) diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 256382e63ba..050e090bddf 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -69,7 +69,7 @@ BVHLayout BVHParams::best_bvh_layout(BVHLayout requested_layout, BVHLayoutMask s allowed_layouts_mask = supported_layouts; } /* We get widest from allowed ones and convert mask to actual layout. */ - const BVHLayoutMask widest_allowed_layout_mask = __bsr(allowed_layouts_mask); + const BVHLayoutMask widest_allowed_layout_mask = __bsr((uint32_t)allowed_layouts_mask); return (BVHLayout)(1 << widest_allowed_layout_mask); } diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp index 296f9130f43..ec85cef0851 100644 --- a/intern/cycles/bvh/bvh_build.cpp +++ b/intern/cycles/bvh/bvh_build.cpp @@ -851,7 +851,7 @@ BVHNode *BVHBuild::create_leaf_node(const BVHRange &range, const vector(extract<0>(vreduce_add(v))); } -__forceinline size_t select_min(const avxi &v) +__forceinline uint32_t select_min(const avxi &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const avxi &v) +__forceinline uint32_t select_max(const avxi &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const avxb &valid, const avxi &v) +__forceinline uint32_t select_min(const avxb &valid, const avxi &v) { const avxi a = select(valid, v, avxi(pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const avxb &valid, const avxi &v) +__forceinline uint32_t select_max(const avxb &valid, const avxi &v) { const avxi a = select(valid, v, avxi(neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h index c6937ca78fe..1b493d0ed5e 100644 --- a/intern/cycles/util/util_color.h +++ b/intern/cycles/util/util_color.h @@ -20,7 +20,7 @@ #include "util/util_math.h" #include "util/util_types.h" -#ifdef __KERNEL_SSE2__ +#if !defined(__KERNEL_GPU__) && defined(__KERNEL_SSE2__) # include "util/util_simd.h" #endif diff --git a/intern/cycles/util/util_half.h b/intern/cycles/util/util_half.h index 3bac7008905..a8d4ee75e20 100644 --- a/intern/cycles/util/util_half.h +++ b/intern/cycles/util/util_half.h @@ -20,7 +20,7 @@ #include "util/util_math.h" #include "util/util_types.h" -#ifdef __KERNEL_SSE2__ +#if !defined(__KERNEL_GPU__) && defined(__KERNEL_SSE2__) # include "util/util_simd.h" #endif diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index de0e3c39f30..3a6761c6a2f 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -18,49 +18,41 @@ #ifndef __UTIL_SIMD_TYPES_H__ #define __UTIL_SIMD_TYPES_H__ -#ifndef __KERNEL_GPU__ +#include +#include -# include - -# include "util/util_defines.h" +#include "util/util_defines.h" /* SSE Intrinsics includes * - * We assume __KERNEL_SSEX__ flags to have been defined at this point */ - -/* SSE intrinsics headers */ -# ifndef FREE_WINDOWS64 - -# ifdef _MSC_VER -# include -# elif (defined(__x86_64__) || defined(__i386__)) -# include -# endif - -# else - -/* MinGW64 has conflicting declarations for these SSE headers in . + * We assume __KERNEL_SSEX__ flags to have been defined at this point. + * + * MinGW64 has conflicting declarations for these SSE headers in . * Since we can't avoid including , better only include that */ -# include "util/util_windows.h" +#if defined(FREE_WINDOWS64) +# include "util/util_windows.h" +#elif defined(_MSC_VER) +# include +#elif (defined(__x86_64__) || defined(__i386__)) +# include +#endif -# endif - -# if defined(__x86_64__) || defined(_M_X64) -# define SIMD_SET_FLUSH_TO_ZERO \ - _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); \ - _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); -# else -# define SIMD_SET_FLUSH_TO_ZERO -# endif +/* Floating Point Control, for Embree. */ +#if defined(__x86_64__) || defined(_M_X64) +# define SIMD_SET_FLUSH_TO_ZERO \ + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); \ + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); +#else +# define SIMD_SET_FLUSH_TO_ZERO +#endif CCL_NAMESPACE_BEGIN -# ifdef __KERNEL_SSE2__ +/* Data structures used by SSE classes. */ +#ifdef __KERNEL_SSE2__ extern const __m128 _mm_lookupmask_ps[16]; -/* Special Types */ - static struct TrueTy { __forceinline operator bool() const { @@ -122,377 +114,281 @@ static struct PosInfTy { static struct StepTy { } step ccl_maybe_unused; -/* Intrinsics Functions */ +#endif -# if defined(__BMI__) && defined(__GNUC__) -# ifndef _tzcnt_u32 -# define _tzcnt_u32 __tzcnt_u32 -# endif -# ifndef _tzcnt_u64 -# define _tzcnt_u64 __tzcnt_u64 -# endif -# endif +/* Intrinsics Functions + * + * For fast bit operations. */ -# if defined(__LZCNT__) -# define _lzcnt_u32 __lzcnt32 -# define _lzcnt_u64 __lzcnt64 -# endif +#if defined(__BMI__) && defined(__GNUC__) +# ifndef _tzcnt_u32 +# define _tzcnt_u32 __tzcnt_u32 +# endif +# ifndef _tzcnt_u64 +# define _tzcnt_u64 __tzcnt_u64 +# endif +#endif -# if defined(_WIN32) && !defined(__MINGW32__) && !defined(__clang__) +#if defined(__LZCNT__) +# define _lzcnt_u32 __lzcnt32 +# define _lzcnt_u64 __lzcnt64 +#endif -__forceinline int __popcnt(int in) +#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__clang__) +/* Intrinsic functions on Windows. */ +__forceinline uint32_t __bsf(uint32_t v) { - return _mm_popcnt_u32(in); -} - -# if !defined(_MSC_VER) -__forceinline unsigned int __popcnt(unsigned int in) -{ - return _mm_popcnt_u32(in); -} -# endif - -# if defined(__KERNEL_64_BIT__) -__forceinline long long __popcnt(long long in) -{ - return _mm_popcnt_u64(in); -} -__forceinline size_t __popcnt(size_t in) -{ - return _mm_popcnt_u64(in); -} -# endif - -__forceinline int __bsf(int v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else unsigned long r = 0; _BitScanForward(&r, v); return r; -# endif +# endif } -__forceinline unsigned int __bsf(unsigned int v) +__forceinline uint32_t __bsf(uint32_t v) { -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else unsigned long r = 0; _BitScanForward(&r, v); return r; -# endif +# endif } -__forceinline int __bsr(int v) +__forceinline uint32_t __bsr(uint32_t v) { unsigned long r = 0; _BitScanReverse(&r, v); return r; } -__forceinline int __btc(int v, int i) +__forceinline uint32_t __btc(uint32_t v, uint32_t i) { long r = v; _bittestandcomplement(&r, i); return r; } -__forceinline int __bts(int v, int i) +__forceinline uint32_t bitscan(uint32_t v) { - long r = v; - _bittestandset(&r, i); - return r; -} - -__forceinline int __btr(int v, int i) -{ - long r = v; - _bittestandreset(&r, i); - return r; -} - -__forceinline int bitscan(int v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else return __bsf(v); -# endif +# endif } -__forceinline int clz(const int x) -{ -# if defined(__KERNEL_AVX2__) - return _lzcnt_u32(x); -# else - if (UNLIKELY(x == 0)) - return 32; - return 31 - __bsr(x); -# endif -} +# if defined(__KERNEL_64_BIT__) -__forceinline int __bscf(int &v) +__forceinline uint64_t __bsf(uint64_t v) { - int i = __bsf(v); - v &= v - 1; - return i; -} - -__forceinline unsigned int __bscf(unsigned int &v) -{ - unsigned int i = __bsf(v); - v &= v - 1; - return i; -} - -# if defined(__KERNEL_64_BIT__) - -__forceinline size_t __bsf(size_t v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u64(v); -# else +# else unsigned long r = 0; _BitScanForward64(&r, v); return r; -# endif +# endif } -__forceinline size_t __bsr(size_t v) +__forceinline uint64_t __bsr(uint64_t v) { unsigned long r = 0; _BitScanReverse64(&r, v); return r; } -__forceinline size_t __btc(size_t v, size_t i) +__forceinline uint64_t __btc(uint64_t v, uint64_t i) { - size_t r = v; + uint64_t r = v; _bittestandcomplement64((__int64 *)&r, i); return r; } -__forceinline size_t __bts(size_t v, size_t i) +__forceinline uint64_t bitscan(uint64_t v) { - __int64 r = v; - _bittestandset64(&r, i); - return r; -} - -__forceinline size_t __btr(size_t v, size_t i) -{ - __int64 r = v; - _bittestandreset64(&r, i); - return r; -} - -__forceinline size_t bitscan(size_t v) -{ -# if defined(__KERNEL_AVX2__) -# if defined(__KERNEL_64_BIT__) +# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_64_BIT__) return _tzcnt_u64(v); -# else +# else return _tzcnt_u32(v); -# endif -# else +# endif +# else return __bsf(v); -# endif +# endif } -__forceinline size_t __bscf(size_t &v) +# endif /* __KERNEL_64_BIT__ */ + +#elif (defined(__x86_64__) || defined(__i386__)) && defined(__KERNEL_SSE2__) +/* Instrinsic functions with x86 SSE. */ + +__forceinline uint32_t __bsf(const uint32_t v) { - size_t i = __bsf(v); - v &= v - 1; - return i; -} - -# endif /* __KERNEL_64_BIT__ */ - -# else /* _WIN32 */ - -__forceinline unsigned int __popcnt(unsigned int in) -{ - int r = 0; - asm("popcnt %1,%0" : "=r"(r) : "r"(in)); - return r; -} - -__forceinline int __bsf(int v) -{ - int r = 0; + uint32_t r = 0; asm("bsf %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline int __bsr(int v) +__forceinline uint32_t __bsr(const uint32_t v) { - int r = 0; + uint32_t r = 0; asm("bsr %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline int __btc(int v, int i) +__forceinline uint32_t __btc(const uint32_t v, uint32_t i) { - int r = 0; + uint32_t r = 0; asm("btc %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); return r; } -__forceinline int __bts(int v, int i) +# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ + !(defined(__ILP32__) && defined(__x86_64__)) +__forceinline uint64_t __bsf(const uint64_t v) { - int r = 0; - asm("bts %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline int __btr(int v, int i) -{ - int r = 0; - asm("btr %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t __bsf(size_t v) -{ - size_t r = 0; + uint64_t r = 0; asm("bsf %1,%0" : "=r"(r) : "r"(v)); return r; } -# endif +# endif -__forceinline unsigned int __bsf(unsigned int v) +__forceinline uint64_t __bsr(const uint64_t v) { - unsigned int r = 0; - asm("bsf %1,%0" : "=r"(r) : "r"(v)); - return r; -} - -__forceinline size_t __bsr(size_t v) -{ - size_t r = 0; + uint64_t r = 0; asm("bsr %1,%0" : "=r"(r) : "r"(v)); return r; } -__forceinline size_t __btc(size_t v, size_t i) +__forceinline uint64_t __btc(const uint64_t v, const uint64_t i) { - size_t r = 0; + uint64_t r = 0; asm("btc %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); return r; } -__forceinline size_t __bts(size_t v, size_t i) +__forceinline uint32_t bitscan(uint32_t v) { - size_t r = 0; - asm("bts %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline size_t __btr(size_t v, size_t i) -{ - size_t r = 0; - asm("btr %1,%0" : "=r"(r) : "r"(i), "0"(v) : "flags"); - return r; -} - -__forceinline int bitscan(int v) -{ -# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_AVX2__) return _tzcnt_u32(v); -# else +# else return __bsf(v); -# endif +# endif } -__forceinline unsigned int bitscan(unsigned int v) +# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ + !(defined(__ILP32__) && defined(__x86_64__)) +__forceinline uint64_t bitscan(uint64_t v) { -# if defined(__KERNEL_AVX2__) - return _tzcnt_u32(v); -# else - return __bsf(v); -# endif -} - -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t bitscan(size_t v) -{ -# if defined(__KERNEL_AVX2__) -# if defined(__KERNEL_64_BIT__) +# if defined(__KERNEL_AVX2__) +# if defined(__KERNEL_64_BIT__) return _tzcnt_u64(v); -# else +# else return _tzcnt_u32(v); -# endif -# else +# endif +# else return __bsf(v); -# endif +# endif } -# endif +# endif -__forceinline int clz(const int x) +#else +/* Intrinsic functions fallback for arbitrary processor. */ +__forceinline uint32_t __bsf(const uint32_t x) { -# if defined(__KERNEL_AVX2__) - return _lzcnt_u32(x); -# else - if (UNLIKELY(x == 0)) - return 32; - return 31 - __bsr(x); -# endif + for (int i = 0; i < 32; i++) { + if (x & (1U << i)) + return i; + } + return 32; } -__forceinline int __bscf(int &v) +__forceinline uint32_t __bsr(const uint32_t x) { - int i = bitscan(v); -# if defined(__KERNEL_AVX2__) - v &= v - 1; -# else - v = __btc(v, i); -# endif - return i; + for (int i = 0; i < 32; i++) { + if (x & (1U << (31 - i))) + return (31 - i); + } + return 32; } -__forceinline unsigned int __bscf(unsigned int &v) +__forceinline uint32_t __btc(const uint32_t x, const uint32_t bit) { - unsigned int i = bitscan(v); - v &= v - 1; - return i; + uint32_t mask = 1U << bit; + return x & (~mask); } -# if (defined(__KERNEL_64_BIT__) || defined(__APPLE__)) && \ - !(defined(__ILP32__) && defined(__x86_64__)) -__forceinline size_t __bscf(size_t &v) +__forceinline uint32_t __bsf(const uint64_t x) { - size_t i = bitscan(v); -# if defined(__KERNEL_AVX2__) - v &= v - 1; -# else - v = __btc(v, i); -# endif - return i; + for (int i = 0; i < 64; i++) { + if (x & (1UL << i)) + return i; + } + return 64; } -# endif -# endif /* _WIN32 */ +__forceinline uint32_t __bsr(const uint64_t x) +{ + for (int i = 0; i < 64; i++) { + if (x & (1UL << (63 - i))) + return (63 - i); + } + return 64; +} + +__forceinline uint64_t __btc(const uint64_t x, const uint32_t bit) +{ + uint64_t mask = 1UL << bit; + return x & (~mask); +} + +__forceinline uint32_t bitscan(uint32_t value) +{ + assert(value != 0); + uint32_t bit = 0; + while ((value & (1 << bit)) == 0) { + ++bit; + } + return bit; +} + +__forceinline uint64_t bitscan(uint64_t value) +{ + assert(value != 0); + uint64_t bit = 0; + while ((value & (1 << bit)) == 0) { + ++bit; + } + return bit; +} + +#endif /* Intrinsics */ + +/* SSE compatibility. + * + * Various utilities to smooth over differences between SSE versions and + * implementations. */ +#ifdef __KERNEL_SSE2__ /* Test __KERNEL_SSE41__ for MSVC which does not define __SSE4_1__, and test * __SSE4_1__ to avoid OpenImageIO conflicts with our emulation macros on other * platforms when compiling code outside the kernel. */ -# if !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) +# if !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) /* Emulation of SSE4 functions with SSE2 */ -# define _MM_FROUND_TO_NEAREST_INT 0x00 -# define _MM_FROUND_TO_NEG_INF 0x01 -# define _MM_FROUND_TO_POS_INF 0x02 -# define _MM_FROUND_TO_ZERO 0x03 -# define _MM_FROUND_CUR_DIRECTION 0x04 +# define _MM_FROUND_TO_NEAREST_INT 0x00 +# define _MM_FROUND_TO_NEG_INF 0x01 +# define _MM_FROUND_TO_POS_INF 0x02 +# define _MM_FROUND_TO_ZERO 0x03 +# define _MM_FROUND_CUR_DIRECTION 0x04 -# undef _mm_blendv_ps -# define _mm_blendv_ps _mm_blendv_ps_emu +# undef _mm_blendv_ps +# define _mm_blendv_ps _mm_blendv_ps_emu __forceinline __m128 _mm_blendv_ps_emu(__m128 value, __m128 input, __m128 mask) { __m128i isignmask = _mm_set1_epi32(0x80000000); @@ -503,37 +399,37 @@ __forceinline __m128 _mm_blendv_ps_emu(__m128 value, __m128 input, __m128 mask) return _mm_or_ps(_mm_and_ps(cmpmask, input), _mm_andnot_ps(cmpmask, value)); } -# undef _mm_blend_ps -# define _mm_blend_ps _mm_blend_ps_emu +# undef _mm_blend_ps +# define _mm_blend_ps _mm_blend_ps_emu __forceinline __m128 _mm_blend_ps_emu(__m128 value, __m128 input, const int mask) { assert(mask < 0x10); return _mm_blendv_ps(value, input, _mm_lookupmask_ps[mask]); } -# undef _mm_blendv_epi8 -# define _mm_blendv_epi8 _mm_blendv_epi8_emu +# undef _mm_blendv_epi8 +# define _mm_blendv_epi8 _mm_blendv_epi8_emu __forceinline __m128i _mm_blendv_epi8_emu(__m128i value, __m128i input, __m128i mask) { return _mm_or_si128(_mm_and_si128(mask, input), _mm_andnot_si128(mask, value)); } -# undef _mm_min_epi32 -# define _mm_min_epi32 _mm_min_epi32_emu +# undef _mm_min_epi32 +# define _mm_min_epi32 _mm_min_epi32_emu __forceinline __m128i _mm_min_epi32_emu(__m128i value, __m128i input) { return _mm_blendv_epi8(input, value, _mm_cmplt_epi32(value, input)); } -# undef _mm_max_epi32 -# define _mm_max_epi32 _mm_max_epi32_emu +# undef _mm_max_epi32 +# define _mm_max_epi32 _mm_max_epi32_emu __forceinline __m128i _mm_max_epi32_emu(__m128i value, __m128i input) { return _mm_blendv_epi8(value, input, _mm_cmplt_epi32(value, input)); } -# undef _mm_extract_epi32 -# define _mm_extract_epi32 _mm_extract_epi32_emu +# undef _mm_extract_epi32 +# define _mm_extract_epi32 _mm_extract_epi32_emu __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) { switch (index) { @@ -551,8 +447,8 @@ __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) } } -# undef _mm_insert_epi32 -# define _mm_insert_epi32 _mm_insert_epi32_emu +# undef _mm_insert_epi32 +# define _mm_insert_epi32 _mm_insert_epi32_emu __forceinline __m128i _mm_insert_epi32_emu(__m128i value, int input, const int index) { assert(index >= 0 && index < 4); @@ -560,8 +456,8 @@ __forceinline __m128i _mm_insert_epi32_emu(__m128i value, int input, const int i return value; } -# undef _mm_insert_ps -# define _mm_insert_ps _mm_insert_ps_emu +# undef _mm_insert_ps +# define _mm_insert_ps _mm_insert_ps_emu __forceinline __m128 _mm_insert_ps_emu(__m128 value, __m128 input, const int index) { assert(index < 0x100); @@ -569,8 +465,8 @@ __forceinline __m128 _mm_insert_ps_emu(__m128 value, __m128 input, const int ind return _mm_andnot_ps(_mm_lookupmask_ps[index & 0xf], value); } -# undef _mm_round_ps -# define _mm_round_ps _mm_round_ps_emu +# undef _mm_round_ps +# define _mm_round_ps _mm_round_ps_emu __forceinline __m128 _mm_round_ps_emu(__m128 value, const int flags) { switch (flags) { @@ -586,51 +482,23 @@ __forceinline __m128 _mm_round_ps_emu(__m128 value, const int flags) return value; } -# endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */ +# endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */ /* Older GCC versions do not have _mm256_cvtss_f32 yet, so define it ourselves. * _mm256_castps256_ps128 generates no instructions so this is just as efficient. */ -# if defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) -# undef _mm256_cvtss_f32 -# define _mm256_cvtss_f32(a) (_mm_cvtss_f32(_mm256_castps256_ps128(a))) -# endif +# if defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) +# undef _mm256_cvtss_f32 +# define _mm256_cvtss_f32(a) (_mm_cvtss_f32(_mm256_castps256_ps128(a))) +# endif -# else /* __KERNEL_SSE2__ */ - -/* This section is for utility functions which operates on non-register data - * which might be used from a non-vectorized code. - */ - -ccl_device_inline int bitscan(int value) -{ - assert(value != 0); - int bit = 0; - while ((value & (1 << bit)) == 0) { - ++bit; - } - return bit; -} - -ccl_device_inline int __bsr(int value) -{ - assert(value != 0); - int bit = 0; - while (value >>= 1) { - ++bit; - } - return bit; -} - -# endif /* __KERNEL_SSE2__ */ +#endif /* __KERNEL_SSE2__ */ /* quiet unused define warnings */ -# if defined(__KERNEL_SSE2__) || defined(__KERNEL_SSE3__) || defined(__KERNEL_SSSE3__) || \ - defined(__KERNEL_SSE41__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) +#if defined(__KERNEL_SSE2__) || defined(__KERNEL_SSE3__) || defined(__KERNEL_SSSE3__) || \ + defined(__KERNEL_SSE41__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) /* do nothing */ -# endif +#endif CCL_NAMESPACE_END -#endif /* __KERNEL_GPU__ */ - #endif /* __UTIL_SIMD_TYPES_H__ */ diff --git a/intern/cycles/util/util_sseb.h b/intern/cycles/util/util_sseb.h index 56f8f676ba1..edf13e0c493 100644 --- a/intern/cycles/util/util_sseb.h +++ b/intern/cycles/util/util_sseb.h @@ -258,12 +258,12 @@ template __forceinline const sseb insert(const sseb &a, const bool b //////////////////////////////////////////////////////////////////////////////// # if defined(__KERNEL_SSE41__) -__forceinline size_t popcnt(const sseb &a) +__forceinline uint32_t popcnt(const sseb &a) { - return __popcnt(_mm_movemask_ps(a)); + return _mm_popcnt_u32(_mm_movemask_ps(a)); } # else -__forceinline size_t popcnt(const sseb &a) +__forceinline uint32_t popcnt(const sseb &a) { return bool(a[0]) + bool(a[1]) + bool(a[2]) + bool(a[3]); } @@ -290,7 +290,7 @@ __forceinline bool none(const sseb &b) return _mm_movemask_ps(b) == 0x0; } -__forceinline size_t movemask(const sseb &a) +__forceinline uint32_t movemask(const sseb &a) { return _mm_movemask_ps(a); } diff --git a/intern/cycles/util/util_ssef.h b/intern/cycles/util/util_ssef.h index e9f0efb4efb..b14640ced40 100644 --- a/intern/cycles/util/util_ssef.h +++ b/intern/cycles/util/util_ssef.h @@ -730,27 +730,27 @@ __forceinline float reduce_add(const ssef &v) return _mm_cvtss_f32(vreduce_add(v)); } -__forceinline size_t select_min(const ssef &v) +__forceinline uint32_t select_min(const ssef &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const ssef &v) +__forceinline uint32_t select_max(const ssef &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const sseb &valid, const ssef &v) +__forceinline uint32_t select_min(const sseb &valid, const ssef &v) { const ssef a = select(valid, v, ssef(pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const sseb &valid, const ssef &v) +__forceinline uint32_t select_max(const sseb &valid, const ssef &v) { const ssef a = select(valid, v, ssef(neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); } -__forceinline size_t movemask(const ssef &a) +__forceinline uint32_t movemask(const ssef &a) { return _mm_movemask_ps(a); } diff --git a/intern/cycles/util/util_ssei.h b/intern/cycles/util/util_ssei.h index e2bf81310cc..c03ab18a6df 100644 --- a/intern/cycles/util/util_ssei.h +++ b/intern/cycles/util/util_ssei.h @@ -516,21 +516,21 @@ __forceinline int reduce_add(const ssei &v) return extract<0>(vreduce_add(v)); } -__forceinline size_t select_min(const ssei &v) +__forceinline uint32_t select_min(const ssei &v) { return __bsf(movemask(v == vreduce_min(v))); } -__forceinline size_t select_max(const ssei &v) +__forceinline uint32_t select_max(const ssei &v) { return __bsf(movemask(v == vreduce_max(v))); } -__forceinline size_t select_min(const sseb &valid, const ssei &v) +__forceinline uint32_t select_min(const sseb &valid, const ssei &v) { const ssei a = select(valid, v, ssei((int)pos_inf)); return __bsf(movemask(valid & (a == vreduce_min(a)))); } -__forceinline size_t select_max(const sseb &valid, const ssei &v) +__forceinline uint32_t select_max(const sseb &valid, const ssei &v) { const ssei a = select(valid, v, ssei((int)neg_inf)); return __bsf(movemask(valid & (a == vreduce_max(a)))); diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h index fc80fa9696c..87358877e3c 100644 --- a/intern/cycles/util/util_types.h +++ b/intern/cycles/util/util_types.h @@ -23,7 +23,7 @@ /* Standard Integer Types */ -#if !defined(__KERNEL_GPU__) && !defined(_WIN32) +#if !defined(__KERNEL_GPU__) # include #endif @@ -57,25 +57,6 @@ typedef unsigned long uint64_t; #endif #ifndef __KERNEL_GPU__ -# ifdef _WIN32 -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef signed short int16_t; -typedef unsigned short uint16_t; - -typedef signed int int32_t; -typedef unsigned int uint32_t; - -typedef long long int64_t; -typedef unsigned long long uint64_t; -# ifdef __KERNEL_64_BIT__ -typedef int64_t ssize_t; -# else -typedef int32_t ssize_t; -# endif -# endif /* _WIN32 */ - /* Generic Memory Pointer */ typedef uint64_t device_ptr; From 68dd7617d705dd255b29b99074afa107ce38031e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 17 Feb 2021 01:47:18 +0100 Subject: [PATCH 251/519] Cycles: add utility functions for zero float2/float3/float4/transform Ref D8237, T78710 --- intern/cycles/app/cycles_xml.cpp | 6 +- intern/cycles/blender/blender_camera.cpp | 2 +- intern/cycles/blender/blender_curves.cpp | 8 +- intern/cycles/blender/blender_mesh.cpp | 4 +- intern/cycles/blender/blender_object.cpp | 4 +- intern/cycles/blender/blender_shader.cpp | 4 +- intern/cycles/blender/blender_texture.cpp | 4 +- intern/cycles/bvh/bvh_build.cpp | 2 +- intern/cycles/kernel/kernel_accumulate.h | 104 ++++---- intern/cycles/kernel/kernel_bake.h | 14 +- intern/cycles/kernel/kernel_camera.h | 6 +- intern/cycles/kernel/kernel_differential.h | 4 +- intern/cycles/kernel/kernel_emission.h | 16 +- .../cycles/kernel/kernel_light_background.h | 2 +- intern/cycles/kernel/kernel_montecarlo.h | 2 +- intern/cycles/kernel/kernel_passes.h | 6 +- intern/cycles/kernel/kernel_path.h | 8 +- intern/cycles/kernel/kernel_path_branched.h | 2 +- intern/cycles/kernel/kernel_path_state.h | 4 +- intern/cycles/kernel/kernel_projection.h | 8 +- intern/cycles/kernel/kernel_shader.h | 66 +++-- intern/cycles/kernel/kernel_shadow.h | 6 +- intern/cycles/kernel/kernel_subsurface.h | 10 +- intern/cycles/kernel/kernel_volume.h | 50 ++-- intern/cycles/render/camera.cpp | 12 +- intern/cycles/render/constant_fold.cpp | 8 +- intern/cycles/render/graph.cpp | 2 +- intern/cycles/render/hair.cpp | 2 +- intern/cycles/render/light.cpp | 12 +- intern/cycles/render/mesh.cpp | 6 +- intern/cycles/render/mesh_displace.cpp | 6 +- intern/cycles/render/mesh_subdivision.cpp | 12 +- intern/cycles/render/nodes.cpp | 235 ++++++++---------- intern/cycles/render/object.cpp | 12 +- intern/cycles/render/shader.cpp | 2 +- intern/cycles/subd/subd_subpatch.h | 4 +- .../test/render_graph_finalize_test.cpp | 13 +- intern/cycles/test/util_transform_test.cpp | 4 +- intern/cycles/util/util_color.h | 6 +- intern/cycles/util/util_math_float2.h | 12 +- intern/cycles/util/util_math_float3.h | 19 +- intern/cycles/util/util_math_float4.h | 16 +- intern/cycles/util/util_projection.h | 2 +- intern/cycles/util/util_transform.h | 6 + 44 files changed, 369 insertions(+), 364 deletions(-) diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index 272d509585e..d2aecf75121 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -564,19 +564,19 @@ static void xml_read_transform(xml_node node, Transform &tfm) } if (node.attribute("translate")) { - float3 translate = make_float3(0.0f, 0.0f, 0.0f); + float3 translate = zero_float3(); xml_read_float3(&translate, node, "translate"); tfm = tfm * transform_translate(translate); } if (node.attribute("rotate")) { - float4 rotate = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + float4 rotate = zero_float4(); xml_read_float4(&rotate, node, "rotate"); tfm = tfm * transform_rotate(DEG2RADF(rotate.x), make_float3(rotate.y, rotate.z, rotate.w)); } if (node.attribute("scale")) { - float3 scale = make_float3(0.0f, 0.0f, 0.0f); + float3 scale = zero_float3(); xml_read_float3(&scale, node, "scale"); tfm = tfm * transform_scale(scale); } diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index c1da9f1983f..b31841801d8 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -112,7 +112,7 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings &b_rende bcam->focaldistance = 10.0f; bcam->zoom = 1.0f; - bcam->pixelaspect = make_float2(1.0f, 1.0f); + bcam->pixelaspect = one_float2(); bcam->aperture_ratio = 1.0f; bcam->sensor_width = 36.0f; diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 4fb5c7f57d1..7fe49a6c63b 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -121,8 +121,8 @@ static bool ObtainCacheParticleData( CData->curve_firstkey.push_back_slow(keyno); float curve_length = 0.0f; - float3 prev_co_world = make_float3(0.0f, 0.0f, 0.0f); - float3 prev_co_object = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_co_world = zero_float3(); + float3 prev_co_object = zero_float3(); for (int step_no = 0; step_no < ren_step; step_no++) { float3 co_world = prev_co_world; b_psys.co_hair(*b_ob, pa_no, step_no, &co_world.x); @@ -197,7 +197,7 @@ static bool ObtainCacheParticleUV(Hair *hair, BL::Mesh::uv_layers_iterator l; b_mesh->uv_layers.begin(l); - float2 uv = make_float2(0.0f, 0.0f); + float2 uv = zero_float2(); if (b_mesh->uv_layers.length()) b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x); CData->curve_uv.push_back_slow(uv); @@ -678,7 +678,7 @@ static void export_hair_curves(Scene *scene, Hair *hair, BL::Hair b_hair) const int first_point_index = b_curve.first_point_index(); const int num_points = b_curve.num_points(); - float3 prev_co = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_co = zero_float3(); float length = 0.0f; if (attr_intercept) { points_length.clear(); diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index e2b18c22d95..14bdcd843e9 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -716,7 +716,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b /* STEP 2: Calculate vertex normals taking into account their possible * duplicates which gets "welded" together. */ - vector vert_normal(num_verts, make_float3(0.0f, 0.0f, 0.0f)); + vector vert_normal(num_verts, zero_float3()); /* First we accumulate all vertex normals in the original index. */ for (int vert_index = 0; vert_index < num_verts; ++vert_index) { const float3 normal = get_float3(b_mesh.vertices[vert_index].normal()); @@ -733,7 +733,7 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b /* STEP 3: Calculate pointiness using single ring neighborhood. */ vector counter(num_verts, 0); vector raw_data(num_verts, 0.0f); - vector edge_accum(num_verts, make_float3(0.0f, 0.0f, 0.0f)); + vector edge_accum(num_verts, zero_float3()); BL::Mesh::edges_iterator e; EdgeMap visited_edges; int edge_index = 0; diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index f0460b129c2..54128cf82fc 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -323,8 +323,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, object->set_random_id(b_instance.random_id()); } else { - object->set_dupli_generated(make_float3(0.0f, 0.0f, 0.0f)); - object->set_dupli_uv(make_float2(0.0f, 0.0f)); + object->set_dupli_generated(zero_float3()); + object->set_dupli_uv(zero_float2()); object->set_random_id(hash_uint2(hash_string(object->name.c_str()), 0)); } diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 02a6638b083..a1ab5277744 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -1404,7 +1404,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, world_color = get_float3(b_world.color()); } else { - world_color = make_float3(0.0f, 0.0f, 0.0f); + world_color = zero_float3(); } BackgroundNode *background = graph->create_node(); @@ -1535,7 +1535,7 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all) } else { EmissionNode *emission = graph->create_node(); - emission->set_color(make_float3(1.0f, 1.0f, 1.0f)); + emission->set_color(one_float3()); emission->set_strength(1.0f); graph->add(emission); diff --git a/intern/cycles/blender/blender_texture.cpp b/intern/cycles/blender/blender_texture.cpp index 7b05f361a29..0d593f2b385 100644 --- a/intern/cycles/blender/blender_texture.cpp +++ b/intern/cycles/blender/blender_texture.cpp @@ -43,8 +43,8 @@ void point_density_texture_space(BL::Depsgraph &b_depsgraph, { BL::Object b_ob(b_point_density_node.object()); if (!b_ob) { - loc = make_float3(0.0f, 0.0f, 0.0f); - size = make_float3(0.0f, 0.0f, 0.0f); + loc = zero_float3(); + size = zero_float3(); return; } float3 min, max; diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp index ec85cef0851..048c2b95e40 100644 --- a/intern/cycles/bvh/bvh_build.cpp +++ b/intern/cycles/bvh/bvh_build.cpp @@ -360,7 +360,7 @@ void BVHBuild::add_references(BVHRange &root) /* happens mostly on empty meshes */ if (!bounds.valid()) - bounds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bounds.grow(zero_float3()); root = BVHRange(bounds, center, 0, references.size()); } diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h index 7a57a2f33ff..76e0f2be02c 100644 --- a/intern/cycles/kernel/kernel_accumulate.h +++ b/intern/cycles/kernel/kernel_accumulate.h @@ -32,11 +32,11 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, eval->use_light_pass = use_light_pass; if (eval->use_light_pass) { - eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); - eval->glossy = make_float3(0.0f, 0.0f, 0.0f); - eval->transmission = make_float3(0.0f, 0.0f, 0.0f); - eval->transparent = make_float3(0.0f, 0.0f, 0.0f); - eval->volume = make_float3(0.0f, 0.0f, 0.0f); + eval->diffuse = zero_float3(); + eval->glossy = zero_float3(); + eval->transmission = zero_float3(); + eval->transparent = zero_float3(); + eval->volume = zero_float3(); if (type == CLOSURE_BSDF_TRANSPARENT_ID) eval->transparent = value; @@ -55,7 +55,7 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, eval->diffuse = value; } #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis = make_float3(0.0f, 0.0f, 0.0f); + eval->sum_no_mis = zero_float3(); #endif } @@ -174,55 +174,55 @@ ccl_device_inline void path_radiance_init(KernelGlobals *kg, PathRadiance *L) L->use_light_pass = kernel_data.film.use_light_pass; if (kernel_data.film.use_light_pass) { - L->indirect = make_float3(0.0f, 0.0f, 0.0f); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect = zero_float3(); + L->direct_emission = zero_float3(); - L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->color_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->color_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->color_diffuse = zero_float3(); + L->color_glossy = zero_float3(); + L->color_transmission = zero_float3(); - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_volume = make_float3(0.0f, 0.0f, 0.0f); + L->direct_diffuse = zero_float3(); + L->direct_glossy = zero_float3(); + L->direct_transmission = zero_float3(); + L->direct_volume = zero_float3(); - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_diffuse = zero_float3(); + L->indirect_glossy = zero_float3(); + L->indirect_transmission = zero_float3(); + L->indirect_volume = zero_float3(); L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); - L->background = make_float3(0.0f, 0.0f, 0.0f); - L->ao = make_float3(0.0f, 0.0f, 0.0f); - L->shadow = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); + L->background = zero_float3(); + L->ao = zero_float3(); + L->shadow = zero_float3(); L->mist = 0.0f; - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.volume = make_float3(0.0f, 0.0f, 0.0f); - L->state.direct = make_float3(0.0f, 0.0f, 0.0f); + L->state.diffuse = zero_float3(); + L->state.glossy = zero_float3(); + L->state.transmission = zero_float3(); + L->state.volume = zero_float3(); + L->state.direct = zero_float3(); } else #endif { L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); } #ifdef __SHADOW_TRICKS__ - L->path_total = make_float3(0.0f, 0.0f, 0.0f); - L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f); - L->shadow_background_color = make_float3(0.0f, 0.0f, 0.0f); + L->path_total = zero_float3(); + L->path_total_shaded = zero_float3(); + L->shadow_background_color = zero_float3(); L->shadow_throughput = 0.0f; L->shadow_transparency = 1.0f; L->has_shadow_catcher = 0; #endif #ifdef __DENOISING_FEATURES__ - L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f); - L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f); + L->denoising_normal = zero_float3(); + L->denoising_albedo = zero_float3(); L->denoising_depth = 0.0f; #endif @@ -561,13 +561,13 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L) { #ifdef __PASSES__ if (L->use_light_pass) { - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.volume = make_float3(0.0f, 0.0f, 0.0f); + L->state.diffuse = zero_float3(); + L->state.glossy = zero_float3(); + L->state.transmission = zero_float3(); + L->state.volume = zero_float3(); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect = make_float3(0.0f, 0.0f, 0.0f); + L->direct_emission = zero_float3(); + L->indirect = zero_float3(); } #endif } @@ -642,19 +642,19 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, /* Reject invalid value */ if (!isfinite_safe(sum)) { kernel_assert(!"Non-finite sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); + L_sum = zero_float3(); - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_volume = make_float3(0.0f, 0.0f, 0.0f); + L->direct_diffuse = zero_float3(); + L->direct_glossy = zero_float3(); + L->direct_transmission = zero_float3(); + L->direct_volume = zero_float3(); - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_diffuse = zero_float3(); + L->indirect_glossy = zero_float3(); + L->indirect_transmission = zero_float3(); + L->indirect_volume = zero_float3(); - L->emission = make_float3(0.0f, 0.0f, 0.0f); + L->emission = zero_float3(); } } @@ -668,7 +668,7 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); if (!isfinite_safe(sum)) { kernel_assert(!"Non-finite final sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); + L_sum = zero_float3(); } } @@ -711,7 +711,7 @@ ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg, # undef ADD_COMPONENT #else *noisy = L->emission; - *clean = make_float3(0.0f, 0.0f, 0.0f); + *clean = zero_float3(); #endif #ifdef __SHADOW_TRICKS__ diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index ded914c05d7..bdedf0c20a8 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -23,7 +23,7 @@ ccl_device_noinline void compute_light_pass( { kernel_assert(kernel_data.film.use_light_pass); - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); /* Emission and indirect shader data memory used by various functions. */ ShaderDataTinyStorage emission_sd_storage; @@ -176,7 +176,7 @@ ccl_device_inline float3 kernel_bake_shader_bsdf(KernelGlobals *kg, return shader_bsdf_transmission(kg, sd); default: kernel_assert(!"Unknown bake type passed to BSDF evaluate"); - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -192,12 +192,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg, const bool is_color = (pass_filter & BAKE_FILTER_COLOR) != 0; const bool is_direct = (pass_filter & BAKE_FILTER_DIRECT) != 0; const bool is_indirect = (pass_filter & BAKE_FILTER_INDIRECT) != 0; - float3 out = make_float3(0.0f, 0.0f, 0.0f); + float3 out = zero_float3(); if (is_color) { if (is_direct || is_indirect) { /* Leave direct and diffuse channel colored. */ - color = make_float3(1.0f, 1.0f, 1.0f); + color = one_float3(); } else { /* surface color of the pass only */ @@ -315,7 +315,7 @@ ccl_device void kernel_bake_evaluate( if (kernel_data.bake.pass_filter & ~BAKE_FILTER_COLOR) compute_light_pass(kg, &sd, &L, rng_hash, pass_filter, sample); - float3 out = make_float3(0.0f, 0.0f, 0.0f); + float3 out = zero_float3(); ShaderEvalType type = (ShaderEvalType)kernel_data.bake.type; switch (type) { @@ -409,7 +409,7 @@ ccl_device void kernel_bake_evaluate( /* setup ray */ Ray ray; - ray.P = make_float3(0.0f, 0.0f, 0.0f); + ray.P = zero_float3(); ray.D = normalize(P); ray.t = 0.0f; # ifdef __CAMERA_MOTION__ @@ -486,7 +486,7 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg, float u = __uint_as_float(in.x); float v = __uint_as_float(in.y); - ray.P = make_float3(0.0f, 0.0f, 0.0f); + ray.P = zero_float3(); ray.D = equirectangular_to_direction(u, v); ray.t = 0.0f; #ifdef __CAMERA_MOTION__ diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h index efe46d5b0dd..1bfac37158d 100644 --- a/intern/cycles/kernel/kernel_camera.h +++ b/intern/cycles/kernel/kernel_camera.h @@ -71,7 +71,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, } #endif - float3 P = make_float3(0.0f, 0.0f, 0.0f); + float3 P = zero_float3(); float3 D = Pcamera; /* modify ray for depth of field */ @@ -130,7 +130,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, * because we don't want to be affected by depth of field. We compute * ray origin and direction for the center and two neighboring pixels * and simply take their differences. */ - float3 Pnostereo = transform_point(&cameratoworld, make_float3(0.0f, 0.0f, 0.0f)); + float3 Pnostereo = transform_point(&cameratoworld, zero_float3()); float3 Pcenter = Pnostereo; float3 Dcenter = Pcamera; @@ -250,7 +250,7 @@ ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam, float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f)); /* create ray form raster position */ - float3 P = make_float3(0.0f, 0.0f, 0.0f); + float3 P = zero_float3(); float3 D = panorama_to_direction(cam, Pcamera.x, Pcamera.y); /* indicates ray should not receive any light, outside of the lens */ diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h index 8513de0d843..3ec0cdbaccc 100644 --- a/intern/cycles/kernel/kernel_differential.h +++ b/intern/cycles/kernel/kernel_differential.h @@ -106,8 +106,8 @@ ccl_device differential differential_zero() ccl_device differential3 differential3_zero() { differential3 d; - d.dx = make_float3(0.0f, 0.0f, 0.0f); - d.dy = make_float3(0.0f, 0.0f, 0.0f); + d.dx = zero_float3(); + d.dy = zero_float3(); return d; } diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 4ac07d86dda..96ecc624067 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -27,7 +27,7 @@ ccl_device_noinline_cpu float3 direct_emissive_eval(KernelGlobals *kg, float time) { /* setup shading at emitter */ - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); if (shader_constant_emission_eval(kg, ls->shader, &eval)) { if ((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) { @@ -146,13 +146,13 @@ ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg, /* use visibility flag to skip lights */ if (ls->shader & SHADER_EXCLUDE_ANY) { if (ls->shader & SHADER_EXCLUDE_DIFFUSE) - eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); + eval->diffuse = zero_float3(); if (ls->shader & SHADER_EXCLUDE_GLOSSY) - eval->glossy = make_float3(0.0f, 0.0f, 0.0f); + eval->glossy = zero_float3(); if (ls->shader & SHADER_EXCLUDE_TRANSMIT) - eval->transmission = make_float3(0.0f, 0.0f, 0.0f); + eval->transmission = zero_float3(); if (ls->shader & SHADER_EXCLUDE_SCATTER) - eval->volume = make_float3(0.0f, 0.0f, 0.0f); + eval->volume = zero_float3(); } #endif @@ -266,7 +266,7 @@ ccl_device_noinline_cpu void indirect_lamp_emission(KernelGlobals *kg, /* shadow attenuation */ Ray volume_ray = *ray; volume_ray.t = ls.t; - float3 volume_tp = make_float3(1.0f, 1.0f, 1.0f); + float3 volume_tp = one_float3(); kernel_volume_shadow(kg, emission_sd, state, &volume_ray, &volume_tp); lamp_L *= volume_tp; } @@ -303,11 +303,11 @@ ccl_device_noinline_cpu float3 indirect_background(KernelGlobals *kg, ((shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)) || ((shader & SHADER_EXCLUDE_CAMERA) && (state->flag & PATH_RAY_CAMERA)) || ((shader & SHADER_EXCLUDE_SCATTER) && (state->flag & PATH_RAY_VOLUME_SCATTER))) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } /* Evaluate background shader. */ - float3 L = make_float3(0.0f, 0.0f, 0.0f); + float3 L = zero_float3(); if (!shader_constant_emission_eval(kg, shader, &L)) { # ifdef __SPLIT_KERNEL__ Ray priv_ray = *ray; diff --git a/intern/cycles/kernel/kernel_light_background.h b/intern/cycles/kernel/kernel_light_background.h index 2a685c0adfa..f0f64ce8704 100644 --- a/intern/cycles/kernel/kernel_light_background.h +++ b/intern/cycles/kernel/kernel_light_background.h @@ -277,7 +277,7 @@ ccl_device float3 background_portal_sample(KernelGlobals *kg, portal--; } - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } ccl_device_inline float3 background_sun_sample(KernelGlobals *kg, diff --git a/intern/cycles/kernel/kernel_montecarlo.h b/intern/cycles/kernel/kernel_montecarlo.h index 0edcc1a5a14..ce37bd0b15e 100644 --- a/intern/cycles/kernel/kernel_montecarlo.h +++ b/intern/cycles/kernel/kernel_montecarlo.h @@ -154,7 +154,7 @@ ccl_device float2 concentric_sample_disk(float u1, float u2) float b = 2.0f * u2 - 1.0f; if (a == 0.0f && b == 0.0f) { - return make_float2(0.0f, 0.0f); + return zero_float2(); } else if (a * a > b * b) { r = a; diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 239c01fc57a..52be2ed87b7 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -59,9 +59,9 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg, return; } - float3 normal = make_float3(0.0f, 0.0f, 0.0f); - float3 diffuse_albedo = make_float3(0.0f, 0.0f, 0.0f); - float3 specular_albedo = make_float3(0.0f, 0.0f, 0.0f); + float3 normal = zero_float3(); + float3 diffuse_albedo = zero_float3(); + float3 specular_albedo = zero_float3(); float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f; for (int i = 0; i < sd->num_closure; i++) { diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index c332d5ad3ec..5681510fc25 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -267,7 +267,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg, if (state->flag & PATH_RAY_TRANSPARENT_BACKGROUND) { state->flag |= (PATH_RAY_SHADOW_CATCHER | PATH_RAY_STORE_SHADOW_INFO); - float3 bg = make_float3(0.0f, 0.0f, 0.0f); + float3 bg = zero_float3(); if (!kernel_data.background.transparent) { bg = indirect_background(kg, emission_sd, state, NULL, ray); } @@ -288,7 +288,7 @@ ccl_device_forceinline bool kernel_path_shader_apply(KernelGlobals *kg, if (kernel_data.background.transparent) { L->transparent += average(holdout_weight * throughput); } - if (isequal_float3(holdout_weight, make_float3(1.0f, 1.0f, 1.0f))) { + if (isequal_float3(holdout_weight, one_float3())) { return false; } } @@ -460,7 +460,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, # ifdef __AO__ /* ambient occlusion */ if (kernel_data.integrator.use_ambient_occlusion) { - kernel_path_ao(kg, sd, emission_sd, L, state, throughput, make_float3(0.0f, 0.0f, 0.0f)); + kernel_path_ao(kg, sd, emission_sd, L, state, throughput, zero_float3()); } # endif /* __AO__ */ @@ -670,7 +670,7 @@ ccl_device void kernel_path_trace( } /* Initialize state. */ - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); PathRadiance L; path_radiance_init(kg, &L); diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h index 9ce7a147369..5ea7687ec3b 100644 --- a/intern/cycles/kernel/kernel_path_branched.h +++ b/intern/cycles/kernel/kernel_path_branched.h @@ -374,7 +374,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg, PathRadiance *L) { /* initialize */ - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); path_radiance_init(kg, L); diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h index c389c815ae2..bf601580cd0 100644 --- a/intern/cycles/kernel/kernel_path_state.h +++ b/intern/cycles/kernel/kernel_path_state.h @@ -41,11 +41,11 @@ ccl_device_inline void path_state_init(KernelGlobals *kg, if (kernel_data.film.pass_denoising_data) { state->flag |= PATH_RAY_STORE_SHADOW_INFO; state->denoising_feature_weight = 1.0f; - state->denoising_feature_throughput = make_float3(1.0f, 1.0f, 1.0f); + state->denoising_feature_throughput = one_float3(); } else { state->denoising_feature_weight = 0.0f; - state->denoising_feature_throughput = make_float3(0.0f, 0.0f, 0.0f); + state->denoising_feature_throughput = zero_float3(); } #endif /* __DENOISING_FEATURES__ */ diff --git a/intern/cycles/kernel/kernel_projection.h b/intern/cycles/kernel/kernel_projection.h index f74ced45fd5..387af54cf27 100644 --- a/intern/cycles/kernel/kernel_projection.h +++ b/intern/cycles/kernel/kernel_projection.h @@ -56,7 +56,7 @@ ccl_device float3 spherical_to_direction(float theta, float phi) ccl_device float2 direction_to_equirectangular_range(float3 dir, float4 range) { if (is_zero(dir)) - return make_float2(0.0f, 0.0f); + return zero_float2(); float u = (atan2f(dir.y, dir.x) - range.y) / range.x; float v = (acosf(dir.z / len(dir)) - range.w) / range.z; @@ -103,7 +103,7 @@ ccl_device float3 fisheye_to_direction(float u, float v, float fov) float r = sqrtf(u * u + v * v); if (r > 1.0f) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f); float theta = r * fov * 0.5f; @@ -136,7 +136,7 @@ fisheye_equisolid_to_direction(float u, float v, float lens, float fov, float wi float r = sqrtf(u * u + v * v); if (r > rmax) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); float phi = safe_acosf((r != 0.0f) ? u / r : 0.0f); float theta = 2.0f * asinf(r / (2.0f * lens)); @@ -158,7 +158,7 @@ ccl_device float3 mirrorball_to_direction(float u, float v) dir.z = 2.0f * v - 1.0f; if (dir.x * dir.x + dir.z * dir.z > 1.0f) - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); dir.y = -sqrtf(max(1.0f - dir.x * dir.x - dir.z * dir.z, 0.0f)); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index e461e1642b6..e6bd99414cc 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -330,8 +330,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, } else { #ifdef __DPDU__ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); #endif } @@ -367,7 +367,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg, ccl_device void shader_setup_from_displace( KernelGlobals *kg, ShaderData *sd, int object, int prim, float u, float v) { - float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f); + float3 P, Ng, I = zero_float3(); int shader; triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader); @@ -419,8 +419,8 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, #ifdef __DPDU__ /* dPdu/dPdv */ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); #endif #ifdef __RAY_DIFFERENTIALS__ @@ -466,8 +466,8 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s # ifdef __DPDU__ /* dPdu/dPdv */ - sd->dPdu = make_float3(0.0f, 0.0f, 0.0f); - sd->dPdv = make_float3(0.0f, 0.0f, 0.0f); + sd->dPdu = zero_float3(); + sd->dPdv = zero_float3(); # endif # ifdef __RAY_DIFFERENTIALS__ @@ -617,8 +617,7 @@ ccl_device_inline { PROFILING_INIT(kg, PROFILING_CLOSURE_EVAL); - bsdf_eval_init( - eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass); + bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass); #ifdef __BRANCHED_PATH__ if (kernel_data.integrator.branched) @@ -757,7 +756,7 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg, kernel_assert(CLOSURE_IS_BSDF(sc->type)); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -787,7 +786,7 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, PROFILING_INIT(kg, PROFILING_CLOSURE_SAMPLE); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -831,13 +830,13 @@ ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughn ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, const ShaderData *sd) { if (sd->flag & SD_HAS_ONLY_VOLUME) { - return make_float3(1.0f, 1.0f, 1.0f); + return one_float3(); } else if (sd->flag & SD_TRANSPARENT) { return sd->closure_transparent_extinction; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -849,7 +848,7 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData * if (sc->type == CLOSURE_BSDF_TRANSPARENT_ID) { sc->sample_weight = 0.0f; - sc->weight = make_float3(0.0f, 0.0f, 0.0f); + sc->weight = zero_float3(); } } @@ -859,17 +858,17 @@ ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData * ccl_device float3 shader_bsdf_alpha(KernelGlobals *kg, ShaderData *sd) { - float3 alpha = make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd); + float3 alpha = one_float3() - shader_bsdf_transparency(kg, sd); - alpha = max(alpha, make_float3(0.0f, 0.0f, 0.0f)); - alpha = min(alpha, make_float3(1.0f, 1.0f, 1.0f)); + alpha = max(alpha, zero_float3()); + alpha = min(alpha, one_float3()); return alpha; } ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -884,7 +883,7 @@ ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -898,7 +897,7 @@ ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -912,7 +911,7 @@ ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd) { - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 N = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -925,8 +924,8 @@ ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd) ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); + float3 N = zero_float3(); for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -945,8 +944,8 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac #ifdef __SUBSURFACE__ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_) { - float3 eval = make_float3(0.0f, 0.0f, 0.0f); - float3 N = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); + float3 N = zero_float3(); float texture_blur = 0.0f, weight_sum = 0.0f; for (int i = 0; i < sd->num_closure; i++) { @@ -999,7 +998,7 @@ ccl_device float3 shader_background_eval(ShaderData *sd) return sd->closure_emission_background; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -1011,7 +1010,7 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd) return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background; } else { - return make_float3(0.0f, 0.0f, 0.0f); + return zero_float3(); } } @@ -1019,13 +1018,13 @@ ccl_device float3 shader_emissive_eval(ShaderData *sd) ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd) { - float3 weight = make_float3(0.0f, 0.0f, 0.0f); + float3 weight = zero_float3(); /* For objects marked as holdout, preserve transparency and remove all other * closures, replacing them with a holdout weight. */ if (sd->object_flag & SD_OBJECT_HOLDOUT_MASK) { if ((sd->flag & SD_TRANSPARENT) && !(sd->flag & SD_HAS_ONLY_VOLUME)) { - weight = make_float3(1.0f, 1.0f, 1.0f) - sd->closure_transparent_extinction; + weight = one_float3() - sd->closure_transparent_extinction; for (int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; @@ -1037,7 +1036,7 @@ ccl_device float3 shader_holdout_apply(KernelGlobals *kg, ShaderData *sd) sd->flag &= ~(SD_CLOSURE_FLAGS - (SD_TRANSPARENT | SD_BSDF)); } else { - weight = make_float3(1.0f, 1.0f, 1.0f); + weight = one_float3(); } } else { @@ -1150,8 +1149,7 @@ ccl_device void shader_volume_phase_eval( { PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL); - bsdf_eval_init( - eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass); + bsdf_eval_init(eval, NBUILTIN_CLOSURES, zero_float3(), kernel_data.film.use_light_pass); _shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f); } @@ -1209,7 +1207,7 @@ ccl_device int shader_volume_phase_sample(KernelGlobals *kg, * depending on color channels, even if this is perhaps not a common case */ const ShaderClosure *sc = &sd->closure[sampled]; int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); @@ -1234,7 +1232,7 @@ ccl_device int shader_phase_sample_closure(KernelGlobals *kg, PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_SAMPLE); int label; - float3 eval = make_float3(0.0f, 0.0f, 0.0f); + float3 eval = zero_float3(); *pdf = 0.0f; label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); diff --git a/intern/cycles/kernel/kernel_shadow.h b/intern/cycles/kernel/kernel_shadow.h index 07043e6a769..3b124122fba 100644 --- a/intern/cycles/kernel/kernel_shadow.h +++ b/intern/cycles/kernel/kernel_shadow.h @@ -165,7 +165,7 @@ ccl_device bool shadow_blocked_transparent_all_loop(KernelGlobals *kg, * shade them. */ if (!blocked && num_hits > 0) { - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); float3 Pend = ray->P + ray->D * ray->t; float last_t = 0.0f; int bounce = state->transparent_bounce; @@ -305,7 +305,7 @@ ccl_device bool shadow_blocked_transparent_stepped_loop(KernelGlobals *kg, # endif # endif if (blocked && is_transparent_isect) { - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); float3 Pend = ray->P + ray->D * ray->t; int bounce = state->transparent_bounce; # ifdef __VOLUME__ @@ -390,7 +390,7 @@ ccl_device_inline bool shadow_blocked(KernelGlobals *kg, Ray *ray, float3 *shadow) { - *shadow = make_float3(1.0f, 1.0f, 1.0f); + *shadow = one_float3(); #if !defined(__KERNEL_OPTIX__) /* Some common early checks. * Avoid conditional trace call in OptiX though, since those hurt performance there. diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index d8258a8336c..55bbe7f95db 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -27,7 +27,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f { /* this is the veach one-sample model with balance heuristic, some pdf * factors drop out when using balance heuristic weighting */ - float3 eval_sum = make_float3(0.0f, 0.0f, 0.0f); + float3 eval_sum = zero_float3(); float pdf_sum = 0.0f; float sample_weight_inv = 0.0f; @@ -62,7 +62,7 @@ subsurface_scatter_eval(ShaderData *sd, const ShaderClosure *sc, float disk_r, f } } - return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : make_float3(0.0f, 0.0f, 0.0f); + return (pdf_sum > 0.0f) ? eval_sum / pdf_sum : zero_float3(); } /* replace closures with a single diffuse bsdf closure after scatter step */ @@ -107,7 +107,7 @@ ccl_device void subsurface_scatter_setup_diffuse_bsdf( /* optionally do blurring of color and/or bump mapping, at the cost of a shader evaluation */ ccl_device float3 subsurface_color_pow(float3 color, float exponent) { - color = max(color, make_float3(0.0f, 0.0f, 0.0f)); + color = max(color, zero_float3()); if (exponent == 1.0f) { /* nothing to do */ @@ -243,7 +243,7 @@ ccl_device_inline int subsurface_scatter_disk(KernelGlobals *kg, } #endif /* __OBJECT_MOTION__ */ else { - ss_isect->weight[hit] = make_float3(0.0f, 0.0f, 0.0f); + ss_isect->weight[hit] = zero_float3(); continue; } @@ -450,7 +450,7 @@ ccl_device_noinline /* Convert subsurface to volume coefficients. * The single-scattering albedo is named alpha to avoid confusion with the surface albedo. */ float3 sigma_t, alpha; - float3 throughput = make_float3(1.0f, 1.0f, 1.0f); + float3 throughput = one_float3(); subsurface_random_walk_coefficients(sc, &sigma_t, &alpha, &throughput); float3 sigma_s = sigma_t * alpha; diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index fdf712293e7..2e73da166b9 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -70,11 +70,9 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals *kg, if (!(sd->flag & (SD_EXTINCTION | SD_SCATTER | SD_EMISSION))) return false; - coeff->sigma_s = make_float3(0.0f, 0.0f, 0.0f); - coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : - make_float3(0.0f, 0.0f, 0.0f); - coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : - make_float3(0.0f, 0.0f, 0.0f); + coeff->sigma_s = zero_float3(); + coeff->sigma_t = (sd->flag & SD_EXTINCTION) ? sd->closure_transparent_extinction : zero_float3(); + coeff->emission = (sd->flag & SD_EMISSION) ? sd->closure_emission_background : zero_float3(); if (sd->flag & SD_SCATTER) { for (int i = 0; i < sd->num_closure; i++) { @@ -204,7 +202,7 @@ ccl_device void kernel_volume_shadow_homogeneous(KernelGlobals *kg, ShaderData *sd, float3 *throughput) { - float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f); + float3 sigma_t = zero_float3(); if (volume_shader_extinction_sample(kg, sd, state, ray->P, &sigma_t)) *throughput *= volume_color_transmittance(sigma_t, ray->t); @@ -230,7 +228,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, /* compute extinction at the start */ float t = 0.0f; - float3 sum = make_float3(0.0f, 0.0f, 0.0f); + float3 sum = zero_float3(); for (int i = 0; i < max_steps; i++) { /* advance to new position */ @@ -243,7 +241,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, } float3 new_P = ray->P + ray->D * (t + step_offset); - float3 sigma_t = make_float3(0.0f, 0.0f, 0.0f); + float3 sigma_t = zero_float3(); /* compute attenuation over segment */ if (volume_shader_extinction_sample(kg, sd, state, new_P, &sigma_t)) { @@ -365,8 +363,7 @@ ccl_device float kernel_volume_distance_sample( float sample_t = min(max_t, -logf(1.0f - xi * (1.0f - sample_transmittance)) / sample_sigma_t); *transmittance = volume_color_transmittance(sigma_t, sample_t); - *pdf = safe_divide_color(sigma_t * *transmittance, - make_float3(1.0f, 1.0f, 1.0f) - full_transmittance); + *pdf = safe_divide_color(sigma_t * *transmittance, one_float3() - full_transmittance); /* todo: optimization: when taken together with hit/miss decision, * the full_transmittance cancels out drops out and xi does not @@ -380,8 +377,7 @@ ccl_device float3 kernel_volume_distance_pdf(float max_t, float3 sigma_t, float float3 full_transmittance = volume_color_transmittance(sigma_t, max_t); float3 transmittance = volume_color_transmittance(sigma_t, sample_t); - return safe_divide_color(sigma_t * transmittance, - make_float3(1.0f, 1.0f, 1.0f) - full_transmittance); + return safe_divide_color(sigma_t * transmittance, one_float3() - full_transmittance); } /* Emission */ @@ -508,7 +504,7 @@ kernel_volume_integrate_homogeneous(KernelGlobals *kg, /* modify pdf for hit/miss decision */ if (probalistic_scatter) - pdf *= make_float3(1.0f, 1.0f, 1.0f) - volume_color_transmittance(coeff.sigma_t, t); + pdf *= one_float3() - volume_color_transmittance(coeff.sigma_t, t); new_tp = *throughput * coeff.sigma_s * transmittance / dot(channel_pdf, pdf); t = sample_t; @@ -578,7 +574,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, /* compute coefficients at the start */ float t = 0.0f; - float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f); + float3 accum_transmittance = one_float3(); /* pick random color channel, we use the Veach one-sample * model with balance heuristic for the channels */ @@ -654,7 +650,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, new_tp = tp * transmittance; } else { - transmittance = make_float3(0.0f, 0.0f, 0.0f); + transmittance = zero_float3(); new_tp = tp; } @@ -671,7 +667,7 @@ kernel_volume_integrate_heterogeneous_distance(KernelGlobals *kg, /* stop if nearly all light blocked */ if (tp.x < tp_eps && tp.y < tp_eps && tp.z < tp_eps) { - tp = make_float3(0.0f, 0.0f, 0.0f); + tp = zero_float3(); break; } } @@ -811,10 +807,10 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, } /* init accumulation variables */ - float3 accum_emission = make_float3(0.0f, 0.0f, 0.0f); - float3 accum_transmittance = make_float3(1.0f, 1.0f, 1.0f); - float3 accum_albedo = make_float3(0.0f, 0.0f, 0.0f); - float3 cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 accum_emission = zero_float3(); + float3 accum_transmittance = one_float3(); + float3 accum_albedo = zero_float3(); + float3 cdf_distance = zero_float3(); float t = 0.0f; segment->numsteps = 0; @@ -880,8 +876,8 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, } else { /* store empty step */ - step->sigma_t = make_float3(0.0f, 0.0f, 0.0f); - step->sigma_s = make_float3(0.0f, 0.0f, 0.0f); + step->sigma_t = zero_float3(); + step->sigma_s = zero_float3(); step->closure_flag = 0; segment->numsteps++; @@ -1011,12 +1007,12 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * step = segment->steps; float prev_t = 0.0f; - float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f); + float3 step_pdf_distance = one_float3(); if (segment->numsteps > 1) { float prev_cdf = 0.0f; float step_cdf = 1.0f; - float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_cdf_distance = zero_float3(); for (int i = 0;; i++, step++) { /* todo: optimize using binary search */ @@ -1047,7 +1043,7 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * /* modify pdf for hit/miss decision */ if (probalistic_scatter) - distance_pdf *= make_float3(1.0f, 1.0f, 1.0f) - segment->accum_transmittance; + distance_pdf *= one_float3() - segment->accum_transmittance; pdf = dot(channel_pdf, distance_pdf * step_pdf_distance); @@ -1066,10 +1062,10 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(KernelGlobals * step = segment->steps; float prev_t = 0.0f; - float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f); + float3 step_pdf_distance = one_float3(); if (segment->numsteps > 1) { - float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f); + float3 prev_cdf_distance = zero_float3(); int numsteps = segment->numsteps; int high = numsteps - 1; diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 30bf6c4241a..1f932135a57 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -189,8 +189,8 @@ Camera::Camera() : Node(node_type) full_rastertocamera = projection_identity(); - dx = make_float3(0.0f, 0.0f, 0.0f); - dy = make_float3(0.0f, 0.0f, 0.0f); + dx = zero_float3(); + dy = zero_float3(); need_device_update = true; need_flags_update = true; @@ -310,8 +310,8 @@ void Camera::update(Scene *scene) transform_perspective(&full_rastertocamera, make_float3(0, 0, 0)); } else { - dx = make_float3(0.0f, 0.0f, 0.0f); - dy = make_float3(0.0f, 0.0f, 0.0f); + dx = zero_float3(); + dy = zero_float3(); } dx = transform_direction(&cameratoworld, dx); @@ -568,7 +568,7 @@ float3 Camera::transform_raster_to_world(float raster_x, float raster_y) if (camera_type == CAMERA_PERSPECTIVE) { D = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f)); float3 Pclip = normalize(D); - P = make_float3(0.0f, 0.0f, 0.0f); + P = zero_float3(); /* TODO(sergey): Aperture support? */ P = transform_point(&cameratoworld, P); D = normalize(transform_direction(&cameratoworld, D)); @@ -643,7 +643,7 @@ float Camera::world_to_raster_size(float3 P) float3 p = transform_point(&worldtocamera, P); float3 v1 = transform_perspective(&full_rastertocamera, make_float3(full_width, full_height, 0.0f)); - float3 v2 = transform_perspective(&full_rastertocamera, make_float3(0.0f, 0.0f, 0.0f)); + float3 v2 = transform_perspective(&full_rastertocamera, zero_float3()); /* Create point clamped to frustum */ float3 c; diff --git a/intern/cycles/render/constant_fold.cpp b/intern/cycles/render/constant_fold.cpp index f3809ee8d80..800056d2899 100644 --- a/intern/cycles/render/constant_fold.cpp +++ b/intern/cycles/render/constant_fold.cpp @@ -86,7 +86,7 @@ void ConstantFolder::make_zero() const make_constant(0.0f); } else if (SocketType::is_float3(output->type())) { - make_constant(make_float3(0.0f, 0.0f, 0.0f)); + make_constant(zero_float3()); } else { assert(0); @@ -99,7 +99,7 @@ void ConstantFolder::make_one() const make_constant(1.0f); } else if (SocketType::is_float3(output->type())) { - make_constant(make_float3(1.0f, 1.0f, 1.0f)); + make_constant(one_float3()); } else { assert(0); @@ -184,7 +184,7 @@ bool ConstantFolder::is_zero(ShaderInput *input) const return node->get_float(input->socket_type) == 0.0f; } else if (SocketType::is_float3(input->type())) { - return node->get_float3(input->socket_type) == make_float3(0.0f, 0.0f, 0.0f); + return node->get_float3(input->socket_type) == zero_float3(); } } @@ -198,7 +198,7 @@ bool ConstantFolder::is_one(ShaderInput *input) const return node->get_float(input->socket_type) == 1.0f; } else if (SocketType::is_float3(input->type())) { - return node->get_float3(input->socket_type) == make_float3(1.0f, 1.0f, 1.0f); + return node->get_float3(input->socket_type) == one_float3(); } } diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 5e068e74ce0..cdaa878e830 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -273,7 +273,7 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to) if (to->type() == SocketType::CLOSURE) { EmissionNode *emission = create_node(); - emission->set_color(make_float3(1.0f, 1.0f, 1.0f)); + emission->set_color(one_float3()); emission->set_strength(1.0f); convert = add(emission); /* Connect float inputs to Strength to save an additional Value->Color conversion. */ diff --git a/intern/cycles/render/hair.cpp b/intern/cycles/render/hair.cpp index e94cad6b32e..28ad8a1461a 100644 --- a/intern/cycles/render/hair.cpp +++ b/intern/cycles/render/hair.cpp @@ -416,7 +416,7 @@ void Hair::compute_bounds() if (!bnds.valid()) { /* empty mesh */ - bnds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bnds.grow(zero_float3()); } bounds = bnds; diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 1e54a237816..d1e64e2ac14 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -116,17 +116,17 @@ NODE_DEFINE(Light) type_enum.insert("spot", LIGHT_SPOT); SOCKET_ENUM(light_type, "Type", type_enum, LIGHT_POINT); - SOCKET_COLOR(strength, "Strength", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_COLOR(strength, "Strength", one_float3()); - SOCKET_POINT(co, "Co", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_POINT(co, "Co", zero_float3()); - SOCKET_VECTOR(dir, "Dir", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(dir, "Dir", zero_float3()); SOCKET_FLOAT(size, "Size", 0.0f); SOCKET_FLOAT(angle, "Angle", 0.0f); - SOCKET_VECTOR(axisu, "Axis U", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(axisu, "Axis U", zero_float3()); SOCKET_FLOAT(sizeu, "Size U", 1.0f); - SOCKET_VECTOR(axisv, "Axis V", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(axisv, "Axis V", zero_float3()); SOCKET_FLOAT(sizev, "Size V", 1.0f); SOCKET_BOOLEAN(round, "Round", false); @@ -173,7 +173,7 @@ void Light::tag_update(Scene *scene) bool Light::has_contribution(Scene *scene) { - if (strength == make_float3(0.0f, 0.0f, 0.0f)) { + if (strength == zero_float3()) { return false; } if (is_portal) { diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 5f62da8f18b..1f6fcdd0abe 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -333,7 +333,7 @@ void Mesh::add_vertex(float3 P) tag_verts_modified(); if (get_num_subd_faces()) { - vert_patch_uv.push_back_reserved(make_float2(0.0f, 0.0f)); + vert_patch_uv.push_back_reserved(zero_float2()); tag_vert_patch_uv_modified(); } } @@ -344,7 +344,7 @@ void Mesh::add_vertex_slow(float3 P) tag_verts_modified(); if (get_num_subd_faces()) { - vert_patch_uv.push_back_slow(make_float2(0.0f, 0.0f)); + vert_patch_uv.push_back_slow(zero_float2()); tag_vert_patch_uv_modified(); } } @@ -494,7 +494,7 @@ void Mesh::compute_bounds() if (!bnds.valid()) { /* empty mesh */ - bnds.grow(make_float3(0.0f, 0.0f, 0.0f)); + bnds.grow(zero_float3()); } bounds = bnds; diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp index b4fb5dcdea2..b39d81023d9 100644 --- a/intern/cycles/render/mesh_displace.cpp +++ b/intern/cycles/render/mesh_displace.cpp @@ -197,7 +197,7 @@ bool GeometryManager::displace( for (int key : stitch_keys) { pair verts = mesh->vert_stitching_map.equal_range(key); - float3 pos = make_float3(0.0f, 0.0f, 0.0f); + float3 pos = zero_float3(); int num = 0; for (map_it_t v = verts.first; v != verts.second; ++v) { @@ -264,7 +264,7 @@ bool GeometryManager::displace( for (size_t i = 0; i < num_triangles; i++) { if (tri_has_true_disp[i]) { for (size_t j = 0; j < 3; j++) { - vN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f); + vN[mesh->get_triangle(i).v[j]] = zero_float3(); } } } @@ -333,7 +333,7 @@ bool GeometryManager::displace( for (size_t i = 0; i < num_triangles; i++) { if (tri_has_true_disp[i]) { for (size_t j = 0; j < 3; j++) { - mN[mesh->get_triangle(i).v[j]] = make_float3(0.0f, 0.0f, 0.0f); + mN[mesh->get_triangle(i).v[j]] = zero_float3(); } } } diff --git a/intern/cycles/render/mesh_subdivision.cpp b/intern/cycles/render/mesh_subdivision.cpp index 7408ee2dbdf..575dbef8ec2 100644 --- a/intern/cycles/render/mesh_subdivision.cpp +++ b/intern/cycles/render/mesh_subdivision.cpp @@ -341,9 +341,9 @@ struct OsdPatch : Patch { float3 du, dv; if (P) - *P = make_float3(0.0f, 0.0f, 0.0f); - du = make_float3(0.0f, 0.0f, 0.0f); - dv = make_float3(0.0f, 0.0f, 0.0f); + *P = zero_float3(); + du = zero_float3(); + dv = zero_float3(); for (int i = 0; i < cv.size(); i++) { float3 p = osd_data->verts[cv[i]].value; @@ -484,8 +484,8 @@ void Mesh::tessellate(DiagSplit *split) } else { /* ngon */ - float3 center_vert = make_float3(0.0f, 0.0f, 0.0f); - float3 center_normal = make_float3(0.0f, 0.0f, 0.0f); + float3 center_vert = zero_float3(); + float3 center_normal = zero_float3(); float inv_num_corners = 1.0f / float(face.num_corners); for (int corner = 0; corner < face.num_corners; corner++) { @@ -613,7 +613,7 @@ void Mesh::tessellate(DiagSplit *split) uchar *center = (uchar *)data + (subd_face_corners.size() + ngons) * stride; float inv_num_corners = 1.0f / float(face.num_corners); - float4 val = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + float4 val = zero_float4(); for (int corner = 0; corner < face.num_corners; corner++) { for (int i = 0; i < 4; i++) { diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index b59dd124040..84286c9b1a3 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -43,9 +43,9 @@ CCL_NAMESPACE_BEGIN /* Texture Mapping */ #define TEXTURE_MAPPING_DEFINE(TextureNode) \ - SOCKET_POINT(tex_mapping.translation, "Translation", make_float3(0.0f, 0.0f, 0.0f)); \ - SOCKET_VECTOR(tex_mapping.rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); \ - SOCKET_VECTOR(tex_mapping.scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); \ + SOCKET_POINT(tex_mapping.translation, "Translation", zero_float3()); \ + SOCKET_VECTOR(tex_mapping.rotation, "Rotation", zero_float3()); \ + SOCKET_VECTOR(tex_mapping.scale, "Scale", one_float3()); \ \ SOCKET_VECTOR(tex_mapping.min, "Min", make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); \ SOCKET_VECTOR(tex_mapping.max, "Max", make_float3(FLT_MAX, FLT_MAX, FLT_MAX)); \ @@ -80,7 +80,7 @@ TextureMapping::TextureMapping() Transform TextureMapping::compute_transform() { - Transform mmat = transform_scale(make_float3(0.0f, 0.0f, 0.0f)); + Transform mmat = transform_scale(zero_float3()); if (x_mapping != NONE) mmat[0][x_mapping - 1] = 1.0f; @@ -137,11 +137,11 @@ Transform TextureMapping::compute_transform() bool TextureMapping::skip() { - if (translation != make_float3(0.0f, 0.0f, 0.0f)) + if (translation != zero_float3()) return false; - if (rotation != make_float3(0.0f, 0.0f, 0.0f)) + if (rotation != zero_float3()) return false; - if (scale != make_float3(1.0f, 1.0f, 1.0f)) + if (scale != one_float3()) return false; if (x_mapping != X || y_mapping != Y || z_mapping != Z) @@ -250,7 +250,7 @@ NODE_DEFINE(ImageTextureNode) SOCKET_INT_ARRAY(tiles, "Tiles", array()); SOCKET_BOOLEAN(animated, "Animated", false); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_UV); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(alpha, "Alpha"); @@ -517,7 +517,7 @@ NODE_DEFINE(EnvironmentTextureNode) SOCKET_BOOLEAN(animated, "Animated", false); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(alpha, "Alpha"); @@ -811,8 +811,7 @@ NODE_DEFINE(SkyTextureNode) SOCKET_FLOAT(dust_density, "Dust", 1.0f); SOCKET_FLOAT(ozone_density, "Ozone", 1.0f); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_OUT_COLOR(color, "Color"); @@ -993,8 +992,7 @@ NODE_DEFINE(GradientTextureNode) type_enum.insert("spherical", NODE_BLEND_SPHERICAL); SOCKET_ENUM(gradient_type, "Type", type_enum, NODE_BLEND_LINEAR); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_OUT_COLOR(color, "Color"); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -1046,8 +1044,7 @@ NODE_DEFINE(NoiseTextureNode) dimensions_enum.insert("4D", 4); SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1137,8 +1134,7 @@ NODE_DEFINE(VoronoiTextureNode) feature_enum.insert("n_sphere_radius", NODE_VORONOI_N_SPHERE_RADIUS); SOCKET_ENUM(feature, "Feature", feature_enum, NODE_VORONOI_F1); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(smoothness, "Smoothness", 5.0f); @@ -1226,8 +1222,7 @@ NODE_DEFINE(IESLightNode) SOCKET_STRING(filename, "File Name", ustring()); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_NORMAL); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_NORMAL); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -1317,7 +1312,7 @@ NODE_DEFINE(WhiteNoiseTextureNode) dimensions_enum.insert("4D", 4); SOCKET_ENUM(dimensions, "Dimensions", dimensions_enum, 3); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3()); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_OUT_FLOAT(value, "Value"); @@ -1377,8 +1372,7 @@ NODE_DEFINE(MusgraveTextureNode) type_enum.insert("hetero_terrain", NODE_MUSGRAVE_HETERO_TERRAIN); SOCKET_ENUM(musgrave_type, "Type", type_enum, NODE_MUSGRAVE_FBM); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(w, "W", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1477,8 +1471,7 @@ NODE_DEFINE(WaveTextureNode) profile_enum.insert("tri", NODE_WAVE_PROFILE_TRI); SOCKET_ENUM(profile, "Profile", profile_enum, NODE_WAVE_PROFILE_SIN); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_IN_FLOAT(distortion, "Distortion", 0.0f); SOCKET_IN_FLOAT(detail, "Detail", 2.0f); @@ -1555,8 +1548,7 @@ NODE_DEFINE(MagicTextureNode) SOCKET_INT(depth, "Depth", 2); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(distortion, "Distortion", 1.0f); @@ -1608,10 +1600,9 @@ NODE_DEFINE(CheckerTextureNode) TEXTURE_MAPPING_DEFINE(CheckerTextureNode); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_OUT_COLOR(color, "Color"); @@ -1668,12 +1659,11 @@ NODE_DEFINE(BrickTextureNode) SOCKET_FLOAT(squash, "Squash", 1.0f); SOCKET_INT(squash_frequency, "Squash Frequency", 2); - SOCKET_IN_POINT( - vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_TEXTURE_GENERATED); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(mortar, "Mortar", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); + SOCKET_IN_COLOR(mortar, "Mortar", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 5.0f); SOCKET_IN_FLOAT(mortar_size, "Mortar Size", 0.02f); SOCKET_IN_FLOAT(mortar_smooth, "Mortar Smooth", 0.0f); @@ -1772,7 +1762,7 @@ NODE_DEFINE(PointDensityTextureNode) SOCKET_TRANSFORM(tfm, "Transform", transform_identity()); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION); + SOCKET_IN_POINT(vector, "Vector", zero_float3(), SocketType::LINK_POSITION); SOCKET_OUT_FLOAT(density, "Density"); SOCKET_OUT_COLOR(color, "Color"); @@ -1887,9 +1877,9 @@ NODE_DEFINE(NormalNode) { NodeType *type = NodeType::add("normal", create, NodeType::SHADER); - SOCKET_VECTOR(direction, "direction", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_VECTOR(direction, "direction", zero_float3()); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3()); SOCKET_OUT_NORMAL(normal, "Normal"); SOCKET_OUT_FLOAT(dot, "Dot"); @@ -1934,10 +1924,10 @@ NODE_DEFINE(MappingNode) type_enum.insert("normal", NODE_MAPPING_TYPE_NORMAL); SOCKET_ENUM(mapping_type, "Type", type_enum, NODE_MAPPING_TYPE_POINT); - SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(location, "Location", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_POINT(vector, "Vector", zero_float3()); + SOCKET_IN_POINT(location, "Location", zero_float3()); + SOCKET_IN_POINT(rotation, "Rotation", zero_float3()); + SOCKET_IN_POINT(scale, "Scale", one_float3()); SOCKET_OUT_POINT(vector, "Vector"); @@ -1993,7 +1983,7 @@ NODE_DEFINE(RGBToBWNode) { NodeType *type = NodeType::add("rgb_to_bw", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_FLOAT(val, "Val"); return type; @@ -2291,7 +2281,7 @@ NODE_DEFINE(AnisotropicBsdfNode) NodeType *type = NodeType::add("anisotropic_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2301,7 +2291,7 @@ NODE_DEFINE(AnisotropicBsdfNode) distribution_enum.insert("ashikhmin_shirley", CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID); SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_ID); - SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT); + SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT); SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f); SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.5f); @@ -2353,7 +2343,7 @@ NODE_DEFINE(GlossyBsdfNode) NodeType *type = NodeType::add("glossy_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2445,7 +2435,7 @@ NODE_DEFINE(GlassBsdfNode) NodeType *type = NodeType::add("glass_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2538,7 +2528,7 @@ NODE_DEFINE(RefractionBsdfNode) NodeType *type = NodeType::add("refraction_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum distribution_enum; @@ -2629,7 +2619,7 @@ NODE_DEFINE(ToonBsdfNode) NodeType *type = NodeType::add("toon_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum component_enum; @@ -2669,7 +2659,7 @@ NODE_DEFINE(VelvetBsdfNode) NodeType *type = NodeType::add("velvet_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_IN_FLOAT(sigma, "Sigma", 1.0f); @@ -2700,7 +2690,7 @@ NODE_DEFINE(DiffuseBsdfNode) NodeType *type = NodeType::add("diffuse_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f); @@ -2760,15 +2750,12 @@ NODE_DEFINE(PrincipledBsdfNode) SOCKET_IN_FLOAT(transmission, "Transmission", 0.0f); SOCKET_IN_FLOAT(transmission_roughness, "Transmission Roughness", 0.0f); SOCKET_IN_FLOAT(anisotropic_rotation, "Anisotropic Rotation", 0.0f); - SOCKET_IN_COLOR(emission, "Emission", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(emission, "Emission", zero_float3()); SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 1.0f); SOCKET_IN_FLOAT(alpha, "Alpha", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); - SOCKET_IN_NORMAL(clearcoat_normal, - "Clearcoat Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL); - SOCKET_IN_NORMAL(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(clearcoat_normal, "Clearcoat Normal", zero_float3(), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(tangent, "Tangent", zero_float3(), SocketType::LINK_TANGENT); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -2789,7 +2776,7 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph) ShaderInput *emission_in = input("Emission"); ShaderInput *emission_strength_in = input("Emission Strength"); - if ((emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) && + if ((emission_in->link || emission != zero_float3()) && (emission_strength_in->link || emission_strength != 0.0f)) { /* Create add closure and emission, and relink inputs. */ AddClosureNode *add = graph->create_node(); @@ -2879,7 +2866,7 @@ void PrincipledBsdfNode::compile(SVMCompiler &compiler, ShaderInput *clearcoat_normal_in = input("Clearcoat Normal"); ShaderInput *tangent_in = input("Tangent"); - float3 weight = make_float3(1.0f, 1.0f, 1.0f); + float3 weight = one_float3(); compiler.add_node(NODE_CLOSURE_SET_WEIGHT, weight); @@ -2989,7 +2976,7 @@ NODE_DEFINE(TranslucentBsdfNode) NodeType *type = NodeType::add("translucent_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3018,7 +3005,7 @@ NODE_DEFINE(TransparentBsdfNode) { NodeType *type = NodeType::add("transparent_bsdf", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(color, "Color", one_float3()); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3048,7 +3035,7 @@ NODE_DEFINE(SubsurfaceScatteringNode) NodeType *type = NodeType::add("subsurface_scattering", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum falloff_enum; @@ -3138,8 +3125,7 @@ void EmissionNode::constant_fold(const ConstantFolder &folder) ShaderInput *color_in = input("Color"); ShaderInput *strength_in = input("Strength"); - if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) || - (!strength_in->link && strength == 0.0f)) { + if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) { folder.discard(); } } @@ -3188,8 +3174,7 @@ void BackgroundNode::constant_fold(const ConstantFolder &folder) ShaderInput *color_in = input("Color"); ShaderInput *strength_in = input("Strength"); - if ((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) || - (!strength_in->link && strength == 0.0f)) { + if ((!color_in->link && color == zero_float3()) || (!strength_in->link && strength == 0.0f)) { folder.discard(); } } @@ -3214,7 +3199,7 @@ HoldoutNode::HoldoutNode() : ShaderNode(node_type) void HoldoutNode::compile(SVMCompiler &compiler) { - float3 value = make_float3(1.0f, 1.0f, 1.0f); + float3 value = one_float3(); compiler.add_node(NODE_CLOSURE_SET_WEIGHT, value); compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset()); @@ -3233,9 +3218,9 @@ NODE_DEFINE(AmbientOcclusionNode) SOCKET_INT(samples, "Samples", 16); - SOCKET_IN_COLOR(color, "Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(color, "Color", one_float3()); SOCKET_IN_FLOAT(distance, "Distance", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_BOOLEAN(inside, "Inside", false); SOCKET_BOOLEAN(only_local, "Only Local", false); @@ -3393,11 +3378,11 @@ NODE_DEFINE(PrincipledVolumeNode) SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 0.5f)); SOCKET_IN_FLOAT(density, "Density", 1.0f); SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.0f); - SOCKET_IN_COLOR(absorption_color, "Absorption Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(absorption_color, "Absorption Color", zero_float3()); SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 0.0f); - SOCKET_IN_COLOR(emission_color, "Emission Color", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(emission_color, "Emission Color", one_float3()); SOCKET_IN_FLOAT(blackbody_intensity, "Blackbody Intensity", 0.0f); - SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", make_float3(1.0f, 1.0f, 1.0f)); + SOCKET_IN_COLOR(blackbody_tint, "Blackbody Tint", one_float3()); SOCKET_IN_FLOAT(temperature, "Temperature", 1000.0f); SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL); @@ -3523,7 +3508,7 @@ NODE_DEFINE(PrincipledHairBsdfNode) SOCKET_IN_FLOAT(random_color, "Random Color", 0.0f); SOCKET_IN_FLOAT(random, "Random", 0.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3548,7 +3533,7 @@ void PrincipledHairBsdfNode::attributes(Shader *shader, AttributeRequestSet *att /* Prepares the input data for the SVM shader. */ void PrincipledHairBsdfNode::compile(SVMCompiler &compiler) { - compiler.add_node(NODE_CLOSURE_SET_WEIGHT, make_float3(1.0f, 1.0f, 1.0f)); + compiler.add_node(NODE_CLOSURE_SET_WEIGHT, one_float3()); ShaderInput *roughness_in = input("Roughness"); ShaderInput *radial_roughness_in = input("Radial Roughness"); @@ -3625,7 +3610,7 @@ NODE_DEFINE(HairBsdfNode) NodeType *type = NodeType::add("hair_bsdf", create, NodeType::SHADER); SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL); static NodeEnum component_enum; @@ -3635,7 +3620,7 @@ NODE_DEFINE(HairBsdfNode) SOCKET_IN_FLOAT(offset, "Offset", 0.0f); SOCKET_IN_FLOAT(roughness_u, "RoughnessU", 0.2f); SOCKET_IN_FLOAT(roughness_v, "RoughnessV", 0.2f); - SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(tangent, "Tangent", zero_float3()); SOCKET_OUT_CLOSURE(BSDF, "BSDF"); @@ -3666,10 +3651,8 @@ NODE_DEFINE(GeometryNode) { NodeType *type = NodeType::add("geometry", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_POINT(position, "Position"); SOCKET_OUT_NORMAL(normal, "Normal"); @@ -3817,10 +3800,8 @@ NODE_DEFINE(TextureCoordinateNode) SOCKET_BOOLEAN(use_transform, "Use Transform", false); SOCKET_TRANSFORM(ob_tfm, "Object Transform", transform_identity()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_POINT(generated, "Generated"); SOCKET_OUT_NORMAL(normal, "Normal"); @@ -4656,7 +4637,7 @@ NODE_DEFINE(ColorNode) { NodeType *type = NodeType::add("color", create, NodeType::SHADER); - SOCKET_COLOR(value, "Value", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_COLOR(value, "Value", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); return type; @@ -4829,7 +4810,7 @@ NODE_DEFINE(InvertNode) NodeType *type = NodeType::add("invert", create, NodeType::SHADER); SOCKET_IN_FLOAT(fac, "Fac", 1.0f); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -4848,7 +4829,7 @@ void InvertNode::constant_fold(const ConstantFolder &folder) if (!fac_in->link) { /* evaluate fully constant node */ if (!color_in->link) { - folder.make_constant(interp(color, make_float3(1.0f, 1.0f, 1.0f) - color, fac)); + folder.make_constant(interp(color, one_float3() - color, fac)); } /* remove no-op node */ else if (fac == 0.0f) { @@ -4904,8 +4885,8 @@ NODE_DEFINE(MixNode) SOCKET_BOOLEAN(use_clamp, "Use Clamp", false); SOCKET_IN_FLOAT(fac, "Fac", 0.5f); - SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color1, "Color1", zero_float3()); + SOCKET_IN_COLOR(color2, "Color2", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -5099,7 +5080,7 @@ NODE_DEFINE(GammaNode) { NodeType *type = NodeType::add("gamma", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(gamma, "Gamma", 1.0f); SOCKET_OUT_COLOR(color, "Color"); @@ -5153,7 +5134,7 @@ NODE_DEFINE(BrightContrastNode) { NodeType *type = NodeType::add("brightness_contrast", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(bright, "Bright", 0.0f); SOCKET_IN_FLOAT(contrast, "Contrast", 0.0f); @@ -5198,7 +5179,7 @@ NODE_DEFINE(SeparateRGBNode) { NodeType *type = NodeType::add("separate_rgb", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Image", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Image", zero_float3()); SOCKET_OUT_FLOAT(r, "R"); SOCKET_OUT_FLOAT(g, "G"); @@ -5251,7 +5232,7 @@ NODE_DEFINE(SeparateXYZNode) { NodeType *type = NodeType::add("separate_xyz", create, NodeType::SHADER); - SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(vector, "Vector", zero_float3()); SOCKET_OUT_FLOAT(x, "X"); SOCKET_OUT_FLOAT(y, "Y"); @@ -5304,7 +5285,7 @@ NODE_DEFINE(SeparateHSVNode) { NodeType *type = NodeType::add("separate_hsv", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_FLOAT(h, "H"); SOCKET_OUT_FLOAT(s, "S"); @@ -5360,7 +5341,7 @@ NODE_DEFINE(HSVNode) SOCKET_IN_FLOAT(saturation, "Saturation", 1.0f); SOCKET_IN_FLOAT(value, "Value", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 1.0f); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_OUT_COLOR(color, "Color"); @@ -5525,10 +5506,8 @@ NODE_DEFINE(FresnelNode) { NodeType *type = NodeType::add("fresnel", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal, - "Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(IOR, "IOR", 1.45f); SOCKET_OUT_FLOAT(fac, "Fac"); @@ -5564,10 +5543,8 @@ NODE_DEFINE(LayerWeightNode) { NodeType *type = NodeType::add("layer_weight", create, NodeType::SHADER); - SOCKET_IN_NORMAL(normal, - "Normal", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(blend, "Blend", 0.5f); SOCKET_OUT_FLOAT(fresnel, "Fresnel"); @@ -5735,8 +5712,8 @@ NODE_DEFINE(OutputNode) SOCKET_IN_CLOSURE(surface, "Surface"); SOCKET_IN_CLOSURE(volume, "Volume"); - SOCKET_IN_VECTOR(displacement, "Displacement", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(displacement, "Displacement", zero_float3()); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3()); return type; } @@ -5928,7 +5905,7 @@ NODE_DEFINE(OutputAOVNode) { NodeType *type = NodeType::add("aov_output", create, NodeType::SHADER); - SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(color, "Color", zero_float3()); SOCKET_IN_FLOAT(value, "Value", 0.0f); SOCKET_STRING(name, "AOV Name", ustring("")); @@ -6126,9 +6103,9 @@ NODE_DEFINE(VectorMathNode) type_enum.insert("tangent", NODE_VECTOR_MATH_TANGENT); SOCKET_ENUM(math_type, "Type", type_enum, NODE_VECTOR_MATH_ADD); - SOCKET_IN_VECTOR(vector1, "Vector1", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_VECTOR(vector2, "Vector2", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_VECTOR(vector3, "Vector3", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector1, "Vector1", zero_float3()); + SOCKET_IN_VECTOR(vector2, "Vector2", zero_float3()); + SOCKET_IN_VECTOR(vector3, "Vector3", zero_float3()); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); SOCKET_OUT_FLOAT(value, "Value"); @@ -6144,7 +6121,7 @@ VectorMathNode::VectorMathNode() : ShaderNode(node_type) void VectorMathNode::constant_fold(const ConstantFolder &folder) { float value = 0.0f; - float3 vector = make_float3(0.0f, 0.0f, 0.0f); + float3 vector = zero_float3(); if (folder.all_inputs_constant()) { svm_vector_math(&value, &vector, math_type, vector1, vector2, vector3, scale); @@ -6216,9 +6193,9 @@ NODE_DEFINE(VectorRotateNode) SOCKET_BOOLEAN(invert, "Invert", false); - SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_IN_POINT(center, "Center", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector, "Vector", zero_float3()); + SOCKET_IN_POINT(rotation, "Rotation", zero_float3()); + SOCKET_IN_POINT(center, "Center", zero_float3()); SOCKET_IN_VECTOR(axis, "Axis", make_float3(0.0f, 0.0f, 1.0f)); SOCKET_IN_FLOAT(angle, "Angle", 0.0f); SOCKET_OUT_VECTOR(vector, "Vector"); @@ -6276,7 +6253,7 @@ NODE_DEFINE(VectorTransformNode) SOCKET_ENUM(convert_from, "Convert From", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD); SOCKET_ENUM(convert_to, "Convert To", space_enum, NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT); - SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(vector, "Vector", zero_float3()); SOCKET_OUT_VECTOR(vector, "Vector"); return type; @@ -6321,7 +6298,7 @@ NODE_DEFINE(BumpNode) SOCKET_IN_FLOAT(sample_center, "SampleCenter", 0.0f); SOCKET_IN_FLOAT(sample_x, "SampleX", 0.0f); SOCKET_IN_FLOAT(sample_y, "SampleY", 0.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); SOCKET_IN_FLOAT(distance, "Distance", 0.1f); @@ -6470,7 +6447,7 @@ NODE_DEFINE(RGBCurvesNode) SOCKET_FLOAT(max_x, "Max X", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 0.0f); - SOCKET_IN_COLOR(value, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(value, "Color", zero_float3()); SOCKET_OUT_COLOR(value, "Color"); @@ -6507,7 +6484,7 @@ NODE_DEFINE(VectorCurvesNode) SOCKET_FLOAT(max_x, "Max X", 1.0f); SOCKET_IN_FLOAT(fac, "Fac", 0.0f); - SOCKET_IN_VECTOR(value, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(value, "Vector", zero_float3()); SOCKET_OUT_VECTOR(value, "Vector"); @@ -6618,7 +6595,7 @@ NODE_DEFINE(SetNormalNode) { NodeType *type = NodeType::add("set_normal", create, NodeType::SHADER); - SOCKET_IN_VECTOR(direction, "Direction", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_VECTOR(direction, "Direction", zero_float3()); SOCKET_OUT_NORMAL(normal, "Normal"); return type; @@ -6736,10 +6713,8 @@ NODE_DEFINE(NormalMapNode) SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_IN_FLOAT(strength, "Strength", 1.0f); SOCKET_IN_COLOR(color, "Color", make_float3(0.5f, 0.5f, 1.0f)); @@ -6835,10 +6810,8 @@ NODE_DEFINE(TangentNode) SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_NORMAL(normal_osl, - "NormalIn", - make_float3(0.0f, 0.0f, 0.0f), - SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); + SOCKET_IN_NORMAL( + normal_osl, "NormalIn", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL); SOCKET_OUT_NORMAL(tangent, "Tangent"); return type; @@ -6907,7 +6880,7 @@ NODE_DEFINE(BevelNode) SOCKET_INT(samples, "Samples", 4); SOCKET_IN_FLOAT(radius, "Radius", 0.05f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_OUT_NORMAL(bevel, "Normal"); @@ -6952,7 +6925,7 @@ NODE_DEFINE(DisplacementNode) SOCKET_IN_FLOAT(height, "Height", 0.0f); SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.5f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); - SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL); + SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL); SOCKET_OUT_VECTOR(displacement, "Displacement"); @@ -7009,7 +6982,7 @@ NODE_DEFINE(VectorDisplacementNode) SOCKET_ENUM(space, "Space", space_enum, NODE_NORMAL_MAP_TANGENT); SOCKET_STRING(attribute, "Attribute", ustring()); - SOCKET_IN_COLOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_COLOR(vector, "Vector", zero_float3()); SOCKET_IN_FLOAT(midlevel, "Midlevel", 0.0f); SOCKET_IN_FLOAT(scale, "Scale", 1.0f); @@ -7025,7 +6998,7 @@ VectorDisplacementNode::VectorDisplacementNode() : ShaderNode(node_type) void VectorDisplacementNode::constant_fold(const ConstantFolder &folder) { if (folder.all_inputs_constant()) { - if ((vector == make_float3(0.0f, 0.0f, 0.0f) && midlevel == 0.0f) || (scale == 0.0f)) { + if ((vector == zero_float3() && midlevel == 0.0f) || (scale == 0.0f)) { folder.make_zero(); } } diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index e837be9e6fb..ebbfc789329 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -85,13 +85,13 @@ NODE_DEFINE(Object) SOCKET_NODE(geometry, "Geometry", &Geometry::node_base_type); SOCKET_TRANSFORM(tfm, "Transform", transform_identity()); SOCKET_UINT(visibility, "Visibility", ~0); - SOCKET_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_COLOR(color, "Color", zero_float3()); SOCKET_UINT(random_id, "Random ID", 0); SOCKET_INT(pass_id, "Pass ID", 0); SOCKET_BOOLEAN(use_holdout, "Use Holdout", false); SOCKET_BOOLEAN(hide_on_missing_motion, "Hide on Missing Motion", false); - SOCKET_POINT(dupli_generated, "Dupli Generated", make_float3(0.0f, 0.0f, 0.0f)); - SOCKET_POINT2(dupli_uv, "Dupli UV", make_float2(0.0f, 0.0f)); + SOCKET_POINT(dupli_generated, "Dupli Generated", zero_float3()); + SOCKET_POINT2(dupli_uv, "Dupli UV", zero_float2()); SOCKET_TRANSFORM_ARRAY(motion, "Motion", array()); SOCKET_FLOAT(shadow_terminator_offset, "Terminator Offset", 0.0f); SOCKET_STRING(asset_name, "Asset Name", ustring()); @@ -270,7 +270,7 @@ int Object::motion_step(float time) const bool Object::is_traceable() const { /* Mesh itself can be empty,can skip all such objects. */ - if (!bounds.valid() || bounds.size() == make_float3(0.0f, 0.0f, 0.0f)) { + if (!bounds.valid() || bounds.size() == zero_float3()) { return false; } /* TODO(sergey): Check for mesh vertices/curves. visibility flags. */ @@ -337,7 +337,7 @@ float Object::compute_volume_step_size() const if (voxel_step_size == 0.0f) { /* Auto detect step size. */ - float3 size = make_float3(1.0f, 1.0f, 1.0f); + float3 size = one_float3(); #ifdef WITH_NANOVDB /* Dimensions were not applied to image transform with NanOVDB (see image_vdb.cpp) */ if (metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT && @@ -397,7 +397,7 @@ static float object_volume_density(const Transform &tfm, Geometry *geom) if (geom->geometry_type == Geometry::VOLUME) { /* Volume density automatically adjust to object scale. */ if (static_cast(geom)->get_object_space()) { - const float3 unit = normalize(make_float3(1.0f, 1.0f, 1.0f)); + const float3 unit = normalize(one_float3()); return 1.0f / len(transform_direction(&tfm, unit)); } } diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 650587cb694..1b785fe9096 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -564,7 +564,7 @@ void ShaderManager::device_update_common(Device *device, flag |= SD_HAS_DISPLACEMENT; /* constant emission check */ - float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f); + float3 constant_emission = zero_float3(); if (shader->is_constant_emission(&constant_emission)) flag |= SD_HAS_CONSTANT_EMISSION; diff --git a/intern/cycles/subd/subd_subpatch.h b/intern/cycles/subd/subd_subpatch.h index 1a32b763cb8..cdaa310916a 100644 --- a/intern/cycles/subd/subd_subpatch.h +++ b/intern/cycles/subd/subd_subpatch.h @@ -68,9 +68,9 @@ class Subpatch { explicit Subpatch(Patch *patch = nullptr) : patch(patch), - c00(make_float2(0.0f, 0.0f)), + c00(zero_float2()), c01(make_float2(0.0f, 1.0f)), - c11(make_float2(1.0f, 1.0f)), + c11(one_float2()), c10(make_float2(1.0f, 0.0f)) { } diff --git a/intern/cycles/test/render_graph_finalize_test.cpp b/intern/cycles/test/render_graph_finalize_test.cpp index 3eaec982d09..da9b29314a7 100644 --- a/intern/cycles/test/render_graph_finalize_test.cpp +++ b/intern/cycles/test/render_graph_finalize_test.cpp @@ -259,9 +259,7 @@ TEST_F(RenderGraph, constant_fold_emission1) EXPECT_ANY_MESSAGE(log); CORRECT_INFO_MESSAGE(log, "Discarding closure Emission."); - builder - .add_node(ShaderNodeBuilder(graph, "Emission") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + builder.add_node(ShaderNodeBuilder(graph, "Emission").set("Color", zero_float3())) .output_closure("Emission::Emission"); graph.finalize(scene); @@ -288,8 +286,7 @@ TEST_F(RenderGraph, constant_fold_background1) CORRECT_INFO_MESSAGE(log, "Discarding closure Background."); builder - .add_node(ShaderNodeBuilder(graph, "Background") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + .add_node(ShaderNodeBuilder(graph, "Background").set("Color", zero_float3())) .output_closure("Background::Background"); graph.finalize(scene); @@ -892,8 +889,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_0) builder .add_attribute("Attribute") /* constant on the left */ - .add_node(ShaderNodeBuilder(graph, "Gamma_Cx") - .set("Color", make_float3(0.0f, 0.0f, 0.0f))) + .add_node(ShaderNodeBuilder(graph, "Gamma_Cx").set("Color", zero_float3())) .add_connection("Attribute::Fac", "Gamma_Cx::Gamma") /* constant on the right */ .add_node(ShaderNodeBuilder(graph, "Gamma_xC").set("Gamma", 0.0f)) @@ -922,8 +918,7 @@ TEST_F(RenderGraph, constant_fold_gamma_part_1) builder .add_attribute("Attribute") /* constant on the left */ - .add_node(ShaderNodeBuilder(graph, "Gamma_Cx") - .set("Color", make_float3(1.0f, 1.0f, 1.0f))) + .add_node(ShaderNodeBuilder(graph, "Gamma_Cx").set("Color", one_float3())) .add_connection("Attribute::Fac", "Gamma_Cx::Gamma") /* constant on the right */ .add_node(ShaderNodeBuilder(graph, "Gamma_xC").set("Gamma", 1.0f)) diff --git a/intern/cycles/test/util_transform_test.cpp b/intern/cycles/test/util_transform_test.cpp index 58ce0fdfee4..a5267df9fb7 100644 --- a/intern/cycles/test/util_transform_test.cpp +++ b/intern/cycles/test/util_transform_test.cpp @@ -33,7 +33,7 @@ TEST(transform_motion_decompose, Degenerated) // Copy from previous to current. { - vector motion = {transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f)), + vector motion = {transform_rotate(M_PI_4_F, one_float3()), transform_scale(0.0f, 0.0f, 0.0f)}; vector decomp(motion.size()); transform_motion_decompose(decomp.data(), motion.data(), motion.size()); @@ -43,7 +43,7 @@ TEST(transform_motion_decompose, Degenerated) // Copy from next to current. { vector motion = {transform_scale(0.0f, 0.0f, 0.0f), - transform_rotate(M_PI_4_F, make_float3(1.0f, 1.0f, 1.0f))}; + transform_rotate(M_PI_4_F, one_float3())}; vector decomp(motion.size()); transform_motion_decompose(decomp.data(), motion.data(), motion.size()); EXPECT_NEAR(len(decomp[0].x - decomp[1].x), 0.0f, 1e-6f); diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h index 1b493d0ed5e..203c0b289f6 100644 --- a/intern/cycles/util/util_color.h +++ b/intern/cycles/util/util_color.h @@ -277,16 +277,16 @@ ccl_device float4 color_srgb_to_linear_v4(float4 c) ccl_device float3 color_highlight_compress(float3 color, float3 *variance) { - color += make_float3(1.0f, 1.0f, 1.0f); + color += one_float3(); if (variance) { - *variance *= sqr3(make_float3(1.0f, 1.0f, 1.0f) / color); + *variance *= sqr3(one_float3() / color); } return log3(color); } ccl_device float3 color_highlight_uncompress(float3 color) { - return exp3(color) - make_float3(1.0f, 1.0f, 1.0f); + return exp3(color) - one_float3(); } CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_math_float2.h b/intern/cycles/util/util_math_float2.h index bf21430af3c..17f6f3c9382 100644 --- a/intern/cycles/util/util_math_float2.h +++ b/intern/cycles/util/util_math_float2.h @@ -72,6 +72,16 @@ ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b) * Definition. */ +ccl_device_inline float2 zero_float2() +{ + return make_float2(0.0f, 0.0f); +} + +ccl_device_inline float2 one_float2() +{ + return make_float2(1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float2 operator-(const float2 &a) { @@ -256,7 +266,7 @@ ccl_device_inline float2 floor(const float2 &a) ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b) { - return (b != 0.0f) ? a / b : make_float2(0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float2(); } CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_math_float3.h b/intern/cycles/util/util_math_float3.h index dd2010715ba..162bc900d9f 100644 --- a/intern/cycles/util/util_math_float3.h +++ b/intern/cycles/util/util_math_float3.h @@ -91,6 +91,20 @@ ccl_device_inline bool isequal_float3(const float3 a, const float3 b); * Definition. */ +ccl_device_inline float3 zero_float3() +{ +#ifdef __KERNEL_SSE__ + return float3(_mm_setzero_ps()); +#else + return make_float3(0.0f, 0.0f, 0.0f); +#endif +} + +ccl_device_inline float3 one_float3() +{ + return make_float3(1.0f, 1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float3 operator-(const float3 &a) { @@ -373,8 +387,7 @@ ccl_device_inline float3 reflect(const float3 incident, const float3 normal) ccl_device_inline float3 project(const float3 v, const float3 v_proj) { float len_squared = dot(v_proj, v_proj); - return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj : - make_float3(0.0f, 0.0f, 0.0f); + return (len_squared != 0.0f) ? (dot(v, v_proj) / len_squared) * v_proj : zero_float3(); } ccl_device_inline float3 saturate3(float3 a) @@ -410,7 +423,7 @@ ccl_device_inline float3 safe_divide_float3_float3(const float3 a, const float3 ccl_device_inline float3 safe_divide_float3_float(const float3 a, const float b) { - return (b != 0.0f) ? a / b : make_float3(0.0f, 0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float3(); } ccl_device_inline float3 interp(float3 a, float3 b, float t) diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h index ec5328adb31..38fdd9e3146 100644 --- a/intern/cycles/util/util_math_float4.h +++ b/intern/cycles/util/util_math_float4.h @@ -98,6 +98,20 @@ ccl_device_inline float4 reduce_add(const float4 &a); * Definition. */ +ccl_device_inline float4 zero_float4() +{ +#ifdef __KERNEL_SSE__ + return float4(_mm_setzero_ps()); +#else + return make_float4(0.0f, 0.0f, 0.0f, 0.0f); +#endif +} + +ccl_device_inline float4 one_float4() +{ + return make_float4(1.0f, 1.0f, 1.0f, 1.0f); +} + #ifndef __KERNEL_OPENCL__ ccl_device_inline float4 operator-(const float4 &a) { @@ -474,7 +488,7 @@ ccl_device_inline float4 load_float4(const float *v) ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b) { - return (b != 0.0f) ? a / b : make_float4(0.0f, 0.0f, 0.0f, 0.0f); + return (b != 0.0f) ? a / b : zero_float4(); } ccl_device_inline bool isfinite4_safe(float4 v) diff --git a/intern/cycles/util/util_projection.h b/intern/cycles/util/util_projection.h index 416af18b53e..9c7e0061c82 100644 --- a/intern/cycles/util/util_projection.h +++ b/intern/cycles/util/util_projection.h @@ -51,7 +51,7 @@ ccl_device_inline float3 transform_perspective(const ProjectionTransform *t, con float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b)); float w = dot(t->w, b); - return (w != 0.0f) ? c / w : make_float3(0.0f, 0.0f, 0.0f); + return (w != 0.0f) ? c / w : zero_float3(); } ccl_device_inline float3 transform_perspective_direction(const ProjectionTransform *t, diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h index d8bbd389aa6..f79eac4cbcf 100644 --- a/intern/cycles/util/util_transform.h +++ b/intern/cycles/util/util_transform.h @@ -186,6 +186,12 @@ ccl_device_inline Transform make_transform_frame(float3 N) #ifndef __KERNEL_GPU__ +ccl_device_inline Transform transform_zero() +{ + Transform zero = {zero_float4(), zero_float4(), zero_float4()}; + return zero; +} + ccl_device_inline Transform operator*(const Transform a, const Transform b) { float4 c_x = make_float4(b.x.x, b.y.x, b.z.x, 0.0f); From 0e9497e886924cb75ca67f2c14e2fdda29f2b583 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Feb 2021 15:01:26 +0100 Subject: [PATCH 252/519] Cycles: add support for Arm Neon instructions using sse2neon Based on patch contributed by Apple and Stefan Werner. Ref D8237, T78710 --- intern/cycles/graph/node_type.cpp | 2 +- intern/cycles/render/camera.cpp | 3 +- intern/cycles/render/nodes.cpp | 10 +++ intern/cycles/render/nodes.h | 1 + intern/cycles/util/util_math_float3.h | 10 +++ intern/cycles/util/util_math_float4.h | 37 ++++++-- intern/cycles/util/util_optimization.h | 26 +++--- intern/cycles/util/util_simd.h | 83 +++++++++++++++++- intern/cycles/util/util_sseb.h | 49 ++++++++++- intern/cycles/util/util_ssef.h | 116 ++++++++++++++++++++----- intern/cycles/util/util_ssei.h | 20 +++++ 11 files changed, 317 insertions(+), 40 deletions(-) diff --git a/intern/cycles/graph/node_type.cpp b/intern/cycles/graph/node_type.cpp index 2b11af70d71..d1eadf21b1b 100644 --- a/intern/cycles/graph/node_type.cpp +++ b/intern/cycles/graph/node_type.cpp @@ -102,7 +102,7 @@ size_t SocketType::max_size() void *SocketType::zero_default_value() { - static Transform zero_transform = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}; + static Transform zero_transform = transform_zero(); return &zero_transform; } diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 1f932135a57..afe788eb4be 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -741,7 +741,8 @@ float Camera::world_to_raster_size(float3 P) float3 D = transform_point(&worldtocamera, P); float dist = len(D); - Ray ray = {{0}}; + Ray ray; + memset(&ray, 0, sizeof(ray)); /* Distortion can become so great that the results become meaningless, there * may be a better way to do this, but calculating differentials from the diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 84286c9b1a3..b17f1ec0b2f 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -2081,6 +2081,16 @@ ConvertNode::ConvertNode(SocketType::Type from_, SocketType::Type to_, bool auto special_type = SHADER_SPECIAL_TYPE_AUTOCONVERT; } +/* Union usage requires a manual copy constructor. */ +ConvertNode::ConvertNode(const ConvertNode &other) + : ShaderNode(other), + from(other.from), + to(other.to), + value_color(other.value_color), + value_string(other.value_string) +{ +} + void ConvertNode::constant_fold(const ConstantFolder &folder) { /* proxy nodes should have been removed at this point */ diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index d4603143ef4..fb9cf0c9836 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -501,6 +501,7 @@ class RGBToBWNode : public ShaderNode { class ConvertNode : public ShaderNode { public: ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false); + ConvertNode(const ConvertNode &other); SHADER_NODE_BASE_CLASS(ConvertNode) void constant_fold(const ConstantFolder &folder); diff --git a/intern/cycles/util/util_math_float3.h b/intern/cycles/util/util_math_float3.h index 162bc900d9f..67c5c61e4c0 100644 --- a/intern/cycles/util/util_math_float3.h +++ b/intern/cycles/util/util_math_float3.h @@ -304,8 +304,12 @@ ccl_device_inline float3 clamp(const float3 &a, const float3 &mn, const float3 & ccl_device_inline float3 fabs(const float3 &a) { # ifdef __KERNEL_SSE__ +# ifdef __KERNEL_NEON__ + return float3(vabsq_f32(a.m128)); +# else __m128 mask = _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)); return float3(_mm_and_ps(a.m128, mask)); +# endif # else return make_float3(fabsf(a.x), fabsf(a.y), fabsf(a.z)); # endif @@ -447,7 +451,13 @@ ccl_device_inline bool is_zero(const float3 a) ccl_device_inline float reduce_add(const float3 a) { +#if defined(__KERNEL_SSE__) && defined(__KERNEL_NEON__) + __m128 t = a.m128; + t[3] = 0.0f; + return vaddvq_f32(t); +#else return (a.x + a.y + a.z); +#endif } ccl_device_inline float average(const float3 a) diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h index 38fdd9e3146..0ba2bafa2f0 100644 --- a/intern/cycles/util/util_math_float4.h +++ b/intern/cycles/util/util_math_float4.h @@ -257,7 +257,12 @@ ccl_device_inline float distance(const float4 &a, const float4 &b) ccl_device_inline float dot(const float4 &a, const float4 &b) { # if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + __m128 t = vmulq_f32(a, b); + return vaddvq_f32(t); +# else return _mm_cvtss_f32(_mm_dp_ps(a, b, 0xFF)); +# endif # else return (a.x * b.x + a.y * b.y) + (a.z * b.z + a.w * b.w); # endif @@ -313,8 +318,10 @@ ccl_device_inline bool is_zero(const float4 &a) ccl_device_inline float4 reduce_add(const float4 &a) { -# ifdef __KERNEL_SSE__ -# ifdef __KERNEL_SSE3__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vaddvq_f32(a))); +# elif defined(__KERNEL_SSE3__) float4 h(_mm_hadd_ps(a.m128, a.m128)); return float4(_mm_hadd_ps(h.m128, h.m128)); # else @@ -373,8 +380,12 @@ ccl_device_inline float4 clamp(const float4 &a, const float4 &mn, const float4 & ccl_device_inline float4 fabs(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vabsq_f32(a)); +# else return float4(_mm_and_ps(a.m128, _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)))); +# endif # else return make_float4(fabsf(a.x), fabsf(a.y), fabsf(a.z), fabsf(a.w)); # endif @@ -400,14 +411,22 @@ ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t) template __forceinline const float4 shuffle(const float4 &b) { +# if defined(__KERNEL_NEON__) + return float4(shuffle_neon<__m128, index_0, index_1, index_2, index_3>(b.m128)); +# else return float4(_mm_castsi128_ps( _mm_shuffle_epi32(_mm_castps_si128(b), _MM_SHUFFLE(index_3, index_2, index_1, index_0)))); +# endif } template __forceinline const float4 shuffle(const float4 &a, const float4 &b) { +# if defined(__KERNEL_NEON__) + return float4(shuffle_neon<__m128, index_0, index_1, index_2, index_3>(a.m128, b.m128)); +# else return float4(_mm_shuffle_ps(a.m128, b.m128, _MM_SHUFFLE(index_3, index_2, index_1, index_0))); +# endif } template<> __forceinline const float4 shuffle<0, 1, 0, 1>(const float4 &b) @@ -457,9 +476,13 @@ ccl_device_inline float4 mask(const int4 &mask, const float4 &a) ccl_device_inline float4 reduce_min(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vminvq_f32(a))); +# else float4 h = min(shuffle<1, 0, 3, 2>(a), a); return min(shuffle<2, 3, 0, 1>(h), h); +# endif # else return make_float4(min(min(a.x, a.y), min(a.z, a.w))); # endif @@ -467,9 +490,13 @@ ccl_device_inline float4 reduce_min(const float4 &a) ccl_device_inline float4 reduce_max(const float4 &a) { -# ifdef __KERNEL_SSE__ +# if defined(__KERNEL_SSE__) +# if defined(__KERNEL_NEON__) + return float4(vdupq_n_f32(vmaxvq_f32(a))); +# else float4 h = max(shuffle<1, 0, 3, 2>(a), a); return max(shuffle<2, 3, 0, 1>(h), h); +# endif # else return make_float4(max(max(a.x, a.y), max(a.z, a.w))); # endif diff --git a/intern/cycles/util/util_optimization.h b/intern/cycles/util/util_optimization.h index 46dd883282a..7ecd3893cf4 100644 --- a/intern/cycles/util/util_optimization.h +++ b/intern/cycles/util/util_optimization.h @@ -27,44 +27,50 @@ /* We require minimum SSE2 support on x86, so auto enable. */ # define __KERNEL_SSE2__ - # ifdef WITH_KERNEL_SSE2 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 # endif - # ifdef WITH_KERNEL_SSE3 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3 # endif -# endif /* defined(i386) || defined(_M_IX86) */ - /* x86-64 * * Compile a regular (includes SSE2), SSE3, SSE 4.1, AVX and AVX2 kernel. */ -# if defined(__x86_64__) || defined(_M_X64) +# elif defined(__x86_64__) || defined(_M_X64) /* SSE2 is always available on x86-64 CPUs, so auto enable */ # define __KERNEL_SSE2__ - /* no SSE2 kernel on x86-64, part of regular kernel */ # ifdef WITH_KERNEL_SSE3 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3 # endif - # ifdef WITH_KERNEL_SSE41 # define WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 # endif - # ifdef WITH_KERNEL_AVX # define WITH_CYCLES_OPTIMIZED_KERNEL_AVX # endif - # ifdef WITH_KERNEL_AVX2 # define WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 # endif -# endif /* defined(__x86_64__) || defined(_M_X64) */ +/* Arm Neon + * + * Compile a SSE4 kernel emulated with Neon. Most code is shared with + * SSE, some specializations for performance and compatibility are made + * made testing for __KERNEL_NEON__. */ + +# elif defined(__ARM_NEON) && defined(WITH_SSE2NEON) + +# define __KERNEL_NEON__ +# define __KERNEL_SSE__ +# define __KERNEL_SSE2__ +# define __KERNEL_SSE3__ +# define __KERNEL_SSE41__ + +# endif #endif diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index 3a6761c6a2f..c51c3c957e0 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -35,6 +35,9 @@ # include #elif (defined(__x86_64__) || defined(__i386__)) # include +#elif defined(__KERNEL_NEON__) +# define SSE2NEON_PRECISE_MINMAX 1 +# include #endif /* Floating Point Control, for Embree. */ @@ -116,6 +119,80 @@ static struct StepTy { #endif +/* Utilities used by Neon */ +#if defined(__KERNEL_NEON__) +template type shuffle_neon(const type &a) +{ + if (i0 == i1 && i0 == i2 && i0 == i3) { + return vdupq_laneq_s32(a, i0); + } + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0, + (i2 * 4) + 1, + (i2 * 4) + 2, + (i2 * 4) + 3, + (i3 * 4) + 0, + (i3 * 4) + 1, + (i3 * 4) + 2, + (i3 * 4) + 3}; + + return vqtbl1q_s8(int8x16_t(a), *(int8x16_t *)tbl); +} + +template +type shuffle_neon(const type &a, const type &b) +{ + if (&a == &b) { + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0, + (i2 * 4) + 1, + (i2 * 4) + 2, + (i2 * 4) + 3, + (i3 * 4) + 0, + (i3 * 4) + 1, + (i3 * 4) + 2, + (i3 * 4) + 3}; + + return vqtbl1q_s8(int8x16_t(b), *(int8x16_t *)tbl); + } + else { + + static const uint8_t tbl[16] = {(i0 * 4) + 0, + (i0 * 4) + 1, + (i0 * 4) + 2, + (i0 * 4) + 3, + (i1 * 4) + 0, + (i1 * 4) + 1, + (i1 * 4) + 2, + (i1 * 4) + 3, + (i2 * 4) + 0 + 16, + (i2 * 4) + 1 + 16, + (i2 * 4) + 2 + 16, + (i2 * 4) + 3 + 16, + (i3 * 4) + 0 + 16, + (i3 * 4) + 1 + 16, + (i3 * 4) + 2 + 16, + (i3 * 4) + 3 + 16}; + + return vqtbl2q_s8((int8x16x2_t){a, b}, *(int8x16_t *)tbl); + } +} +#endif /* __KERNEL_NEON */ + /* Intrinsics Functions * * For fast bit operations. */ @@ -428,8 +505,9 @@ __forceinline __m128i _mm_max_epi32_emu(__m128i value, __m128i input) return _mm_blendv_epi8(value, input, _mm_cmplt_epi32(value, input)); } -# undef _mm_extract_epi32 -# define _mm_extract_epi32 _mm_extract_epi32_emu +# ifndef __KERNEL_NEON__ +# undef _mm_extract_epi32 +# define _mm_extract_epi32 _mm_extract_epi32_emu __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) { switch (index) { @@ -446,6 +524,7 @@ __forceinline int _mm_extract_epi32_emu(__m128i input, const int index) return 0; } } +# endif # undef _mm_insert_epi32 # define _mm_insert_epi32 _mm_insert_epi32_emu diff --git a/intern/cycles/util/util_sseb.h b/intern/cycles/util/util_sseb.h index edf13e0c493..1488da46b09 100644 --- a/intern/cycles/util/util_sseb.h +++ b/intern/cycles/util/util_sseb.h @@ -197,9 +197,14 @@ __forceinline const sseb unpackhi(const sseb &a, const sseb &b) template __forceinline const sseb shuffle(const sseb &a) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a); +# else return _mm_castsi128_ps(_mm_shuffle_epi32(a, _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const sseb shuffle<0, 1, 0, 1>(const sseb &a) { return _mm_movelh_ps(a, a); @@ -209,13 +214,19 @@ template<> __forceinline const sseb shuffle<2, 3, 2, 3>(const sseb &a) { return _mm_movehl_ps(a, a); } +# endif template __forceinline const sseb shuffle(const sseb &a, const sseb &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const sseb shuffle<0, 1, 0, 1>(const sseb &a, const sseb &b) { return _mm_movelh_ps(a, b); @@ -225,8 +236,9 @@ template<> __forceinline const sseb shuffle<2, 3, 2, 3>(const sseb &a, const sse { return _mm_movehl_ps(b, a); } +# endif -# if defined(__KERNEL_SSE3__) +# if defined(__KERNEL_SSE3__) && !defined(__KERNEL_NEON__) template<> __forceinline const sseb shuffle<0, 0, 2, 2>(const sseb &a) { return _mm_moveldup_ps(a); @@ -241,7 +253,16 @@ template<> __forceinline const sseb shuffle<1, 1, 3, 3>(const sseb &a) template __forceinline const sseb insert(const sseb &a, const sseb &b) { +# ifdef __KERNEL_NEON__ + sseb res = a; + if (clr) + res[dst] = 0; + else + res[dst] = b[src]; + return res; +# else return _mm_insert_ps(a, b, (dst << 4) | (src << 6) | clr); +# endif } template __forceinline const sseb insert(const sseb &a, const sseb &b) { @@ -260,7 +281,13 @@ template __forceinline const sseb insert(const sseb &a, const bool b # if defined(__KERNEL_SSE41__) __forceinline uint32_t popcnt(const sseb &a) { +# if defined(__KERNEL_NEON__) + const int32x4_t mask = {1, 1, 1, 1}; + int32x4_t t = vandq_s32(a.m128, mask); + return vaddvq_s32(t); +# else return _mm_popcnt_u32(_mm_movemask_ps(a)); +# endif } # else __forceinline uint32_t popcnt(const sseb &a) @@ -271,23 +298,43 @@ __forceinline uint32_t popcnt(const sseb &a) __forceinline bool reduce_and(const sseb &a) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(a.m128) == -4; +# else return _mm_movemask_ps(a) == 0xf; +# endif } __forceinline bool reduce_or(const sseb &a) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(a.m128) != 0x0; +# else return _mm_movemask_ps(a) != 0x0; +# endif } __forceinline bool all(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) == -4; +# else return _mm_movemask_ps(b) == 0xf; +# endif } __forceinline bool any(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) != 0x0; +# else return _mm_movemask_ps(b) != 0x0; +# endif } __forceinline bool none(const sseb &b) { +# if defined(__KERNEL_NEON__) + return vaddvq_s32(b.m128) == 0x0; +# else return _mm_movemask_ps(b) == 0x0; +# endif } __forceinline uint32_t movemask(const sseb &a) diff --git a/intern/cycles/util/util_ssef.h b/intern/cycles/util/util_ssef.h index b14640ced40..d039b50a7d2 100644 --- a/intern/cycles/util/util_ssef.h +++ b/intern/cycles/util/util_ssef.h @@ -303,41 +303,46 @@ __forceinline ssef maxi(const ssef &a, const ssef &b) /// Ternary Operators //////////////////////////////////////////////////////////////////////////////// -# if defined(__KERNEL_AVX2__) __forceinline const ssef madd(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmaq_f32(c, a, b); +# elif defined(__KERNEL_AVX2__) return _mm_fmadd_ps(a, b, c); -} -__forceinline const ssef msub(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fmsub_ps(a, b, c); -} -__forceinline const ssef nmadd(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fnmadd_ps(a, b, c); -} -__forceinline const ssef nmsub(const ssef &a, const ssef &b, const ssef &c) -{ - return _mm_fnmsub_ps(a, b, c); -} # else -__forceinline const ssef madd(const ssef &a, const ssef &b, const ssef &c) -{ return a * b + c; +# endif } __forceinline const ssef msub(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmaq_f32(vnegq_f32(c), a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fmsub_ps(a, b, c); +# else return a * b - c; +# endif } __forceinline const ssef nmadd(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmsq_f32(c, a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fnmadd_ps(a, b, c); +# else return c - a * b; +# endif } __forceinline const ssef nmsub(const ssef &a, const ssef &b, const ssef &c) { +# if defined(__KERNEL_NEON__) + return vfmsq_f32(vnegq_f32(c), a, b); +# elif defined(__KERNEL_AVX2__) + return _mm_fnmsub_ps(a, b, c); +# else return -a * b - c; -} # endif +} //////////////////////////////////////////////////////////////////////////////// /// Assignment Operators @@ -496,27 +501,51 @@ __forceinline const ssef select(const int mask, const ssef &t, const ssef &f) # if defined(__KERNEL_SSE41__) __forceinline const ssef round_even(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndnq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT); +# endif } __forceinline const ssef round_down(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndmq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEG_INF); +# endif } __forceinline const ssef round_up(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndpq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_POS_INF); +# endif } __forceinline const ssef round_zero(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_ZERO); +# endif } __forceinline const ssef floor(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndnq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_NEG_INF); +# endif } __forceinline const ssef ceil(const ssef &a) { +# ifdef __KERNEL_NEON__ + return vrndpq_f32(a); +# else return _mm_round_ps(a, _MM_FROUND_TO_POS_INF); +# endif } # endif @@ -566,7 +595,11 @@ __forceinline ssef unpackhi(const ssef &a, const ssef &b) template __forceinline const ssef shuffle(const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(b.m128); +# else return _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(b), _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } template<> __forceinline const ssef shuffle<0, 1, 0, 1>(const ssef &a) @@ -582,14 +615,23 @@ template<> __forceinline const ssef shuffle<2, 3, 2, 3>(const ssef &a) template __forceinline const ssef shuffle(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } template __forceinline const ssef shuffle(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + return shuffle(a, b); +# else return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i0, i0, i0, i0)); +# endif } +# ifndef __KERNEL_NEON__ template<> __forceinline const ssef shuffle<0, 1, 0, 1>(const ssef &a, const ssef &b) { return _mm_movelh_ps(a, b); @@ -599,6 +641,7 @@ template<> __forceinline const ssef shuffle<2, 3, 2, 3>(const ssef &a, const sse { return _mm_movehl_ps(b, a); } +# endif # if defined(__KERNEL_SSSE3__) __forceinline const ssef shuffle8(const ssef &a, const ssei &shuf) @@ -643,7 +686,16 @@ template<> __forceinline float extract<0>(const ssef &a) template __forceinline const ssef insert(const ssef &a, const ssef &b) { +# ifdef __KERNEL_NEON__ + ssef res = a; + if (clr) + res[dst] = 0; + else + res[dst] = b[src]; + return res; +# else return _mm_insert_ps(a, b, (dst << 4) | (src << 6) | clr); +# endif } template __forceinline const ssef insert(const ssef &a, const ssef &b) { @@ -703,31 +755,55 @@ __forceinline void transpose( __forceinline const ssef vreduce_min(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vminvq_f32(v)); +# else ssef h = min(shuffle<1, 0, 3, 2>(v), v); return min(shuffle<2, 3, 0, 1>(h), h); +# endif } __forceinline const ssef vreduce_max(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vmaxvq_f32(v)); +# else ssef h = max(shuffle<1, 0, 3, 2>(v), v); return max(shuffle<2, 3, 0, 1>(h), h); +# endif } __forceinline const ssef vreduce_add(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vdupq_n_f32(vaddvq_f32(v)); +# else ssef h = shuffle<1, 0, 3, 2>(v) + v; return shuffle<2, 3, 0, 1>(h) + h; +# endif } __forceinline float reduce_min(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vminvq_f32(v); +# else return _mm_cvtss_f32(vreduce_min(v)); +# endif } __forceinline float reduce_max(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vmaxvq_f32(v); +# else return _mm_cvtss_f32(vreduce_max(v)); +# endif } __forceinline float reduce_add(const ssef &v) { +# ifdef __KERNEL_NEON__ + return vaddvq_f32(v); +# else return _mm_cvtss_f32(vreduce_add(v)); +# endif } __forceinline uint32_t select_min(const ssef &v) @@ -942,14 +1018,14 @@ ccl_device_inline const ssef shuffle_swap(const ssef &a, shuffle_swap_t shuf) { /* shuffle value must be a constant, so we need to branch */ if (shuf) - return ssef(_mm_shuffle_ps(a.m128, a.m128, _MM_SHUFFLE(1, 0, 3, 2))); + return shuffle<1, 0, 3, 2>(a); else - return ssef(_mm_shuffle_ps(a.m128, a.m128, _MM_SHUFFLE(3, 2, 1, 0))); + return shuffle<3, 2, 1, 0>(a); } # endif -# ifdef __KERNEL_SSE41__ +# if defined(__KERNEL_SSE41__) && !defined(__KERNEL_NEON__) ccl_device_inline void gen_idirsplat_swap(const ssef &pn, const shuffle_swap_t &shuf_identity, diff --git a/intern/cycles/util/util_ssei.h b/intern/cycles/util/util_ssei.h index c03ab18a6df..3ec69ab3700 100644 --- a/intern/cycles/util/util_ssei.h +++ b/intern/cycles/util/util_ssei.h @@ -445,14 +445,22 @@ __forceinline ssei unpackhi(const ssei &a, const ssei &b) template __forceinline const ssei shuffle(const ssei &a) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a); +# else return _mm_shuffle_epi32(a, _MM_SHUFFLE(i3, i2, i1, i0)); +# endif } template __forceinline const ssei shuffle(const ssei &a, const ssei &b) { +# ifdef __KERNEL_NEON__ + return shuffle_neon(a, b); +# else return _mm_castps_si128( _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), _MM_SHUFFLE(i3, i2, i1, i0))); +# endif } template __forceinline const ssei shuffle(const ssei &b) @@ -505,15 +513,27 @@ __forceinline const ssei vreduce_add(const ssei &v) __forceinline int reduce_min(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vminvq_s32(v); +# else return extract<0>(vreduce_min(v)); +# endif } __forceinline int reduce_max(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vmaxvq_s32(v); +# else return extract<0>(vreduce_max(v)); +# endif } __forceinline int reduce_add(const ssei &v) { +# ifdef __KERNEL_NEON__ + return vaddvq_s32(v); +# else return extract<0>(vreduce_add(v)); +# endif } __forceinline uint32_t select_min(const ssei &v) From 351d8bfc41a7ab983a20a1843dec550c9b198a38 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 17 Feb 2021 06:13:49 +0100 Subject: [PATCH 253/519] Fix T85694: Cycles incorrect grayscale conversion with some OpenColorIO configs --- intern/cycles/render/shader.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 1b785fe9096..847f97fb2bf 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -873,6 +873,10 @@ void ShaderManager::init_xyz_transforms() return; } } + else { + /* No reference role found to determine XYZ. */ + return; + } xyz_to_r = float4_to_float3(xyz_to_rgb.x); xyz_to_g = float4_to_float3(xyz_to_rgb.y); From ec8c09f2aafdc7c13bb27c0f74e9def83c0400c7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 17 Feb 2021 06:19:01 +0100 Subject: [PATCH 254/519] Cleanup: fix compiler warnings --- source/blender/blenlib/intern/system.c | 1 + .../intern/blender_interface/BlenderStrokeRenderer.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/blenlib/intern/system.c b/source/blender/blenlib/intern/system.c index e32f310549c..f4110c65a6d 100644 --- a/source/blender/blenlib/intern/system.c +++ b/source/blender/blenlib/intern/system.c @@ -128,6 +128,7 @@ static void __cpuid( : "a"(selector) : "ebx"); # else + (void)selector; data[0] = data[1] = data[2] = data[3] = 0; # endif } diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index f761b1f6243..4f6ffc451c8 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -628,7 +628,7 @@ void BlenderStrokeRenderer::GenerateStrokeMesh(StrokeGroup *group, bool hasTex) mesh->mloopcol = colors; mesh->mat = (Material **)MEM_mallocN(sizeof(Material *) * mesh->totcol, "MaterialList"); - for (const auto &item : group->materials.items()) { + for (const auto item : group->materials.items()) { Material *material = item.key; const int matnr = item.value; mesh->mat[matnr] = material; From 4430e8a00810ca8df2fa20029c4cb8078e8cdbe6 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 17 Feb 2021 10:48:08 -0300 Subject: [PATCH 255/519] Python: gpu module: add new submodules and types This commit extends the gpu python API with: ``` gpu.types.Buffer #"__init__", "to_list" gpu.types.GPUTexture #"__init__", "clear", "read", "format" gpu.types.GPUFrameBuffer #"__init__", "bind", "clear", "is_bound", "viewport", ("__enter__", "__exit__" with "GPUFrameBufferStackContext") gpu.types.GPUUniformBuf #"__init__", "update" gpu.state #"blend_set", "blend_get", "depth_test_set", "depth_test_get", "depth_mask_set", "depth_mask_get", "viewport_set", "viewport_get", "line_width_set", "line_width_get", "point_size_set", "color_mask_set", "face_culling_set", "front_facing_set", "program_point_size_set" ``` Add these methods to existing objects: ``` gpu.types.GPUShader #"uniform_sample", "uniform_buffer" ``` Maniphest Tasks: T80481 Differential Revision: https://developer.blender.org/D8826 --- source/blender/gpu/GPU_framebuffer.h | 4 + source/blender/gpu/GPU_texture.h | 4 + source/blender/gpu/intern/gpu_framebuffer.cc | 27 +- source/blender/gpu/intern/gpu_texture.cc | 17 + .../blender/gpu/intern/gpu_texture_private.hh | 11 +- source/blender/python/generic/py_capi_utils.c | 11 + source/blender/python/generic/py_capi_utils.h | 2 + source/blender/python/gpu/CMakeLists.txt | 12 + source/blender/python/gpu/gpu_py.c | 45 ++ source/blender/python/gpu/gpu_py.h | 23 + source/blender/python/gpu/gpu_py_api.c | 4 + source/blender/python/gpu/gpu_py_api.h | 4 + source/blender/python/gpu/gpu_py_buffer.c | 669 ++++++++++++++++++ source/blender/python/gpu/gpu_py_buffer.h | 53 ++ .../blender/python/gpu/gpu_py_framebuffer.c | 546 ++++++++++++++ .../blender/python/gpu/gpu_py_framebuffer.h | 33 + source/blender/python/gpu/gpu_py_offscreen.c | 260 ++++--- source/blender/python/gpu/gpu_py_offscreen.h | 1 - source/blender/python/gpu/gpu_py_shader.c | 70 ++ source/blender/python/gpu/gpu_py_state.c | 423 +++++++++++ source/blender/python/gpu/gpu_py_state.h | 23 + source/blender/python/gpu/gpu_py_texture.c | 559 +++++++++++++++ source/blender/python/gpu/gpu_py_texture.h | 34 + source/blender/python/gpu/gpu_py_types.c | 16 + source/blender/python/gpu/gpu_py_types.h | 5 + .../blender/python/gpu/gpu_py_uniformbuffer.c | 195 +++++ .../blender/python/gpu/gpu_py_uniformbuffer.h | 33 + 27 files changed, 2974 insertions(+), 110 deletions(-) create mode 100644 source/blender/python/gpu/gpu_py.c create mode 100644 source/blender/python/gpu/gpu_py.h create mode 100644 source/blender/python/gpu/gpu_py_buffer.c create mode 100644 source/blender/python/gpu/gpu_py_buffer.h create mode 100644 source/blender/python/gpu/gpu_py_framebuffer.c create mode 100644 source/blender/python/gpu/gpu_py_framebuffer.h create mode 100644 source/blender/python/gpu/gpu_py_state.c create mode 100644 source/blender/python/gpu/gpu_py_state.h create mode 100644 source/blender/python/gpu/gpu_py_texture.c create mode 100644 source/blender/python/gpu/gpu_py_texture.h create mode 100644 source/blender/python/gpu/gpu_py_uniformbuffer.c create mode 100644 source/blender/python/gpu/gpu_py_uniformbuffer.h diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index 8c6592adf6d..af94c1fb0e6 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -209,6 +209,10 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb, void (*callback)(void *userData, int level), void *userData); +void GPU_framebuffer_push(GPUFrameBuffer *fb); +GPUFrameBuffer *GPU_framebuffer_pop(void); +uint GPU_framebuffer_stack_level_get(void); + /* GPU OffScreen * - wrapper around frame-buffer and texture for simple off-screen drawing */ diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index da2d2639440..176d7bbb5af 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -272,6 +272,10 @@ int GPU_texture_opengl_bindcode(const GPUTexture *tex); void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size); +/* utilities */ +size_t GPU_texture_component_len(eGPUTextureFormat format); +size_t GPU_texture_dataformat_size(eGPUDataFormat data_format); + #ifdef __cplusplus } #endif diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 2e183f52eea..2813132c799 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -476,10 +476,9 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb, /** \} */ /* -------------------------------------------------------------------- */ -/** \name GPUOffScreen +/** \name Framebuffer Stack * - * Container that holds a frame-buffer and its textures. - * Might be bound to multiple contexts. + * Keeps track of framebuffer binding operation to restore previously bound frambuffers. * \{ */ #define FRAMEBUFFER_STACK_DEPTH 16 @@ -489,22 +488,36 @@ static struct { uint top; } FrameBufferStack = {{nullptr}}; -static void gpuPushFrameBuffer(GPUFrameBuffer *fb) +void GPU_framebuffer_push(GPUFrameBuffer *fb) { BLI_assert(FrameBufferStack.top < FRAMEBUFFER_STACK_DEPTH); FrameBufferStack.framebuffers[FrameBufferStack.top] = fb; FrameBufferStack.top++; } -static GPUFrameBuffer *gpuPopFrameBuffer() +GPUFrameBuffer *GPU_framebuffer_pop(void) { BLI_assert(FrameBufferStack.top > 0); FrameBufferStack.top--; return FrameBufferStack.framebuffers[FrameBufferStack.top]; } +uint GPU_framebuffer_stack_level_get(void) +{ + return FrameBufferStack.top; +} + #undef FRAMEBUFFER_STACK_DEPTH +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUOffScreen + * + * Container that holds a frame-buffer and its textures. + * Might be bound to multiple contexts. + * \{ */ + #define MAX_CTX_FB_LEN 3 struct GPUOffScreen { @@ -614,7 +627,7 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save) { if (save) { GPUFrameBuffer *fb = GPU_framebuffer_active_get(); - gpuPushFrameBuffer(fb); + GPU_framebuffer_push(fb); } unwrap(gpu_offscreen_fb_get(ofs))->bind(false); } @@ -623,7 +636,7 @@ void GPU_offscreen_unbind(GPUOffScreen *UNUSED(ofs), bool restore) { GPUFrameBuffer *fb = nullptr; if (restore) { - fb = gpuPopFrameBuffer(); + fb = GPU_framebuffer_pop(); } if (fb) { diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc index d134d718cbe..2b83b3bc28c 100644 --- a/source/blender/gpu/intern/gpu_texture.cc +++ b/source/blender/gpu/intern/gpu_texture.cc @@ -608,3 +608,20 @@ void GPU_samplers_update(void) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPU texture utilities + * + * \{ */ + +size_t GPU_texture_component_len(eGPUTextureFormat tex_format) +{ + return to_component_len(tex_format); +} + +size_t GPU_texture_dataformat_size(eGPUDataFormat data_format) +{ + return to_bytesize(data_format); +} + +/** \} */ diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index 400a36559da..51a953e110d 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -384,15 +384,15 @@ inline int to_component_len(eGPUTextureFormat format) } } -inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format) +inline size_t to_bytesize(eGPUDataFormat data_format) { switch (data_format) { case GPU_DATA_UNSIGNED_BYTE: - return 1 * to_component_len(tex_format); + return 1; case GPU_DATA_FLOAT: case GPU_DATA_INT: case GPU_DATA_UNSIGNED_INT: - return 4 * to_component_len(tex_format); + return 4; case GPU_DATA_UNSIGNED_INT_24_8: case GPU_DATA_10_11_11_REV: return 4; @@ -402,6 +402,11 @@ inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_form } } +inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format) +{ + return to_component_len(tex_format) * to_bytesize(data_format); +} + /* Definitely not complete, edit according to the gl specification. */ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat data_format) { diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index c7ce264f2f9..351ba884d49 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -282,6 +282,17 @@ int PyC_ParseStringEnum(PyObject *o, void *p) return 0; } +const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, + const int value) +{ + for (int i = 0; items[i].id; i++) { + if (items[i].value == value) { + return items[i].id; + } + } + return NULL; +} + /* silly function, we dont use arg. just check its compatible with __deepcopy__ */ int PyC_CheckArgs_DeepCopy(PyObject *args) { diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index aacc5dd7bea..842e1482c06 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -140,6 +140,8 @@ struct PyC_StringEnum { }; int PyC_ParseStringEnum(PyObject *o, void *p); +const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, + const int value); int PyC_CheckArgs_DeepCopy(PyObject *args); diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt index 7f6fd9eefab..fe5c559fcc0 100644 --- a/source/blender/python/gpu/CMakeLists.txt +++ b/source/blender/python/gpu/CMakeLists.txt @@ -33,25 +33,37 @@ set(INC_SYS ) set(SRC + gpu_py.c gpu_py_api.c gpu_py_batch.c + gpu_py_buffer.c gpu_py_element.c + gpu_py_framebuffer.c gpu_py_matrix.c gpu_py_offscreen.c gpu_py_select.c gpu_py_shader.c + gpu_py_state.c + gpu_py_texture.c gpu_py_types.c + gpu_py_uniformbuffer.c gpu_py_vertex_buffer.c gpu_py_vertex_format.c + gpu_py.h gpu_py_api.h gpu_py_batch.h + gpu_py_buffer.h gpu_py_element.h + gpu_py_framebuffer.h gpu_py_matrix.h gpu_py_offscreen.h gpu_py_select.h gpu_py_shader.h + gpu_py_state.h + gpu_py_texture.h gpu_py_types.h + gpu_py_uniformbuffer.h gpu_py_vertex_buffer.h gpu_py_vertex_format.h ) diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c new file mode 100644 index 00000000000..522cd89c5c0 --- /dev/null +++ b/source/blender/python/gpu/gpu_py.c @@ -0,0 +1,45 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPU Module + * \{ */ + +struct PyC_StringEnumItems bpygpu_dataformat_items[] = { + {GPU_DATA_FLOAT, "FLOAT"}, + {GPU_DATA_INT, "INT"}, + {GPU_DATA_UNSIGNED_INT, "UINT"}, + {GPU_DATA_UNSIGNED_BYTE, "UBYTE"}, + {GPU_DATA_UNSIGNED_INT_24_8, "UINT_24_8"}, + {GPU_DATA_10_11_11_REV, "10_11_11_REV"}, + {0, NULL}, +}; +/** \} */ diff --git a/source/blender/python/gpu/gpu_py.h b/source/blender/python/gpu/gpu_py.h new file mode 100644 index 00000000000..8a96391664f --- /dev/null +++ b/source/blender/python/gpu/gpu_py.h @@ -0,0 +1,23 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +extern struct PyC_StringEnumItems bpygpu_dataformat_items[]; diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index dcc8484319e..38e9b61e147 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -35,6 +35,7 @@ #include "gpu_py_matrix.h" #include "gpu_py_select.h" +#include "gpu_py_state.h" #include "gpu_py_types.h" #include "gpu_py_api.h" /* own include */ @@ -134,6 +135,9 @@ PyObject *BPyInit_gpu(void) PyModule_AddObject(mod, "shader", (submodule = bpygpu_shader_init())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + PyModule_AddObject(mod, "state", (submodule = bpygpu_state_init())); + PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + return mod; } diff --git a/source/blender/python/gpu/gpu_py_api.h b/source/blender/python/gpu/gpu_py_api.h index b8f0cde129f..fe645d8cd3a 100644 --- a/source/blender/python/gpu/gpu_py_api.h +++ b/source/blender/python/gpu/gpu_py_api.h @@ -20,6 +20,10 @@ #pragma once +/* Each type object could have a method for free GPU resources. + * However, it is currently of little use. */ +// #define BPYGPU_USE_GPUOBJ_FREE_METHOD + int bpygpu_ParsePrimType(PyObject *o, void *p); PyObject *BPyInit_gpu(void); diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c new file mode 100644 index 00000000000..aef819aec39 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -0,0 +1,669 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the gpu.state API. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_utildefines.h" + +#include "MEM_guardedalloc.h" + +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" + +#include "gpu_py_buffer.h" + +// #define PYGPU_BUFFER_PROTOCOL + +/* -------------------------------------------------------------------- */ +/** \name Utility Functions + * \{ */ + +static bool pygpu_buffer_dimensions_compare(int ndim, + const Py_ssize_t *shape_a, + const Py_ssize_t *shape_b) +{ + return (bool)memcmp(shape_a, shape_b, ndim * sizeof(Py_ssize_t)); +} + +static const char *pygpu_buffer_formatstr(eGPUDataFormat data_format) +{ + switch (data_format) { + case GPU_DATA_FLOAT: + return "f"; + case GPU_DATA_INT: + return "i"; + case GPU_DATA_UNSIGNED_INT: + return "I"; + case GPU_DATA_UNSIGNED_BYTE: + return "B"; + case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_10_11_11_REV: + return "I"; + default: + break; + } + return NULL; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name BPyGPUBuffer API + * \{ */ + +static BPyGPUBuffer *pygpu_buffer_make_from_data(PyObject *parent, + const eGPUDataFormat format, + const int shape_len, + const Py_ssize_t *shape, + void *buf) +{ + BPyGPUBuffer *buffer = (BPyGPUBuffer *)_PyObject_GC_New(&BPyGPU_BufferType); + + buffer->parent = NULL; + buffer->format = format; + buffer->shape_len = shape_len; + buffer->shape = MEM_mallocN(shape_len * sizeof(*buffer->shape), "BPyGPUBuffer shape"); + memcpy(buffer->shape, shape, shape_len * sizeof(*buffer->shape)); + buffer->buf.as_void = buf; + + if (parent) { + Py_INCREF(parent); + buffer->parent = parent; + PyObject_GC_Track(buffer); + } + return buffer; +} + +static PyObject *pygpu_buffer__sq_item(BPyGPUBuffer *self, int i) +{ + if (i >= self->shape[0] || i < 0) { + PyErr_SetString(PyExc_IndexError, "array index out of range"); + return NULL; + } + + const char *formatstr = pygpu_buffer_formatstr(self->format); + + if (self->shape_len == 1) { + switch (self->format) { + case GPU_DATA_FLOAT: + return Py_BuildValue(formatstr, self->buf.as_float[i]); + case GPU_DATA_INT: + return Py_BuildValue(formatstr, self->buf.as_int[i]); + case GPU_DATA_UNSIGNED_BYTE: + return Py_BuildValue(formatstr, self->buf.as_byte[i]); + case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_10_11_11_REV: + return Py_BuildValue(formatstr, self->buf.as_uint[i]); + } + } + else { + int offset = i * GPU_texture_dataformat_size(self->format); + for (int j = 1; j < self->shape_len; j++) { + offset *= self->shape[j]; + } + + return (PyObject *)pygpu_buffer_make_from_data((PyObject *)self, + self->format, + self->shape_len - 1, + self->shape + 1, + self->buf.as_byte + offset); + } + + return NULL; +} + +static PyObject *pygpu_buffer_to_list(BPyGPUBuffer *self) +{ + int i, len = self->shape[0]; + PyObject *list = PyList_New(len); + + for (i = 0; i < len; i++) { + PyList_SET_ITEM(list, i, pygpu_buffer__sq_item(self, i)); + } + + return list; +} + +static PyObject *pygpu_buffer_to_list_recursive(BPyGPUBuffer *self) +{ + PyObject *list; + + if (self->shape_len > 1) { + int i, len = self->shape[0]; + list = PyList_New(len); + + for (i = 0; i < len; i++) { + /* "BPyGPUBuffer *sub_tmp" is a temporary object created just to be read for nested lists. + * That is why it is decremented/freed soon after. + * TODO: For efficiency, avoid creating #BPyGPUBuffer when creating nested lists. */ + BPyGPUBuffer *sub_tmp = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i); + PyList_SET_ITEM(list, i, pygpu_buffer_to_list_recursive(sub_tmp)); + Py_DECREF(sub_tmp); + } + } + else { + list = pygpu_buffer_to_list(self); + } + + return list; +} + +static PyObject *pygpu_buffer_dimensions(BPyGPUBuffer *self, void *UNUSED(arg)) +{ + PyObject *list = PyList_New(self->shape_len); + int i; + + for (i = 0; i < self->shape_len; i++) { + PyList_SET_ITEM(list, i, PyLong_FromLong(self->shape[i])); + } + + return list; +} + +static int pygpu_buffer__tp_traverse(BPyGPUBuffer *self, visitproc visit, void *arg) +{ + Py_VISIT(self->parent); + return 0; +} + +static int pygpu_buffer__tp_clear(BPyGPUBuffer *self) +{ + Py_CLEAR(self->parent); + return 0; +} + +static void pygpu_buffer__tp_dealloc(BPyGPUBuffer *self) +{ + if (self->parent) { + PyObject_GC_UnTrack(self); + pygpu_buffer__tp_clear(self); + Py_XDECREF(self->parent); + } + else { + MEM_freeN(self->buf.as_void); + } + + MEM_freeN(self->shape); + + PyObject_GC_Del(self); +} + +static PyObject *pygpu_buffer__tp_repr(BPyGPUBuffer *self) +{ + PyObject *repr; + + PyObject *list = pygpu_buffer_to_list_recursive(self); + const char *typestr = PyC_StringEnum_FindIDFromValue(bpygpu_dataformat_items, self->format); + + repr = PyUnicode_FromFormat("Buffer(%s, %R)", typestr, list); + Py_DECREF(list); + + return repr; +} + +static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v); + +static int pygpu_buffer_ass_slice(BPyGPUBuffer *self, + Py_ssize_t begin, + Py_ssize_t end, + PyObject *seq) +{ + PyObject *item; + int count, err = 0; + + if (begin < 0) { + begin = 0; + } + if (end > self->shape[0]) { + end = self->shape[0]; + } + if (begin > end) { + begin = end; + } + + if (!PySequence_Check(seq)) { + PyErr_Format(PyExc_TypeError, + "buffer[:] = value, invalid assignment. " + "Expected a sequence, not an %.200s type", + Py_TYPE(seq)->tp_name); + return -1; + } + + /* re-use count var */ + if ((count = PySequence_Size(seq)) != (end - begin)) { + PyErr_Format(PyExc_TypeError, + "buffer[:] = value, size mismatch in assignment. " + "Expected: %d (given: %d)", + count, + end - begin); + return -1; + } + + for (count = begin; count < end; count++) { + item = PySequence_GetItem(seq, count - begin); + if (item) { + err = pygpu_buffer__sq_ass_item(self, count, item); + Py_DECREF(item); + } + else { + err = -1; + } + if (err) { + break; + } + } + return err; +} + +#define MAX_DIMENSIONS 64 +static PyObject *pygpu_buffer__tp_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) +{ + PyObject *length_ob, *init = NULL; + BPyGPUBuffer *buffer = NULL; + Py_ssize_t shape[MAX_DIMENSIONS]; + + Py_ssize_t i, shape_len = 0; + + if (kwds && PyDict_Size(kwds)) { + PyErr_SetString(PyExc_TypeError, "Buffer(): takes no keyword args"); + return NULL; + } + + const struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items, GPU_DATA_FLOAT}; + if (!PyArg_ParseTuple( + args, "O&O|O: Buffer", PyC_ParseStringEnum, &pygpu_dataformat, &length_ob, &init)) { + return NULL; + } + + if (PyLong_Check(length_ob)) { + shape_len = 1; + if (((shape[0] = PyLong_AsLong(length_ob)) < 1)) { + PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1"); + return NULL; + } + } + else if (PySequence_Check(length_ob)) { + shape_len = PySequence_Size(length_ob); + if (shape_len > MAX_DIMENSIONS) { + PyErr_SetString(PyExc_AttributeError, + "too many dimensions, max is " STRINGIFY(MAX_DIMENSIONS)); + return NULL; + } + if (shape_len < 1) { + PyErr_SetString(PyExc_AttributeError, "sequence must have at least one dimension"); + return NULL; + } + + for (i = 0; i < shape_len; i++) { + PyObject *ob = PySequence_GetItem(length_ob, i); + if (!PyLong_Check(ob)) { + PyErr_Format(PyExc_TypeError, + "invalid dimension %i, expected an int, not a %.200s", + i, + Py_TYPE(ob)->tp_name); + Py_DECREF(ob); + return NULL; + } + else { + shape[i] = PyLong_AsLong(ob); + } + Py_DECREF(ob); + + if (shape[i] < 1) { + PyErr_SetString(PyExc_AttributeError, "dimension must be greater than or equal to 1"); + return NULL; + } + } + } + else { + PyErr_Format(PyExc_TypeError, + "invalid second argument argument expected a sequence " + "or an int, not a %.200s", + Py_TYPE(length_ob)->tp_name); + return NULL; + } + + if (init && PyObject_CheckBuffer(init)) { + Py_buffer pybuffer; + + if (PyObject_GetBuffer(init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) { + /* PyObject_GetBuffer raise a PyExc_BufferError */ + return NULL; + } + + if (shape_len != pybuffer.ndim || + !pygpu_buffer_dimensions_compare(shape_len, shape, pybuffer.shape)) { + PyErr_Format(PyExc_TypeError, "array size does not match"); + } + else { + buffer = pygpu_buffer_make_from_data( + init, pygpu_dataformat.value_found, pybuffer.ndim, shape, pybuffer.buf); + } + + PyBuffer_Release(&pybuffer); + } + else { + buffer = BPyGPU_Buffer_CreatePyObject(pygpu_dataformat.value_found, shape_len, shape, NULL); + if (init && pygpu_buffer_ass_slice(buffer, 0, shape[0], init)) { + Py_DECREF(buffer); + return NULL; + } + } + + return (PyObject *)buffer; +} + +/* BPyGPUBuffer sequence methods */ + +static int pygpu_buffer__sq_length(BPyGPUBuffer *self) +{ + return self->shape[0]; +} + +static PyObject *pygpu_buffer_slice(BPyGPUBuffer *self, Py_ssize_t begin, Py_ssize_t end) +{ + PyObject *list; + Py_ssize_t count; + + if (begin < 0) { + begin = 0; + } + if (end > self->shape[0]) { + end = self->shape[0]; + } + if (begin > end) { + begin = end; + } + + list = PyList_New(end - begin); + + for (count = begin; count < end; count++) { + PyList_SET_ITEM(list, count - begin, pygpu_buffer__sq_item(self, count)); + } + return list; +} + +static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v) +{ + if (i >= self->shape[0] || i < 0) { + PyErr_SetString(PyExc_IndexError, "array assignment index out of range"); + return -1; + } + + if (self->shape_len != 1) { + BPyGPUBuffer *row = (BPyGPUBuffer *)pygpu_buffer__sq_item(self, i); + + if (row) { + const int ret = pygpu_buffer_ass_slice(row, 0, self->shape[1], v); + Py_DECREF(row); + return ret; + } + + return -1; + } + + switch (self->format) { + case GPU_DATA_FLOAT: + return PyArg_Parse(v, "f:Expected floats", &self->buf.as_float[i]) ? 0 : -1; + case GPU_DATA_INT: + return PyArg_Parse(v, "i:Expected ints", &self->buf.as_int[i]) ? 0 : -1; + case GPU_DATA_UNSIGNED_BYTE: + return PyArg_Parse(v, "b:Expected ints", &self->buf.as_byte[i]) ? 0 : -1; + case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_10_11_11_REV: + return PyArg_Parse(v, "b:Expected ints", &self->buf.as_uint[i]) ? 0 : -1; + default: + return 0; /* should never happen */ + } +} + +static PyObject *pygpu_buffer__mp_subscript(BPyGPUBuffer *self, PyObject *item) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return NULL; + } + if (i < 0) { + i += self->shape[0]; + } + return pygpu_buffer__sq_item(self, i); + } + if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) { + return NULL; + } + + if (slicelength <= 0) { + return PyTuple_New(0); + } + if (step == 1) { + return pygpu_buffer_slice(self, start, stop); + } + + PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors"); + return NULL; + } + + PyErr_Format( + PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name); + return NULL; +} + +static int pygpu_buffer__mp_ass_subscript(BPyGPUBuffer *self, PyObject *item, PyObject *value) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return -1; + } + if (i < 0) { + i += self->shape[0]; + } + return pygpu_buffer__sq_ass_item(self, i, value); + } + if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->shape[0], &start, &stop, &step, &slicelength) < 0) { + return -1; + } + + if (step == 1) { + return pygpu_buffer_ass_slice(self, start, stop, value); + } + + PyErr_SetString(PyExc_IndexError, "slice steps not supported with vectors"); + return -1; + } + + PyErr_Format( + PyExc_TypeError, "buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name); + return -1; +} + +static PyMethodDef pygpu_buffer__tp_methods[] = { + {"to_list", + (PyCFunction)pygpu_buffer_to_list_recursive, + METH_NOARGS, + "return the buffer as a list"}, + {NULL, NULL, 0, NULL}, +}; + +static PyGetSetDef pygpu_buffer_getseters[] = { + {"dimensions", (getter)pygpu_buffer_dimensions, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL}, +}; + +static PySequenceMethods pygpu_buffer__tp_as_sequence = { + (lenfunc)pygpu_buffer__sq_length, /*sq_length */ + (binaryfunc)NULL, /*sq_concat */ + (ssizeargfunc)NULL, /*sq_repeat */ + (ssizeargfunc)pygpu_buffer__sq_item, /*sq_item */ + (ssizessizeargfunc)NULL, /*sq_slice, deprecated, handled in pygpu_buffer__sq_item */ + (ssizeobjargproc)pygpu_buffer__sq_ass_item, /*sq_ass_item */ + (ssizessizeobjargproc)NULL, /* sq_ass_slice, deprecated handled in pygpu_buffer__sq_ass_item */ + (objobjproc)NULL, /* sq_contains */ + (binaryfunc)NULL, /* sq_inplace_concat */ + (ssizeargfunc)NULL, /* sq_inplace_repeat */ +}; + +static PyMappingMethods pygpu_buffer__tp_as_mapping = { + (lenfunc)pygpu_buffer__sq_length, + (binaryfunc)pygpu_buffer__mp_subscript, + (objobjargproc)pygpu_buffer__mp_ass_subscript, +}; + +#ifdef PYGPU_BUFFER_PROTOCOL +static void pygpu_buffer_strides_calc(const eGPUDataFormat format, + const int shape_len, + const Py_ssize_t *shape, + Py_ssize_t *r_strides) +{ + r_strides[0] = GPU_texture_dataformat_size(format); + for (int i = 1; i < shape_len; i++) { + r_strides[i] = r_strides[i - 1] * shape[i - 1]; + } +} + +/* Here is the buffer interface function */ +static int pygpu_buffer__bf_getbuffer(BPyGPUBuffer *self, Py_buffer *view, int flags) +{ + if (view == NULL) { + PyErr_SetString(PyExc_ValueError, "NULL view in getbuffer"); + return -1; + } + + view->obj = (PyObject *)self; + view->buf = (void *)self->buf.as_void; + view->len = bpygpu_Buffer_size(self); + view->readonly = 0; + view->itemsize = GPU_texture_dataformat_size(self->format); + view->format = pygpu_buffer_formatstr(self->format); + view->ndim = self->shape_len; + view->shape = self->shape; + view->strides = MEM_mallocN(view->ndim * sizeof(*view->strides), "BPyGPUBuffer strides"); + pygpu_buffer_strides_calc(self->format, view->ndim, view->shape, view->strides); + view->suboffsets = NULL; + view->internal = NULL; + + Py_INCREF(self); + return 0; +} + +static void pygpu_buffer__bf_releasebuffer(PyObject *UNUSED(exporter), Py_buffer *view) +{ + MEM_SAFE_FREE(view->strides); +} + +static PyBufferProcs pygpu_buffer__tp_as_buffer = { + (getbufferproc)pygpu_buffer__bf_getbuffer, + (releasebufferproc)pygpu_buffer__bf_releasebuffer, +}; +#endif + +PyDoc_STRVAR(pygpu_buffer__tp_doc, + ".. class:: Buffer(format, dimensions, data)\n" + "\n" + " For Python access to GPU functions requiring a pointer.\n" + "\n" + " :arg format: One of these primitive types: {\n" + " `FLOAT`,\n" + " `INT`,\n" + " `UINT`,\n" + " `UBYTE`,\n" + " `UINT_24_8`,\n" + " `10_11_11_REV`,\n" + " :type type: `str`\n" + " :arg dimensions: Array describing the dimensions.\n" + " :type dimensions: `int`\n" + " :arg data: Optional data array.\n" + " :type data: `array`\n"); +PyTypeObject BPyGPU_BufferType = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "Buffer", + .tp_basicsize = sizeof(BPyGPUBuffer), + .tp_dealloc = (destructor)pygpu_buffer__tp_dealloc, + .tp_repr = (reprfunc)pygpu_buffer__tp_repr, + .tp_as_sequence = &pygpu_buffer__tp_as_sequence, + .tp_as_mapping = &pygpu_buffer__tp_as_mapping, +#ifdef PYGPU_BUFFER_PROTOCOL + .tp_as_buffer = &pygpu_buffer__tp_as_buffer, +#endif + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_doc = pygpu_buffer__tp_doc, + .tp_traverse = (traverseproc)pygpu_buffer__tp_traverse, + .tp_clear = (inquiry)pygpu_buffer__tp_clear, + .tp_methods = pygpu_buffer__tp_methods, + .tp_getset = pygpu_buffer_getseters, + .tp_new = pygpu_buffer__tp_new, +}; + +static size_t pygpu_buffer_calc_size(const int format, + const int shape_len, + const Py_ssize_t *shape) +{ + size_t r_size = GPU_texture_dataformat_size(format); + + for (int i = 0; i < shape_len; i++) { + r_size *= shape[i]; + } + + return r_size; +} + +size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer) +{ + return pygpu_buffer_calc_size(buffer->format, buffer->shape_len, buffer->shape); +} + +/** + * Create a buffer object + * + * \param dimensions: An array of ndimensions integers representing the size of each dimension. + * \param initbuffer: When not NULL holds a contiguous buffer + * with the correct format from which the buffer will be initialized + */ +BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, + const int shape_len, + const Py_ssize_t *shape, + void *buffer) +{ + if (buffer == NULL) { + size_t size = pygpu_buffer_calc_size(format, shape_len, shape); + buffer = MEM_callocN(size, "BPyGPUBuffer buffer"); + } + + return pygpu_buffer_make_from_data(NULL, format, shape_len, shape, buffer); +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py_buffer.h b/source/blender/python/gpu/gpu_py_buffer.h new file mode 100644 index 00000000000..003f1a52078 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_buffer.h @@ -0,0 +1,53 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +extern PyTypeObject BPyGPU_BufferType; + +#define BPyGPU_Buffer_Check(v) (Py_TYPE(v) == &BPyGPU_BufferType) + +/** + * Buffer Object + * + * For Python access to GPU functions requiring a pointer. + */ +typedef struct BPyGPUBuffer { + PyObject_VAR_HEAD PyObject *parent; + + int format; + int shape_len; + Py_ssize_t *shape; + + union { + char *as_byte; + int *as_int; + uint *as_uint; + float *as_float; + + void *as_void; + } buf; +} BPyGPUBuffer; + +size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer); +BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, + const int shape_len, + const Py_ssize_t *shape, + void *buffer); diff --git a/source/blender/python/gpu/gpu_py_framebuffer.c b/source/blender/python/gpu/gpu_py_framebuffer.c new file mode 100644 index 00000000000..487f0f984cb --- /dev/null +++ b/source/blender/python/gpu/gpu_py_framebuffer.c @@ -0,0 +1,546 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the framebuffer functionalities of the 'gpu' module + * used for off-screen OpenGL rendering. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_context.h" +#include "GPU_framebuffer.h" +#include "GPU_init_exit.h" + +#include "../generic/py_capi_utils.h" +#include "../generic/python_utildefines.h" +#include "../mathutils/mathutils.h" + +#include "gpu_py_api.h" +#include "gpu_py_texture.h" + +#include "gpu_py_framebuffer.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUFrameBuffer Common Utilities + * \{ */ + +static int pygpu_framebuffer_valid_check(BPyGPUFrameBuffer *bpygpu_fb) +{ + if (UNLIKELY(bpygpu_fb->fb == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU framebuffer was freed, no further access is valid" +#else + "GPU framebuffer: internal error" +#endif + ); + return -1; + } + return 0; +} + +#define PYGPU_FRAMEBUFFER_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_framebuffer_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +static void pygpu_framebuffer_free_if_possible(GPUFrameBuffer *fb) +{ + if (!fb) { + return; + } + + if (GPU_is_init()) { + GPU_framebuffer_free(fb); + } + else { + printf("PyFramebuffer freed after the context has been destroyed.\n"); + } +} + +/* Keep less than or equal to #FRAMEBUFFER_STACK_DEPTH */ +#define GPU_PY_FRAMEBUFFER_STACK_LEN 16 + +static bool pygpu_framebuffer_stack_push_and_bind_or_error(GPUFrameBuffer *fb) +{ + if (GPU_framebuffer_stack_level_get() >= GPU_PY_FRAMEBUFFER_STACK_LEN) { + PyErr_SetString( + PyExc_RuntimeError, + "Maximum framebuffer stack depth " STRINGIFY(GPU_PY_FRAMEBUFFER_STACK_LEN) " reached"); + return false; + } + GPU_framebuffer_push(GPU_framebuffer_active_get()); + GPU_framebuffer_bind(fb); + return true; +} + +static bool pygpu_framebuffer_stack_pop_and_restore_or_error(GPUFrameBuffer *fb) +{ + if (GPU_framebuffer_stack_level_get() == 0) { + PyErr_SetString(PyExc_RuntimeError, "Minimum framebuffer stack depth reached"); + return false; + } + + if (fb && !GPU_framebuffer_bound(fb)) { + PyErr_SetString(PyExc_RuntimeError, "Framebuffer is not bound"); + return false; + } + + GPUFrameBuffer *fb_prev = GPU_framebuffer_pop(); + GPU_framebuffer_bind(fb_prev); + return true; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Stack (Context Manager) + * + * Safer alternative to ensure balanced push/pop calls. + * + * \{ */ + +typedef struct { + PyObject_HEAD /* required python macro */ + BPyGPUFrameBuffer *py_fb; + int level; +} PyFrameBufferStackContext; + +static void pygpu_framebuffer_stack_context__tp_dealloc(PyFrameBufferStackContext *self) +{ + Py_DECREF(self->py_fb); + PyObject_DEL(self); +} + +static PyObject *pygpu_framebuffer_stack_context_enter(PyFrameBufferStackContext *self) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb); + + /* sanity - should never happen */ + if (self->level != -1) { + PyErr_SetString(PyExc_RuntimeError, "Already in use"); + return NULL; + } + + if (!pygpu_framebuffer_stack_push_and_bind_or_error(self->py_fb->fb)) { + return NULL; + } + + self->level = GPU_framebuffer_stack_level_get(); + Py_RETURN_NONE; +} + +static PyObject *pygpu_framebuffer_stack_context_exit(PyFrameBufferStackContext *self, + PyObject *UNUSED(args)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self->py_fb); + + /* sanity - should never happen */ + if (self->level == -1) { + fprintf(stderr, "Not yet in use\n"); + return NULL; + } + + const int level = GPU_framebuffer_stack_level_get(); + if (level != self->level) { + fprintf(stderr, "Level of bind mismatch, expected %d, got %d\n", self->level, level); + } + + if (!pygpu_framebuffer_stack_pop_and_restore_or_error(self->py_fb->fb)) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyMethodDef pygpu_framebuffer_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_framebuffer_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_framebuffer_stack_context_exit, METH_VARARGS}, + {NULL}, +}; + +static PyTypeObject FramebufferStackContext_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext", + .tp_basicsize = sizeof(PyFrameBufferStackContext), + .tp_dealloc = (destructor)pygpu_framebuffer_stack_context__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = pygpu_framebuffer_stack_context__tp_methods, +}; + +PyDoc_STRVAR(pygpu_framebuffer_bind_doc, + ".. function:: bind()\n" + "\n" + " Context manager to ensure balanced bind calls, even in the case of an error.\n"); +static PyObject *pygpu_framebuffer_bind(BPyGPUFrameBuffer *self) +{ + PyFrameBufferStackContext *ret = PyObject_New(PyFrameBufferStackContext, + &FramebufferStackContext_Type); + ret->py_fb = self; + ret->level = -1; + Py_INCREF(self); + return (PyObject *)ret; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUFramebuffer Type + * \{ */ + +/* Fill in the GPUAttachment according to the PyObject parameter. + * PyObject *o can be NULL, Py_None, BPyGPUTexture or a dictionary containing the keyword "texture" + * and the optional keywords "layer" and "mip". + * Returns false on error. In this case, a python message will be raised and GPUAttachment will not + * be touched. */ +static bool pygpu_framebuffer_new_parse_arg(PyObject *o, GPUAttachment *r_attach) +{ + GPUAttachment tmp_attach = GPU_ATTACHMENT_NONE; + + if (!o || o == Py_None) { + /* Pass. */; + } + else if (BPyGPUTexture_Check(o)) { + if (!bpygpu_ParseTexture(o, &tmp_attach.tex)) { + return false; + } + } + else { + const char *c_texture = "texture"; + const char *c_layer = "layer"; + const char *c_mip = "mip"; + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(o, &pos, &key, &value)) { + if (!PyUnicode_Check(key)) { + PyErr_SetString(PyExc_TypeError, "keywords must be strings"); + return false; + } + + if (c_texture && _PyUnicode_EqualToASCIIString(key, c_texture)) { + /* Compare only once. */ + c_texture = NULL; + if (!bpygpu_ParseTexture(value, &tmp_attach.tex)) { + return false; + } + } + else if (c_layer && _PyUnicode_EqualToASCIIString(key, c_layer)) { + /* Compare only once. */ + c_layer = NULL; + tmp_attach.layer = PyLong_AsLong(value); + if (tmp_attach.layer == -1 && PyErr_Occurred()) { + return false; + } + } + else if (c_mip && _PyUnicode_EqualToASCIIString(key, c_mip)) { + /* Compare only once. */ + c_mip = NULL; + tmp_attach.mip = PyLong_AsLong(value); + if (tmp_attach.mip == -1 && PyErr_Occurred()) { + return false; + } + } + else { + PyErr_Format( + PyExc_TypeError, "'%U' is an invalid keyword argument for this attribute", key); + return false; + } + } + } + + *r_attach = tmp_attach; + return true; +} + +static PyObject *pygpu_framebuffer__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + if (!GPU_context_active_get()) { + PyErr_SetString(PyExc_RuntimeError, "No active GPU context found"); + return NULL; + } + + PyObject *depth_attachment = NULL; + PyObject *color_attachements = NULL; + static const char *_keywords[] = {"depth_slot", "color_slots", NULL}; + static _PyArg_Parser _parser = {"|$OO:GPUFrameBuffer.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, &depth_attachment, &color_attachements)) { + return NULL; + } + + /* Keep in sync with #GPU_FB_MAX_COLOR_ATTACHMENT. + * TODO: share the define. */ +#define BPYGPU_FB_MAX_COLOR_ATTACHMENT 6 + + GPUAttachment config[BPYGPU_FB_MAX_COLOR_ATTACHMENT + 1]; + + if (!pygpu_framebuffer_new_parse_arg(depth_attachment, &config[0])) { + return NULL; + } + else if (config[0].tex && !GPU_texture_depth(config[0].tex)) { + PyErr_SetString(PyExc_ValueError, "Depth texture with incompatible format"); + return NULL; + } + + int color_attachements_len = 0; + if (color_attachements && color_attachements != Py_None) { + if (PySequence_Check(color_attachements)) { + color_attachements_len = PySequence_Size(color_attachements); + if (color_attachements_len > BPYGPU_FB_MAX_COLOR_ATTACHMENT) { + PyErr_SetString( + PyExc_AttributeError, + "too many attachements, max is " STRINGIFY(BPYGPU_FB_MAX_COLOR_ATTACHMENT)); + return NULL; + } + + for (int i = 1; i <= color_attachements_len; i++) { + PyObject *o = PySequence_GetItem(color_attachements, i); + bool ok = pygpu_framebuffer_new_parse_arg(o, &config[i]); + Py_DECREF(o); + if (!ok) { + return NULL; + } + } + } + else { + if (!pygpu_framebuffer_new_parse_arg(color_attachements, &config[1])) { + return NULL; + } + color_attachements_len = 1; + } + } + + GPUFrameBuffer *fb_python = GPU_framebuffer_create("fb_python"); + GPU_framebuffer_config_array(fb_python, config, color_attachements_len + 1); + + return BPyGPUFrameBuffer_CreatePyObject(fb_python); +} + +PyDoc_STRVAR(pygpu_framebuffer_is_bound_doc, + "Checks if this is the active framebuffer in the context."); +static PyObject *pygpu_framebuffer_is_bound(BPyGPUFrameBuffer *self, void *UNUSED(type)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + return PyBool_FromLong(GPU_framebuffer_bound(self->fb)); +} + +PyDoc_STRVAR(pygpu_framebuffer_clear_doc, + ".. method:: clear(color=None, depth=None, stencil=None)\n" + "\n" + " Fill color, depth and stencil textures with specific value.\n" + " Common values: color=(0.0, 0.0, 0.0, 1.0), depth=1.0, stencil=0.\n" + "\n" + " :arg color: float sequence each representing ``(r, g, b, a)``.\n" + " :type color: sequence of 3 or 4 floats\n" + " :arg depth: depth value.\n" + " :type depth: `float`\n" + " :arg stencil: stencil value.\n" + " :type stencil: `int`\n"); +static PyObject *pygpu_framebuffer_clear(BPyGPUFrameBuffer *self, PyObject *args, PyObject *kwds) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + + if (!GPU_framebuffer_bound(self->fb)) { + return NULL; + } + + PyObject *py_col = NULL; + PyObject *py_depth = NULL; + PyObject *py_stencil = NULL; + + static const char *_keywords[] = {"color", "depth", "stencil", NULL}; + static _PyArg_Parser _parser = {"|$OOO:clear", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &py_col, &py_depth, &py_stencil)) { + return NULL; + } + + eGPUFrameBufferBits buffers = 0; + float col[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + float depth = 1.0f; + uint stencil = 0; + + if (py_col && py_col != Py_None) { + if (mathutils_array_parse(col, 3, 4, py_col, "GPUFrameBuffer.clear(), invalid 'color' arg") == + -1) { + return NULL; + } + buffers |= GPU_COLOR_BIT; + } + + if (py_depth && py_depth != Py_None) { + depth = PyFloat_AsDouble(py_depth); + if (PyErr_Occurred()) { + return NULL; + } + buffers |= GPU_DEPTH_BIT; + } + + if (py_stencil && py_stencil != Py_None) { + if ((stencil = PyC_Long_AsU32(py_stencil)) == (uint)-1) { + return NULL; + } + buffers |= GPU_STENCIL_BIT; + } + + GPU_framebuffer_clear(self->fb, buffers, col, depth, stencil); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_framebuffer_viewport_set_doc, + ".. function:: viewport_set(x, y, xsize, ysize)\n" + "\n" + " Set the viewport for this framebuffer object.\n" + " Note: The viewport state is not saved upon framebuffer rebind.\n" + "\n" + " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n" + " :param xsize, ysize: width and height of the viewport_set.\n" + " :type x, y, xsize, ysize: `int`\n"); +static PyObject *pygpu_framebuffer_viewport_set(BPyGPUFrameBuffer *self, + PyObject *args, + void *UNUSED(type)) +{ + int x, y, xsize, ysize; + if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) { + return NULL; + } + + GPU_framebuffer_viewport_set(self->fb, x, y, xsize, ysize); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_framebuffer_viewport_get_doc, + ".. function:: viewport_get()\n" + "\n" + " Returns position and dimension to current viewport.\n"); +static PyObject *pygpu_framebuffer_viewport_get(BPyGPUFrameBuffer *self, void *UNUSED(type)) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + int viewport[4]; + GPU_framebuffer_viewport_get(self->fb, viewport); + + PyObject *ret = PyTuple_New(4); + PyTuple_SET_ITEMS(ret, + PyLong_FromLong(viewport[0]), + PyLong_FromLong(viewport[1]), + PyLong_FromLong(viewport[2]), + PyLong_FromLong(viewport[3])); + return ret; +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_framebuffer_free_doc, + ".. method:: free()\n" + "\n" + " Free the framebuffer object.\n" + " The framebuffer will no longer be accessible.\n"); +static PyObject *pygpu_framebuffer_free(BPyGPUFrameBuffer *self) +{ + PYGPU_FRAMEBUFFER_CHECK_OBJ(self); + pygpu_framebuffer_free_if_possible(self->fb); + self->fb = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUFrameBuffer__tp_dealloc(BPyGPUFrameBuffer *self) +{ + pygpu_framebuffer_free_if_possible(self->fb); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_framebuffer__tp_getseters[] = { + {"is_bound", + (getter)pygpu_framebuffer_is_bound, + (setter)NULL, + pygpu_framebuffer_is_bound_doc, + NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_framebuffer__tp_methods[] = { + {"bind", (PyCFunction)pygpu_framebuffer_bind, METH_NOARGS, pygpu_framebuffer_bind_doc}, + {"clear", + (PyCFunction)pygpu_framebuffer_clear, + METH_VARARGS | METH_KEYWORDS, + pygpu_framebuffer_clear_doc}, + {"viewport_set", + (PyCFunction)pygpu_framebuffer_viewport_set, + METH_NOARGS, + pygpu_framebuffer_viewport_set_doc}, + {"viewport_get", + (PyCFunction)pygpu_framebuffer_viewport_get, + METH_VARARGS, + pygpu_framebuffer_viewport_get_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_framebuffer_free, METH_NOARGS, pygpu_framebuffer_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_framebuffer__tp_doc, + ".. class:: GPUFrameBuffer(depth_slot=None, color_slots=None)\n" + "\n" + " This object gives access to framebuffer functionallities.\n" + " When a 'layer' is specified in a argument, a single layer of a 3D or array " + "texture is attached to the frame-buffer.\n" + " For cube map textures, layer is translated into a cube map face.\n" + "\n" + " :arg depth_slot: GPUTexture to attach or a `dict` containing keywords: " + "'texture', 'layer' and 'mip'.\n" + " :type depth_slot: :class:`gpu.types.GPUTexture`, `dict` or `Nonetype`\n" + " :arg color_slots: Tuple where each item can be a GPUTexture or a `dict` " + "containing keywords: 'texture', 'layer' and 'mip'.\n" + " :type color_slots: `tuple` or `Nonetype`\n"); +PyTypeObject BPyGPUFrameBuffer_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBuffer", + .tp_basicsize = sizeof(BPyGPUFrameBuffer), + .tp_dealloc = (destructor)BPyGPUFrameBuffer__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_framebuffer__tp_doc, + .tp_methods = pygpu_framebuffer__tp_methods, + .tp_getset = pygpu_framebuffer__tp_getseters, + .tp_new = pygpu_framebuffer__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUFrameBuffer_CreatePyObject(GPUFrameBuffer *fb) +{ + BPyGPUFrameBuffer *self; + + self = PyObject_New(BPyGPUFrameBuffer, &BPyGPUFrameBuffer_Type); + self->fb = fb; + + return (PyObject *)self; +} + +/** \} */ + +#undef PYGPU_FRAMEBUFFER_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_framebuffer.h b/source/blender/python/gpu/gpu_py_framebuffer.h new file mode 100644 index 00000000000..7113e7c35aa --- /dev/null +++ b/source/blender/python/gpu/gpu_py_framebuffer.h @@ -0,0 +1,33 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUFrameBuffer_Type; + +#define BPyGPUFrameBuffer_Check(v) (Py_TYPE(v) == &BPyGPUFrameBuffer_Type) + +typedef struct BPyGPUFrameBuffer { + PyObject_HEAD struct GPUFrameBuffer *fb; +} BPyGPUFrameBuffer; + +PyObject *BPyGPUFrameBuffer_CreatePyObject(struct GPUFrameBuffer *fb) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 2431a1fca5b..a98d9649f6f 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -30,6 +30,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_string.h" #include "BLI_utildefines.h" #include "BKE_global.h" @@ -54,14 +55,23 @@ #include "gpu_py_api.h" #include "gpu_py_offscreen.h" /* own include */ +/* Define the free method to avoid breakage. */ +#define BPYGPU_USE_GPUOBJ_FREE_METHOD + /* -------------------------------------------------------------------- */ /** \name GPUOffScreen Common Utilities * \{ */ -static int pygpu_offscreen_valid_check(BPyGPUOffScreen *pygpu_ofs) +static int pygpu_offscreen_valid_check(BPyGPUOffScreen *py_ofs) { - if (UNLIKELY(pygpu_ofs->ofs == NULL)) { - PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid"); + if (UNLIKELY(py_ofs->ofs == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU offscreen was freed, no further access is valid" +#else + "GPU offscreen: internal error" +#endif + ); return -1; } return 0; @@ -77,11 +87,130 @@ static int pygpu_offscreen_valid_check(BPyGPUOffScreen *pygpu_ofs) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Stack (Context Manager) + * + * Safer alternative to ensure balanced push/pop calls. + * + * \{ */ + +typedef struct { + PyObject_HEAD /* required python macro */ + BPyGPUOffScreen *py_offs; + int level; + bool is_explicitly_bound; /* Bound by "bind" method. */ +} OffScreenStackContext; + +static void pygpu_offscreen_stack_context__tp_dealloc(OffScreenStackContext *self) +{ + Py_DECREF(self->py_offs); + PyObject_DEL(self); +} + +static PyObject *pygpu_offscreen_stack_context_enter(OffScreenStackContext *self) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs); + + if (!self->is_explicitly_bound) { + if (self->level != -1) { + PyErr_SetString(PyExc_RuntimeError, "Already in use"); + return NULL; + } + + GPU_offscreen_bind(self->py_offs->ofs, true); + self->level = GPU_framebuffer_stack_level_get(); + } + + Py_RETURN_NONE; +} + +static PyObject *pygpu_offscreen_stack_context_exit(OffScreenStackContext *self, + PyObject *UNUSED(args)) +{ + BPY_GPU_OFFSCREEN_CHECK_OBJ(self->py_offs); + + if (self->level == -1) { + PyErr_SetString(PyExc_RuntimeError, "Not yet in use\n"); + return NULL; + } + + const int level = GPU_framebuffer_stack_level_get(); + if (level != self->level) { + PyErr_Format( + PyExc_RuntimeError, "Level of bind mismatch, expected %d, got %d\n", self->level, level); + } + + GPU_offscreen_unbind(self->py_offs->ofs, true); + Py_RETURN_NONE; +} + +static PyMethodDef pygpu_offscreen_stack_context__tp_methods[] = { + {"__enter__", (PyCFunction)pygpu_offscreen_stack_context_enter, METH_NOARGS}, + {"__exit__", (PyCFunction)pygpu_offscreen_stack_context_exit, METH_VARARGS}, + {NULL}, +}; + +static PyTypeObject PyGPUOffscreenStackContext_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUFrameBufferStackContext", + .tp_basicsize = sizeof(OffScreenStackContext), + .tp_dealloc = (destructor)pygpu_offscreen_stack_context__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = pygpu_offscreen_stack_context__tp_methods, +}; + +PyDoc_STRVAR(pygpu_offscreen_bind_doc, + ".. function:: bind()\n" + "\n" + " Context manager to ensure balanced bind calls, even in the case of an error.\n"); +static PyObject *pygpu_offscreen_bind(BPyGPUOffScreen *self) +{ + OffScreenStackContext *ret = PyObject_New(OffScreenStackContext, + &PyGPUOffscreenStackContext_Type); + ret->py_offs = self; + ret->level = -1; + ret->is_explicitly_bound = false; + Py_INCREF(self); + + pygpu_offscreen_stack_context_enter(ret); + ret->is_explicitly_bound = true; + + return (PyObject *)ret; +} + +PyDoc_STRVAR(pygpu_offscreen_unbind_doc, + ".. method:: unbind(restore=True)\n" + "\n" + " Unbind the offscreen object.\n" + "\n" + " :arg restore: Restore the OpenGL state, can only be used when the state has been " + "saved before.\n" + " :type restore: `bool`\n"); +static PyObject *pygpu_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) +{ + bool restore = true; + + BPY_GPU_OFFSCREEN_CHECK_OBJ(self); + + static const char *_keywords[] = {"restore", NULL}; + static _PyArg_Parser _parser = {"|O&:unbind", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &restore)) { + return NULL; + } + + GPU_offscreen_unbind(self->ofs, restore); + GPU_apply_state(); + Py_RETURN_NONE; +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name GPUOffscreen Type * \{ */ -static PyObject *pygpu_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) +static PyObject *pygpu_offscreen__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) { BPYGPU_IS_INIT_OR_ERROR_OBJ; @@ -90,7 +219,7 @@ static PyObject *pygpu_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, char err_out[256]; static const char *_keywords[] = {"width", "height", NULL}; - static _PyArg_Parser _parser = {"ii|i:GPUOffScreen.__new__", _keywords, 0}; + static _PyArg_Parser _parser = {"ii:GPUOffScreen.__new__", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &width, &height)) { return NULL; } @@ -99,7 +228,7 @@ static PyObject *pygpu_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, ofs = GPU_offscreen_create(width, height, true, false, err_out); } else { - strncpy(err_out, "No active GPU context found", 256); + STRNCPY(err_out, "No active GPU context found"); } if (ofs == NULL) { @@ -135,61 +264,6 @@ static PyObject *pygpu_offscreen_color_texture_get(BPyGPUOffScreen *self, void * return PyLong_FromLong(GPU_texture_opengl_bindcode(texture)); } -PyDoc_STRVAR( - pygpu_offscreen_bind_doc, - ".. method:: bind(save=True)\n" - "\n" - " Bind the offscreen object.\n" - " To make sure that the offscreen gets unbind whether an exception occurs or not,\n" - " pack it into a `with` statement.\n" - "\n" - " :arg save: Save the current OpenGL state, so that it can be restored when unbinding.\n" - " :type save: `bool`\n"); -static PyObject *pygpu_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) -{ - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - bool save = true; - - static const char *_keywords[] = {"save", NULL}; - static _PyArg_Parser _parser = {"|O&:bind", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &save)) { - return NULL; - } - - GPU_offscreen_bind(self->ofs, save); - GPU_apply_state(); - - self->is_saved = save; - Py_INCREF(self); - - return (PyObject *)self; -} - -PyDoc_STRVAR(pygpu_offscreen_unbind_doc, - ".. method:: unbind(restore=True)\n" - "\n" - " Unbind the offscreen object.\n" - "\n" - " :arg restore: Restore the OpenGL state, can only be used when the state has been " - "saved before.\n" - " :type restore: `bool`\n"); -static PyObject *pygpu_offscreen_unbind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) -{ - bool restore = true; - - BPY_GPU_OFFSCREEN_CHECK_OBJ(self); - - static const char *_keywords[] = {"restore", NULL}; - static _PyArg_Parser _parser = {"|O&:unbind", _keywords, 0}; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &restore)) { - return NULL; - } - - GPU_offscreen_unbind(self->ofs, restore); - GPU_apply_state(); - Py_RETURN_NONE; -} - PyDoc_STRVAR( pygpu_offscreen_draw_view3d_doc, ".. method:: draw_view3d(scene, view_layer, view3d, region, view_matrix, projection_matrix)\n" @@ -210,8 +284,8 @@ PyDoc_STRVAR( " :type projection_matrix: :class:`mathutils.Matrix`\n"); static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds) { - MatrixObject *pygpu_mat_view, *pygpu_mat_projection; - PyObject *pygpu_scene, *pygpu_view_layer, *pygpu_region, *pygpu_view3d; + MatrixObject *py_mat_view, *py_mat_projection; + PyObject *py_scene, *py_view_layer, *py_region, *py_view3d; struct Depsgraph *depsgraph; struct Scene *scene; @@ -228,18 +302,18 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - &pygpu_scene, - &pygpu_view_layer, - &pygpu_view3d, - &pygpu_region, + &py_scene, + &py_view_layer, + &py_view3d, + &py_region, Matrix_Parse4x4, - &pygpu_mat_view, + &py_mat_view, Matrix_Parse4x4, - &pygpu_mat_projection) || - (!(scene = PyC_RNA_AsPointer(pygpu_scene, "Scene")) || - !(view_layer = PyC_RNA_AsPointer(pygpu_view_layer, "ViewLayer")) || - !(v3d = PyC_RNA_AsPointer(pygpu_view3d, "SpaceView3D")) || - !(region = PyC_RNA_AsPointer(pygpu_region, "Region")))) { + &py_mat_projection) || + (!(scene = PyC_RNA_AsPointer(py_scene, "Scene")) || + !(view_layer = PyC_RNA_AsPointer(py_view_layer, "ViewLayer")) || + !(v3d = PyC_RNA_AsPointer(py_view3d, "SpaceView3D")) || + !(region = PyC_RNA_AsPointer(py_region, "Region")))) { return NULL; } @@ -262,8 +336,8 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar region, GPU_offscreen_width(self->ofs), GPU_offscreen_height(self->ofs), - (float(*)[4])pygpu_mat_view->matrix, - (float(*)[4])pygpu_mat_projection->matrix, + (float(*)[4])py_mat_view->matrix, + (float(*)[4])py_mat_projection->matrix, true, true, "", @@ -281,6 +355,7 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar Py_RETURN_NONE; } +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD PyDoc_STRVAR(pygpu_offscreen_free_doc, ".. method:: free()\n" "\n" @@ -294,17 +369,7 @@ static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self) self->ofs = NULL; Py_RETURN_NONE; } - -static PyObject *pygpu_offscreen_bind_context_enter(BPyGPUOffScreen *UNUSED(self)) -{ - Py_RETURN_NONE; -} - -static PyObject *pygpu_offscreen_bind_context_exit(BPyGPUOffScreen *self, PyObject *UNUSED(args)) -{ - GPU_offscreen_unbind(self->ofs, self->is_saved); - Py_RETURN_NONE; -} +#endif static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) { @@ -314,7 +379,7 @@ static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) Py_TYPE(self)->tp_free((PyObject *)self); } -static PyGetSetDef pygpu_offscreen_getseters[] = { +static PyGetSetDef pygpu_offscreen__tp_getseters[] = { {"color_texture", (getter)pygpu_offscreen_color_texture_get, (setter)NULL, @@ -325,11 +390,8 @@ static PyGetSetDef pygpu_offscreen_getseters[] = { {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; -static struct PyMethodDef pygpu_offscreen_methods[] = { - {"bind", - (PyCFunction)pygpu_offscreen_bind, - METH_VARARGS | METH_KEYWORDS, - pygpu_offscreen_bind_doc}, +static struct PyMethodDef pygpu_offscreen__tp_methods[] = { + {"bind", (PyCFunction)pygpu_offscreen_bind, METH_NOARGS, pygpu_offscreen_bind_doc}, {"unbind", (PyCFunction)pygpu_offscreen_unbind, METH_VARARGS | METH_KEYWORDS, @@ -338,13 +400,13 @@ static struct PyMethodDef pygpu_offscreen_methods[] = { (PyCFunction)pygpu_offscreen_draw_view3d, METH_VARARGS | METH_KEYWORDS, pygpu_offscreen_draw_view3d_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD {"free", (PyCFunction)pygpu_offscreen_free, METH_NOARGS, pygpu_offscreen_free_doc}, - {"__enter__", (PyCFunction)pygpu_offscreen_bind_context_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)pygpu_offscreen_bind_context_exit, METH_VARARGS}, +#endif {NULL, NULL, 0, NULL}, }; -PyDoc_STRVAR(pygpu_offscreen_doc, +PyDoc_STRVAR(pygpu_offscreen__tp_doc, ".. class:: GPUOffScreen(width, height)\n" "\n" " This object gives access to off screen buffers.\n" @@ -358,10 +420,10 @@ PyTypeObject BPyGPUOffScreen_Type = { .tp_basicsize = sizeof(BPyGPUOffScreen), .tp_dealloc = (destructor)BPyGPUOffScreen__tp_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = pygpu_offscreen_doc, - .tp_methods = pygpu_offscreen_methods, - .tp_getset = pygpu_offscreen_getseters, - .tp_new = pygpu_offscreen_new, + .tp_doc = pygpu_offscreen__tp_doc, + .tp_methods = pygpu_offscreen__tp_methods, + .tp_getset = pygpu_offscreen__tp_getseters, + .tp_new = pygpu_offscreen__tp_new, }; /** \} */ diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py_offscreen.h index efe5b57b22e..f551730cf54 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.h +++ b/source/blender/python/gpu/gpu_py_offscreen.h @@ -28,7 +28,6 @@ extern PyTypeObject BPyGPUOffScreen_Type; typedef struct BPyGPUOffScreen { PyObject_HEAD struct GPUOffScreen *ofs; - bool is_saved; } BPyGPUOffScreen; PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index ddc3ccd9827..538bed7df6d 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -26,12 +26,16 @@ #include "BLI_utildefines.h" #include "GPU_shader.h" +#include "GPU_texture.h" +#include "GPU_uniform_buffer.h" #include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" #include "../mathutils/mathutils.h" #include "gpu_py_api.h" +#include "gpu_py_texture.h" +#include "gpu_py_uniformbuffer.h" #include "gpu_py_vertex_format.h" #include "gpu_py_shader.h" /* own include */ @@ -464,6 +468,64 @@ static PyObject *pygpu_shader_uniform_int(BPyGPUShader *self, PyObject *args) Py_RETURN_NONE; } +PyDoc_STRVAR(pygpu_shader_uniform_sampler_doc, + ".. method:: uniform_sampler(name, texture)\n" + "\n" + " Specify the value of a texture uniform variable for the current GPUShader.\n" + "\n" + " :param name: name of the uniform variable whose texture is to be specified.\n" + " :type name: str\n" + " :param texture: Texture to attach.\n" + " :type texture: :class:`gpu.types.GPUTexture`\n"); +static PyObject *pygpu_shader_uniform_sampler(BPyGPUShader *self, PyObject *args) +{ + const char *name; + BPyGPUTexture *py_texture; + if (!PyArg_ParseTuple( + args, "sO!:GPUShader.uniform_sampler", &name, &BPyGPUTexture_Type, &py_texture)) { + return NULL; + } + + int slot = GPU_shader_get_texture_binding(self->shader, name); + GPU_texture_bind(py_texture->tex, slot); + GPU_shader_uniform_1i(self->shader, name, slot); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + pygpu_shader_uniform_buffer_doc, + ".. method:: uniform_buffer(name, ubo)\n" + "\n" + " Specify the value of an uniform buffer object variable for the current GPUShader.\n" + "\n" + " :param name: name of the uniform variable whose UBO is to be specified.\n" + " :type name: str\n" + " :param ubo: Uniform Buffer to attach.\n" + " :type texture: :class:`gpu.types.GPUUniformBuf`\n"); +static PyObject *pygpu_shader_uniform_buffer(BPyGPUShader *self, PyObject *args) +{ + const char *name; + BPyGPUUniformBuf *py_ubo; + if (!PyArg_ParseTuple( + args, "sO!:GPUShader.uniform_buffer", &name, &BPyGPUUniformBuf_Type, &py_ubo)) { + return NULL; + } + + int slot = GPU_shader_get_uniform_block(self->shader, name); + if (slot == -1) { + PyErr_SetString( + PyExc_BufferError, + "GPUShader.uniform_buffer: uniform block not found, make sure the name is correct"); + return NULL; + } + + GPU_uniformbuf_bind(py_ubo->ubo, slot); + GPU_shader_uniform_1i(self->shader, name, slot); + + Py_RETURN_NONE; +} + PyDoc_STRVAR( pygpu_shader_attr_from_name_doc, ".. method:: attr_from_name(name)\n" @@ -535,6 +597,14 @@ static struct PyMethodDef pygpu_shader__tp_methods[] = { (PyCFunction)pygpu_shader_uniform_int, METH_VARARGS, pygpu_shader_uniform_int_doc}, + {"uniform_sampler", + (PyCFunction)pygpu_shader_uniform_sampler, + METH_VARARGS, + pygpu_shader_uniform_sampler_doc}, + {"uniform_buffer", + (PyCFunction)pygpu_shader_uniform_buffer, + METH_VARARGS, + pygpu_shader_uniform_buffer_doc}, {"attr_from_name", (PyCFunction)pygpu_shader_attr_from_name, METH_O, diff --git a/source/blender/python/gpu/gpu_py_state.c b/source/blender/python/gpu/gpu_py_state.c new file mode 100644 index 00000000000..d1b3a01e2e4 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_state.c @@ -0,0 +1,423 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the gpu.state API. + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "GPU_state.h" + +#include "../generic/py_capi_utils.h" +#include "../generic/python_utildefines.h" + +#include "gpu_py_state.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name Helper Functions + * \{ */ + +static const struct PyC_StringEnumItems pygpu_state_blend_items[] = { + {GPU_BLEND_NONE, "NONE"}, + {GPU_BLEND_ALPHA, "ALPHA"}, + {GPU_BLEND_ALPHA_PREMULT, "ALPHA_PREMULT"}, + {GPU_BLEND_ADDITIVE, "ADDITIVE"}, + {GPU_BLEND_ADDITIVE_PREMULT, "ADDITIVE_PREMULT"}, + {GPU_BLEND_MULTIPLY, "MULTIPLY"}, + {GPU_BLEND_SUBTRACT, "SUBTRACT"}, + {GPU_BLEND_INVERT, "INVERT"}, + /** + * These are quite special cases used inside the draw manager. + * {GPU_BLEND_OIT, "OIT"}, + * {GPU_BLEND_BACKGROUND, "BACKGROUND"}, + * {GPU_BLEND_CUSTOM, "CUSTOM"}, + */ + {0, NULL}, +}; + +static const struct PyC_StringEnumItems pygpu_state_depthtest_items[] = { + {GPU_DEPTH_NONE, "NONE"}, + {GPU_DEPTH_ALWAYS, "ALWAYS"}, + {GPU_DEPTH_LESS, "LESS"}, + {GPU_DEPTH_LESS_EQUAL, "LESS_EQUAL"}, + {GPU_DEPTH_EQUAL, "EQUAL"}, + {GPU_DEPTH_GREATER, "GREATER"}, + {GPU_DEPTH_GREATER_EQUAL, "GREATER_EQUAL"}, + {0, NULL}, +}; + +static const struct PyC_StringEnumItems pygpu_state_faceculling_items[] = { + {GPU_CULL_NONE, "NONE"}, + {GPU_CULL_FRONT, "FRONT"}, + {GPU_CULL_BACK, "BACK"}, + {0, NULL}, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Manage Stack + * \{ */ + +PyDoc_STRVAR(pygpu_state_blend_set_doc, + ".. function:: blend_set(mode)\n" + "\n" + " Defines the fixed pipeline blending equation.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `ALPHA`,\n" + " `ALPHA_PREMULT`,\n" + " `ADDITIVE`,\n" + " `ADDITIVE_PREMULT`,\n" + " `MULTIPLY`,\n" + " `SUBTRACT`,\n" + " `INVERT`,\n" + //" `OIT`,\n" + //" `BACKGROUND`,\n" + //" `CUSTOM`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_blend_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_blend = {pygpu_state_blend_items}; + if (!PyC_ParseStringEnum(value, &pygpu_blend)) { + return NULL; + } + GPU_blend(pygpu_blend.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_blend_get_doc, + ".. function:: blend_get()\n" + "\n" + " Current blending equation.\n" + "\n"); +static PyObject *pygpu_state_blend_get(PyObject *UNUSED(self)) +{ + eGPUBlend blend = GPU_blend_get(); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_blend_items, blend)); +} + +PyDoc_STRVAR(pygpu_state_depth_test_set_doc, + ".. function:: depth_test_set(mode)\n" + "\n" + " Defines the depth_test equation.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `ALWAYS`,\n" + " `LESS`,\n" + " `LESS_EQUAL`,\n" + " `EQUAL`,\n" + " `GREATER`,\n" + " `GREATER_EQUAL`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_depth_test_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_depth_test = {pygpu_state_depthtest_items}; + if (!PyC_ParseStringEnum(value, &pygpu_depth_test)) { + return NULL; + } + GPU_depth_test(pygpu_depth_test.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_depth_test_get_doc, + ".. function:: blend_depth_test_get()\n" + "\n" + " Current depth_test equation.\n" + "\n"); +static PyObject *pygpu_state_depth_test_get(PyObject *UNUSED(self)) +{ + eGPUDepthTest test = GPU_depth_test_get(); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_depthtest_items, test)); +} + +PyDoc_STRVAR(pygpu_state_depth_mask_set_doc, + ".. function:: depth_mask_set(value)\n" + "\n" + " Write to depth component.\n" + "\n" + " :param value: True for writing to the depth component.\n" + " :type near: `bool`\n"); +static PyObject *pygpu_state_depth_mask_set(PyObject *UNUSED(self), PyObject *value) +{ + bool write_to_depth; + if (!PyC_ParseBool(value, &write_to_depth)) { + return NULL; + } + GPU_depth_mask(write_to_depth); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_depth_mask_get_doc, + ".. function:: depth_mask_set_get()\n" + "\n" + " Writing status in the depth component.\n"); +static PyObject *pygpu_state_depth_mask_get(PyObject *UNUSED(self)) +{ + return PyBool_FromLong(GPU_depth_mask_get()); +} + +PyDoc_STRVAR(pygpu_state_viewport_set_doc, + ".. function:: viewport_set(x, y, xsize, ysize)\n" + "\n" + " Specifies the viewport of the active framebuffer.\n" + " Note: The viewport state is not saved upon framebuffer rebind.\n" + "\n" + " :param x, y: lower left corner of the viewport_set rectangle, in pixels.\n" + " :param width, height: width and height of the viewport_set.\n" + " :type x, y, xsize, ysize: `int`\n"); +static PyObject *pygpu_state_viewport_set(PyObject *UNUSED(self), PyObject *args) +{ + int x, y, xsize, ysize; + if (!PyArg_ParseTuple(args, "iiii:viewport_set", &x, &y, &xsize, &ysize)) { + return NULL; + } + + GPU_viewport(x, y, xsize, ysize); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_viewport_get_doc, + ".. function:: viewport_get()\n" + "\n" + " Viewport of the active framebuffer.\n"); +static PyObject *pygpu_state_viewport_get(PyObject *UNUSED(self), PyObject *UNUSED(args)) +{ + int viewport[4]; + GPU_viewport_size_get_i(viewport); + + PyObject *ret = PyTuple_New(4); + PyTuple_SET_ITEMS(ret, + PyLong_FromLong(viewport[0]), + PyLong_FromLong(viewport[1]), + PyLong_FromLong(viewport[2]), + PyLong_FromLong(viewport[3])); + return ret; +} + +PyDoc_STRVAR(pygpu_state_line_width_set_doc, + ".. function:: line_width_set(width)\n" + "\n" + " Specify the width of rasterized lines.\n" + "\n" + " :param size: New width.\n" + " :type mode: `float`\n"); +static PyObject *pygpu_state_line_width_set(PyObject *UNUSED(self), PyObject *value) +{ + float width = (float)PyFloat_AsDouble(value); + if (PyErr_Occurred()) { + return NULL; + } + + GPU_line_width(width); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_line_width_get_doc, + ".. function:: line_width_get()\n" + "\n" + " Current width of rasterized lines.\n"); +static PyObject *pygpu_state_line_width_get(PyObject *UNUSED(self)) +{ + float width = GPU_line_width_get(); + return PyFloat_FromDouble((double)width); +} + +PyDoc_STRVAR(pygpu_state_point_size_set_doc, + ".. function:: point_size_set(size)\n" + "\n" + " Specify the diameter of rasterized points.\n" + "\n" + " :param size: New diameter.\n" + " :type mode: `float`\n"); +static PyObject *pygpu_state_point_size_set(PyObject *UNUSED(self), PyObject *value) +{ + float size = (float)PyFloat_AsDouble(value); + if (PyErr_Occurred()) { + return NULL; + } + + GPU_point_size(size); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_color_mask_set_doc, + ".. function:: color_mask_set(r, g, b, a)\n" + "\n" + " Enable or disable writing of frame buffer color components.\n" + "\n" + " :param r, g, b, a: components red, green, blue, and alpha.\n" + " :type r, g, b, a: `bool`\n"); +static PyObject *pygpu_state_color_mask_set(PyObject *UNUSED(self), PyObject *args) +{ + int r, g, b, a; + if (!PyArg_ParseTuple(args, "pppp:color_mask_set", &r, &g, &b, &a)) { + return NULL; + } + + GPU_color_mask((bool)r, (bool)g, (bool)b, (bool)a); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_face_culling_set_doc, + ".. function:: face_culling_set(culling)\n" + "\n" + " Specify whether none, front-facing or back-facing facets can be culled.\n" + "\n" + " :param mode: One of these modes: {\n" + " `NONE`,\n" + " `FRONT`,\n" + " `BACK`,\n" + " :type mode: `str`\n"); +static PyObject *pygpu_state_face_culling_set(PyObject *UNUSED(self), PyObject *value) +{ + struct PyC_StringEnum pygpu_faceculling = {pygpu_state_faceculling_items}; + if (!PyC_ParseStringEnum(value, &pygpu_faceculling)) { + return NULL; + } + + GPU_face_culling(pygpu_faceculling.value_found); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_front_facing_set_doc, + ".. function:: front_facing_set(invert)\n" + "\n" + " Specifies the orientation of front-facing polygons.\n" + "\n" + " :param invert: True for clockwise polygons as front-facing.\n" + " :type mode: `bool`\n"); +static PyObject *pygpu_state_front_facing_set(PyObject *UNUSED(self), PyObject *value) +{ + bool invert; + if (!PyC_ParseBool(value, &invert)) { + return NULL; + } + + GPU_front_facing(invert); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_state_program_point_size_set_doc, + ".. function:: use_program_point_size(enable)\n" + "\n" + " If enabled, the derived point size is taken from the (potentially clipped) " + "shader builtin gl_PointSize.\n" + "\n" + " :param enable: True for shader builtin gl_PointSize.\n" + " :type enable: `bool`\n"); +static PyObject *pygpu_state_program_point_size_set(PyObject *UNUSED(self), PyObject *value) +{ + bool enable; + if (!PyC_ParseBool(value, &enable)) { + return NULL; + } + + GPU_program_point_size(enable); + Py_RETURN_NONE; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Module + * \{ */ + +static struct PyMethodDef pygpu_state__tp_methods[] = { + /* Manage Stack */ + {"blend_set", (PyCFunction)pygpu_state_blend_set, METH_O, pygpu_state_blend_set_doc}, + {"blend_get", (PyCFunction)pygpu_state_blend_get, METH_NOARGS, pygpu_state_blend_get_doc}, + {"depth_test_set", + (PyCFunction)pygpu_state_depth_test_set, + METH_O, + pygpu_state_depth_test_set_doc}, + {"depth_test_get", + (PyCFunction)pygpu_state_depth_test_get, + METH_NOARGS, + pygpu_state_depth_test_get_doc}, + {"depth_mask_set", + (PyCFunction)pygpu_state_depth_mask_set, + METH_O, + pygpu_state_depth_mask_set_doc}, + {"depth_mask_get", + (PyCFunction)pygpu_state_depth_mask_get, + METH_NOARGS, + pygpu_state_depth_mask_get_doc}, + {"viewport_set", + (PyCFunction)pygpu_state_viewport_set, + METH_VARARGS, + pygpu_state_viewport_set_doc}, + {"viewport_get", + (PyCFunction)pygpu_state_viewport_get, + METH_NOARGS, + pygpu_state_viewport_get_doc}, + {"line_width_set", + (PyCFunction)pygpu_state_line_width_set, + METH_O, + pygpu_state_line_width_set_doc}, + {"line_width_get", + (PyCFunction)pygpu_state_line_width_get, + METH_NOARGS, + pygpu_state_line_width_get_doc}, + {"point_size_set", + (PyCFunction)pygpu_state_point_size_set, + METH_O, + pygpu_state_point_size_set_doc}, + {"color_mask_set", + (PyCFunction)pygpu_state_color_mask_set, + METH_VARARGS, + pygpu_state_color_mask_set_doc}, + {"face_culling_set", + (PyCFunction)pygpu_state_face_culling_set, + METH_O, + pygpu_state_face_culling_set_doc}, + {"front_facing_set", + (PyCFunction)pygpu_state_front_facing_set, + METH_O, + pygpu_state_front_facing_set_doc}, + {"program_point_size_set", + (PyCFunction)pygpu_state_program_point_size_set, + METH_O, + pygpu_state_program_point_size_set_doc}, + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_state__tp_doc, "This module provides access to the gpu state."); +static PyModuleDef pygpu_state_module_def = { + PyModuleDef_HEAD_INIT, + .m_name = "gpu.state", + .m_doc = pygpu_state__tp_doc, + .m_methods = pygpu_state__tp_methods, +}; + +PyObject *bpygpu_state_init(void) +{ + PyObject *submodule; + + submodule = PyModule_Create(&pygpu_state_module_def); + + return submodule; +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py_state.h b/source/blender/python/gpu/gpu_py_state.h new file mode 100644 index 00000000000..415c5ede822 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_state.h @@ -0,0 +1,23 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +PyObject *bpygpu_state_init(void); diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c new file mode 100644 index 00000000000..97dc99f5d58 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_texture.c @@ -0,0 +1,559 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the texture functionalities of the 'gpu' module + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_string.h" + +#include "GPU_context.h" +#include "GPU_texture.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" +#include "gpu_py_api.h" +#include "gpu_py_buffer.h" + +#include "gpu_py_texture.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUTexture Common Utilities + * \{ */ + +static const struct PyC_StringEnumItems pygpu_textureformat_items[] = { + {GPU_RGBA8UI, "RGBA8UI"}, + {GPU_RGBA8I, "RGBA8I"}, + {GPU_RGBA8, "RGBA8"}, + {GPU_RGBA32UI, "RGBA32UI"}, + {GPU_RGBA32I, "RGBA32I"}, + {GPU_RGBA32F, "RGBA32F"}, + {GPU_RGBA16UI, "RGBA16UI"}, + {GPU_RGBA16I, "RGBA16I"}, + {GPU_RGBA16F, "RGBA16F"}, + {GPU_RGBA16, "RGBA16"}, + {GPU_RG8UI, "RG8UI"}, + {GPU_RG8I, "RG8I"}, + {GPU_RG8, "RG8"}, + {GPU_RG32UI, "RG32UI"}, + {GPU_RG32I, "RG32I"}, + {GPU_RG32F, "RG32F"}, + {GPU_RG16UI, "RG16UI"}, + {GPU_RG16I, "RG16I"}, + {GPU_RG16F, "RG16F"}, + {GPU_RG16, "RG16"}, + {GPU_R8UI, "R8UI"}, + {GPU_R8I, "R8I"}, + {GPU_R8, "R8"}, + {GPU_R32UI, "R32UI"}, + {GPU_R32I, "R32I"}, + {GPU_R32F, "R32F"}, + {GPU_R16UI, "R16UI"}, + {GPU_R16I, "R16I"}, + {GPU_R16F, "R16F"}, + {GPU_R16, "R16"}, + {GPU_R11F_G11F_B10F, "R11F_G11F_B10F"}, + {GPU_DEPTH32F_STENCIL8, "DEPTH32F_STENCIL8"}, + {GPU_DEPTH24_STENCIL8, "DEPTH24_STENCIL8"}, + {GPU_SRGB8_A8, "SRGB8_A8"}, + {GPU_RGB16F, "RGB16F"}, + {GPU_SRGB8_A8_DXT1, "SRGB8_A8_DXT1"}, + {GPU_SRGB8_A8_DXT3, "SRGB8_A8_DXT3"}, + {GPU_SRGB8_A8_DXT5, "SRGB8_A8_DXT5"}, + {GPU_RGBA8_DXT1, "RGBA8_DXT1"}, + {GPU_RGBA8_DXT3, "RGBA8_DXT3"}, + {GPU_RGBA8_DXT5, "RGBA8_DXT5"}, + {GPU_DEPTH_COMPONENT32F, "DEPTH_COMPONENT32F"}, + {GPU_DEPTH_COMPONENT24, "DEPTH_COMPONENT24"}, + {GPU_DEPTH_COMPONENT16, "DEPTH_COMPONENT16"}, + {0, NULL}, +}; + +static int pygpu_texture_valid_check(BPyGPUTexture *bpygpu_tex) +{ + if (UNLIKELY(bpygpu_tex->tex == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU texture was freed, no further access is valid" +#else + "GPU texture: internal error" +#endif + ); + + return -1; + } + return 0; +} + +#define BPYGPU_TEXTURE_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_texture_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUTexture Type + * \{ */ + +static PyObject *pygpu_texture__tp_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + + PyObject *py_size; + int size[3] = {1, 1, 1}; + int layers = 0; + int is_cubemap = false; + struct PyC_StringEnum pygpu_textureformat = {pygpu_textureformat_items, GPU_RGBA8}; + BPyGPUBuffer *pybuffer_obj = NULL; + char err_out[256] = "unknown error. See console"; + + static const char *_keywords[] = {"size", "layers", "is_cubemap", "format", "data", NULL}; + static _PyArg_Parser _parser = {"O|$ipO&O!:GPUTexture.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, + kwds, + &_parser, + &py_size, + &layers, + &is_cubemap, + PyC_ParseStringEnum, + &pygpu_textureformat, + &BPyGPU_BufferType, + &pybuffer_obj)) { + return NULL; + } + + int len = 1; + if (PySequence_Check(py_size)) { + len = PySequence_Size(py_size); + if (PyC_AsArray(size, py_size, len, &PyLong_Type, false, "GPUTexture.__new__") == -1) { + return NULL; + } + } + else if (PyLong_Check(py_size)) { + size[0] = PyLong_AsLong(py_size); + } + else { + PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Expected an int or tuple as first arg"); + return NULL; + } + + void *data = NULL; + if (pybuffer_obj) { + if (pybuffer_obj->format != GPU_DATA_FLOAT) { + PyErr_SetString(PyExc_ValueError, + "GPUTexture.__new__: Only Buffer of format `FLOAT` is currently supported"); + return NULL; + } + + int component_len = GPU_texture_component_len(pygpu_textureformat.value_found); + int component_size_expected = sizeof(float); + size_t data_space_expected = (size_t)size[0] * size[1] * size[2] * max_ii(1, layers) * + component_len * component_size_expected; + if (is_cubemap) { + data_space_expected *= 6 * size[0]; + } + + if (bpygpu_Buffer_size(pybuffer_obj) < data_space_expected) { + PyErr_SetString(PyExc_ValueError, "GPUTexture.__new__: Buffer size smaller than requested"); + return NULL; + } + data = pybuffer_obj->buf.as_void; + } + + GPUTexture *tex = NULL; + if (is_cubemap && len != 1) { + STRNCPY(err_out, + "In cubemaps the same dimension represents height, width and depth. No tuple needed"); + } + else if (size[0] < 1 || size[1] < 1 || size[2] < 1) { + STRNCPY(err_out, "Values less than 1 are not allowed in dimensions"); + } + else if (layers && len == 3) { + STRNCPY(err_out, "3D textures have no layers"); + } + else if (!GPU_context_active_get()) { + STRNCPY(err_out, "No active GPU context found"); + } + else { + const char *name = "python_texture"; + if (is_cubemap) { + if (layers) { + tex = GPU_texture_create_cube_array( + name, size[0], layers, 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_cube(name, size[0], 1, pygpu_textureformat.value_found, data); + } + } + else if (layers) { + if (len == 2) { + tex = GPU_texture_create_2d_array( + name, size[0], size[1], layers, 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_1d_array( + name, size[0], layers, 1, pygpu_textureformat.value_found, data); + } + } + else if (len == 3) { + tex = GPU_texture_create_3d(name, + size[0], + size[1], + size[2], + 1, + pygpu_textureformat.value_found, + GPU_DATA_FLOAT, + NULL); + } + else if (len == 2) { + tex = GPU_texture_create_2d( + name, size[0], size[1], 1, pygpu_textureformat.value_found, data); + } + else { + tex = GPU_texture_create_1d(name, size[0], 1, pygpu_textureformat.value_found, data); + } + } + + if (tex == NULL) { + PyErr_Format(PyExc_RuntimeError, "gpu.texture.new(...) failed with '%s'", err_out); + return NULL; + } + + return BPyGPUTexture_CreatePyObject(tex); +} + +PyDoc_STRVAR(pygpu_texture_width_doc, "Width of the texture.\n\n:type: `int`"); +static PyObject *pygpu_texture_width_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + return PyLong_FromLong(GPU_texture_width(self->tex)); +} + +PyDoc_STRVAR(pygpu_texture_height_doc, "Height of the texture.\n\n:type: `int`"); +static PyObject *pygpu_texture_height_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + return PyLong_FromLong(GPU_texture_height(self->tex)); +} + +PyDoc_STRVAR(pygpu_texture_format_doc, "Format of the texture.\n\n:type: `str`"); +static PyObject *pygpu_texture_format_get(BPyGPUTexture *self, void *UNUSED(type)) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + eGPUTextureFormat format = GPU_texture_format(self->tex); + return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_textureformat_items, format)); +} + +PyDoc_STRVAR(pygpu_texture_clear_doc, + ".. method:: clear(format='FLOAT', value=(0.0, 0.0, 0.0, 1.0))\n" + "\n" + " Fill texture with specific value.\n" + "\n" + " :param format: One of these primitive types: {\n" + " `FLOAT`,\n" + " `INT`,\n" + " `UINT`,\n" + " `UBYTE`,\n" + " `UINT_24_8`,\n" + " `10_11_11_REV`,\n" + " :type type: `str`\n" + " :arg value: sequence each representing the value to fill.\n" + " :type value: sequence of 1, 2, 3 or 4 values\n"); +static PyObject *pygpu_texture_clear(BPyGPUTexture *self, PyObject *args, PyObject *kwds) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + struct PyC_StringEnum pygpu_dataformat = {bpygpu_dataformat_items}; + union { + int i[4]; + float f[4]; + char c[4]; + } values; + + PyObject *py_values; + + static const char *_keywords[] = {"format", "value", NULL}; + static _PyArg_Parser _parser = {"$O&O:clear", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, PyC_ParseStringEnum, &pygpu_dataformat, &py_values)) { + return NULL; + } + + int shape = PySequence_Size(py_values); + if (shape == -1) { + return NULL; + } + + if (shape > 4) { + PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is 4"); + return NULL; + } + + if (shape != 1 && + ELEM(pygpu_dataformat.value_found, GPU_DATA_UNSIGNED_INT_24_8, GPU_DATA_10_11_11_REV)) { + PyErr_SetString(PyExc_AttributeError, + "`UINT_24_8` and `10_11_11_REV` only support single values"); + return NULL; + } + + memset(&values, 0, sizeof(values)); + if (PyC_AsArray(&values, + py_values, + shape, + pygpu_dataformat.value_found == GPU_DATA_FLOAT ? &PyFloat_Type : &PyLong_Type, + false, + "clear") == -1) { + return NULL; + } + + if (pygpu_dataformat.value_found == GPU_DATA_UNSIGNED_BYTE) { + /* Convert to byte. */ + values.c[0] = values.i[0]; + values.c[1] = values.i[1]; + values.c[2] = values.i[2]; + values.c[3] = values.i[3]; + } + + GPU_texture_clear(self->tex, pygpu_dataformat.value_found, &values); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pygpu_texture_read_doc, + ".. method:: read()\n" + "\n" + " Creates a buffer with the value of all pixels.\n" + "\n"); +static PyObject *pygpu_texture_read(BPyGPUTexture *self) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + + /* #GPU_texture_read is restricted in combining 'data_format' with 'tex_format'. + * So choose data_format here. */ + eGPUDataFormat best_data_format; + switch (GPU_texture_format(self->tex)) { + case GPU_DEPTH_COMPONENT24: + case GPU_DEPTH_COMPONENT16: + case GPU_DEPTH_COMPONENT32F: + best_data_format = GPU_DATA_FLOAT; + break; + case GPU_DEPTH24_STENCIL8: + case GPU_DEPTH32F_STENCIL8: + best_data_format = GPU_DATA_UNSIGNED_INT_24_8; + break; + case GPU_R8UI: + case GPU_R16UI: + case GPU_RG16UI: + case GPU_R32UI: + best_data_format = GPU_DATA_UNSIGNED_INT; + break; + case GPU_RG16I: + case GPU_R16I: + best_data_format = GPU_DATA_INT; + break; + case GPU_R8: + case GPU_RG8: + case GPU_RGBA8: + case GPU_RGBA8UI: + case GPU_SRGB8_A8: + best_data_format = GPU_DATA_UNSIGNED_BYTE; + break; + case GPU_R11F_G11F_B10F: + best_data_format = GPU_DATA_10_11_11_REV; + break; + default: + best_data_format = GPU_DATA_FLOAT; + break; + } + + void *buf = GPU_texture_read(self->tex, best_data_format, 0); + return (PyObject *)BPyGPU_Buffer_CreatePyObject( + best_data_format, + 2, + (Py_ssize_t[2]){GPU_texture_height(self->tex), GPU_texture_width(self->tex)}, + buf); +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_texture_free_doc, + ".. method:: free()\n" + "\n" + " Free the texture object.\n" + " The texture object will no longer be accessible.\n"); +static PyObject *pygpu_texture_free(BPyGPUTexture *self) +{ + BPYGPU_TEXTURE_CHECK_OBJ(self); + + GPU_texture_free(self->tex); + self->tex = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUTexture__tp_dealloc(BPyGPUTexture *self) +{ + if (self->tex) { + GPU_texture_free(self->tex); + } + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_texture__tp_getseters[] = { + {"width", (getter)pygpu_texture_width_get, (setter)NULL, pygpu_texture_width_doc, NULL}, + {"height", (getter)pygpu_texture_height_get, (setter)NULL, pygpu_texture_height_doc, NULL}, + {"format", (getter)pygpu_texture_format_get, (setter)NULL, pygpu_texture_format_doc, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_texture__tp_methods[] = { + {"clear", + (PyCFunction)pygpu_texture_clear, + METH_VARARGS | METH_KEYWORDS, + pygpu_texture_clear_doc}, + {"read", (PyCFunction)pygpu_texture_read, METH_NOARGS, pygpu_texture_read_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_texture_free, METH_NOARGS, pygpu_texture_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR( + pygpu_texture__tp_doc, + ".. class:: GPUTexture(size, layers=0, is_cubemap=False, format='RGBA8', data=None)\n" + "\n" + " This object gives access to off GPU textures.\n" + "\n" + " :arg size: Dimensions of the texture 1D, 2D, 3D or cubemap.\n" + " :type size: `tuple` or `int`\n" + " :arg layers: Number of layers in texture array or number of cubemaps in cubemap array\n" + " :type layers: `int`\n" + " :arg is_cubemap: Indicates the creation of a cubemap texture.\n" + " :type is_cubemap: `int`\n" + " :arg format: One of these primitive types: {\n" + " `RGBA8UI`,\n" + " `RGBA8I`,\n" + " `RGBA8`,\n" + " `RGBA32UI`,\n" + " `RGBA32I`,\n" + " `RGBA32F`,\n" + " `RGBA16UI`,\n" + " `RGBA16I`,\n" + " `RGBA16F`,\n" + " `RGBA16`,\n" + " `RG8UI`,\n" + " `RG8I`,\n" + " `RG8`,\n" + " `RG32UI`,\n" + " `RG32I`,\n" + " `RG32F`,\n" + " `RG16UI`,\n" + " `RG16I`,\n" + " `RG16F`,\n" + " `RG16`,\n" + " `R8UI`,\n" + " `R8I`,\n" + " `R8`,\n" + " `R32UI`,\n" + " `R32I`,\n" + " `R32F`,\n" + " `R16UI`,\n" + " `R16I`,\n" + " `R16F`,\n" + " `R16`,\n" + " `R11F_G11F_B10F`,\n" + " `DEPTH32F_STENCIL8`,\n" + " `DEPTH24_STENCIL8`,\n" + " `SRGB8_A8`,\n" + " `RGB16F`,\n" + " `SRGB8_A8_DXT1`,\n" + " `SRGB8_A8_DXT3`,\n" + " `SRGB8_A8_DXT5`,\n" + " `RGBA8_DXT1`,\n" + " `RGBA8_DXT3`,\n" + " `RGBA8_DXT5`,\n" + " `DEPTH_COMPONENT32F`,\n" + " `DEPTH_COMPONENT24`,\n" + " `DEPTH_COMPONENT16`,\n" + " :type format: `str`\n" + " :arg data: Buffer object to fill the texture.\n" + " :type data: `Buffer`\n"); +PyTypeObject BPyGPUTexture_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUTexture", + .tp_basicsize = sizeof(BPyGPUTexture), + .tp_dealloc = (destructor)BPyGPUTexture__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_texture__tp_doc, + .tp_methods = pygpu_texture__tp_methods, + .tp_getset = pygpu_texture__tp_getseters, + .tp_new = pygpu_texture__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Local API + * \{ */ + +int bpygpu_ParseTexture(PyObject *o, void *p) +{ + if (o == Py_None) { + *(GPUTexture **)p = NULL; + return 1; + } + + if (!BPyGPUTexture_Check(o)) { + PyErr_Format( + PyExc_ValueError, "expected a texture or None object, got %s", Py_TYPE(o)->tp_name); + return 0; + } + + if (UNLIKELY(pygpu_texture_valid_check((BPyGPUTexture *)o) == -1)) { + return 0; + } + + *(GPUTexture **)p = ((BPyGPUTexture *)o)->tex; + return 1; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUTexture_CreatePyObject(GPUTexture *tex) +{ + BPyGPUTexture *self; + + self = PyObject_New(BPyGPUTexture, &BPyGPUTexture_Type); + self->tex = tex; + + return (PyObject *)self; +} + +/** \} */ + +#undef BPYGPU_TEXTURE_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_texture.h b/source/blender/python/gpu/gpu_py_texture.h new file mode 100644 index 00000000000..be7348b2bd4 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_texture.h @@ -0,0 +1,34 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUTexture_Type; + +#define BPyGPUTexture_Check(v) (Py_TYPE(v) == &BPyGPUTexture_Type) + +typedef struct BPyGPUTexture { + PyObject_HEAD struct GPUTexture *tex; +} BPyGPUTexture; + +int bpygpu_ParseTexture(PyObject *o, void *p); +PyObject *BPyGPUTexture_CreatePyObject(struct GPUTexture *tex) ATTR_NONNULL(1); diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c index 5829cd8c088..fdd589d788e 100644 --- a/source/blender/python/gpu/gpu_py_types.c +++ b/source/blender/python/gpu/gpu_py_types.c @@ -43,6 +43,9 @@ PyObject *bpygpu_types_init(void) submodule = PyModule_Create(&pygpu_types_module_def); + if (PyType_Ready(&BPyGPU_BufferType) < 0) { + return NULL; + } if (PyType_Ready(&BPyGPUVertFormat_Type) < 0) { return NULL; } @@ -61,13 +64,26 @@ PyObject *bpygpu_types_init(void) if (PyType_Ready(&BPyGPUShader_Type) < 0) { return NULL; } + if (PyType_Ready(&BPyGPUTexture_Type) < 0) { + return NULL; + } + if (PyType_Ready(&BPyGPUFrameBuffer_Type) < 0) { + return NULL; + } + if (PyType_Ready(&BPyGPUUniformBuf_Type) < 0) { + return NULL; + } + PyModule_AddType(submodule, &BPyGPU_BufferType); PyModule_AddType(submodule, &BPyGPUVertFormat_Type); PyModule_AddType(submodule, &BPyGPUVertBuf_Type); PyModule_AddType(submodule, &BPyGPUIndexBuf_Type); PyModule_AddType(submodule, &BPyGPUBatch_Type); PyModule_AddType(submodule, &BPyGPUOffScreen_Type); PyModule_AddType(submodule, &BPyGPUShader_Type); + PyModule_AddType(submodule, &BPyGPUTexture_Type); + PyModule_AddType(submodule, &BPyGPUFrameBuffer_Type); + PyModule_AddType(submodule, &BPyGPUUniformBuf_Type); return submodule; } diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py_types.h index cf8d6d694e6..eb72c04d53e 100644 --- a/source/blender/python/gpu/gpu_py_types.h +++ b/source/blender/python/gpu/gpu_py_types.h @@ -20,10 +20,15 @@ #pragma once +#include "gpu_py_buffer.h" + #include "gpu_py_batch.h" #include "gpu_py_element.h" +#include "gpu_py_framebuffer.h" #include "gpu_py_offscreen.h" #include "gpu_py_shader.h" +#include "gpu_py_texture.h" +#include "gpu_py_uniformbuffer.h" #include "gpu_py_vertex_buffer.h" #include "gpu_py_vertex_format.h" diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.c b/source/blender/python/gpu/gpu_py_uniformbuffer.c new file mode 100644 index 00000000000..d1b86455918 --- /dev/null +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.c @@ -0,0 +1,195 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + * + * This file defines the uniform buffer functionalities of the 'gpu' module + * + * - Use ``bpygpu_`` for local API. + * - Use ``BPyGPU`` for public API. + */ + +#include + +#include "BLI_string.h" + +#include "GPU_context.h" +#include "GPU_texture.h" +#include "GPU_uniform_buffer.h" + +#include "../generic/py_capi_utils.h" + +#include "gpu_py.h" +#include "gpu_py_api.h" +#include "gpu_py_buffer.h" + +#include "gpu_py_uniformbuffer.h" /* own include */ + +/* -------------------------------------------------------------------- */ +/** \name GPUUniformBuf Common Utilities + * \{ */ + +static int pygpu_uniformbuffer_valid_check(BPyGPUUniformBuf *bpygpu_ub) +{ + if (UNLIKELY(bpygpu_ub->ubo == NULL)) { + PyErr_SetString(PyExc_ReferenceError, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + "GPU uniform buffer was freed, no further access is valid"); +#else + + "GPU uniform buffer: internal error"); +#endif + return -1; + } + return 0; +} + +#define BPYGPU_UNIFORMBUF_CHECK_OBJ(bpygpu) \ + { \ + if (UNLIKELY(pygpu_uniformbuffer_valid_check(bpygpu) == -1)) { \ + return NULL; \ + } \ + } \ + ((void)0) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GPUUniformBuf Type + * \{ */ + +static PyObject *pygpu_uniformbuffer__tp_new(PyTypeObject *UNUSED(self), + PyObject *args, + PyObject *kwds) +{ + BPYGPU_IS_INIT_OR_ERROR_OBJ; + + GPUUniformBuf *ubo = NULL; + BPyGPUBuffer *pybuffer_obj; + char err_out[256] = "unknown error. See console"; + + static const char *_keywords[] = {"data", NULL}; + static _PyArg_Parser _parser = {"O!:GPUUniformBuf.__new__", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &BPyGPU_BufferType, &pybuffer_obj)) { + return NULL; + } + + if (GPU_context_active_get()) { + ubo = GPU_uniformbuf_create_ex( + bpygpu_Buffer_size(pybuffer_obj), pybuffer_obj->buf.as_void, "python_uniformbuffer"); + } + else { + STRNCPY(err_out, "No active GPU context found"); + } + + if (ubo == NULL) { + PyErr_Format(PyExc_RuntimeError, "GPUUniformBuf.__new__(...) failed with '%s'", err_out); + return NULL; + } + + return BPyGPUUniformBuf_CreatePyObject(ubo); +} + +PyDoc_STRVAR(pygpu_uniformbuffer_update_doc, + ".. method::update(data)\n" + "\n" + " Update the data of the uniform buffer object.\n"); +static PyObject *pygpu_uniformbuffer_update(BPyGPUUniformBuf *self, PyObject *obj) +{ + BPYGPU_UNIFORMBUF_CHECK_OBJ(self); + + if (!BPyGPU_Buffer_Check(obj)) { + return NULL; + } + + GPU_uniformbuf_update(self->ubo, ((BPyGPUBuffer *)obj)->buf.as_void); + Py_RETURN_NONE; +} + +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD +PyDoc_STRVAR(pygpu_uniformbuffer_free_doc, + ".. method::free()\n" + "\n" + " Free the uniform buffer object.\n" + " The uniform buffer object will no longer be accessible.\n"); +static PyObject *pygpu_uniformbuffer_free(BPyGPUUniformBuf *self) +{ + BPYGPU_UNIFORMBUF_CHECK_OBJ(self); + + GPU_uniformbuf_free(self->ubo); + self->ubo = NULL; + Py_RETURN_NONE; +} +#endif + +static void BPyGPUUniformBuf__tp_dealloc(BPyGPUUniformBuf *self) +{ + if (self->ubo) { + GPU_uniformbuf_free(self->ubo); + } + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyGetSetDef pygpu_uniformbuffer__tp_getseters[] = { + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + +static struct PyMethodDef pygpu_uniformbuffer__tp_methods[] = { + {"update", (PyCFunction)pygpu_uniformbuffer_update, METH_O, pygpu_uniformbuffer_update_doc}, +#ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD + {"free", (PyCFunction)pygpu_uniformbuffer_free, METH_NOARGS, pygpu_uniformbuffer_free_doc}, +#endif + {NULL, NULL, 0, NULL}, +}; + +PyDoc_STRVAR(pygpu_uniformbuffer__tp_doc, + ".. class:: GPUUniformBuf(data)\n" + "\n" + " This object gives access to off uniform buffers.\n" + "\n" + " :arg data: Buffer object.\n" + " :type data: `Buffer`\n"); +PyTypeObject BPyGPUUniformBuf_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "GPUUniformBuf", + .tp_basicsize = sizeof(BPyGPUUniformBuf), + .tp_dealloc = (destructor)BPyGPUUniformBuf__tp_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = pygpu_uniformbuffer__tp_doc, + .tp_methods = pygpu_uniformbuffer__tp_methods, + .tp_getset = pygpu_uniformbuffer__tp_getseters, + .tp_new = pygpu_uniformbuffer__tp_new, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +PyObject *BPyGPUUniformBuf_CreatePyObject(GPUUniformBuf *ubo) +{ + BPyGPUUniformBuf *self; + + self = PyObject_New(BPyGPUUniformBuf, &BPyGPUUniformBuf_Type); + self->ubo = ubo; + + return (PyObject *)self; +} + +/** \} */ + +#undef BPYGPU_UNIFORMBUF_CHECK_OBJ diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.h b/source/blender/python/gpu/gpu_py_uniformbuffer.h new file mode 100644 index 00000000000..a13c33ae78a --- /dev/null +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.h @@ -0,0 +1,33 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bpygpu + */ + +#pragma once + +#include "BLI_compiler_attrs.h" + +extern PyTypeObject BPyGPUUniformBuf_Type; + +#define BPyGPUUniformBuf_Check(v) (Py_TYPE(v) == &BPyGPUUniformBuf_Type) + +typedef struct BPyGPUUniformBuf { + PyObject_HEAD struct GPUUniformBuf *ubo; +} BPyGPUUniformBuf; + +PyObject *BPyGPUUniformBuf_CreatePyObject(struct GPUUniformBuf *ubo) ATTR_NONNULL(1); From 89c79c3ed8d4f8cdf4f78782443bcf218425b412 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 17 Feb 2021 12:38:21 -0300 Subject: [PATCH 256/519] Cleanup: Abbreviate enums with 'UNSIGNED_' in the name --- source/blender/blenfont/intern/blf_font.c | 2 +- source/blender/blenkernel/intern/image_gpu.c | 4 ++-- .../draw/engines/eevee/eevee_lightcache.c | 4 ++-- .../engines/gpencil/gpencil_antialiasing.c | 4 ++-- .../workbench/workbench_effect_antialiasing.c | 4 ++-- .../blender/draw/intern/draw_select_buffer.c | 2 +- source/blender/editors/gpencil/gpencil_fill.c | 2 +- .../editors/interface/interface_icons.c | 8 ++++---- source/blender/editors/render/render_opengl.c | 2 +- source/blender/editors/screen/glutil.c | 2 +- source/blender/editors/screen/screen_draw.c | 2 +- .../editors/sculpt_paint/paint_cursor.c | 8 ++++---- source/blender/editors/space_clip/clip_draw.c | 2 +- .../editors/space_sequencer/sequencer_draw.c | 6 +++--- .../blender/editors/space_view3d/view3d_draw.c | 2 +- source/blender/gpu/GPU_texture.h | 6 +++--- source/blender/gpu/intern/gpu_framebuffer.cc | 2 +- source/blender/gpu/intern/gpu_select_pick.c | 2 +- .../blender/gpu/intern/gpu_texture_private.hh | 18 +++++++++--------- source/blender/gpu/opengl/gl_framebuffer.cc | 6 +++--- source/blender/gpu/opengl/gl_texture.hh | 6 +++--- source/blender/imbuf/intern/util_gpu.c | 2 +- source/blender/python/gpu/gpu_py.c | 6 +++--- source/blender/python/gpu/gpu_py_buffer.c | 18 +++++++++--------- source/blender/python/gpu/gpu_py_texture.c | 10 +++++----- .../blender/windowmanager/intern/wm_window.c | 2 +- 26 files changed, 66 insertions(+), 66 deletions(-) diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 189cbaf152d..f83ee409187 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -192,7 +192,7 @@ static GPUTexture *blf_batch_cache_texture_load(void) int remain_row = tex_width - offset_x; int width = remain > remain_row ? remain_row : remain; GPU_texture_update_sub(gc->texture, - GPU_DATA_UNSIGNED_BYTE, + GPU_DATA_UBYTE, &gc->bitmap_result[bitmap_len_landed], offset_x, offset_y, diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index 2ee4505acf0..8847b88d6f2 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -647,7 +647,7 @@ static void gpu_texture_update_scaled(GPUTexture *tex, } void *data = (ibuf->rect_float) ? (void *)(ibuf->rect_float) : (void *)(ibuf->rect); - eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat data_format = (ibuf->rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; GPU_texture_update_sub(tex, data_format, data, x, y, layer, w, h, 1); @@ -673,7 +673,7 @@ static void gpu_texture_update_unscaled(GPUTexture *tex, } void *data = (rect_float) ? (void *)(rect_float + tex_offset) : (void *)(rect + tex_offset); - eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat data_format = (rect_float) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; /* Partial update without scaling. Stride and offset are used to copy only a * subset of a possible larger buffer than what we are updating. */ diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index c4973dc2e8b..c7c457711f5 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -403,7 +403,7 @@ static bool eevee_lightcache_static_load(LightCache *lcache) if (lcache->grid_tx.tex == NULL) { lcache->grid_tx.tex = GPU_texture_create_2d_array( "lightcache_irradiance", UNPACK3(lcache->grid_tx.tex_size), 1, IRRADIANCE_FORMAT, NULL); - GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, lcache->grid_tx.data); + GPU_texture_update(lcache->grid_tx.tex, GPU_DATA_UBYTE, lcache->grid_tx.data); if (lcache->grid_tx.tex == NULL) { lcache->flag |= LIGHTCACHE_NOT_USABLE; @@ -470,7 +470,7 @@ bool EEVEE_lightcache_load(LightCache *lcache) static void eevee_lightbake_readback_irradiance(LightCache *lcache) { MEM_SAFE_FREE(lcache->grid_tx.data); - lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UNSIGNED_BYTE, 0); + lcache->grid_tx.data = GPU_texture_read(lcache->grid_tx.tex, GPU_DATA_UBYTE, 0); lcache->grid_tx.data_type = LIGHTCACHETEX_BYTE; lcache->grid_tx.components = 4; } diff --git a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c index 511f09db247..eaf010e81c9 100644 --- a/source/blender/draw/engines/gpencil/gpencil_antialiasing.c +++ b/source/blender/draw/engines/gpencil/gpencil_antialiasing.c @@ -58,11 +58,11 @@ void GPENCIL_antialiasing_init(struct GPENCIL_Data *vedata) if (txl->smaa_search_tx == NULL) { txl->smaa_search_tx = GPU_texture_create_2d( "smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL); - GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes); + GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes); txl->smaa_area_tx = GPU_texture_create_2d( "smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL); - GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes); + GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes); GPU_texture_filter_mode(txl->smaa_search_tx, true); GPU_texture_filter_mode(txl->smaa_area_tx, true); diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index 83aa7f6e344..c9f876f9573 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -244,11 +244,11 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata) if (txl->smaa_search_tx == NULL) { txl->smaa_search_tx = GPU_texture_create_2d( "smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL); - GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UNSIGNED_BYTE, searchTexBytes); + GPU_texture_update(txl->smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes); txl->smaa_area_tx = GPU_texture_create_2d( "smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL); - GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UNSIGNED_BYTE, areaTexBytes); + GPU_texture_update(txl->smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes); GPU_texture_filter_mode(txl->smaa_search_tx, true); GPU_texture_filter_mode(txl->smaa_area_tx, true); diff --git a/source/blender/draw/intern/draw_select_buffer.c b/source/blender/draw/intern/draw_select_buffer.c index ee5561e1e38..b5151293c1b 100644 --- a/source/blender/draw/intern/draw_select_buffer.c +++ b/source/blender/draw/intern/draw_select_buffer.c @@ -91,7 +91,7 @@ uint *DRW_select_buffer_read(struct Depsgraph *depsgraph, BLI_rcti_size_y(&rect_clamp), 1, 0, - GPU_DATA_UNSIGNED_INT, + GPU_DATA_UINT, r_buf); if (!BLI_rcti_compare(rect, &rect_clamp)) { diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index e1a4f40745c..a81d319ab42 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -723,7 +723,7 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) GPU_offscreen_read_pixels(offscreen, GPU_DATA_FLOAT, ibuf->rect_float); } else if (ibuf->rect) { - GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, ibuf->rect); + GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, ibuf->rect); } if (ibuf->rect_float && ibuf->rect) { IMB_rect_from_float(ibuf); diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 26f0f6ca98a..1739035f92c 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -889,15 +889,15 @@ void UI_icons_reload_internal_textures(void) icongltex.invh = 1.0f / b32buf->y; icongltex.tex[0] = GPU_texture_create_2d("icons", b32buf->x, b32buf->y, 2, GPU_RGBA8, NULL); - GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UNSIGNED_BYTE, b32buf->rect); - GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UNSIGNED_BYTE, b16buf->rect); + GPU_texture_update_mipmap(icongltex.tex[0], 0, GPU_DATA_UBYTE, b32buf->rect); + GPU_texture_update_mipmap(icongltex.tex[0], 1, GPU_DATA_UBYTE, b16buf->rect); } if (need_icons_with_border && icongltex.tex[1] == NULL) { icongltex.tex[1] = GPU_texture_create_2d( "icons_border", b32buf_border->x, b32buf_border->y, 2, GPU_RGBA8, NULL); - GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UNSIGNED_BYTE, b32buf_border->rect); - GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UNSIGNED_BYTE, b16buf_border->rect); + GPU_texture_update_mipmap(icongltex.tex[1], 0, GPU_DATA_UBYTE, b32buf_border->rect); + GPU_texture_update_mipmap(icongltex.tex[1], 1, GPU_DATA_UBYTE, b16buf_border->rect); } } diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 6744461b2f2..48f937fb4ec 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -351,7 +351,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R G.f &= ~G_FLAG_RENDER_VIEWPORT; gp_rect = MEM_mallocN(sizeof(uchar[4]) * sizex * sizey, "offscreen rect"); - GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UNSIGNED_BYTE, gp_rect); + GPU_offscreen_read_pixels(oglrender->ofs, GPU_DATA_UBYTE, gp_rect); for (i = 0; i < sizex * sizey * 4; i += 4) { blend_color_mix_byte(&render_rect[i], &render_rect[i], &gp_rect[i]); diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index a88afecd064..e366760a55d 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -131,7 +131,7 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state, } const bool use_float_data = ELEM(gpu_format, GPU_RGBA16F, GPU_RGB16F, GPU_R16F); - eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + eGPUDataFormat gpu_data = (use_float_data) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; size_t stride = components * ((use_float_data) ? sizeof(float) : sizeof(uchar)); GPUTexture *tex = GPU_texture_create_2d("immDrawPixels", tex_w, tex_h, 1, gpu_format, NULL); diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c index 1ea64c542f5..2ba7ef8f972 100644 --- a/source/blender/editors/screen/screen_draw.c +++ b/source/blender/editors/screen/screen_draw.c @@ -610,7 +610,7 @@ void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, uin screen_preview_draw(screen, size_x, size_y); - GPU_offscreen_read_pixels(offscreen, GPU_DATA_UNSIGNED_BYTE, r_rect); + GPU_offscreen_read_pixels(offscreen, GPU_DATA_UBYTE, r_rect); GPU_offscreen_unbind(offscreen, true); GPU_offscreen_free(offscreen); diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index 7eb08cbabac..e9f33d2fbd3 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -350,7 +350,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima eGPUTextureFormat format = col ? GPU_RGBA8 : GPU_R8; target->overlay_texture = GPU_texture_create_2d( "paint_cursor_overlay", size, size, 1, format, NULL); - GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer); if (!col) { GPU_texture_swizzle_set(target->overlay_texture, "rrrr"); @@ -358,7 +358,7 @@ static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool prima } if (init) { - GPU_texture_update(target->overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(target->overlay_texture, GPU_DATA_UBYTE, buffer); } if (buffer) { @@ -469,13 +469,13 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom) if (!cursor_snap.overlay_texture) { cursor_snap.overlay_texture = GPU_texture_create_2d( "cursor_snap_overaly", size, size, 1, GPU_R8, NULL); - GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer); GPU_texture_swizzle_set(cursor_snap.overlay_texture, "rrrr"); } if (init) { - GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UNSIGNED_BYTE, buffer); + GPU_texture_update(cursor_snap.overlay_texture, GPU_DATA_UBYTE, buffer); } if (buffer) { diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index 93c30c9a4ba..cbe8ec4ba00 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -1207,7 +1207,7 @@ static void draw_plane_marker_image(Scene *scene, GPUTexture *texture = GPU_texture_create_2d( "plane_marker_image", ibuf->x, ibuf->y, 1, GPU_RGBA8, NULL); - GPU_texture_update(texture, GPU_DATA_UNSIGNED_BYTE, display_buffer); + GPU_texture_update(texture, GPU_DATA_UBYTE, display_buffer); GPU_texture_filter_mode(texture, false); GPU_matrix_push(); diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 201df1ceed6..b9fb577eb43 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -1533,7 +1533,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C, /* Default */ *r_format = GPU_RGBA8; - *r_data = GPU_DATA_UNSIGNED_BYTE; + *r_data = GPU_DATA_UBYTE; /* Fallback to CPU based color space conversion. */ if (force_fallback) { @@ -1580,7 +1580,7 @@ static void *sequencer_OCIO_transform_ibuf(const bContext *C, if ((ibuf->rect || ibuf->rect_float) && !*r_glsl_used) { display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle); *r_format = GPU_RGBA8; - *r_data = GPU_DATA_UNSIGNED_BYTE; + *r_data = GPU_DATA_UBYTE; } if (cache_handle) { IMB_display_buffer_release(cache_handle); @@ -1682,7 +1682,7 @@ static void sequencer_draw_display_buffer(const bContext *C, display_buffer = (uchar *)ibuf->rect; format = GPU_RGBA8; - data = GPU_DATA_UNSIGNED_BYTE; + data = GPU_DATA_UBYTE; } else { display_buffer = sequencer_OCIO_transform_ibuf(C, ibuf, &glsl_used, &format, &data); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 12fb96c0737..a46d093c039 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2002,7 +2002,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, GPU_offscreen_read_pixels(ofs, GPU_DATA_FLOAT, ibuf->rect_float); } else if (ibuf->rect) { - GPU_offscreen_read_pixels(ofs, GPU_DATA_UNSIGNED_BYTE, ibuf->rect); + GPU_offscreen_read_pixels(ofs, GPU_DATA_UBYTE, ibuf->rect); } /* unbind */ diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index 176d7bbb5af..2b4d8c8f577 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -171,9 +171,9 @@ typedef enum eGPUTextureFormat { typedef enum eGPUDataFormat { GPU_DATA_FLOAT, GPU_DATA_INT, - GPU_DATA_UNSIGNED_INT, - GPU_DATA_UNSIGNED_BYTE, - GPU_DATA_UNSIGNED_INT_24_8, + GPU_DATA_UINT, + GPU_DATA_UBYTE, + GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV, } eGPUDataFormat; diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 2813132c799..0dd7948532c 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -656,7 +656,7 @@ void GPU_offscreen_draw_to_screen(GPUOffScreen *ofs, int x, int y) void GPU_offscreen_read_pixels(GPUOffScreen *ofs, eGPUDataFormat format, void *pixels) { - BLI_assert(ELEM(format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT)); + BLI_assert(ELEM(format, GPU_DATA_UBYTE, GPU_DATA_FLOAT)); const int w = GPU_texture_width(ofs->color); const int h = GPU_texture_height(ofs->color); diff --git a/source/blender/gpu/intern/gpu_select_pick.c b/source/blender/gpu/intern/gpu_select_pick.c index 6cda7888712..89c94fd3ba5 100644 --- a/source/blender/gpu/intern/gpu_select_pick.c +++ b/source/blender/gpu/intern/gpu_select_pick.c @@ -483,7 +483,7 @@ bool gpu_select_pick_load_id(uint id, bool end) const uint rect_len = ps->src.rect_len; GPUFrameBuffer *fb = GPU_framebuffer_active_get(); GPU_framebuffer_read_depth( - fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UNSIGNED_INT, ps->gl.rect_depth_test->buf); + fb, UNPACK4(ps->gl.clip_readpixels), GPU_DATA_UINT, ps->gl.rect_depth_test->buf); /* perform initial check since most cases the array remains unchanged */ bool do_pass = false; diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index 51a953e110d..e03d5f6e6ce 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -387,13 +387,13 @@ inline int to_component_len(eGPUTextureFormat format) inline size_t to_bytesize(eGPUDataFormat data_format) { switch (data_format) { - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return 1; case GPU_DATA_FLOAT: case GPU_DATA_INT: - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: return 4; - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: return 4; default: @@ -417,12 +417,12 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da return data_format == GPU_DATA_FLOAT; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: - return data_format == GPU_DATA_UNSIGNED_INT_24_8; + return data_format == GPU_DATA_UINT_24_8; case GPU_R8UI: case GPU_R16UI: case GPU_RG16UI: case GPU_R32UI: - return data_format == GPU_DATA_UNSIGNED_INT; + return data_format == GPU_DATA_UINT; case GPU_RG16I: case GPU_R16I: return data_format == GPU_DATA_INT; @@ -431,7 +431,7 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da case GPU_RGBA8: case GPU_RGBA8UI: case GPU_SRGB8_A8: - return ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT); + return ELEM(data_format, GPU_DATA_UBYTE, GPU_DATA_FLOAT); case GPU_R11F_G11F_B10F: return ELEM(data_format, GPU_DATA_10_11_11_REV, GPU_DATA_FLOAT); default: @@ -449,12 +449,12 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format) return GPU_DATA_FLOAT; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: - return GPU_DATA_UNSIGNED_INT_24_8; + return GPU_DATA_UINT_24_8; case GPU_R8UI: case GPU_R16UI: case GPU_RG16UI: case GPU_R32UI: - return GPU_DATA_UNSIGNED_INT; + return GPU_DATA_UINT; case GPU_RG16I: case GPU_R16I: return GPU_DATA_INT; @@ -463,7 +463,7 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format) case GPU_RGBA8: case GPU_RGBA8UI: case GPU_SRGB8_A8: - return GPU_DATA_UNSIGNED_BYTE; + return GPU_DATA_UBYTE; case GPU_R11F_G11F_B10F: return GPU_DATA_10_11_11_REV; default: diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc index aea19295311..920dac407d7 100644 --- a/source/blender/gpu/opengl/gl_framebuffer.cc +++ b/source/blender/gpu/opengl/gl_framebuffer.cc @@ -365,7 +365,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, context_->state_manager->apply_state(); if (type == GPU_FB_DEPTH_STENCIL_ATTACHMENT) { - BLI_assert(data_format == GPU_DATA_UNSIGNED_INT_24_8); + BLI_assert(data_format == GPU_DATA_UINT_24_8); float depth = ((*(uint32_t *)clear_value) & 0x00FFFFFFu) / (float)0x00FFFFFFu; int stencil = ((*(uint32_t *)clear_value) >> 24); glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil); @@ -374,7 +374,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, if (data_format == GPU_DATA_FLOAT) { glClearBufferfv(GL_DEPTH, 0, (GLfloat *)clear_value); } - else if (data_format == GPU_DATA_UNSIGNED_INT) { + else if (data_format == GPU_DATA_UINT) { float depth = *(uint32_t *)clear_value / (float)0xFFFFFFFFu; glClearBufferfv(GL_DEPTH, 0, &depth); } @@ -388,7 +388,7 @@ void GLFrameBuffer::clear_attachment(GPUAttachmentType type, case GPU_DATA_FLOAT: glClearBufferfv(GL_COLOR, slot, (GLfloat *)clear_value); break; - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: glClearBufferuiv(GL_COLOR, slot, (GLuint *)clear_value); break; case GPU_DATA_INT: diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh index 65a211e12a3..afe0e0195ce 100644 --- a/source/blender/gpu/opengl/gl_texture.hh +++ b/source/blender/gpu/opengl/gl_texture.hh @@ -274,11 +274,11 @@ inline GLenum to_gl(eGPUDataFormat format) return GL_FLOAT; case GPU_DATA_INT: return GL_INT; - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: return GL_UNSIGNED_INT; - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return GL_UNSIGNED_BYTE; - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT_24_8: return GL_UNSIGNED_INT_24_8; case GPU_DATA_10_11_11_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; diff --git a/source/blender/imbuf/intern/util_gpu.c b/source/blender/imbuf/intern/util_gpu.c index 8bedf8eb93c..2b99a0aa81d 100644 --- a/source/blender/imbuf/intern/util_gpu.c +++ b/source/blender/imbuf/intern/util_gpu.c @@ -49,7 +49,7 @@ static void imb_gpu_get_format(const ImBuf *ibuf, !IMB_colormanagement_space_is_scene_linear(ibuf->rect_colorspace)); high_bitdepth = (!(ibuf->flags & IB_halffloat) && high_bitdepth); - *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UNSIGNED_BYTE; + *r_data_format = (float_rect) ? GPU_DATA_FLOAT : GPU_DATA_UBYTE; if (float_rect) { *r_texture_format = high_bitdepth ? GPU_RGBA32F : GPU_RGBA16F; diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c index 522cd89c5c0..35cc945e76c 100644 --- a/source/blender/python/gpu/gpu_py.c +++ b/source/blender/python/gpu/gpu_py.c @@ -36,9 +36,9 @@ struct PyC_StringEnumItems bpygpu_dataformat_items[] = { {GPU_DATA_FLOAT, "FLOAT"}, {GPU_DATA_INT, "INT"}, - {GPU_DATA_UNSIGNED_INT, "UINT"}, - {GPU_DATA_UNSIGNED_BYTE, "UBYTE"}, - {GPU_DATA_UNSIGNED_INT_24_8, "UINT_24_8"}, + {GPU_DATA_UINT, "UINT"}, + {GPU_DATA_UBYTE, "UBYTE"}, + {GPU_DATA_UINT_24_8, "UINT_24_8"}, {GPU_DATA_10_11_11_REV, "10_11_11_REV"}, {0, NULL}, }; diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c index aef819aec39..c8eaa9cd5c8 100644 --- a/source/blender/python/gpu/gpu_py_buffer.c +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -57,11 +57,11 @@ static const char *pygpu_buffer_formatstr(eGPUDataFormat data_format) return "f"; case GPU_DATA_INT: return "i"; - case GPU_DATA_UNSIGNED_INT: + case GPU_DATA_UINT: return "I"; - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return "B"; - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: return "I"; default: @@ -114,10 +114,10 @@ static PyObject *pygpu_buffer__sq_item(BPyGPUBuffer *self, int i) return Py_BuildValue(formatstr, self->buf.as_float[i]); case GPU_DATA_INT: return Py_BuildValue(formatstr, self->buf.as_int[i]); - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return Py_BuildValue(formatstr, self->buf.as_byte[i]); - case GPU_DATA_UNSIGNED_INT: - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT: + case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: return Py_BuildValue(formatstr, self->buf.as_uint[i]); } @@ -433,10 +433,10 @@ static int pygpu_buffer__sq_ass_item(BPyGPUBuffer *self, int i, PyObject *v) return PyArg_Parse(v, "f:Expected floats", &self->buf.as_float[i]) ? 0 : -1; case GPU_DATA_INT: return PyArg_Parse(v, "i:Expected ints", &self->buf.as_int[i]) ? 0 : -1; - case GPU_DATA_UNSIGNED_BYTE: + case GPU_DATA_UBYTE: return PyArg_Parse(v, "b:Expected ints", &self->buf.as_byte[i]) ? 0 : -1; - case GPU_DATA_UNSIGNED_INT: - case GPU_DATA_UNSIGNED_INT_24_8: + case GPU_DATA_UINT: + case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: return PyArg_Parse(v, "b:Expected ints", &self->buf.as_uint[i]) ? 0 : -1; default: diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c index 97dc99f5d58..2b1b5f672b0 100644 --- a/source/blender/python/gpu/gpu_py_texture.c +++ b/source/blender/python/gpu/gpu_py_texture.c @@ -314,7 +314,7 @@ static PyObject *pygpu_texture_clear(BPyGPUTexture *self, PyObject *args, PyObje } if (shape != 1 && - ELEM(pygpu_dataformat.value_found, GPU_DATA_UNSIGNED_INT_24_8, GPU_DATA_10_11_11_REV)) { + ELEM(pygpu_dataformat.value_found, GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV)) { PyErr_SetString(PyExc_AttributeError, "`UINT_24_8` and `10_11_11_REV` only support single values"); return NULL; @@ -330,7 +330,7 @@ static PyObject *pygpu_texture_clear(BPyGPUTexture *self, PyObject *args, PyObje return NULL; } - if (pygpu_dataformat.value_found == GPU_DATA_UNSIGNED_BYTE) { + if (pygpu_dataformat.value_found == GPU_DATA_UBYTE) { /* Convert to byte. */ values.c[0] = values.i[0]; values.c[1] = values.i[1]; @@ -362,13 +362,13 @@ static PyObject *pygpu_texture_read(BPyGPUTexture *self) break; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: - best_data_format = GPU_DATA_UNSIGNED_INT_24_8; + best_data_format = GPU_DATA_UINT_24_8; break; case GPU_R8UI: case GPU_R16UI: case GPU_RG16UI: case GPU_R32UI: - best_data_format = GPU_DATA_UNSIGNED_INT; + best_data_format = GPU_DATA_UINT; break; case GPU_RG16I: case GPU_R16I: @@ -379,7 +379,7 @@ static PyObject *pygpu_texture_read(BPyGPUTexture *self) case GPU_RGBA8: case GPU_RGBA8UI: case GPU_SRGB8_A8: - best_data_format = GPU_DATA_UNSIGNED_BYTE; + best_data_format = GPU_DATA_UBYTE; break; case GPU_R11F_G11F_B10F: best_data_format = GPU_DATA_10_11_11_REV; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 6433cd7d12d..7dc6b0a1eb8 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -2026,7 +2026,7 @@ uint *WM_window_pixels_read(wmWindowManager *wm, wmWindow *win, int r_size[2]) const uint rect_len = r_size[0] * r_size[1]; uint *rect = MEM_mallocN(sizeof(*rect) * rect_len, __func__); - GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UNSIGNED_BYTE, rect); + GPU_frontbuffer_read_pixels(0, 0, r_size[0], r_size[1], 4, GPU_DATA_UBYTE, rect); if (setup_context) { if (wm->windrawable) { From cc45dfa07fdb99a96506012c4e13bcda12347366 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 16:20:14 +0100 Subject: [PATCH 257/519] Cleanup: Remove definition in header without implementation. --- source/blender/compositor/intern/COM_WorkScheduler.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 2424d1bdb72..1911100ab94 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -32,11 +32,6 @@ class WorkScheduler { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE - /** - * \brief are we being stopped. - */ - static bool isStopping(); - /** * \brief main thread loop for cpudevices * inside this loop new work is queried and being executed From b452438d0a035b476f912d1962d0403af75e0021 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 16:23:21 +0100 Subject: [PATCH 258/519] Cleanup: Use snake case for method names. --- source/blender/compositor/intern/COM_ExecutionSystem.cpp | 2 +- source/blender/compositor/intern/COM_WorkScheduler.cpp | 2 +- source/blender/compositor/intern/COM_WorkScheduler.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp index 34682aae2fd..4c0c7d2103e 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -59,7 +59,7 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, this->m_context.setQuality((CompositorQuality)editingtree->edit_quality); } this->m_context.setRendering(rendering); - this->m_context.setHasActiveOpenCLDevices(WorkScheduler::hasGPUDevices() && + this->m_context.setHasActiveOpenCLDevices(WorkScheduler::has_gpu_devices() && (editingtree->flag & NTREE_COM_OPENCL)); this->m_context.setRenderData(rd); diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index f726caa3d66..fd2a21a3b2b 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -178,7 +178,7 @@ void WorkScheduler::stop() #endif } -bool WorkScheduler::hasGPUDevices() +bool WorkScheduler::has_gpu_devices() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 1911100ab94..09cf0df8827 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -102,7 +102,7 @@ class WorkScheduler { * A node can generate a different operation tree when OpenCLDevices exists. * \see CompositorContext.getHasActiveOpenCLDevices */ - static bool hasGPUDevices(); + static bool has_gpu_devices(); static int current_thread_id(); From 3a4b7e2bc654e98f02af131e2100e9b9b8bc90a4 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 16:26:08 +0100 Subject: [PATCH 259/519] Cleanup: Use struct for WorkScheduler. --- source/blender/compositor/intern/COM_WorkScheduler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 09cf0df8827..ebddaa01ce1 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -29,7 +29,7 @@ /** \brief the workscheduler * \ingroup execution */ -class WorkScheduler { +struct WorkScheduler { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /** From 0da10b279a312ecc32391bb5f3abe78ad2fd44c7 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 17 Feb 2021 16:36:47 +0100 Subject: [PATCH 260/519] Cleanup: Use static struct for work scheduler. --- .../compositor/intern/COM_WorkScheduler.cpp | 199 ++++++++++-------- 1 file changed, 111 insertions(+), 88 deletions(-) diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index fd2a21a3b2b..9ca704afdea 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -44,38 +44,42 @@ # error COM_CURRENT_THREADING_MODEL No threading model selected #endif -/** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created */ -static vector g_cpudevices; static ThreadLocal(CPUDevice *) g_thread_device; +static struct { + /** \brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created + */ + vector cpu_devices; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE -/** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */ -static ListBase g_cputhreads; -static bool g_cpuInitialized = false; -/** \brief all scheduled work for the cpu */ -static ThreadQueue *g_cpuqueue; -static ThreadQueue *g_gpuqueue; + /** \brief list of all thread for every CPUDevice in cpudevices a thread exists. */ + ListBase cpu_threads; + bool cpu_initialized = false; + /** \brief all scheduled work for the cpu */ + ThreadQueue *cpu_queue; + ThreadQueue *gpu_queue; # ifdef COM_OPENCL_ENABLED -static cl_context g_context; -static cl_program g_program; -/** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is - * created. */ -static vector g_gpudevices; -/** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */ -static ListBase g_gputhreads; -/** \brief all scheduled work for the GPU. */ -static bool g_openclActive = false; -static bool g_openclInitialized = false; + cl_context opencl_context; + cl_program opencl_program; + /** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is + * created. */ + vector gpu_devices; + /** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */ + ListBase gpu_threads; + /** \brief all scheduled work for the GPU. */ + bool opencl_active = false; + bool opencl_initialized = false; # endif #endif +} g_work_scheduler; + #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE void *WorkScheduler::thread_execute_cpu(void *data) { CPUDevice *device = (CPUDevice *)data; WorkPackage *work; BLI_thread_local_set(g_thread_device, device); - while ((work = (WorkPackage *)BLI_thread_queue_pop(g_cpuqueue))) { + while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.cpu_queue))) { device->execute(work); delete work; } @@ -88,7 +92,7 @@ void *WorkScheduler::thread_execute_gpu(void *data) Device *device = (Device *)data; WorkPackage *work; - while ((work = (WorkPackage *)BLI_thread_queue_pop(g_gpuqueue))) { + while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.gpu_queue))) { device->execute(work); delete work; } @@ -106,14 +110,14 @@ void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) delete package; #elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - if (group->isOpenCL() && g_openclActive) { - BLI_thread_queue_push(g_gpuqueue, package); + if (group->isOpenCL() && g_work_scheduler.opencl_active) { + BLI_thread_queue_push(g_work_scheduler.gpu_queue, package); } else { - BLI_thread_queue_push(g_cpuqueue, package); + BLI_thread_queue_push(g_work_scheduler.cpu_queue, package); } # else - BLI_thread_queue_push(g_cpuqueue, package); + BLI_thread_queue_push(g_work_scheduler.cpu_queue, package); # endif #endif } @@ -122,24 +126,26 @@ void WorkScheduler::start(CompositorContext &context) { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE unsigned int index; - g_cpuqueue = BLI_thread_queue_init(); - BLI_threadpool_init(&g_cputhreads, thread_execute_cpu, g_cpudevices.size()); - for (index = 0; index < g_cpudevices.size(); index++) { - Device *device = g_cpudevices[index]; - BLI_threadpool_insert(&g_cputhreads, device); + g_work_scheduler.cpu_queue = BLI_thread_queue_init(); + BLI_threadpool_init( + &g_work_scheduler.cpu_threads, thread_execute_cpu, g_work_scheduler.cpu_devices.size()); + for (index = 0; index < g_work_scheduler.cpu_devices.size(); index++) { + Device *device = g_work_scheduler.cpu_devices[index]; + BLI_threadpool_insert(&g_work_scheduler.cpu_threads, device); } # ifdef COM_OPENCL_ENABLED if (context.getHasActiveOpenCLDevices()) { - g_gpuqueue = BLI_thread_queue_init(); - BLI_threadpool_init(&g_gputhreads, thread_execute_gpu, g_gpudevices.size()); - for (index = 0; index < g_gpudevices.size(); index++) { - Device *device = g_gpudevices[index]; - BLI_threadpool_insert(&g_gputhreads, device); + g_work_scheduler.gpu_queue = BLI_thread_queue_init(); + BLI_threadpool_init( + &g_work_scheduler.gpu_threads, thread_execute_gpu, g_work_scheduler.gpu_devices.size()); + for (index = 0; index < g_work_scheduler.gpu_devices.size(); index++) { + Device *device = g_work_scheduler.gpu_devices[index]; + BLI_threadpool_insert(&g_work_scheduler.gpu_threads, device); } - g_openclActive = true; + g_work_scheduler.opencl_active = true; } else { - g_openclActive = false; + g_work_scheduler.opencl_active = false; } # endif #endif @@ -148,12 +154,12 @@ void WorkScheduler::finish() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - if (g_openclActive) { - BLI_thread_queue_wait_finish(g_gpuqueue); - BLI_thread_queue_wait_finish(g_cpuqueue); + if (g_work_scheduler.opencl_active) { + BLI_thread_queue_wait_finish(g_work_scheduler.gpu_queue); + BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue); } else { - BLI_thread_queue_wait_finish(g_cpuqueue); + BLI_thread_queue_wait_finish(g_work_scheduler.cpu_queue); } # else BLI_thread_queue_wait_finish(cpuqueue); @@ -163,16 +169,16 @@ void WorkScheduler::finish() void WorkScheduler::stop() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE - BLI_thread_queue_nowait(g_cpuqueue); - BLI_threadpool_end(&g_cputhreads); - BLI_thread_queue_free(g_cpuqueue); - g_cpuqueue = nullptr; + BLI_thread_queue_nowait(g_work_scheduler.cpu_queue); + BLI_threadpool_end(&g_work_scheduler.cpu_threads); + BLI_thread_queue_free(g_work_scheduler.cpu_queue); + g_work_scheduler.cpu_queue = nullptr; # ifdef COM_OPENCL_ENABLED - if (g_openclActive) { - BLI_thread_queue_nowait(g_gpuqueue); - BLI_threadpool_end(&g_gputhreads); - BLI_thread_queue_free(g_gpuqueue); - g_gpuqueue = nullptr; + if (g_work_scheduler.opencl_active) { + BLI_thread_queue_nowait(g_work_scheduler.gpu_queue); + BLI_threadpool_end(&g_work_scheduler.gpu_threads); + BLI_thread_queue_free(g_work_scheduler.gpu_queue); + g_work_scheduler.gpu_queue = nullptr; } # endif #endif @@ -182,7 +188,7 @@ bool WorkScheduler::has_gpu_devices() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE # ifdef COM_OPENCL_ENABLED - return !g_gpudevices.empty(); + return !g_work_scheduler.gpu_devices.empty(); # else return 0; # endif @@ -205,37 +211,37 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /* deinitialize if number of threads doesn't match */ - if (g_cpudevices.size() != num_cpu_threads) { + if (g_work_scheduler.cpu_devices.size() != num_cpu_threads) { Device *device; - while (!g_cpudevices.empty()) { - device = g_cpudevices.back(); - g_cpudevices.pop_back(); + while (!g_work_scheduler.cpu_devices.empty()) { + device = g_work_scheduler.cpu_devices.back(); + g_work_scheduler.cpu_devices.pop_back(); device->deinitialize(); delete device; } - if (g_cpuInitialized) { + if (g_work_scheduler.cpu_initialized) { BLI_thread_local_delete(g_thread_device); } - g_cpuInitialized = false; + g_work_scheduler.cpu_initialized = false; } /* initialize CPU threads */ - if (!g_cpuInitialized) { + if (!g_work_scheduler.cpu_initialized) { for (int index = 0; index < num_cpu_threads; index++) { CPUDevice *device = new CPUDevice(index); device->initialize(); - g_cpudevices.push_back(device); + g_work_scheduler.cpu_devices.push_back(device); } BLI_thread_local_create(g_thread_device); - g_cpuInitialized = true; + g_work_scheduler.cpu_initialized = true; } # ifdef COM_OPENCL_ENABLED /* deinitialize OpenCL GPU's */ - if (use_opencl && !g_openclInitialized) { - g_context = nullptr; - g_program = nullptr; + if (use_opencl && !g_work_scheduler.opencl_initialized) { + g_work_scheduler.opencl_context = nullptr; + g_work_scheduler.opencl_program = nullptr; /* This will check for errors and skip if already initialized. */ if (clewInit() != CLEW_SUCCESS) { @@ -270,26 +276,40 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) sizeof(cl_device_id) * numberOfDevices, __func__); clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numberOfDevices, cldevices, nullptr); - g_context = clCreateContext( + g_work_scheduler.opencl_context = clCreateContext( nullptr, numberOfDevices, cldevices, clContextError, nullptr, &error); if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } const char *cl_str[2] = {datatoc_COM_OpenCLKernels_cl, nullptr}; - g_program = clCreateProgramWithSource(g_context, 1, cl_str, nullptr, &error); - error = clBuildProgram(g_program, numberOfDevices, cldevices, nullptr, nullptr, nullptr); + g_work_scheduler.opencl_program = clCreateProgramWithSource( + g_work_scheduler.opencl_context, 1, cl_str, nullptr, &error); + error = clBuildProgram(g_work_scheduler.opencl_program, + numberOfDevices, + cldevices, + nullptr, + nullptr, + nullptr); if (error != CL_SUCCESS) { cl_int error2; size_t ret_val_size = 0; printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); - error2 = clGetProgramBuildInfo( - g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &ret_val_size); + error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program, + cldevices[0], + CL_PROGRAM_BUILD_LOG, + 0, + nullptr, + &ret_val_size); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } char *build_log = (char *)MEM_mallocN(sizeof(char) * ret_val_size + 1, __func__); - error2 = clGetProgramBuildInfo( - g_program, cldevices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, nullptr); + error2 = clGetProgramBuildInfo(g_work_scheduler.opencl_program, + cldevices[0], + CL_PROGRAM_BUILD_LOG, + ret_val_size, + build_log, + nullptr); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } @@ -307,9 +327,12 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error2, clewErrorString(error2)); } - OpenCLDevice *clDevice = new OpenCLDevice(g_context, device, g_program, vendorID); + OpenCLDevice *clDevice = new OpenCLDevice(g_work_scheduler.opencl_context, + device, + g_work_scheduler.opencl_program, + vendorID); clDevice->initialize(); - g_gpudevices.push_back(clDevice); + g_work_scheduler.gpu_devices.push_back(clDevice); } } MEM_freeN(cldevices); @@ -317,7 +340,7 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) MEM_freeN(platforms); } - g_openclInitialized = true; + g_work_scheduler.opencl_initialized = true; } # endif #endif @@ -327,38 +350,38 @@ void WorkScheduler::deinitialize() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /* deinitialize CPU threads */ - if (g_cpuInitialized) { + if (g_work_scheduler.cpu_initialized) { Device *device; - while (!g_cpudevices.empty()) { - device = g_cpudevices.back(); - g_cpudevices.pop_back(); + while (!g_work_scheduler.cpu_devices.empty()) { + device = g_work_scheduler.cpu_devices.back(); + g_work_scheduler.cpu_devices.pop_back(); device->deinitialize(); delete device; } BLI_thread_local_delete(g_thread_device); - g_cpuInitialized = false; + g_work_scheduler.cpu_initialized = false; } # ifdef COM_OPENCL_ENABLED /* deinitialize OpenCL GPU's */ - if (g_openclInitialized) { + if (g_work_scheduler.opencl_initialized) { Device *device; - while (!g_gpudevices.empty()) { - device = g_gpudevices.back(); - g_gpudevices.pop_back(); + while (!g_work_scheduler.gpu_devices.empty()) { + device = g_work_scheduler.gpu_devices.back(); + g_work_scheduler.gpu_devices.pop_back(); device->deinitialize(); delete device; } - if (g_program) { - clReleaseProgram(g_program); - g_program = nullptr; + if (g_work_scheduler.opencl_program) { + clReleaseProgram(g_work_scheduler.opencl_program); + g_work_scheduler.opencl_program = nullptr; } - if (g_context) { - clReleaseContext(g_context); - g_context = nullptr; + if (g_work_scheduler.opencl_context) { + clReleaseContext(g_work_scheduler.opencl_context); + g_work_scheduler.opencl_context = nullptr; } - g_openclInitialized = false; + g_work_scheduler.opencl_initialized = false; } # endif #endif From a7750f95b9f1073d35664c95fda031d0be679bdc Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 17 Feb 2021 13:22:54 -0300 Subject: [PATCH 261/519] GPU Python: Rename 'uniform_buffer' to 'uniform_block' From the the opengl wiki: > Buffer objects are associated with a program's uniform block similarly to the way that texture objects are associated with sampler uniforms. --- source/blender/python/gpu/gpu_py_shader.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index 538bed7df6d..2f9b67bdb6a 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -494,8 +494,8 @@ static PyObject *pygpu_shader_uniform_sampler(BPyGPUShader *self, PyObject *args } PyDoc_STRVAR( - pygpu_shader_uniform_buffer_doc, - ".. method:: uniform_buffer(name, ubo)\n" + pygpu_shader_uniform_block_doc, + ".. method:: uniform_block(name, ubo)\n" "\n" " Specify the value of an uniform buffer object variable for the current GPUShader.\n" "\n" @@ -503,12 +503,12 @@ PyDoc_STRVAR( " :type name: str\n" " :param ubo: Uniform Buffer to attach.\n" " :type texture: :class:`gpu.types.GPUUniformBuf`\n"); -static PyObject *pygpu_shader_uniform_buffer(BPyGPUShader *self, PyObject *args) +static PyObject *pygpu_shader_uniform_block(BPyGPUShader *self, PyObject *args) { const char *name; BPyGPUUniformBuf *py_ubo; if (!PyArg_ParseTuple( - args, "sO!:GPUShader.uniform_buffer", &name, &BPyGPUUniformBuf_Type, &py_ubo)) { + args, "sO!:GPUShader.uniform_block", &name, &BPyGPUUniformBuf_Type, &py_ubo)) { return NULL; } @@ -601,10 +601,10 @@ static struct PyMethodDef pygpu_shader__tp_methods[] = { (PyCFunction)pygpu_shader_uniform_sampler, METH_VARARGS, pygpu_shader_uniform_sampler_doc}, - {"uniform_buffer", - (PyCFunction)pygpu_shader_uniform_buffer, + {"uniform_block", + (PyCFunction)pygpu_shader_uniform_block, METH_VARARGS, - pygpu_shader_uniform_buffer_doc}, + pygpu_shader_uniform_block_doc}, {"attr_from_name", (PyCFunction)pygpu_shader_attr_from_name, METH_O, From 4d28a1d75fded6176b495b72d843487c35a6890d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 17 Feb 2021 17:57:14 +0100 Subject: [PATCH 262/519] Fix OpenColorIO 2.0 GPU shader error in uniform assignment And fix a (harmless) compiler warning. --- intern/opencolorio/ocio_impl_glsl.cc | 2 +- source/blender/imbuf/intern/colormanagement.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index 841f1386af1..590d7c07002 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -252,7 +252,7 @@ static bool createGPUShader(OCIO_GPUShader &shader, /* Set uniforms. */ for (OCIO_GPUUniform &uniform : textures.uniforms) { const GpuShaderDesc::UniformData &data = uniform.data; - const char *name = name; + const char *name = uniform.name.c_str(); if (data.m_getDouble) { GPU_shader_uniform_1f(sh, name, (float)data.m_getDouble()); diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 8f8c12aa3b4..fc0b99a82fa 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -115,7 +115,7 @@ static struct global_gpu_state { bool use_curve_mapping; int curve_mapping_timestamp; OCIO_CurveMappingSettings curve_mapping_settings; -} global_gpu_state = {NULL}; +} global_gpu_state = {false}; static struct global_color_picking_state { /* Cached processor for color picking conversion. */ From 8095aad47e2c0f2ae67be67b362964ba1c892369 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 17 Feb 2021 10:21:00 -0700 Subject: [PATCH 263/519] Cycles: Fix build error on windows Function __bsf was in util/util_simd.h twice problem located by @EAW on chat. --- intern/cycles/util/util_simd.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index c51c3c957e0..d327b7298dc 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -224,17 +224,6 @@ __forceinline uint32_t __bsf(uint32_t v) # endif } -__forceinline uint32_t __bsf(uint32_t v) -{ -# if defined(__KERNEL_AVX2__) - return _tzcnt_u32(v); -# else - unsigned long r = 0; - _BitScanForward(&r, v); - return r; -# endif -} - __forceinline uint32_t __bsr(uint32_t v) { unsigned long r = 0; From 3bb58e2a7ca2af1db550359cddbcbb9f85c27ec9 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 17 Feb 2021 18:55:20 +0100 Subject: [PATCH 264/519] Blender 2.92 bcon4 - change release cycle to release candidate This is still a rolling release candidate with new builds every day as a preparation to the final release. --- source/blender/blenkernel/BKE_blender_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 83bec62c41e..a904bb439df 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -35,7 +35,7 @@ extern "C" { /* Blender patch version for bugfix releases. */ #define BLENDER_VERSION_PATCH 0 /** Blender release cycle stage: alpha/beta/rc/release. */ -#define BLENDER_VERSION_CYCLE beta +#define BLENDER_VERSION_CYCLE rc /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION From f29a1d87e8ba2ac06ba648ee0721e7029610aaa3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 12:21:31 -0600 Subject: [PATCH 265/519] Fix: Attribute randomize node broken for integer attributes The integer mode still needs a random value in a 0 to 1 range, just like floats. So slightly refactor to let the integer randomization use the float implementation and then round to an int afterwards. --- .../nodes/node_geo_attribute_randomize.cc | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc index d7b85953a44..bb5b5073c32 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc @@ -82,30 +82,39 @@ static void geo_node_attribute_randomize_update(bNodeTree *UNUSED(ntree), bNode namespace blender::nodes { -template T get_random_value(const uint32_t id, const uint32_t seed); +template +T random_value_in_range(const uint32_t id, const uint32_t seed, const T min, const T max); -template<> inline bool get_random_value(const uint32_t id, const uint32_t seed) +template<> +inline float random_value_in_range(const uint32_t id, + const uint32_t seed, + const float min, + const float max) { - return BLI_hash_int_2d_to_float(id, seed) > 0.5f; + return BLI_hash_int_2d_to_float(id, seed) * (max - min) + min; } -template<> inline int get_random_value(const uint32_t id, const uint32_t seed) +template<> +inline int random_value_in_range(const uint32_t id, + const uint32_t seed, + const int min, + const int max) { - return BLI_hash_int_2d(id, seed); + return round_fl_to_int( + random_value_in_range(id, seed, static_cast(min), static_cast(max))); } -template<> inline float get_random_value(const uint32_t id, const uint32_t seed) -{ - return BLI_hash_int_2d_to_float(id, seed); -} - -template<> inline float3 get_random_value(const uint32_t id, const uint32_t seed) +template<> +inline float3 random_value_in_range(const uint32_t id, + const uint32_t seed, + const float3 min, + const float3 max) { const float x = BLI_hash_int_3d_to_float(seed, id, 435109); const float y = BLI_hash_int_3d_to_float(seed, id, 380867); const float z = BLI_hash_int_3d_to_float(seed, id, 1059217); - return float3(x, y, z); + return float3(x, y, z) * (max - min) + min; } template @@ -120,25 +129,25 @@ static void randomize_attribute(MutableSpan span, switch (operation) { case GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE: for (const int i : span.index_range()) { - const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + const T random_value = random_value_in_range(ids[i], seed, min, max); span[i] = random_value; } break; case GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD: for (const int i : span.index_range()) { - const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + const T random_value = random_value_in_range(ids[i], seed, min, max); span[i] = span[i] + random_value; } break; case GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT: for (const int i : span.index_range()) { - const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + const T random_value = random_value_in_range(ids[i], seed, min, max); span[i] = span[i] - random_value; } break; case GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY: for (const int i : span.index_range()) { - const T random_value = get_random_value(ids[i], seed) * (max - min) + min; + const T random_value = random_value_in_range(ids[i], seed, min, max); span[i] = span[i] * random_value; } break; @@ -156,7 +165,7 @@ static void randomize_attribute_bool(MutableSpan span, BLI_assert(operation == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE); UNUSED_VARS_NDEBUG(operation); for (const int i : span.index_range()) { - const bool random_value = get_random_value(ids[i], seed); + const bool random_value = BLI_hash_int_2d_to_float(ids[i], seed) > 0.5f; span[i] = random_value; } } From af824b09c7b3eb4c70dccf116ee0e3790466a352 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 17 Feb 2021 12:23:01 -0700 Subject: [PATCH 266/519] MSVC: Suppress C4251 in OpenVDB/Mantaflow All headers in the svn libraries should be building with /W0 however MSVC 16.8/16.9 has broken this functionality making OpenVDB emit lots of warnings. The breakage was reported [1] in august to MS but they still have not gotten around to addressing the issue. This change explicitly suppresses C4251 in the module that emitted these warnings. As the warning is useful in other parts of blender a localized approach is taken rather than a global suppression. [1] https://developercommunity.visualstudio.com/content/problem/1167590/bug.html --- extern/mantaflow/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extern/mantaflow/CMakeLists.txt b/extern/mantaflow/CMakeLists.txt index c1fa13420b8..3220a45bef4 100644 --- a/extern/mantaflow/CMakeLists.txt +++ b/extern/mantaflow/CMakeLists.txt @@ -133,6 +133,14 @@ if(WITH_OPENVDB) list(APPEND LIB ${OPENVDB_LIBRARIES} ) + if(WIN32) + # OpenVDB emits lots of these, they should be suppressed through other + # means but MSVC 16.8/16.9 has broken this functionality, so C4251 is + # suppressed here explicitly. See + # https://developercommunity.visualstudio.com/content/problem/1167590/bug.html + # for details. + string(APPEND CMAKE_CXX_FLAGS " /wd4251") + endif() endif() set(SRC From eeeb85baf8ab203e913513bffe1831eb05e129c5 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 13:34:49 -0600 Subject: [PATCH 267/519] Cleanup: Comment formatting in node_draw.cc --- .../blender/editors/space_node/node_draw.cc | 269 +++++++++--------- 1 file changed, 129 insertions(+), 140 deletions(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index aaceadcc011..9e96af5e03d 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -127,11 +127,8 @@ void ED_node_tag_update_id(ID *id) return; } - /* TODO(sergey): With the new dependency graph it - * should be just enough to only tag ntree itself, - * all the users of this tree will have update - * flushed from the tree, - */ + /* TODO(sergey): With the new dependency graph it should be just enough to only tag ntree itself. + * All the users of this tree will have update flushed from the tree. */ DEG_id_tag_update(&ntree->id, 0); if (ntree->type == NTREE_SHADER) { @@ -158,7 +155,7 @@ void ED_node_tag_update_id(ID *id) WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, id); } else if (id == &ntree->id) { - /* node groups */ + /* Node groups. */ DEG_id_tag_update(id, 0); } } @@ -176,10 +173,10 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node) } } - /* look through all datablocks, to support groups */ + /* Look through all datablocks to support groups. */ if (do_tag_update) { FOREACH_NODETREE_BEGIN (bmain, tntree, id) { - /* check if nodetree uses the group */ + /* Check if nodetree uses the group. */ if (ntreeHasTree(tntree, ntree)) { ED_node_tag_update_id(id); } @@ -195,20 +192,19 @@ void ED_node_tag_update_nodetree(Main *bmain, bNodeTree *ntree, bNode *node) static bool compare_nodes(const bNode *a, const bNode *b) { /* These tell if either the node or any of the parent nodes is selected. - * A selected parent means an unselected node is also in foreground! - */ + * A selected parent means an unselected node is also in foreground! */ bool a_select = (a->flag & NODE_SELECT) != 0, b_select = (b->flag & NODE_SELECT) != 0; bool a_active = (a->flag & NODE_ACTIVE) != 0, b_active = (b->flag & NODE_ACTIVE) != 0; - /* if one is an ancestor of the other */ + /* If one is an ancestor of the other. */ /* XXX there might be a better sorting algorithm for stable topological sort, - * this is O(n^2) worst case */ + * this is O(n^2) worst case. */ for (bNode *parent = a->parent; parent; parent = parent->parent) { - /* if b is an ancestor, it is always behind a */ + /* If B is an ancestor, it is always behind A. */ if (parent == b) { return true; } - /* any selected ancestor moves the node forward */ + /* Any selected ancestor moves the node forward. */ if (parent->flag & NODE_ACTIVE) { a_active = true; } @@ -217,11 +213,11 @@ static bool compare_nodes(const bNode *a, const bNode *b) } } for (bNode *parent = b->parent; parent; parent = parent->parent) { - /* if a is an ancestor, it is always behind b */ + /* If A is an ancestor, it is always behind B. */ if (parent == a) { return false; } - /* any selected ancestor moves the node forward */ + /* Any selected ancestor moves the node forward. */ if (parent->flag & NODE_ACTIVE) { b_active = true; } @@ -230,7 +226,7 @@ static bool compare_nodes(const bNode *a, const bNode *b) } } - /* if one of the nodes is in the background and the other not */ + /* One of the nodes is in the background and the other not. */ if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND)) { return false; } @@ -238,7 +234,7 @@ static bool compare_nodes(const bNode *a, const bNode *b) return true; } - /* if one has a higher selection state (active > selected > nothing) */ + /* One has a higher selection state (active > selected > nothing). */ if (!b_active && a_active) { return true; } @@ -249,12 +245,13 @@ static bool compare_nodes(const bNode *a, const bNode *b) return false; } -/* Sorts nodes by selection: unselected nodes first, then selected, - * then the active node at the very end. Relative order is kept intact! +/** + * Sort nodes by selection: unselected nodes first, then selected, + * then the active node at the very end. Relative order is kept intact. */ void ED_node_sort(bNodeTree *ntree) { - /* merge sort is the algorithm of choice here */ + /* Merge sort is the algorithm of choice here. */ int totnodes = BLI_listbase_count(&ntree->nodes); int k = 1; @@ -263,16 +260,16 @@ void ED_node_sort(bNodeTree *ntree) bNode *first_b = first_a; do { - /* setup first_b pointer */ + /* Set up first_b pointer. */ for (int b = 0; b < k && first_b; b++) { first_b = first_b->next; } - /* all batches merged? */ + /* All batches merged? */ if (first_b == nullptr) { break; } - /* merge batches */ + /* Merge batches. */ bNode *node_a = first_a; bNode *node_b = first_b; int a = 0; @@ -291,10 +288,10 @@ void ED_node_sort(bNodeTree *ntree) } } - /* setup first pointers for next batch */ + /* Set up first pointers for next batch. */ first_b = node_b; for (; b < k; b++) { - /* all nodes sorted? */ + /* All nodes sorted? */ if (first_b == nullptr) { break; } @@ -319,7 +316,7 @@ static void do_node_internal_buttons(bContext *C, void *UNUSED(node_v), int even static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) { - /* add node uiBlocks in drawing order - prevents events going to overlapping nodes */ + /* Add node uiBlocks in drawing order - prevents events going to overlapping nodes. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { /* ui block */ @@ -357,26 +354,28 @@ void node_from_view(const bNode *node, float x, float y, float *rx, float *ry) nodeFromView(node, x, y, rx, ry); } -/* based on settings in node, sets drawing rect info. each redraw! */ +/** + * Based on settings and sockets in node, set drawing rect info. + */ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) { PointerRNA nodeptr; RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr); - /* get "global" coords */ + /* Get "global" coordinates. */ float locx, locy; node_to_view(node, 0.0f, 0.0f, &locx, &locy); float dy = locy; - /* header */ + /* Header. */ dy -= NODE_DY; - /* little bit space in top */ + /* Little bit of space in top. */ if (node->outputs.first) { dy -= NODE_DYS / 2; } - /* output sockets */ + /* Output sockets. */ bool add_output_space = false; int buty; @@ -402,11 +401,11 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) uiLayoutSetActive(layout, false); } - /* context pointers for current node and socket */ + /* Context pointers for current node and socket. */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); - /* align output buttons to the right */ + /* Align output buttons to the right. */ uiLayout *row = uiLayoutRow(layout, true); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT); const char *socket_label = nodeSocketLabel(nsock); @@ -415,11 +414,11 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) UI_block_align_end(node->block); UI_block_layout_resolve(node->block, nullptr, &buty); - /* ensure minimum socket height in case layout is empty */ + /* Ensure minimum socket height in case layout is empty. */ buty = min_ii(buty, dy - NODE_DY); nsock->locx = locx + NODE_WIDTH(node); - /* place the socket circle in the middle of the layout */ + /* Place the socket circle in the middle of the layout. */ nsock->locy = 0.5f * (dy + buty); dy = buty; @@ -452,8 +451,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY); } else { - /* width correction of image */ - /* XXX huh? (ton) */ + /* Width correction of image. XXX huh? (ton) */ float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect; node->prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY); @@ -464,7 +462,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) dy = node->prvr.ymin - NODE_DYS / 2; - /* make sure that maximums are bigger or equal to minimums */ + /* Make sure that maximums are bigger or equal to minimums. */ if (node->prvr.xmax < node->prvr.xmin) { SWAP(float, node->prvr.xmax, node->prvr.xmin); } @@ -473,7 +471,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) } } - /* buttons rect? */ + /* Buttons rect? */ if (node->typeinfo->draw_buttons && (node->flag & NODE_OPTIONS)) { dy -= NODE_DYS / 2; @@ -507,7 +505,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) dy = buty - NODE_DYS / 2; } - /* input sockets */ + /* Input sockets. */ LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { if (nodeSocketIsHidden(nsock)) { continue; @@ -540,7 +538,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) uiLayoutSetActive(layout, false); } - /* context pointers for current node and socket */ + /* Context pointers for current node and socket. */ uiLayoutSetContextPointer(layout, "node", &nodeptr); uiLayoutSetContextPointer(layout, "socket", &sockptr); @@ -552,11 +550,11 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) UI_block_align_end(node->block); UI_block_layout_resolve(node->block, nullptr, &buty); - /* ensure minimum socket height in case layout is empty */ + /* Ensure minimum socket height in case layout is empty. */ buty = min_ii(buty, dy - NODE_DY); nsock->locx = locx; - /* place the socket circle in the middle of the layout */ + /* Place the socket circle in the middle of the layout. */ nsock->locy = 0.5f * (dy + buty); dy = buty - multi_input_socket_offset * 0.5; @@ -565,7 +563,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) } } - /* little bit space in end */ + /* Little bit of space in end. */ if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0) { dy -= NODE_DYS / 2; } @@ -576,8 +574,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->totr.ymin = min_ff(dy, locy - 2 * NODE_DY); /* Set the block bounds to clip mouse events from underlying nodes. - * Add a margin for sockets on each side. - */ + * Add a margin for sockets on each side. */ UI_block_bounds_set_explicit(node->block, node->totr.xmin - NODE_SOCKSIZE, node->totr.ymin, @@ -585,16 +582,18 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) node->totr.ymax); } -/* based on settings in node, sets drawing rect info. each redraw! */ +/** + * Based on settings in node, sets drawing rect info. + */ static void node_update_hidden(bNode *node) { int totin = 0, totout = 0; - /* get "global" coords */ + /* Get "global" coords. */ float locx, locy; node_to_view(node, 0.0f, 0.0f, &locx, &locy); - /* calculate minimal radius */ + /* Calculate minimal radius. */ LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { if (!nodeSocketIsHidden(nsock)) { totin++; @@ -617,7 +616,7 @@ static void node_update_hidden(bNode *node) node->totr.ymax = locy + (hiddenrad - 0.5f * NODE_DY); node->totr.ymin = node->totr.ymax - 2 * hiddenrad; - /* output sockets */ + /* Output sockets. */ float rad = (float)M_PI / (1.0f + (float)totout); float drad = rad; @@ -629,7 +628,7 @@ static void node_update_hidden(bNode *node) } } - /* input sockets */ + /* Input sockets. */ rad = drad = -(float)M_PI / (1.0f + (float)totin); LISTBASE_FOREACH (bNodeSocket *, nsock, &node->inputs) { @@ -641,8 +640,7 @@ static void node_update_hidden(bNode *node) } /* Set the block bounds to clip mouse events from underlying nodes. - * Add a margin for sockets on each side. - */ + * Add a margin for sockets on each side. */ UI_block_bounds_set_explicit(node->block, node->totr.xmin - NODE_SOCKSIZE, node->totr.ymin, @@ -712,9 +710,6 @@ int node_get_colorid(bNode *node) } } -/* note: in cmp_util.c is similar code, for node_compo_pass_on() - * the same goes for shader and texture nodes. */ -/* note: in node_edit.c is similar code, for untangle node */ static void node_draw_mute_line(const View2D *v2d, const SpaceNode *snode, const bNode *node) { GPU_blend(GPU_BLEND_ALPHA); @@ -726,7 +721,7 @@ static void node_draw_mute_line(const View2D *v2d, const SpaceNode *snode, const GPU_blend(GPU_BLEND_NONE); } -/* flags used in gpu_shader_keyframe_diamond_frag.glsl */ +/* Flags used in gpu_shader_keyframe_diamond_frag.glsl. */ #define MARKER_SHAPE_DIAMOND 0x1 #define MARKER_SHAPE_SQUARE 0xC #define MARKER_SHAPE_CIRCLE 0x2 @@ -746,7 +741,7 @@ static void node_socket_draw(const bNodeSocket *sock, { int flags; - /* sets shape flags */ + /* Set shape flags. */ switch (sock->display_shape) { case SOCK_DISPLAY_SHAPE_DIAMOND: case SOCK_DISPLAY_SHAPE_DIAMOND_DOT: @@ -889,7 +884,7 @@ void ED_node_socket_draw(bNodeSocket *sock, const rcti *rect, const float color[ immUniform1f("outline_scale", 0.7f); immUniform2f("ViewportSize", -1.0f, -1.0f); - /* Single point */ + /* Single point. */ immBegin(GPU_PRIM_POINTS, 1); node_socket_draw(sock, color, @@ -930,7 +925,7 @@ static void node_draw_preview_background(rctf *rect) immUnbindProgram(); } -/* not a callback */ +/* Not a callback. */ static void node_draw_preview(bNodePreview *preview, rctf *prv) { float xrect = BLI_rctf_size_x(prv); @@ -939,7 +934,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) float yscale = yrect / ((float)preview->ysize); float scale; - /* uniform scale and offset */ + /* Uniform scale and offset. */ rctf draw_rect = *prv; if (xscale < yscale) { float offset = 0.5f * (yrect - ((float)preview->ysize) * xscale); @@ -957,7 +952,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) node_draw_preview_background(&draw_rect); GPU_blend(GPU_BLEND_ALPHA); - /* premul graphics */ + /* Premul graphics. */ GPU_blend(GPU_BLEND_ALPHA); IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR); @@ -982,13 +977,13 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) immUnbindProgram(); } -/* common handle function for operator buttons that need to select the node first */ +/* Common handle function for operator buttons that need to select the node first. */ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_argv) { bNode *node = (bNode *)node_argv; const char *opname = (const char *)op_argv; - /* select & activate only the button's node */ + /* Select & activate only the button's node. */ node_select_single(C, node); WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, nullptr); @@ -1034,7 +1029,7 @@ void node_draw_sockets(const View2D *v2d, immUniform1f("outline_scale", 0.7f); immUniform2f("ViewportSize", -1.0f, -1.0f); - /* set handle size */ + /* Set handle size. */ float scale; UI_view2d_scale_get(v2d, &scale, nullptr); scale *= 2.25f * NODE_SOCKSIZE; @@ -1043,7 +1038,7 @@ void node_draw_sockets(const View2D *v2d, immBeginAtMost(GPU_PRIM_POINTS, total_input_len + total_output_len); } - /* socket inputs */ + /* Socket inputs. */ short selected_input_len = 0; LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (nodeSocketIsHidden(sock)) { @@ -1071,7 +1066,7 @@ void node_draw_sockets(const View2D *v2d, selected); } - /* socket outputs */ + /* Socket outputs. */ short selected_output_len = 0; if (draw_outputs) { LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { @@ -1101,16 +1096,16 @@ void node_draw_sockets(const View2D *v2d, immEnd(); } - /* go back and draw selected sockets */ + /* Go back and draw selected sockets. */ if (selected_input_len + selected_output_len > 0) { - /* outline for selected sockets */ + /* Outline for selected sockets. */ selected = true; immBegin(GPU_PRIM_POINTS, selected_input_len + selected_output_len); if (selected_input_len) { - /* socket inputs */ + /* Socket inputs. */ LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { if (nodeSocketIsHidden(sock)) { continue; @@ -1128,14 +1123,14 @@ void node_draw_sockets(const View2D *v2d, scale, selected); if (--selected_input_len == 0) { - break; /* stop as soon as last one is drawn */ + break; /* Stop as soon as last one is drawn. */ } } } } if (selected_output_len) { - /* socket outputs */ + /* Socket outputs. */ LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { if (nodeSocketIsHidden(sock)) { continue; @@ -1153,7 +1148,7 @@ void node_draw_sockets(const View2D *v2d, scale, selected); if (--selected_output_len == 0) { - break; /* stop as soon as last one is drawn */ + break; /* Stop as soon as last one is drawn. */ } } } @@ -1326,17 +1321,16 @@ static void node_draw_basis(const bContext *C, bNode *node, bNodeInstanceKey key) { - /* float socket_size = NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */ const float iconbutw = NODE_HEADER_ICON_SIZE; - /* skip if out of view */ + /* Skip if out of view. */ if (BLI_rctf_isect(&node->totr, &v2d->cur, nullptr) == false) { UI_block_end(C, node->block); node->block = nullptr; return; } - /* shadow */ + /* Shadow. */ node_draw_shadow(snode, node, BASIS_RAD, 1.0f); float color[4]; @@ -1367,10 +1361,10 @@ static void node_draw_basis(const bContext *C, UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); } - /* show/hide icons */ + /* Show/hide icons. */ float iconofs = rct->xmax - 0.35f * U.widget_unit; - /* preview */ + /* Preview. */ if (node->typeinfo->flag & NODE_PREVIEW) { iconofs -= iconbutw; UI_block_emboss_set(node->block, UI_EMBOSS_NONE); @@ -1391,13 +1385,12 @@ static void node_draw_basis(const bContext *C, UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_preview_toggle"); /* XXX this does not work when node is activated and the operator called right afterwards, * since active ID is not updated yet (needs to process the notifier). - * This can only work as visual indicator! - */ + * This can only work as visual indicator! */ // if (!(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT))) // UI_but_flag_enable(but, UI_BUT_DISABLED); UI_block_emboss_set(node->block, UI_EMBOSS); } - /* group edit */ + /* Group edit. */ if (node->type == NODE_GROUP) { iconofs -= iconbutw; UI_block_emboss_set(node->block, UI_EMBOSS_NONE); @@ -1440,7 +1433,7 @@ static void node_draw_basis(const bContext *C, node_add_error_message_button(C, *ntree, *node, *rct, iconofs); - /* title */ + /* Title. */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); } @@ -1448,10 +1441,10 @@ static void node_draw_basis(const bContext *C, UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - /* open/close entirely? */ + /* Open/close entirely. */ { int but_size = U.widget_unit * 0.8f; - /* XXX button uses a custom triangle draw below, so make it invisible without icon */ + /* XXX button uses a custom triangle draw below, so make it invisible without icon. */ UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefBut(node->block, UI_BTYPE_BUT_TOGGLE, @@ -1471,11 +1464,11 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); UI_GetThemeColor4fv(TH_TEXT, color); - /* custom draw function for this button */ + /* Custom draw function for this button. */ UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, rct->ymax - NODE_DY / 2.2f, 'v', color); } - char showname[128]; /* 128 used below */ + char showname[128]; nodeLabel(ntree, node, showname, sizeof(showname)); uiBut *but = uiDefBut(node->block, @@ -1496,9 +1489,9 @@ static void node_draw_basis(const bContext *C, UI_but_flag_enable(but, UI_BUT_INACTIVE); } - /* body */ + /* Body. */ if (nodeTypeUndefined(node)) { - /* use warning color to indicate undefined types */ + /* Use warning color to indicate undefined types. */ UI_GetThemeColor4fv(TH_REDALERT, color); } else if (node->flag & NODE_MUTED) { @@ -1527,7 +1520,7 @@ static void node_draw_basis(const bContext *C, UI_draw_roundbox_aa(&rect, true, BASIS_RAD, color); } - /* outline active and selected emphasis */ + /* Outline active and selected emphasis. */ if (node->flag & SELECT) { UI_GetThemeColorShadeAlpha4fv( (node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); @@ -1536,14 +1529,14 @@ static void node_draw_basis(const bContext *C, UI_draw_roundbox_aa(rct, false, BASIS_RAD, color); } - /* disable lines */ + /* Disable lines. */ if (node->flag & NODE_MUTED) { node_draw_mute_line(v2d, snode, node); } node_draw_sockets(v2d, C, ntree, node, true, false); - /* preview */ + /* Preview. */ bNodeInstanceHash *previews = (bNodeInstanceHash *)CTX_data_pointer_get(C, "node_previews").data; if (node->flag & NODE_PREVIEW && previews) { bNodePreview *preview = (bNodePreview *)BKE_node_instance_hash_lookup(previews, key); @@ -1573,10 +1566,10 @@ static void node_draw_hidden(const bContext *C, float scale; UI_view2d_scale_get(v2d, &scale, nullptr); - /* shadow */ + /* Shadow. */ node_draw_shadow(snode, node, hiddenrad, 1.0f); - /* body */ + /* Body. */ float color[4]; int color_id = node_get_colorid(node); if (node->flag & NODE_MUTED) { @@ -1590,7 +1583,7 @@ static void node_draw_hidden(const bContext *C, UI_draw_roundbox_aa(rct, true, hiddenrad, color); - /* outline active and selected emphasis */ + /* Outline active and selected emphasis. */ if (node->flag & SELECT) { UI_GetThemeColorShadeAlpha4fv( (node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color); @@ -1598,7 +1591,7 @@ static void node_draw_hidden(const bContext *C, UI_draw_roundbox_aa(rct, false, hiddenrad, color); } - /* custom color inline */ + /* Custom color inline. */ if (node->flag & NODE_CUSTOM_COLOR) { GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); @@ -1615,7 +1608,7 @@ static void node_draw_hidden(const bContext *C, GPU_blend(GPU_BLEND_NONE); } - /* title */ + /* Title. */ if (node->flag & SELECT) { UI_GetThemeColor4fv(TH_SELECT, color); } @@ -1623,7 +1616,7 @@ static void node_draw_hidden(const bContext *C, UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color); } - /* open entirely icon */ + /* Open / collapse icon. */ { int but_size = U.widget_unit * 0.8f; /* XXX button uses a custom triangle draw below, so make it invisible without icon */ @@ -1646,22 +1639,18 @@ static void node_draw_hidden(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS); UI_GetThemeColor4fv(TH_TEXT, color); - /* custom draw function for this button */ + /* Custom draw function for this button. */ UI_draw_icon_tri(rct->xmin + 0.65f * U.widget_unit, centy, 'h', color); } - /* disable lines */ + /* Disable lines. */ if (node->flag & NODE_MUTED) { node_draw_mute_line(v2d, snode, node); } - char showname[128]; /* 128 is used below */ + char showname[128]; nodeLabel(ntree, node, showname, sizeof(showname)); - /* XXX - don't print into self! */ - // if (node->flag & NODE_MUTED) - // BLI_snprintf(showname, sizeof(showname), "[%s]", showname); - uiBut *but = uiDefBut(node->block, UI_BTYPE_LABEL, 0, @@ -1680,7 +1669,7 @@ static void node_draw_hidden(const bContext *C, UI_but_flag_enable(but, UI_BUT_INACTIVE); } - /* scale widget thing */ + /* Scale widget thing. */ uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); @@ -1738,13 +1727,13 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2]) if (ntree) { if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN | SOCK_OUT)) { - /* pass */ + /* Pass. */ } else { - /* check nodes front to back */ + /* Check nodes front to back. */ for (node = (bNode *)ntree->nodes.last; node; node = node->prev) { if (BLI_rctf_isect_pt(&node->totr, cursor[0], cursor[1])) { - break; /* first hit on node stops */ + break; /* First hit on node stops. */ } } if (node) { @@ -1807,13 +1796,13 @@ static void count_mutli_input_socket_links(bNodeTree *ntree, SpaceNode *snode) void node_update_nodetree(const bContext *C, bNodeTree *ntree) { - /* make sure socket "used" tags are correct, for displaying value buttons */ + /* Make sure socket "used" tags are correct, for displaying value buttons. */ SpaceNode *snode = CTX_wm_space_node(C); ntreeTagUsedSockets(ntree); count_mutli_input_socket_links(ntree, snode); - /* update nodes front to back, so children sizes get updated before parents */ + /* Update nodes front to back, so children sizes get updated before parents. */ LISTBASE_FOREACH_BACKWARD (bNode *, node, &ntree->nodes) { node_update(C, ntree, node); } @@ -1903,7 +1892,7 @@ void node_draw_nodetree(const bContext *C, bNodeInstanceKey parent_key) { if (ntree == nullptr) { - return; /* groups... */ + return; /* Groups. */ } #ifdef USE_DRAW_TOT_UPDATE @@ -1912,11 +1901,11 @@ void node_draw_nodetree(const bContext *C, } #endif - /* draw background nodes, last nodes in front */ + /* Draw background nodes, last nodes in front. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { #ifdef USE_DRAW_TOT_UPDATE - /* unrelated to background nodes, update the v2d->tot, - * can be anywhere before we draw the scroll bars */ + /* Unrelated to background nodes, update the v2d->tot, + * can be anywhere before we draw the scroll bars. */ BLI_rctf_union(®ion->v2d.tot, &node->totr); #endif @@ -1928,7 +1917,7 @@ void node_draw_nodetree(const bContext *C, node_draw(C, region, snode, ntree, node, key); } - /* node lines */ + /* Node lines. */ GPU_blend(GPU_BLEND_ALPHA); nodelink_batch_start(snode); @@ -1942,7 +1931,7 @@ void node_draw_nodetree(const bContext *C, nodelink_batch_end(snode); GPU_blend(GPU_BLEND_NONE); - /* draw foreground nodes, last nodes in front */ + /* Draw foreground nodes, last nodes in front. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (node->flag & NODE_BACKGROUND) { continue; @@ -1953,7 +1942,7 @@ void node_draw_nodetree(const bContext *C, } } -/* draw tree path info in lower left corner */ +/* Draw tree path info in lower left corner. */ static void draw_tree_path(SpaceNode *snode) { char info[256]; @@ -1968,11 +1957,11 @@ static void snode_setup_v2d(SpaceNode *snode, ARegion *region, const float cente { View2D *v2d = ®ion->v2d; - /* shift view to node tree center */ + /* Shift view to node tree center. */ UI_view2d_center_set(v2d, center[0], center[1]); UI_view2d_view_ortho(v2d); - /* aspect+font, set each time */ + /* Aspect + font, set each time. */ snode->runtime->aspect = BLI_rctf_size_x(&v2d->cur) / (float)region->winx; // XXX snode->curfont = uiSetCurFont_ext(snode->aspect); } @@ -1990,14 +1979,14 @@ static void draw_nodetree(const bContext *C, node_draw_nodetree(C, region, snode, ntree, parent_key); } -/* shade the parent node group and add a uiBlock to clip mouse events */ +/* Shade the parent node group and add a `uiBlock` to clip mouse events. */ static void draw_group_overlay(const bContext *C, ARegion *region) { const View2D *v2d = ®ion->v2d; const rctf rect = v2d->cur; float color[4]; - /* shade node groups to separate them visually */ + /* Shade node groups to separate them visually. */ GPU_blend(GPU_BLEND_ALPHA); UI_GetThemeColorShadeAlpha4fv(TH_NODE_GROUP, 0, 0, color); @@ -2005,7 +1994,7 @@ static void draw_group_overlay(const bContext *C, ARegion *region) UI_draw_roundbox_4fv(&rect, true, 0, color); GPU_blend(GPU_BLEND_NONE); - /* set the block bounds to clip mouse events from underlying nodes */ + /* Set the block bounds to clip mouse events from underlying nodes. */ uiBlock *block = UI_block_begin(C, region, "node tree bounds block", UI_EMBOSS); UI_block_bounds_set_explicit(block, rect.xmin, rect.ymin, rect.xmax, rect.ymax); UI_block_flag_enable(block, UI_BLOCK_CLIP_EVENTS); @@ -2043,19 +2032,19 @@ void node_draw_space(const bContext *C, ARegion *region) ED_region_draw_cb_draw(C, region, REGION_DRAW_PRE_VIEW); - /* only set once */ + /* Only set once. */ GPU_blend(GPU_BLEND_ALPHA); - /* nodes */ + /* Nodes. */ snode_set_context(C); - /* draw parent node trees */ + /* Draw parent node trees. */ if (snode->treepath.last) { static const int max_depth = 2; bNodeTreePath *path = (bNodeTreePath *)snode->treepath.last; - /* update tree path name (drawn in the bottom left) */ + /* Update tree path name (drawn in the bottom left). */ ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id : snode->id; @@ -2063,11 +2052,11 @@ void node_draw_space(const bContext *C, ARegion *region) BLI_strncpy(path->node_name, name_id->name + 2, sizeof(path->node_name)); } - /* current View2D center, will be set temporarily for parent node trees */ + /* Current View2D center, will be set temporarily for parent node trees. */ float center[2]; UI_view2d_center_get(v2d, ¢er[0], ¢er[1]); - /* store new view center in path and current edittree */ + /* Store new view center in path and current edit tree. */ copy_v2_v2(path->view_center, center); if (snode->edittree) { copy_v2_v2(snode->edittree->view_center, center); @@ -2079,7 +2068,7 @@ void node_draw_space(const bContext *C, ARegion *region) depth++; } - /* parent node trees in the background */ + /* Parent node trees in the background. */ for (int curdepth = depth; curdepth > 0; path = path->next, curdepth--) { bNodeTree *ntree = path->nodetree; if (ntree) { @@ -2091,19 +2080,19 @@ void node_draw_space(const bContext *C, ARegion *region) } } - /* top-level edit tree */ + /* Top-level edit tree. */ bNodeTree *ntree = path->nodetree; if (ntree) { snode_setup_v2d(snode, region, center); - /* grid, uses theme color based on node path depth */ + /* Grid, uses theme color based on node path depth. */ UI_view2d_multi_grid_draw(v2d, (depth > 0 ? TH_NODE_GROUP : TH_GRID), ED_node_grid_size(), NODE_GRID_STEPS, grid_levels); - /* backdrop */ + /* Backdrop. */ draw_nodespace_back_pix(C, region, snode, path->parent_key); { @@ -2124,7 +2113,7 @@ void node_draw_space(const bContext *C, ARegion *region) draw_nodetree(C, region, ntree, path->parent_key); } - /* temporary links */ + /* Temporary links. */ GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { @@ -2136,21 +2125,21 @@ void node_draw_space(const bContext *C, ARegion *region) GPU_blend(GPU_BLEND_NONE); if (snode->flag & SNODE_SHOW_GPENCIL) { - /* draw grease-pencil ('canvas' strokes) */ + /* Draw grease-pencil annotations. */ ED_annotation_draw_view2d(C, true); } } else { - /* default grid */ + /* Default grid. */ UI_view2d_multi_grid_draw(v2d, TH_GRID, ED_node_grid_size(), NODE_GRID_STEPS, grid_levels); - /* backdrop */ + /* Backdrop. */ draw_nodespace_back_pix(C, region, snode, NODE_INSTANCE_KEY_NONE); } ED_region_draw_cb_draw(C, region, REGION_DRAW_POST_VIEW); - /* reset view matrix */ + /* Reset view matrix. */ UI_view2d_view_restore(C); if (snode->treepath.last) { @@ -2160,9 +2149,9 @@ void node_draw_space(const bContext *C, ARegion *region) } } - /* tree path info */ + /* Tree path info. */ draw_tree_path(snode); - /* scrollers */ + /* Scrollers. */ UI_view2d_scrollers_draw(v2d, nullptr); } From 78116a1edc9bc2cde7184f5b12f0ced21d44bfda Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 17 Feb 2021 20:34:25 +0100 Subject: [PATCH 268/519] macOS: support building with command line tools without full Xcode Latest Xcode takes up 15GB, command line tools are only 1.2GB. --- .../cmake/platform/platform_apple_xcode.cmake | 104 ++++++++++++------ 1 file changed, 70 insertions(+), 34 deletions(-) diff --git a/build_files/cmake/platform/platform_apple_xcode.cmake b/build_files/cmake/platform/platform_apple_xcode.cmake index f12de540353..43bdafb8ce2 100644 --- a/build_files/cmake/platform/platform_apple_xcode.cmake +++ b/build_files/cmake/platform/platform_apple_xcode.cmake @@ -20,6 +20,7 @@ # Xcode and system configuration for Apple. +# Detect processor architecture. if(NOT CMAKE_OSX_ARCHITECTURES) execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Detected native architecture ${ARCHITECTURE}.") @@ -28,56 +29,93 @@ if(NOT CMAKE_OSX_ARCHITECTURES) FORCE) endif() -if(NOT DEFINED OSX_SYSTEM) - execute_process( - COMMAND xcodebuild -version -sdk macosx SDKVersion - OUTPUT_VARIABLE OSX_SYSTEM - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -# workaround for incorrect cmake xcode lookup for developer previews - XCODE_VERSION does not -# take xcode-select path into account but would always look into /Applications/Xcode.app -# while dev versions are named Xcode-DP +# Detect developer directory. Depending on configuration this may be either +# an Xcode or Command Line Tools installation. execute_process( COMMAND xcode-select --print-path - OUTPUT_VARIABLE XCODE_CHECK OUTPUT_STRIP_TRAILING_WHITESPACE) -string(REPLACE "/Contents/Developer" "" XCODE_BUNDLE ${XCODE_CHECK}) # truncate to bundlepath in any case + OUTPUT_VARIABLE XCODE_DEVELOPER_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) +# Detect Xcode version. It is provided by the Xcode generator but not +# Unix Makefiles or Ninja. if(NOT ${CMAKE_GENERATOR} MATCHES "Xcode") - # Unix makefile generator does not fill XCODE_VERSION var, so we get it with a command. # Note that `xcodebuild -version` gives output in two lines: first line will include # Xcode version, second one will include build number. We are only interested in the - # former one. Here is an example of the output: + # first line. Here is an example of the output: # Xcode 11.4 # Build version 11E146 # The expected XCODE_VERSION in this case is 11.4. + execute_process( + COMMAND xcodebuild -version + OUTPUT_VARIABLE _xcode_vers_build_nr + RESULT_VARIABLE _xcode_vers_result + ERROR_QUIET) - execute_process(COMMAND xcodebuild -version OUTPUT_VARIABLE XCODE_VERS_BUILD_NR) + if(_xcode_vers_result EQUAL 0) + # Convert output to a single line by replacing newlines with spaces. + # This is needed because regex replace can not operate through the newline character + # and applies substitutions for each individual lines. + string(REPLACE "\n" " " _xcode_vers_build_nr_single_line "${_xcode_vers_build_nr}") + string(REGEX REPLACE "(.*)Xcode ([0-9\\.]+).*" "\\2" XCODE_VERSION "${_xcode_vers_build_nr_single_line}") + unset(_xcode_vers_build_nr_single_line) + endif() - # Convert output to a single line by replacling newlines with spaces. - # This is needed because regex replace can not operate through the newline character - # and applies substitutions for each individual lines. - string(REPLACE "\n" " " XCODE_VERS_BUILD_NR_SINGLE_LINE "${XCODE_VERS_BUILD_NR}") - - string(REGEX REPLACE "(.*)Xcode ([0-9\\.]+).*" "\\2" XCODE_VERSION "${XCODE_VERS_BUILD_NR_SINGLE_LINE}") - - unset(XCODE_VERS_BUILD_NR) - unset(XCODE_VERS_BUILD_NR_SINGLE_LINE) + unset(_xcode_vers_build_nr) + unset(_xcode_vers_result) endif() -message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_BUNDLE}") +if(XCODE_VERSION) + # Construct SDKs path ourselves, because xcode-select path could be ambiguous. + # Both /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed. + set(XCODE_SDK_DIR ${XCODE_DEVELOPER_DIR}/Platforms/MacOSX.platform//Developer/SDKs) + + # Detect SDK version to use + if(NOT DEFINED OSX_SYSTEM) + execute_process( + COMMAND xcodebuild -version -sdk macosx SDKVersion + OUTPUT_VARIABLE OSX_SYSTEM + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_DEVELOPER_DIR}") + message(STATUS "SDKs Directory: " ${XCODE_SDK_DIR}) +else() + # If no Xcode version found, try detecting command line tools. + execute_process( + COMMAND pkgutil --pkg-info=com.apple.pkg.CLTools_Executables + OUTPUT_VARIABLE _cltools_pkg_info + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _cltools_pkg_info_result + ERROR_QUIET) + + if(_cltools_pkg_info_result EQUAL 0) + # Extract version. + string(REGEX REPLACE ".*version: ([0-9]+)\\.([0-9]+).*" "\\1.\\2" XCODE_VERSION "${_cltools_pkg_info}") + # SDK directory. + set(XCODE_SDK_DIR "${XCODE_DEVELOPER_DIR}/SDKs") + + # Detect SDK version to use. + if(NOT DEFINED OSX_SYSTEM) + execute_process( + COMMAND xcrun --show-sdk-version + OUTPUT_VARIABLE OSX_SYSTEM + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + message(STATUS "Detected OS X ${OSX_SYSTEM} and Command Line Tools ${XCODE_VERSION} at ${XCODE_DEVELOPER_DIR}") + message(STATUS "SDKs Directory: " ${XCODE_SDK_DIR}) + else() + message(FATAL_ERROR "No Xcode or Command Line Tools detected") + endif() + + unset( _cltools_pkg_info) + unset(__cltools_pkg_info_result) +endif() # Require a relatively recent Xcode version. if(${XCODE_VERSION} VERSION_LESS 10.0) message(FATAL_ERROR "Only Xcode version 10.0 and newer is supported") endif() -# note: xcode-select path could be ambiguous, -# cause /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed -# so i use a selfcomposed bundlepath here -set(OSX_SYSROOT_PREFIX ${XCODE_BUNDLE}/Contents/Developer/Platforms/MacOSX.platform) -message(STATUS "OSX_SYSROOT_PREFIX: " ${OSX_SYSROOT_PREFIX}) - # Collect list of OSX system versions which will be used to detect path to corresponding SDK. # Start with macOS SDK version reported by xcodebuild and include possible extra ones. # @@ -101,10 +139,9 @@ endif() # Loop through all possible versions and pick the first one which resolves to a valid SDK path. set(OSX_SDK_PATH) set(OSX_SDK_FOUND FALSE) -set(OSX_SDK_PREFIX ${OSX_SYSROOT_PREFIX}/Developer/SDKs) set(OSX_SDKROOT) foreach(OSX_SDK_VERSION ${OSX_SDK_TEST_VERSIONS}) - set(CURRENT_OSX_SDK_PATH "${OSX_SDK_PREFIX}/MacOSX${OSX_SDK_VERSION}.sdk") + set(CURRENT_OSX_SDK_PATH "${XCODE_SDK_DIR}/MacOSX${OSX_SDK_VERSION}.sdk") if(EXISTS ${CURRENT_OSX_SDK_PATH}) set(OSX_SDK_PATH "${CURRENT_OSX_SDK_PATH}") set(OSX_SDKROOT macosx${OSX_SDK_VERSION}) @@ -112,7 +149,6 @@ foreach(OSX_SDK_VERSION ${OSX_SDK_TEST_VERSIONS}) break() endif() endforeach() -unset(OSX_SDK_PREFIX) unset(OSX_SDK_TEST_VERSIONS) if(NOT OSX_SDK_FOUND) From fd75f7c135747b6fb4e53a0a277ad432ec7bfa08 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 16:19:50 -0600 Subject: [PATCH 269/519] Cleanup: Use Vector instead of of raw array --- .../blender/editors/space_node/node_draw.cc | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 9e96af5e03d..c5eb1567bc4 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -1808,11 +1808,8 @@ void node_update_nodetree(const bContext *C, bNodeTree *ntree) } } -static int compare_link_by_angle_to_node(const void *a, const void *b) +static bool compare_link_by_angle_to_node(const bNodeLink *link_a, const bNodeLink *link_b) { - const bNodeLink *link_a = *(const bNodeLink **)a; - const bNodeLink *link_b = *(const bNodeLink **)b; - BLI_assert(link_a->tosock == link_b->tosock); const float socket_location[2] = {link_a->tosock->locx, link_a->tosock->locy}; const float up_direction[2] = {0.0f, 1.0f}; @@ -1827,7 +1824,7 @@ static int compare_link_by_angle_to_node(const void *a, const void *b) normalize_v2(delta_b); const float angle_b = angle_normalized_v2v2(up_direction, delta_b); - return angle_a < angle_b ? 1 : -1; + return angle_a > angle_b; } static void node_draw(const bContext *C, @@ -1854,32 +1851,27 @@ static void sort_multi_input_socket_links(bNodeTree *ntree, SpaceNode *snode) if (socket->flag & SOCK_MULTI_INPUT) { /* The total is calculated in #node_update_nodetree, which runs before this draw step. */ const int total_inputs = socket->total_inputs; - bNodeLink **input_links = (bNodeLink **)MEM_malloc_arrayN( - total_inputs, sizeof(bNodeLink *), __func__); + Vector input_links; + input_links.reserve(total_inputs); - int index = 0; LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { if (link->tosock == socket) { - input_links[index] = (bNodeLink *)link; - index++; + input_links.append(link); } } LISTBASE_FOREACH (bNodeLinkDrag *, nldrag, &snode->runtime->linkdrag) { LISTBASE_FOREACH (LinkData *, linkdata, &nldrag->links) { bNodeLink *link = (bNodeLink *)linkdata->data; if (link->tosock == socket) { - input_links[index] = (bNodeLink *)link; - index++; + input_links.append(link); } } } - qsort(input_links, total_inputs, sizeof(bNodeLink *), compare_link_by_angle_to_node); - for (int i = 0; i < total_inputs; i++) { + std::sort(input_links.begin(), input_links.end(), compare_link_by_angle_to_node); + for (const int i : input_links.index_range()) { input_links[i]->multi_input_socket_index = i; } - - MEM_freeN(input_links); } } } From 5fef212e3185b23051da6889d4fe08645249d217 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 16:42:20 -0600 Subject: [PATCH 270/519] Cleanup: Use const argument, decrease variable scope --- source/blender/editors/include/UI_interface.h | 2 +- .../blender/editors/interface/interface_utils.c | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 67cd4f020be..75100326fac 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1411,7 +1411,7 @@ enum { UI_TEMPLATE_ID_FILTER_AVAILABLE = 1, }; -int UI_icon_from_id(struct ID *id); +int UI_icon_from_id(const struct ID *id); int UI_icon_from_report_type(int type); int UI_icon_colorid_from_report_type(int type); int UI_text_colorid_from_report_type(int type); diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index af058264f25..824fb6272f6 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -511,21 +511,15 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, } /***************************** ID Utilities *******************************/ -int UI_icon_from_id(ID *id) +int UI_icon_from_id(const ID *id) { - Object *ob; - PointerRNA ptr; - short idcode; - if (id == NULL) { return ICON_NONE; } - idcode = GS(id->name); - /* exception for objects */ - if (idcode == ID_OB) { - ob = (Object *)id; + if (GS(id->name) == ID_OB) { + Object *ob = (Object *)id; if (ob->type == OB_EMPTY) { return ICON_EMPTY_DATA; @@ -535,7 +529,8 @@ int UI_icon_from_id(ID *id) /* otherwise get it through RNA, creating the pointer * will set the right type, also with subclassing */ - RNA_id_pointer_create(id, &ptr); + PointerRNA ptr; + RNA_id_pointer_create((ID *)id, &ptr); return (ptr.type) ? RNA_struct_ui_icon(ptr.type) : ICON_NONE; } From 450ea1b755cb9ea71b0949792a2d1ffb39f3c3d9 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 17 Feb 2021 16:59:50 -0600 Subject: [PATCH 271/519] Cleanup: Decrease variable scope --- .../editors/interface/interface_templates.c | 57 +++++++------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index dad8253d101..0be79f6da1e 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -558,14 +558,13 @@ void UI_context_active_but_prop_get_templateID(bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop) { - TemplateID *template_ui; uiBut *but = UI_context_active_but_get(C); memset(r_ptr, 0, sizeof(*r_ptr)); *r_prop = NULL; if (but && but->func_argN) { - template_ui = but->func_argN; + TemplateID *template_ui = but->func_argN; *r_ptr = template_ui->ptr; *r_prop = template_ui->prop; } @@ -911,22 +910,18 @@ static void template_ID(const bContext *C, const bool hide_buttons) { uiBut *but; - uiBlock *block; - PointerRNA idptr; - // ListBase *lb; // UNUSED - ID *id, *idfrom; const bool editable = RNA_property_editable(&template_ui->ptr, template_ui->prop); const bool use_previews = template_ui->preview = (flag & UI_ID_PREVIEWS) != 0; - idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop); - id = idptr.data; - idfrom = template_ui->ptr.owner_id; + PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop); + ID *id = idptr.data; + ID *idfrom = template_ui->ptr.owner_id; // lb = template_ui->idlb; /* Allow operators to take the ID from context. */ uiLayoutSetContextPointer(layout, "id", &idptr); - block = uiLayoutGetBlock(layout); + uiBlock *block = uiLayoutGetBlock(layout); UI_block_align_begin(block); if (idptr.type) { @@ -1330,19 +1325,14 @@ static void ui_template_id(uiLayout *layout, const bool live_icon, const bool hide_buttons) { - TemplateID *template_ui; - PropertyRNA *prop; - StructRNA *type; - short idcode; - - prop = RNA_struct_find_property(ptr, propname); + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); if (!prop || RNA_property_type(prop) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } - template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID"); + TemplateID *template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID"); template_ui->ptr = *ptr; template_ui->prop = prop; template_ui->prv_rows = prv_rows; @@ -1363,8 +1353,8 @@ static void ui_template_id(uiLayout *layout, flag |= UI_ID_OPEN; } - type = RNA_property_pointer_type(ptr, prop); - idcode = RNA_type_to_ID_code(type); + StructRNA *type = RNA_property_pointer_type(ptr, prop); + short idcode = RNA_type_to_ID_code(type); template_ui->idcode = idcode; template_ui->idlb = which_libbase(CTX_data_main(C), idcode); @@ -1563,12 +1553,9 @@ void uiTemplateAnyID(uiLayout *layout, const char *proptypename, const char *text) { - PropertyRNA *propID, *propType; - uiLayout *split, *row, *sub; - /* get properties... */ - propID = RNA_struct_find_property(ptr, propname); - propType = RNA_struct_find_property(ptr, proptypename); + PropertyRNA *propID = RNA_struct_find_property(ptr, propname); + PropertyRNA *propType = RNA_struct_find_property(ptr, proptypename); if (!propID || RNA_property_type(propID) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); @@ -1583,10 +1570,10 @@ void uiTemplateAnyID(uiLayout *layout, /* Start drawing UI Elements using standard defines */ /* NOTE: split amount here needs to be synced with normal labels */ - split = uiLayoutSplit(layout, 0.33f, false); + uiLayout *split = uiLayoutSplit(layout, 0.33f, false); /* FIRST PART ................................................ */ - row = uiLayoutRow(split, false); + uiLayout *row = uiLayoutRow(split, false); /* Label - either use the provided text, or will become "ID-Block:" */ if (text) { @@ -1605,7 +1592,7 @@ void uiTemplateAnyID(uiLayout *layout, /* HACK: special group just for the enum, * otherwise we get ugly layout with text included too... */ - sub = uiLayoutRow(row, true); + uiLayout *sub = uiLayoutRow(row, true); uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); uiItemFullR(sub, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NONE); @@ -1804,18 +1791,15 @@ static TemplateSearch *template_search_setup(PointerRNA *ptr, PointerRNA *searchptr, const char *const searchpropname) { - TemplateSearch *template_search; - PropertyRNA *prop, *searchprop; - - prop = RNA_struct_find_property(ptr, propname); + PropertyRNA *prop = RNA_struct_find_property(ptr, propname); if (!prop || RNA_property_type(prop) != PROP_POINTER) { RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return NULL; } - searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname); + PropertyRNA *searchprop = template_search_get_searchprop(ptr, prop, searchptr, searchpropname); - template_search = MEM_callocN(sizeof(*template_search), __func__); + TemplateSearch *template_search = MEM_callocN(sizeof(*template_search), __func__); template_search->search_data.target_ptr = *ptr; template_search->search_data.target_prop = prop; template_search->search_data.search_ptr = *searchptr; @@ -1891,18 +1875,15 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *UNUSED(root_ptr), const char *text) { - PropertyRNA *propPath; - uiLayout *row; - /* check that properties are valid */ - propPath = RNA_struct_find_property(ptr, propname); + PropertyRNA *propPath = RNA_struct_find_property(ptr, propname); if (!propPath || RNA_property_type(propPath) != PROP_STRING) { RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } /* Start drawing UI Elements using standard defines */ - row = uiLayoutRow(layout, true); + uiLayout *row = uiLayoutRow(layout, true); /* Path (existing string) Widget */ uiItemR(row, ptr, propname, 0, text, ICON_RNA); From 1bcc8f84105a7715655bc42ec12eca41d06c38cf Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 18 Feb 2021 09:09:31 +0100 Subject: [PATCH 272/519] Cleanup: Python: naming mismatch in bvh.ray_cast. --- source/blender/python/mathutils/mathutils_bvhtree.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c index 0f3e54dc41f..1acbcc006ca 100644 --- a/source/blender/python/mathutils/mathutils_bvhtree.c +++ b/source/blender/python/mathutils/mathutils_bvhtree.c @@ -333,8 +333,8 @@ PyDoc_STRVAR(py_bvhtree_ray_cast_doc, "\n" " Cast a ray onto the mesh.\n" "\n" - " :arg co: Start location of the ray in object space.\n" - " :type co: :class:`Vector`\n" + " :arg origin: Start location of the ray in object space.\n" + " :type origin: :class:`Vector`\n" " :arg direction: Direction of the ray in object space.\n" " :type direction: :class:`Vector`\n" PYBVH_FIND_GENERIC_DISTANCE_DOC PYBVH_FIND_GENERIC_RETURN_DOC); From 999abee874bd7d69f6a40c27969598869799e8dc Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 18 Feb 2021 10:13:56 +0100 Subject: [PATCH 273/519] Geometry Nodes: convert point cloud to mesh vertices for modifiers Previously, when a Geometry Nodes modifier outputs a point cloud (e.g. generated using the Point Distribute node), other modifiers could not use that data. Now, the point cloud data is converted to mesh vertices for such modifiers. Ref T85281. Differential Revision: https://developer.blender.org/D10451 --- .../blenkernel/BKE_geometry_set_instances.hh | 3 +- .../blender/blenkernel/intern/DerivedMesh.cc | 5 +- .../intern/geometry_set_instances.cc | 170 +++++++++++------- 3 files changed, 113 insertions(+), 65 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh index 4f3c9c65203..f918adaff7c 100644 --- a/source/blender/blenkernel/BKE_geometry_set_instances.hh +++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh @@ -41,6 +41,7 @@ struct GeometryInstanceGroup { Vector geometry_set_gather_instances(const GeometrySet &geometry_set); +GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set); GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); struct AttributeInfo { @@ -54,7 +55,7 @@ struct AttributeInfo { * attribute with the given name on all of the input components. */ void gather_attribute_info(Map &attributes, - const GeometryComponentType component_type, + Span component_types, Span set_groups, const Set &ignored_attributes); diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 213e72d496b..4aa7cfae009 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -890,7 +890,7 @@ void BKE_mesh_wrapper_deferred_finalize(Mesh *me_eval, */ static Mesh *prepare_geometry_set_for_mesh_modifier(Mesh *mesh, GeometrySet &r_geometry_set) { - if (!r_geometry_set.has_instances()) { + if (!r_geometry_set.has_instances() && !r_geometry_set.has_pointcloud()) { return mesh; } @@ -901,7 +901,8 @@ static Mesh *prepare_geometry_set_for_mesh_modifier(Mesh *mesh, GeometrySet &r_g } { /* Combine mesh and all instances into a single mesh that can be passed to the modifier. */ - GeometrySet new_geometry_set = blender::bke::geometry_set_realize_instances(r_geometry_set); + GeometrySet new_geometry_set = blender::bke::geometry_set_realize_mesh_for_modifier( + r_geometry_set); MeshComponent &mesh_component = new_geometry_set.get_component_for_write(); Mesh *new_mesh = mesh_component.release(); r_geometry_set = new_geometry_set; diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 436fc0f1d1d..66c7f53cdf5 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -24,6 +24,7 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_pointcloud_types.h" namespace blender::bke { @@ -165,44 +166,47 @@ Vector geometry_set_gather_instances(const GeometrySet &g } void gather_attribute_info(Map &attributes, - const GeometryComponentType component_type, + Span component_types, Span set_groups, const Set &ignored_attributes) { for (const GeometryInstanceGroup &set_group : set_groups) { const GeometrySet &set = set_group.geometry_set; - if (!set.has(component_type)) { - continue; - } - const GeometryComponent &component = *set.get_component_for_read(component_type); - - for (const std::string &name : component.attribute_names()) { - if (ignored_attributes.contains(name)) { + for (const GeometryComponentType component_type : component_types) { + if (!set.has(component_type)) { continue; } - const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); - if (!read_attribute) { - continue; + const GeometryComponent &component = *set.get_component_for_read(component_type); + + for (const std::string &name : component.attribute_names()) { + if (ignored_attributes.contains(name)) { + continue; + } + const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); + if (!read_attribute) { + continue; + } + const AttributeDomain domain = read_attribute->domain(); + const CustomDataType data_type = read_attribute->custom_data_type(); + + auto add_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; + info->data_type = data_type; + }; + auto modify_info = [&, data_type, domain](AttributeInfo *info) { + info->domain = domain; /* TODO: Use highest priority domain. */ + info->data_type = bke::attribute_data_type_highest_complexity( + {info->data_type, data_type}); + }; + + attributes.add_or_modify(name, add_info, modify_info); } - const AttributeDomain domain = read_attribute->domain(); - const CustomDataType data_type = read_attribute->custom_data_type(); - - auto add_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; - info->data_type = data_type; - }; - auto modify_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; /* TODO: Use highest priority domain. */ - info->data_type = bke::attribute_data_type_highest_complexity( - {info->data_type, data_type}); - }; - - attributes.add_or_modify(name, add_info, modify_info); } } } -static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups) +static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups, + const bool convert_points_to_vertices) { int totverts = 0; int totloops = 0; @@ -214,17 +218,22 @@ static Mesh *join_mesh_topology_and_builtin_attributes(Spanmvert[vert_offset + i]; + const float3 old_position = pointcloud.co[i]; + const float3 new_position = transform * old_position; + copy_v3_v3(new_vert.co, new_position); + } + vert_offset += pointcloud.totpoint; + } + } } return new_mesh; } static void join_attributes(Span set_groups, - const GeometryComponentType component_type, + Span component_types, const Map &attribute_info, GeometryComponent &result) { @@ -315,26 +336,28 @@ static void join_attributes(Span set_groups, int offset = 0; for (const GeometryInstanceGroup &set_group : set_groups) { const GeometrySet &set = set_group.geometry_set; - if (set.has(component_type)) { - const GeometryComponent &component = *set.get_component_for_read(component_type); - const int domain_size = component.attribute_domain_size(domain_output); - if (domain_size == 0) { - continue; /* Domain size is 0, so no need to increment the offset. */ - } - ReadAttributePtr source_attribute = component.attribute_try_get_for_read( - name, domain_output, data_type_output); - - if (source_attribute) { - fn::GSpan src_span = source_attribute->get_span(); - const void *src_buffer = src_span.data(); - for (const int UNUSED(i) : set_group.transforms.index_range()) { - void *dst_buffer = dst_span[offset]; - cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); - offset += domain_size; + for (const GeometryComponentType component_type : component_types) { + if (set.has(component_type)) { + const GeometryComponent &component = *set.get_component_for_read(component_type); + const int domain_size = component.attribute_domain_size(domain_output); + if (domain_size == 0) { + continue; /* Domain size is 0, so no need to increment the offset. */ + } + ReadAttributePtr source_attribute = component.attribute_try_get_for_read( + name, domain_output, data_type_output); + + if (source_attribute) { + fn::GSpan src_span = source_attribute->get_span(); + const void *src_buffer = src_span.data(); + for (const int UNUSED(i) : set_group.transforms.index_range()) { + void *dst_buffer = dst_span[offset]; + cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); + offset += domain_size; + } + } + else { + offset += domain_size * set_group.transforms.size(); } - } - else { - offset += domain_size * set_group.transforms.size(); } } } @@ -343,21 +366,27 @@ static void join_attributes(Span set_groups, } } -static void join_instance_groups_mesh(Span set_groups, GeometrySet &result) +static void join_instance_groups_mesh(Span set_groups, + bool convert_points_to_vertices, + GeometrySet &result) { - Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups); + Mesh *new_mesh = join_mesh_topology_and_builtin_attributes(set_groups, + convert_points_to_vertices); MeshComponent &dst_component = result.get_component_for_write(); dst_component.replace(new_mesh); + Vector component_types; + component_types.append(GeometryComponentType::Mesh); + if (convert_points_to_vertices) { + component_types.append(GeometryComponentType::PointCloud); + } + /* Don't copy attributes that are stored directly in the mesh data structs. */ Map attributes; - gather_attribute_info( - attributes, GeometryComponentType::Mesh, set_groups, {"position", "material_index"}); - join_attributes(set_groups, - GeometryComponentType::Mesh, - attributes, - static_cast(dst_component)); + gather_attribute_info(attributes, component_types, set_groups, {"position", "material_index"}); + join_attributes( + set_groups, component_types, attributes, static_cast(dst_component)); } static void join_instance_groups_pointcloud(Span set_groups, @@ -376,9 +405,9 @@ static void join_instance_groups_pointcloud(Span set_grou PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); dst_component.replace(pointcloud); Map attributes; - gather_attribute_info(attributes, GeometryComponentType::Mesh, set_groups, {}); + gather_attribute_info(attributes, {GeometryComponentType::PointCloud}, set_groups, {}); join_attributes(set_groups, - GeometryComponentType::PointCloud, + {GeometryComponentType::PointCloud}, attributes, static_cast(dst_component)); } @@ -392,6 +421,23 @@ static void join_instance_groups_volume(Span set_groups, UNUSED_VARS(set_groups, dst_component); } +GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set) +{ + if (!geometry_set.has_instances() && !geometry_set.has_pointcloud()) { + return geometry_set; + } + + GeometrySet new_geometry_set = geometry_set; + Vector set_groups = geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, true, new_geometry_set); + /* Remove all instances, even though some might contain other non-mesh data. We can't really + * keep only non-mesh instances in general. */ + new_geometry_set.remove(); + /* If there was a point cloud, it is now part of the mesh. */ + new_geometry_set.remove(); + return new_geometry_set; +} + GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) { if (!geometry_set.has_instances()) { @@ -400,8 +446,8 @@ GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set) GeometrySet new_geometry_set; - Vector set_groups = bke::geometry_set_gather_instances(geometry_set); - join_instance_groups_mesh(set_groups, new_geometry_set); + Vector set_groups = geometry_set_gather_instances(geometry_set); + join_instance_groups_mesh(set_groups, false, new_geometry_set); join_instance_groups_pointcloud(set_groups, new_geometry_set); join_instance_groups_volume(set_groups, new_geometry_set); From e3f0b6d5cbe5d34ac43568090c52a84dc51e579e Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 18 Feb 2021 10:24:02 +0100 Subject: [PATCH 274/519] Geometry Nodes: support accessing vertex colors This makes vertex colors available in geometry nodes similar to how uvs are available. They can be used using the attribute system. Vertex colors are stored per corner (as are uvs, but not like vertex weights). Ref T84297. Differential Revision: https://developer.blender.org/D10454 --- .../blenkernel/intern/attribute_access.cc | 155 +++++++++++++----- 1 file changed, 114 insertions(+), 41 deletions(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index aa721a0b4ca..87f7df84eab 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -1019,22 +1019,44 @@ static const Mesh *get_mesh_from_component_for_read(const GeometryComponent &com } /** - * This attribute provider makes uv maps available as float2 attributes. + * This attribute provider is used for uv maps and vertex colors. */ -class MeshUVsAttributeProvider final : public DynamicAttributesProvider { +class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider { + private: + using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); + using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); + const AttributeDomain domain_; + const CustomDataType stored_type_; + const CustomDataAccessInfo custom_data_access_; + const AsReadAttribute as_read_attribute_; + const AsWriteAttribute as_write_attribute_; + public: + NamedLegacyCustomDataProvider(const AttributeDomain domain, + const CustomDataType stored_type, + const CustomDataAccessInfo custom_data_access, + const AsReadAttribute as_read_attribute, + const AsWriteAttribute as_write_attribute) + : domain_(domain), + stored_type_(stored_type), + custom_data_access_(custom_data_access), + as_read_attribute_(as_read_attribute), + as_write_attribute_(as_write_attribute) + { + } + ReadAttributePtr try_get_for_read(const GeometryComponent &component, const StringRef attribute_name) const final { - const Mesh *mesh = get_mesh_from_component_for_read(component); - if (mesh == nullptr) { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { return {}; } - for (const CustomDataLayer &layer : Span(mesh->ldata.layers, mesh->ldata.totlayer)) { - if (layer.type == CD_MLOOPUV) { + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { if (layer.name == attribute_name) { - return std::make_unique>( - ATTR_DOMAIN_CORNER, Span(static_cast(layer.data), mesh->totloop)); + const int domain_size = component.attribute_domain_size(domain_); + return as_read_attribute_(layer.data, domain_size); } } } @@ -1044,22 +1066,21 @@ class MeshUVsAttributeProvider final : public DynamicAttributesProvider { WriteAttributePtr try_get_for_write(GeometryComponent &component, const StringRef attribute_name) const final { - Mesh *mesh = get_mesh_from_component_for_write(component); - if (mesh == nullptr) { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { return {}; } - for (CustomDataLayer &layer : MutableSpan(mesh->ldata.layers, mesh->ldata.totlayer)) { - if (layer.type == CD_MLOOPUV) { + for (CustomDataLayer &layer : MutableSpan(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { if (layer.name == attribute_name) { + const int domain_size = component.attribute_domain_size(domain_); void *data_old = layer.data; void *data_new = CustomData_duplicate_referenced_layer_named( - &mesh->ldata, CD_MLOOPUV, layer.name, mesh->totloop); + custom_data, stored_type_, layer.name, domain_size); if (data_old != data_new) { - BKE_mesh_update_customdata_pointers(mesh, false); + custom_data_access_.update_custom_data_pointers(component); } - return std::make_unique< - DerivedArrayWriteAttribute>( - ATTR_DOMAIN_CORNER, MutableSpan(static_cast(layer.data), mesh->totloop)); + return as_write_attribute_(layer.data, domain_size); } } } @@ -1068,15 +1089,19 @@ class MeshUVsAttributeProvider final : public DynamicAttributesProvider { bool try_delete(GeometryComponent &component, const StringRef attribute_name) const final { - Mesh *mesh = get_mesh_from_component_for_write(component); - if (mesh == nullptr) { + CustomData *custom_data = custom_data_access_.get_custom_data(component); + if (custom_data == nullptr) { return false; } - for (const int i : IndexRange(mesh->ldata.totlayer)) { - const CustomDataLayer &layer = mesh->ldata.layers[i]; - if (layer.type == CD_MLOOPUV && layer.name == attribute_name) { - CustomData_free_layer(&mesh->ldata, CD_MLOOPUV, mesh->totloop, i); - return true; + for (const int i : IndexRange(custom_data->totlayer)) { + const CustomDataLayer &layer = custom_data->layers[i]; + if (layer.type == stored_type_) { + if (layer.name == attribute_name) { + const int domain_size = component.attribute_domain_size(domain_); + CustomData_free_layer(custom_data, stored_type_, domain_size, i); + custom_data_access_.update_custom_data_pointers(component); + return true; + } } } return false; @@ -1084,12 +1109,12 @@ class MeshUVsAttributeProvider final : public DynamicAttributesProvider { void list(const GeometryComponent &component, Set &r_names) const final { - const Mesh *mesh = get_mesh_from_component_for_read(component); - if (mesh == nullptr) { + const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); + if (custom_data == nullptr) { return; } - for (const CustomDataLayer &layer : Span(mesh->ldata.layers, mesh->ldata.totlayer)) { - if (layer.type == CD_MLOOPUV) { + for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { + if (layer.type == stored_type_) { r_names.add(layer.name); } } @@ -1097,18 +1122,7 @@ class MeshUVsAttributeProvider final : public DynamicAttributesProvider { void supported_domains(Vector &r_domains) const final { - r_domains.append_non_duplicates(ATTR_DOMAIN_CORNER); - } - - private: - static float2 get_loop_uv(const MLoopUV &uv) - { - return float2(uv.uv); - } - - static void set_loop_uv(MLoopUV &uv, const float2 &co) - { - copy_v2_v2(uv.uv, co); + r_domains.append_non_duplicates(domain_); } }; @@ -1315,6 +1329,53 @@ static WriteAttributePtr make_material_index_write_attribute(void *data, const i ATTR_DOMAIN_POLYGON, MutableSpan((MPoly *)data, domain_size)); } +static float2 get_loop_uv(const MLoopUV &uv) +{ + return float2(uv.uv); +} + +static void set_loop_uv(MLoopUV &uv, const float2 &co) +{ + copy_v2_v2(uv.uv, co); +} + +static ReadAttributePtr make_uvs_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, Span((const MLoopUV *)data, domain_size)); +} + +static WriteAttributePtr make_uvs_write_attribute(void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, MutableSpan((MLoopUV *)data, domain_size)); +} + +static Color4f get_loop_color(const MLoopCol &col) +{ + Color4f value; + rgba_uchar_to_float(value, &col.r); + return value; +} + +static void set_loop_color(MLoopCol &col, const Color4f &value) +{ + rgba_float_to_uchar(&col.r, value); +} + +static ReadAttributePtr make_vertex_color_read_attribute(const void *data, const int domain_size) +{ + return std::make_unique>( + ATTR_DOMAIN_CORNER, Span((const MLoopCol *)data, domain_size)); +} + +static WriteAttributePtr make_vertex_color_write_attribute(void *data, const int domain_size) +{ + return std::make_unique< + DerivedArrayWriteAttribute>( + ATTR_DOMAIN_CORNER, MutableSpan((MLoopCol *)data, domain_size)); +} + template static ReadAttributePtr make_array_read_attribute(const void *data, const int domain_size) { @@ -1391,7 +1452,18 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() make_material_index_write_attribute, nullptr); - static MeshUVsAttributeProvider uvs; + static NamedLegacyCustomDataProvider uvs(ATTR_DOMAIN_CORNER, + CD_MLOOPUV, + corner_access, + make_uvs_read_attribute, + make_uvs_write_attribute); + + static NamedLegacyCustomDataProvider vertex_colors(ATTR_DOMAIN_CORNER, + CD_MLOOPCOL, + corner_access, + make_vertex_color_read_attribute, + make_vertex_color_write_attribute); + static VertexGroupsAttributeProvider vertex_groups; static CustomDataAttributeProvider corner_custom_data(ATTR_DOMAIN_CORNER, corner_access); static CustomDataAttributeProvider point_custom_data(ATTR_DOMAIN_POINT, point_access); @@ -1400,6 +1472,7 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() return ComponentAttributeProviders({&position, &material_index}, {&uvs, + &vertex_colors, &corner_custom_data, &vertex_groups, &point_custom_data, From 72e2b5060dcc164b05a6d204824e6f94834ca100 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 18 Feb 2021 11:03:38 +0100 Subject: [PATCH 275/519] Geometry Nodes: support adapting point to corner domain This allows accessing per-point attributes on the corner domain, which can be useful e.g. when adding per-point displacement to per-corner uv coordinates. Also it is required to make an upcoming patch work well, that makes the Point Distribute node use density weights per corner instead of per point, giving the user more precise control over the distribution. --- .../blenkernel/intern/attribute_access.cc | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 87f7df84eab..dcf5f6434cf 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -2009,9 +2009,9 @@ int MeshComponent::attribute_domain_size(const AttributeDomain domain) const namespace blender::bke { template -void adapt_mesh_domain_corner_to_point_impl(const Mesh &mesh, - const TypedReadAttribute &attribute, - MutableSpan r_values) +static void adapt_mesh_domain_corner_to_point_impl(const Mesh &mesh, + const TypedReadAttribute &attribute, + MutableSpan r_values) { BLI_assert(r_values.size() == mesh.totvert); attribute_math::DefaultMixer mixer(r_values); @@ -2044,6 +2044,38 @@ static ReadAttributePtr adapt_mesh_domain_corner_to_point(const Mesh &mesh, return new_attribute; } +template +static void adapt_mesh_domain_point_to_corner_impl(const Mesh &mesh, + const TypedReadAttribute &attribute, + MutableSpan r_values) +{ + BLI_assert(r_values.size() == mesh.totloop); + + for (const int loop_index : IndexRange(mesh.totloop)) { + const int vertex_index = mesh.mloop[loop_index].v; + r_values[loop_index] = attribute[vertex_index]; + } +} + +static ReadAttributePtr adapt_mesh_domain_point_to_corner(const Mesh &mesh, + ReadAttributePtr attribute) +{ + ReadAttributePtr new_attribute; + const CustomDataType data_type = attribute->custom_data_type(); + attribute_math::convert_to_static_type(data_type, [&](auto dummy) { + using T = decltype(dummy); + /* It is not strictly necessary to compute the value for all corners here. Instead one could + * lazily lookup the mesh topology when a specific index accessed. This can be more efficient + * when an algorithm only accesses very few of the corner values. However, for the algorithms + * we currently have, precomputing the array is fine. Also, it is easier to implement. */ + Array values(mesh.totloop); + adapt_mesh_domain_point_to_corner_impl(mesh, *attribute, values); + new_attribute = std::make_unique>(ATTR_DOMAIN_CORNER, + std::move(values)); + }); + return new_attribute; +} + } // namespace blender::bke ReadAttributePtr MeshComponent::attribute_try_adapt_domain(ReadAttributePtr attribute, @@ -2070,6 +2102,14 @@ ReadAttributePtr MeshComponent::attribute_try_adapt_domain(ReadAttributePtr attr } break; } + case ATTR_DOMAIN_POINT: { + switch (new_domain) { + case ATTR_DOMAIN_CORNER: + return blender::bke::adapt_mesh_domain_point_to_corner(*mesh_, std::move(attribute)); + default: + break; + } + } default: break; } From 75580fa6a661eba58f9d39f8332985b1b72d3bc3 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 18 Feb 2021 10:30:08 +0100 Subject: [PATCH 276/519] Fix flashing eevee render passes in viewport Caused by rB85fe12071ad7. When looking at a render pass in viewport and move the camera, there's a "flash" effect in this AOVs test file: {F9753476} {F9753473} The cause seems to be that taa_current_sample when rendering (DRW_state_is_image_render()) is ok because it has been incremented in EEVEE_temporal_sampling_draw but taa_current_sample is wrong when we are not rendering. D10375 by Ulysse Martin (youle) with clang format changes. Reviewed By: jbakker, lichtwerk, also blessing from fclem Differential Revision: https://developer.blender.org/D10375 --- source/blender/draw/engines/eevee/eevee_renderpasses.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c index 52160248d75..9b36e94a9dc 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.c +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c @@ -283,8 +283,9 @@ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_EffectsInfo *effects = stl->effects; /* Compensate for taa_current_sample being incremented after last drawing in - * EEVEE_temporal_sampling_draw. */ - const int current_sample = effects->taa_current_sample - 1; + * EEVEE_temporal_sampling_draw when DRW_state_is_image_render(). */ + const int current_sample = DRW_state_is_image_render() ? effects->taa_current_sample - 1 : + effects->taa_current_sample; g_data->renderpass_current_sample = current_sample; g_data->renderpass_type = renderpass_type; g_data->renderpass_postprocess = PASS_POST_UNDEFINED; From e1fe1fcc79377645cca1286c80f3aeee5b736388 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 18 Feb 2021 12:32:34 +0100 Subject: [PATCH 277/519] Cleanup: rename AttributeInfo to AttributeKind "Kind" is a bit less generic than "Info" for me. Especially, it implies that the struct does not contain the name of a specific attribute (for me anyway). --- .../blenkernel/BKE_geometry_set_instances.hh | 4 ++-- .../intern/geometry_set_instances.cc | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set_instances.hh b/source/blender/blenkernel/BKE_geometry_set_instances.hh index f918adaff7c..16c28e32e3c 100644 --- a/source/blender/blenkernel/BKE_geometry_set_instances.hh +++ b/source/blender/blenkernel/BKE_geometry_set_instances.hh @@ -44,7 +44,7 @@ Vector geometry_set_gather_instances(const GeometrySet &g GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set); GeometrySet geometry_set_realize_instances(const GeometrySet &geometry_set); -struct AttributeInfo { +struct AttributeKind { CustomDataType data_type; AttributeDomain domain; }; @@ -54,7 +54,7 @@ struct AttributeInfo { * will contain the highest complexity data type and the highest priority domain among every * attribute with the given name on all of the input components. */ -void gather_attribute_info(Map &attributes, +void gather_attribute_info(Map &attributes, Span component_types, Span set_groups, const Set &ignored_attributes); diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 66c7f53cdf5..b315ff8a509 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -165,7 +165,7 @@ Vector geometry_set_gather_instances(const GeometrySet &g return result_vector; } -void gather_attribute_info(Map &attributes, +void gather_attribute_info(Map &attributes, Span component_types, Span set_groups, const Set &ignored_attributes) @@ -189,14 +189,14 @@ void gather_attribute_info(Map &attributes, const AttributeDomain domain = read_attribute->domain(); const CustomDataType data_type = read_attribute->custom_data_type(); - auto add_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; - info->data_type = data_type; + auto add_info = [&, data_type, domain](AttributeKind *attribute_kind) { + attribute_kind->domain = domain; + attribute_kind->data_type = data_type; }; - auto modify_info = [&, data_type, domain](AttributeInfo *info) { - info->domain = domain; /* TODO: Use highest priority domain. */ - info->data_type = bke::attribute_data_type_highest_complexity( - {info->data_type, data_type}); + auto modify_info = [&, data_type, domain](AttributeKind *attribute_kind) { + attribute_kind->domain = domain; /* TODO: Use highest priority domain. */ + attribute_kind->data_type = bke::attribute_data_type_highest_complexity( + {attribute_kind->data_type, data_type}); }; attributes.add_or_modify(name, add_info, modify_info); @@ -315,10 +315,10 @@ static Mesh *join_mesh_topology_and_builtin_attributes(Span set_groups, Span component_types, - const Map &attribute_info, + const Map &attribute_info, GeometryComponent &result) { - for (Map::Item entry : attribute_info.items()) { + for (Map::Item entry : attribute_info.items()) { StringRef name = entry.key; const AttributeDomain domain_output = entry.value.domain; const CustomDataType data_type_output = entry.value.data_type; @@ -383,7 +383,7 @@ static void join_instance_groups_mesh(Span set_groups, } /* Don't copy attributes that are stored directly in the mesh data structs. */ - Map attributes; + Map attributes; gather_attribute_info(attributes, component_types, set_groups, {"position", "material_index"}); join_attributes( set_groups, component_types, attributes, static_cast(dst_component)); @@ -404,7 +404,7 @@ static void join_instance_groups_pointcloud(Span set_grou PointCloudComponent &dst_component = result.get_component_for_write(); PointCloud *pointcloud = BKE_pointcloud_new_nomain(totpoint); dst_component.replace(pointcloud); - Map attributes; + Map attributes; gather_attribute_info(attributes, {GeometryComponentType::PointCloud}, set_groups, {}); join_attributes(set_groups, {GeometryComponentType::PointCloud}, From 0fe5be352558c487e24724fca4c2cb9f53a724e6 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 18 Feb 2021 12:40:27 +0100 Subject: [PATCH 278/519] Cleanup: return const reference instead of copy There isn't really a reason for why this has to return a copy of the data instead of a reference. --- source/blender/functions/FN_generic_value_map.hh | 10 ++++------ source/blender/nodes/NOD_geometry_exec.hh | 5 +---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/source/blender/functions/FN_generic_value_map.hh b/source/blender/functions/FN_generic_value_map.hh index a9f2dc8a868..68cb945f1af 100644 --- a/source/blender/functions/FN_generic_value_map.hh +++ b/source/blender/functions/FN_generic_value_map.hh @@ -104,14 +104,12 @@ template class GValueMap { return return_value; } - template T lookup(const ForwardKey &key) const + template const T &lookup(const ForwardKey &key) const { GMutablePointer value = values_.lookup_as(key); - const CPPType &type = *value.type(); - BLI_assert(type.is()); - T return_value; - type.copy_to_initialized(value.get(), &return_value); - return return_value; + BLI_assert(value.is_type()); + BLI_assert(value.get() != nullptr); + return *(const T *)value.get(); } template bool contains(const ForwardKey &key) const diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index d5fd3ff0abb..e648d77337b 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -133,11 +133,8 @@ class GeoNodeExecParams { /** * Get the input value for the input socket with the given identifier. - * - * This makes a copy of the value, which is fine for most types but should be avoided for - * geometry sets. */ - template T get_input(StringRef identifier) const + template const T &get_input(StringRef identifier) const { #ifdef DEBUG this->check_extract_input(identifier, &CPPType::get()); From f1f8074b8daaaaba0e90d9cfbaffc66d9c702fd3 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 18 Feb 2021 15:34:52 +0100 Subject: [PATCH 279/519] GPencil: Fix unreported broken use only lines in multiframe This option was broken since the draw engine refactor and it was impossible to display only edit lines for multiframe mode. --- source/blender/draw/engines/gpencil/gpencil_engine.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 153dcfb6ea7..57c69398ef2 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -140,7 +140,7 @@ void GPENCIL_engine_init(void *ved) /* For non active frame, use only lines in multiedit mode. */ const bool overlays_on = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0; - stl->pd->use_multiedit_lines_only = !overlays_on || + stl->pd->use_multiedit_lines_only = overlays_on && (v3d->gp_flag & V3D_GP_SHOW_MULTIEDIT_LINES) != 0; const bool shmode_xray_support = v3d->shading.type <= OB_SOLID; @@ -495,10 +495,10 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl, (!iter->pd->simplify_fill) && ((gps->flag & GP_STROKE_NOFILL) == 0); bool only_lines = gpl && gpf && gpl->actframe != gpf && iter->pd->use_multiedit_lines_only; - bool hide_onion = gpl && gpf && gpf->runtime.onion_id != 0 && - ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); - - if (hide_material || (!show_stroke && !show_fill) || (only_lines && hide_onion) || hide_onion) { + bool is_onion = gpl && gpf && gpf->runtime.onion_id != 0; + bool hide_onion = is_onion && ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); + if ((hide_material) || (!show_stroke && !show_fill) || (only_lines && !is_onion) || + (hide_onion)) { return; } From 74383a332b67d745c0d8ae8a422b13ef646a27ae Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Thu, 18 Feb 2021 08:09:08 -0700 Subject: [PATCH 280/519] Cleanup: Fix unused variable warning exception was not used and can be safely removed --- intern/cycles/render/shader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 847f97fb2bf..ea83073d5ce 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -807,7 +807,7 @@ static bool to_scene_linear_transform(OCIO::ConstConfigRcPtr &config, try { processor = config->getProcessor(OCIO::ROLE_SCENE_LINEAR, colorspace); } - catch (OCIO::Exception &exception) { + catch (OCIO::Exception &) { return false; } From bcb9e8e1a706dfb5b1ad20b7e3c019cae44cbbec Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 18 Feb 2021 16:15:45 +0100 Subject: [PATCH 281/519] Fix T85769: Grease Pencil Fill option when drawing no longer works The fill unclamped thickness value was not properly initialized for using with the new antialiasing. The error was introduced in commit 09f7c9385829 --- .../blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl index 59f07ccb82b..7412959a30b 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl @@ -615,6 +615,7 @@ void fill_vertex() strokeHardeness = 1.0; strokeThickness = 1e18; + unclampedThickness = 1e20; strokeAspect = vec2(1.0); strokePt1 = strokePt2 = vec2(0.0); From 10a54bbd06e3b1843b39b7bc55c24057dcaac41a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 13:26:39 +1100 Subject: [PATCH 282/519] Cleanup: spelling, correct doc-string arguments --- intern/cycles/blender/blender_mesh.cpp | 2 +- intern/cycles/util/util_simd.h | 2 +- source/blender/gpu/intern/gpu_framebuffer.cc | 4 ++-- source/blender/makesrna/intern/rna_userdef.c | 2 +- source/blender/python/gpu/gpu_py_buffer.c | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 14bdcd843e9..182aefa82ae 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -350,7 +350,7 @@ static void fill_generic_attribute(BL::Mesh &b_mesh, static void attr_create_generic(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision) { if (subdivision) { - /* TODO: Handle subdivison correctly. */ + /* TODO: Handle subdivision correctly. */ return; } AttributeSet &attributes = mesh->attributes; diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index d327b7298dc..718ec9266b1 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -290,7 +290,7 @@ __forceinline uint64_t bitscan(uint64_t v) # endif /* __KERNEL_64_BIT__ */ #elif (defined(__x86_64__) || defined(__i386__)) && defined(__KERNEL_SSE2__) -/* Instrinsic functions with x86 SSE. */ +/* Intrinsic functions with x86 SSE. */ __forceinline uint32_t __bsf(const uint32_t v) { diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 0dd7948532c..1e3cf479462 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -476,9 +476,9 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Framebuffer Stack +/** \name Frame-Buffer Stack * - * Keeps track of framebuffer binding operation to restore previously bound frambuffers. + * Keeps track of frame-buffer binding operation to restore previously bound frame-buffers. * \{ */ #define FRAMEBUFFER_STACK_DEPTH 16 diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index e8dd6e77d1f..7f7adc69dd1 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -4866,7 +4866,7 @@ static void rna_def_userdef_view(BlenderRNA *brna) "Translate the names of new data-blocks (objects, materials...)"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - /* Statusbar. */ + /* Status-bar. */ prop = RNA_def_property(srna, "show_statusbar_memory", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "statusbar_flag", STATUSBAR_SHOW_MEMORY); diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c index c8eaa9cd5c8..5939c822272 100644 --- a/source/blender/python/gpu/gpu_py_buffer.c +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -649,8 +649,8 @@ size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer) /** * Create a buffer object * - * \param dimensions: An array of ndimensions integers representing the size of each dimension. - * \param initbuffer: When not NULL holds a contiguous buffer + * \param shape: An array of `shape_len` integers representing the size of each dimension. + * \param buffer: When not NULL holds a contiguous buffer * with the correct format from which the buffer will be initialized */ BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, From e79916eb47a88cfb8dd8b238fd7e86d90b3459be Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 13:32:35 +1100 Subject: [PATCH 283/519] Cleanup: order shape_len after shape argument This matches nearly all other argument ordering in Blender, including Python mathutils API. --- source/blender/python/gpu/gpu_py_buffer.c | 4 ++-- source/blender/python/gpu/gpu_py_buffer.h | 2 +- source/blender/python/gpu/gpu_py_texture.c | 7 ++----- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c index 5939c822272..115f7ba923f 100644 --- a/source/blender/python/gpu/gpu_py_buffer.c +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -369,7 +369,7 @@ static PyObject *pygpu_buffer__tp_new(PyTypeObject *UNUSED(type), PyObject *args PyBuffer_Release(&pybuffer); } else { - buffer = BPyGPU_Buffer_CreatePyObject(pygpu_dataformat.value_found, shape_len, shape, NULL); + buffer = BPyGPU_Buffer_CreatePyObject(pygpu_dataformat.value_found, shape, shape_len, NULL); if (init && pygpu_buffer_ass_slice(buffer, 0, shape[0], init)) { Py_DECREF(buffer); return NULL; @@ -654,8 +654,8 @@ size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer) * with the correct format from which the buffer will be initialized */ BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, - const int shape_len, const Py_ssize_t *shape, + const int shape_len, void *buffer) { if (buffer == NULL) { diff --git a/source/blender/python/gpu/gpu_py_buffer.h b/source/blender/python/gpu/gpu_py_buffer.h index 003f1a52078..5eac5e3d309 100644 --- a/source/blender/python/gpu/gpu_py_buffer.h +++ b/source/blender/python/gpu/gpu_py_buffer.h @@ -48,6 +48,6 @@ typedef struct BPyGPUBuffer { size_t bpygpu_Buffer_size(BPyGPUBuffer *buffer); BPyGPUBuffer *BPyGPU_Buffer_CreatePyObject(const int format, - const int shape_len, const Py_ssize_t *shape, + const int shape_len, void *buffer); diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c index 2b1b5f672b0..85246bffac7 100644 --- a/source/blender/python/gpu/gpu_py_texture.c +++ b/source/blender/python/gpu/gpu_py_texture.c @@ -390,11 +390,8 @@ static PyObject *pygpu_texture_read(BPyGPUTexture *self) } void *buf = GPU_texture_read(self->tex, best_data_format, 0); - return (PyObject *)BPyGPU_Buffer_CreatePyObject( - best_data_format, - 2, - (Py_ssize_t[2]){GPU_texture_height(self->tex), GPU_texture_width(self->tex)}, - buf); + const Py_ssize_t shape[2] = {GPU_texture_height(self->tex), GPU_texture_width(self->tex)}; + return (PyObject *)BPyGPU_Buffer_CreatePyObject(best_data_format, shape, ARRAY_SIZE(shape), buf); } #ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD From aa2da44b829794beacb1b75b2dcd63ae156b5865 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 14:06:12 +1100 Subject: [PATCH 284/519] Cleanup: use doxy sections --- source/blender/editors/space_node/node_add.c | 37 +++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/space_node/node_add.c b/source/blender/editors/space_node/node_add.c index 699e5c1d165..e0de2393917 100644 --- a/source/blender/editors/space_node/node_add.c +++ b/source/blender/editors/space_node/node_add.c @@ -54,6 +54,10 @@ #include "node_intern.h" /* own include */ +/* -------------------------------------------------------------------- */ +/** \name Utilities + * \{ */ + /** * XXX Does some additional initialization on top of #nodeAddNode * Can be used with both custom and static nodes, @@ -93,7 +97,12 @@ bNode *node_add_node(const bContext *C, const char *idname, int type, float locx return node; } -/* ********************** Add reroute operator ***************** */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Reroute Operator + * \{ */ + static bool add_reroute_intersect_check(bNodeLink *link, float mcoords[][2], int tot, @@ -309,7 +318,11 @@ void NODE_OT_add_reroute(wmOperatorType *ot) RNA_def_int(ot->srna, "cursor", WM_CURSOR_CROSS, 0, INT_MAX, "Cursor", "", 0, INT_MAX); } -/* ****************** Add Node Group Operator ******************* */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Node Group Operator + * \{ */ static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain, wmOperator *op, @@ -402,7 +415,11 @@ void NODE_OT_add_group(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); } -/* ****************** Add File Node Operator ******************* */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add File Node Operator + * \{ */ static bool node_add_file_poll(bContext *C) { @@ -510,7 +527,11 @@ void NODE_OT_add_file(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); } -/* ****************** Add Mask Node Operator ******************* */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Mask Node Operator + * \{ */ static bool node_add_mask_poll(bContext *C) { @@ -571,7 +592,11 @@ void NODE_OT_add_mask(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign"); } -/********************** New node tree operator *********************/ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name New Node Tree Operator + * \{ */ static int new_node_tree_exec(bContext *C, wmOperator *op) { @@ -659,3 +684,5 @@ void NODE_OT_new_node_tree(wmOperatorType *ot) RNA_def_enum_funcs(prop, new_node_tree_type_itemf); RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME - 2, "Name", ""); } + +/** \} */ From 7e1159536483a8206614a667b99c52f8a3ec3c74 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 14:13:29 +1100 Subject: [PATCH 285/519] Cleanup: clang-format --- intern/cycles/render/attribute.h | 2 +- source/blender/python/gpu/gpu_py_vertex_buffer.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index c1be62addc0..18c9e5ab83a 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -179,7 +179,7 @@ class AttributeSet { Geometry *geometry; AttributePrimitive prim; list attributes; - bool modified = true; + bool modified = true; AttributeSet(Geometry *geometry, AttributePrimitive prim); AttributeSet(AttributeSet &&) = default; diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c index 160931393ed..dcea57e78dc 100644 --- a/source/blender/python/gpu/gpu_py_vertex_buffer.c +++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c @@ -91,8 +91,8 @@ static void pygpu_fill_format_elem(void *data_dst_void, PyObject *py_src, const /* No error checking, callers must run PyErr_Occurred */ static void pygpu_fill_format_sequence(void *data_dst_void, - PyObject *py_seq_fast, - const GPUVertAttr *attr) + PyObject *py_seq_fast, + const GPUVertAttr *attr) { const uint len = attr->comp_len; PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast); @@ -117,9 +117,9 @@ static void pygpu_fill_format_sequence(void *data_dst_void, #undef WARN_TYPE_LIMIT_POP static bool pygpu_vertbuf_fill_impl(GPUVertBuf *vbo, - uint data_id, - PyObject *seq, - const char *error_prefix) + uint data_id, + PyObject *seq, + const char *error_prefix) { const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u"; @@ -213,7 +213,10 @@ static bool pygpu_vertbuf_fill_impl(GPUVertBuf *vbo, return ok; } -static int pygpu_vertbuf_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix) +static int pygpu_vertbuf_fill(GPUVertBuf *buf, + int id, + PyObject *py_seq_data, + const char *error_prefix) { if (id < 0 || id >= GPU_vertbuf_get_format(buf)->attr_len) { PyErr_Format(PyExc_ValueError, "Format id %d out of range", id); From 9df92691730a78a0bd13fea8717479e2b2055bb0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 14:14:17 +1100 Subject: [PATCH 286/519] Cleanup: sort structs, file-lists --- source/blender/blenkernel/BKE_cryptomatte.h | 2 +- source/blender/blenkernel/BKE_node_ui_storage.hh | 4 ++-- source/blender/blenloader/intern/readfile.h | 2 +- source/blender/compositor/intern/COM_MetaData.h | 2 +- source/blender/editors/include/ED_render.h | 6 +++--- source/blender/editors/space_node/node_intern.h | 2 +- source/blender/editors/transform/transform_convert.h | 2 +- source/blender/imbuf/intern/IMB_colormanagement_intern.h | 2 +- source/blender/makesdna/DNA_node_types.h | 2 +- source/blender/nodes/CMakeLists.txt | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h index eb2de96a745..2b5a6a2044b 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.h +++ b/source/blender/blenkernel/BKE_cryptomatte.h @@ -31,9 +31,9 @@ extern "C" { #endif struct CryptomatteSession; -struct Material; struct ID; struct Main; +struct Material; struct Object; struct RenderResult; diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh index 0b8ef60a603..ac12999731a 100644 --- a/source/blender/blenkernel/BKE_node_ui_storage.hh +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -24,10 +24,10 @@ #include "DNA_modifier_types.h" #include "DNA_session_uuid_types.h" +struct ModifierData; +struct Object; struct bNode; struct bNodeTree; -struct Object; -struct ModifierData; using blender::Map; diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index e007d42b283..425932498f1 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -33,6 +33,7 @@ #include "DNA_windowmanager_types.h" /* for ReportType */ #include "zlib.h" +struct BLI_mmap_file; struct BLOCacheStorage; struct IDNameLib_Map; struct Key; @@ -41,7 +42,6 @@ struct Object; struct OldNewMap; struct ReportList; struct UserDef; -struct BLI_mmap_file; typedef struct IDNameLib_Map IDNameLib_Map; diff --git a/source/blender/compositor/intern/COM_MetaData.h b/source/blender/compositor/intern/COM_MetaData.h index 22988b0b7ee..c1e34df2791 100644 --- a/source/blender/compositor/intern/COM_MetaData.h +++ b/source/blender/compositor/intern/COM_MetaData.h @@ -25,8 +25,8 @@ #include "MEM_guardedalloc.h" /* Forward declarations. */ -struct StampData; struct RenderResult; +struct StampData; /* Cryptomatte includes hash in its meta data keys. The hash is generated from the render * layer/pass name. Compositing happens without the knowledge of the original layer and pass. The diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h index 9cdecc444c8..a49fe1aa544 100644 --- a/source/blender/editors/include/ED_render.h +++ b/source/blender/editors/include/ED_render.h @@ -29,16 +29,16 @@ extern "C" { #endif -struct bContext; -struct bScreen; struct DEGEditorUpdateContext; struct Depsgraph; struct ID; -struct Main; struct MTex; +struct Main; struct Render; struct Scene; struct ScrArea; +struct bContext; +struct bScreen; struct wmWindow; struct wmWindowManager; diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index a7704c5d22c..1566c1e8571 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -32,12 +32,12 @@ struct ARegion; struct ARegionType; struct Main; +struct NodeInsertOfsData; struct View2D; struct bContext; struct bNode; struct bNodeLink; struct bNodeSocket; -struct NodeInsertOfsData; struct wmGizmoGroupType; struct wmKeyConfig; struct wmWindow; diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index bd7569b3771..36a51d57f64 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -24,9 +24,9 @@ #pragma once -struct BezTriple; struct BMEditMesh; struct BMesh; +struct BezTriple; struct FCurve; struct ListBase; struct Object; diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index cc3f4879eea..31dca888732 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h @@ -31,8 +31,8 @@ extern "C" { #endif struct ImBuf; -struct OCIO_ConstProcessorRcPtr; struct OCIO_ConstCPUProcessorRcPtr; +struct OCIO_ConstProcessorRcPtr; extern float imbuf_luma_coefficients[3]; extern float imbuf_xyz_to_rgb[3][3]; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 3f1f8328cef..9633ef8e121 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -37,13 +37,13 @@ struct Collection; struct ID; struct Image; struct ListBase; +struct NodeTreeUIStorage; struct bGPdata; struct bNodeInstanceHash; struct bNodeLink; struct bNodePreview; struct bNodeTreeExec; struct bNodeType; -struct NodeTreeUIStorage; struct uiBlock; #define NODE_MAXSTR 64 diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 9fd578b625d..94b6148ff9b 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -148,9 +148,9 @@ set(SRC geometry/nodes/node_geo_attribute_fill.cc geometry/nodes/node_geo_attribute_math.cc geometry/nodes/node_geo_attribute_mix.cc - geometry/nodes/node_geo_attribute_sample_texture.cc geometry/nodes/node_geo_attribute_proximity.cc geometry/nodes/node_geo_attribute_randomize.cc + geometry/nodes/node_geo_attribute_sample_texture.cc geometry/nodes/node_geo_attribute_separate_xyz.cc geometry/nodes/node_geo_attribute_vector_math.cc geometry/nodes/node_geo_boolean.cc From afa5da9ce02bcd46f70d250943a933afe6de1d59 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 18 Feb 2021 15:45:08 +1100 Subject: [PATCH 287/519] Cleanup: remove check for non-annotation properties in classes This was added to assist upgrading scripts to Blender 2.8x, now 2.9x is released there is no need to keep this block. --- source/blender/python/intern/bpy_rna.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index c0f3ba30d93..4dfdba7758c 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -7977,31 +7977,6 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict) } } - if (ret == 0) { - /* This block can be removed once 2.8x is released and annotations are in use. */ - bool has_warning = false; - while (PyDict_Next(class_dict, &pos, &key, &item)) { - if (pyrna_is_deferred_prop(item)) { - if (!has_warning) { - printf( - "Warning: class %.200s " - "contains a property which should be an annotation!\n", - RNA_struct_identifier(srna)); - PyC_LineSpit(); - has_warning = true; - } - printf(" assign as a type annotation: %.200s.%.200s\n", - RNA_struct_identifier(srna), - PyUnicode_AsUTF8(key)); - } - ret = deferred_register_prop(srna, key, item); - - if (ret != 0) { - break; - } - } - } - return ret; } From 81ac0bf759d34e7de921784250d82540cb218718 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 18 Feb 2021 16:33:00 +0100 Subject: [PATCH 288/519] Fix failing "Edit Source" (asserts) while number slider was visible E.g. steps to reproduce: * Enter Vertex Paint mode * In the tool settings, right-click > "Edit Source" When creating a number slider via `layout.prop(..., slider=True)`, the UI code would reallocate the number button to be a number-slider button. That's because we now actually have different button data-structures for these (see e6f0b60c2e911). The edit source code stored data based on the button pointers, which didn't get updated after changing the type. The fix just adds this updating. --- source/blender/editors/include/UI_interface.h | 1 + source/blender/editors/interface/interface.c | 3 +++ source/blender/editors/interface/interface_ops.c | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 75100326fac..bc013953b1e 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -2545,6 +2545,7 @@ void UI_template_fix_linking(void); /* UI_OT_editsource helpers */ bool UI_editsource_enable_check(void); void UI_editsource_active_but_test(uiBut *but); +void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but); /* UI_butstore_ helpers */ typedef struct uiButStore uiButStore; diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 10cbc2dc5fa..711d67710ad 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3948,6 +3948,9 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type) UNUSED_VARS_NDEBUG(found_layout); ui_button_group_replace_but_ptr(uiLayoutGetBlock(but->layout), old_but_ptr, but); } + if (UI_editsource_enable_check()) { + UI_editsource_but_replace(old_but_ptr, but); + } } return but; diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 05a2a6ef29b..540e98f542e 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -1296,6 +1296,19 @@ void UI_editsource_active_but_test(uiBut *but) BLI_ghash_insert(ui_editsource_info->hash, but, but_store); } +/** + * Remove the editsource data for \a old_but and reinsert it for \a new_but. Use when the button + * was reallocated, e.g. to have a new type (#ui_but_change_type()). + */ +void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but) +{ + uiEditSourceButStore *but_store = BLI_ghash_lookup(ui_editsource_info->hash, old_but); + if (but_store) { + BLI_ghash_remove(ui_editsource_info->hash, old_but, NULL, NULL); + BLI_ghash_insert(ui_editsource_info->hash, new_but, but_store); + } +} + static int editsource_text_edit(bContext *C, wmOperator *op, const char filepath[FILE_MAX], From 62b8c2a66a379971f78c0ee0f6197fb7c3fb5a2b Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 18 Feb 2021 17:21:12 +0100 Subject: [PATCH 289/519] GPencil: Add missing edit lines in Multiframe mode When edit using Onion skin, the edit line was missing. --- source/blender/draw/engines/overlay/overlay_gpencil.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c index 19af3ae7e5d..891142fe0a2 100644 --- a/source/blender/draw/engines/overlay/overlay_gpencil.c +++ b/source/blender/draw/engines/overlay/overlay_gpencil.c @@ -85,7 +85,9 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata) (GPENCIL_VERTEX_MODE(gpd) && !use_vertex_mask)); const bool do_multiedit = GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); - const bool show_multi_edit_lines = (v3d->gp_flag & V3D_GP_SHOW_MULTIEDIT_LINES) != 0; + const bool show_multi_edit_lines = (do_multiedit) && + ((v3d->gp_flag & (V3D_GP_SHOW_MULTIEDIT_LINES | + V3D_GP_SHOW_EDIT_LINES)) != 0); const bool show_lines = (v3d->gp_flag & V3D_GP_SHOW_EDIT_LINES) || show_multi_edit_lines; From f3bf87e5887c6fedb6d8f995eb636695e3990353 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 18 Feb 2021 18:30:07 +0100 Subject: [PATCH 290/519] GPencil: Small frame evaluation speed up improvement Avoid look for frame if the actual frame is already available. --- source/blender/blenkernel/intern/gpencil_modifier.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index 8b12e1b5fca..6f1896f055a 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -656,10 +656,12 @@ static void gpencil_copy_activeframe_to_eval( LISTBASE_FOREACH (bGPDlayer *, gpl_orig, &gpd_orig->layers) { if (gpl_eval != NULL) { - int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig); + bGPDframe *gpf_orig = gpl_orig->actframe; - bGPDframe *gpf_orig = BKE_gpencil_layer_frame_get( - gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV); + int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl_orig); + if (gpf_orig && gpf_orig->framenum != remap_cfra) { + gpf_orig = BKE_gpencil_layer_frame_get(gpl_orig, remap_cfra, GP_GETFRAME_USE_PREV); + } if (gpf_orig != NULL) { int gpf_index = BLI_findindex(&gpl_orig->frames, gpf_orig); From c297bef9aff5d6eeea26ddd869f4dc03a34d3457 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Thu, 18 Feb 2021 18:57:19 +0100 Subject: [PATCH 291/519] Fix T85762: Crash when opening 2.83 VSE file Crash happened in versioning code on NULL dereference in function seq_convert_transform_crop() for Strip crop and transform fields. Strips created after rB1fd7b380f4cf were assumed to have crop and transform always initialized, but this wasn't the case. This has been fixed in 2.90, but not in versioning code. Initialize these fields if they are not initialized already. Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D10463 --- source/blender/blenloader/intern/versioning_290.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 840726e4add..d43c948cadb 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -124,6 +124,13 @@ static void seq_convert_transform_crop(const Scene *scene, Sequence *seq, const eSpaceSeq_Proxy_RenderSize render_size) { + if (seq->strip->transform == NULL) { + seq->strip->transform = MEM_callocN(sizeof(struct StripTransform), "StripTransform"); + } + if (seq->strip->crop == NULL) { + seq->strip->crop = MEM_callocN(sizeof(struct StripCrop), "StripCrop"); + } + StripCrop *c = seq->strip->crop; StripTransform *t = seq->strip->transform; int old_image_center_x = scene->r.xsch / 2; From d519b33b327607ad7835561d951559da8f79034e Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Thu, 18 Feb 2021 13:51:39 -0600 Subject: [PATCH 292/519] Fix T85410: Quick liquid domain alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When `Preferences → Editing → New Objects → Align To` is set to `3D Cursor`, the fluid domain added by `Object → Quick Effects → Quick Liquid` is aligned to the 3D cursor. This shouldn't be the case, since these aren't new objects created directly by the user. Differential Revision: https://developer.blender.org/D10467 --- release/scripts/startup/bl_operators/object_quick_effects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index 0600536cb66..48312f958ef 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -496,7 +496,7 @@ class QuickLiquid(Operator): obj_bb_minmax(obj, min_co, max_co) # add the liquid domain object - bpy.ops.mesh.primitive_cube_add() + bpy.ops.mesh.primitive_cube_add(align='WORLD') obj = context.active_object obj.name = "Liquid Domain" From 73f4dfa3c5fd2714ed2fff528588d0826995449e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 18 Feb 2021 13:58:27 -0600 Subject: [PATCH 293/519] Cleanup: Clang tidy else after return --- source/blender/python/gpu/gpu_py_buffer.c | 4 +--- source/blender/python/gpu/gpu_py_framebuffer.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/source/blender/python/gpu/gpu_py_buffer.c b/source/blender/python/gpu/gpu_py_buffer.c index 115f7ba923f..b89d2c6a69f 100644 --- a/source/blender/python/gpu/gpu_py_buffer.c +++ b/source/blender/python/gpu/gpu_py_buffer.c @@ -330,9 +330,7 @@ static PyObject *pygpu_buffer__tp_new(PyTypeObject *UNUSED(type), PyObject *args Py_DECREF(ob); return NULL; } - else { - shape[i] = PyLong_AsLong(ob); - } + shape[i] = PyLong_AsLong(ob); Py_DECREF(ob); if (shape[i] < 1) { diff --git a/source/blender/python/gpu/gpu_py_framebuffer.c b/source/blender/python/gpu/gpu_py_framebuffer.c index 487f0f984cb..04d49a9f15d 100644 --- a/source/blender/python/gpu/gpu_py_framebuffer.c +++ b/source/blender/python/gpu/gpu_py_framebuffer.c @@ -300,7 +300,7 @@ static PyObject *pygpu_framebuffer__tp_new(PyTypeObject *UNUSED(self), if (!pygpu_framebuffer_new_parse_arg(depth_attachment, &config[0])) { return NULL; } - else if (config[0].tex && !GPU_texture_depth(config[0].tex)) { + if (config[0].tex && !GPU_texture_depth(config[0].tex)) { PyErr_SetString(PyExc_ValueError, "Depth texture with incompatible format"); return NULL; } From 27fd066baf5531be178534f4d541bc457b94da1f Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 18 Feb 2021 13:59:08 -0600 Subject: [PATCH 294/519] Cleanup: Clang tidy inconsistent parameter name --- source/blender/compositor/COM_compositor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h index 6c8d372f587..ba66d7f0dfe 100644 --- a/source/blender/compositor/COM_compositor.h +++ b/source/blender/compositor/COM_compositor.h @@ -339,9 +339,9 @@ extern "C" { */ /* clang-format off */ -void COM_execute(RenderData *rd, +void COM_execute(RenderData *render_data, Scene *scene, - bNodeTree *editingtree, + bNodeTree *node_tree, int rendering, const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings, From a7c1aa245fc9d5f4e40437184764044aca5b8809 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 18 Feb 2021 17:53:08 -0600 Subject: [PATCH 295/519] Cleanup: Remove type from global namespace in C++ header --- source/blender/blenkernel/BKE_node_ui_storage.hh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh index ac12999731a..217f204f7bd 100644 --- a/source/blender/blenkernel/BKE_node_ui_storage.hh +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -29,8 +29,6 @@ struct Object; struct bNode; struct bNodeTree; -using blender::Map; - /** * Contains the context necessary to determine when to display settings for a certain node tree * that may be used for multiple modifiers and objects. The object name and modifier session UUID @@ -80,7 +78,7 @@ struct NodeUIStorage { }; struct NodeTreeUIStorage { - Map> context_map; + blender::Map> context_map; }; void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, From 4604350eefabbfeeb97347bc3e6a996750de15aa Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 18 Feb 2021 17:56:47 -0600 Subject: [PATCH 296/519] UI: Expand enum in collection info node --- source/blender/nodes/geometry/nodes/node_geo_collection_info.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc index d8e95faec27..8991a26ba4b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -35,7 +35,7 @@ static bNodeSocketTemplate geo_node_collection_info_out[] = { static void geo_node_collection_info_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "transform_space", 0, nullptr, ICON_NONE); + uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); } namespace blender::nodes { From eecb90d8d2ec68f4f3cb8b47ee9828dad5af60d6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 19 Feb 2021 11:13:35 +1100 Subject: [PATCH 297/519] PyAPI: bpy.utils.execfile temporarily overrides the __main__ module This is needed to support Python 3.10's `typing.get_type_hints`, to access the name-space used when creating the class. Also added a docstring for execfile. --- release/scripts/modules/bpy/utils/__init__.py | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py index d984a6f54a4..2b19d23a367 100644 --- a/release/scripts/modules/bpy/utils/__init__.py +++ b/release/scripts/modules/bpy/utils/__init__.py @@ -82,14 +82,39 @@ _is_factory_startup = _bpy.app.factory_startup def execfile(filepath, mod=None): - # module name isn't used or added to 'sys.modules'. - # passing in 'mod' allows re-execution without having to reload. + """ + Execute a file path as a Python script. + + :arg filepath: Path of the script to execute. + :type filepath: string + :arg mod: Optional cached module, the result of a previous execution. + :type mod: Module or None + :return: The module which can be passed back in as ``mod``. + :rtype: ModuleType + """ import importlib.util - mod_spec = importlib.util.spec_from_file_location("__main__", filepath) + mod_name = "__main__" + mod_spec = importlib.util.spec_from_file_location(mod_name, filepath) if mod is None: mod = importlib.util.module_from_spec(mod_spec) - mod_spec.loader.exec_module(mod) + + # While the module name is not added to `sys.modules`, it's important to temporarily + # include this so statements such as `sys.modules[cls.__module__].__dict__` behave as expected. + # See: https://bugs.python.org/issue9499 for details. + modules = _sys.modules + mod_orig = modules.get(mod_name, None) + modules[mod_name] = mod + + # No error supression, just ensure `sys.modules[mod_name]` is properly restored in the case of an error. + try: + mod_spec.loader.exec_module(mod) + finally: + if mod_orig is None: + modules.pop(mod_name, None) + else: + modules[mod_name] = mod_orig + return mod From e6acc4db72d99a3eb5039f6534dc8654873a6535 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Thu, 18 Feb 2021 22:51:24 -0500 Subject: [PATCH 298/519] Instead of raising an expection a warnign is generated instead. This fixes the issue where `['hair', 'pointcloud']` are disabled for release builds. In the future a better solution would be to generate the context map dynamically but this would require refactoring of the API: D9988 Fixes T80364 Differential revision: https://developer.blender.org/D10468 --- doc/python_api/sphinx_doc_gen.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 930e5b88911..12ffe5b6edf 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -81,6 +81,7 @@ import sys import inspect import shutil import logging +import warning from textwrap import indent @@ -1204,7 +1205,7 @@ def pycontext2sphinx(basepath): # for member in sorted(unique): # print(' "%s": ("", False),' % member) if len(context_type_map) > len(unique): - raise Exception( + warnings.warn( "Some types are not used: %s" % str([member for member in context_type_map if member not in unique])) else: From 62c1b33f5e790f9ec5b1ae64e0708ca1161a5bdf Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Thu, 18 Feb 2021 23:13:30 -0500 Subject: [PATCH 299/519] PyAPI Docs: Clarifiy vertex group index list paramater See T77920 --- source/blender/makesrna/intern/rna_object.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 01057ebaa07..8affee730ba 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2128,7 +2128,7 @@ static void rna_def_vertex_group(BlenderRNA *brna) RNA_def_function_ui_description(func, "Add vertices to the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); parm = RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight", 0.0f, 1.0f); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); @@ -2139,7 +2139,7 @@ static void rna_def_vertex_group(BlenderRNA *brna) RNA_def_function_ui_description(func, "Remove a vertex from the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); func = RNA_def_function(srna, "weight", "rna_VertexGroup_weight"); @@ -2186,14 +2186,14 @@ static void rna_def_face_map(BlenderRNA *brna) RNA_def_function_ui_description(func, "Add vertices to the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); func = RNA_def_function(srna, "remove", "rna_FaceMap_face_remove"); RNA_def_function_ui_description(func, "Remove a vertex from the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ - parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0); + parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); } From 7266d8e32a10dbe08f10d3aa27fe0eb8f07c074c Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Thu, 18 Feb 2021 23:55:23 -0500 Subject: [PATCH 300/519] PyAPI Docs: Fix deprecation warning with new theme version --- doc/python_api/sphinx_doc_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 12ffe5b6edf..1261ab7590a 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -1715,7 +1715,6 @@ except ModuleNotFoundError: fw("if html_theme == 'sphinx_rtd_theme':\n") fw(" html_theme_options = {\n") - fw(" 'canonical_url': 'https://docs.blender.org/api/current/',\n") # fw(" 'analytics_id': '',\n") # fw(" 'collapse_navigation': True,\n") fw(" 'sticky_navigation': False,\n") @@ -1727,6 +1726,7 @@ except ModuleNotFoundError: # not helpful since the source is generated, adds to upload size. fw("html_copy_source = False\n") fw("html_show_sphinx = False\n") + fw("html_baseurl = 'https://docs.blender.org/api/current/'\n") fw("html_use_opensearch = 'https://docs.blender.org/api/current'\n") fw("html_split_index = True\n") fw("html_static_path = ['static']\n") From 241273d36261a24bd71adb82da223b084b4589af Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 19 Feb 2021 01:58:16 -0500 Subject: [PATCH 301/519] API Docs: Fix generation failing with unused context members Instead of raising an expection a warnign is generated instead. This fixes the issue where `['hair', 'pointcloud']` are disabled for release builds. In the future a better solution would be to generate the context map dynamically but this would require refactoring of the API: D9988 --- doc/python_api/sphinx_doc_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 12ffe5b6edf..6d94c619bcf 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -81,7 +81,7 @@ import sys import inspect import shutil import logging -import warning +import warnings from textwrap import indent From 51c2ee434617188d3f3acd1abd1b788ce81179e6 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 10:32:39 +0100 Subject: [PATCH 302/519] Geometry Nodes: use corner domain for densities in Point Distribute node Previously, the density was set per point. That implies that when a point has a non-zero weight, points might be distributed in all connected polygons. By specifying the density per corner, this limitation is removed. Note, per-point density maps (such as vertex groups) can still be used. They will be adapted to the corner domain without loss of information. Differential Revision: https://developer.blender.org/D10461 --- .../nodes/node_geo_point_distribute.cc | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index 40187490c23..9b36090b6a0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -100,18 +100,21 @@ static void sample_mesh_surface(const Mesh &mesh, for (const int looptri_index : looptris.index_range()) { const MLoopTri &looptri = looptris[looptri_index]; - const int v0_index = mesh.mloop[looptri.tri[0]].v; - const int v1_index = mesh.mloop[looptri.tri[1]].v; - const int v2_index = mesh.mloop[looptri.tri[2]].v; + const int v0_loop = looptri.tri[0]; + const int v1_loop = looptri.tri[1]; + const int v2_loop = looptri.tri[2]; + const int v0_index = mesh.mloop[v0_loop].v; + const int v1_index = mesh.mloop[v1_loop].v; + const int v2_index = mesh.mloop[v2_loop].v; const float3 v0_pos = mesh.mvert[v0_index].co; const float3 v1_pos = mesh.mvert[v1_index].co; const float3 v2_pos = mesh.mvert[v2_index].co; float looptri_density_factor = 1.0f; if (density_factors != nullptr) { - const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_index]); - const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_index]); - const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_index]); + const float v0_density_factor = std::max(0.0f, (*density_factors)[v0_loop]); + const float v1_density_factor = std::max(0.0f, (*density_factors)[v1_loop]); + const float v2_density_factor = std::max(0.0f, (*density_factors)[v2_loop]); looptri_density_factor = (v0_density_factor + v1_density_factor + v2_density_factor) / 3.0f; } const float area = area_tri_v3(v0_pos, v1_pos, v2_pos); @@ -196,13 +199,13 @@ BLI_NOINLINE static void update_elimination_mask_based_on_density_factors( const MLoopTri &looptri = looptris[looptri_indices[i]]; const float3 bary_coord = bary_coords[i]; - const int v0_index = mesh.mloop[looptri.tri[0]].v; - const int v1_index = mesh.mloop[looptri.tri[1]].v; - const int v2_index = mesh.mloop[looptri.tri[2]].v; + const int v0_loop = looptri.tri[0]; + const int v1_loop = looptri.tri[1]; + const int v2_loop = looptri.tri[2]; - const float v0_density_factor = std::max(0.0f, density_factors[v0_index]); - const float v1_density_factor = std::max(0.0f, density_factors[v1_index]); - const float v2_density_factor = std::max(0.0f, density_factors[v2_index]); + const float v0_density_factor = std::max(0.0f, density_factors[v0_loop]); + const float v1_density_factor = std::max(0.0f, density_factors[v1_loop]); + const float v2_density_factor = std::max(0.0f, density_factors[v2_loop]); const float probablity = v0_density_factor * bary_coord.x + v1_density_factor * bary_coord.y + v2_density_factor * bary_coord.z; @@ -449,7 +452,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) } const FloatReadAttribute density_factors = mesh_component.attribute_get_for_read( - density_attribute, ATTR_DOMAIN_POINT, 1.0f); + density_attribute, ATTR_DOMAIN_CORNER, 1.0f); const int seed = params.get_input("Seed"); Vector positions; From 47fc1e11db68e2d4c565156552beb87f98bbb927 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 11:27:40 +0100 Subject: [PATCH 303/519] Nodes: ensure ui storage implicitely This makes it easier to use the api. --- source/blender/blenkernel/BKE_node_ui_storage.hh | 2 -- source/blender/blenkernel/intern/node_ui_storage.cc | 4 ++-- source/blender/nodes/intern/node_geometry_exec.cc | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh index 217f204f7bd..2084382aac5 100644 --- a/source/blender/blenkernel/BKE_node_ui_storage.hh +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -84,8 +84,6 @@ struct NodeTreeUIStorage { void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, const NodeTreeEvaluationContext &context); -void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree); - void BKE_nodetree_error_message_add(bNodeTree &ntree, const NodeTreeEvaluationContext &context, const bNode &node, diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc index 4c8a5c824c4..e95d1ca3ef1 100644 --- a/source/blender/blenkernel/intern/node_ui_storage.cc +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -31,7 +31,7 @@ using blender::Map; using blender::StringRef; using blender::Vector; -void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree) +static void ui_storage_ensure(bNodeTree &ntree) { if (ntree.ui_storage == nullptr) { ntree.ui_storage = new NodeTreeUIStorage(); @@ -89,7 +89,7 @@ void BKE_nodetree_error_message_add(bNodeTree &ntree, const NodeWarningType type, std::string message) { - BLI_assert(ntree.ui_storage != nullptr); + ui_storage_ensure(ntree); NodeTreeUIStorage &ui_storage = *ntree.ui_storage; node_error_message_log(ntree, node, message, type); diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index ebbb6f60b78..532f9955a62 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -37,8 +37,6 @@ void GeoNodeExecParams::error_message_add(const NodeWarningType type, std::strin } bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); - BKE_nodetree_ui_storage_ensure(*btree_original); - const NodeTreeEvaluationContext context(*self_object_, *modifier_); BKE_nodetree_error_message_add( From 359d0029fe7601163c449730d42f12d84163fcd8 Mon Sep 17 00:00:00 2001 From: Wannes Malfait Date: Fri, 19 Feb 2021 11:37:15 +0100 Subject: [PATCH 304/519] Fix T85763: Align Rotation to Vector node fails for collinear vectors If the axes are aligned in auto pivot mode then the rotation axis would be (0,0,0). We now fall back to the x axis in this case. If that fails, we fall back to the y axis. Differential Revision: https://developer.blender.org/D10466 --- .../nodes/node_geo_align_rotation_to_vector.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index a81adbbd754..3da447af98a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -65,7 +65,15 @@ static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors, mul_v3_m3v3(old_axis, old_rotation, local_main_axis); const float3 new_axis = vector.normalized(); - const float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis); + float3 rotation_axis = float3::cross_high_precision(old_axis, new_axis); + if (is_zero_v3(rotation_axis)) { + /* The vectors are linearly dependent, so we fall back to another axis. */ + rotation_axis = float3::cross_high_precision(old_axis, float3(1, 0, 0)); + if (is_zero_v3(rotation_axis)) + /* This is now guaranteed to not be zero. */ + rotation_axis = float3::cross_high_precision(old_axis, float3(0, 1, 0)); + } + const float full_angle = angle_normalized_v3v3(old_axis, new_axis); const float angle = factors[i] * full_angle; From 55c1021be4493bd1e7335da96fffdc796359a3f7 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 12:03:21 +0100 Subject: [PATCH 305/519] Cleanup: extract function to get node ui storage This function will be used by multiple functions. --- .../blenkernel/intern/node_ui_storage.cc | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc index e95d1ca3ef1..7bf8895262d 100644 --- a/source/blender/blenkernel/intern/node_ui_storage.cc +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -83,22 +83,30 @@ static void node_error_message_log(bNodeTree &ntree, } } -void BKE_nodetree_error_message_add(bNodeTree &ntree, - const NodeTreeEvaluationContext &context, - const bNode &node, - const NodeWarningType type, - std::string message) +static NodeUIStorage &find_node_ui_storage(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node) { ui_storage_ensure(ntree); NodeTreeUIStorage &ui_storage = *ntree.ui_storage; - node_error_message_log(ntree, node, message, type); - Map &node_tree_ui_storage = ui_storage.context_map.lookup_or_add_default(context); NodeUIStorage &node_ui_storage = node_tree_ui_storage.lookup_or_add_default_as( StringRef(node.name)); + return node_ui_storage; +} + +void BKE_nodetree_error_message_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const NodeWarningType type, + std::string message) +{ + node_error_message_log(ntree, node, message, type); + + NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node); node_ui_storage.warnings.append({type, std::move(message)}); } From 80e5697b0ba8e5ce2a918980bc8d63668656afba Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 12:05:59 +0100 Subject: [PATCH 306/519] Cleanup: fix asan warnings --- source/blender/blenkernel/intern/node.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index f455f83f5c5..248d2776678 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -1421,18 +1421,24 @@ static void socket_id_user_decrement(bNodeSocket *sock) switch ((eNodeSocketDatatype)sock->type) { case SOCK_OBJECT: { bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_IMAGE: { bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_COLLECTION: { bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *) sock->default_value; - id_us_min(&default_value->value->id); + if (default_value->value != nullptr) { + id_us_min(&default_value->value->id); + } break; } case SOCK_FLOAT: From eafcbbb4f741cab7990f17eb07aab0843b242ebd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 19 Feb 2021 19:08:28 +1100 Subject: [PATCH 307/519] PyAPI: use real module for bpy.types This is needed to support `typing.get_type_hints`, which expects each classes module to have a module '__dict__'. --- source/blender/python/intern/bpy_rna.c | 121 +++++++++++-------------- source/blender/python/intern/bpy_rna.h | 3 - 2 files changed, 53 insertions(+), 71 deletions(-) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 4dfdba7758c..c48a50c5ec6 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -90,6 +90,9 @@ BPy_StructRNA *bpy_context_module = NULL; /* for fast access */ static PyObject *pyrna_struct_Subtype(PointerRNA *ptr); static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self); +static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class); +static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class); + #define BPY_DOC_ID_PROP_TYPE_NOTE \ " .. note::\n" \ "\n" \ @@ -7657,11 +7660,26 @@ PyObject *BPY_rna_doc(void) } #endif -/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type - * the self->ptr and self->prop are always set to the "structs" collection */ -/* ---------------getattr-------------------------------------------- */ -static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname) +/* -------------------------------------------------------------------- */ +/** \name RNA Types Module `bpy.types` + * \{ */ + +/** + * This could be a static variable as we only have one `bpy.types` module, + * it just keeps the data isolated to store in the module it's self. + * + * This data doesn't chance one initialized. + */ +struct BPy_TypesModule_State { + /** `RNA_BlenderRNA`. */ + PointerRNA ptr; + /** `RNA_BlenderRNA.structs`, exposed as `bpy.types` */ + PropertyRNA *prop; +}; + +static PyObject *bpy_types_module_getattro(PyObject *self, PyObject *pyname) { + struct BPy_TypesModule_State *state = PyModule_GetState(self); PointerRNA newptr; PyObject *ret; const char *name = PyUnicode_AsUTF8(pyname); @@ -7670,7 +7688,7 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string"); ret = NULL; } - else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) { + else if (RNA_property_collection_lookup_string(&state->ptr, state->prop, name, &newptr)) { ret = pyrna_struct_Subtype(&newptr); if (ret == NULL) { PyErr_Format(PyExc_RuntimeError, @@ -7692,79 +7710,52 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname return ret; } -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self); -static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class); -static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class); - -static struct PyMethodDef pyrna_basetype_methods[] = { - {"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""}, - {NULL, NULL, 0, NULL}, -}; - -/* Used to call ..._keys() direct, but we need to filter out operator subclasses. */ -#if 0 -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self) -{ - PyObject *list; -# if 0 - PyMethodDef *meth; -# endif - - list = pyrna_prop_collection_keys(self); /* Like calling structs.keys(), avoids looping here. */ - -# if 0 /* For now only contains __dir__. */ - for (meth = pyrna_basetype_methods; meth->ml_name; meth++) { - PyList_APPEND(list, PyUnicode_FromString(meth->ml_name)); - } -# endif - return list; -} - -#else - -static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self) +static PyObject *bpy_types_module_dir(PyObject *self) { + struct BPy_TypesModule_State *state = PyModule_GetState(self); PyObject *ret = PyList_New(0); - RNA_PROP_BEGIN (&self->ptr, itemptr, self->prop) { + RNA_PROP_BEGIN (&state->ptr, itemptr, state->prop) { StructRNA *srna = itemptr.data; PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna))); } RNA_PROP_END; - return ret; } -#endif +static struct PyMethodDef bpy_types_module_methods[] = { + {"__getattr__", (PyCFunction)bpy_types_module_getattro, METH_O, NULL}, + {"__dir__", (PyCFunction)bpy_types_module_dir, METH_NOARGS, NULL}, + {NULL, NULL, 0, NULL}, +}; -static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE; +PyDoc_STRVAR(bpy_types_module_doc, "Access to internal Blender types"); +static struct PyModuleDef bpy_types_module_def = { + PyModuleDef_HEAD_INIT, + "bpy.types", /* m_name */ + bpy_types_module_doc, /* m_doc */ + sizeof(struct BPy_TypesModule_State), /* m_size */ + bpy_types_module_methods, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; /** * Accessed from Python as 'bpy.types' */ PyObject *BPY_rna_types(void) { - BPy_BaseTypeRNA *self; + PyObject *submodule = PyModule_Create(&bpy_types_module_def); + struct BPy_TypesModule_State *state = PyModule_GetState(submodule); - if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY) == 0) { - pyrna_basetype_Type.tp_name = "RNA_Types"; - pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA); - pyrna_basetype_Type.tp_getattro = (getattrofunc)pyrna_basetype_getattro; - pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT; - pyrna_basetype_Type.tp_methods = pyrna_basetype_methods; - - if (PyType_Ready(&pyrna_basetype_Type) < 0) { - return NULL; - } - } - - /* Static members for the base class. */ - /* Add __name__ since help() expects it. */ - PyDict_SetItem(pyrna_basetype_Type.tp_dict, bpy_intern_str___name__, bpy_intern_str_bpy_types); + RNA_blender_rna_pointer_create(&state->ptr); + state->prop = RNA_struct_find_property(&state->ptr, "structs"); /* Internal base types we have no other accessors for. */ { - PyTypeObject *pyrna_types[] = { + static PyTypeObject *pyrna_types[] = { &pyrna_struct_meta_idprop_Type, &pyrna_struct_Type, &pyrna_prop_Type, @@ -7773,23 +7764,17 @@ PyObject *BPY_rna_types(void) &pyrna_func_Type, }; + PyObject *submodule_dict = PyModule_GetDict(submodule); for (int i = 0; i < ARRAY_SIZE(pyrna_types); i += 1) { - PyDict_SetItemString( - pyrna_basetype_Type.tp_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]); + PyDict_SetItemString(submodule_dict, pyrna_types[i]->tp_name, (PyObject *)pyrna_types[i]); } } - self = (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type); - - /* Avoid doing this lookup for every getattr. */ - RNA_blender_rna_pointer_create(&self->ptr); - self->prop = RNA_struct_find_property(&self->ptr, "structs"); -#ifdef USE_WEAKREFS - self->in_weakreflist = NULL; -#endif - return (PyObject *)self; + return submodule; } +/** \} */ + StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix) { BPy_StructRNA *py_srna = NULL; diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index a2c2171d151..e891f5c1fc1 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -177,9 +177,6 @@ typedef struct { FunctionRNA *func; } BPy_FunctionRNA; -/* cheap trick */ -#define BPy_BaseTypeRNA BPy_PropertyRNA - StructRNA *srna_from_self(PyObject *self, const char *error_prefix); StructRNA *pyrna_struct_as_srna(PyObject *self, const bool parent, const char *error_prefix); From dc61a63e3f1bb3773677fb009fd787af7bd5c727 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 19 Feb 2021 19:10:48 +1100 Subject: [PATCH 308/519] PyAPI: include all members in dir(bpy.types) C/Python defined types were accessible but not exposed in dir(bpy.types) --- source/blender/python/intern/bpy_rna.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index c48a50c5ec6..ad185226aa5 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -7720,6 +7720,14 @@ static PyObject *bpy_types_module_dir(PyObject *self) PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna))); } RNA_PROP_END; + + /* Include the modules `__dict__` for Python only types. */ + PyObject *submodule_dict = PyModule_GetDict(self); + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(submodule_dict, &pos, &key, &value)) { + PyList_APPEND(ret, key); + } return ret; } From ed070dd51d4805f0af57acad02abf93ab80872a6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 19 Feb 2021 20:54:06 +1100 Subject: [PATCH 309/519] Docs: corrections to vertex group & face-map docstrings Address issue raised by T77920 --- source/blender/makesrna/intern/rna_object.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 8affee730ba..799d1e8190c 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2136,7 +2136,7 @@ static void rna_def_vertex_group(BlenderRNA *brna) RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); func = RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove"); - RNA_def_function_ui_description(func, "Remove a vertex from the group"); + RNA_def_function_ui_description(func, "Remove vertices from the group"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); @@ -2183,14 +2183,14 @@ static void rna_def_face_map(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Index", "Index number of the face map"); func = RNA_def_function(srna, "add", "rna_FaceMap_face_add"); - RNA_def_function_ui_description(func, "Add vertices to the group"); + RNA_def_function_ui_description(func, "Add faces to the face-map"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED); func = RNA_def_function(srna, "remove", "rna_FaceMap_face_remove"); - RNA_def_function_ui_description(func, "Remove a vertex from the group"); + RNA_def_function_ui_description(func, "Remove faces from the face-map"); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* TODO, see how array size of 0 works, this shouldn't be used */ parm = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "List of indices", 0, 0); From 14f1d8962f6c8ab609daff3cca1702b35eee5b68 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 12:29:37 +0100 Subject: [PATCH 310/519] Geometry Nodes: add method to get all geometry components in a set Previously, functions would have to ask for every geometry type explicitely. Using a vector is return type is fine. In practice this will probably never allocate because of the small buffer optimization in vector. --- source/blender/blenkernel/BKE_geometry_set.hh | 2 ++ source/blender/blenkernel/intern/geometry_set.cc | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 02b3c88183a..5b1882d0d4c 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -308,6 +308,8 @@ struct GeometrySet { void add(const GeometryComponent &component); + blender::Vector get_components_for_read() const; + void compute_boundbox_without_instances(blender::float3 *r_min, blender::float3 *r_max) const; friend std::ostream &operator<<(std::ostream &stream, const GeometrySet &geometry_set); diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index 74d8b9afd82..0274dfdbd1c 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -160,6 +160,18 @@ void GeometrySet::add(const GeometryComponent &component) components_.add_new(component.type(), std::move(component_ptr)); } +/** + * Get all geometry components in this geometry set for read-only access. + */ +Vector GeometrySet::get_components_for_read() const +{ + Vector components; + for (const GeometryComponentPtr &ptr : components_.values()) { + components.append(ptr.get()); + } + return components; +} + void GeometrySet::compute_boundbox_without_instances(float3 *r_min, float3 *r_max) const { const PointCloud *pointcloud = this->get_pointcloud_for_read(); From e2caca1796088de03d66edfd7e8b5d2744df434d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 12:30:13 +0100 Subject: [PATCH 311/519] Nodes: only show warning icon if there are warnings --- source/blender/editors/space_node/node_draw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index c5eb1567bc4..8248283b3b0 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -1282,7 +1282,7 @@ static void node_add_error_message_button( const bContext *C, bNodeTree &ntree, bNode &node, const rctf &rect, float &icon_offset) { const NodeUIStorage *node_ui_storage = node_ui_storage_get_from_context(C, ntree, node); - if (node_ui_storage == nullptr) { + if (node_ui_storage == nullptr || node_ui_storage->warnings.is_empty()) { return; } From 3ae7a0f0592c3011024826d66dae0c8f5d03eaa7 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 12:31:27 +0100 Subject: [PATCH 312/519] Cleanup: typo --- source/blender/editors/space_node/node_draw.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 8248283b3b0..d0b62463ad9 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -1229,7 +1229,7 @@ static NodeWarningType node_error_highest_priority(Span warnings) return highest_priority_type; } -static char *node_errrors_tooltip_fn(bContext *UNUSED(C), void *argN, const char *UNUSED(tip)) +static char *node_errors_tooltip_fn(bContext *UNUSED(C), void *argN, const char *UNUSED(tip)) { const NodeUIStorage **storage_pointer_alloc = static_cast(argN); const NodeUIStorage *node_ui_storage = *storage_pointer_alloc; @@ -1310,7 +1310,7 @@ static void node_add_error_message_button( 0, 0, nullptr); - UI_but_func_tooltip_set(but, node_errrors_tooltip_fn, storage_pointer_alloc); + UI_but_func_tooltip_set(but, node_errors_tooltip_fn, storage_pointer_alloc); UI_block_emboss_set(node.block, UI_EMBOSS); } From 94cd52a162621e009a9e65f426b05f2c62389dc1 Mon Sep 17 00:00:00 2001 From: Peter Fog Date: Fri, 19 Feb 2021 13:37:31 +0100 Subject: [PATCH 313/519] VSE: Fix duplicate menu entries Commit rBf448ff2afe7a accidentally added menu entries that were removed. `use_zoom_to_fit` is duplicated in menu, others were moved to overlays menu. Remove these entries. Reviewed By: ISS, campbellbarton Differential Revision: https://developer.blender.org/D10453 --- release/scripts/startup/bl_ui/space_sequencer.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 79f88b1b67d..8656dc3b409 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -408,17 +408,6 @@ class SEQUENCER_MT_view(Menu): if context.preferences.view.show_developer_ui: layout.menu("SEQUENCER_MT_view_cache", text="Show Cache") - if is_preview: - layout.separator() - if st.display_mode == 'IMAGE': - layout.prop(st, "use_zoom_to_fit") - layout.prop(ed, "show_overlay", text="Show Frame Overlay") - layout.prop(st, "show_safe_areas", text="Show Safe Areas") - layout.prop(st, "show_metadata", text="Show Metadata") - layout.prop(st, "show_annotation", text="Show Annotations") - elif st.display_mode == 'WAVEFORM': - layout.prop(st, "show_separate_color", text="Show Separate Color Channels") - layout.separator() layout.operator("render.opengl", text="Sequence Render Image", icon='RENDER_STILL').sequencer = True From b6f9f83daf58e57856f0a2cb8ed47f2a806c41b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 19 Feb 2021 14:33:28 +0100 Subject: [PATCH 314/519] CMake/Deps: Mesa, harvest lib files from new location The upgraded Mesa (see D10282) stores library files in `mesa/lib64`. --- build_files/build_environment/cmake/harvest.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 93e6fbbf393..388c8adb5dc 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -193,7 +193,7 @@ harvest(haru/lib haru/lib "*.a") if(UNIX AND NOT APPLE) harvest(libglu/lib mesa/lib "*.so*") - harvest(mesa/lib mesa/lib "*.so*") + harvest(mesa/lib64 mesa/lib "*.so*") endif() endif() From 2b8c2438e4248b0fbacffc57649d39fa35ba6d0e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 08:07:18 -0600 Subject: [PATCH 315/519] Cleanup: Use braces after if statement --- .../nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index 3da447af98a..9f898cc545b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -69,9 +69,10 @@ static void align_rotations_auto_pivot(const Float3ReadAttribute &vectors, if (is_zero_v3(rotation_axis)) { /* The vectors are linearly dependent, so we fall back to another axis. */ rotation_axis = float3::cross_high_precision(old_axis, float3(1, 0, 0)); - if (is_zero_v3(rotation_axis)) + if (is_zero_v3(rotation_axis)) { /* This is now guaranteed to not be zero. */ rotation_axis = float3::cross_high_precision(old_axis, float3(0, 1, 0)); + } } const float full_angle = angle_normalized_v3v3(old_axis, new_axis); From 0d94695cc458b1f7666104314b57b174f0ee93d1 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Fri, 19 Feb 2021 16:18:09 +0100 Subject: [PATCH 316/519] Fix T85745: Render grease pencil with time offset modifier fails The problem was introduced fixing task T85035. As the frame was set again when render, if there was a time modifier, the frame was not remaped to the right frame number. --- .../blender/draw/engines/gpencil/gpencil_engine.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 4f8f1f7a456..5eaeeca8bab 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -23,6 +23,7 @@ #include "DRW_render.h" #include "BKE_gpencil.h" +#include "BKE_gpencil_modifier.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_object.h" @@ -621,11 +622,20 @@ void GPENCIL_cache_populate(void *ved, Object *ob) bool do_onion = (!pd->is_render) ? pd->do_onion : (gpd->onion_flag & GP_ONION_GHOST_ALWAYS); gpd->runtime.playing = (short)pd->playing; - /* When render in background the active frame could not be properly set due thread priority + /* When render in background the active frame could not be properly set due thread priority, * better set again. This is not required in viewport. */ if (txl->render_depth_tx) { + const bool time_remap = BKE_gpencil_has_time_modifiers(ob); + const DRWContextState *draw_ctx = DRW_context_state_get(); + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); + /* If there is a time modifier, need remap the time before. */ + if (time_remap) { + gpl->actframe = BKE_gpencil_frame_retime_get(draw_ctx->depsgraph, pd->scene, ob, gpl); + } + else { + gpl->actframe = BKE_gpencil_layer_frame_get(gpl, pd->cfra, GP_GETFRAME_USE_PREV); + } } } From 1f5647c07d15d2b298b491ebe260a411f7b0d1b8 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 10:11:35 -0600 Subject: [PATCH 317/519] UI: FModifier layout updates, drag and drop This patch implements the list panel system D7490 for FCurve modifiers. The UI layouts are updated to make use of subpanels and to be consistent with the rest of the interface, and easier to understand. See the differential revision for screenshots. This commit also significantly cleans up the FModifier UI code, and improves, mainly by replacing the old button creation code is with the newer interface API using RNA. In turn there is a bit of complexity added because each FModifier has a separate panel. Although reordering of FModifiers was not implemented before, we get drag and drop basically for free here, so it is also included. As noted in some older to do tasks, FModifiers aren't evaluated in perfect order, which may be a point of improvement for the future. Differential Revision: https://developer.blender.org/D7997 --- source/blender/blenkernel/intern/fmodifier.c | 3 +- .../blenloader/intern/versioning_290.c | 13 + .../blender/editors/animation/fmodifier_ui.c | 1445 ++++++++--------- source/blender/editors/include/ED_anim_api.h | 28 +- .../editors/space_graph/graph_buttons.c | 37 +- .../blender/editors/space_nla/nla_buttons.c | 37 +- source/blender/makesdna/DNA_anim_types.h | 11 +- source/blender/makesrna/intern/rna_fcurve.c | 21 +- 8 files changed, 798 insertions(+), 797 deletions(-) diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index d0018a556ba..4cd49987a83 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -32,6 +32,7 @@ #include "CLG_log.h" #include "DNA_anim_types.h" +#include "DNA_screen_types.h" #include "BLT_translation.h" @@ -1133,7 +1134,7 @@ FModifier *add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu) /* add modifier itself */ fcm = MEM_callocN(sizeof(FModifier), "F-Curve Modifier"); fcm->type = type; - fcm->flag = FMODIFIER_FLAG_EXPANDED; + fcm->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT; /* Expand the main panel, not the subpanels. */ fcm->curve = owner_fcu; fcm->influence = 1.0f; BLI_addtail(modifiers, fcm); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 089886a1c25..728235e84bf 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1748,6 +1748,19 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + /* Add subpanels for FModifiers, which requires a field to store expansion. */ + if (!DNA_struct_elem_find(fd->filesdna, "FModifier", "short", "ui_expand_flag")) { + LISTBASE_FOREACH (bAction *, act, &bmain->actions) { + LISTBASE_FOREACH (FCurve *, fcu, &act->curves) { + LISTBASE_FOREACH (FModifier *, fcm, &fcu->modifiers) { + SET_FLAG_FROM_TEST(fcm->ui_expand_flag, + fcm->flag & FMODIFIER_FLAG_EXPANDED, + UI_PANEL_DATA_EXPAND_ROOT); + } + } + } + } + /* Keep this block, even when empty. */ } } diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index deebf1d1efc..c17d678d866 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -32,6 +32,7 @@ #include "DNA_anim_types.h" #include "DNA_scene_types.h" +#include "DNA_space_types.h" #include "MEM_guardedalloc.h" @@ -42,6 +43,7 @@ #include "BKE_context.h" #include "BKE_fcurve.h" +#include "BKE_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -56,8 +58,193 @@ #include "DEG_depsgraph.h" -/* ********************************************** */ -/* UI STUFF */ +typedef void (*PanelDrawFn)(const bContext *, struct Panel *); +static void fmodifier_panel_header(const bContext *C, Panel *panel); + +/* -------------------------------------------------------------------- */ +/** \name Panel Registering and Panel Callbacks + * \{ */ + +/** + * Get the list of FModifiers from the context (either the NLA or graph editor). + */ +static ListBase *fmodifier_list_space_specific(const bContext *C) +{ + ScrArea *area = CTX_wm_area(C); + + if (area->spacetype == SPACE_GRAPH) { + FCurve *fcu = ANIM_graph_context_fcurve(C); + return &fcu->modifiers; + } + + if (area->spacetype == SPACE_NLA) { + NlaStrip *strip = ANIM_nla_context_strip(C); + return &strip->modifiers; + } + + /* This should not be called in any other space. */ + BLI_assert(false); + return NULL; +} + +/** + * Get a pointer to the panel's FModifier, and also its owner ID if \a r_owner_id is not NULL. + * Also in the graph editor, gray out the panel if the FModifier's FCurve has modifiers turned off. + */ +static PointerRNA *fmodifier_get_pointers(const bContext *C, const Panel *panel, ID **r_owner_id) +{ + PointerRNA *ptr = UI_panel_custom_data_get(panel); + + if (r_owner_id != NULL) { + *r_owner_id = ptr->owner_id; + } + + if (C != NULL && CTX_wm_space_graph(C)) { + FCurve *fcu = ANIM_graph_context_fcurve(C); + uiLayoutSetActive(panel->layout, !(fcu->flag & FCURVE_MOD_OFF)); + } + + return ptr; +} + +/** + * Move an FModifier to the index it's moved to after a drag and drop. + */ +static void fmodifier_reorder(bContext *C, Panel *panel, int new_index) +{ + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, &owner_id); + FModifier *fcm = ptr->data; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(fcm->type); + + /* Cycles modifier has to be the first, so make sure it's kept that way. */ + if (fmi->requires & FMI_REQUIRES_ORIGINAL_DATA) { + WM_report(RPT_ERROR, "Modifier requires original data"); + return; + } + + ListBase *modifiers = fmodifier_list_space_specific(C); + + /* Again, make sure we don't move a modifier before a cycles modifier. */ + FModifier *fcm_first = modifiers->first; + const FModifierTypeInfo *fmi_first = get_fmodifier_typeinfo(fcm_first->type); + if (fmi_first->requires & FMI_REQUIRES_ORIGINAL_DATA && new_index == 0) { + WM_report(RPT_ERROR, "Modifier requires original data"); + return; + } + + int current_index = BLI_findindex(modifiers, fcm); + BLI_assert(current_index >= 0); + BLI_assert(new_index >= 0); + + /* Don't do anything if the drag didn't change the index. */ + if (current_index == new_index) { + return; + } + + /* Move the FModifier in the list. */ + BLI_listbase_link_move(modifiers, fcm, new_index - current_index); + + ED_undo_push(C, "Reorder F-Curve Modifier"); + + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION); +} + +static short get_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel) +{ + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL); + FModifier *fcm = (FModifier *)ptr->data; + + return fcm->ui_expand_flag; +} + +static void set_fmodifier_expand_flag(const bContext *UNUSED(C), Panel *panel, short expand_flag) +{ + PointerRNA *ptr = fmodifier_get_pointers(NULL, panel, NULL); + FModifier *fcm = (FModifier *)ptr->data; + + fcm->ui_expand_flag = expand_flag; +} + +static PanelType *fmodifier_panel_register(ARegionType *region_type, + eFModifier_Types type, + PanelDrawFn draw, + PanelTypePollFn poll, + const char *id_prefix) +{ + /* Get the name for the modifier's panel. */ + char panel_idname[BKE_ST_MAXNAME]; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_PT_%s", id_prefix, fmi->name); + + PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname); + + /* Intentionally leave the label field blank. The header is filled with buttons. */ + BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME); + BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME); + + panel_type->draw_header = fmodifier_panel_header; + panel_type->draw = draw; + panel_type->poll = poll; + + /* Give the panel the special flag that says it was built here and corresponds to a + * modifer rather than a PanelType. */ + panel_type->flag = PANEL_TYPE_HEADER_EXPAND | PANEL_TYPE_DRAW_BOX | PANEL_TYPE_INSTANCED; + panel_type->reorder = fmodifier_reorder; + panel_type->get_list_data_expand_flag = get_fmodifier_expand_flag; + panel_type->set_list_data_expand_flag = set_fmodifier_expand_flag; + + BLI_addtail(®ion_type->paneltypes, panel_type); + + return panel_type; +} + +/** + * Add a child panel to the parent. + * + * \note To create the panel type's idname, it appends the \a name argument to the \a parent's + * idname. + */ +static PanelType *fmodifier_subpanel_register(ARegionType *region_type, + const char *name, + const char *label, + PanelDrawFn draw_header, + PanelDrawFn draw, + PanelTypePollFn poll, + PanelType *parent) +{ + /* Create the subpanel's ID name. */ + char panel_idname[BKE_ST_MAXNAME]; + BLI_snprintf(panel_idname, BKE_ST_MAXNAME, "%s_%s", parent->idname, name); + + PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname); + + BLI_strncpy(panel_type->idname, panel_idname, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->label, label, BKE_ST_MAXNAME); + BLI_strncpy(panel_type->category, "Modifiers", BKE_ST_MAXNAME); + BLI_strncpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA, BKE_ST_MAXNAME); + + panel_type->draw_header = draw_header; + panel_type->draw = draw; + panel_type->poll = poll; + panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED | PANEL_TYPE_DRAW_BOX; + + BLI_assert(parent != NULL); + BLI_strncpy(panel_type->parent_id, parent->idname, BKE_ST_MAXNAME); + panel_type->parent = parent; + BLI_addtail(&parent->children, BLI_genericNodeN(panel_type)); + BLI_addtail(®ion_type->paneltypes, panel_type); + + return panel_type; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name General UI Callbacks and Drawing + * \{ */ /* XXX! -------------------------------- */ /* Temporary definition for limits of float number buttons @@ -67,36 +254,12 @@ #define B_REDR 1 #define B_FMODIFIER_REDRAW 20 -/* callback to update depsgraph on value changes */ -static void deg_update(bContext *C, void *owner_id, void *UNUSED(var2)) -{ - /* send notifiers */ - /* XXX for now, this is the only way to get updates in all the right places... - * but would be nice to have a special one in this case. */ - WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); - DEG_id_tag_update(owner_id, ID_RECALC_ANIMATION); -} - -/* callback to verify modifier data */ -static void validate_fmodifier_cb(bContext *C, void *fcm_v, void *owner_id) -{ - FModifier *fcm = (FModifier *)fcm_v; - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - - /* call the verify callback on the modifier if applicable */ - if (fmi && fmi->verify_data) { - fmi->verify_data(fcm); - } - if (owner_id) { - deg_update(C, owner_id, NULL); - } -} - /* callback to remove the given modifier */ typedef struct FModifierDeleteContext { - ID *fcurve_owner_id; + ID *owner_id; ListBase *modifiers; } FModifierDeleteContext; + static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v) { FModifierDeleteContext *ctx = (FModifierDeleteContext *)ctx_v; @@ -108,466 +271,334 @@ static void delete_fmodifier_cb(bContext *C, void *ctx_v, void *fcm_v) ED_undo_push(C, "Delete F-Curve Modifier"); - deg_update(C, ctx->fcurve_owner_id, NULL); + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + DEG_id_tag_update(ctx->owner_id, ID_RECALC_ANIMATION); } -/* --------------- */ -/* draw settings for generator modifier */ -static void draw_modifier__generator(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short width) +static void fmodifier_influence_draw(uiLayout *layout, PointerRNA *ptr) { + FModifier *fcm = (FModifier *)ptr->data; + uiItemS(layout); + + uiLayout *row = uiLayoutRowWithHeading(layout, true, IFACE_("Influence")); + uiItemR(row, ptr, "use_influence", 0, "", ICON_NONE); + uiLayout *sub = uiLayoutRow(row, true); + + uiLayoutSetActive(sub, fcm->flag & FMODIFIER_FLAG_USEINFLUENCE); + uiItemR(sub, ptr, "influence", 0, "", ICON_NONE); +} + +static void fmodifier_frame_range_header_draw(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiItemR(layout, ptr, "use_restricted_range", 0, NULL, ICON_NONE); +} + +static void fmodifier_frame_range_draw(const bContext *C, Panel *panel) +{ + uiLayout *col; + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiLayoutSetPropSep(layout, true); + + FModifier *fcm = (FModifier *)ptr->data; + uiLayoutSetActive(layout, fcm->flag & FMODIFIER_FLAG_RANGERESTRICT); + + col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); + uiItemR(col, ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); + + col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "blend_in", 0, IFACE_("Blend In"), ICON_NONE); + uiItemR(col, ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); +} + +static void fmodifier_panel_header(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; + const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); + + uiBlock *block = uiLayoutGetBlock(layout); + + uiLayout *sub = uiLayoutRow(layout, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); + uiLayoutSetEmboss(sub, UI_EMBOSS_NONE); + + /* Checkbox for 'active' status (for now). */ + uiItemR(sub, ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* Name. */ + if (fmi) { + uiItemL(sub, IFACE_(fmi->name), ICON_NONE); + } + else { + uiItemL(sub, IFACE_(""), ICON_NONE); + } + + /* Right align. */ + sub = uiLayoutRow(layout, true); + uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); + uiLayoutSetEmboss(sub, UI_EMBOSS_NONE); + + /* 'Mute' button. */ + uiItemR(sub, ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + + /* Delete button. */ + uiBut *but = uiDefIconBut(block, + UI_BTYPE_BUT, + B_REDR, + ICON_X, + 0, + 0, + UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Delete Modifier")); + FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), __func__); + ctx->owner_id = owner_id; + ctx->modifiers = fmodifier_list_space_specific(C); + BLI_assert(ctx->modifiers != NULL); + + UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); + + uiItemS(layout); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Generator Modifier + * \{ */ + +static void generator_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; FMod_Generator *data = (FMod_Generator *)fcm->data; - uiLayout /* *col, */ /* UNUSED */ *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - short bwidth = width - 1.5 * UI_UNIT_X; /* max button width */ - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + uiItemR(layout, ptr, "mode", 0, "", ICON_NONE); - /* basic settings (backdrop + mode selector + some padding) */ - /* col = uiLayoutColumn(layout, true); */ /* UNUSED */ - block = uiLayoutGetBlock(layout); - UI_block_align_begin(block); - but = uiDefButR(block, - UI_BTYPE_MENU, - B_FMODIFIER_REDRAW, - NULL, - 0, - 0, - bwidth, - UI_UNIT_Y, - &ptr, - "mode", - -1, - 0, - 0, - -1, - -1, - NULL); - UI_but_func_set(but, validate_fmodifier_cb, fcm, NULL); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); - uiDefButR(block, - UI_BTYPE_TOGGLE, - B_FMODIFIER_REDRAW, - NULL, - 0, - 0, - bwidth, - UI_UNIT_Y, - &ptr, - "use_additive", - -1, - 0, - 0, - -1, - -1, - NULL); - UI_block_align_end(block); + uiItemR(layout, ptr, "use_additive", 0, NULL, ICON_NONE); - /* now add settings for individual modes */ + uiItemR(layout, ptr, "poly_order", 0, IFACE_("Order"), ICON_NONE); + + PropertyRNA *prop = RNA_struct_find_property(ptr, "coefficients"); + uiLayout *col = uiLayoutColumn(layout, true); switch (data->mode) { - case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */ + case FCM_GENERATOR_POLYNOMIAL: /* Polynomial expression. */ { - const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; - float *cp = NULL; + char xval[32]; - int maxXWidth; - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); + /* The first value gets a "Coefficient" label. */ + BLI_strncpy(xval, "Coefficient", sizeof(xval)); - but = uiDefButI( - block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Poly Order:"), - 0.5f * UI_UNIT_X, - 0, - bwidth, - UI_UNIT_Y, - &data->poly_order, - 1, - 100, - 0, - 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_number_step_size_set(but, 1); - UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id); - - /* calculate maximum width of label for "x^n" labels */ - if (data->arraysize > 2) { - BLI_snprintf(xval, sizeof(xval), "x^%u", data->arraysize); - /* XXX: UI_fontstyle_string_width is not accurate */ - maxXWidth = UI_fontstyle_string_width(fstyle, xval) + 0.5 * UI_UNIT_X; - } - else { - /* basic size (just "x") */ - maxXWidth = UI_fontstyle_string_width(fstyle, "x") + 0.5 * UI_UNIT_X; - } - - /* draw controls for each coefficient and a + sign at end of row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - /* Update depsgraph when values change */ - UI_block_func_set(block, deg_update, fcurve_owner_id, NULL); - - cp = data->coefficients; - for (uint i = 0; (i < data->arraysize) && (cp); i++, cp++) { - /* To align with first line... */ - if (i) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - " ", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "y =", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - - /* coefficient */ - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - bwidth / 2, - UI_UNIT_Y, - cp, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Coefficient for polynomial")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - /* 'x' param (and '+' if necessary) */ - if (i == 0) { - BLI_strncpy(xval, " ", sizeof(xval)); - } - else if (i == 1) { - BLI_strncpy(xval, "x", sizeof(xval)); - } - else { - BLI_snprintf(xval, sizeof(xval), "x^%u", i); - } - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - xval, - 0, - 0, - maxXWidth, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - TIP_("Power of x")); - - if ((i != (data->arraysize - 1)) || ((i == 0) && data->arraysize == 2)) { - uiDefBut( - block, UI_BTYPE_LABEL, 1, "+", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* next coefficient on a new row */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else { - /* For alignment in UI! */ - uiDefBut( - block, UI_BTYPE_LABEL, 1, " ", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - } + for (int i = 0; i < data->arraysize; i++) { + uiItemFullR(col, ptr, prop, i, 0, 0, N_(xval), ICON_NONE); + BLI_snprintf(xval, sizeof(xval), "x^%d", i + 1); } break; } - case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* Factorized polynomial expression */ { - float *cp = NULL; + { + /* Add column labels above the buttons to prevent confusion. + * Fake the property split layout, otherwise the labels use the full row. */ + uiLayout *split = uiLayoutSplit(col, 0.4f, false); + uiLayoutColumn(split, false); + uiLayout *title_col = uiLayoutColumn(split, false); + uiLayout *title_row = uiLayoutRow(title_col, true); + uiItemL(title_row, N_("A"), ICON_NONE); + uiItemL(title_row, N_("B"), ICON_NONE); + } - /* draw polynomial order selector */ - row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); - - but = uiDefButI( - block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Poly Order:"), - 0, - 0, - width - 1.5 * UI_UNIT_X, - UI_UNIT_Y, - &data->poly_order, - 1, - 100, - 0, - 0, - TIP_("'Order' of the Polynomial (for a polynomial with n terms, 'order' is n-1)")); - UI_but_func_set(but, validate_fmodifier_cb, fcm, fcurve_owner_id); - UI_but_number_step_size_set(but, 1); - - /* draw controls for each pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - - /* Update depsgraph when values change */ - UI_block_func_set(block, deg_update, fcurve_owner_id, NULL); - - cp = data->coefficients; - for (uint i = 0; (i < data->poly_order) && (cp); i++, cp += 2) { - /* To align with first line */ - if (i) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - " ", - 0, - 0, - 2.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "y =", - 0, - 0, - 2.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } - /* opening bracket */ - uiDefBut( - block, UI_BTYPE_LABEL, 1, "(", 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); - - /* coefficients */ - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - cp, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Coefficient of x")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - "x +", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - but = uiDefButF(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - "", - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - cp + 1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - TIP_("Second coefficient")); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 3); - - /* closing bracket and multiplication sign */ - if ((i != (data->poly_order - 1)) || ((i == 0) && data->poly_order == 2)) { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - ") \xc3\x97", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - /* set up new row for the next pair of coefficients */ - row = uiLayoutRow(layout, true); - block = uiLayoutGetBlock(row); - } - else { - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - ") ", - 0, - 0, - 2 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - } + uiLayout *first_row = uiLayoutRow(col, true); + uiItemFullR(first_row, ptr, prop, 0, 0, 0, N_("y = (Ax + B)"), ICON_NONE); + uiItemFullR(first_row, ptr, prop, 1, 0, 0, "", ICON_NONE); + for (int i = 2; i < data->arraysize - 1; i++) { + /* \u2715 is the multiplication symbol. */ + uiLayout *row = uiLayoutRow(col, true); + uiItemFullR(row, ptr, prop, i, 0, 0, N_("\u2715 (Ax + B)"), ICON_NONE); + uiItemFullR(row, ptr, prop, i + 1, 0, 0, "", ICON_NONE); } break; } } + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ +static void panel_register_generator(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_GENERATOR, generator_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} -/* draw settings for generator modifier */ -static void draw_modifier__fn_generator(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Function Generator Modifier + * \{ */ + +static void fn_generator_panel_draw(const bContext *C, Panel *panel) { uiLayout *col; - PointerRNA ptr; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierFunctionGenerator, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* add the settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE); - uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + uiItemR(layout, ptr, "function_type", 0, "", ICON_NONE); - col = uiLayoutColumn(layout, false); /* no grouping for now */ - uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE); + uiLayoutSetPropSep(layout, true); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "use_additive", 0, NULL, ICON_NONE); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "amplitude", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase_multiplier", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase_offset", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "value_offset", 0, NULL, ICON_NONE); + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -/* draw settings for cycles modifier */ -static void draw_modifier__cycles(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void panel_register_fn_generator(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - uiLayout *split, *col; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierCycles, fcm, &ptr); - - /* split into 2 columns - * NOTE: the mode combination-boxes shouldn't get labels, otherwise there isn't enough room. */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* before range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("Before:"), ICON_NONE); - uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE); - - /* after range */ - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("After:"), ICON_NONE); - uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE); - uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE); + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_FN_GENERATOR, fn_generator_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); } -/* --------------- */ +/** \} */ -/* draw settings for noise modifier */ -static void draw_modifier__noise(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/* -------------------------------------------------------------------- */ +/** \name Cycles Modifier + * \{ */ + +static void cycles_panel_draw(const bContext *C, Panel *panel) { - uiLayout *split, *col; - PointerRNA ptr; + uiLayout *col; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierNoise, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* blending mode */ - uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); + /* Before. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "mode_before", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "cycles_before", 0, IFACE_("Count"), ICON_NONE); - /* col 1 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "offset", 0, NULL, ICON_NONE); + /* After. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "mode_after", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "cycles_after", 0, IFACE_("Count"), ICON_NONE); - /* col 2 */ - col = uiLayoutColumn(split, false); - uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE); + fmodifier_influence_draw(layout, ptr); } -/* callback to add new envelope data point */ +static void panel_register_cycles(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_CYCLES, cycles_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Noise Modifier + * \{ */ + +static void noise_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *col; + uiLayout *layout = panel->layout; + + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + + uiItemR(layout, ptr, "blend_type", 0, NULL, ICON_NONE); + + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "scale", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "phase", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "depth", 0, NULL, ICON_NONE); + + fmodifier_influence_draw(layout, ptr); +} + +static void panel_register_noise(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_NOISE, noise_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Enevelope Modifier + * \{ */ + static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg)) { Scene *scene = CTX_data_scene(C); @@ -656,132 +687,60 @@ static void fmod_envelope_deletepoint_cb(bContext *UNUSED(C), void *fcm_dv, void } /* draw settings for envelope modifier */ -static void draw_modifier__envelope(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void envelope_panel_draw(const bContext *C, Panel *panel) { + uiLayout *row, *col; + uiLayout *layout = panel->layout; + + ID *owner_id; + PointerRNA *ptr = fmodifier_get_pointers(C, panel, &owner_id); + FModifier *fcm = (FModifier *)ptr->data; FMod_Envelope *env = (FMod_Envelope *)fcm->data; - FCM_EnvelopeData *fed; - uiLayout *col, *row; - uiBlock *block; - uiBut *but; - PointerRNA ptr; - int i; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelope, fcm, &ptr); + uiLayoutSetPropSep(layout, true); - /* general settings */ + /* General settings. */ col = uiLayoutColumn(layout, true); - uiItemL(col, IFACE_("Envelope:"), ICON_NONE); - uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "reference_value", 0, IFACE_("Reference"), ICON_NONE); + uiItemR(col, ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); + uiItemR(col, ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "default_min", 0, IFACE_("Min"), ICON_NONE); - uiItemR(row, &ptr, "default_max", 0, IFACE_("Max"), ICON_NONE); + /* Control points list. */ - /* control points header */ - /* TODO: move this control-point control stuff to using the new special widgets for lists - * the current way is far too cramped */ row = uiLayoutRow(layout, false); - block = uiLayoutGetBlock(row); + uiBlock *block = uiLayoutGetBlock(row); - uiDefBut(block, - UI_BTYPE_LABEL, - 1, - IFACE_("Control Points:"), - 0, - 0, - 7.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0, - 0, - ""); - - but = uiDefBut(block, - UI_BTYPE_BUT, - B_FMODIFIER_REDRAW, - IFACE_("Add Point"), - 0, - 0, - 7.5 * UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0, - 0, - 0, - 0, - TIP_("Add a new control-point to the envelope on the current frame")); + uiBut *but = uiDefBut(block, + UI_BTYPE_BUT, + B_FMODIFIER_REDRAW, + IFACE_("Add Control Point"), + 0, + 0, + 7.5 * UI_UNIT_X, + UI_UNIT_Y, + NULL, + 0, + 0, + 0, + 0, + TIP_("Add a new control-point to the envelope on the current frame")); UI_but_func_set(but, fmod_envelope_addpoint_cb, env, NULL); - /* control points list */ - for (i = 0, fed = env->data; i < env->totvert; i++, fed++) { + col = uiLayoutColumn(layout, false); + uiLayoutSetPropSep(col, false); + + FCM_EnvelopeData *fed = env->data; + for (int i = 0; i < env->totvert; i++, fed++) { PointerRNA ctrl_ptr; - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr); + RNA_pointer_create(owner_id, &RNA_FModifierEnvelopeControlPoint, fed, &ctrl_ptr); /* get a new row to operate on */ - row = uiLayoutRow(layout, true); + row = uiLayoutRow(col, true); block = uiLayoutGetBlock(row); - UI_block_align_begin(block); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Fra:"), - 0, - 0, - 4.5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "frame", - -1, - -MAXFRAMEF, - MAXFRAMEF, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 1); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Min:"), - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "min", - -1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 2); - but = uiDefButR(block, - UI_BTYPE_NUM, - B_FMODIFIER_REDRAW, - IFACE_("Max:"), - 0, - 0, - 5 * UI_UNIT_X, - UI_UNIT_Y, - &ctrl_ptr, - "max", - -1, - -UI_FLT_MAX, - UI_FLT_MAX, - 0, - 0, - NULL); - UI_but_number_step_size_set(but, 10); - UI_but_number_precision_set(but, 2); + uiItemR(row, &ctrl_ptr, "frame", 0, NULL, ICON_NONE); + uiItemR(row, &ctrl_ptr, "min", 0, IFACE_("Min"), ICON_NONE); + uiItemR(row, &ctrl_ptr, "max", 0, IFACE_("Max"), ICON_NONE); but = uiDefIconBut(block, UI_BTYPE_BUT, @@ -800,251 +759,211 @@ static void draw_modifier__envelope(uiLayout *layout, UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i)); UI_block_align_begin(block); } + + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -/* draw settings for limits modifier */ -static void draw_modifier__limits(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +static void panel_register_envelope(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - uiLayout *split, *col /* , *row */ /* UNUSED */; - PointerRNA ptr; - - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierLimits, fcm, &ptr); - - /* row 1: minimum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE); - } - - /* row 2: maximum */ - { - /* row = uiLayoutRow(layout, false); */ /* UNUSED */ - - /* split into 2 columns */ - split = uiLayoutSplit(layout, 0.5f, false); - - /* x-minimum */ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE); - - /* y-minimum*/ - col = uiLayoutColumn(split, true); - uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE); - } + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_ENVELOPE, envelope_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); } -/* --------------- */ +/** \} */ -/* draw settings for stepped interpolation modifier */ -static void draw_modifier__stepped(uiLayout *layout, - ID *fcurve_owner_id, - FModifier *fcm, - short UNUSED(width)) +/* -------------------------------------------------------------------- */ +/** \name Limits Modifier + * \{ */ + +static void limits_panel_draw(const bContext *C, Panel *panel) { - uiLayout *col, *sub; - PointerRNA ptr; + uiLayout *col, *row, *sub; + uiLayout *layout = panel->layout; - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifierStepped, fcm, &ptr); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - /* block 1: "stepping" settings */ + uiLayoutSetPropSep(layout, true); + + /* Minimums. */ col = uiLayoutColumn(layout, false); - uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE); - uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Minumum X")); + uiItemR(row, ptr, "use_min_x", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_x")); + uiItemR(sub, ptr, "min_x", 0, "", ICON_NONE); - /* block 2: start range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Y")); + uiItemR(row, ptr, "use_min_y", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_y")); + uiItemR(sub, ptr, "min_y", 0, "", ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_start")); - uiItemR(sub, &ptr, "frame_start", 0, NULL, ICON_NONE); + /* Maximums. */ + col = uiLayoutColumn(layout, false); + row = uiLayoutRowWithHeading(col, true, IFACE_("Maximum X")); + uiItemR(row, ptr, "use_max_x", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_x")); + uiItemR(sub, ptr, "max_x", 0, "", ICON_NONE); - /* block 3: end range settings */ - col = uiLayoutColumn(layout, true); - uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE); + row = uiLayoutRowWithHeading(col, true, IFACE_("Y")); + uiItemR(row, ptr, "use_max_y", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_y")); + uiItemR(sub, ptr, "max_y", 0, "", ICON_NONE); - sub = uiLayoutColumn(col, true); - uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_frame_end")); - uiItemR(sub, &ptr, "frame_end", 0, NULL, ICON_NONE); + fmodifier_influence_draw(layout, ptr); } -/* --------------- */ - -void ANIM_uiTemplate_fmodifier_draw(uiLayout *layout, - ID *fcurve_owner_id, - ListBase *modifiers, - FModifier *fcm) +static void panel_register_limits(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) { - const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm); - uiLayout *box, *row, *sub, *col; - uiBlock *block; - uiBut *but; - short width = 314; - PointerRNA ptr; + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_LIMITS, limits_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} - /* init the RNA-pointer */ - RNA_pointer_create(fcurve_owner_id, &RNA_FModifier, fcm, &ptr); +/** \} */ - /* draw header */ - { - /* get layout-row + UI-block for this */ - box = uiLayoutBox(layout); +/* -------------------------------------------------------------------- */ +/** \name Stepped Interpolation Modifier + * \{ */ - row = uiLayoutRow(box, false); - block = uiLayoutGetBlock(row); /* err... */ +static void stepped_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *col, *sub, *row; + uiLayout *layout = panel->layout; - /* left-align -------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); + PointerRNA *ptr = fmodifier_get_pointers(C, panel, NULL); - UI_block_emboss_set(block, UI_EMBOSS_NONE); + uiLayoutSetPropSep(layout, true); - /* expand */ - uiItemR(sub, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + /* Stepping Settings. */ + col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "frame_step", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NONE); - /* checkbox for 'active' status (for now) */ - uiItemR(sub, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + /* Start range settings. */ + row = uiLayoutRowWithHeading(layout, true, IFACE_("Start Frame")); + uiItemR(row, ptr, "use_frame_start", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_start")); + uiItemR(sub, ptr, "frame_start", 0, "", ICON_NONE); - /* name */ - if (fmi) { - uiItemL(sub, IFACE_(fmi->name), ICON_NONE); + /* End range settings. */ + row = uiLayoutRowWithHeading(layout, true, IFACE_("End Frame")); + uiItemR(row, ptr, "use_frame_end", 0, "", ICON_NONE); + sub = uiLayoutColumn(row, true); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_frame_end")); + uiItemR(sub, ptr, "frame_end", 0, "", ICON_NONE); + + fmodifier_influence_draw(layout, ptr); +} + +static void panel_register_stepped(ARegionType *region_type, + const char *id_prefix, + PanelTypePollFn poll_fn) +{ + PanelType *panel_type = fmodifier_panel_register( + region_type, FMODIFIER_TYPE_STEPPED, stepped_panel_draw, poll_fn, id_prefix); + fmodifier_subpanel_register(region_type, + "frame_range", + "", + fmodifier_frame_range_header_draw, + fmodifier_frame_range_draw, + poll_fn, + panel_type); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Panel Creation + * + * \{ */ + +/** + * Checks if the panels match the active strip / curve, rebubilds them if they don't. + */ +void ANIM_fmodifier_panels(const bContext *C, + ID *owner_id, + ListBase *fmodifiers, + uiListPanelIDFromDataFunc panel_id_fn) +{ + ARegion *region = CTX_wm_region(C); + + bool panels_match = UI_panel_list_matches_data(region, fmodifiers, panel_id_fn); + + if (!panels_match) { + UI_panels_free_instanced(C, region); + FModifier *fcm = fmodifiers->first; + for (int i = 0; fcm; i++, fcm = fcm->next) { + char panel_idname[MAX_NAME]; + panel_id_fn(fcm, panel_idname); + + PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata"); + RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr); + + UI_panel_add_instanced(C, region, ®ion->panels, panel_idname, fcm_ptr); } - else { - uiItemL(sub, IFACE_(""), ICON_NONE); - } - - /* right-align ------------------------------------------- */ - sub = uiLayoutRow(row, true); - uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); - - /* 'mute' button */ - uiItemR(sub, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - - UI_block_emboss_set(block, UI_EMBOSS_NONE); - - /* delete button */ - but = uiDefIconBut(block, - UI_BTYPE_BUT, - B_REDR, - ICON_X, - 0, - 0, - UI_UNIT_X, - UI_UNIT_Y, - NULL, - 0.0, - 0.0, - 0.0, - 0.0, - TIP_("Delete F-Curve Modifier")); - FModifierDeleteContext *ctx = MEM_mallocN(sizeof(FModifierDeleteContext), "fmodifier ctx"); - ctx->fcurve_owner_id = fcurve_owner_id; - ctx->modifiers = modifiers; - UI_but_funcN_set(but, delete_fmodifier_cb, ctx, fcm); - - UI_block_emboss_set(block, UI_EMBOSS); } + else { + /* Assuming there's only one group of instanced panels, update the custom data pointers. */ + Panel *panel = region->panels.first; + LISTBASE_FOREACH (FModifier *, fcm, fmodifiers) { - /* when modifier is expanded, draw settings */ - if (fcm->flag & FMODIFIER_FLAG_EXPANDED) { - /* set up the flexible-box layout which acts as the backdrop for the modifier settings */ - box = uiLayoutBox(layout); - - /* draw settings for individual modifiers */ - switch (fcm->type) { - case FMODIFIER_TYPE_GENERATOR: /* Generator */ - draw_modifier__generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */ - draw_modifier__fn_generator(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_CYCLES: /* Cycles */ - draw_modifier__cycles(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_ENVELOPE: /* Envelope */ - draw_modifier__envelope(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_LIMITS: /* Limits */ - draw_modifier__limits(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_NOISE: /* Noise */ - draw_modifier__noise(box, fcurve_owner_id, fcm, width); - break; - - case FMODIFIER_TYPE_STEPPED: /* Stepped */ - draw_modifier__stepped(box, fcurve_owner_id, fcm, width); - break; - - default: /* unknown type */ - break; - } - - /* one last panel below this: FModifier range */ - /* TODO: experiment with placement of this */ - { - box = uiLayoutBox(layout); - - /* restricted range ----------------------------------------------------- */ - col = uiLayoutColumn(box, true); - - /* top row: use restricted range */ - row = uiLayoutRow(col, true); - uiItemR(row, &ptr, "use_restricted_range", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_RANGERESTRICT) { - /* second row: settings */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE); - uiItemR(row, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE); - - /* third row: blending influence */ - row = uiLayoutRow(col, true); - - uiItemR(row, &ptr, "blend_in", 0, IFACE_("In"), ICON_NONE); - uiItemR(row, &ptr, "blend_out", 0, IFACE_("Out"), ICON_NONE); + /* Move to the next instanced panel corresponding to the next modifier. */ + while ((panel->type == NULL) || !(panel->type->flag & PANEL_TYPE_INSTANCED)) { + panel = panel->next; + BLI_assert(panel != NULL); /* There shouldn't be fewer panels than modifiers with UIs. */ } - /* influence -------------------------------------------------------------- */ - col = uiLayoutColumn(box, true); + PointerRNA *fcm_ptr = MEM_mallocN(sizeof(PointerRNA), "panel customdata"); + RNA_pointer_create(owner_id, &RNA_FModifier, fcm, fcm_ptr); + UI_panel_custom_data_set(panel, fcm_ptr); - /* top row: use influence */ - uiItemR(col, &ptr, "use_influence", 0, NULL, ICON_NONE); - - if (fcm->flag & FMODIFIER_FLAG_USEINFLUENCE) { - /* second row: influence value */ - uiItemR(col, &ptr, "influence", 0, NULL, ICON_NONE); - } + panel = panel->next; } } } +void ANIM_modifier_panels_register_graph_and_NLA(ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function) +{ + panel_register_generator(region_type, modifier_panel_prefix, poll_function); + panel_register_fn_generator(region_type, modifier_panel_prefix, poll_function); + panel_register_noise(region_type, modifier_panel_prefix, poll_function); + panel_register_envelope(region_type, modifier_panel_prefix, poll_function); + panel_register_limits(region_type, modifier_panel_prefix, poll_function); + panel_register_stepped(region_type, modifier_panel_prefix, poll_function); +} + +void ANIM_modifier_panels_register_graph_only(ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function) +{ + panel_register_cycles(region_type, modifier_panel_prefix, poll_function); +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Copy / Paste Buffer Code * diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index 9cf67816df2..2415c85e299 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -33,7 +33,11 @@ struct ID; struct ListBase; struct ARegion; +struct ARegionType; struct Main; +struct NlaStrip; +struct FModifier; +struct PanelType; struct ReportList; struct ScrArea; struct SpaceLink; @@ -675,11 +679,25 @@ void ANIM_draw_framerange(struct Scene *scene, struct View2D *v2d); /* ------------- UI Panel Drawing -------------- */ -/* draw a given F-Modifier for some layout/UI-Block */ -void ANIM_uiTemplate_fmodifier_draw(struct uiLayout *layout, - struct ID *fcurve_owner_id, - ListBase *modifiers, - struct FModifier *fcm); +struct NlaStrip *ANIM_nla_context_strip(const struct bContext *C); +struct FCurve *ANIM_graph_context_fcurve(const struct bContext *C); + +/* Needed for abstraction between the graph editor and the NLA editor. */ +typedef bool (*PanelTypePollFn)(const struct bContext *C, struct PanelType *pt); +/* Avoid including "UI_interface.h" here. */ +typedef void (*uiListPanelIDFromDataFunc)(void *data_link, char *r_idname); + +void ANIM_fmodifier_panels(const struct bContext *C, + struct ID *owner_id, + struct ListBase *fmodifiers, + uiListPanelIDFromDataFunc panel_id_fn); + +void ANIM_modifier_panels_register_graph_and_NLA(struct ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function); +void ANIM_modifier_panels_register_graph_only(struct ARegionType *region_type, + const char *modifier_panel_prefix, + PanelTypePollFn poll_function); /* ------------- Copy/Paste Buffer -------------- */ diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 51be5afafe5..d88bf8750c2 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -105,6 +105,16 @@ static bool graph_panel_context(const bContext *C, bAnimListElem **ale, FCurve * return true; } +FCurve *ANIM_graph_context_fcurve(const bContext *C) +{ + FCurve *fcu; + if (!graph_panel_context(C, NULL, &fcu)) { + return NULL; + } + + return fcu; +} + static bool graph_panel_poll(const bContext *C, PanelType *UNUSED(pt)) { return graph_panel_context(C, NULL, NULL); @@ -1312,6 +1322,16 @@ static void graph_panel_drivers_popover(const bContext *C, Panel *panel) /* All the drawing code is in editors/animation/fmodifier_ui.c */ #define B_FMODIFIER_REDRAW 20 +/** The start of FModifier panels registered for the graph editor. */ +#define GRAPH_FMODIFIER_PANEL_PREFIX "GRAPH" + +static void graph_fmodifier_panel_id(void *fcm_link, char *r_name) +{ + FModifier *fcm = (FModifier *)fcm_link; + eFModifier_Types type = fcm->type; + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", GRAPH_FMODIFIER_PANEL_PREFIX, fmi->name); +} static void do_graph_region_modifier_buttons(bContext *C, void *UNUSED(arg), int event) { @@ -1327,10 +1347,8 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel) { bAnimListElem *ale; FCurve *fcu; - FModifier *fcm; - uiLayout *col, *row; + uiLayout *row; uiBlock *block; - bool active; if (!graph_panel_context(C, &ale, &fcu)) { return; @@ -1355,14 +1373,7 @@ static void graph_panel_modifiers(const bContext *C, Panel *panel) uiItemO(row, "", ICON_PASTEDOWN, "GRAPH_OT_fmodifier_paste"); } - active = !(fcu->flag & FCURVE_MOD_OFF); - /* draw each modifier */ - for (fcm = fcu->modifiers.first; fcm; fcm = fcm->next) { - col = uiLayoutColumn(panel->layout, true); - uiLayoutSetActive(col, active); - - ANIM_uiTemplate_fmodifier_draw(col, ale->fcurve_owner_id, &fcu->modifiers, fcm); - } + ANIM_fmodifier_panels(C, ale->fcurve_owner_id, &fcu->modifiers, graph_fmodifier_panel_id); MEM_freeN(ale); } @@ -1426,10 +1437,14 @@ void graph_buttons_register(ARegionType *art) strcpy(pt->label, N_("Modifiers")); strcpy(pt->category, "Modifiers"); strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->flag = PANEL_TYPE_NO_HEADER; pt->draw = graph_panel_modifiers; pt->poll = graph_panel_poll; BLI_addtail(&art->paneltypes, pt); + ANIM_modifier_panels_register_graph_and_NLA(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll); + ANIM_modifier_panels_register_graph_only(art, GRAPH_FMODIFIER_PANEL_PREFIX, graph_panel_poll); + pt = MEM_callocN(sizeof(PanelType), "spacetype graph panel view"); strcpy(pt->idname, "GRAPH_PT_view"); strcpy(pt->label, N_("Show Cursor")); diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index b82fcf3db47..d019573bf93 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -37,6 +37,7 @@ #include "BLT_translation.h" #include "BKE_context.h" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "BKE_screen.h" @@ -184,6 +185,17 @@ bool nla_panel_context(const bContext *C, return (found != 0); } +NlaStrip *ANIM_nla_context_strip(const bContext *C) +{ + PointerRNA strip_ptr; + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) { + return NULL; + } + NlaStrip *strip = strip_ptr.data; + + return strip; +} + #if 0 static bool nla_panel_poll(const bContext *C, PanelType *pt) { @@ -535,13 +547,23 @@ static void nla_panel_animated_strip_time(const bContext *C, Panel *panel) uiItemR(layout, &strip_ptr, "strip_time", 0, NULL, ICON_NONE); } +#define NLA_FMODIFIER_PANEL_PREFIX "NLA" + +static void nla_fmodifier_panel_id(void *fcm_link, char *r_name) +{ + FModifier *fcm = (FModifier *)fcm_link; + eFModifier_Types type = fcm->type; + snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_", NLA_FMODIFIER_PANEL_PREFIX); + const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(type); + BLI_snprintf(r_name, BKE_ST_MAXNAME, "%s_PT_%s", NLA_FMODIFIER_PANEL_PREFIX, fmi->name); +} + /* F-Modifiers for active NLA-Strip */ static void nla_panel_modifiers(const bContext *C, Panel *panel) { PointerRNA strip_ptr; NlaStrip *strip; - FModifier *fcm; - uiLayout *col, *row; + uiLayout *row; uiBlock *block; /* check context and also validity of pointer */ @@ -569,12 +591,7 @@ static void nla_panel_modifiers(const bContext *C, Panel *panel) uiItemO(row, "", ICON_PASTEDOWN, "NLA_OT_fmodifier_paste"); } - /* draw each modifier */ - for (fcm = strip->modifiers.first; fcm; fcm = fcm->next) { - col = uiLayoutColumn(panel->layout, true); - - ANIM_uiTemplate_fmodifier_draw(col, strip_ptr.owner_id, &strip->modifiers, fcm); - } + ANIM_fmodifier_panels(C, strip_ptr.owner_id, &strip->modifiers, nla_fmodifier_panel_id); } /* ******************* general ******************************** */ @@ -657,5 +674,9 @@ void nla_buttons_register(ARegionType *art) strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); pt->draw = nla_panel_modifiers; pt->poll = nla_strip_eval_panel_poll; + pt->flag = PANEL_TYPE_NO_HEADER; BLI_addtail(&art->paneltypes, pt); + + ANIM_modifier_panels_register_graph_and_NLA( + art, NLA_FMODIFIER_PANEL_PREFIX, nla_strip_eval_panel_poll); } diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index 4e37a6652a5..c9abb4fb5be 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -57,6 +57,13 @@ typedef struct FModifier { short type; /** Settings for the modifier. */ short flag; + /** + * Expansion state for the modifier panel and its subpanels, stored as a bitfield + * in depth-first order. (Maximum of sizeof(short) total panels). + */ + short ui_expand_flag; + + char _pad[6]; /** The amount that the modifier should influence the value. */ float influence; @@ -96,8 +103,10 @@ typedef enum eFModifier_Types { typedef enum eFModifier_Flags { /** Modifier is not able to be evaluated for some reason, and should be skipped (internal). */ FMODIFIER_FLAG_DISABLED = (1 << 0), - /** Modifier's data is expanded (in UI). */ +#ifdef DNA_DEPRECATED_ALLOW + /** Modifier's data is expanded (in UI). Deprecated, use `ui_expand_flag`. */ FMODIFIER_FLAG_EXPANDED = (1 << 1), +#endif /** Modifier is active one (in UI) for editing purposes. */ FMODIFIER_FLAG_ACTIVE = (1 << 2), /** User wants modifier to be skipped. */ diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index b4e864eb4e1..989a41b9ad6 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -1129,6 +1129,12 @@ static void rna_Keyframe_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *p rna_tag_animation_update(bmain, ptr->owner_id); } +static void rna_FModifier_show_expanded_set(PointerRNA *ptr, bool value) +{ + FModifier *fcm = ptr->data; + SET_FLAG_FROM_TEST(fcm->ui_expand_flag, value, UI_PANEL_DATA_EXPAND_ROOT); +} + #else static void rna_def_fmodifier_generator(BlenderRNA *brna) @@ -1187,6 +1193,8 @@ static void rna_def_fmodifier_generator(BlenderRNA *brna) NULL); RNA_def_property_ui_text( prop, "Coefficients", "Coefficients for 'x' (starting from lowest power of x^0)"); + RNA_def_property_update( + prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_verify_data_update"); } /* --------- */ @@ -1219,7 +1227,7 @@ static void rna_def_fmodifier_function_generator(BlenderRNA *brna) prop = RNA_def_property(srna, "phase_multiplier", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text( - prop, "Phase Multiplier", "Scale factor determining the 'speed' of the function"); + prop, "Phase Multiple", "Scale factor determining the 'speed' of the function"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FModifier_update"); prop = RNA_def_property(srna, "phase_offset", PROP_FLOAT, PROP_NONE); @@ -1632,13 +1640,14 @@ static void rna_def_fmodifier(BlenderRNA *brna) /* settings */ prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_EXPANDED); + RNA_def_property_boolean_sdna(prop, NULL, "ui_expand_flag", 0); + RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_show_expanded_set"); RNA_def_property_ui_text(prop, "Expanded", "F-Curve Modifier's panel is expanded in UI"); RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1); prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED); - RNA_def_property_ui_text(prop, "Muted", "Disable F-Curve Modifier evaluation"); + RNA_def_property_ui_text(prop, "Enabled", "Enable F-Curve modifier evaluation"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); RNA_def_property_ui_icon(prop, ICON_CHECKBOX_HLT, -1); @@ -1652,7 +1661,7 @@ static void rna_def_fmodifier(BlenderRNA *brna) /* TODO: setting this to true must ensure that all others in stack are turned off too... */ prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_ACTIVE); - RNA_def_property_ui_text(prop, "Active", "F-Curve Modifier is the one being edited"); + RNA_def_property_ui_text(prop, "Active", "F-Curve modifier will show settings in the editor"); RNA_def_property_boolean_funcs(prop, NULL, "rna_FModifier_active_set"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_active_update"); RNA_def_property_ui_icon(prop, ICON_RADIOBUT_OFF, 1); @@ -1666,8 +1675,6 @@ static void rna_def_fmodifier(BlenderRNA *brna) "F-Curve Modifier is only applied for the specified frame range to help " "mask off effects in order to chain them"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); - RNA_def_property_ui_icon( - prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */ prop = RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "sfra"); @@ -1709,8 +1716,6 @@ static void rna_def_fmodifier(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Use Influence", "F-Curve Modifier's effects will be tempered by a default factor"); RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update"); - RNA_def_property_ui_icon( - prop, ICON_DISCLOSURE_TRI_RIGHT, 1); /* XXX: depends on UI implementation */ prop = RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "influence"); From 2441886c58e1258645195214e0aa1987c29f0c35 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 10:17:08 -0600 Subject: [PATCH 318/519] UI: Use title case for label --- source/blender/makesrna/intern/rna_modifier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 7209d17735a..ae10b637b30 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -1657,7 +1657,7 @@ static void rna_def_property_subdivision_common(StructRNA *srna) {SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, "PRESERVE_BOUNDARIES", 0, - "Keep boundaries", + "Keep Boundaries", "UVs are smoothed, boundaries are kept sharp"}, {SUBSURF_UV_SMOOTH_ALL, "SMOOTH_ALL", 0, "All", "UVs and boundaries are smoothed"}, {0, NULL, 0, NULL, NULL}, From 6bba830589860c32a2543b14cd2c9bcd2b9e4948 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Fri, 19 Feb 2021 17:18:12 +0100 Subject: [PATCH 319/519] GPencil: Interpolate Tools refactor Following with the changes included to interpolate strokes of different number of points, a full review has been done in the interpolation tools. * Interpolate now is a tool and not an operator. It was not logic to have this tool as a button. * Interpolate tool parameters have been moved to topbar. * Interpolate popover has been removed from topbar and interpolate `Sequence` operator has been moved to grease pencil menu. * Interpolate Sequence now include a Redo panel. * Interpolate tool now allows to select the strokes by pairs. This allows to interpolate any stroke with any stroke and not as before that it was only possible by drawing order. If no stroke is selected, the interpolation is done as before. * Now is possible interpolate again if a previous keyframe exist. Before, it was impossible to interpolate two times in same frame and this made impossible to do the interpolation by groups of frames. * New automatic option to `Flip strokes` if the stroke and end are not in the right position. Also the flip can be set manually for corner cases. * Cleanup of menus related to interpolate. * Fixed some bugs and removed parameters from scene because now all are tool or operator contained. * Some code cleanup and function renames. This commit also includes the some codebase to future implementation of the concept `Vertex Active` that now does not exist in grease pencil. --- .../keyconfig/keymap_data/blender_default.py | 22 + .../scripts/startup/bl_ui/space_dopesheet.py | 19 +- .../startup/bl_ui/space_toolsystem_toolbar.py | 46 +- release/scripts/startup/bl_ui/space_view3d.py | 7 - .../startup/bl_ui/space_view3d_toolbar.py | 53 - source/blender/blenkernel/BKE_gpencil.h | 7 +- source/blender/blenkernel/BKE_gpencil_curve.h | 8 +- source/blender/blenkernel/intern/gpencil.c | 28 +- .../blender/blenkernel/intern/gpencil_curve.c | 12 +- .../blender/blenkernel/intern/gpencil_geom.c | 1 + source/blender/blenkernel/intern/scene.c | 2 - .../blenloader/intern/versioning_290.c | 8 - source/blender/editors/gpencil/gpencil_data.c | 2 + source/blender/editors/gpencil/gpencil_edit.c | 12 +- .../editors/gpencil/gpencil_edit_curve.c | 2 +- .../blender/editors/gpencil/gpencil_intern.h | 49 - .../editors/gpencil/gpencil_interpolate.c | 1031 +++++++++++++---- .../blender/editors/gpencil/gpencil_merge.c | 3 + .../editors/gpencil/gpencil_primitive.c | 1 + .../blender/editors/gpencil/gpencil_select.c | 55 +- .../blender/editors/gpencil/gpencil_utils.c | 22 + source/blender/makesdna/DNA_gpencil_types.h | 8 + source/blender/makesdna/DNA_scene_types.h | 16 - source/blender/makesrna/intern/rna_gpencil.c | 10 +- source/blender/makesrna/intern/rna_scene.c | 81 -- 25 files changed, 1003 insertions(+), 502 deletions(-) diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index fd9d699ed01..69582849308 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -6757,6 +6757,15 @@ def km_3d_view_tool_paint_gpencil_eyedropper(params): ]}, ) +def km_3d_view_tool_paint_gpencil_interpolate(params): + return ( + "3D View Tool: Paint Gpencil, Interpolate", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("gpencil.interpolate", {"type": params.tool_tweak, "value": 'ANY'}, + {"properties": [("release_confirm", True)]}), + ]}, + ) def km_3d_view_tool_edit_gpencil_select(params): return ( @@ -6858,6 +6867,17 @@ def km_3d_view_tool_edit_gpencil_transform_fill(params): ) +def km_3d_view_tool_edit_gpencil_interpolate(params): + return ( + "3D View Tool: Edit Gpencil, Interpolate", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("gpencil.interpolate", {"type": params.tool_tweak, "value": 'ANY'}, + {"properties": [("release_confirm", True)]}), + ]}, + ) + + def km_3d_view_tool_sculpt_gpencil_select(params): return ( "3D View Tool: Sculpt Gpencil, Tweak", @@ -7173,6 +7193,7 @@ def generate_keymaps(params=None): km_3d_view_tool_paint_gpencil_curve(params), km_3d_view_tool_paint_gpencil_cutter(params), km_3d_view_tool_paint_gpencil_eyedropper(params), + km_3d_view_tool_paint_gpencil_interpolate(params), km_3d_view_tool_edit_gpencil_select(params), km_3d_view_tool_edit_gpencil_select_box(params), km_3d_view_tool_edit_gpencil_select_circle(params), @@ -7183,6 +7204,7 @@ def generate_keymaps(params=None): km_3d_view_tool_edit_gpencil_shear(params), km_3d_view_tool_edit_gpencil_to_sphere(params), km_3d_view_tool_edit_gpencil_transform_fill(params), + km_3d_view_tool_edit_gpencil_interpolate(params), km_3d_view_tool_sculpt_gpencil_select(params), km_3d_view_tool_sculpt_gpencil_select_box(params), km_3d_view_tool_sculpt_gpencil_select_circle(params), diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index aa98e4292f4..39d232b2871 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -322,7 +322,7 @@ class DOPESHEET_MT_editor_menus(Menu): if st.mode != 'GPENCIL': layout.menu("DOPESHEET_MT_key") else: - layout.menu("DOPESHEET_MT_gpencil_frame") + layout.menu("DOPESHEET_MT_gpencil_key") class DOPESHEET_MT_view(Menu): @@ -558,8 +558,8 @@ class DOPESHEET_MT_gpencil_channel(Menu): layout.operator_menu_enum("anim.channels_move", "direction", text="Move...") -class DOPESHEET_MT_gpencil_frame(Menu): - bl_label = "Frame" +class DOPESHEET_MT_gpencil_key(Menu): + bl_label = "Key" def draw(self, _context): layout = self.layout @@ -569,15 +569,14 @@ class DOPESHEET_MT_gpencil_frame(Menu): layout.operator_menu_enum("action.mirror", "type", text="Mirror") layout.separator() - layout.operator("action.duplicate") - layout.operator("action.delete") + layout.operator("action.keyframe_insert") layout.separator() - layout.operator("action.keyframe_type") + layout.operator("action.delete") + layout.operator("gpencil.interpolate_reverse") - # layout.separator() - # layout.operator("action.copy") - # layout.operator("action.paste") + layout.separator() + layout.operator("action.keyframe_type", text="Keyframe Type") class DOPESHEET_MT_delete(Menu): @@ -761,7 +760,7 @@ classes = ( DOPESHEET_MT_key, DOPESHEET_MT_key_transform, DOPESHEET_MT_gpencil_channel, - DOPESHEET_MT_gpencil_frame, + DOPESHEET_MT_gpencil_key, DOPESHEET_MT_delete, DOPESHEET_MT_context_menu, DOPESHEET_MT_channel_context_menu, diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 68cded82ce3..75bca09a044 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -2035,6 +2035,26 @@ class _defs_gpencil_paint: draw_settings=draw_settings, ) + @ToolDef.from_fn + def interpolate(): + def draw_settings(context, layout, tool): + props = tool.operator_properties("gpencil.interpolate") + row = layout.row() + row.prop(props, "layers") + row.prop(props, "flip") + row.prop(props, "smooth_factor") + row.prop(props, "smooth_steps") + + return dict( + idname="builtin.interpolate", + label="Interpolate", + icon="ops.pose.breakdowner", + cursor='DEFAULT', + widget=None, + keymap=(), + draw_settings=draw_settings, + ) + class _defs_gpencil_edit: def is_segment(context): @@ -2198,6 +2218,27 @@ class _defs_gpencil_edit: draw_settings=draw_settings, ) + @ToolDef.from_fn + def interpolate(): + def draw_settings(context, layout, tool): + props = tool.operator_properties("gpencil.interpolate") + row = layout.row() + row.prop(props, "layers") + row.prop(props, "interpolate_selected_only") + row.prop(props, "flip") + row.prop(props, "smooth_factor") + row.prop(props, "smooth_steps") + + return dict( + idname="builtin.interpolate", + label="Interpolate", + icon="ops.pose.breakdowner", + cursor='DEFAULT', + widget=None, + keymap=(), + draw_settings=draw_settings, + ) + class _defs_gpencil_sculpt: @@ -2877,6 +2918,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_paint.box, _defs_gpencil_paint.circle, None, + _defs_gpencil_paint.interpolate, + None, *_tools_annotate, ], 'EDIT_GPENCIL': [ @@ -2892,9 +2935,10 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_edit.shear, _defs_gpencil_edit.tosphere, ), - None, _defs_gpencil_edit.transform_fill, None, + _defs_gpencil_edit.interpolate, + None, *_tools_annotate, ], 'SCULPT_GPENCIL': [ diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 0fe16720d81..43866add7dd 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -715,13 +715,6 @@ class VIEW3D_HT_header(Header): text="Multiframe", ) - if gpd.use_stroke_edit_mode or gpd.is_stroke_paint_mode: - row = layout.row(align=True) - row.popover( - panel="VIEW3D_PT_tools_grease_pencil_interpolate", - text="Interpolate", - ) - overlay = view.overlay VIEW3D_MT_editor_menus.draw_collapsible(context, layout) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index f93a6f3346b..257b9edf4e8 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1693,58 +1693,6 @@ class VIEW3D_PT_tools_grease_pencil_brush_paint_falloff(GreasePencilBrushFalloff return (settings and settings.brush and settings.brush.curve and tool == 'TINT') -# Grease Pencil stroke interpolation tools -class VIEW3D_PT_tools_grease_pencil_interpolate(Panel): - bl_space_type = 'VIEW_3D' - bl_region_type = 'HEADER' - bl_label = "Interpolate" - - @classmethod - def poll(cls, context): - if context.gpencil_data is None: - return False - - gpd = context.gpencil_data - valid_mode = bool(gpd.use_stroke_edit_mode or gpd.is_stroke_paint_mode) - return bool(context.editable_gpencil_strokes) and valid_mode - - def draw(self, context): - layout = self.layout - settings = context.tool_settings.gpencil_interpolate - - col = layout.column(align=True) - col.label(text="Interpolate Strokes") - col.operator("gpencil.interpolate", text="Interpolate") - col.operator("gpencil.interpolate_sequence", text="Sequence") - col.operator("gpencil.interpolate_reverse", text="Remove Breakdowns") - - col = layout.column(align=True) - col.label(text="Options:") - col.prop(settings, "interpolate_all_layers") - - gpd = context.gpencil_data - if gpd.use_stroke_edit_mode: - col.prop(settings, "interpolate_selected_only") - - col = layout.column(align=True) - col.label(text="Sequence Options:") - col.prop(settings, "step") - col.prop(settings, "type") - if settings.type == 'CUSTOM': - # TODO: Options for loading/saving curve presets? - col.template_curve_mapping(settings, "interpolation_curve", brush=True, - use_negative_slope=True) - elif settings.type != 'LINEAR': - col.prop(settings, "easing") - - if settings.type == 'BACK': - layout.prop(settings, "back") - elif settings.type == 'ELASTIC': - sub = layout.column(align=True) - sub.prop(settings, "amplitude") - sub.prop(settings, "period") - - # Grease Pencil stroke sculpting tools class GreasePencilSculptPanel: bl_context = ".greasepencil_sculpt" @@ -2266,7 +2214,6 @@ classes = ( VIEW3D_PT_tools_grease_pencil_vertex_paint_select, VIEW3D_PT_tools_grease_pencil_vertex_paint_settings, VIEW3D_PT_tools_grease_pencil_vertex_appearance, - VIEW3D_PT_tools_grease_pencil_interpolate, VIEW3D_PT_tools_grease_pencil_brush_mixcolor, VIEW3D_PT_tools_grease_pencil_brush_mix_palette, diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index a8caf317467..b9dba991d64 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -101,8 +101,11 @@ void BKE_gpencil_tag(struct bGPdata *gpd); void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd); void BKE_gpencil_batch_cache_free(struct bGPdata *gpd); -void BKE_gpencil_stroke_sync_selection(struct bGPDstroke *gps); -void BKE_gpencil_curve_sync_selection(struct bGPDstroke *gps); +void BKE_gpencil_stroke_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_curve_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_stroke_select_index_set(struct bGPdata *gpd, + struct bGPDstroke *gps, + const bool reset); struct bGPDframe *BKE_gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe); struct bGPDframe *BKE_gpencil_frame_addcopy(struct bGPDlayer *gpl, int cframe); diff --git a/source/blender/blenkernel/BKE_gpencil_curve.h b/source/blender/blenkernel/BKE_gpencil_curve.h index 2d42bb36949..9cbe67af9c1 100644 --- a/source/blender/blenkernel/BKE_gpencil_curve.h +++ b/source/blender/blenkernel/BKE_gpencil_curve.h @@ -50,8 +50,12 @@ struct bGPDcurve *BKE_gpencil_stroke_editcurve_generate(struct bGPDstroke *gps, void BKE_gpencil_stroke_editcurve_update(struct bGPdata *gpd, struct bGPDlayer *gpl, struct bGPDstroke *gps); -void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); -void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); +void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPdata *gpd, + struct bGPDstroke *gps, + struct bGPDcurve *gpc); +void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPdata *gpd, + struct bGPDstroke *gps, + struct bGPDcurve *gpc); void BKE_gpencil_strokes_selected_update_editcurve(struct bGPdata *gpd); void BKE_gpencil_strokes_selected_sync_selection_editcurve(struct bGPdata *gpd); void BKE_gpencil_stroke_update_geometry_from_editcurve(struct bGPDstroke *gps, diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 1aec1ad296d..4167f60e880 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1134,7 +1134,7 @@ bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool in * Ensure selection status of stroke is in sync with its points. * \param gps: Grease pencil stroke */ -void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) +void BKE_gpencil_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps) { bGPDspoint *pt; int i; @@ -1148,6 +1148,7 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) * so initially, we must deselect */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (pt->flag & GP_SPOINT_SELECT) { @@ -1155,9 +1156,13 @@ void BKE_gpencil_stroke_sync_selection(bGPDstroke *gps) break; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps, false); + } } -void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) +void BKE_gpencil_curve_sync_selection(bGPdata *gpd, bGPDstroke *gps) { bGPDcurve *gpc = gps->editcurve; if (gpc == NULL) { @@ -1165,6 +1170,7 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); gpc->flag &= ~GP_CURVE_SELECT; bool is_selected = false; @@ -1187,6 +1193,19 @@ void BKE_gpencil_curve_sync_selection(bGPDstroke *gps) if (is_selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); + } +} + +/* Assign unique stroke ID for selection. */ +void BKE_gpencil_stroke_select_index_set(bGPdata *gpd, bGPDstroke *gps, const bool reset) +{ + if (!reset) { + gpd->select_last_index++; + gps->select_index = gpd->select_last_index; + } + else { + gps->select_index = 0; } } @@ -2512,6 +2531,11 @@ bool BKE_gpencil_from_image( pt->flag |= GP_SPOINT_SELECT; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps, false); + } + BKE_gpencil_stroke_geometry_update(gpd, gps); } } diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index be14d74de7a..6707fb53aa3 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -781,7 +781,7 @@ void BKE_gpencil_stroke_editcurve_update(bGPdata *gpd, bGPDlayer *gpl, bGPDstrok /** * Sync the selection from stroke to editcurve */ -void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc) +void BKE_gpencil_editcurve_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc) { if (gps->flag & GP_STROKE_SELECT) { gpc->flag |= GP_CURVE_SELECT; @@ -808,10 +808,11 @@ void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc /** * Sync the selection from editcurve to stroke */ -void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc) +void BKE_gpencil_stroke_editcurve_sync_selection(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc) { if (gpc->flag & GP_CURVE_SELECT) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -865,6 +866,7 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); for (int i = 0; i < gps->totpoints; i++) { bGPDspoint *pt = &gps->points[i]; pt->flag &= ~GP_SPOINT_SELECT; @@ -1089,6 +1091,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, /* deselect */ pt->flag &= ~GP_SPOINT_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); return; } @@ -1131,6 +1134,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); /* free temp data */ MEM_freeN(points); @@ -1375,7 +1379,7 @@ void BKE_gpencil_strokes_selected_update_editcurve(bGPdata *gpd) BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); } /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -1400,7 +1404,7 @@ void BKE_gpencil_strokes_selected_sync_selection_editcurve(bGPdata *gpd) bGPDcurve *gpc = gps->editcurve; if (gpc != NULL) { /* Update the selection of every stroke that has an editcurve */ - BKE_gpencil_stroke_editcurve_sync_selection(gps, gpc); + BKE_gpencil_stroke_editcurve_sync_selection(gpd, gps, gpc); } } } diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c index 2ef85439a46..2d10645a467 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.c +++ b/source/blender/blenkernel/intern/gpencil_geom.c @@ -3444,6 +3444,7 @@ void BKE_gpencil_stroke_uniform_subdivide(bGPdata *gpd, if (select) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } /* Free the sample points. Important to use the mutable loop here because we are erasing the list diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 25951fa3e6f..c7279dbc815 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -167,8 +167,6 @@ static void scene_init_data(ID *id) &gp_primitive_curve->clipr, CURVE_PRESET_BELL, CURVEMAP_SLOPE_POSITIVE); - /* Grease pencil interpolate. */ - scene->toolsettings->gp_interpolate.step = 1; scene->unit.system = USER_UNIT_METRIC; scene->unit.scale_length = 1.0f; diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 728235e84bf..29041f4ae9d 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1061,14 +1061,6 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } - /* Set the minimum sequence interpolate for grease pencil. */ - if (!DNA_struct_elem_find(fd->filesdna, "GP_Interpolate_Settings", "int", "step")) { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - ToolSettings *ts = scene->toolsettings; - ts->gp_interpolate.step = 1; - } - } - /* Hair and PointCloud attributes. */ for (Hair *hair = bmain->hairs.first; hair != NULL; hair = hair->id.next) { do_versions_point_attributes(&hair->pdata); diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 4c9bde77103..0597de445f4 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -3418,9 +3418,11 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op) if (!deselected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (!deselected) { diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index bf1aff5a34a..aec593b97ea 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -214,7 +214,7 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op) if (gpc->flag & GP_CURVE_NEEDS_STROKE_UPDATE) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -992,6 +992,7 @@ static int gpencil_duplicate_exec(bContext *C, wmOperator *op) pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); changed = true; } @@ -1193,6 +1194,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp /* if the stroke is not reused, deselect */ if (!do_stroke) { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } @@ -1709,6 +1711,7 @@ static int gpencil_strokes_paste_exec(bContext *C, wmOperator *op) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } CTX_DATA_END; @@ -2548,6 +2551,7 @@ static bool gpencil_dissolve_selected_stroke_points(bContext *C, /* deselect the stroke, since none of its selected points will still be selected */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -2620,6 +2624,7 @@ static int gpencil_delete_selected_points(bContext *C) if (gps->flag & GP_STROKE_SELECT) { /* deselect old stroke, since it will be used as template for the new strokes */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); if (is_curve_edit) { bGPDcurve *gpc = gps->editcurve; @@ -3790,7 +3795,7 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op) if (is_curve_edit && gps->editcurve != NULL) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); @@ -4574,6 +4579,7 @@ static int gpencil_stroke_separate_exec(bContext *C, wmOperator *op) else if (mode == GP_SEPARATE_STROKE) { /* deselect old stroke */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); /* unlink from source frame */ BLI_remlink(&gpf->strokes, gps); gps->prev = gps->next = NULL; @@ -4982,6 +4988,7 @@ static int gpencil_cutter_lasso_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } CTX_DATA_END; @@ -5022,6 +5029,7 @@ static int gpencil_cutter_lasso_select(bContext *C, changed = true; pt->flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); float r_hita[3], r_hitb[3]; if (gps->totpoints > 1) { ED_gpencil_select_stroke_segment( diff --git a/source/blender/editors/gpencil/gpencil_edit_curve.c b/source/blender/editors/gpencil/gpencil_edit_curve.c index 031bbd61173..0f9a8c93df9 100644 --- a/source/blender/editors/gpencil/gpencil_edit_curve.c +++ b/source/blender/editors/gpencil/gpencil_edit_curve.c @@ -88,7 +88,7 @@ static int gpencil_stroke_enter_editcurve_mode_exec(bContext *C, wmOperator *op) (gps->editcurve != NULL && gps->editcurve->flag & GP_CURVE_NEEDS_STROKE_UPDATE)) { BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps); /* Update the selection from the stroke to the curve. */ - BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + BKE_gpencil_editcurve_stroke_sync_selection(gpd, gps, gps->editcurve); gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; BKE_gpencil_stroke_geometry_update(gpd, gps); } diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index 454f8d21590..c6f74c39beb 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -103,55 +103,6 @@ typedef struct tGPDdraw { float diff_mat[4][4]; /* matrix */ } tGPDdraw; -/* Temporary interpolate operation data */ -typedef struct tGPDinterpolate_layer { - struct tGPDinterpolate_layer *next, *prev; - - /** layer */ - struct bGPDlayer *gpl; - /** frame before current frame (interpolate-from) */ - struct bGPDframe *prevFrame; - /** frame after current frame (interpolate-to) */ - struct bGPDframe *nextFrame; - /** interpolated frame */ - struct bGPDframe *interFrame; - /** interpolate factor */ - float factor; - -} tGPDinterpolate_layer; - -typedef struct tGPDinterpolate { - /** Current depsgraph from context */ - struct Depsgraph *depsgraph; - /** current scene from context */ - struct Scene *scene; - /** area where painting originated */ - struct ScrArea *area; - /** region where painting originated */ - struct ARegion *region; - /** current GP datablock */ - struct bGPdata *gpd; - /** current material */ - struct Material *mat; - - /** current frame number */ - int cframe; - /** (tGPDinterpolate_layer) layers to be interpolated */ - ListBase ilayers; - /** value for determining the displacement influence */ - float shift; - /** initial interpolation factor for active layer */ - float init_factor; - /** shift low limit (-100%) */ - float low_limit; - /** shift upper limit (200%) */ - float high_limit; - /** flag from toolsettings */ - int flag; - - NumInput num; /* numeric input */ -} tGPDinterpolate; - /* Modal Operator Drawing Callbacks ------------------------ */ void ED_gpencil_draw_fill(struct tGPDdraw *tgpw); diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index ecd243ed595..6a2eae934a2 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -32,6 +32,7 @@ #include "BLI_blenlib.h" #include "BLI_easing.h" +#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_utildefines.h" @@ -53,6 +54,7 @@ #include "BKE_report.h" #include "UI_interface.h" +#include "UI_resources.h" #include "WM_api.h" #include "WM_types.h" @@ -67,6 +69,78 @@ #include "gpencil_intern.h" +/* Temporary interpolate operation data */ +typedef struct tGPDinterpolate_layer { + struct tGPDinterpolate_layer *next, *prev; + + /** layer */ + struct bGPDlayer *gpl; + /** frame before current frame (interpolate-from) */ + struct bGPDframe *prevFrame; + /** frame after current frame (interpolate-to) */ + struct bGPDframe *nextFrame; + /** interpolated frame */ + struct bGPDframe *interFrame; + /** interpolate factor */ + float factor; + + /* Hash tablets to create temp relationship between strokes. */ + struct GHash *used_strokes; + struct GHash *pair_strokes; + +} tGPDinterpolate_layer; + +typedef struct tGPDinterpolate { + /** Current depsgraph from context */ + struct Depsgraph *depsgraph; + /** current scene from context */ + struct Scene *scene; + /** area where painting originated */ + struct ScrArea *area; + /** region where painting originated */ + struct ARegion *region; + /** current object */ + struct Object *ob; + /** current GP datablock */ + struct bGPdata *gpd; + /** current material */ + struct Material *mat; + /* Space Conversion Data */ + struct GP_SpaceConversion gsc; + + /** current frame number */ + int cframe; + /** (tGPDinterpolate_layer) layers to be interpolated */ + ListBase ilayers; + /** value for determining the displacement influence */ + float shift; + /** initial interpolation factor for active layer */ + float init_factor; + /** shift low limit (-100%) */ + float low_limit; + /** shift upper limit (200%) */ + float high_limit; + /** flag from toolsettings */ + int flag; + /** Flip mode. */ + int flipmode; + /** smooth factor */ + float smooth_factor; + /** smooth iterations */ + int smooth_steps; + + NumInput num; /* numeric input */ +} tGPDinterpolate; + +typedef enum eGP_InterpolateFlipMode { + /* No flip. */ + GP_INTERPOLATE_NOFLIP = 0, + /* Flip always. */ + GP_INTERPOLATE_FLIP = 1, + /* Flip if needed. */ + GP_INTERPOLATE_FLIPAUTO = 2, +} eGP_InterpolateFlipMode; + /* ************************************************ */ /* Core/Shared Utilities */ @@ -79,17 +153,150 @@ static bool gpencil_view3d_poll(bContext *C) /* only 3D view */ ScrArea *area = CTX_wm_area(C); if (area && area->spacetype != SPACE_VIEW3D) { - return 0; + return false; } /* need data to interpolate */ if (ELEM(NULL, gpd, gpl)) { - return 0; + return false; } - return 1; + return true; } +/* Return if the stroke must be flipped or not. The logic of the calculation + * is to check if the lines from extremes crossed. All is done in 2D. */ +static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, + Object *ob, + bGPDlayer *gpl, + GP_SpaceConversion *gsc, + bGPDstroke *gps_from, + bGPDstroke *gps_to) +{ + float diff_mat[4][4]; + /* calculate parent matrix */ + BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat); + bGPDspoint *pt, pt_dummy_ps; + float v1a[2], v1b[2], v2a[2], v2b[2]; + + /* Line from start of strokes. */ + pt = &gps_from->points[0]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1a[0], &v1a[1]); + + pt = &gps_to->points[0]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1b[0], &v1b[1]); + + /* Line from end of strokes. */ + pt = &gps_from->points[gps_from->totpoints - 1]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2a[0], &v2a[1]); + + pt = &gps_to->points[gps_to->totpoints - 1]; + gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2b[0], &v2b[1]); + + if (isect_seg_seg_v2(v1a, v1b, v2a, v2b) == ISECT_LINE_LINE_CROSS) { + return true; + } + + return false; +} + +/* Return the stroke related to the selection index, returning the stroke with + * the smallest selection index greater than reference index. */ +static bGPDstroke *gpencil_stroke_get_related(GHash *used_strokes, + bGPDframe *gpf, + const int reference_index) +{ + bGPDstroke *gps_found = NULL; + int lower_index = INT_MAX; + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + if (gps->select_index > reference_index) { + if (!BLI_ghash_haskey(used_strokes, gps)) { + if (gps->select_index < lower_index) { + lower_index = gps->select_index; + gps_found = gps; + } + } + } + } + + /* Set as used. */ + if (gps_found) { + BLI_ghash_insert(used_strokes, gps_found, gps_found); + } + + return gps_found; +} + +/* Load a Hash with the relationship between strokes. */ +static void gpencil_stroke_pair_table(bContext *C, + tGPDinterpolate *tgpi, + tGPDinterpolate_layer *tgpil) +{ + bGPdata *gpd = tgpi->gpd; + const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) && + ((tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) != 0)); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + + /* Create hash tablets with relationship between strokes. */ + tgpil->used_strokes = BLI_ghash_ptr_new(__func__); + tgpil->pair_strokes = BLI_ghash_ptr_new(__func__); + + /* Create a table with source and target pair of strokes. */ + LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) { + bGPDstroke *gps_to = NULL; + /* only selected */ + if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) && + ((gps_from->flag & GP_STROKE_SELECT) == 0)) { + continue; + } + /* skip strokes that are invalid for current view */ + if (ED_gpencil_stroke_can_use(C, gps_from) == false) { + continue; + } + /* Check if the material is editable. */ + if (ED_gpencil_stroke_material_editable(tgpi->ob, tgpil->gpl, gps_from) == false) { + continue; + } + /* Try to get the related stroke. */ + if ((is_multiedit) && (gps_from->select_index > 0)) { + gps_to = gpencil_stroke_get_related( + tgpil->used_strokes, tgpil->nextFrame, gps_from->select_index); + } + /* If not found, get final stroke to interpolate using position in the array. */ + if (gps_to == NULL) { + int fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from); + gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame); + } + + if (ELEM(NULL, gps_from, gps_to)) { + continue; + } + /* Insert the pair entry in the hash table. */ + BLI_ghash_insert(tgpil->pair_strokes, gps_from, gps_to); + } +} + +static void gpencil_interpolate_smooth_stroke(bGPDstroke *gps, + float smooth_factor, + int smooth_steps) +{ + if (smooth_factor == 0.0f) { + return; + } + + float reduce = 0.0f; + for (int r = 0; r < smooth_steps; r++) { + for (int i = 0; i < gps->totpoints - 1; i++) { + BKE_gpencil_stroke_smooth(gps, i, smooth_factor - reduce); + BKE_gpencil_stroke_smooth_strength(gps, i, smooth_factor); + } + reduce += 0.25f; /* reduce the factor */ + } +} /* Perform interpolation */ static void gpencil_interpolate_update_points(const bGPDstroke *gps_from, const bGPDstroke *gps_to, @@ -112,7 +319,7 @@ static void gpencil_interpolate_update_points(const bGPDstroke *gps_from, /* ****************** Interpolate Interactive *********************** */ /* Helper: free all temp strokes for display. */ -static void gpencil_interpolate_free_temp_strokes(bGPDframe *gpf) +static void gpencil_interpolate_free_tagged_strokes(bGPDframe *gpf) { if (gpf == NULL) { return; @@ -152,33 +359,34 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp const float factor = tgpil->factor + shift; bGPDframe *gpf = tgpil->gpl->actframe; - /* Free temp strokes. */ - gpencil_interpolate_free_temp_strokes(gpf); + /* Free temp strokes used for display. */ + gpencil_interpolate_free_tagged_strokes(gpf); - LISTBASE_FOREACH (bGPDstroke *, new_stroke, &tgpil->interFrame->strokes) { - bGPDstroke *gps_from, *gps_to; - int stroke_idx; + /* Clear previous interpolations. */ + gpencil_interpolate_free_tagged_strokes(tgpil->interFrame); - if (new_stroke->totpoints == 0) { - continue; - } + GHashIterator gh_iter; + GHASH_ITER (gh_iter, tgpil->pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); + /* Create new stroke. */ + bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; - /* get strokes to interpolate */ - stroke_idx = BLI_findindex(&tgpil->interFrame->strokes, new_stroke); + /* Update points position. */ + gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); - gps_from = BLI_findlink(&tgpil->prevFrame->strokes, stroke_idx); - gps_to = BLI_findlink(&tgpil->nextFrame->strokes, stroke_idx); + /* Calc geometry data. */ + BKE_gpencil_stroke_geometry_update(gpd, new_stroke); + /* Add to strokes. */ + BLI_addtail(&tgpil->interFrame->strokes, new_stroke); - /* update points position */ - if ((gps_from) && (gps_to)) { - gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); - - /* Add temp strokes. */ - if (gpf) { - bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true); - gps_eval->flag |= GP_STROKE_TAG; - BLI_addtail(&gpf->strokes, gps_eval); - } + /* Add temp strokes to display. */ + if (gpf) { + bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true, true); + gps_eval->flag |= GP_STROKE_TAG; + BLI_addtail(&gpf->strokes, gps_eval); } } } @@ -187,65 +395,50 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL); } -/* Helper: Verify valid strokes for interpolation */ -static bool gpencil_interpolate_check_todo(bContext *C, bGPdata *gpd) +/* Helper: Get previous keyframe. */ +static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl, int cfra) { - Object *ob = CTX_data_active_object(C); - ToolSettings *ts = CTX_data_tool_settings(C); - eGP_Interpolate_SettingsFlag flag = ts->gp_interpolate.flag; - - /* get layers */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* all layers or only active */ - if (!(flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) && !(gpl->flag & GP_LAYER_ACTIVE)) { - continue; - } - /* only editable and visible layers are considered */ - if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) { - continue; - } - - /* read strokes */ - LISTBASE_FOREACH (bGPDstroke *, gps_from, &gpl->actframe->strokes) { - bGPDstroke *gps_to; - int fFrame; - - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - continue; - } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - continue; - } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { - continue; - } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&gpl->actframe->strokes, gps_from); - gps_to = (gpl->actframe->next != NULL) ? - BLI_findlink(&gpl->actframe->next->strokes, fFrame) : - NULL; - if (gps_to == NULL) { - continue; - } - - return true; - } + if (gpl->actframe != NULL && gpl->actframe->framenum < cfra && + gpl->actframe->key_type == BEZT_KEYTYPE_KEYFRAME) { + return gpl->actframe; } - return false; + + LISTBASE_FOREACH_BACKWARD (bGPDframe *, gpf, &gpl->frames) { + if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) { + continue; + } + if (gpf->framenum >= cfra) { + continue; + } + return gpf; + } + + return NULL; +} + +/* Helper: Get next keyframe. */ +static bGPDframe *gpencil_get_next_keyframe(bGPDlayer *gpl, int cfra) +{ + LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { + if (gpf->key_type != BEZT_KEYTYPE_KEYFRAME) { + continue; + } + if (gpf->framenum <= cfra) { + continue; + } + return gpf; + } + + return NULL; } /* Helper: Create internal strokes interpolated */ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) { + Scene *scene = tgpi->scene; bGPdata *gpd = tgpi->gpd; bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); bGPDframe *actframe = active_gpl->actframe; - Object *ob = CTX_data_active_object(C); /* save initial factor for active layer to define shift limits */ tgpi->init_factor = (float)(tgpi->cframe - actframe->framenum) / @@ -274,12 +467,15 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) tgpil = MEM_callocN(sizeof(tGPDinterpolate_layer), "GPencil Interpolate Layer"); tgpil->gpl = gpl; - tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe, true); - tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next, true); + bGPDframe *gpf = gpencil_get_previous_keyframe(gpl, CFRA); + tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpf, true); + + gpf = gpencil_get_next_keyframe(gpl, CFRA); + tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpf, true); BLI_addtail(&tgpi->ilayers, tgpil); - /* create a new temporary frame */ + /* Create a new temporary frame. */ tgpil->interFrame = MEM_callocN(sizeof(bGPDframe), "bGPDframe"); tgpil->interFrame->framenum = tgpi->cframe; @@ -287,63 +483,43 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi) tgpil->factor = (float)(tgpi->cframe - tgpil->prevFrame->framenum) / (tgpil->nextFrame->framenum - tgpil->prevFrame->framenum + 1); - /* create new strokes data with interpolated points reading original stroke */ - LISTBASE_FOREACH (bGPDstroke *, gps_from, &tgpil->prevFrame->strokes) { - bGPDstroke *gps_to; - int fFrame; + /* Load the relationship between frames. */ + gpencil_stroke_pair_table(C, tgpi, tgpil); - bGPDstroke *new_stroke = NULL; - bool valid = true; + /* Create new strokes data with interpolated points reading original stroke. */ + GHashIterator gh_iter; + GHASH_ITER (gh_iter, tgpil->pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - valid = false; + /* If destination stroke is smaller, resize new_stroke to size of gps_to stroke. */ + if (gps_from->totpoints > gps_to->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - valid = false; + if (gps_to->totpoints > gps_from->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, tgpil->gpl, gps_from) == false) { - valid = false; + /* Flip stroke. */ + if (tgpi->flipmode == GP_INTERPOLATE_FLIP) { + BKE_gpencil_stroke_flip(gps_to); } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&tgpil->prevFrame->strokes, gps_from); - gps_to = BLI_findlink(&tgpil->nextFrame->strokes, fFrame); - if (gps_to == NULL) { - valid = false; - } - - if (valid) { - /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ - if (gps_from->totpoints > gps_to->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); - } - if (gps_to->totpoints > gps_from->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); - } - - /* Create new stroke. */ - new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); - - /* Update points position. */ - gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor); - } - else { - /* Create new stroke. */ - new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); - - /* need an empty stroke to keep index correct for lookup, but resize to smallest size */ - new_stroke->totpoints = 0; - new_stroke->points = MEM_recallocN(new_stroke->points, sizeof(*new_stroke->points)); - if (new_stroke->dvert != NULL) { - new_stroke->dvert = MEM_recallocN(new_stroke->dvert, sizeof(*new_stroke->dvert)); + else if (tgpi->flipmode == GP_INTERPOLATE_FLIPAUTO) { + if (gpencil_stroke_need_flip( + tgpi->depsgraph, tgpi->ob, gpl, &tgpi->gsc, gps_from, gps_to)) { + BKE_gpencil_stroke_flip(gps_to); } } + /* Create new stroke. */ + bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; + + /* Update points position. */ + gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, tgpil->factor); + gpencil_interpolate_smooth_stroke(new_stroke, tgpi->smooth_factor, tgpi->smooth_steps); + /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, new_stroke); /* add to strokes */ @@ -429,7 +605,7 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) /* Clear any temp stroke. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { - gpencil_interpolate_free_temp_strokes(gpf); + gpencil_interpolate_free_tagged_strokes(gpf); } } @@ -441,9 +617,18 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) MEM_SAFE_FREE(tgpil->prevFrame); MEM_SAFE_FREE(tgpil->nextFrame); MEM_SAFE_FREE(tgpil->interFrame); + + /* Free Hash tablets. */ + if (tgpil->used_strokes != NULL) { + BLI_ghash_free(tgpil->used_strokes, NULL, NULL); + } + if (tgpil->pair_strokes != NULL) { + BLI_ghash_free(tgpil->pair_strokes, NULL, NULL); + } } BLI_freelistN(&tgpi->ilayers); + MEM_SAFE_FREE(tgpi); } DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -456,24 +641,33 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op) /* Init new temporary interpolation data */ static bool gpencil_interpolate_set_init_values(bContext *C, wmOperator *op, tGPDinterpolate *tgpi) { - ToolSettings *ts = CTX_data_tool_settings(C); - bGPdata *gpd = CTX_data_gpencil_data(C); - /* set current scene and window */ tgpi->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tgpi->scene = CTX_data_scene(C); tgpi->area = CTX_wm_area(C); tgpi->region = CTX_wm_region(C); - tgpi->flag = ts->gp_interpolate.flag; + tgpi->ob = CTX_data_active_object(C); + /* Setup space conversions. */ + gpencil_point_conversion_init(C, &tgpi->gsc); /* set current frame number */ tgpi->cframe = tgpi->scene->r.cfra; /* set GP datablock */ - tgpi->gpd = gpd; - + tgpi->gpd = tgpi->ob->data; /* set interpolation weight */ tgpi->shift = RNA_float_get(op->ptr, "shift"); + SET_FLAG_FROM_TEST( + tgpi->flag, (RNA_enum_get(op->ptr, "layers") == 1), GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS); + SET_FLAG_FROM_TEST( + tgpi->flag, + ((GPENCIL_EDIT_MODE(tgpi->gpd)) && (RNA_boolean_get(op->ptr, "interpolate_selected_only"))), + GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED); + + tgpi->flipmode = RNA_enum_get(op->ptr, "flip"); + + tgpi->smooth_factor = RNA_float_get(op->ptr, "smooth_factor"); + tgpi->smooth_steps = RNA_int_get(op->ptr, "smooth_steps"); /* Untag strokes to be sure nothing is pending due any canceled process. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpi->gpd->layers) { @@ -524,12 +718,13 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent bGPdata *gpd = CTX_data_gpencil_data(C); bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); Scene *scene = CTX_data_scene(C); - int cfra = CFRA; - bGPDframe *actframe = gpl->actframe; tGPDinterpolate *tgpi = NULL; /* cannot interpolate if not between 2 frames */ - if (ELEM(NULL, actframe, actframe->next)) { + int cfra = CFRA; + bGPDframe *gpf_prv = gpencil_get_previous_keyframe(gpl, cfra); + bGPDframe *gpf_next = gpencil_get_next_keyframe(gpl, cfra); + if (ELEM(NULL, gpf_prv, gpf_next)) { BKE_report( op->reports, RPT_ERROR, @@ -537,25 +732,10 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent return OPERATOR_CANCELLED; } - /* cannot interpolate in extremes */ - if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) { - BKE_report(op->reports, - RPT_ERROR, - "Cannot interpolate as current frame already has existing grease pencil frames"); - return OPERATOR_CANCELLED; - } - if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode"); return OPERATOR_CANCELLED; } - - /* need editable strokes */ - if (!gpencil_interpolate_check_todo(C, gpd)) { - BKE_report(op->reports, RPT_ERROR, "Interpolation requires some editable strokes"); - return OPERATOR_CANCELLED; - } - /* try to initialize context data needed */ if (!gpencil_interpolate_init(C, op)) { if (op->customdata) { @@ -602,8 +782,7 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent gpf_dst = BKE_gpencil_layer_frame_get(tgpil->gpl, tgpi->cframe, GP_GETFRAME_ADD_NEW); gpf_dst->key_type = BEZT_KEYTYPE_BREAKDOWN; - /* copy strokes */ - BLI_listbase_clear(&gpf_dst->strokes); + /* Copy strokes. */ LISTBASE_FOREACH (bGPDstroke *, gps_src, &tgpil->interFrame->strokes) { if (gps_src->totpoints == 0) { continue; @@ -710,6 +889,15 @@ static void gpencil_interpolate_cancel(bContext *C, wmOperator *op) void GPENCIL_OT_interpolate(wmOperatorType *ot) { + static const EnumPropertyItem flip_modes[] = { + {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""}, + {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""}, + {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + PropertyRNA *prop; + /* identifiers */ ot->name = "Grease Pencil Interpolation"; ot->idname = "GPENCIL_OT_interpolate"; @@ -724,6 +912,12 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING; + static const EnumPropertyItem gpencil_interpolation_layer_items[] = { + {0, "ACTIVE", 0, "Active", ""}, + {1, "ALL", 0, "All Layers", ""}, + {0, NULL, 0, NULL, NULL}, + }; + /* properties */ RNA_def_float_factor( ot->srna, @@ -735,25 +929,68 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot) "Bias factor for which frame has more influence on the interpolated strokes", -0.9f, 0.9f); + + RNA_def_enum(ot->srna, + "layers", + gpencil_interpolation_layer_items, + 0, + "Layer", + "Layers included in the interpolation"); + + RNA_def_boolean(ot->srna, + "interpolate_selected_only", + 0, + "Only Selected", + "Interpolate only selected strokes"); + + RNA_def_enum(ot->srna, + "flip", + flip_modes, + GP_INTERPOLATE_FLIPAUTO, + "Flip Mode", + "Invert destination stroke to match start and end with source stroke"); + + RNA_def_int(ot->srna, + "smooth_steps", + 1, + 1, + 3, + "Iterations", + "Number of times to smooth newly created strokes", + 1, + 3); + + RNA_def_float(ot->srna, + "smooth_factor", + 0.0f, + 0.0f, + 2.0f, + "Smooth", + "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise", + 0.0f, + 2.0f); + + prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } /* ****************** Interpolate Sequence *********************** */ /* Helper: Perform easing equation calculations for GP interpolation operator */ -static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_settings, float time) +static float gpencil_interpolate_seq_easing_calc(wmOperator *op, float time) { const float begin = 0.0f; const float change = 1.0f; const float duration = 1.0f; - const float back = ipo_settings->back; - const float amplitude = ipo_settings->amplitude; - const float period = ipo_settings->period; - - eBezTriple_Easing easing = ipo_settings->easing; + const float back = RNA_float_get(op->ptr, "back"); + const float amplitude = RNA_float_get(op->ptr, "amplitude"); + const float period = RNA_float_get(op->ptr, "period"); + const eBezTriple_Easing easing = RNA_enum_get(op->ptr, "easing"); + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); float result = time; - switch (ipo_settings->type) { + switch (type) { case GP_IPO_BACK: switch (easing) { case BEZT_IPO_EASE_IN: @@ -936,7 +1173,7 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se break; default: - printf("%s: Unknown interpolation type - %d\n", __func__, ipo_settings->type); + printf("%s: Unknown interpolation type\n", __func__); break; } @@ -945,34 +1182,47 @@ static float gpencil_interpolate_seq_easing_calc(GP_Interpolate_Settings *ipo_se static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) { - bGPdata *gpd = CTX_data_gpencil_data(C); - bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); - bGPDframe *actframe = active_gpl->actframe; - - Object *ob = CTX_data_active_object(C); - ToolSettings *ts = CTX_data_tool_settings(C); + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Scene *scene = CTX_data_scene(C); + ToolSettings *ts = CTX_data_tool_settings(C); + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C); + /* Setup space conversions. */ + GP_SpaceConversion gsc; + gpencil_point_conversion_init(C, &gsc); + int cfra = CFRA; GP_Interpolate_Settings *ipo_settings = &ts->gp_interpolate; - eGP_Interpolate_SettingsFlag flag = ipo_settings->flag; - const int step = ipo_settings->step; + const int step = RNA_int_get(op->ptr, "step"); + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + const bool all_layers = (bool)(RNA_enum_get(op->ptr, "layers") == 1); + const bool only_selected = ((GPENCIL_EDIT_MODE(gpd)) && + (RNA_boolean_get(op->ptr, "interpolate_selected_only") != 0)); - /* cannot interpolate if not between 2 frames */ - if (ELEM(NULL, actframe, actframe->next)) { + eGP_InterpolateFlipMode flipmode = RNA_enum_get(op->ptr, "flip"); + + const float smooth_factor = RNA_float_get(op->ptr, "smooth_factor"); + const int smooth_steps = RNA_int_get(op->ptr, "smooth_steps"); + + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); + + if (ipo_settings->custom_ipo == NULL) { + ipo_settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); + } + BKE_curvemapping_init(ipo_settings->custom_ipo); + + /* Cannot interpolate if not between 2 frames. */ + bGPDframe *gpf_prv = gpencil_get_previous_keyframe(active_gpl, cfra); + bGPDframe *gpf_next = gpencil_get_next_keyframe(active_gpl, cfra); + if (ELEM(NULL, gpf_prv, gpf_next)) { BKE_report( op->reports, RPT_ERROR, "Cannot find a pair of grease pencil frames to interpolate between in active layer"); return OPERATOR_CANCELLED; } - /* cannot interpolate in extremes */ - if (ELEM(cfra, actframe->framenum, actframe->next->framenum)) { - BKE_report(op->reports, - RPT_ERROR, - "Cannot interpolate as current frame already has existing grease pencil frames"); - return OPERATOR_CANCELLED; - } if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { BKE_report(op->reports, RPT_ERROR, "Cannot interpolate in curve edit mode"); @@ -981,103 +1231,137 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) /* loop all layer to check if need interpolation */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - bGPDframe *prevFrame, *nextFrame; - bGPDstroke *gps_from, *gps_to; - int cframe, fFrame; - - /* Need a set of frames to interpolate. */ - if ((gpl->actframe == NULL) || (gpl->actframe->next == NULL)) { - continue; - } /* all layers or only active */ - if (((flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) == 0) && (gpl != active_gpl)) { + if ((!all_layers) && (gpl != active_gpl)) { continue; } /* only editable and visible layers are considered */ if (!BKE_gpencil_layer_is_editable(gpl)) { continue; } + gpf_prv = gpencil_get_previous_keyframe(gpl, cfra); + gpf_next = gpencil_get_next_keyframe(gpl, cfra); - /* store extremes */ - prevFrame = BKE_gpencil_frame_duplicate(gpl->actframe, true); - nextFrame = BKE_gpencil_frame_duplicate(gpl->actframe->next, true); + /* Need a set of frames to interpolate. */ + if ((gpf_prv == NULL) || (gpf_next == NULL)) { + continue; + } - /* Loop over intermediary frames and create the interpolation */ - for (cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) { - bGPDframe *interFrame = NULL; - float factor; + /* Store extremes. */ + bGPDframe *prevFrame = BKE_gpencil_frame_duplicate(gpf_prv, true); + bGPDframe *nextFrame = BKE_gpencil_frame_duplicate(gpf_next, true); - /* get interpolation factor */ + /* Create a table with source and target pair of strokes. */ + GHash *used_strokes = BLI_ghash_ptr_new(__func__); + GHash *pair_strokes = BLI_ghash_ptr_new(__func__); + + LISTBASE_FOREACH (bGPDstroke *, gps_from, &prevFrame->strokes) { + bGPDstroke *gps_to = NULL; + /* Only selected. */ + if ((GPENCIL_EDIT_MODE(gpd)) && (only_selected) && + ((gps_from->flag & GP_STROKE_SELECT) == 0)) { + continue; + } + /* Skip strokes that are invalid for current view. */ + if (ED_gpencil_stroke_can_use(C, gps_from) == false) { + continue; + } + /* Check if the material is editable. */ + if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { + continue; + } + /* Try to get the related stroke. */ + if ((is_multiedit) && (gps_from->select_index > 0)) { + gps_to = gpencil_stroke_get_related(used_strokes, nextFrame, gps_from->select_index); + } + /* If not found, get final stroke to interpolate using position in the array. */ + if (gps_to == NULL) { + int fFrame = BLI_findindex(&prevFrame->strokes, gps_from); + gps_to = BLI_findlink(&nextFrame->strokes, fFrame); + } + + if (ELEM(NULL, gps_from, gps_to)) { + continue; + } + + /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ + if (gps_from->totpoints > gps_to->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); + } + if (gps_to->totpoints > gps_from->totpoints) { + BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); + } + + /* Flip stroke. */ + if (flipmode == GP_INTERPOLATE_FLIP) { + BKE_gpencil_stroke_flip(gps_to); + } + else if (flipmode == GP_INTERPOLATE_FLIPAUTO) { + if (gpencil_stroke_need_flip(depsgraph, ob, gpl, &gsc, gps_from, gps_to)) { + BKE_gpencil_stroke_flip(gps_to); + } + } + + /* Insert the pair entry in the hash table. */ + BLI_ghash_insert(pair_strokes, gps_from, gps_to); + } + + /* Loop over intermediary frames and create the interpolation. */ + for (int cframe = prevFrame->framenum + step; cframe < nextFrame->framenum; cframe += step) { + /* Get interpolation factor. */ float framerange = nextFrame->framenum - prevFrame->framenum; CLAMP_MIN(framerange, 1.0f); - factor = (float)(cframe - prevFrame->framenum) / framerange; + float factor = (float)(cframe - prevFrame->framenum) / framerange; - if (ipo_settings->type == GP_IPO_CURVEMAP) { + if (type == GP_IPO_CURVEMAP) { /* custom curvemap */ if (ipo_settings->custom_ipo) { factor = BKE_curvemapping_evaluateF(ipo_settings->custom_ipo, 0, factor); } else { BKE_report(op->reports, RPT_ERROR, "Custom interpolation curve does not exist"); + continue; } } - else if (ipo_settings->type >= GP_IPO_BACK) { + else if (type >= GP_IPO_BACK) { /* easing equation... */ - factor = gpencil_interpolate_seq_easing_calc(ipo_settings, factor); + factor = gpencil_interpolate_seq_easing_calc(op, factor); } - /* create new strokes data with interpolated points reading original stroke */ - for (gps_from = prevFrame->strokes.first; gps_from; gps_from = gps_from->next) { + /* Apply the factor to all pair of strokes. */ + GHashIterator gh_iter; + GHASH_ITER (gh_iter, pair_strokes) { + bGPDstroke *gps_from = (bGPDstroke *)BLI_ghashIterator_getKey(&gh_iter); + bGPDstroke *gps_to = (bGPDstroke *)BLI_ghashIterator_getValue(&gh_iter); - /* only selected */ - if ((GPENCIL_EDIT_MODE(gpd)) && (flag & GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED) && - ((gps_from->flag & GP_STROKE_SELECT) == 0)) { - continue; - } - /* skip strokes that are invalid for current view */ - if (ED_gpencil_stroke_can_use(C, gps_from) == false) { - continue; - } - /* check if the color is editable */ - if (ED_gpencil_stroke_material_editable(ob, gpl, gps_from) == false) { - continue; - } - - /* get final stroke to interpolate */ - fFrame = BLI_findindex(&prevFrame->strokes, gps_from); - gps_to = BLI_findlink(&nextFrame->strokes, fFrame); - if (gps_to == NULL) { - continue; - } - - /* create a new frame if needed */ - if (interFrame == NULL) { - interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW); - interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN; - } - - /* if destination stroke is smaller, resize new_stroke to size of gps_to stroke */ - if (gps_from->totpoints > gps_to->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_to, gps_from->totpoints, true); - } - if (gps_to->totpoints > gps_from->totpoints) { - BKE_gpencil_stroke_uniform_subdivide(gpd, gps_from, gps_to->totpoints, true); - } - - /* create new stroke */ + /* Create new stroke. */ bGPDstroke *new_stroke = BKE_gpencil_stroke_duplicate(gps_from, true, true); + new_stroke->flag |= GP_STROKE_TAG; + new_stroke->select_index = 0; - /* update points position */ + /* Update points position. */ gpencil_interpolate_update_points(gps_from, gps_to, new_stroke, factor); + gpencil_interpolate_smooth_stroke(new_stroke, smooth_factor, smooth_steps); /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, new_stroke); - /* add to strokes */ + /* Add strokes to frame. */ + bGPDframe *interFrame = BKE_gpencil_layer_frame_get(gpl, cframe, GP_GETFRAME_ADD_NEW); + interFrame->key_type = BEZT_KEYTYPE_BREAKDOWN; + BLI_addtail(&interFrame->strokes, new_stroke); } } + /* Free Hash tablets. */ + if (used_strokes != NULL) { + BLI_ghash_free(used_strokes, NULL, NULL); + } + if (pair_strokes != NULL) { + BLI_ghash_free(pair_strokes, NULL, NULL); + } + BKE_gpencil_free_strokes(prevFrame); BKE_gpencil_free_strokes(nextFrame); MEM_SAFE_FREE(prevFrame); @@ -1091,8 +1375,148 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static void gpencil_interpolate_seq_ui(bContext *C, wmOperator *op) +{ + uiLayout *layout = op->layout; + uiLayout *col, *row; + PointerRNA ptr; + + RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr); + + const eGP_Interpolate_Type type = RNA_enum_get(op->ptr, "type"); + + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + + col = uiLayoutColumn(layout, true); + uiItemR(col, &ptr, "step", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "layers", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "interpolate_selected_only", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "flip", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "smooth_factor", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "smooth_steps", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "type", 0, NULL, ICON_NONE); + + if (type == GP_IPO_CURVEMAP) { + /* Get an RNA pointer to ToolSettings to give to the custom curve. */ + Scene *scene = CTX_data_scene(C); + ToolSettings *ts = scene->toolsettings; + PointerRNA gpsettings_ptr; + RNA_pointer_create( + &scene->id, &RNA_GPencilInterpolateSettings, &ts->gp_interpolate, &gpsettings_ptr); + uiTemplateCurveMapping( + layout, &gpsettings_ptr, "interpolation_curve", 0, false, true, true, false); + } + else if (type != GP_IPO_LINEAR) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "easing", 0, NULL, ICON_NONE); + if (type == GP_IPO_BACK) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "back", 0, NULL, ICON_NONE); + } + else if (type == GP_IPO_ELASTIC) { + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "amplitude", 0, NULL, ICON_NONE); + row = uiLayoutRow(layout, false); + uiItemR(row, &ptr, "period", 0, NULL, ICON_NONE); + } + } +} + void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) { + static const EnumPropertyItem gpencil_interpolation_layer_items[] = { + {0, "ACTIVE", 0, "Active", ""}, + {1, "ALL", 0, "All Layers", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem gpencil_interpolation_type_items[] = { + /* interpolation */ + {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, + {GP_IPO_LINEAR, + "LINEAR", + ICON_IPO_LINEAR, + "Linear", + "Straight-line interpolation between A and B (i.e. no ease in/out)"}, + {GP_IPO_CURVEMAP, + "CUSTOM", + ICON_IPO_BEZIER, + "Custom", + "Custom interpolation defined using a curve map"}, + + /* easing */ + {0, + "", + 0, + N_("Easing (by strength)"), + "Predefined inertial transitions, useful for motion graphics (from least to most " + "''dramatic'')"}, + {GP_IPO_SINE, + "SINE", + ICON_IPO_SINE, + "Sinusoidal", + "Sinusoidal easing (weakest, almost linear but with a slight curvature)"}, + {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"}, + {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"}, + {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"}, + {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"}, + {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"}, + {GP_IPO_CIRC, + "CIRC", + ICON_IPO_CIRC, + "Circular", + "Circular easing (strongest and most dynamic)"}, + + {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"}, + {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"}, + {GP_IPO_BOUNCE, + "BOUNCE", + ICON_IPO_BOUNCE, + "Bounce", + "Exponentially decaying parabolic bounce, like when objects collide"}, + {GP_IPO_ELASTIC, + "ELASTIC", + ICON_IPO_ELASTIC, + "Elastic", + "Exponentially decaying sine wave, like an elastic band"}, + + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem gpencil_interpolation_easing_items[] = { + {BEZT_IPO_EASE_AUTO, + "AUTO", + ICON_IPO_EASE_IN_OUT, + "Automatic Easing", + "Easing type is chosen automatically based on what the type of interpolation used " + "(e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)"}, + + {BEZT_IPO_EASE_IN, + "EASE_IN", + ICON_IPO_EASE_IN, + "Ease In", + "Only on the end closest to the next keyframe"}, + {BEZT_IPO_EASE_OUT, + "EASE_OUT", + ICON_IPO_EASE_OUT, + "Ease Out", + "Only on the end closest to the first keyframe"}, + {BEZT_IPO_EASE_IN_OUT, + "EASE_IN_OUT", + ICON_IPO_EASE_IN_OUT, + "Ease In and Out", + "Segment between both keyframes"}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem flip_modes[] = { + {GP_INTERPOLATE_NOFLIP, "NOFLIP", 0, "No Flip", ""}, + {GP_INTERPOLATE_FLIP, "FLIP", 0, "Flip", ""}, + {GP_INTERPOLATE_FLIPAUTO, "AUTO", 0, "Automatic", ""}, + {0, NULL, 0, NULL, NULL}, + }; + /* identifiers */ ot->name = "Interpolate Sequence"; ot->idname = "GPENCIL_OT_interpolate_sequence"; @@ -1101,6 +1525,103 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) /* api callbacks */ ot->exec = gpencil_interpolate_seq_exec; ot->poll = gpencil_view3d_poll; + ot->ui = gpencil_interpolate_seq_ui; + + RNA_def_int(ot->srna, + "step", + 1, + 1, + MAXFRAME, + "Step", + "Number of frames between generated interpolated frames", + 1, + MAXFRAME); + + RNA_def_enum(ot->srna, + "layers", + gpencil_interpolation_layer_items, + 0, + "Layer", + "Layers included in the interpolation"); + + RNA_def_boolean(ot->srna, + "interpolate_selected_only", + 0, + "Only Selected", + "Interpolate only selected strokes"); + + RNA_def_enum(ot->srna, + "flip", + flip_modes, + GP_INTERPOLATE_FLIPAUTO, + "Flip Mode", + "Invert destination stroke to match start and end with source stroke"); + + RNA_def_int(ot->srna, + "smooth_steps", + 1, + 1, + 3, + "Iterations", + "Number of times to smooth newly created strokes", + 1, + 3); + + RNA_def_float(ot->srna, + "smooth_factor", + 0.0f, + 0.0f, + 2.0f, + "Smooth", + "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise", + 0.0f, + 2.0f); + + RNA_def_enum(ot->srna, + "type", + gpencil_interpolation_type_items, + 0, + "Type", + "Interpolation method to use the next time 'Interpolate Sequence' is run"); + + RNA_def_enum( + ot->srna, + "easing", + gpencil_interpolation_easing_items, + 0, + "Easing", + "Which ends of the segment between the preceding and following grease pencil frames " + "easing interpolation is applied to"); + + RNA_def_float(ot->srna, + "back", + 1.702f, + 0.0f, + FLT_MAX, + "Back", + "Amount of overshoot for 'back' easing", + 0.0f, + FLT_MAX); + + RNA_def_float(ot->srna, + "amplitude", + 0.15f, + 0.0f, + FLT_MAX, + "Amplitude", + "Amount to boost elastic bounces for 'elastic' easing", + 0.0f, + FLT_MAX); + + RNA_def_float(ot->srna, + "period", + 0.15f, + -FLT_MAX, + FLT_MAX, + "Period", + "Time between bounces for elastic easing", + -FLT_MAX, + FLT_MAX); /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -1110,19 +1631,30 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) static bool gpencil_interpolate_reverse_poll(bContext *C) { - if (!gpencil_view3d_poll(C)) { - return 0; + ScrArea *area = CTX_wm_area(C); + if (area == NULL) { + return false; + } + if ((area->spacetype != SPACE_VIEW3D) && (area->spacetype != SPACE_ACTION)) { + return false; } - bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); + bGPdata *gpd = ED_gpencil_data_get_active(C); + if (gpd == NULL) { + return false; + } + bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); + if (gpl == NULL) { + return false; + } /* need to be on a breakdown frame */ if ((gpl->actframe == NULL) || (gpl->actframe->key_type != BEZT_KEYTYPE_BREAKDOWN)) { CTX_wm_operator_poll_msg_set(C, "Expected current frame to be a breakdown"); - return 0; + return false; } - return 1; + return true; } static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) @@ -1132,7 +1664,11 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) /* Go through each layer, deleting the breakdowns around the current frame, * but only if there is a keyframe nearby to stop at */ - CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) { + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + /* only editable and visible layers are considered */ + if (!BKE_gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) { + continue; + } bGPDframe *start_key = NULL; bGPDframe *end_key = NULL; bGPDframe *gpf, *gpfn; @@ -1193,7 +1729,6 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) BLI_freelinkN(&gpl->frames, end_key); } } - CTX_DATA_END; /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -1205,7 +1740,7 @@ static int gpencil_interpolate_reverse_exec(bContext *C, wmOperator *UNUSED(op)) void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Breakdowns"; + ot->name = "Delete Breakdowns"; ot->idname = "GPENCIL_OT_interpolate_reverse"; ot->description = "Remove breakdown frames generated by interpolating between two Grease Pencil frames"; @@ -1217,5 +1752,3 @@ void GPENCIL_OT_interpolate_reverse(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } - -/* *************************************************************** */ diff --git a/source/blender/editors/gpencil/gpencil_merge.c b/source/blender/editors/gpencil/gpencil_merge.c index 435bff34998..8d8734dfd1f 100644 --- a/source/blender/editors/gpencil/gpencil_merge.c +++ b/source/blender/editors/gpencil/gpencil_merge.c @@ -104,6 +104,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo Main *bmain = CTX_data_main(C); ToolSettings *ts = CTX_data_tool_settings(C); Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; bGPDlayer *gpl = CTX_data_active_gpencil_layer(C); Scene *scene = CTX_data_scene(C); @@ -133,6 +134,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo /* stroke */ bGPDstroke *gps = BKE_gpencil_stroke_new(MAX2(ob->actcol - 1, 0), totpoints, brush->size); gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); if (cyclic) { gps->flag |= GP_STROKE_CYCLIC; @@ -241,6 +243,7 @@ static void gpencil_calc_points_factor(bContext *C, } } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } } diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index f347a4fe6b9..4eec4c7d00e 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -338,6 +338,7 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi) ED_gpencil_fill_vertex_color_set(ts, brush, gps); gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); /* the polygon must be closed, so enabled cyclic */ if (ELEM(tgpi->type, GP_STROKE_BOX, GP_STROKE_CIRCLE)) { gps->flag |= GP_STROKE_CYCLIC; diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index d1d8abd6775..fd5c5bb5346 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -156,6 +156,11 @@ static bool gpencil_3d_point_to_screen_space(ARegion *region, /* helper to deselect all selected strokes/points */ static void deselect_all_selected(bContext *C) { + /* Set selection index to 0. */ + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + gpd->select_last_index = 0; + CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) { /* deselect stroke and its points if selected */ if (gps->flag & GP_STROKE_SELECT) { @@ -169,6 +174,7 @@ static void deselect_all_selected(bContext *C) /* deselect stroke itself too */ gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } /* deselect curve and curve points */ @@ -187,7 +193,7 @@ static void deselect_all_selected(bContext *C) CTX_DATA_END; } -static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool deselect) +static void select_all_curve_points(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc, bool deselect) { for (int i = 0; i < gpc->tot_curve_points; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -205,10 +211,12 @@ static void select_all_curve_points(bGPDstroke *gps, bGPDcurve *gpc, bool desele if (deselect == false) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } @@ -423,7 +431,7 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op) BEZT_DESEL_ALL(&gpc_pt->bezt); } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); changed = true; } } @@ -562,6 +570,7 @@ static bool gpencil_select_same_layer(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); changed = true; } @@ -578,6 +587,7 @@ static bool gpencil_select_same_layer(bContext *C) } gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); changed = true; } @@ -622,6 +632,7 @@ static bool gpencil_select_same_material(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); changed = true; } @@ -640,6 +651,7 @@ static bool gpencil_select_same_material(bContext *C) } gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); changed = true; } @@ -756,6 +768,8 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[0].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); + if ((extend == false) && (gps->totpoints > 1)) { for (int i = 1; i < gpc->tot_curve_points; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -769,6 +783,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) else { gps->points->flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -863,6 +878,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[gpc->tot_curve_points - 1].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); if ((extend == false) && (gps->totpoints > 1)) { for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -876,6 +892,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) else { gps->points[gps->totpoints - 1].flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -1272,10 +1289,12 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd, if (select) { pt_active->flag |= GP_SPOINT_SELECT; gps_active->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps_active, false); } else { pt_active->flag &= ~GP_SPOINT_SELECT; gps_active->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps_active, true); } changed = true; /* if stroke mode, don't check more points */ @@ -1314,13 +1333,13 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd, BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active); gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; /* Select all curve points. */ - select_all_curve_points(gps_active, gps_active->editcurve, false); + select_all_curve_points(gpd, gps_active, gps_active->editcurve, false); BKE_gpencil_stroke_geometry_update(gpd, gps_active); changed = true; } /* Ensure that stroke selection is in sync with its points. */ - BKE_gpencil_stroke_sync_selection(gps_active); + BKE_gpencil_stroke_sync_selection(gpd, gps_active); return changed; } @@ -1338,6 +1357,9 @@ static bool gpencil_do_curve_circle_sel(bContext *C, { ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + const bool only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED); bool hit = false; @@ -1411,7 +1433,7 @@ static bool gpencil_do_curve_circle_sel(bContext *C, } } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); return hit; } @@ -1631,7 +1653,7 @@ static bool gpencil_stroke_fill_isect_rect(ARegion *region, #endif static bool gpencil_generic_curve_select(bContext *C, - Object *UNUSED(ob), + Object *ob, GPencilTestFn is_inside_fn, rcti UNUSED(box), GP_SelectUserData *user_data, @@ -1640,6 +1662,7 @@ static bool gpencil_generic_curve_select(bContext *C, { ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); + bGPdata *gpd = ob->data; const bool handle_only_selected = (v3d->overlay.handle_display == CURVE_HANDLE_SELECTED); const bool handle_all = (v3d->overlay.handle_display == CURVE_HANDLE_ALL); @@ -1771,7 +1794,7 @@ static bool gpencil_generic_curve_select(bContext *C, } } - BKE_gpencil_curve_sync_selection(gps); + BKE_gpencil_curve_sync_selection(gpd, gps); } GP_EDITABLE_CURVES_END(gps_iter); @@ -1797,6 +1820,8 @@ static bool gpencil_generic_stroke_select(bContext *C, /* deselect all strokes first? */ if (SEL_OP_USE_PRE_DESELECT(sel_op) || (GPENCIL_PAINT_MODE(gpd))) { + /* Set selection index to 0. */ + gpd->select_last_index = 0; CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) { bGPDspoint *pt; @@ -1807,6 +1832,7 @@ static bool gpencil_generic_stroke_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } CTX_DATA_END; @@ -1891,13 +1917,13 @@ static bool gpencil_generic_stroke_select(bContext *C, BKE_gpencil_stroke_editcurve_update(gpd, gpl, gps_active); gps_active->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; /* Select all curve points. */ - select_all_curve_points(gps_active, gps_active->editcurve, false); + select_all_curve_points(gpd, gps_active, gps_active->editcurve, false); BKE_gpencil_stroke_geometry_update(gpd, gps_active); changed = true; } /* Ensure that stroke selection is in sync with its points */ - BKE_gpencil_stroke_sync_selection(gps_active); + BKE_gpencil_stroke_sync_selection(gpd, gps_active); } GP_EVALUATED_STROKES_END(gpstroke_iter); @@ -2313,7 +2339,7 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) } /* select all curve points */ if (hit_curve != NULL) { - select_all_curve_points(hit_stroke, hit_curve, deselect); + select_all_curve_points(gpd, hit_stroke, hit_curve, deselect); } else { bGPDspoint *pt; @@ -2332,9 +2358,11 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) /* stroke too... */ if (deselect == false) { hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); } else { hit_stroke->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, hit_stroke, true); } } } @@ -2346,11 +2374,13 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) BEZT_SEL_IDX(&hit_curve_point->bezt, hit_curve_handle); hit_curve->flag |= GP_CURVE_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); } else { /* we're adding selection, so selection must be true */ hit_point->flag |= GP_SPOINT_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); /* expand selection to segment */ int selectmode; @@ -2378,14 +2408,14 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) if (!BEZT_ISSEL_ANY(&hit_curve_point->bezt)) { hit_curve_point->flag &= ~GP_CURVE_POINT_SELECT; } - BKE_gpencil_curve_sync_selection(hit_stroke); + BKE_gpencil_curve_sync_selection(gpd, hit_stroke); } else { /* deselect point */ hit_point->flag &= ~GP_SPOINT_SELECT; /* ensure that stroke is selected correctly */ - BKE_gpencil_stroke_sync_selection(hit_stroke); + BKE_gpencil_stroke_sync_selection(gpd, hit_stroke); } } } @@ -2572,6 +2602,7 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op) if (gps_selected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); /* Extend stroke selection. */ if (selectmode == GP_SELECTMODE_STROKE) { diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index 9b12772bc9b..f9242c5a1a8 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -1167,6 +1167,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph, if (keep_original) { gps_active = BKE_gpencil_stroke_duplicate(gps, true, true); gps_active->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps_active, true); for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -1689,6 +1690,10 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob) gps->flag |= GP_STROKE_SELECT; } } + + if (gps->flag & GP_STROKE_SELECT) { + BKE_gpencil_stroke_select_index_set(gpd, gps, false); + } } } @@ -2564,6 +2569,9 @@ int ED_gpencil_select_stroke_segment(bGPdata *gpd, void ED_gpencil_select_toggle_all(bContext *C, int action) { + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + /* for "toggle", test for existing selected strokes */ if (action == SEL_TOGGLE) { action = SEL_SELECT; @@ -2588,6 +2596,9 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) * NOTE: we limit ourselves to editable layers, since once a layer is "locked/hidden * nothing should be able to touch it */ + /* Set selection index to 0. */ + gpd->select_last_index = 0; + CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) { /* deselect all strokes on all frames */ @@ -2605,6 +2616,7 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) } gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } } @@ -2642,9 +2654,11 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) /* Change status of stroke */ if (selected) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } CTX_DATA_END; @@ -2666,6 +2680,11 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) } if (action == SEL_DESELECT) { + /* Set selection index to 0. */ + Object *ob = CTX_data_active_object(C); + bGPdata *gpd = ob->data; + gpd->select_last_index = 0; + GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc) { for (int i = 0; i < gpc->tot_curve_points; i++) { @@ -2676,6 +2695,7 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) } gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } GP_EDITABLE_CURVES_END(gps_iter); } @@ -2717,10 +2737,12 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) if (selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } } GP_EDITABLE_STROKES_END(gps_iter); diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 835761bf6e9..9d969a29add 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -306,6 +306,10 @@ typedef struct bGPDstroke { float uv_translation[2]; float uv_scale; + /** Stroke selection index.*/ + int select_index; + char _pad4[4]; + /** Vertex weight data. */ struct MDeformVert *dvert; void *_pad3; @@ -701,6 +705,10 @@ typedef struct bGPdata { /** Keyframe type for onion filter (eBezTriple_KeyframeType plus All option) */ short onion_keytype; + /** Stroke selection last index. Used to generate a unique selection index. */ + int select_last_index; + char _pad3[4]; + bGPgrid grid; bGPdata_Runtime runtime; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 2362686cfce..c7f7e610a1a 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1132,22 +1132,6 @@ typedef enum eGP_vertex_SelectMaskFlag { /* Settings for GP Interpolation Operators */ typedef struct GP_Interpolate_Settings { - /** #eGP_Interpolate_SettingsFlag. */ - short flag; - - /** #eGP_Interpolate_Type - Interpolation Mode. */ - char type; - /** #eBezTriple_Easing - Easing mode (if easing equation used). */ - char easing; - - /** BEZT_IPO_BACK. */ - float back; - /** BEZT_IPO_ELASTIC. */ - float amplitude, period; - /* Step between sequence interpolated frames. */ - int step; - char _pad[4]; - /** Custom interpolation curve (for use with GP_IPO_CURVEMAP). */ struct CurveMapping *custom_ipo; } GP_Interpolate_Settings; diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 5437c93ef61..631ab1c4671 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -717,7 +717,7 @@ static void rna_GPencil_stroke_point_select_set(PointerRNA *ptr, const bool valu } /* Check if the stroke should be selected or not... */ - BKE_gpencil_stroke_sync_selection(gps); + BKE_gpencil_stroke_sync_selection(gpd, gps); } } @@ -933,6 +933,7 @@ static void rna_GPencil_stroke_close(ID *id, static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) { + bGPdata *gpd = (bGPdata *)ptr->owner_id; bGPDstroke *gps = ptr->data; bGPDspoint *pt; int i; @@ -940,9 +941,11 @@ static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) /* set new value */ if (value) { gps->flag |= GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(gpd, gps, false); } else { gps->flag &= ~GP_STROKE_SELECT; + BKE_gpencil_stroke_select_index_set(NULL, gps, true); } /* ensure that the stroke's points are selected in the same way */ @@ -1744,6 +1747,11 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Vertex Fill Color", "Color used to mix with fill color to get final color"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Selection Index */ + prop = RNA_def_property(srna, "select_index", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "select_index"); + RNA_def_property_ui_text(prop, "Select Index", "Index of selection used for interpolation"); } static void rna_def_gpencil_strokes_api(BlenderRNA *brna, PropertyRNA *cprop) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 9479d15c2cc..8c01b28df5a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -735,27 +735,6 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UN ED_gpencil_tag_scene_gpencil(scene); } -/* Grease Pencil Interpolation settings */ -static char *rna_GPencilInterpolateSettings_path(PointerRNA *UNUSED(ptr)) -{ - return BLI_strdup("tool_settings.gpencil_interpolate"); -} - -static void rna_GPencilInterpolateSettings_type_set(PointerRNA *ptr, int value) -{ - GP_Interpolate_Settings *settings = (GP_Interpolate_Settings *)ptr->data; - - /* NOTE: This cast should be fine, as we have a small + finite set of values - * (#eGP_Interpolate_Type) that should fit well within a char. - */ - settings->type = (char)value; - - /* init custom interpolation curve here now the first time it's used */ - if ((settings->type == GP_IPO_CURVEMAP) && (settings->custom_ipo == NULL)) { - settings->custom_ipo = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); - } -} - static void rna_Gpencil_extend_selection(bContext *C, PointerRNA *UNUSED(ptr)) { /* Extend selection to all points in all selected strokes. */ @@ -2688,69 +2667,10 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna) srna = RNA_def_struct(brna, "GPencilInterpolateSettings", NULL); RNA_def_struct_sdna(srna, "GP_Interpolate_Settings"); - RNA_def_struct_path_func(srna, "rna_GPencilInterpolateSettings_path"); RNA_def_struct_ui_text(srna, "Grease Pencil Interpolate Settings", "Settings for Grease Pencil interpolation tools"); - /* flags */ - prop = RNA_def_property(srna, "interpolate_all_layers", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS); - RNA_def_property_ui_text( - prop, "Interpolate All Layers", "Interpolate all layers, not only active"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "interpolate_selected_only", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED); - RNA_def_property_ui_text(prop, - "Interpolate Selected Strokes", - "Interpolate only selected strokes in the original frame"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* interpolation type */ - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_interpolation_mode_items); - RNA_def_property_enum_funcs(prop, NULL, "rna_GPencilInterpolateSettings_type_set", NULL); - RNA_def_property_ui_text( - prop, "Type", "Interpolation method to use the next time 'Interpolate Sequence' is run"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "step", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, MAXFRAME); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Step", "Number of frames between generated interpolated frames"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* easing */ - prop = RNA_def_property(srna, "easing", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "easing"); - RNA_def_property_enum_items(prop, rna_enum_beztriple_interpolation_easing_items); - RNA_def_property_ui_text( - prop, - "Easing", - "Which ends of the segment between the preceding and following grease pencil frames " - "easing interpolation is applied to"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - /* easing options */ - prop = RNA_def_property(srna, "back", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "back"); - RNA_def_property_ui_text(prop, "Back", "Amount of overshoot for 'back' easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "amplitude"); - RNA_def_property_range(prop, 0.0f, FLT_MAX); /* only positive values... */ - RNA_def_property_ui_text( - prop, "Amplitude", "Amount to boost elastic bounces for 'elastic' easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - - prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "period"); - RNA_def_property_ui_text(prop, "Period", "Time between bounces for elastic easing"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); - /* custom curvemap */ prop = RNA_def_property(srna, "interpolation_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "custom_ipo"); @@ -2759,7 +2679,6 @@ static void rna_def_gpencil_interpolate(BlenderRNA *brna) prop, "Interpolation Curve", "Custom curve to control 'sequence' interpolation between Grease Pencil frames"); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); } static void rna_def_transform_orientation(BlenderRNA *brna) From 116cda65a2ca1c346c057739ee03ec6396b1af95 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 17:56:24 +0100 Subject: [PATCH 320/519] UI: fuzzy search in collection search This adds fuzzy search functionality to various input fields in Blender where one can choose a value from many existing values (e.g. the Vertex Group property in the Displace modifier). Differential Revision: https://developer.blender.org/D10446 --- .../editors/interface/interface_utils.c | 106 ++++++++++-------- 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 824fb6272f6..5311bb57da9 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -33,6 +33,7 @@ #include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_string.h" +#include "BLI_string_search.h" #include "BLI_utildefines.h" #include "BLT_translation.h" @@ -374,15 +375,31 @@ typedef struct CollItemSearch { uint has_sep_char : 1; } CollItemSearch; -static int sort_search_items_list(const void *a, const void *b) +static bool add_collection_search_item(CollItemSearch *cis, + const bool requires_exact_data_name, + const bool has_id_icon, + uiSearchItems *items) { - const CollItemSearch *cis1 = a; - const CollItemSearch *cis2 = b; + char name_buf[UI_MAX_DRAW_STR]; - if (BLI_strcasecmp(cis1->name, cis2->name) > 0) { - return 1; + /* If no item has an own icon to display, libraries can use the library icons rather than the + * name prefix for showing the library status. */ + int name_prefix_offset = cis->name_prefix_offset; + if (!has_id_icon && cis->is_id && !requires_exact_data_name) { + cis->iconid = UI_icon_from_library(cis->data); + /* No need to re-allocate, string should be shorter than before (lib status prefix is + * removed). */ + BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset); + BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name)); + strcpy(cis->name, name_buf); } - return 0; + + return UI_search_item_add(items, + cis->name, + cis->data, + cis->iconid, + cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0, + name_prefix_offset); } void ui_rna_collection_search_update_fn(const struct bContext *C, @@ -392,9 +409,7 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, { uiRNACollectionSearch *data = arg; const int flag = RNA_property_flag(data->target_prop); - int i = 0; ListBase *items_list = MEM_callocN(sizeof(ListBase), "items_list"); - CollItemSearch *cis; const bool is_ptr_target = (RNA_property_type(data->target_prop) == PROP_POINTER); /* For non-pointer properties, UI code acts entirely based on the item's name. So the name has to * match the RNA name exactly. So only for pointer properties, the name can be modified to add @@ -405,13 +420,10 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, char *name; bool has_id_icon = false; - /* Prepare matching all words. */ - const size_t str_len = strlen(str); - const int words_max = BLI_string_max_possible_word_count(str_len); - int(*words)[2] = BLI_array_alloca(words, words_max); - const int words_len = BLI_string_find_split_words(str, str_len, ' ', words, words_max); + StringSearch *search = skip_filter ? NULL : BLI_string_search_new(); /* build a temporary list of relevant items first */ + int item_index = 0; RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) { if (flag & PROP_ID_SELF_CHECK) { @@ -456,54 +468,50 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, } if (name) { - if (skip_filter || - BLI_string_all_words_matched(name + name_prefix_offset, str, words, words_len)) { - cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); - cis->data = itemptr.data; - cis->name = BLI_strdup(name); - cis->index = i; - cis->iconid = iconid; - cis->is_id = is_id; - cis->name_prefix_offset = name_prefix_offset; - cis->has_sep_char = has_sep_char; - BLI_addtail(items_list, cis); + CollItemSearch *cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); + cis->data = itemptr.data; + cis->name = BLI_strdup(name); + cis->index = item_index; + cis->iconid = iconid; + cis->is_id = is_id; + cis->name_prefix_offset = name_prefix_offset; + cis->has_sep_char = has_sep_char; + if (!skip_filter) { + BLI_string_search_add(search, name, cis); } + BLI_addtail(items_list, cis); if (name != name_buf) { MEM_freeN(name); } } - i++; + item_index++; } RNA_PROP_END; - BLI_listbase_sort(items_list, sort_search_items_list); - - /* add search items from temporary list */ - for (cis = items_list->first; cis; cis = cis->next) { - /* If no item has an own icon to display, libraries can use the library icons rather than the - * name prefix for showing the library status. */ - int name_prefix_offset = cis->name_prefix_offset; - if (!has_id_icon && cis->is_id && !requires_exact_data_name) { - cis->iconid = UI_icon_from_library(cis->data); - /* No need to re-allocate, string should be shorter than before (lib status prefix is - * removed). */ - BKE_id_full_name_ui_prefix_get(name_buf, cis->data, false, UI_SEP_CHAR, &name_prefix_offset); - BLI_assert(strlen(name_buf) <= MEM_allocN_len(cis->name)); - strcpy(cis->name, name_buf); - } - - if (!UI_search_item_add(items, - cis->name, - cis->data, - cis->iconid, - cis->has_sep_char ? UI_BUT_HAS_SEP_CHAR : 0, - name_prefix_offset)) { - break; + if (skip_filter) { + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { + break; + } } } + else { + CollItemSearch **filtered_items; + int filtered_amount = BLI_string_search_query(search, str, (void ***)&filtered_items); - for (cis = items_list->first; cis; cis = cis->next) { + for (int i = 0; i < filtered_amount; i++) { + CollItemSearch *cis = filtered_items[i]; + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { + break; + } + } + + MEM_freeN(filtered_items); + BLI_string_search_free(search); + } + + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { MEM_freeN(cis->name); } BLI_freelistN(items_list); From a346a7dd109a58ec38bc35f44a4089e5b54f5044 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Fri, 19 Feb 2021 18:00:16 +0100 Subject: [PATCH 321/519] GPencil: Don't show only lines in draw mode As now is possible to use multiframe in Draw mode, the option to display only lines must be disabled. --- source/blender/draw/engines/gpencil/gpencil_engine.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 5eaeeca8bab..8bb336ebc96 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -488,6 +488,7 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl, { gpIterPopulateData *iter = (gpIterPopulateData *)thunk; + bGPdata *gpd = iter->ob->data; MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings(iter->ob, gps->mat_nr + 1); const bool is_render = iter->pd->is_render; @@ -496,8 +497,8 @@ static void gpencil_stroke_cache_populate(bGPDlayer *gpl, (!is_render && ((gps->flag & GP_STROKE_NOFILL) != 0)); bool show_fill = (gps->tot_triangles > 0) && ((gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0) && (!iter->pd->simplify_fill) && ((gps->flag & GP_STROKE_NOFILL) == 0); - - bool only_lines = gpl && gpf && gpl->actframe != gpf && iter->pd->use_multiedit_lines_only; + bool only_lines = !GPENCIL_PAINT_MODE(gpd) && gpl && gpf && gpl->actframe != gpf && + iter->pd->use_multiedit_lines_only; bool is_onion = gpl && gpf && gpf->runtime.onion_id != 0; bool hide_onion = is_onion && ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); if ((hide_material) || (!show_stroke && !show_fill) || (only_lines && !is_onion) || From a23c7fd570d200bd95b0012fd6afd341f7d88d8d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Feb 2021 18:08:40 +0100 Subject: [PATCH 322/519] Geometry Nodes: forbid creating attribute with empty name Empty attribute names are just a recipe for problems. --- source/blender/blenkernel/intern/attribute_access.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index dcf5f6434cf..f394a4acb0c 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -1641,9 +1641,12 @@ bool GeometryComponent::attribute_try_create(const StringRef attribute_name, const CustomDataType data_type) { using namespace blender::bke; + if (attribute_name.is_empty()) { + return false; + } const ComponentAttributeProviders *providers = this->get_attribute_providers(); if (providers == nullptr) { - return {}; + return false; } const BuiltinAttributeProvider *builtin_provider = providers->builtin_attribute_providers().lookup_default_as(attribute_name, nullptr); From b1142858d4ca5b26aea80fd7ffe2d2a39d4daf3d Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Fri, 19 Feb 2021 19:02:57 +0100 Subject: [PATCH 323/519] Revert "Fix T80313: Fix clipped text in splash screen on hiDPI monitors" This reverts commit 7ee518cf705fcebee2d110bfbb6bf00a0f170efb. Causes T84869. The initial issue is less bad than this. We are looking into alternative fixes for 2.93 (see D9854 and D9853). --- source/blender/editors/interface/interface.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 319ae385ffc..6e62d6f1140 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -4079,11 +4079,6 @@ static uiBut *ui_def_but(uiBlock *block, } #endif - /* Always keep text in radio-buttons (expanded enums) center aligned. */ - if (ELEM(but->type, UI_BTYPE_ROW)) { - but->drawflag &= ~UI_BUT_TEXT_LEFT; - } - but->drawflag |= (block->flag & UI_BUT_ALIGN); if (block->lock == true) { From 4891d4b3d1f38bde32d939153fe8f7d66f249cc7 Mon Sep 17 00:00:00 2001 From: Eitan Date: Fri, 19 Feb 2021 13:20:04 -0600 Subject: [PATCH 324/519] Geometry Nodes: Add simple subdivision surface node Add the Simple subdivision option to Geometry nodes, as a new node instead of part of the existing subdivision node because of future backend changes to the Simple option. (See T85584) https://developer.blender.org/D10409 --- release/scripts/startup/nodeitems_builtins.py | 1 + source/blender/blenkernel/BKE_node.h | 1 + source/blender/blenkernel/intern/node.cc | 1 + source/blender/nodes/CMakeLists.txt | 1 + source/blender/nodes/NOD_geometry.h | 1 + source/blender/nodes/NOD_static_types.h | 1 + .../node_geo_subdivision_surface_simple.cc | 112 ++++++++++++++++++ 7 files changed, 118 insertions(+) create mode 100644 source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 9d7485a0837..bc2678ffdd2 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -516,6 +516,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeTriangulate"), NodeItem("GeometryNodeEdgeSplit"), NodeItem("GeometryNodeSubdivisionSurface"), + NodeItem("GeometryNodeSubdivisionSurfaceSimple"), ]), GeometryNodeCategory("GEO_POINT", "Point", items=[ NodeItem("GeometryNodePointDistribute"), diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 7984bbc980a..77d850ec2f6 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1372,6 +1372,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_VOLUME_TO_MESH 1026 #define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027 #define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028 +#define GEO_NODE_SUBDIVISION_SURFACE_SIMPLE 1029 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 248d2776678..228d3e0d825 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -4794,6 +4794,7 @@ static void registerGeometryNodes() register_node_type_geo_points_to_volume(); register_node_type_geo_sample_texture(); register_node_type_geo_subdivision_surface(); + register_node_type_geo_subdivision_surface_simple(); register_node_type_geo_transform(); register_node_type_geo_triangulate(); register_node_type_geo_volume_to_mesh(); diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 94b6148ff9b..c9eb0c43bba 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -168,6 +168,7 @@ set(SRC geometry/nodes/node_geo_point_translate.cc geometry/nodes/node_geo_points_to_volume.cc geometry/nodes/node_geo_subdivision_surface.cc + geometry/nodes/node_geo_subdivision_surface_simple.cc geometry/nodes/node_geo_transform.cc geometry/nodes/node_geo_triangulate.cc geometry/nodes/node_geo_volume_to_mesh.cc diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index 8980855fd51..3ee8067e81a 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -52,6 +52,7 @@ void register_node_type_geo_point_translate(void); void register_node_type_geo_points_to_volume(void); void register_node_type_geo_sample_texture(void); void register_node_type_geo_subdivision_surface(void); +void register_node_type_geo_subdivision_surface_simple(void); void register_node_type_geo_transform(void); void register_node_type_geo_triangulate(void); void register_node_type_geo_volume_to_mesh(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 15f078cebf2..962ad70eda4 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -297,6 +297,7 @@ DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_PROXIMITY, def_geo_attribute_proximity, DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "") DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_COMBINE_XYZ, def_geo_attribute_combine_xyz, "ATTRIBUTE_COMBINE_XYZ", AttributeCombineXYZ, "Attribute Combine XYZ", "") DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_SEPARATE_XYZ, def_geo_attribute_separate_xyz, "ATTRIBUTE_SEPARATE_XYZ", AttributeSeparateXYZ, "Attribute Separate XYZ", "") +DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE_SIMPLE, 0, "SUBDIVISION_SURFACE_SIMPLE", SubdivisionSurfaceSimple, "Simple Subdivision Surface", "") /* undefine macros */ #undef DefNode diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc new file mode 100644 index 00000000000..f6ea68fb63f --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc @@ -0,0 +1,112 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "MEM_guardedalloc.h" + +#include "BKE_mesh.h" +#include "BKE_subdiv.h" +#include "BKE_subdiv_mesh.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "node_geometry_util.hh" + +static bNodeSocketTemplate geo_node_subdivision_surface_simple_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_INT, N_("Level"), 1, 0, 0, 0, 0, 6}, + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_subdivision_surface_simple_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +namespace blender::nodes { + +static void geo_node_subdivision_surface_simple_exec(GeoNodeExecParams params) +{ + GeometrySet geometry_set = params.extract_input("Geometry"); + + if (!geometry_set.has_mesh()) { + params.set_output("Geometry", geometry_set); + return; + } + +#ifndef WITH_OPENSUBDIV + params.error_message_add(NodeWarningType::Error, + "Disabled, Blender was built without OpenSubdiv"); + params.set_output("Geometry", std::move(geometry_set)); + return; +#endif + + /* See CCGSUBSURF_LEVEL_MAX for max limit. */ + const int subdiv_level = clamp_i(params.extract_input("Level"), 0, 11); + + if (subdiv_level == 0) { + params.set_output("Geometry", std::move(geometry_set)); + return; + } + + const Mesh *mesh_in = geometry_set.get_mesh_for_read(); + + /* Initialize mesh settings. */ + SubdivToMeshSettings mesh_settings; + mesh_settings.resolution = (1 << subdiv_level) + 1; + mesh_settings.use_optimal_display = false; + + /* Initialize subdivision settings. */ + SubdivSettings subdiv_settings = {0}; + subdiv_settings.is_simple = true; + subdiv_settings.is_adaptive = false; + subdiv_settings.use_creases = false; + subdiv_settings.level = 1; + + /* Apply subdivision from mesh. */ + Subdiv *subdiv = BKE_subdiv_update_from_mesh(nullptr, &subdiv_settings, mesh_in); + + /* In case of bad topology, skip to input mesh. */ + if (subdiv == nullptr) { + params.set_output("Geometry", std::move(geometry_set)); + return; + } + + Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in); + BKE_mesh_calc_normals(mesh_out); + + geometry_set.replace_mesh(mesh_out); + + BKE_subdiv_free(subdiv); + + params.set_output("Geometry", std::move(geometry_set)); +} +} // namespace blender::nodes + +void register_node_type_geo_subdivision_surface_simple() +{ + static bNodeType ntype; + + geo_node_type_base(&ntype, + GEO_NODE_SUBDIVISION_SURFACE_SIMPLE, + "Simple Subdivision Surface", + NODE_CLASS_GEOMETRY, + 0); + node_type_socket_templates( + &ntype, geo_node_subdivision_surface_simple_in, geo_node_subdivision_surface_simple_out); + ntype.geometry_node_execute = blender::nodes::geo_node_subdivision_surface_simple_exec; + nodeRegisterType(&ntype); +} From 55700ac3906f182be8d3dff6f7d63cc27463d91b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 13:50:38 -0600 Subject: [PATCH 325/519] Cleanup: Fix clang tidy warning 0 cannot be used to initialize the whole settings struct. --- .../geometry/nodes/node_geo_subdivision_surface_simple.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc index f6ea68fb63f..2a0cb727cd6 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface_simple.cc @@ -70,11 +70,14 @@ static void geo_node_subdivision_surface_simple_exec(GeoNodeExecParams params) mesh_settings.use_optimal_display = false; /* Initialize subdivision settings. */ - SubdivSettings subdiv_settings = {0}; + SubdivSettings subdiv_settings; subdiv_settings.is_simple = true; subdiv_settings.is_adaptive = false; subdiv_settings.use_creases = false; subdiv_settings.level = 1; + subdiv_settings.vtx_boundary_interpolation = BKE_subdiv_vtx_boundary_interpolation_from_subsurf( + 0); + subdiv_settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(0); /* Apply subdivision from mesh. */ Subdiv *subdiv = BKE_subdiv_update_from_mesh(nullptr, &subdiv_settings, mesh_in); From 34580748dcf0a3656dd634fc90cb00ec27367376 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 13:56:49 -0600 Subject: [PATCH 326/519] Fix T83027: Incorrect outliner collection state after operator The "Hide Collection" operators assigned to the number keys in edit mode trigger a redraw of the outliner, but as an optimization, they do *not* trigger a rebuild of the tree. This optimization is valid because unlike the collection exclude toggle, the heirarchy is not affected by collection visibility. However, it means that currently you must trigger a rebuild to get the correct "grayed out" status after using the operator. Rather than trigger a rebuild in this case to solve the bug, this patch moves the decision for whether to gray out the text of a tree element to the draw step rather than the build step. This means that any change to the corresponding properties doesn't require a full tree rebuild. Note that changing the "hide_viewport" property from the outliner still causes a tree rebuild. I think that's because of the checks in `outliner_collection_set_flag_recursive_fn`. That could be optimized in the future. Differential Revision: https://developer.blender.org/D10240 --- .../editors/space_outliner/outliner_draw.c | 40 +++++++++++++++++-- .../editors/space_outliner/outliner_intern.h | 3 +- .../tree/tree_display_view_layer.cc | 8 ---- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 76c710b3db1..844f2ee8209 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -2958,6 +2958,41 @@ static void outliner_set_coord_tree_element(TreeElement *te, int startx, int sta } } +static bool element_should_draw_faded(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + if (tselem->type == 0) { + switch (te->idcode) { + case ID_OB: { + const Object *ob = (const Object *)tselem->id; + /* Lookup in view layer is logically const as it only checks a cache. */ + const Base *base = (te->directdata) ? (const Base *)te->directdata : + BKE_view_layer_base_find( + (ViewLayer *)tvc->view_layer, (Object *)ob); + const bool is_visible = (base != NULL) && (base->flag & BASE_VISIBLE_VIEWLAYER); + if (!is_visible) { + return true; + } + } + } + } + switch (tselem->type) { + case TSE_LAYER_COLLECTION: { + const LayerCollection *layer_collection = (const LayerCollection *)te->directdata; + const bool is_visibe = layer_collection->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER; + const bool is_excluded = layer_collection->flag & LAYER_COLLECTION_EXCLUDE; + return !is_visibe || is_excluded; + } + } + + if (te->flag & TE_CHILD_NOT_IN_COLLECTION) { + return true; + } + + return false; +} + static void outliner_draw_tree_element(bContext *C, uiBlock *block, const uiFontStyle *fstyle, @@ -2981,10 +3016,7 @@ static void outliner_draw_tree_element(bContext *C, outliner_icon_background_colors(icon_bgcolor, icon_border); if (*starty + 2 * UI_UNIT_Y >= region->v2d.cur.ymin && *starty <= region->v2d.cur.ymax) { - const float alpha_fac = ((te->flag & TE_DISABLED) || (te->flag & TE_CHILD_NOT_IN_COLLECTION) || - draw_grayed_out) ? - 0.5f : - 1.0f; + const float alpha_fac = element_should_draw_faded(tvc, te, tselem) ? 0.5f : 1.0f; int xmax = region->v2d.cur.xmax; if ((tselem->flag & TSE_TEXTBUT) && (*te_edit == NULL)) { diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index b65b1a57143..9413b7a9613 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -153,8 +153,7 @@ enum { TE_ICONROW = (1 << 1), TE_LAZY_CLOSED = (1 << 2), TE_FREE_NAME = (1 << 3), - TE_DISABLED = (1 << 4), - TE_DRAGGING = (1 << 5), + TE_DRAGGING = (1 << 4), TE_CHILD_NOT_IN_COLLECTION = (1 << 6), /* Child elements of the same type in the icon-row are drawn merged as one icon. * This flag is set for an element that is part of these merged child icons. */ diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc index f7740f4648f..afdee185d0d 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc @@ -143,10 +143,6 @@ void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree, if (!(tselem->used || ID_IS_LINKED(id) || ID_IS_OVERRIDE_LIBRARY(id))) { tselem->flag &= ~TSE_CLOSED; } - - if (exclude || (lc->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER) == 0) { - ten->flag |= TE_DISABLED; - } } add_layer_collections_recursive(ten->subtree, lc->layer_collections, *ten); @@ -165,10 +161,6 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree, TreeElement *te_object = outliner_add_element( &space_outliner_, &tree, base->object, &ten, 0, 0); te_object->directdata = base; - - if (!(base->flag & BASE_VISIBLE_VIEWLAYER)) { - te_object->flag |= TE_DISABLED; - } } } From b8bf662cceb358bbc9066ec936ccccf51ece91a0 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 14:05:54 -0600 Subject: [PATCH 327/519] Cleanup: Comment formatting, spelling --- .../editors/space_outliner/outliner_draw.c | 82 +++++++++---------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 844f2ee8209..0badff12b1f 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -1876,9 +1876,7 @@ static void outliner_buttons(const bContext *C, tselem = TREESTORE(te); BLI_assert(tselem->flag & TSE_TEXTBUT); - /* If we add support to rename Sequence. - * need change this. - */ + /* If we add support to rename Sequence, need change this. */ if (tselem->type == TSE_EBONE) { len = sizeof(((EditBone *)0)->name); @@ -1912,11 +1910,11 @@ static void outliner_buttons(const bContext *C, ""); UI_but_func_rename_set(bt, namebutton_fn, tselem); - /* returns false if button got removed */ + /* Returns false if button got removed. */ if (false == UI_but_active_only(C, region, block, bt)) { tselem->flag &= ~TSE_TEXTBUT; - /* bad! (notifier within draw) without this, we don't get a refresh */ + /* Bad! (notifier within draw) without this, we don't get a refresh. */ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL); } } @@ -2623,7 +2621,7 @@ static void tselem_draw_icon(uiBlock *block, /* Collection colors and icons covered by restrict buttons. */ if (!is_clickable || x >= xmax || is_collection) { - /* placement of icons, copied from interface_widgets.c */ + /* Placement of icons, copied from interface_widgets.c */ float aspect = (0.8f * UI_UNIT_Y) / ICON_DEFAULT_HEIGHT; x += 2.0f * aspect; y += 2.0f * aspect; @@ -2647,8 +2645,7 @@ static void tselem_draw_icon(uiBlock *block, /* Reduce alpha to match icon buttons */ alpha *= 0.8f; - /* restrict column clip... it has been coded by simply overdrawing, - * doesn't work for buttons */ + /* Restrict column clip. it has been coded by simply overdrawing, doesn't work for buttons. */ uchar color[4]; if (UI_icon_get_theme_color(data.icon, color)) { UI_icon_draw_ex(x, y, data.icon, U.inv_dpi_fac, alpha, 0.0f, color, true); @@ -2980,9 +2977,9 @@ static bool element_should_draw_faded(const TreeViewContext *tvc, switch (tselem->type) { case TSE_LAYER_COLLECTION: { const LayerCollection *layer_collection = (const LayerCollection *)te->directdata; - const bool is_visibe = layer_collection->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER; + const bool is_visible = layer_collection->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER; const bool is_excluded = layer_collection->flag & LAYER_COLLECTION_EXCLUDE; - return !is_visibe || is_excluded; + return !is_visible || is_excluded; } } @@ -3023,18 +3020,18 @@ static void outliner_draw_tree_element(bContext *C, *te_edit = te; } - /* icons can be ui buts, we don't want it to overlap with restrict */ + /* Icons can be ui buts, we don't want it to overlap with restrict .*/ if (restrict_column_width > 0) { xmax -= restrict_column_width + UI_UNIT_X; } GPU_blend(GPU_BLEND_ALPHA); - /* colors for active/selected data */ + /* Colors for active/selected data. */ if (tselem->type == 0) { if (te->idcode == ID_SCE) { if (tselem->id == (ID *)tvc->scene) { - /* active scene */ + /* Active scene. */ icon_bgcolor[3] = 0.2f; active = OL_DRAWSEL_ACTIVE; } @@ -3051,26 +3048,26 @@ static void outliner_draw_tree_element(bContext *C, if (is_selected) { if (ob == tvc->obact) { - /* active selected object */ + /* Active selected object. */ UI_GetThemeColor3ubv(TH_ACTIVE_OBJECT, text_color); text_color[3] = 255; } else { - /* other selected objects */ + /* Other selected objects. */ UI_GetThemeColor3ubv(TH_SELECTED_OBJECT, text_color); text_color[3] = 255; } } } else if (is_object_data_in_editmode(tselem->id, tvc->obact)) { - /* objects being edited */ + /* Objects being edited. */ UI_GetThemeColor4fv(TH_EDITED_OBJECT, icon_bgcolor); icon_border[3] = 0.3f; active = OL_DRAWSEL_ACTIVE; } else { if (tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false)) { - /* active items like camera or material */ + /* Active items like camera or material. */ icon_bgcolor[3] = 0.2f; active = OL_DRAWSEL_ACTIVE; } @@ -3088,7 +3085,7 @@ static void outliner_draw_tree_element(bContext *C, /* Active collection. */ } - /* active circle */ + /* Active circle. */ if (active != OL_DRAWSEL_NONE) { outliner_draw_active_indicator((float)startx + offsx + UI_UNIT_X, (float)*starty, @@ -3124,7 +3121,7 @@ static void outliner_draw_tree_element(bContext *C, } offsx += UI_UNIT_X; - /* datatype icon */ + /* Data-type icon. */ if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) { tselem_draw_icon(block, xmax, @@ -3151,7 +3148,7 @@ static void outliner_draw_tree_element(bContext *C, } GPU_blend(GPU_BLEND_NONE); - /* name */ + /* Name. */ if ((tselem->flag & TSE_TEXTBUT) == 0) { if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) { UI_GetThemeColorBlend3ubv(TH_BACK, TH_TEXT, 0.75f, text_color); @@ -3163,11 +3160,11 @@ static void outliner_draw_tree_element(bContext *C, offsx += (int)(UI_UNIT_X + UI_fontstyle_string_width(fstyle, te->name)); - /* closed item, we draw the icons, not when it's a scene, or master-server list though */ + /* Closed item, we draw the icons, not when it's a scene, or master-server list though. */ if (!TSELEM_OPEN(tselem, space_outliner)) { if (te->subtree.first) { if (tselem->type == 0 && te->idcode == ID_SCE) { - /* pass */ + /* Pass. */ } /* this tree element always has same amount of branches, so don't draw */ else if (tselem->type != TSE_R_LAYER) { @@ -3194,7 +3191,7 @@ static void outliner_draw_tree_element(bContext *C, } } } - /* store coord and continue, we need coordinates for elements outside view too */ + /* Store coord and continue, we need coordinates for elements outside view too. */ te->xs = startx; te->ys = *starty; te->xend = startx + offsx; @@ -3348,7 +3345,7 @@ static void outliner_draw_struct_marks(ARegion *region, LISTBASE_FOREACH (TreeElement *, te, lb) { TreeStoreElem *tselem = TREESTORE(te); - /* selection status */ + /* Selection status. */ if (TSELEM_OPEN(tselem, space_outliner)) { if (tselem->type == TSE_RNA_STRUCT) { GPUVertFormat *format = immVertexFormat(); @@ -3399,7 +3396,7 @@ static void outliner_draw_highlights_recursive(uint pos, const TreeStoreElem *tselem = TREESTORE(te); const int start_y = *io_start_y; - /* selection status */ + /* Selection status. */ if ((tselem->flag & TSE_ACTIVE) && (tselem->flag & TSE_SELECTED)) { immUniformColor4fv(col_active); immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y); @@ -3409,12 +3406,12 @@ static void outliner_draw_highlights_recursive(uint pos, immRecti(pos, 0, start_y, (int)region->v2d.cur.xmax, start_y + UI_UNIT_Y); } - /* highlights */ + /* Highlights. */ if (tselem->flag & (TSE_DRAG_ANY | TSE_HIGHLIGHTED | TSE_SEARCHMATCH)) { const int end_x = (int)region->v2d.cur.xmax; if (tselem->flag & TSE_DRAG_ANY) { - /* drag and drop highlight */ + /* Drag and drop highlight. */ float col[4]; UI_GetThemeColorShade4fv(TH_BACK, -40, col); @@ -3437,14 +3434,13 @@ static void outliner_draw_highlights_recursive(uint pos, } else { if (is_searching && (tselem->flag & TSE_SEARCHMATCH)) { - /* search match highlights - * we don't expand items when searching in the data-blocks but we - * still want to highlight any filter matches. */ + /* Ssearch match highlights. We don't expand items when searching in the data-blocks, + * but we still want to highlight any filter matches. */ immUniformColor4fv(col_searchmatch); immRecti(pos, start_x, start_y, end_x, start_y + UI_UNIT_Y); } else if (tselem->flag & TSE_HIGHLIGHTED) { - /* mouse hover highlight */ + /* Mouse hover highlight. */ immUniformColor4fv(col_highlight); immRecti(pos, 0, start_y, end_x, start_y + UI_UNIT_Y); } @@ -3476,9 +3472,9 @@ static void outliner_draw_highlights(ARegion *region, float col_selection[4], col_active[4], col_searchmatch[4]; UI_GetThemeColor3fv(TH_SELECT_HIGHLIGHT, col_selection); - col_selection[3] = 1.0f; /* no alpha */ + col_selection[3] = 1.0f; /* No alpha. */ UI_GetThemeColor3fv(TH_SELECT_ACTIVE, col_active); - col_active[3] = 1.0f; /* no alpha */ + col_active[3] = 1.0f; /* No alpha. */ UI_GetThemeColor4fv(TH_MATCH, col_searchmatch); col_searchmatch[3] = 0.5f; @@ -3528,12 +3524,12 @@ static void outliner_draw_tree(bContext *C, outliner_draw_struct_marks(region, space_outliner, &space_outliner->tree, &starty); } - /* draw highlights before hierarchy */ + /* Draw highlights before hierarchy. */ starty = (int)region->v2d.tot.ymax - UI_UNIT_Y - OL_Y_OFFSET; startx = 0; outliner_draw_highlights(region, space_outliner, startx, &starty); - /* set scissor so tree elements or lines can't overlap restriction icons */ + /* Set scissor so tree elements or lines can't overlap restriction icons. */ int scissor[4] = {0}; if (restrict_column_width > 0.0f) { int mask_x = BLI_rcti_size_x(®ion->v2d.mask) - (int)restrict_column_width + 1; @@ -3567,7 +3563,7 @@ static void outliner_draw_tree(bContext *C, } if (restrict_column_width > 0.0f) { - /* reset scissor */ + /* Reset scissor. */ GPU_scissor(UNPACK4(scissor)); } } @@ -3634,7 +3630,7 @@ static void outliner_update_viewable_area(ARegion *region, int sizex = outliner_width(space_outliner, tree_width, restrict_column_width); int sizey = tree_height; - /* extend size to allow for horizontal scrollbar and extra offset */ + /* Extend size to allow for horizontal scrollbar and extra offset. */ sizey += V2D_SCROLL_HEIGHT + OL_Y_OFFSET; UI_view2d_totRect_set(®ion->v2d, sizex, sizey); @@ -3657,27 +3653,27 @@ void draw_outliner(const bContext *C) outliner_build_tree(mainvar, tvc.scene, tvc.view_layer, space_outliner, region); /* Always. */ - /* If global sync select is dirty, flag other outliners */ + /* If global sync select is dirty, flag other outliners. */ if (ED_outliner_select_sync_is_dirty(C)) { ED_outliner_select_sync_flag_outliners(C); } - /* Sync selection state from view layer */ + /* Sync selection state from view layer. */ if (!ELEM(space_outliner->outlinevis, SO_LIBRARIES, SO_DATA_API, SO_ID_ORPHANS) && space_outliner->flag & SO_SYNC_SELECT) { outliner_sync_selection(C, space_outliner); } - /* force display to pixel coords */ + /* Force display to pixel coords. */ v2d->flag |= (V2D_PIXELOFS_X | V2D_PIXELOFS_Y); - /* set matrix for 2d-view controls */ + /* Set matrix for 2D-view controls. */ UI_view2d_view_ortho(v2d); - /* Only show mode column in View Layers and Scenes view */ + /* Only show mode column in View Layers and Scenes view. */ const bool use_mode_column = (space_outliner->flag & SO_MODE_COLUMN) && (ELEM(space_outliner->outlinevis, SO_VIEW_LAYER, SO_SCENES)); - /* draw outliner stuff (background, hierarchy lines and names) */ + /* Draw outliner stuff (background, hierarchy lines and names). */ const float restrict_column_width = outliner_restrict_columns_width(space_outliner); outliner_back(region); block = UI_block_begin(C, region, __func__, UI_EMBOSS); From ee1c674775fd60352502f4d6062dbd4637865f9d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 14:39:08 -0600 Subject: [PATCH 328/519] UI: Use property split in geometry node properties This makes the nodes look more consistent with the rest of the UI by using the same split with right aligned labels as the property editor and elsewhere. Additionally, for consistency, the "Type" part of some dropdowns is removed. It already wasn't displayed everywhere, and it gets redundant quite quickly. --- .../geometry/nodes/node_geo_align_rotation_to_vector.cc | 2 ++ .../geometry/nodes/node_geo_attribute_combine_xyz.cc | 9 ++++++--- .../nodes/geometry/nodes/node_geo_attribute_compare.cc | 6 ++++-- .../nodes/geometry/nodes/node_geo_attribute_fill.cc | 2 ++ .../nodes/geometry/nodes/node_geo_attribute_math.cc | 8 +++++--- .../nodes/geometry/nodes/node_geo_attribute_mix.cc | 2 ++ .../geometry/nodes/node_geo_attribute_separate_xyz.cc | 2 ++ .../geometry/nodes/node_geo_attribute_vector_math.cc | 8 +++++--- .../nodes/geometry/nodes/node_geo_point_rotate.cc | 3 +++ .../blender/nodes/geometry/nodes/node_geo_point_scale.cc | 2 ++ .../nodes/geometry/nodes/node_geo_point_translate.cc | 2 ++ 11 files changed, 35 insertions(+), 11 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc index 9f898cc545b..fca460e3566 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc @@ -40,6 +40,8 @@ static void geo_node_align_rotation_to_vector_layout(uiLayout *layout, PointerRNA *ptr) { uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "pivot_axis", 0, IFACE_("Pivot"), ICON_NONE); uiLayout *col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc index 5214d938fb1..564668af274 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc @@ -40,9 +40,12 @@ static void geo_node_attribute_combine_xyz_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "input_type_x", 0, IFACE_("Type X"), ICON_NONE); - uiItemR(layout, ptr, "input_type_y", 0, IFACE_("Type Y"), ICON_NONE); - uiItemR(layout, ptr, "input_type_z", 0, IFACE_("Type Z"), ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiLayout *col = uiLayoutColumn(layout, false); + uiItemR(col, ptr, "input_type_x", 0, IFACE_("X"), ICON_NONE); + uiItemR(col, ptr, "input_type_y", 0, IFACE_("Y"), ICON_NONE); + uiItemR(col, ptr, "input_type_z", 0, IFACE_("Z"), ICON_NONE); } namespace blender::nodes { diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc index 350935c75d1..db1a5d18744 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_compare.cc @@ -56,8 +56,10 @@ static void geo_node_attribute_compare_layout(uiLayout *layout, PointerRNA *ptr) { uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); - uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); } static void geo_node_attribute_compare_init(bNodeTree *UNUSED(tree), bNode *node) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc index e4cdd04b46b..f3bf69d567d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc @@ -42,6 +42,8 @@ static bNodeSocketTemplate geo_node_attribute_fill_out[] = { static void geo_node_attribute_fill_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "data_type", 0, "", ICON_NONE); // uiItemR(layout, ptr, "domain", 0, "", ICON_NONE); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc index 17718949de3..c8cfcb1c24f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc @@ -115,13 +115,15 @@ static void geo_node_attribute_math_layout(uiLayout *layout, bContext *UNUSED(C) NodeMathOperation operation = (NodeMathOperation)node_storage->operation; uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); if (operation_use_input_b(operation)) { - uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); } if (operation_use_input_c(operation)) { - uiItemR(layout, ptr, "input_type_c", 0, IFACE_("Type C"), ICON_NONE); + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE); } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc index 34503b8525e..9d8cd3dfa82 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc @@ -46,6 +46,8 @@ static bNodeSocketTemplate geo_node_mix_attribute_out[] = { static void geo_node_attribute_mix_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "blend_type", 0, "", ICON_NONE); uiLayout *col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "input_type_factor", 0, IFACE_("Factor"), ICON_NONE); diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc index 970cf71f8fc..0ba89562ec1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -40,6 +40,8 @@ static void geo_node_attribute_separate_xyz_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc index 45b28d154f4..aa207860f32 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc @@ -77,13 +77,15 @@ static void geo_node_attribute_vector_math_layout(uiLayout *layout, const NodeVectorMathOperation operation = (const NodeVectorMathOperation)node_storage.operation; uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); - uiItemR(layout, ptr, "input_type_a", 0, IFACE_("Type A"), ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiItemR(layout, ptr, "input_type_a", 0, IFACE_("A"), ICON_NONE); if (operation_use_input_b(operation)) { - uiItemR(layout, ptr, "input_type_b", 0, IFACE_("Type B"), ICON_NONE); + uiItemR(layout, ptr, "input_type_b", 0, IFACE_("B"), ICON_NONE); } if (operation_use_input_c(operation)) { - uiItemR(layout, ptr, "input_type_c", 0, IFACE_("Type C"), ICON_NONE); + uiItemR(layout, ptr, "input_type_c", 0, IFACE_("C"), ICON_NONE); } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc index fc2a5edc675..5eef2fabce0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_rotate.cc @@ -44,6 +44,9 @@ static void geo_node_point_rotate_layout(uiLayout *layout, bContext *UNUSED(C), uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); uiItemR(layout, ptr, "space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + uiLayout *col = uiLayoutColumn(layout, false); if (storage->type == GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE) { uiItemR(col, ptr, "input_type_axis", 0, IFACE_("Axis"), ICON_NONE); diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc index b73c8251e72..e28013a8bfc 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc @@ -35,6 +35,8 @@ static bNodeSocketTemplate geo_node_point_scale_out[] = { static void geo_node_point_scale_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc index 0b9d561bccb..cb3cd012c77 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_translate.cc @@ -35,6 +35,8 @@ static bNodeSocketTemplate geo_node_point_translate_out[] = { static void geo_node_point_translate_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); uiItemR(layout, ptr, "input_type", 0, IFACE_("Type"), ICON_NONE); } From a961a2189cb38ffb368d6781aa57177bfefe0e36 Mon Sep 17 00:00:00 2001 From: Edgar Roman Cervantes Date: Fri, 19 Feb 2021 16:03:14 -0600 Subject: [PATCH 329/519] Geometry Nodes: Add string input node This commit adds a simple string input node, intended for use in the attribute workflow to make using the same attribute name in multiple places easier. The node is function node similar to the existing vector input node. Ref T84971 Differential Revision: https://developer.blender.org/D10316 --- release/scripts/startup/nodeitems_builtins.py | 1 + source/blender/blenkernel/BKE_node.h | 1 + source/blender/blenkernel/intern/node.cc | 13 +++ source/blender/makesdna/DNA_node_types.h | 4 + source/blender/makesrna/intern/rna_nodetree.c | 47 +++++++++++ source/blender/nodes/CMakeLists.txt | 1 + source/blender/nodes/NOD_function.h | 1 + source/blender/nodes/NOD_static_types.h | 1 + .../function/nodes/node_fn_input_string.cc | 84 +++++++++++++++++++ 9 files changed, 153 insertions(+) create mode 100644 source/blender/nodes/function/nodes/node_fn_input_string.cc diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index bc2678ffdd2..ba0a22af0d1 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -508,6 +508,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeCollectionInfo"), NodeItem("FunctionNodeRandomFloat"), NodeItem("ShaderNodeValue"), + NodeItem("FunctionNodeInputString"), NodeItem("FunctionNodeInputVector"), NodeItem("GeometryNodeIsViewport"), ]), diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 77d850ec2f6..8652adecaf9 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1388,6 +1388,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define FN_NODE_OBJECT_TRANSFORMS 1205 #define FN_NODE_RANDOM_FLOAT 1206 #define FN_NODE_INPUT_VECTOR 1207 +#define FN_NODE_INPUT_STRING 1208 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 228d3e0d825..b96adce7cca 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -523,6 +523,13 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree) BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage); MEM_SAFE_FREE(nc->matte_id); } + else if (node->type == FN_NODE_INPUT_STRING) { + NodeInputString *storage = (NodeInputString *)node->storage; + if (storage->string) { + BLO_write_string(writer, storage->string); + } + BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage); + } else if (node->typeinfo != &NodeTypeUndefined) { BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage); } @@ -685,6 +692,11 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) iuser->scene = nullptr; break; } + case FN_NODE_INPUT_STRING: { + NodeInputString *storage = (NodeInputString *)node->storage; + BLO_read_data_address(reader, &storage->string); + break; + } default: break; } @@ -4806,6 +4818,7 @@ static void registerFunctionNodes() register_node_type_fn_combine_strings(); register_node_type_fn_float_compare(); register_node_type_fn_group_instance_id(); + register_node_type_fn_input_string(); register_node_type_fn_input_vector(); register_node_type_fn_object_transforms(); register_node_type_fn_random_float(); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 9633ef8e121..e72e9632483 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1140,6 +1140,10 @@ typedef struct NodeInputVector { float vector[3]; } NodeInputVector; +typedef struct NodeInputString { + char *string; +} NodeInputString; + typedef struct NodeGeometryRotatePoints { /* GeometryNodeRotatePointsType */ uint8_t type; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index b372ff4c273..65de8c479b8 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4113,6 +4113,38 @@ void rna_ShaderNodePointDensity_density_minmax(bNode *self, RE_point_density_minmax(depsgraph, pd, r_min, r_max); } +static void rna_NodeInputString_string_get(PointerRNA *ptr, char *value) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + strcpy(value, (storage->string) ? storage->string : ""); +} + +static int rna_NodeInputString_string_length(PointerRNA *ptr) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + return (storage->string) ? strlen(storage->string) : 0; +} + +static void rna_NodeInputString_string_set(PointerRNA *ptr, const char *value) +{ + bNode *node = (bNode *)ptr->data; + NodeInputString *storage = node->storage; + + if (storage->string) { + MEM_freeN(storage->string); + } + + if (value && value[0]) { + storage->string = BLI_strdup(value); + } + else { + storage->string = NULL; + } +} #else static const EnumPropertyItem prop_image_layer_items[] = { @@ -4539,6 +4571,21 @@ static void def_fn_input_vector(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_fn_input_string(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeInputString", "storage"); + + prop = RNA_def_property(srna, "string", PROP_STRING, PROP_NONE); + RNA_def_property_string_funcs(prop, + "rna_NodeInputString_string_get", + "rna_NodeInputString_string_length", + "rna_NodeInputString_string_set"); + RNA_def_property_ui_text(prop, "String", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + /* -- Shader Nodes ---------------------------------------------------------- */ static void def_sh_output(StructRNA *srna) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index c9eb0c43bba..8c5081555fc 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -135,6 +135,7 @@ set(SRC function/nodes/node_fn_combine_strings.cc function/nodes/node_fn_float_compare.cc function/nodes/node_fn_group_instance_id.cc + function/nodes/node_fn_input_string.cc function/nodes/node_fn_input_vector.cc function/nodes/node_fn_object_transforms.cc function/nodes/node_fn_random_float.cc diff --git a/source/blender/nodes/NOD_function.h b/source/blender/nodes/NOD_function.h index b5279f7d914..6b184f04af7 100644 --- a/source/blender/nodes/NOD_function.h +++ b/source/blender/nodes/NOD_function.h @@ -24,6 +24,7 @@ void register_node_type_fn_boolean_math(void); void register_node_type_fn_combine_strings(void); void register_node_type_fn_float_compare(void); void register_node_type_fn_group_instance_id(void); +void register_node_type_fn_input_string(void); void register_node_type_fn_input_vector(void); void register_node_type_fn_object_transforms(void); void register_node_type_fn_random_float(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 962ad70eda4..35550bdec48 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -267,6 +267,7 @@ DefNode(FunctionNode, FN_NODE_COMBINE_STRINGS, 0, "COMBINE_STRINGS DefNode(FunctionNode, FN_NODE_OBJECT_TRANSFORMS, 0, "OBJECT_TRANSFORMS", ObjectTransforms, "Object Transforms", "") DefNode(FunctionNode, FN_NODE_RANDOM_FLOAT, 0, "RANDOM_FLOAT", RandomFloat, "Random Float", "") DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "") +DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "") DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "") DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "") diff --git a/source/blender/nodes/function/nodes/node_fn_input_string.cc b/source/blender/nodes/function/nodes/node_fn_input_string.cc new file mode 100644 index 00000000000..f16bdef2f38 --- /dev/null +++ b/source/blender/nodes/function/nodes/node_fn_input_string.cc @@ -0,0 +1,84 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "node_function_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate fn_node_input_string_out[] = { + {SOCK_STRING, N_("String")}, + {-1, ""}, +}; + +static void fn_node_input_string_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "string", 0, "", ICON_NONE); +} + +static void fn_node_input_string_expand_in_mf_network( + blender::nodes::NodeMFNetworkBuilder &builder) +{ + bNode &bnode = builder.bnode(); + NodeInputString *node_storage = static_cast(bnode.storage); + std::string string = std::string((node_storage->string) ? node_storage->string : ""); + + builder.construct_and_set_matching_fn>(string); +} + +static void fn_node_input_string_init(bNodeTree *UNUSED(ntree), bNode *node) +{ + node->storage = MEM_callocN(sizeof(NodeInputString), __func__); +} + +static void fn_node_input_string_free(bNode *node) +{ + NodeInputString *storage = (NodeInputString *)node->storage; + if (storage == nullptr) { + return; + } + if (storage->string != nullptr) { + MEM_freeN(storage->string); + } + MEM_freeN(storage); +} + +static void fn_node_string_copy(bNodeTree *UNUSED(dest_ntree), + bNode *dest_node, + const bNode *src_node) +{ + NodeInputString *source_storage = (NodeInputString *)src_node->storage; + NodeInputString *destination_storage = (NodeInputString *)MEM_dupallocN(source_storage); + + if (source_storage->string) { + destination_storage->string = (char *)MEM_dupallocN(source_storage->string); + } + + dest_node->storage = destination_storage; +} + +void register_node_type_fn_input_string() +{ + static bNodeType ntype; + + fn_node_type_base(&ntype, FN_NODE_INPUT_STRING, "String", NODE_CLASS_INPUT, 0); + node_type_socket_templates(&ntype, nullptr, fn_node_input_string_out); + node_type_init(&ntype, fn_node_input_string_init); + node_type_storage(&ntype, "NodeInputString", fn_node_input_string_free, fn_node_string_copy); + ntype.expand_in_mf_network = fn_node_input_string_expand_in_mf_network; + ntype.draw_buttons = fn_node_input_string_layout; + nodeRegisterType(&ntype); +} From 2d5b89be89c20f36c3607fd52666dcdb6c9a597d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 19 Feb 2021 16:29:11 -0600 Subject: [PATCH 330/519] Cleanup: Disentangle outliner active status "get" and "set" Previously the same functions were used to both set and get the active state for outliner tree elements. This has quite a few problems. - It's hard to tell when data is changed or simply read - It prevents using `const` - The code is full of if statements, making it longer and less readable. This commit replaces the `tree_element_type_active` and `tree_element_active` functions with `_get` and `_set` variants. One has const arguments and returns the active state, the other deals only with setting the state. While this refactor results in slightly more lines of code, the result is much better in my opinion. This commit also removes unused variables from arguments of the affected functions. Differential Revision: https://developer.blender.org/D10232 --- .../editors/space_outliner/outliner_draw.c | 34 +- .../editors/space_outliner/outliner_intern.h | 31 +- .../editors/space_outliner/outliner_select.c | 1070 +++++++++-------- 3 files changed, 587 insertions(+), 548 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 0badff12b1f..031c94689b0 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -760,7 +760,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) char newname[sizeof(bone->name)]; /* always make current object active */ - tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true); + tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true); /* restore bone name */ BLI_strncpy(newname, bone->name, sizeof(bone->name)); @@ -778,7 +778,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) char newname[sizeof(pchan->name)]; /* always make current pose-bone active */ - tree_element_active(C, &tvc, space_outliner, te, OL_SETSEL_NORMAL, true); + tree_element_activate(C, &tvc, te, OL_SETSEL_NORMAL, true); BLI_assert(ob->type == OB_ARMATURE); @@ -2872,16 +2872,11 @@ static void outliner_draw_iconrow(bContext *C, active = OL_DRAWSEL_ACTIVE; } else { - active = tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false); + active = tree_element_active_state_get(tvc, te, tselem); } } - else if (tselem->type == TSE_GP_LAYER) { - bGPDlayer *gpl = te->directdata; - active = (gpl->flag & GP_LAYER_ACTIVE) ? OL_DRAWSEL_ACTIVE : OL_DRAWSEL_NONE; - } else { - active = tree_element_type_active( - C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false); + active = tree_element_type_active_state_get(C, tvc, te, tselem); } if (!ELEM(tselem->type, 0, TSE_LAYER_COLLECTION, TSE_R_LAYER, TSE_GP_LAYER)) { @@ -3029,14 +3024,7 @@ static void outliner_draw_tree_element(bContext *C, /* Colors for active/selected data. */ if (tselem->type == 0) { - if (te->idcode == ID_SCE) { - if (tselem->id == (ID *)tvc->scene) { - /* Active scene. */ - icon_bgcolor[3] = 0.2f; - active = OL_DRAWSEL_ACTIVE; - } - } - else if (te->idcode == ID_OB) { + if (te->idcode == ID_OB) { Object *ob = (Object *)tselem->id; Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(tvc->view_layer, ob); @@ -3066,23 +3054,15 @@ static void outliner_draw_tree_element(bContext *C, active = OL_DRAWSEL_ACTIVE; } else { - if (tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NONE, false)) { + if (tree_element_active_state_get(tvc, te, tselem)) { /* Active items like camera or material. */ icon_bgcolor[3] = 0.2f; active = OL_DRAWSEL_ACTIVE; } } } - else if (tselem->type == TSE_GP_LAYER) { - /* Active grease pencil layer. */ - if (((bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) { - icon_bgcolor[3] = 0.2f; - active = OL_DRAWSEL_ACTIVE; - } - } else { - active = tree_element_type_active(C, tvc, space_outliner, te, tselem, OL_SETSEL_NONE, false); - /* Active collection. */ + active = tree_element_type_active_state_get(C, tvc, te, tselem); } /* Active circle. */ diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 9413b7a9613..593c33bd3df 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -288,19 +288,24 @@ void outliner_collection_isolate_flag(struct Scene *scene, int tree_element_id_type_to_index(TreeElement *te); /* outliner_select.c -------------------------------------------- */ -eOLDrawState tree_element_type_active(struct bContext *C, - const TreeViewContext *tvc, - struct SpaceOutliner *space_outliner, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive); -eOLDrawState tree_element_active(struct bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - const eOLSetState set, - const bool handle_all_types); +void tree_element_type_active_set(struct bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive); +eOLDrawState tree_element_type_active_state_get(const struct bContext *C, + const struct TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem); +void tree_element_activate(struct bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + const eOLSetState set, + const bool handle_all_types); +eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem); struct bPoseChannel *outliner_find_parent_bone(TreeElement *te, TreeElement **r_bone_te); diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index c09334b0e86..e31af48ab7e 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -222,32 +222,21 @@ void outliner_item_mode_toggle(bContext *C, /* ****************************************************** */ /* Outliner Element Selection/Activation on Click */ -static eOLDrawState active_viewlayer(bContext *C, - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *te, - const eOLSetState set) +static void tree_element_viewlayer_activate(bContext *C, TreeElement *te) { /* paranoia check */ if (te->idcode != ID_SCE) { - return OL_DRAWSEL_NONE; + return; } ViewLayer *view_layer = te->directdata; + wmWindow *win = CTX_wm_window(C); + Scene *scene = WM_window_get_active_scene(win); - if (set != OL_SETSEL_NONE) { - wmWindow *win = CTX_wm_window(C); - Scene *scene = WM_window_get_active_scene(win); - - if (BLI_findindex(&scene->view_layers, view_layer) != -1) { - WM_window_set_active_view_layer(win, view_layer); - WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL); - } + if (BLI_findindex(&scene->view_layers, view_layer) != -1) { + WM_window_set_active_view_layer(win, view_layer); + WM_event_add_notifier(C, NC_SCREEN | ND_LAYER, NULL); } - else { - return CTX_data_view_layer(C) == view_layer; - } - return OL_DRAWSEL_NONE; } /** @@ -297,13 +286,12 @@ static void do_outliner_ebone_select_recursive(bArmature *arm, EditBone *ebone_p } } -static eOLDrawState tree_element_set_active_object(bContext *C, - Scene *scene, - ViewLayer *view_layer, - SpaceOutliner *UNUSED(space_outliner), - TreeElement *te, - const eOLSetState set, - bool recursive) +static void tree_element_object_activate(bContext *C, + Scene *scene, + ViewLayer *view_layer, + TreeElement *te, + const eOLSetState set, + bool recursive) { TreeStoreElem *tselem = TREESTORE(te); TreeStoreElem *parent_tselem = NULL; @@ -324,12 +312,12 @@ static eOLDrawState tree_element_set_active_object(bContext *C, /* Don't return when activating children of the previous active object. */ if (ob == OBACT(view_layer) && set == OL_SETSEL_NONE) { - return OL_DRAWSEL_NONE; + return; } } } if (ob == NULL) { - return OL_DRAWSEL_NONE; + return; } sce = (Scene *)outliner_search_back(te, ID_SCE); @@ -403,319 +391,197 @@ static eOLDrawState tree_element_set_active_object(bContext *C, WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); } } - return OL_DRAWSEL_NORMAL; } -static eOLDrawState tree_element_active_material(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - TreeElement *te, - const eOLSetState set) +static void tree_element_material_activate(bContext *C, ViewLayer *view_layer, TreeElement *te) { - TreeElement *tes; - Object *ob; - /* we search for the object parent */ - ob = (Object *)outliner_search_back(te, ID_OB); + Object *ob = (Object *)outliner_search_back(te, ID_OB); /* Note : ob->matbits can be NULL when a local object points to a library mesh. */ if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) { - return OL_DRAWSEL_NONE; /* just paranoia */ + return; /* just paranoia */ } - /* searching in ob mat array? */ - tes = te->parent; + /* In ob mat array? */ + TreeElement *tes = te->parent; if (tes->idcode == ID_OB) { - if (set != OL_SETSEL_NONE) { - ob->actcol = te->index + 1; - ob->matbits[te->index] = 1; /* Make ob material active too. */ - } - else { - if (ob->actcol == te->index + 1) { - if (ob->matbits[te->index]) { - return OL_DRAWSEL_NORMAL; - } - } - } + ob->actcol = te->index + 1; + ob->matbits[te->index] = 1; /* Make ob material active too. */ } - /* or we search for obdata material */ else { - if (set != OL_SETSEL_NONE) { - ob->actcol = te->index + 1; - ob->matbits[te->index] = 0; /* Make obdata material active too. */ - } - else { - if (ob->actcol == te->index + 1) { - if (ob->matbits[te->index] == 0) { - return OL_DRAWSEL_NORMAL; - } - } - } + /* or in obdata material */ + ob->actcol = te->index + 1; + ob->matbits[te->index] = 0; /* Make obdata material active too. */ } - if (set != OL_SETSEL_NONE) { - /* Tagging object for update seems a bit stupid here, but looks like we have to do it - * for render views to update. See T42973. - * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */ - DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM); - WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL); - } - return OL_DRAWSEL_NONE; + + /* Tagging object for update seems a bit stupid here, but looks like we have to do it + * for render views to update. See T42973. + * Note that RNA material update does it too, see e.g. rna_MaterialSlot_update(). */ + DEG_id_tag_update((ID *)ob, ID_RECALC_TRANSFORM); + WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL); } -static eOLDrawState tree_element_active_camera(bContext *C, - Scene *scene, - ViewLayer *UNUSED(view_layer), - TreeElement *te, - const eOLSetState set) +static void tree_element_camera_activate(bContext *C, Scene *scene, TreeElement *te) { Object *ob = (Object *)outliner_search_back(te, ID_OB); - if (set != OL_SETSEL_NONE) { - scene->camera = ob; + scene->camera = ob; - Main *bmain = CTX_data_main(C); - wmWindowManager *wm = bmain->wm.first; + Main *bmain = CTX_data_main(C); + wmWindowManager *wm = bmain->wm.first; - WM_windows_scene_data_sync(&wm->windows, scene); - DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); - DEG_relations_tag_update(bmain); - WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL); - - return OL_DRAWSEL_NONE; - } - return scene->camera == ob; + WM_windows_scene_data_sync(&wm->windows, scene); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); + DEG_relations_tag_update(bmain); + WM_event_add_notifier(C, NC_SCENE | NA_EDITED, NULL); } -static eOLDrawState tree_element_active_world(bContext *C, - Scene *scene, - ViewLayer *UNUSED(sl), - SpaceOutliner *UNUSED(space_outliner), - TreeElement *te, - const eOLSetState set) +static void tree_element_world_activate(bContext *C, Scene *scene, TreeElement *te) { - TreeElement *tep; - TreeStoreElem *tselem = NULL; Scene *sce = NULL; - tep = te->parent; + TreeElement *tep = te->parent; if (tep) { - tselem = TREESTORE(tep); + TreeStoreElem *tselem = TREESTORE(tep); if (tselem->type == 0) { sce = (Scene *)tselem->id; } } - if (set != OL_SETSEL_NONE) { - /* make new scene active */ - if (sce && scene != sce) { - WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce); - } + /* make new scene active */ + if (sce && scene != sce) { + WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce); } - - if (tep == NULL || tselem->id == (ID *)scene) { - if (set == OL_SETSEL_NONE) { - return OL_DRAWSEL_NORMAL; - } - } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_defgroup(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_defgroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { - Object *ob; - /* id in tselem is object */ - ob = (Object *)tselem->id; - if (set != OL_SETSEL_NONE) { - BLI_assert(te->index + 1 >= 0); - ob->actdef = te->index + 1; + Object *ob = (Object *)tselem->id; + BLI_assert(te->index + 1 >= 0); + ob->actdef = te->index + 1; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); - } - else { - if (ob == OBACT(view_layer)) { - if (ob->actdef == te->index + 1) { - return OL_DRAWSEL_NORMAL; - } - } - } - return OL_DRAWSEL_NONE; + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); } -static eOLDrawState tree_element_active_gplayer(bContext *C, - Scene *UNUSED(scene), - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_gplayer_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { bGPdata *gpd = (bGPdata *)tselem->id; bGPDlayer *gpl = te->directdata; /* We can only have a single "active" layer at a time - * and there must always be an active layer... - */ - if (set != OL_SETSEL_NONE) { - if (gpl) { - BKE_gpencil_layer_active_set(gpd, gpl); - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd); - } + * and there must always be an active layer... */ + if (gpl) { + BKE_gpencil_layer_active_set(gpd, gpl); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd); } - else { - return OL_DRAWSEL_NORMAL; - } - - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_posegroup(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_posegroup_activate(bContext *C, TreeElement *te, TreeStoreElem *tselem) { Object *ob = (Object *)tselem->id; - - if (set != OL_SETSEL_NONE) { - if (ob->pose) { - ob->pose->active_group = te->index + 1; - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); - } + if (ob->pose) { + ob->pose->active_group = te->index + 1; + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); } - else { - if (ob == OBACT(view_layer) && ob->pose) { - if (ob->pose->active_group == te->index + 1) { - return OL_DRAWSEL_NORMAL; - } - } - } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_posechannel(bContext *C, - Scene *UNUSED(scene), - ViewLayer *view_layer, - Object *ob_pose, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_posechannel_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { Object *ob = (Object *)tselem->id; bArmature *arm = ob->data; bPoseChannel *pchan = te->directdata; - if (set != OL_SETSEL_NONE) { - if (!(pchan->bone->flag & BONE_HIDDEN_P)) { + if (!(pchan->bone->flag & BONE_HIDDEN_P)) { + if (set != OL_SETSEL_EXTEND) { + /* Single select forces all other bones to get unselected. */ + uint objects_len = 0; + Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len); - if (set != OL_SETSEL_EXTEND) { - /* Single select forces all other bones to get unselected. */ - uint objects_len = 0; - Object **objects = BKE_object_pose_array_get_unique(view_layer, NULL, &objects_len); + for (uint object_index = 0; object_index < objects_len; object_index++) { + Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]); - for (uint object_index = 0; object_index < objects_len; object_index++) { - Object *ob_iter = BKE_object_pose_armature_get(objects[object_index]); - - /* Sanity checks. */ - if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) { - continue; - } - - bPoseChannel *pchannel; - for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) { - pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); - } - - if (ob != ob_iter) { - DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT); - } + /* Sanity checks. */ + if (ELEM(NULL, ob_iter, ob_iter->pose, ob_iter->data)) { + continue; } - MEM_freeN(objects); - } - if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) { - pchan->bone->flag &= ~BONE_SELECTED; - } - else { - pchan->bone->flag |= BONE_SELECTED; - arm->act_bone = pchan->bone; - } + bPoseChannel *pchannel; + for (pchannel = ob_iter->pose->chanbase.first; pchannel; pchannel = pchannel->next) { + pchannel->bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); + } - if (recursive) { - /* Recursive select/deselect */ - do_outliner_bone_select_recursive( - arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0); + if (ob != ob_iter) { + DEG_id_tag_update(ob_iter->data, ID_RECALC_SELECT); + } } - - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); - DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); + MEM_freeN(objects); } - } - else { - if (ob == ob_pose && ob->pose) { - if (pchan->bone->flag & BONE_SELECTED) { - return OL_DRAWSEL_NORMAL; - } + + if ((set == OL_SETSEL_EXTEND) && (pchan->bone->flag & BONE_SELECTED)) { + pchan->bone->flag &= ~BONE_SELECTED; } + else { + pchan->bone->flag |= BONE_SELECTED; + arm->act_bone = pchan->bone; + } + + if (recursive) { + /* Recursive select/deselect */ + do_outliner_bone_select_recursive( + arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); + DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_bone(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_bone_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { bArmature *arm = (bArmature *)tselem->id; Bone *bone = te->directdata; - if (set != OL_SETSEL_NONE) { - if (!(bone->flag & BONE_HIDDEN_P)) { - Object *ob = OBACT(view_layer); - if (ob) { - if (set != OL_SETSEL_EXTEND) { - /* single select forces all other bones to get unselected */ - for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL; - bone_iter = bone_iter->next) { - bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); - do_outliner_bone_select_recursive(arm, bone_iter, false); - } + if (!(bone->flag & BONE_HIDDEN_P)) { + Object *ob = OBACT(view_layer); + if (ob) { + if (set != OL_SETSEL_EXTEND) { + /* single select forces all other bones to get unselected */ + for (Bone *bone_iter = arm->bonebase.first; bone_iter != NULL; + bone_iter = bone_iter->next) { + bone_iter->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); + do_outliner_bone_select_recursive(arm, bone_iter, false); } } - - if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) { - bone->flag &= ~BONE_SELECTED; - } - else { - bone->flag |= BONE_SELECTED; - arm->act_bone = bone; - } - - if (recursive) { - /* Recursive select/deselect */ - do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0); - } - - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); } - } - else { - Object *ob = OBACT(view_layer); - if (ob && ob->data == arm) { - if (bone->flag & BONE_SELECTED) { - return OL_DRAWSEL_NORMAL; - } + if (set == OL_SETSEL_EXTEND && (bone->flag & BONE_SELECTED)) { + bone->flag &= ~BONE_SELECTED; } + else { + bone->flag |= BONE_SELECTED; + arm->act_bone = bone; + } + + if (recursive) { + /* Recursive select/deselect */ + do_outliner_bone_select_recursive(arm, bone, (bone->flag & BONE_SELECTED) != 0); + } + + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob); } - return OL_DRAWSEL_NONE; } /** Edit-bones only draw in edit-mode armature. */ @@ -727,193 +593,120 @@ static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone ED_armature_ebone_select_set(ebone, sel); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, CTX_data_edit_object(C)); } -static eOLDrawState tree_element_active_ebone(bContext *C, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +static void tree_element_ebone_activate(bContext *C, + ViewLayer *view_layer, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) { bArmature *arm = (bArmature *)tselem->id; EditBone *ebone = te->directdata; - eOLDrawState status = OL_DRAWSEL_NONE; - if (set != OL_SETSEL_NONE) { - if (set == OL_SETSEL_NORMAL) { - if (!(ebone->flag & BONE_HIDDEN_A)) { - uint bases_len = 0; - Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data( - view_layer, NULL, &bases_len); - ED_armature_edit_deselect_all_multi_ex(bases, bases_len); - MEM_freeN(bases); + if (set == OL_SETSEL_NORMAL) { + if (!(ebone->flag & BONE_HIDDEN_A)) { + uint bases_len = 0; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data( + view_layer, NULL, &bases_len); + ED_armature_edit_deselect_all_multi_ex(bases, bases_len); + MEM_freeN(bases); + tree_element_active_ebone__sel(C, arm, ebone, true); + } + } + else if (set == OL_SETSEL_EXTEND) { + if (!(ebone->flag & BONE_HIDDEN_A)) { + if (!(ebone->flag & BONE_SELECTED)) { tree_element_active_ebone__sel(C, arm, ebone, true); - status = OL_DRAWSEL_NORMAL; + } + else { + /* entirely selected, so de-select */ + tree_element_active_ebone__sel(C, arm, ebone, false); } } - else if (set == OL_SETSEL_EXTEND) { - if (!(ebone->flag & BONE_HIDDEN_A)) { - if (!(ebone->flag & BONE_SELECTED)) { - tree_element_active_ebone__sel(C, arm, ebone, true); - status = OL_DRAWSEL_NORMAL; - } - else { - /* entirely selected, so de-select */ - tree_element_active_ebone__sel(C, arm, ebone, false); - status = OL_DRAWSEL_NONE; - } - } - } - - if (recursive) { - /* Recursive select/deselect */ - do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0); - } - } - else if (ebone->flag & BONE_SELECTED) { - status = OL_DRAWSEL_NORMAL; } - return status; + if (recursive) { + /* Recursive select/deselect */ + do_outliner_ebone_select_recursive(arm, ebone, (ebone->flag & BONE_SELECTED) != 0); + } } -static eOLDrawState tree_element_active_modifier(bContext *C, - Scene *UNUSED(scene), - ViewLayer *UNUSED(sl), - TreeElement *UNUSED(te), - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_modifier_activate(bContext *C, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set) { - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; + Object *ob = (Object *)tselem->id; + ModifierData *md = (ModifierData *)te->directdata; + if (set == OL_SETSEL_NORMAL) { + BKE_object_modifier_set_active(ob, md); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); } - - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_psys(bContext *C, - Scene *UNUSED(scene), - TreeElement *UNUSED(te), - TreeStoreElem *tselem, - const eOLSetState set) +static void tree_element_psys_activate(bContext *C, TreeStoreElem *tselem) { - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; + Object *ob = (Object *)tselem->id; - WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob); - } - - return OL_DRAWSEL_NONE; + WM_event_add_notifier(C, NC_OBJECT | ND_PARTICLE | NA_EDITED, ob); } -static int tree_element_active_constraint(bContext *C, - Scene *scene, - ViewLayer *view_layer, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set) -{ - if (set != OL_SETSEL_NONE) { - Object *ob = (Object *)tselem->id; - - /* Activate the parent bone if this is a bone constraint. */ - te = te->parent; - while (te) { - tselem = TREESTORE(te); - if (tselem->type == TSE_POSE_CHANNEL) { - tree_element_active_posechannel(C, scene, view_layer, ob, te, tselem, set, false); - return OL_DRAWSEL_NONE; - } - te = te->parent; - } - - WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob); - } - - return OL_DRAWSEL_NONE; -} - -static eOLDrawState tree_element_active_pose(bContext *UNUSED(C), - Scene *UNUSED(scene), +static void tree_element_constraint_activate(bContext *C, ViewLayer *view_layer, - TreeElement *UNUSED(te), + TreeElement *te, TreeStoreElem *tselem, const eOLSetState set) { Object *ob = (Object *)tselem->id; - Base *base = BKE_view_layer_base_find(view_layer, ob); - if (base == NULL) { - /* Armature not instantiated in current scene (e.g. inside an appended group...). */ - return OL_DRAWSEL_NONE; - } - - if (set != OL_SETSEL_NONE) { - } - else { - if (ob->mode & OB_MODE_POSE) { - return OL_DRAWSEL_NORMAL; + /* Activate the parent bone if this is a bone constraint. */ + te = te->parent; + while (te) { + tselem = TREESTORE(te); + if (tselem->type == TSE_POSE_CHANNEL) { + tree_element_posechannel_activate(C, view_layer, te, tselem, set, false); + return; } + te = te->parent; } - return OL_DRAWSEL_NONE; + + WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob); } -static eOLDrawState tree_element_active_sequence(bContext *C, - Scene *scene, - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) +static void tree_element_sequence_activate(bContext *C, + Scene *scene, + TreeElement *te, + const eOLSetState set) { Sequence *seq = (Sequence *)te->directdata; Editing *ed = SEQ_editing_get(scene, false); - if (set != OL_SETSEL_NONE) { - /* only check on setting */ - if (BLI_findindex(ed->seqbasep, seq) != -1) { - if (set == OL_SETSEL_EXTEND) { - SEQ_select_active_set(scene, NULL); - } - ED_sequencer_deselect_all(scene); - - if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) { - seq->flag &= ~SELECT; - } - else { - seq->flag |= SELECT; - SEQ_select_active_set(scene, seq); - } + if (BLI_findindex(ed->seqbasep, seq) != -1) { + if (set == OL_SETSEL_EXTEND) { + SEQ_select_active_set(scene, NULL); } + ED_sequencer_deselect_all(scene); - WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene); - } - else { - if (ed->act_seq == seq && seq->flag & SELECT) { - return OL_DRAWSEL_NORMAL; + if ((set == OL_SETSEL_EXTEND) && seq->flag & SELECT) { + seq->flag &= ~SELECT; + } + else { + seq->flag |= SELECT; + SEQ_select_active_set(scene, seq); } } - return OL_DRAWSEL_NONE; + + WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER | NA_SELECTED, scene); } -static eOLDrawState tree_element_active_sequence_dup(Scene *scene, - TreeElement *te, - TreeStoreElem *UNUSED(tselem), - const eOLSetState set) +static void tree_element_sequence_dup_activate(Scene *scene, TreeElement *UNUSED(te)) { - Sequence *seq, *p; Editing *ed = SEQ_editing_get(scene, false); - seq = (Sequence *)te->directdata; - if (set == OL_SETSEL_NONE) { - if (seq->flag & SELECT) { - return OL_DRAWSEL_NORMAL; - } - return OL_DRAWSEL_NONE; - } - /* XXX select_single_seq(seq, 1); */ - p = ed->seqbasep->first; + Sequence *p = ed->seqbasep->first; while (p) { if ((!p->strip) || (!p->strip->stripdata) || (p->strip->stripdata->name[0] == '\0')) { p = p->next; @@ -924,66 +717,37 @@ static eOLDrawState tree_element_active_sequence_dup(Scene *scene, * 0); */ p = p->next; } - return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_master_collection(bContext *C, - TreeElement *UNUSED(te), - const eOLSetState set) +static void tree_element_master_collection_activate(const bContext *C) { - if (set == OL_SETSEL_NONE) { - ViewLayer *view_layer = CTX_data_view_layer(C); - LayerCollection *active = CTX_data_layer_collection(C); - - if (active == view_layer->layer_collections.first) { - return OL_DRAWSEL_NORMAL; - } - } - else { - ViewLayer *view_layer = CTX_data_view_layer(C); - LayerCollection *layer_collection = view_layer->layer_collections.first; - BKE_layer_collection_activate(view_layer, layer_collection); - /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work - * when only the active collection changes. */ - WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); - } - - return OL_DRAWSEL_NONE; + ViewLayer *view_layer = CTX_data_view_layer(C); + LayerCollection *layer_collection = view_layer->layer_collections.first; + BKE_layer_collection_activate(view_layer, layer_collection); + /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work + * when only the active collection changes. */ + WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); } -static eOLDrawState tree_element_active_layer_collection(bContext *C, - TreeElement *te, - const eOLSetState set) +static void tree_element_layer_collection_activate(bContext *C, TreeElement *te) { - if (set == OL_SETSEL_NONE) { - LayerCollection *active = CTX_data_layer_collection(C); - - if (active == te->directdata) { - return OL_DRAWSEL_NORMAL; - } - } - else { - Scene *scene = CTX_data_scene(C); - LayerCollection *layer_collection = te->directdata; - ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection); - BKE_layer_collection_activate(view_layer, layer_collection); - /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work - * when only the active collection changes. */ - WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); - } - - return OL_DRAWSEL_NONE; + Scene *scene = CTX_data_scene(C); + LayerCollection *layer_collection = te->directdata; + ViewLayer *view_layer = BKE_view_layer_find_from_collection(scene, layer_collection); + BKE_layer_collection_activate(view_layer, layer_collection); + /* A very precise notifier - ND_LAYER alone is quite vague, we want to avoid unnecessary work + * when only the active collection changes. */ + WM_main_add_notifier(NC_SCENE | ND_LAYER | NS_LAYER_COLLECTION | NA_ACTIVATED, NULL); } /* ---------------------------------------------- */ /* generic call for ID data check or make/check active in UI */ -eOLDrawState tree_element_active(bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - const eOLSetState set, - const bool handle_all_types) +void tree_element_activate(bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + const eOLSetState set, + const bool handle_all_types) { switch (te->idcode) { /** \note #ID_OB only if handle_all_type is true, @@ -991,74 +755,371 @@ eOLDrawState tree_element_active(bContext *C, * See #do_outliner_item_activate. */ case ID_OB: if (handle_all_types) { - return tree_element_set_active_object( - C, tvc->scene, tvc->view_layer, space_outliner, te, set, false); + tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false); } break; case ID_MA: - return tree_element_active_material(C, tvc->scene, tvc->view_layer, te, set); + tree_element_material_activate(C, tvc->view_layer, te); + break; case ID_WO: - return tree_element_active_world(C, tvc->scene, tvc->view_layer, space_outliner, te, set); + tree_element_world_activate(C, tvc->scene, te); + break; case ID_CA: - return tree_element_active_camera(C, tvc->scene, tvc->view_layer, te, set); + tree_element_camera_activate(C, tvc->scene, te); + break; + } +} + +/** + * Generic call for non-id data to make active in UI + */ +void tree_element_type_active_set(bContext *C, + const TreeViewContext *tvc, + TreeElement *te, + TreeStoreElem *tselem, + const eOLSetState set, + bool recursive) +{ + BLI_assert(set != OL_SETSEL_NONE); + switch (tselem->type) { + case TSE_DEFGROUP: + tree_element_defgroup_activate(C, te, tselem); + break; + case TSE_BONE: + tree_element_bone_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_EBONE: + tree_element_ebone_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_MODIFIER: + tree_element_modifier_activate(C, te, tselem, set); + break; + case TSE_LINKED_OB: + tree_element_object_activate(C, tvc->scene, tvc->view_layer, te, set, false); + break; + case TSE_LINKED_PSYS: + tree_element_psys_activate(C, tselem); + break; + case TSE_POSE_BASE: + return; + case TSE_POSE_CHANNEL: + tree_element_posechannel_activate(C, tvc->view_layer, te, tselem, set, recursive); + break; + case TSE_CONSTRAINT_BASE: + case TSE_CONSTRAINT: + tree_element_constraint_activate(C, tvc->view_layer, te, tselem, set); + break; + case TSE_R_LAYER: + tree_element_viewlayer_activate(C, te); + break; + case TSE_POSEGRP: + tree_element_posegroup_activate(C, te, tselem); + break; + case TSE_SEQUENCE: + tree_element_sequence_activate(C, tvc->scene, te, set); + break; + case TSE_SEQUENCE_DUP: + tree_element_sequence_dup_activate(tvc->scene, te); + break; + case TSE_GP_LAYER: + tree_element_gplayer_activate(C, te, tselem); + break; + case TSE_VIEW_COLLECTION_BASE: + tree_element_master_collection_activate(C); + break; + case TSE_LAYER_COLLECTION: + tree_element_layer_collection_activate(C, te); + break; + } +} + +static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + if (ob == OBACT(view_layer)) { + if (ob->actdef == te->index + 1) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_bone_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const bArmature *arm = (const bArmature *)tselem->id; + const Bone *bone = te->directdata; + const Object *ob = OBACT(view_layer); + if (ob && ob->data == arm) { + if (bone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_ebone_state_get(const TreeElement *te) +{ + const EditBone *ebone = te->directdata; + if (ebone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_modifier_state_get(const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + const ModifierData *md = (const ModifierData *)te->directdata; + + return (BKE_object_active_modifier(ob) == md) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_object_state_get(const TreeViewContext *tvc, + const TreeStoreElem *tselem) +{ + return (tselem->id == (const ID *)tvc->obact) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_pose_state_get(const ViewLayer *view_layer, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + /* This will just lookup in a cache, it will not change the arguments. */ + const Base *base = BKE_view_layer_base_find((ViewLayer *)view_layer, (Object *)ob); + if (base == NULL) { + /* Armature not instantiated in current scene (e.g. inside an appended group). */ + return OL_DRAWSEL_NONE; + } + + if (ob->mode & OB_MODE_POSE) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_posechannel_state_get(const Object *ob_pose, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + const bPoseChannel *pchan = te->directdata; + if (ob == ob_pose && ob->pose) { + if (pchan->bone->flag & BONE_SELECTED) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_viewlayer_state_get(const bContext *C, const TreeElement *te) +{ + /* paranoia check */ + if (te->idcode != ID_SCE) { + return OL_DRAWSEL_NONE; + } + + const ViewLayer *view_layer = te->directdata; + + if (CTX_data_view_layer(C) == view_layer) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_posegroup_state_get(const ViewLayer *view_layer, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + const Object *ob = (const Object *)tselem->id; + + if (ob == OBACT(view_layer) && ob->pose) { + if (ob->pose->active_group == te->index + 1) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_sequence_state_get(const Scene *scene, const TreeElement *te) +{ + const Sequence *seq = (const Sequence *)te->directdata; + const Editing *ed = scene->ed; + + if (ed && ed->act_seq == seq && seq->flag & SELECT) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_sequence_dup_state_get(const TreeElement *te) +{ + const Sequence *seq = (const Sequence *)te->directdata; + if (seq->flag & SELECT) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_gplayer_state_get(const TreeElement *te) +{ + if (((const bGPDlayer *)te->directdata)->flag & GP_LAYER_ACTIVE) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_master_collection_state_get(const bContext *C) +{ + const ViewLayer *view_layer = CTX_data_view_layer(C); + const LayerCollection *active = CTX_data_layer_collection(C); + + if (active == view_layer->layer_collections.first) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_layer_collection_state_get(const bContext *C, + const TreeElement *te) +{ + const LayerCollection *active = CTX_data_layer_collection(C); + if (active == te->directdata) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_material_get(const ViewLayer *view_layer, + const TreeElement *te) +{ + /* we search for the object parent */ + const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB); + /* Note : ob->matbits can be NULL when a local object points to a library mesh. */ + if (ob == NULL || ob != OBACT(view_layer) || ob->matbits == NULL) { + return OL_DRAWSEL_NONE; /* just paranoia */ + } + + /* searching in ob mat array? */ + const TreeElement *tes = te->parent; + if (tes->idcode == ID_OB) { + if (ob->actcol == te->index + 1) { + if (ob->matbits[te->index]) { + return OL_DRAWSEL_NORMAL; + } + } + } + /* or we search for obdata material */ + else { + if (ob->actcol == te->index + 1) { + if (ob->matbits[te->index] == 0) { + return OL_DRAWSEL_NORMAL; + } + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_scene_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + if (te->idcode == ID_SCE) { + if (tselem->id == (ID *)tvc->scene) { + return OL_DRAWSEL_NORMAL; + } + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_world_get(const Scene *scene, const TreeElement *te) +{ + const TreeElement *tep = te->parent; + if (tep == NULL) { + return OL_DRAWSEL_NORMAL; + } + + const TreeStoreElem *tselem = TREESTORE(tep); + if (tselem->id == (const ID *)scene) { + return OL_DRAWSEL_NORMAL; + } + return OL_DRAWSEL_NONE; +} + +static eOLDrawState tree_element_active_camera_get(const Scene *scene, const TreeElement *te) +{ + const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB); + + return (scene->camera == ob) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; +} + +eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) +{ + switch (te->idcode) { + case ID_SCE: + return tree_element_active_scene_get(tvc, te, tselem); + case ID_OB: + /* Objects are currently handled by the caller in order to also change text color. */ + return OL_DRAWSEL_NONE; + break; + case ID_MA: + return tree_element_active_material_get(tvc->view_layer, te); + case ID_WO: + return tree_element_active_world_get(tvc->scene, te); + case ID_CA: + return tree_element_active_camera_get(tvc->scene, te); } return OL_DRAWSEL_NONE; } /** - * Generic call for non-id data to make/check active in UI + * Generic call for non-id data to check the active state in UI. */ -eOLDrawState tree_element_type_active(bContext *C, - const TreeViewContext *tvc, - SpaceOutliner *space_outliner, - TreeElement *te, - TreeStoreElem *tselem, - const eOLSetState set, - bool recursive) +eOLDrawState tree_element_type_active_state_get(const bContext *C, + const TreeViewContext *tvc, + const TreeElement *te, + const TreeStoreElem *tselem) { switch (tselem->type) { case TSE_DEFGROUP: - return tree_element_active_defgroup(C, tvc->view_layer, te, tselem, set); + return tree_element_defgroup_state_get(tvc->view_layer, te, tselem); case TSE_BONE: - return tree_element_active_bone(C, tvc->view_layer, te, tselem, set, recursive); + return tree_element_bone_state_get(tvc->view_layer, te, tselem); case TSE_EBONE: - return tree_element_active_ebone(C, tvc->view_layer, te, tselem, set, recursive); + return tree_element_ebone_state_get(te); case TSE_MODIFIER: - return tree_element_active_modifier(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_modifier_state_get(te, tselem); case TSE_LINKED_OB: - if (set != OL_SETSEL_NONE) { - tree_element_set_active_object( - C, tvc->scene, tvc->view_layer, space_outliner, te, set, false); - } - else if (tselem->id == (ID *)tvc->obact) { - return OL_DRAWSEL_NORMAL; - } - break; + return tree_element_object_state_get(tvc, tselem); case TSE_LINKED_PSYS: - return tree_element_active_psys(C, tvc->scene, te, tselem, set); + return OL_DRAWSEL_NONE; case TSE_POSE_BASE: - return tree_element_active_pose(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_pose_state_get(tvc->view_layer, tselem); case TSE_POSE_CHANNEL: - return tree_element_active_posechannel( - C, tvc->scene, tvc->view_layer, tvc->ob_pose, te, tselem, set, recursive); + return tree_element_posechannel_state_get(tvc->ob_pose, te, tselem); case TSE_CONSTRAINT_BASE: case TSE_CONSTRAINT: - return tree_element_active_constraint(C, tvc->scene, tvc->view_layer, te, tselem, set); + return OL_DRAWSEL_NONE; case TSE_R_LAYER: - return active_viewlayer(C, tvc->scene, tvc->view_layer, te, set); + return tree_element_viewlayer_state_get(C, te); case TSE_POSEGRP: - return tree_element_active_posegroup(C, tvc->scene, tvc->view_layer, te, tselem, set); + return tree_element_posegroup_state_get(tvc->view_layer, te, tselem); case TSE_SEQUENCE: - return tree_element_active_sequence(C, tvc->scene, te, tselem, set); + return tree_element_sequence_state_get(tvc->scene, te); case TSE_SEQUENCE_DUP: - return tree_element_active_sequence_dup(tvc->scene, te, tselem, set); + return tree_element_sequence_dup_state_get(te); case TSE_GP_LAYER: - return tree_element_active_gplayer(C, tvc->scene, te, tselem, set); - break; + return tree_element_gplayer_state_get(te); case TSE_VIEW_COLLECTION_BASE: - return tree_element_active_master_collection(C, te, set); + return tree_element_master_collection_state_get(C); case TSE_LAYER_COLLECTION: - return tree_element_active_layer_collection(C, te, set); + return tree_element_layer_collection_state_get(C, te); } return OL_DRAWSEL_NONE; } @@ -1179,7 +1240,6 @@ static void outliner_set_properties_tab(bContext *C, TreeElement *te, TreeStoreE } else { ModifierData *md = (ModifierData *)te->directdata; - BKE_object_modifier_set_active(ob, md); switch ((ModifierType)md->type) { case eModifierType_ParticleSystem: @@ -1310,14 +1370,13 @@ static void do_outliner_item_activate_tree_element(bContext *C, * objects, we do not want to switch out of edit mode (see T48328 for details). */ } else if (do_activate_data) { - tree_element_set_active_object(C, - tvc->scene, - tvc->view_layer, - space_outliner, - te, - (extend && tselem->type == 0) ? OL_SETSEL_EXTEND : - OL_SETSEL_NORMAL, - recursive && tselem->type == 0); + tree_element_object_activate(C, + tvc->scene, + tvc->view_layer, + te, + (extend && tselem->type == 0) ? OL_SETSEL_EXTEND : + OL_SETSEL_NORMAL, + recursive && tselem->type == 0); } if (tselem->type == 0) { /* The lib blocks. */ @@ -1370,17 +1429,12 @@ static void do_outliner_item_activate_tree_element(bContext *C, WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, tvc->scene); } else { /* Rest of types. */ - tree_element_active(C, tvc, space_outliner, te, OL_SETSEL_NORMAL, false); + tree_element_activate(C, tvc, te, OL_SETSEL_NORMAL, false); } } else if (do_activate_data) { - tree_element_type_active(C, - tvc, - space_outliner, - te, - tselem, - extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL, - recursive); + tree_element_type_active_set( + C, tvc, te, tselem, extend ? OL_SETSEL_EXTEND : OL_SETSEL_NORMAL, recursive); } } From 6e64d97edeb3c01b8a94b80116937710c86641ad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Feb 2021 15:30:32 +1100 Subject: [PATCH 331/519] Cleanup: remove duplicate enum --- .../blender/blenkernel/intern/gpencil_curve.c | 4 +- source/blender/makesrna/intern/rna_scene.c | 56 ------------------- 2 files changed, 3 insertions(+), 57 deletions(-) diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index 6707fb53aa3..a1cae205d39 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -781,7 +781,9 @@ void BKE_gpencil_stroke_editcurve_update(bGPdata *gpd, bGPDlayer *gpl, bGPDstrok /** * Sync the selection from stroke to editcurve */ -void BKE_gpencil_editcurve_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gpc) +void BKE_gpencil_editcurve_stroke_sync_selection(bGPdata *UNUSED(gpd), + bGPDstroke *gps, + bGPDcurve *gpc) { if (gps->flag & GP_STROKE_SELECT) { gpc->flag |= GP_CURVE_SELECT; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 8c01b28df5a..7f3d470372a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -549,62 +549,6 @@ static const EnumPropertyItem rna_enum_view_layer_aov_type_items[] = { {0, NULL, 0, NULL, NULL}, }; -#ifndef RNA_RUNTIME -static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = { - /* interpolation */ - {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, - {GP_IPO_LINEAR, - "LINEAR", - ICON_IPO_LINEAR, - "Linear", - "Straight-line interpolation between A and B (i.e. no ease in/out)"}, - {GP_IPO_CURVEMAP, - "CUSTOM", - ICON_IPO_BEZIER, - "Custom", - "Custom interpolation defined using a curve map"}, - - /* easing */ - {0, - "", - 0, - N_("Easing (by strength)"), - "Predefined inertial transitions, useful for motion graphics (from least to most " - "''dramatic'')"}, - {GP_IPO_SINE, - "SINE", - ICON_IPO_SINE, - "Sinusoidal", - "Sinusoidal easing (weakest, almost linear but with a slight curvature)"}, - {GP_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"}, - {GP_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"}, - {GP_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"}, - {GP_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"}, - {GP_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"}, - {GP_IPO_CIRC, - "CIRC", - ICON_IPO_CIRC, - "Circular", - "Circular easing (strongest and most dynamic)"}, - - {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"}, - {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"}, - {GP_IPO_BOUNCE, - "BOUNCE", - ICON_IPO_BOUNCE, - "Bounce", - "Exponentially decaying parabolic bounce, like when objects collide"}, - {GP_IPO_ELASTIC, - "ELASTIC", - ICON_IPO_ELASTIC, - "Elastic", - "Exponentially decaying sine wave, like an elastic band"}, - - {0, NULL, 0, NULL, NULL}, -}; - -#endif - const EnumPropertyItem rna_enum_transform_pivot_items_full[] = { {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", From 83f285f56fac5aa989ec26d2d529b1284c8c2e21 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Feb 2021 15:34:14 +1100 Subject: [PATCH 332/519] Cleanup: reference near duplicate enum definitions --- source/blender/editors/gpencil/gpencil_interpolate.c | 4 ++++ source/blender/makesrna/intern/rna_curve.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 6a2eae934a2..1823a962926 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -1431,6 +1431,10 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot) {0, NULL, 0, NULL, NULL}, }; + /** + * \note this is a near exact duplicate of #rna_enum_beztriple_interpolation_mode_items, + * Changes here will likely apply there too. + */ static const EnumPropertyItem gpencil_interpolation_type_items[] = { /* interpolation */ {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index a46026fd08f..50c18cf1dae 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -75,6 +75,10 @@ const EnumPropertyItem rna_enum_keyframe_handle_type_items[] = { {0, NULL, 0, NULL, NULL}, }; +/** + * \note this is a near exact duplicate of `gpencil_interpolation_type_items`, + * Changes here will likely apply there too. + */ const EnumPropertyItem rna_enum_beztriple_interpolation_mode_items[] = { /* interpolation */ {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"}, From 7bb2b910c0e471e90d4dc5fe6c94aeb4f3ad57b0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Feb 2021 15:35:00 +1100 Subject: [PATCH 333/519] Cleanup: doxygen sections --- intern/ghost/intern/GHOST_SystemWin32.cpp | 4 +++- intern/ghost/intern/GHOST_SystemX11.cpp | 3 ++- source/blender/blenlib/intern/array_store.c | 1 - source/blender/draw/engines/eevee/eevee_materials.c | 2 +- source/blender/draw/engines/eevee/eevee_shaders.c | 4 ++-- source/blender/draw/engines/eevee/eevee_shadows.c | 2 +- source/blender/draw/engines/eevee/eevee_volumes.c | 2 +- source/blender/draw/engines/image/image_engine.c | 4 +++- source/blender/draw/engines/overlay/overlay_edit_uv.c | 2 +- source/blender/draw/engines/overlay/overlay_shader.c | 2 +- source/blender/draw/engines/workbench/workbench_data.c | 2 +- source/blender/draw/intern/draw_manager.c | 4 +++- source/blender/draw/intern/draw_view.c | 2 +- source/blender/editors/animation/fmodifier_ui.c | 1 - .../editors/gizmo_library/gizmo_types/arrow3d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/blank3d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/button2d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/cage2d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/cage3d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/dial3d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/move3d_gizmo.c | 1 - .../editors/gizmo_library/gizmo_types/primitive3d_gizmo.c | 1 - source/blender/editors/interface/interface_handlers.c | 1 - source/blender/editors/interface/interface_templates.c | 1 - source/blender/editors/mesh/editmesh_polybuild.c | 1 - source/blender/editors/object/object_add.c | 2 -- source/blender/editors/object/object_modes.c | 1 - source/blender/editors/screen/workspace_edit.c | 1 - source/blender/editors/space_graph/graph_draw.c | 4 ---- source/blender/editors/space_outliner/tree/common.cc | 1 - .../editors/space_outliner/tree/tree_display_view_layer.cc | 1 - .../blender/editors/space_view3d/view3d_gizmo_armature.c | 1 - .../blender/editors/space_view3d/view3d_gizmo_preselect.c | 2 -- .../editors/space_view3d/view3d_gizmo_preselect_type.c | 3 --- source/blender/editors/space_view3d/view3d_utils.c | 4 ---- .../blender/editors/transform/transform_convert_action.c | 2 -- source/blender/editors/transform/transform_convert_curve.c | 1 - .../blender/editors/transform/transform_convert_gpencil.c | 1 - source/blender/editors/transform/transform_convert_graph.c | 2 -- .../blender/editors/transform/transform_convert_lattice.c | 1 - source/blender/editors/transform/transform_convert_mask.c | 2 -- source/blender/editors/transform/transform_convert_mball.c | 1 - source/blender/editors/transform/transform_convert_mesh.c | 7 ------- .../editors/transform/transform_convert_mesh_edge.c | 1 - .../editors/transform/transform_convert_mesh_skin.c | 2 -- .../blender/editors/transform/transform_convert_mesh_uv.c | 2 -- source/blender/editors/transform/transform_convert_nla.c | 1 - source/blender/editors/transform/transform_convert_node.c | 2 -- .../blender/editors/transform/transform_convert_object.c | 1 - .../editors/transform/transform_convert_object_texspace.c | 1 - .../editors/transform/transform_convert_paintcurve.c | 2 -- .../blender/editors/transform/transform_convert_particle.c | 3 --- .../blender/editors/transform/transform_convert_sculpt.c | 2 -- .../editors/transform/transform_convert_sequencer.c | 2 -- .../blender/editors/transform/transform_convert_tracking.c | 2 -- .../intern/multi_function_network_optimization.cc | 4 ---- source/blender/gpu/intern/gpu_texture.cc | 1 - source/blender/python/generic/py_capi_utils.c | 1 - source/blender/windowmanager/gizmo/intern/wm_gizmo.c | 2 -- source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c | 4 ---- source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c | 4 ---- source/blender/windowmanager/intern/wm_event_system.c | 1 - source/blender/windowmanager/intern/wm_window.c | 1 - source/blender/windowmanager/xr/intern/wm_xr.c | 1 - 64 files changed, 20 insertions(+), 103 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index c5506902d59..1f85c7a4c5c 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1975,6 +1975,7 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const /* -------------------------------------------------------------------- */ /** \name Message Box * \{ */ + GHOST_TSuccess GHOST_SystemWin32::showMessageBox(const char *title, const char *message, const char *help_label, @@ -2022,7 +2023,8 @@ GHOST_TSuccess GHOST_SystemWin32::showMessageBox(const char *title, return GHOST_kSuccess; } -/* \} */ + +/** \} */ static DWORD GetParentProcessID(void) { diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 53e52d40dec..df7e8ba59df 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -2494,7 +2494,8 @@ GHOST_TSuccess GHOST_SystemX11::showMessageBox(const char *title, XFreeGC(m_display, buttonGC); return GHOST_kSuccess; } -/* \} */ + +/** \} */ #ifdef WITH_XDND GHOST_TSuccess GHOST_SystemX11::pushDragDropEvent(GHOST_TEventType eventType, diff --git a/source/blender/blenlib/intern/array_store.c b/source/blender/blenlib/intern/array_store.c index 08164e75009..cc1d6df10f5 100644 --- a/source/blender/blenlib/intern/array_store.c +++ b/source/blender/blenlib/intern/array_store.c @@ -1012,7 +1012,6 @@ static const BChunkRef *table_lookup(const BArrayInfo *info, /* -------------------------------------------------------------------- */ /** \name Main Data De-Duplication Function - * * \{ */ /** diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 3bdc8755e18..9d74d916265 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1120,4 +1120,4 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 2c52295b32f..0bdec20b215 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -1012,7 +1012,7 @@ GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality) return e_data.bloom_resolve_sh[index]; } -/* \} */ +/** \} */ /* -------------------------------------------------------------------- */ /** \name Depth of field @@ -1186,7 +1186,7 @@ GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_ return e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather]; } -/* \} */ +/** \} */ Material *EEVEE_material_default_diffuse_get(void) { diff --git a/source/blender/draw/engines/eevee/eevee_shadows.c b/source/blender/draw/engines/eevee/eevee_shadows.c index e29830defff..f6fe9a76c70 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows.c +++ b/source/blender/draw/engines/eevee/eevee_shadows.c @@ -412,4 +412,4 @@ void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_D } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 1e75968f1de..52c96bf51e7 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -853,4 +853,4 @@ void EEVEE_volumes_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_ } } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c index 04bdee131d7..886f211189b 100644 --- a/source/blender/draw/engines/image/image_engine.c +++ b/source/blender/draw/engines/image/image_engine.c @@ -283,6 +283,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser /* -------------------------------------------------------------------- */ /** \name Engine Callbacks * \{ */ + static void IMAGE_engine_init(void *ved) { IMAGE_shader_library_ensure(); @@ -394,7 +395,8 @@ static void IMAGE_engine_free(void) IMAGE_shader_free(); } -/* \} */ +/** \} */ + static const DrawEngineDataSize IMAGE_data_size = DRW_VIEWPORT_DATA_SIZE(IMAGE_Data); DrawEngineType draw_engine_image_type = { diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c index 257be97f131..fe0741d1606 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.c +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c @@ -575,4 +575,4 @@ void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata) OVERLAY_edit_uv_draw_finish(vedata); } -/* \} */ +/** \} */ diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index 6b07547bf96..c9c26e3faaa 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -1684,7 +1684,7 @@ GPUShader *OVERLAY_shader_edit_uv_tiled_image_borders_get(void) return sh_data->edit_uv_tiled_image_borders; } -/* \} */ +/** \} */ static OVERLAY_InstanceFormats g_formats = {NULL}; diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index 4f689fd55a5..b84ddec4973 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -84,7 +84,7 @@ static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewL return *vldata; } -/* \} */ +/** \} */ static void workbench_studiolight_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd) { diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index fd31a11b0a8..244b0133e64 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -154,6 +154,7 @@ static bool drw_draw_show_annotation(void) /* -------------------------------------------------------------------- */ /** \name Threading * \{ */ + static void drw_task_graph_init(void) { BLI_assert(DST.task_graph == NULL); @@ -172,7 +173,8 @@ static void drw_task_graph_deinit(void) BLI_task_graph_free(DST.task_graph); DST.task_graph = NULL; } -/* \} */ + +/** \} */ /* -------------------------------------------------------------------- */ /** \name Settings diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index 8ba3ee097df..2fb44d0030b 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -256,7 +256,7 @@ void DRW_draw_cursor_2d(void) GPU_matrix_projection_set(original_proj); } } -/* \} */ +/** \} */ /* **************************** 3D Gizmo ******************************** */ diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index c17d678d866..f521b89450e 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -895,7 +895,6 @@ static void panel_register_stepped(ARegionType *region_type, /* -------------------------------------------------------------------- */ /** \name Panel Creation - * * \{ */ /** diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c index d4d9f9bf424..d506af4450a 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c @@ -446,7 +446,6 @@ static void gizmo_arrow_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Arrow Gizmo API - * * \{ */ /** diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c index 1b1f1151053..b1c8efcfafc 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c @@ -55,7 +55,6 @@ static int gizmo_blank_test_select(bContext *UNUSED(C), /* -------------------------------------------------------------------- */ /** \name Blank Gizmo API - * * \{ */ static void GIZMO_GT_blank_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c index cbca230da7e..f4c4e4eb2ac 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c @@ -343,7 +343,6 @@ static void gizmo_button2d_free(wmGizmo *gz) /* -------------------------------------------------------------------- */ /** \name Button Gizmo API - * * \{ */ static void GIZMO_GT_button_2d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c index be5f488d759..deb89319f4f 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c @@ -1145,7 +1145,6 @@ static void gizmo_cage2d_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Cage Gizmo API - * * \{ */ static void GIZMO_GT_cage_2d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c index f7ab1732457..07117c0153b 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c @@ -635,7 +635,6 @@ static void gizmo_cage3d_exit(bContext *C, wmGizmo *gz, const bool cancel) /* -------------------------------------------------------------------- */ /** \name Cage Gizmo API - * * \{ */ static void GIZMO_GT_cage_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c index e1860d5d0fd..6345cd3525a 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c @@ -595,7 +595,6 @@ static int gizmo_dial_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEvent *ev /* -------------------------------------------------------------------- */ /** \name Dial Gizmo API - * * \{ */ void ED_gizmotypes_dial_3d_draw_util(const float matrix_basis[4][4], diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c index 011563eece5..364444f99ae 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c @@ -434,7 +434,6 @@ static int gizmo_move_cursor_get(wmGizmo *UNUSED(gz)) /* -------------------------------------------------------------------- */ /** \name Move Gizmo API - * * \{ */ static void GIZMO_GT_move_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c index 177687b6afd..7e6a728ee80 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c @@ -149,7 +149,6 @@ static int gizmo_primitive_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEven /* -------------------------------------------------------------------- */ /** \name Primitive Gizmo API - * * \{ */ static void GIZMO_GT_primitive_3d(wmGizmoType *gzt) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 1bfd84a7046..6b634eedd7a 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -665,7 +665,6 @@ static void ui_afterfunc_update_preferences_dirty(uiAfterFunc *after) /* -------------------------------------------------------------------- */ /** \name Button Snap Values - * * \{ */ enum eSnapType { diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 0be79f6da1e..67446ca681f 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -7016,7 +7016,6 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr) /* -------------------------------------------------------------------- */ /** \name Event Icon Template - * * \{ */ bool uiTemplateEventFromKeymapItem(struct uiLayout *layout, diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c index da3d16ba04f..4d37b78c9b7 100644 --- a/source/blender/editors/mesh/editmesh_polybuild.c +++ b/source/blender/editors/mesh/editmesh_polybuild.c @@ -523,7 +523,6 @@ void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Dissolve at Cursor - * * \{ */ static int edbm_polybuild_dissolve_at_cursor_invoke(bContext *C, diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 82c0316093a..351b762c8cd 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -265,7 +265,6 @@ static int object_add_drop_xy_generic_invoke(bContext *C, wmOperator *op, const /* -------------------------------------------------------------------- */ /** \name Public Add Object API - * * \{ */ void ED_object_location_from_view(bContext *C, float loc[3]) @@ -3411,7 +3410,6 @@ void OBJECT_OT_add_named(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Join Object Operator - * * \{ */ static bool object_join_poll(bContext *C) diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index 5a6fa2b8e3e..99103cf10c7 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -62,7 +62,6 @@ /* -------------------------------------------------------------------- */ /** \name High Level Mode Operations - * * \{ */ static const char *object_mode_op_string(eObjectMode mode) diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 5430137f5ca..b99cb831bee 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -234,7 +234,6 @@ void ED_workspace_scene_data_sync(WorkSpaceInstanceHook *hook, Scene *scene) /* -------------------------------------------------------------------- */ /** \name Workspace Operators - * * \{ */ static WorkSpace *workspace_context_get(bContext *C) diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 33e724459a9..4752f62b58c 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -57,7 +57,6 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu); /* -------------------------------------------------------------------- */ /** \name Utility Drawing Defines - * * \{ */ /* determine the alpha value that should be used when @@ -73,7 +72,6 @@ static float fcurve_display_alpha(FCurve *fcu) /* -------------------------------------------------------------------- */ /** \name FCurve Modifier Drawing - * * \{ */ /* Envelope -------------- */ @@ -153,7 +151,6 @@ static void draw_fcurve_modifier_controls_envelope(FModifier *fcm, /* -------------------------------------------------------------------- */ /** \name FCurve Modifier Drawing - * * \{ */ /* Points ---------------- */ @@ -1343,7 +1340,6 @@ void graph_draw_curves(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, shor /* -------------------------------------------------------------------- */ /** \name Channel List - * * \{ */ /* left hand part */ diff --git a/source/blender/editors/space_outliner/tree/common.cc b/source/blender/editors/space_outliner/tree/common.cc index 65c9448634c..306d59288f4 100644 --- a/source/blender/editors/space_outliner/tree/common.cc +++ b/source/blender/editors/space_outliner/tree/common.cc @@ -28,7 +28,6 @@ /* -------------------------------------------------------------------- */ /** \name ID Helpers. - * * \{ */ const char *outliner_idcode_to_plural(short idcode) diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc index afdee185d0d..a0ebac5f451 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc @@ -60,7 +60,6 @@ class ObjectsChildrenBuilder { /* -------------------------------------------------------------------- */ /** \name Tree-Display for a View Layer. - * * \{ */ TreeDisplayViewLayer::TreeDisplayViewLayer(SpaceOutliner &space_outliner) diff --git a/source/blender/editors/space_view3d/view3d_gizmo_armature.c b/source/blender/editors/space_view3d/view3d_gizmo_armature.c index ee512a5f726..4d8102af6ff 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_armature.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_armature.c @@ -48,7 +48,6 @@ /* -------------------------------------------------------------------- */ /** \name Armature Spline Gizmo - * * \{ */ /* diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c index 171cf721343..441182d7a5f 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c @@ -36,7 +36,6 @@ /* -------------------------------------------------------------------- */ /** \name Mesh Pre-Select Element Gizmo - * * \{ */ struct GizmoGroupPreSelElem { @@ -72,7 +71,6 @@ void VIEW3D_GGT_mesh_preselect_elem(wmGizmoGroupType *gzgt) /* -------------------------------------------------------------------- */ /** \name Mesh Pre-Select Edge Ring Gizmo - * * \{ */ struct GizmoGroupPreSelEdgeRing { diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c index 9f35abf7fef..298a2a7a824 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c @@ -52,7 +52,6 @@ /* -------------------------------------------------------------------- */ /** \name Mesh Element (Vert/Edge/Face) Pre-Select Gizmo API - * * \{ */ typedef struct MeshElemGizmo3D { @@ -282,7 +281,6 @@ static void GIZMO_GT_mesh_preselect_elem_3d(wmGizmoType *gzt) /* -------------------------------------------------------------------- */ /** \name Mesh Edge-Ring Pre-Select Gizmo API - * * \{ */ typedef struct MeshEdgeRingGizmo3D { @@ -439,7 +437,6 @@ static void GIZMO_GT_mesh_preselect_edgering_3d(wmGizmoType *gzt) /* -------------------------------------------------------------------- */ /** \name Gizmo API - * * \{ */ void ED_gizmotypes_preselect_3d(void) diff --git a/source/blender/editors/space_view3d/view3d_utils.c b/source/blender/editors/space_view3d/view3d_utils.c index a6a77ecd5f7..3ef428cfbaf 100644 --- a/source/blender/editors/space_view3d/view3d_utils.c +++ b/source/blender/editors/space_view3d/view3d_utils.c @@ -67,7 +67,6 @@ /* -------------------------------------------------------------------- */ /** \name View Data Access Utilities - * * \{ */ void ED_view3d_background_color_get(const Scene *scene, const View3D *v3d, float r_color[3]) @@ -189,7 +188,6 @@ bool ED_view3d_viewplane_get(Depsgraph *depsgraph, /* -------------------------------------------------------------------- */ /** \name View State/Context Utilities - * * \{ */ /** @@ -272,7 +270,6 @@ bool ED_view3d_context_activate(bContext *C) /* -------------------------------------------------------------------- */ /** \name View Clipping Utilities - * * \{ */ void ED_view3d_clipping_calc_from_boundbox(float clip[4][4], @@ -397,7 +394,6 @@ bool ED_view3d_clipping_clamp_minmax(const RegionView3D *rv3d, float min[3], flo /* -------------------------------------------------------------------- */ /** \name View Bound-Box Utilities - * * \{ */ static bool view3d_boundbox_clip_m4(const BoundBox *bb, const float persmatob[4][4]) diff --git a/source/blender/editors/transform/transform_convert_action.c b/source/blender/editors/transform/transform_convert_action.c index da68f9c13de..8204264e105 100644 --- a/source/blender/editors/transform/transform_convert_action.c +++ b/source/blender/editors/transform/transform_convert_action.c @@ -55,7 +55,6 @@ typedef struct tGPFtransdata { /* -------------------------------------------------------------------- */ /** \name Action Transform Creation - * * \{ */ /* fully select selected beztriples, but only include if it's on the right side of cfra */ @@ -553,7 +552,6 @@ void createTransActionData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Action Transform Flush - * * \{ */ /* This function helps flush transdata written to tempdata into the gp-frames */ diff --git a/source/blender/editors/transform/transform_convert_curve.c b/source/blender/editors/transform/transform_convert_curve.c index 3c01c716123..bef3eca0d9d 100644 --- a/source/blender/editors/transform/transform_convert_curve.c +++ b/source/blender/editors/transform/transform_convert_curve.c @@ -40,7 +40,6 @@ /* -------------------------------------------------------------------- */ /** \name Curve/Surfaces Transform Creation - * * \{ */ /** diff --git a/source/blender/editors/transform/transform_convert_gpencil.c b/source/blender/editors/transform/transform_convert_gpencil.c index eaa8962326a..244cd552495 100644 --- a/source/blender/editors/transform/transform_convert_gpencil.c +++ b/source/blender/editors/transform/transform_convert_gpencil.c @@ -43,7 +43,6 @@ /* -------------------------------------------------------------------- */ /** \name Gpencil Transform Creation - * * \{ */ static void createTransGPencil_center_get(bGPDstroke *gps, float r_center[3]) diff --git a/source/blender/editors/transform/transform_convert_graph.c b/source/blender/editors/transform/transform_convert_graph.c index 7daa6498334..d57f7fffe0b 100644 --- a/source/blender/editors/transform/transform_convert_graph.c +++ b/source/blender/editors/transform/transform_convert_graph.c @@ -49,7 +49,6 @@ typedef struct TransDataGraph { /* -------------------------------------------------------------------- */ /** \name Graph Editor Transform Creation - * * \{ */ /* Helper function for createTransGraphEditData, which is responsible for associating @@ -632,7 +631,6 @@ void createTransGraphEditData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Graph Editor Transform Flush - * * \{ */ static bool fcu_test_selected(FCurve *fcu) diff --git a/source/blender/editors/transform/transform_convert_lattice.c b/source/blender/editors/transform/transform_convert_lattice.c index e564733266b..20ac7dcb998 100644 --- a/source/blender/editors/transform/transform_convert_lattice.c +++ b/source/blender/editors/transform/transform_convert_lattice.c @@ -39,7 +39,6 @@ /* -------------------------------------------------------------------- */ /** \name Curve/Surfaces Transform Creation - * * \{ */ void createTransLatticeVerts(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mask.c b/source/blender/editors/transform/transform_convert_mask.c index 340f14c6800..d60d34d2c5d 100644 --- a/source/blender/editors/transform/transform_convert_mask.c +++ b/source/blender/editors/transform/transform_convert_mask.c @@ -57,7 +57,6 @@ typedef struct TransDataMasking { /* -------------------------------------------------------------------- */ /** \name Masking Transform Creation - * * \{ */ static void MaskHandleToTransData(MaskSplinePoint *point, @@ -400,7 +399,6 @@ void createTransMaskingData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc TransData Masking - * * \{ */ static void flushTransMasking(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mball.c b/source/blender/editors/transform/transform_convert_mball.c index ce5e4dade5a..6f5c0318054 100644 --- a/source/blender/editors/transform/transform_convert_mball.c +++ b/source/blender/editors/transform/transform_convert_mball.c @@ -34,7 +34,6 @@ /* -------------------------------------------------------------------- */ /** \name Meta Elements Transform Creation - * * \{ */ void createTransMBallVerts(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c index ce74c5f5a36..5e2eca13f90 100644 --- a/source/blender/editors/transform/transform_convert_mesh.c +++ b/source/blender/editors/transform/transform_convert_mesh.c @@ -52,7 +52,6 @@ /* -------------------------------------------------------------------- */ /** \name Island Creation - * * \{ */ void transform_convert_mesh_islands_calc(struct BMEditMesh *em, @@ -248,7 +247,6 @@ void transform_convert_mesh_islanddata_free(struct TransIslandData *island_data) /* -------------------------------------------------------------------- */ /** \name Connectivity Distance for Proportional Editing - * * \{ */ /* Propagate distance from v1 and v2 to v0. */ @@ -453,7 +451,6 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, /* -------------------------------------------------------------------- */ /** \name TransDataMirror Creation - * * \{ */ /* Used for both mirror epsilon and TD_MIRROR_EDGE_ */ @@ -596,7 +593,6 @@ void transform_convert_mesh_mirrordata_free(struct TransMirrorData *mirror_data) /* -------------------------------------------------------------------- */ /** \name Crazy Space - * * \{ */ /* Detect CrazySpace [tm]. @@ -702,7 +698,6 @@ void transform_convert_mesh_crazyspace_free(struct TransMeshDataCrazySpace *r_cr /* -------------------------------------------------------------------- */ /** \name Edit Mesh Verts Transform Creation - * * \{ */ static void transdata_center_get(const struct TransIslandData *island_data, @@ -1010,7 +1005,6 @@ void createTransEditVerts(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name CustomData Layer Correction - * * \{ */ struct TransCustomDataMergeGroup { @@ -1560,7 +1554,6 @@ static void mesh_customdatacorrect_restore(struct TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Mesh Data - * * \{ */ static void mesh_apply_to_mirror(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_edge.c b/source/blender/editors/transform/transform_convert_mesh_edge.c index 7bdd33192da..bb9296b4b90 100644 --- a/source/blender/editors/transform/transform_convert_mesh_edge.c +++ b/source/blender/editors/transform/transform_convert_mesh_edge.c @@ -36,7 +36,6 @@ /* -------------------------------------------------------------------- */ /** \name Edge (for crease) Transform Creation - * * \{ */ void createTransEdge(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_skin.c b/source/blender/editors/transform/transform_convert_mesh_skin.c index b1024f5efe4..5dbb1947773 100644 --- a/source/blender/editors/transform/transform_convert_mesh_skin.c +++ b/source/blender/editors/transform/transform_convert_mesh_skin.c @@ -45,7 +45,6 @@ /* -------------------------------------------------------------------- */ /** \name Edit Mesh #CD_MVERT_SKIN Transform Creation - * * \{ */ static float *mesh_skin_transdata_center(const struct TransIslandData *island_data, @@ -274,7 +273,6 @@ void createTransMeshSkin(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Mesh Data - * * \{ */ static void mesh_skin_apply_to_mirror(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_mesh_uv.c b/source/blender/editors/transform/transform_convert_mesh_uv.c index 52394009d28..a5f90e9ac5f 100644 --- a/source/blender/editors/transform/transform_convert_mesh_uv.c +++ b/source/blender/editors/transform/transform_convert_mesh_uv.c @@ -44,7 +44,6 @@ /* -------------------------------------------------------------------- */ /** \name UVs Transform Creation - * * \{ */ static void UVsToTransData(const float aspect[2], @@ -414,7 +413,6 @@ void createTransUVs(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name UVs Transform Flush - * * \{ */ static void flushTransUVs(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_nla.c b/source/blender/editors/transform/transform_convert_nla.c index 5eb3f68787a..b55005673d9 100644 --- a/source/blender/editors/transform/transform_convert_nla.c +++ b/source/blender/editors/transform/transform_convert_nla.c @@ -70,7 +70,6 @@ typedef struct TransDataNla { /* -------------------------------------------------------------------- */ /** \name NLA Transform Creation - * * \{ */ void createTransNlaData(bContext *C, TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_node.c b/source/blender/editors/transform/transform_convert_node.c index 58ff4db324e..506e8a2bd9b 100644 --- a/source/blender/editors/transform/transform_convert_node.c +++ b/source/blender/editors/transform/transform_convert_node.c @@ -42,7 +42,6 @@ /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ /* transcribe given node into TransData2D for Transforming */ @@ -145,7 +144,6 @@ void createTransNodeData(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ void flushTransNodes(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c index 5f6f00716f9..b546f1d0b4c 100644 --- a/source/blender/editors/transform/transform_convert_object.c +++ b/source/blender/editors/transform/transform_convert_object.c @@ -860,7 +860,6 @@ static bool motionpath_need_update_object(Scene *scene, Object *ob) /* -------------------------------------------------------------------- */ /** \name Recalc Data object - * * \{ */ /* helper for recalcData() - for object transforms, typically in the 3D view */ diff --git a/source/blender/editors/transform/transform_convert_object_texspace.c b/source/blender/editors/transform/transform_convert_object_texspace.c index 195eb941b3b..371a5b48818 100644 --- a/source/blender/editors/transform/transform_convert_object_texspace.c +++ b/source/blender/editors/transform/transform_convert_object_texspace.c @@ -100,7 +100,6 @@ void createTransTexspace(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Data object - * * \{ */ /* helper for recalcData() - for object transforms, typically in the 3D view */ diff --git a/source/blender/editors/transform/transform_convert_paintcurve.c b/source/blender/editors/transform/transform_convert_paintcurve.c index 47859896673..560298bd99b 100644 --- a/source/blender/editors/transform/transform_convert_paintcurve.c +++ b/source/blender/editors/transform/transform_convert_paintcurve.c @@ -40,7 +40,6 @@ typedef struct TransDataPaintCurve { /* -------------------------------------------------------------------- */ /** \name Paint Curve Transform Creation - * * \{ */ #define PC_IS_ANY_SEL(pc) (((pc)->bez.f1 | (pc)->bez.f2 | (pc)->bez.f3) & SELECT) @@ -203,7 +202,6 @@ void createTransPaintCurveVerts(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Paint Curve Transform Flush - * * \{ */ void flushTransPaintCurve(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_particle.c b/source/blender/editors/transform/transform_convert_particle.c index 6366eff2f4c..cb4df28d94b 100644 --- a/source/blender/editors/transform/transform_convert_particle.c +++ b/source/blender/editors/transform/transform_convert_particle.c @@ -42,7 +42,6 @@ /* -------------------------------------------------------------------- */ /** \name Particle Edit Transform Creation - * * \{ */ void createTransParticleVerts(TransInfo *t) @@ -193,7 +192,6 @@ void createTransParticleVerts(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Node Transform Creation - * * \{ */ static void flushTransParticles(TransInfo *t) @@ -251,7 +249,6 @@ static void flushTransParticles(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Transform Particles Data - * * \{ */ void recalcData_particles(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_sculpt.c b/source/blender/editors/transform/transform_convert_sculpt.c index 70fec49d77d..d9c29ddbcf7 100644 --- a/source/blender/editors/transform/transform_convert_sculpt.c +++ b/source/blender/editors/transform/transform_convert_sculpt.c @@ -36,7 +36,6 @@ /* -------------------------------------------------------------------- */ /** \name Sculpt Transform Creation - * * \{ */ void createTransSculpt(bContext *C, TransInfo *t) @@ -108,7 +107,6 @@ void createTransSculpt(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name Recalc Data object - * * \{ */ void recalcData_sculpt(TransInfo *t) diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 22b1f9fd8d7..4ab52b78002 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -71,7 +71,6 @@ typedef struct TransSeq { /* -------------------------------------------------------------------- */ /** \name Sequencer Transform Creation - * * \{ */ /* This function applies the rules for transforming a strip so duplicate @@ -641,7 +640,6 @@ void createTransSeqData(TransInfo *t) /* -------------------------------------------------------------------- */ /** \name UVs Transform Flush - * * \{ */ /* commented _only_ because the meta may have animation data which diff --git a/source/blender/editors/transform/transform_convert_tracking.c b/source/blender/editors/transform/transform_convert_tracking.c index 5f5f06e388f..211dec3c4e8 100644 --- a/source/blender/editors/transform/transform_convert_tracking.c +++ b/source/blender/editors/transform/transform_convert_tracking.c @@ -71,7 +71,6 @@ enum transDataTracking_Mode { /* -------------------------------------------------------------------- */ /** \name Clip Editor Motion Tracking Transform Creation - * * \{ */ typedef struct TransformInitContext { @@ -567,7 +566,6 @@ void createTransTrackingData(bContext *C, TransInfo *t) /* -------------------------------------------------------------------- */ /** \name recalc Motion Tracking TransData - * * \{ */ static void cancelTransTracking(TransInfo *t) diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc index e24f157d4f9..6c418dee2c1 100644 --- a/source/blender/functions/intern/multi_function_network_optimization.cc +++ b/source/blender/functions/intern/multi_function_network_optimization.cc @@ -36,7 +36,6 @@ namespace blender::fn::mf_network_optimization { /* -------------------------------------------------------------------- */ /** \name Utility functions to find nodes in a network. - * * \{ */ static bool set_tag_and_check_if_modified(bool &tag, bool new_value) @@ -122,7 +121,6 @@ static Vector find_nodes_based_on_mask(MFNetwork &network, /* -------------------------------------------------------------------- */ /** \name Dead Node Removal - * * \{ */ /** @@ -140,7 +138,6 @@ void dead_node_removal(MFNetwork &network) /* -------------------------------------------------------------------- */ /** \name Constant Folding - * * \{ */ static bool function_node_can_be_constant(MFFunctionNode *node) @@ -330,7 +327,6 @@ void constant_folding(MFNetwork &network, ResourceCollector &resources) /* -------------------------------------------------------------------- */ /** \name Common Sub-network Elimination - * * \{ */ static uint64_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span node_hashes) diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc index 2b83b3bc28c..c3e9058c6c7 100644 --- a/source/blender/gpu/intern/gpu_texture.cc +++ b/source/blender/gpu/intern/gpu_texture.cc @@ -611,7 +611,6 @@ void GPU_samplers_update(void) /* -------------------------------------------------------------------- */ /** \name GPU texture utilities - * * \{ */ size_t GPU_texture_component_len(eGPUTextureFormat tex_format) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 351ba884d49..82e65505147 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -1460,7 +1460,6 @@ uint32_t PyC_Long_AsU32(PyObject *value) /* -------------------------------------------------------------------- */ /** \name Py_buffer Utils - * * \{ */ char PyC_StructFmt_type_from_str(const char *typestr) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c index a56a506b1ab..cfedd67b2f0 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c @@ -378,7 +378,6 @@ void WM_gizmo_set_color_highlight(wmGizmo *gz, const float color_hi[4]) /* -------------------------------------------------------------------- */ /** \name Gizmo Callback Assignment - * * \{ */ void WM_gizmo_set_fn_custom_modal(struct wmGizmo *gz, wmGizmoFnModal fn) @@ -758,7 +757,6 @@ void WM_gizmo_properties_free(PointerRNA *ptr) /* -------------------------------------------------------------------- */ /** \name General Utilities - * * \{ */ bool WM_gizmo_context_check_drawstep(const struct bContext *C, eWM_GizmoFlagMapDrawStep step) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index e9a1b5e3df0..1e77ccd7a1c 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -61,7 +61,6 @@ /* -------------------------------------------------------------------- */ /** \name wmGizmoGroup - * * \{ */ /** @@ -697,7 +696,6 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf) /* -------------------------------------------------------------------- */ /** \name wmGizmoGroup (Key-map callbacks) - * * \{ */ wmKeyMap *WM_gizmogroup_setup_keymap_generic(const wmGizmoGroupType *UNUSED(gzgt), wmKeyConfig *kc) @@ -837,7 +835,6 @@ struct wmKeyMap *WM_gizmo_keymap_generic_maybe_drag(wmWindowManager *wm) /* -------------------------------------------------------------------- */ /** \name wmGizmoGroupType - * * \{ */ struct wmGizmoGroupTypeRef *WM_gizmomaptype_group_find_ptr(struct wmGizmoMapType *gzmap_type, @@ -1142,7 +1139,6 @@ void WM_gizmo_group_unlink_delayed_ptr_from_space(wmGizmoGroupType *gzgt, /* -------------------------------------------------------------------- */ /** \name Gizmo Group Type Callback Wrappers - * * \{ */ bool WM_gizmo_group_type_poll(const bContext *C, const wmGizmoGroupType *gzgt) diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index 12c6eb46c12..051e3e4c1a9 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -158,7 +158,6 @@ void wm_gizmomap_select_array_remove(wmGizmoMap *gzmap, wmGizmo *gz) /* -------------------------------------------------------------------- */ /** \name wmGizmoMap - * * \{ */ static wmGizmoMap *wm_gizmomap_new_from_type_ex(struct wmGizmoMapType *gzmap_type, @@ -1182,7 +1181,6 @@ void WM_gizmomap_message_subscribe(const bContext *C, /* -------------------------------------------------------------------- */ /** \name Tooltip Handling - * * \{ */ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C, @@ -1211,7 +1209,6 @@ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C, /* -------------------------------------------------------------------- */ /** \name wmGizmoMapType - * * \{ */ wmGizmoMapType *WM_gizmomaptype_find(const struct wmGizmoMapType_Params *gzmap_params) @@ -1277,7 +1274,6 @@ void wm_gizmos_keymap(wmKeyConfig *keyconf) /* -------------------------------------------------------------------- */ /** \name Updates for Dynamic Type Registration - * * \{ */ void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 7b047e68aee..2406ba83bf4 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -5141,7 +5141,6 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win) /* -------------------------------------------------------------------- */ /** \name Modal Keymap Status - * * \{ */ bool WM_window_modal_keymap_status_draw(bContext *C, wmWindow *win, uiLayout *layout) diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 7dc6b0a1eb8..c4452b4c4f7 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1925,7 +1925,6 @@ bool wm_window_get_swap_interval(wmWindow *win, int *intervalOut) /* -------------------------------------------------------------------- */ /** \name Find Window Utility - * * \{ */ static void wm_window_desktop_pos_get(const wmWindow *win, const int screen_pos[2], diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c index 90f30809136..439d611b085 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr.c +++ b/source/blender/windowmanager/xr/intern/wm_xr.c @@ -138,7 +138,6 @@ bool wm_xr_events_handle(wmWindowManager *wm) /* -------------------------------------------------------------------- */ /** \name XR Runtime Data - * * \{ */ wmXrRuntimeData *wm_xr_runtime_data_create(void) From 4cd808f912173b8c59c217860313e178102e893e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Feb 2021 15:38:14 +1100 Subject: [PATCH 334/519] Cleanup: spelling --- source/blender/blenkernel/intern/fmodifier.c | 2 +- source/blender/editors/animation/fmodifier_ui.c | 6 +++--- source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/editors/interface/interface_region_popup.c | 4 ++-- source/blender/editors/space_outliner/outliner_draw.c | 2 +- source/blender/makesdna/DNA_anim_types.h | 4 ++-- source/blender/python/intern/bpy_rna.c | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index 4cd49987a83..8d1e6b26d4d 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -1134,7 +1134,7 @@ FModifier *add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu) /* add modifier itself */ fcm = MEM_callocN(sizeof(FModifier), "F-Curve Modifier"); fcm->type = type; - fcm->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT; /* Expand the main panel, not the subpanels. */ + fcm->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT; /* Expand the main panel, not the sub-panels. */ fcm->curve = owner_fcu; fcm->influence = 1.0f; BLI_addtail(modifiers, fcm); diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index f521b89450e..0821cfbd282 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -190,7 +190,7 @@ static PanelType *fmodifier_panel_register(ARegionType *region_type, panel_type->poll = poll; /* Give the panel the special flag that says it was built here and corresponds to a - * modifer rather than a PanelType. */ + * modifier rather than a #PanelType. */ panel_type->flag = PANEL_TYPE_HEADER_EXPAND | PANEL_TYPE_DRAW_BOX | PANEL_TYPE_INSTANCED; panel_type->reorder = fmodifier_reorder; panel_type->get_list_data_expand_flag = get_fmodifier_expand_flag; @@ -596,7 +596,7 @@ static void panel_register_noise(ARegionType *region_type, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Enevelope Modifier +/** \name Envelope Modifier * \{ */ static void fmod_envelope_addpoint_cb(bContext *C, void *fcm_dv, void *UNUSED(arg)) @@ -898,7 +898,7 @@ static void panel_register_stepped(ARegionType *region_type, * \{ */ /** - * Checks if the panels match the active strip / curve, rebubilds them if they don't. + * Checks if the panels match the active strip / curve, rebuilds them if they don't. */ void ANIM_fmodifier_panels(const bContext *C, ID *owner_id, diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 6b634eedd7a..3a4eda29206 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -7927,7 +7927,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s button_tooltip_timer_reset(C, but); - /* automatic open pulldown block timer */ + /* Automatic open pull-down block timer. */ if (ELEM(but->type, UI_BTYPE_BLOCK, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER) || /* Menu button types may draw as popovers, check for this case * ignoring other kinds of menus (mainly enums). (see T66538). */ diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c index 3228e9741bb..8135f5a203e 100644 --- a/source/blender/editors/interface/interface_region_popup.c +++ b/source/blender/editors/interface/interface_region_popup.c @@ -353,7 +353,7 @@ static void ui_popup_block_position(wmWindow *window, block->direction = dir1; } - /* keep a list of these, needed for pulldown menus */ + /* Keep a list of these, needed for pull-down menus. */ uiSafetyRct *saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct"); saferct->parent = butrct; saferct->safety = block->safety; @@ -632,7 +632,7 @@ uiBlock *ui_popup_block_refresh(bContext *C, } else { uiSafetyRct *saferct; - /* keep a list of these, needed for pulldown menus */ + /* Keep a list of these, needed for pull-down menus. */ saferct = MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct"); saferct->safety = block->safety; BLI_addhead(&block->saferct, saferct); diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 031c94689b0..008ae727947 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -3414,7 +3414,7 @@ static void outliner_draw_highlights_recursive(uint pos, } else { if (is_searching && (tselem->flag & TSE_SEARCHMATCH)) { - /* Ssearch match highlights. We don't expand items when searching in the data-blocks, + /* Search match highlights. We don't expand items when searching in the data-blocks, * but we still want to highlight any filter matches. */ immUniformColor4fv(col_searchmatch); immRecti(pos, start_x, start_y, end_x, start_y + UI_UNIT_Y); diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index c9abb4fb5be..dffb3588de4 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -58,8 +58,8 @@ typedef struct FModifier { /** Settings for the modifier. */ short flag; /** - * Expansion state for the modifier panel and its subpanels, stored as a bitfield - * in depth-first order. (Maximum of sizeof(short) total panels). + * Expansion state for the modifier panel and its sub-panels, stored as a bit-field + * in depth-first order. (Maximum of `sizeof(short)` total panels). */ short ui_expand_flag; diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index ad185226aa5..311a7afef01 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -7668,7 +7668,7 @@ PyObject *BPY_rna_doc(void) * This could be a static variable as we only have one `bpy.types` module, * it just keeps the data isolated to store in the module it's self. * - * This data doesn't chance one initialized. + * This data doesn't change one initialized. */ struct BPy_TypesModule_State { /** `RNA_BlenderRNA`. */ From 37e6a1995ac7eeabd5b6a56621ad5a850dae4149 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Feb 2021 16:16:43 +1100 Subject: [PATCH 335/519] PyAPI: use a new type for storing the deferred result of bpy.props This is needed to support Python 3.10's Postponed annotation evaluation. It also simplifies type checking. --- source/blender/python/intern/bpy_props.c | 92 ++++++++++++---- source/blender/python/intern/bpy_props.h | 10 ++ source/blender/python/intern/bpy_rna.c | 129 ++++++++++------------- 3 files changed, 137 insertions(+), 94 deletions(-) diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 878bf4aec5d..c596f81a91c 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -193,6 +193,71 @@ static const EnumPropertyItem property_subtype_array_items[] = { "'XYZ', 'XYZ_LENGTH', 'COLOR_GAMMA', 'COORDINATES', 'LAYER', 'LAYER_MEMBER', 'NONE'].\n" \ " :type subtype: string\n" +/* -------------------------------------------------------------------- */ +/** \name Deferred Property Type + * + * Operators and classes use this so it can store the arguments given but defer + * running it until the operator runs where these values are used to setup + * the default arguments for that operator instance. + * \{ */ + +static void bpy_prop_deferred_dealloc(BPy_PropDeferred *self) +{ + if (self->kw) { + PyObject_GC_UnTrack(self); + Py_CLEAR(self->kw); + } + PyObject_GC_Del(self); +} + +static int bpy_prop_deferred_traverse(BPy_PropDeferred *self, visitproc visit, void *arg) +{ + Py_VISIT(self->kw); + return 0; +} + +static int bpy_prop_deferred_clear(BPy_PropDeferred *self) +{ + Py_CLEAR(self->kw); + return 0; +} + +static PyObject *bpy_prop_deferred_repr(BPy_PropDeferred *self) +{ + return PyUnicode_FromFormat("<%.200s, %R, %R>", Py_TYPE(self)->tp_name, self->fn, self->kw); +} + +PyTypeObject bpy_prop_deferred_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "bpy_prop_deferred", + .tp_basicsize = sizeof(BPy_PropDeferred), + .tp_dealloc = (destructor)bpy_prop_deferred_dealloc, + .tp_repr = (reprfunc)bpy_prop_deferred_repr, + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + + .tp_traverse = (traverseproc)bpy_prop_deferred_traverse, + .tp_clear = (inquiry)bpy_prop_deferred_clear, +}; + +static PyObject *bpy_prop_deferred_data_CreatePyObject(PyObject *fn, PyObject *kw) +{ + BPy_PropDeferred *self = PyObject_GC_New(BPy_PropDeferred, &bpy_prop_deferred_Type); + self->fn = fn; + if (kw == NULL) { + kw = PyDict_New(); + } + else { + Py_INCREF(kw); + } + self->kw = kw; + PyObject_GC_Track(self); + return (PyObject *)self; +} + +/** \} */ + /* PyObject's */ static PyObject *pymeth_BoolProperty = NULL; static PyObject *pymeth_BoolVectorProperty = NULL; @@ -248,27 +313,6 @@ static void bpy_prop_assign_flag_override(PropertyRNA *prop, const int flag_over RNA_def_property_override_flag(prop, flag_override); } -/* operators and classes use this so it can store the args given but defer - * running it until the operator runs where these values are used to setup - * the default args for that operator instance */ -static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) -{ - PyObject *ret = PyTuple_New(2); - PyTuple_SET_ITEM(ret, 0, func); - Py_INCREF(func); - - if (kw == NULL) { - kw = PyDict_New(); - } - else { - Py_INCREF(kw); - } - - PyTuple_SET_ITEM(ret, 1, kw); - - return ret; -} - /* callbacks */ static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, @@ -1997,7 +2041,7 @@ static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop, if (PyErr_Occurred()) { \ return NULL; \ } \ - return bpy_prop_deferred_return(pymeth_##_func, kw); \ + return bpy_prop_deferred_data_CreatePyObject(pymeth_##_func, kw); \ } \ (void)0 @@ -3668,5 +3712,9 @@ PyObject *BPY_rna_props(void) ASSIGN_STATIC(CollectionProperty); ASSIGN_STATIC(RemoveProperty); + if (PyType_Ready(&bpy_prop_deferred_Type) < 0) { + return NULL; + } + return submodule; } diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h index 3d7860dcdd8..6cebf82d373 100644 --- a/source/blender/python/intern/bpy_props.h +++ b/source/blender/python/intern/bpy_props.h @@ -30,6 +30,16 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw); PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw); StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix); +typedef struct { + PyObject_HEAD + /* This isn't GC tracked, it's a function from `bpy.props` so it's not going away. */ + void *fn; + PyObject *kw; +} BPy_PropDeferred; + +extern PyTypeObject bpy_prop_deferred_Type; +#define BPy_PropDeferred_CheckTypeExact(v) (Py_TYPE(v) == &bpy_prop_deferred_Type) + #define PYRNA_STACK_ARRAY RNA_STACK_ARRAY #ifdef __cplusplus diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 311a7afef01..0c091d7cd7c 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -4356,12 +4356,6 @@ static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname) #endif /* --------------- setattr------------------------------------------- */ -static bool pyrna_is_deferred_prop(const PyObject *value) -{ - return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value) == 2 && - PyCFunction_Check(PyTuple_GET_ITEM(value, 0)) && - PyDict_CheckExact(PyTuple_GET_ITEM(value, 1)); -} #if 0 static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr) @@ -4373,12 +4367,12 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr * >>> bpy.types.Scene.foo * * ...rather than returning the deferred class register tuple - * as checked by pyrna_is_deferred_prop() + * as checked by BPy_PropDeferred_CheckTypeExact() * * Disable for now, * this is faking internal behavior in a way that's too tricky to maintain well. */ # if 0 - if ((ret == NULL) /* || pyrna_is_deferred_prop(ret) */ ) { + if ((ret == NULL) /* || BPy_PropDeferred_CheckTypeExact(ret) */ ) { StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__"); if (srna) { PropertyRNA *prop = RNA_struct_type_find_property(srna, PyUnicode_AsUTF8(attr)); @@ -4399,7 +4393,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value) { StructRNA *srna = srna_from_self(cls, "StructRNA.__setattr__"); - const bool is_deferred_prop = (value && pyrna_is_deferred_prop(value)); + const bool is_deferred_prop = (value && BPy_PropDeferred_CheckTypeExact(value)); const char *attr_str = PyUnicode_AsUTF8(attr); if (srna && !pyrna_write_check() && @@ -7873,78 +7867,69 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix) static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item) { + if (!BPy_PropDeferred_CheckTypeExact(item)) { + /* No error, ignoring. */ + return 0; + } + /* We only care about results from C which * are for sure types, save some time with error */ - if (pyrna_is_deferred_prop(item)) { + PyObject *py_func = ((BPy_PropDeferred *)item)->fn; + PyObject *py_kw = ((BPy_PropDeferred *)item)->kw; + PyObject *py_srna_cobject, *py_ret; - PyObject *py_func, *py_kw, *py_srna_cobject, *py_ret; + PyObject *args_fake; - if (PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) { - PyObject *args_fake; + if (*PyUnicode_AsUTF8(key) == '_') { + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" registration error: " + "%.200s could not register because the property starts with an '_'\n", + RNA_struct_identifier(srna), + PyUnicode_AsUTF8(key)); + return -1; + } + py_srna_cobject = PyCapsule_New(srna, NULL, NULL); - if (*PyUnicode_AsUTF8(key) == '_') { - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" registration error: " - "%.200s could not register because the property starts with an '_'\n", - RNA_struct_identifier(srna), - PyUnicode_AsUTF8(key)); - return -1; - } - py_srna_cobject = PyCapsule_New(srna, NULL, NULL); + /* Not 100% nice :/, modifies the dict passed, should be ok. */ + PyDict_SetItem(py_kw, bpy_intern_str_attr, key); - /* Not 100% nice :/, modifies the dict passed, should be ok. */ - PyDict_SetItem(py_kw, bpy_intern_str_attr, key); + args_fake = PyTuple_New(1); + PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject); - args_fake = PyTuple_New(1); - PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject); - - PyObject *type = PyDict_GetItemString(py_kw, "type"); - StructRNA *type_srna = srna_from_self(type, ""); - if (type_srna) { - if (!RNA_struct_idprops_datablock_allowed(srna) && - (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty || - *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == - BPy_CollectionProperty) && - RNA_struct_idprops_contains_datablock(type_srna)) { - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" doesn't support datablock properties\n", - RNA_struct_identifier(srna)); - return -1; - } - } - - py_ret = PyObject_Call(py_func, args_fake, py_kw); - - if (py_ret) { - Py_DECREF(py_ret); - Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ - } - else { - /* _must_ print before decreffing args_fake. */ - PyErr_Print(); - PyErr_Clear(); - - Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ - - // PyC_LineSpit(); - PyErr_Format(PyExc_ValueError, - "bpy_struct \"%.200s\" registration error: " - "%.200s could not register\n", - RNA_struct_identifier(srna), - PyUnicode_AsUTF8(key)); - return -1; - } + PyObject *type = PyDict_GetItemString(py_kw, "type"); + StructRNA *type_srna = srna_from_self(type, ""); + if (type_srna) { + if (!RNA_struct_idprops_datablock_allowed(srna) && + (*(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_PointerProperty || + *(PyCFunctionWithKeywords)PyCFunction_GET_FUNCTION(py_func) == BPy_CollectionProperty) && + RNA_struct_idprops_contains_datablock(type_srna)) { + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" doesn't support datablock properties\n", + RNA_struct_identifier(srna)); + return -1; } - else { - /* Since this is a class dict, ignore args that can't be passed. */ + } - /* For testing only. */ -#if 0 - PyC_ObSpit("Why doesn't this work??", item); - PyErr_Print(); -#endif - PyErr_Clear(); - } + py_ret = PyObject_Call(py_func, args_fake, py_kw); + + if (py_ret) { + Py_DECREF(py_ret); + Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ + } + else { + /* _must_ print before decreffing args_fake. */ + PyErr_Print(); + PyErr_Clear(); + + Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ + + // PyC_LineSpit(); + PyErr_Format(PyExc_ValueError, + "bpy_struct \"%.200s\" registration error: " + "%.200s could not register\n", + RNA_struct_identifier(srna), + PyUnicode_AsUTF8(key)); + return -1; } return 0; From 173b6b792cf95fb9eb20ec760b28469d46b0ff52 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Sat, 20 Feb 2021 10:16:51 +0100 Subject: [PATCH 336/519] Cleanup: Split grease pencil selection index functions This makes the code more readable. --- source/blender/blenkernel/BKE_gpencil.h | 5 +-- source/blender/blenkernel/intern/gpencil.c | 27 ++++++------- .../blender/blenkernel/intern/gpencil_curve.c | 8 ++-- .../blender/blenkernel/intern/gpencil_geom.c | 2 +- source/blender/editors/gpencil/gpencil_data.c | 4 +- source/blender/editors/gpencil/gpencil_edit.c | 16 ++++---- .../blender/editors/gpencil/gpencil_merge.c | 4 +- .../editors/gpencil/gpencil_primitive.c | 2 +- .../blender/editors/gpencil/gpencil_select.c | 38 +++++++++---------- .../blender/editors/gpencil/gpencil_utils.c | 16 ++++---- source/blender/makesrna/intern/rna_gpencil.c | 4 +- 11 files changed, 63 insertions(+), 63 deletions(-) diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index b9dba991d64..5cfdcf241d1 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -103,9 +103,8 @@ void BKE_gpencil_batch_cache_free(struct bGPdata *gpd); void BKE_gpencil_stroke_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); void BKE_gpencil_curve_sync_selection(struct bGPdata *gpd, struct bGPDstroke *gps); -void BKE_gpencil_stroke_select_index_set(struct bGPdata *gpd, - struct bGPDstroke *gps, - const bool reset); +void BKE_gpencil_stroke_select_index_set(struct bGPdata *gpd, struct bGPDstroke *gps); +void BKE_gpencil_stroke_select_index_reset(struct bGPDstroke *gps); struct bGPDframe *BKE_gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe); struct bGPDframe *BKE_gpencil_frame_addcopy(struct bGPDlayer *gpl, int cframe); diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 4167f60e880..28477e9dc30 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1148,7 +1148,7 @@ void BKE_gpencil_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps) * so initially, we must deselect */ gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (pt->flag & GP_SPOINT_SELECT) { @@ -1158,7 +1158,7 @@ void BKE_gpencil_stroke_sync_selection(bGPdata *gpd, bGPDstroke *gps) } if (gps->flag & GP_STROKE_SELECT) { - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } } @@ -1170,7 +1170,7 @@ void BKE_gpencil_curve_sync_selection(bGPdata *gpd, bGPDstroke *gps) } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); gpc->flag &= ~GP_CURVE_SELECT; bool is_selected = false; @@ -1193,20 +1193,21 @@ void BKE_gpencil_curve_sync_selection(bGPdata *gpd, bGPDstroke *gps) if (is_selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } } /* Assign unique stroke ID for selection. */ -void BKE_gpencil_stroke_select_index_set(bGPdata *gpd, bGPDstroke *gps, const bool reset) +void BKE_gpencil_stroke_select_index_set(bGPdata *gpd, bGPDstroke *gps) { - if (!reset) { - gpd->select_last_index++; - gps->select_index = gpd->select_last_index; - } - else { - gps->select_index = 0; - } + gpd->select_last_index++; + gps->select_index = gpd->select_last_index; +} + +/* Reset unique stroke ID for selection. */ +void BKE_gpencil_stroke_select_index_reset(bGPDstroke *gps) +{ + gps->select_index = 0; } /* ************************************************** */ @@ -2533,7 +2534,7 @@ bool BKE_gpencil_from_image( } if (gps->flag & GP_STROKE_SELECT) { - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } BKE_gpencil_stroke_geometry_update(gpd, gps); diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index a1cae205d39..88d3e917a7a 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -814,7 +814,7 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPdata *gpd, bGPDstroke *gps, { if (gpc->flag & GP_CURVE_SELECT) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -868,7 +868,7 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPdata *gpd, bGPDstroke *gps, } else { gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); for (int i = 0; i < gps->totpoints; i++) { bGPDspoint *pt = &gps->points[i]; pt->flag &= ~GP_SPOINT_SELECT; @@ -1093,7 +1093,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, /* deselect */ pt->flag &= ~GP_SPOINT_SELECT; gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); return; } @@ -1136,7 +1136,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps, pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); /* free temp data */ MEM_freeN(points); diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c index 2d10645a467..8c4882854d1 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.c +++ b/source/blender/blenkernel/intern/gpencil_geom.c @@ -3444,7 +3444,7 @@ void BKE_gpencil_stroke_uniform_subdivide(bGPdata *gpd, if (select) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } /* Free the sample points. Important to use the mutable loop here because we are erasing the list diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 0597de445f4..c76c2e55d2b 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -3418,11 +3418,11 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op) if (!deselected) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (!deselected) { diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index aec593b97ea..b03d2c6e795 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -992,7 +992,7 @@ static int gpencil_duplicate_exec(bContext *C, wmOperator *op) pt->flag &= ~GP_SPOINT_SELECT; } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); changed = true; } @@ -1194,7 +1194,7 @@ static void gpencil_add_move_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gp /* if the stroke is not reused, deselect */ if (!do_stroke) { gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } @@ -1711,7 +1711,7 @@ static int gpencil_strokes_paste_exec(bContext *C, wmOperator *op) } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; @@ -2551,7 +2551,7 @@ static bool gpencil_dissolve_selected_stroke_points(bContext *C, /* deselect the stroke, since none of its selected points will still be selected */ gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -2624,7 +2624,7 @@ static int gpencil_delete_selected_points(bContext *C) if (gps->flag & GP_STROKE_SELECT) { /* deselect old stroke, since it will be used as template for the new strokes */ gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); if (is_curve_edit) { bGPDcurve *gpc = gps->editcurve; @@ -4579,7 +4579,7 @@ static int gpencil_stroke_separate_exec(bContext *C, wmOperator *op) else if (mode == GP_SEPARATE_STROKE) { /* deselect old stroke */ gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); /* unlink from source frame */ BLI_remlink(&gpf->strokes, gps); gps->prev = gps->next = NULL; @@ -4988,7 +4988,7 @@ static int gpencil_cutter_lasso_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; @@ -5029,7 +5029,7 @@ static int gpencil_cutter_lasso_select(bContext *C, changed = true; pt->flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); float r_hita[3], r_hitb[3]; if (gps->totpoints > 1) { ED_gpencil_select_stroke_segment( diff --git a/source/blender/editors/gpencil/gpencil_merge.c b/source/blender/editors/gpencil/gpencil_merge.c index 8d8734dfd1f..259b2882589 100644 --- a/source/blender/editors/gpencil/gpencil_merge.c +++ b/source/blender/editors/gpencil/gpencil_merge.c @@ -134,7 +134,7 @@ static bGPDstroke *gpencil_prepare_stroke(bContext *C, wmOperator *op, int totpo /* stroke */ bGPDstroke *gps = BKE_gpencil_stroke_new(MAX2(ob->actcol - 1, 0), totpoints, brush->size); gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); if (cyclic) { gps->flag |= GP_STROKE_CYCLIC; @@ -243,7 +243,7 @@ static void gpencil_calc_points_factor(bContext *C, } } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } } diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c index 4eec4c7d00e..12d399f32ca 100644 --- a/source/blender/editors/gpencil/gpencil_primitive.c +++ b/source/blender/editors/gpencil/gpencil_primitive.c @@ -338,7 +338,7 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi) ED_gpencil_fill_vertex_color_set(ts, brush, gps); gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); /* the polygon must be closed, so enabled cyclic */ if (ELEM(tgpi->type, GP_STROKE_BOX, GP_STROKE_CIRCLE)) { gps->flag |= GP_STROKE_CYCLIC; diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index fd5c5bb5346..e01c1ec54d7 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -174,7 +174,7 @@ static void deselect_all_selected(bContext *C) /* deselect stroke itself too */ gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } /* deselect curve and curve points */ @@ -211,12 +211,12 @@ static void select_all_curve_points(bGPdata *gpd, bGPDstroke *gps, bGPDcurve *gp if (deselect == false) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } @@ -570,7 +570,7 @@ static bool gpencil_select_same_layer(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -587,7 +587,7 @@ static bool gpencil_select_same_layer(bContext *C) } gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -632,7 +632,7 @@ static bool gpencil_select_same_material(bContext *C) } gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -651,7 +651,7 @@ static bool gpencil_select_same_material(bContext *C) } gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); changed = true; } @@ -768,7 +768,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[0].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); if ((extend == false) && (gps->totpoints > 1)) { for (int i = 1; i < gpc->tot_curve_points; i++) { @@ -783,7 +783,7 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) else { gps->points->flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -878,7 +878,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) BEZT_SEL_ALL(&gpc->curve_points[gpc->tot_curve_points - 1].bezt); gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); if ((extend == false) && (gps->totpoints > 1)) { for (int i = 0; i < gpc->tot_curve_points - 1; i++) { bGPDcurve_point *gpc_pt = &gpc->curve_points[i]; @@ -892,7 +892,7 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) else { gps->points[gps->totpoints - 1].flag |= GP_SPOINT_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); /* deselect rest? */ if ((extend == false) && (gps->totpoints > 1)) { @@ -1289,12 +1289,12 @@ static bool gpencil_stroke_do_circle_sel(bGPdata *gpd, if (select) { pt_active->flag |= GP_SPOINT_SELECT; gps_active->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps_active, false); + BKE_gpencil_stroke_select_index_set(gpd, gps_active); } else { pt_active->flag &= ~GP_SPOINT_SELECT; gps_active->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps_active, true); + BKE_gpencil_stroke_select_index_reset(gps_active); } changed = true; /* if stroke mode, don't check more points */ @@ -1832,7 +1832,7 @@ static bool gpencil_generic_stroke_select(bContext *C, } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } CTX_DATA_END; @@ -2358,11 +2358,11 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) /* stroke too... */ if (deselect == false) { hit_stroke->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); } else { hit_stroke->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, hit_stroke, true); + BKE_gpencil_stroke_select_index_reset(hit_stroke); } } } @@ -2374,13 +2374,13 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) BEZT_SEL_IDX(&hit_curve_point->bezt, hit_curve_handle); hit_curve->flag |= GP_CURVE_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); } else { /* we're adding selection, so selection must be true */ hit_point->flag |= GP_SPOINT_SELECT; hit_stroke->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, hit_stroke, false); + BKE_gpencil_stroke_select_index_set(gpd, hit_stroke); /* expand selection to segment */ int selectmode; @@ -2602,7 +2602,7 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op) if (gps_selected) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); /* Extend stroke selection. */ if (selectmode == GP_SELECTMODE_STROKE) { diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index f9242c5a1a8..5c041134a74 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -1167,7 +1167,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph, if (keep_original) { gps_active = BKE_gpencil_stroke_duplicate(gps, true, true); gps_active->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps_active, true); + BKE_gpencil_stroke_select_index_reset(gps_active); for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { pt->flag &= ~GP_SPOINT_SELECT; } @@ -1692,7 +1692,7 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob) } if (gps->flag & GP_STROKE_SELECT) { - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } } } @@ -2616,7 +2616,7 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) } gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } } @@ -2654,11 +2654,11 @@ void ED_gpencil_select_toggle_all(bContext *C, int action) /* Change status of stroke */ if (selected) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } CTX_DATA_END; @@ -2695,7 +2695,7 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) } gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } GP_EDITABLE_CURVES_END(gps_iter); } @@ -2737,12 +2737,12 @@ void ED_gpencil_select_curve_toggle_all(bContext *C, int action) if (selected) { gpc->flag |= GP_CURVE_SELECT; gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gpc->flag &= ~GP_CURVE_SELECT; gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } } GP_EDITABLE_STROKES_END(gps_iter); diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 631ab1c4671..f9caa746dac 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -941,11 +941,11 @@ static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) /* set new value */ if (value) { gps->flag |= GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(gpd, gps, false); + BKE_gpencil_stroke_select_index_set(gpd, gps); } else { gps->flag &= ~GP_STROKE_SELECT; - BKE_gpencil_stroke_select_index_set(NULL, gps, true); + BKE_gpencil_stroke_select_index_reset(gps); } /* ensure that the stroke's points are selected in the same way */ From 5dced2a0636a7f3db73be09139cf8abd952612e7 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Sat, 20 Feb 2021 11:33:43 +0100 Subject: [PATCH 337/519] Geometry Nodes: expose float2 attribute in rna This also fixes the issue reported in T85651. Differential Revision: https://developer.blender.org/D10477 --- intern/cycles/blender/blender_mesh.cpp | 10 +++++ source/blender/makesrna/RNA_access.h | 1 + .../blender/makesrna/intern/rna_attribute.c | 42 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 182aefa82ae..c7b49354d53 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -430,6 +430,16 @@ static void attr_create_generic(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool }); break; } + case BL::Attribute::data_type_FLOAT2: { + BL::Float2Attribute b_float2_attribute{b_attribute}; + Attribute *attr = attributes.add(name, TypeFloat2, element); + float2 *data = attr->data_float2(); + fill_generic_attribute(b_mesh, data, element, [&](int i) { + BL::Array v = b_float2_attribute.data[i].vector(); + return make_float2(v[0], v[1]); + }); + break; + } default: /* Not supported. */ break; diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index eaa2675573c..eecac8ca19e 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -265,6 +265,7 @@ extern StructRNA RNA_FloatAttributeValue; extern StructRNA RNA_FloatColorAttribute; extern StructRNA RNA_FloatColorAttributeValue; extern StructRNA RNA_FloatProperty; +extern StructRNA RNA_Float2Attribute; extern StructRNA RNA_FloorConstraint; extern StructRNA RNA_FluidDomainSettings; extern StructRNA RNA_FluidEffectorSettings; diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c index 28c65992236..b99b6891d3d 100644 --- a/source/blender/makesrna/intern/rna_attribute.c +++ b/source/blender/makesrna/intern/rna_attribute.c @@ -45,6 +45,7 @@ const EnumPropertyItem rna_enum_attribute_type_items[] = { {CD_MLOOPCOL, "BYTE_COLOR", 0, "Byte Color", "RGBA color with 8-bit precision"}, {CD_PROP_STRING, "STRING", 0, "String", "Text string"}, {CD_PROP_BOOL, "BOOLEAN", 0, "Boolean", "True or false"}, + {CD_PROP_FLOAT2, "FLOAT2", 0, "2D Vector", "2D vector with floating-point values"}, {0, NULL, 0, NULL, NULL}, }; @@ -96,6 +97,8 @@ static StructRNA *srna_by_custom_data_layer_type(const CustomDataType type) return &RNA_StringAttribute; case CD_PROP_BOOL: return &RNA_BoolAttribute; + case CD_PROP_FLOAT2: + return &RNA_Float2Attribute; default: return NULL; } @@ -200,6 +203,9 @@ static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRN case CD_PROP_BOOL: struct_size = sizeof(MBoolProperty); break; + case CD_PROP_FLOAT2: + struct_size = sizeof(float[2]); + break; default: struct_size = 0; length = 0; @@ -593,6 +599,41 @@ static void rna_def_attribute_bool(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "b", 0x01); } +static void rna_def_attribute_float2(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + /* Float2 Attribute */ + srna = RNA_def_struct(brna, "Float2Attribute", "Attribute"); + RNA_def_struct_sdna(srna, "CustomDataLayer"); + RNA_def_struct_ui_text( + srna, "Float2 Attribute", "2D vector geometry attribute, with floating-point precision"); + + prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "Float2AttributeValue"); + RNA_def_property_collection_funcs(prop, + "rna_Attribute_data_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + "rna_Attribute_data_length", + NULL, + NULL, + NULL); + + /* Float2 Attribute Value */ + srna = RNA_def_struct(brna, "Float2AttributeValue", NULL); + RNA_def_struct_sdna(srna, "vec2f"); + RNA_def_struct_ui_text(srna, "Float2 Attribute Value", "2D Vector value in geometry attribute"); + + prop = RNA_def_property(srna, "vector", PROP_FLOAT, PROP_DIRECTION); + RNA_def_property_ui_text(prop, "Vector", "2D vector"); + RNA_def_property_float_sdna(prop, NULL, "x"); + RNA_def_property_array(prop, 2); + RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); +} + static void rna_def_attribute(BlenderRNA *brna) { PropertyRNA *prop; @@ -632,6 +673,7 @@ static void rna_def_attribute(BlenderRNA *brna) rna_def_attribute_int(brna); rna_def_attribute_string(brna); rna_def_attribute_bool(brna); + rna_def_attribute_float2(brna); } /* Mesh/PointCloud/Hair.attributes */ From f2c0bbed1ce5270eee1332a02da02c1819bb230c Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Sat, 20 Feb 2021 18:05:13 +0200 Subject: [PATCH 338/519] Python: Add to_curve method to the object API This patch adds a to_curve method to the Object ID. This method is analogous to the to_mesh method. The method can operate on curve and text objects. For text objects, the text is converted into a 3D Curve ID and that curve is returned. For curve objects, if apply_modifiers is true, the spline deform modifiers will be applied and a Curve ID with the result will be returned, otherwise a copy of the curve will be returned. The goal of this addition is to allow the developer to access the splines of text objects and to get the result of modifier applications which was otherwise not possible. Reviewed By: Brecht Differential Revision: https://developer.blender.org/D10354 --- .../examples/bpy.types.Depsgraph.7.py | 64 +++++++++++++++ source/blender/blenkernel/BKE_curve.h | 12 +++ source/blender/blenkernel/BKE_displist.h | 7 ++ source/blender/blenkernel/BKE_object.h | 16 ++++ source/blender/blenkernel/CMakeLists.txt | 1 + .../blender/blenkernel/intern/curve_convert.c | 81 +++++++++++++++++++ source/blender/blenkernel/intern/displist.c | 24 +++--- source/blender/blenkernel/intern/object.c | 20 +++++ source/blender/makesdna/DNA_object_types.h | 9 ++- .../blender/makesrna/intern/rna_object_api.c | 46 +++++++++++ 10 files changed, 270 insertions(+), 10 deletions(-) create mode 100644 doc/python_api/examples/bpy.types.Depsgraph.7.py create mode 100644 source/blender/blenkernel/intern/curve_convert.c diff --git a/doc/python_api/examples/bpy.types.Depsgraph.7.py b/doc/python_api/examples/bpy.types.Depsgraph.7.py new file mode 100644 index 00000000000..61209a6b9d2 --- /dev/null +++ b/doc/python_api/examples/bpy.types.Depsgraph.7.py @@ -0,0 +1,64 @@ +""" +Dependency graph: Object.to_curve() ++++++++++++++++++++++++++++++++++++ + +Function to get a curve from text and curve objects. It is typically used by exporters, render +engines, and tools that need to access the curve representing the object. + +The function takes the evaluated dependency graph as a required parameter and optionally a boolean +apply_modifiers which defaults to false. If apply_modifiers is true and the object is a curve object, +the spline deform modifiers are applied on the control points. Note that constructive modifiers and +modifiers that are not spline-enabled will not be applied. So modifiers like Array will not be applied +and deform modifiers that have Apply On Spline disabled will not be applied. + +If the object is a text object. The text will be converted into a 3D curve and returned. Modifiers are +never applied on text objects and apply_modifiers will be ignored. If the object is neither a curve nor +a text object, an error will be reported. + +.. note:: The resulting curve is owned by the object. It can be freed by calling `object.to_curve_clear()`. +.. note:: + The resulting curve must be treated as temporary, and can not be referenced from objects in the main + database. +""" +import bpy + + +class OBJECT_OT_object_to_curve(bpy.types.Operator): + """Convert selected object to curve and show number of splines""" + bl_label = "DEG Object to Curve" + bl_idname = "object.object_to_curve" + + def execute(self, context): + # Access input original object. + obj = context.object + if obj is None: + self.report({'INFO'}, "No active object to convert to curve") + return {'CANCELLED'} + if obj.type not in {'CURVE', 'FONT'}: + self.report({'INFO'}, "Object can not be converted to curve") + return {'CANCELLED'} + depsgraph = context.evaluated_depsgraph_get() + # Invoke to_curve() without applying modifiers. + curve_without_modifiers = obj.to_curve(depsgraph) + self.report({'INFO'}, f"{len(curve_without_modifiers.splines)} splines in a new curve without modifiers.") + # Remove temporary curve. + obj.to_curve_clear() + # Invoke to_curve() with applying modifiers. + curve_with_modifiers = obj.to_curve(depsgraph, apply_modifiers = True) + self.report({'INFO'}, f"{len(curve_with_modifiers.splines)} splines in new curve with modifiers.") + # Remove temporary curve. + obj.to_curve_clear() + return {'FINISHED'} + + +def register(): + bpy.utils.register_class(OBJECT_OT_object_to_curve) + + +def unregister(): + bpy.utils.unregister_class(OBJECT_OT_object_to_curve) + + +if __name__ == "__main__": + register() + diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 881b93fe709..660e7c08062 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -338,6 +338,18 @@ void BKE_curve_deform_co(const struct Object *ob_curve, /** \} */ +/* curve_convert.c */ + +/* Create a new curve from the given object at its current state. This only works for curve and + * text objects, otherwise NULL is returned. + * + * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are + * applied on the control points of the splines. + */ +struct Curve *BKE_curve_new_from_object(struct Object *object, + struct Depsgraph *depsgraph, + bool apply_modifiers); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 83adbf6f1fd..05e60d38487 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -112,6 +112,13 @@ void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph, struct Object *ob, struct ListBase *dispbase); +bool BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + struct ListBase *source_nurb, + struct ListBase *target_nurb, + const bool for_render); + bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4); void BKE_displist_fill(const struct ListBase *dispbase, struct ListBase *to, diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 904db053717..12c40e891c9 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -32,6 +32,7 @@ extern "C" { struct Base; struct BoundBox; +struct Curve; struct Depsgraph; struct GpencilModifierData; struct HookGpencilModifierData; @@ -424,6 +425,21 @@ struct Mesh *BKE_object_to_mesh(struct Depsgraph *depsgraph, void BKE_object_to_mesh_clear(struct Object *object); +/* This is an utility function for Python's object.to_curve(). + * The result is owned by the object. + * + * The curve will be freed when object is re-evaluated or is destroyed. It is possible to force + * clear memory used by this curve by calling BKE_object_to_curve_clear(). + * + * If apply_modifiers is true and the object is a curve one, then spline deform modifiers are + * applied on the curve control points. + */ +struct Curve *BKE_object_to_curve(struct Object *object, + struct Depsgraph *depsgraph, + bool apply_modifiers); + +void BKE_object_to_curve_clear(struct Object *object); + void BKE_object_check_uuids_unique_and_report(const struct Object *object); void BKE_object_modifiers_lib_link_common(void *userData, diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index f288bf9aabc..325744f4006 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -107,6 +107,7 @@ set(SRC intern/cryptomatte.cc intern/curve.c intern/curve_bevel.c + intern/curve_convert.c intern/curve_decimate.c intern/curve_deform.c intern/curveprofile.c diff --git a/source/blender/blenkernel/intern/curve_convert.c b/source/blender/blenkernel/intern/curve_convert.c new file mode 100644 index 00000000000..988ddb3bbc0 --- /dev/null +++ b/source/blender/blenkernel/intern/curve_convert.c @@ -0,0 +1,81 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup bke + */ + +#include "DNA_curve_types.h" +#include "DNA_object_types.h" +#include "DNA_vfont_types.h" + +#include "BLI_utildefines.h" + +#include "BKE_curve.h" +#include "BKE_displist.h" +#include "BKE_font.h" +#include "BKE_lib_id.h" +#include "BKE_modifier.h" + +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + +static Curve *curve_from_font_object(Object *object, Depsgraph *depsgraph) +{ + Curve *curve = (Curve *)object->data; + Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE); + + Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object); + BKE_vfont_to_curve_nubase(evaluated_object, FO_EDIT, &new_curve->nurb); + + new_curve->type = OB_CURVE; + + new_curve->flag &= ~CU_3D; + BKE_curve_curve_dimension_update(new_curve); + + return new_curve; +} + +static Curve *curve_from_curve_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + Object *evaluated_object = DEG_get_evaluated_object(depsgraph, object); + Curve *curve = (Curve *)evaluated_object->data; + Curve *new_curve = (Curve *)BKE_id_copy_ex(NULL, &curve->id, NULL, LIB_ID_COPY_LOCALIZE); + + if (apply_modifiers) { + BKE_curve_calc_modifiers_pre(depsgraph, + DEG_get_input_scene(depsgraph), + evaluated_object, + BKE_curve_nurbs_get(curve), + &new_curve->nurb, + DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); + } + + return new_curve; +} + +Curve *BKE_curve_new_from_object(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + if (!ELEM(object->type, OB_FONT, OB_CURVE)) { + return NULL; + } + + if (object->type == OB_FONT) { + return curve_from_font_object(object, depsgraph); + } + + return curve_from_curve_object(object, depsgraph, apply_modifiers); +} diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 1fcc1b1bcef..c860e57520d 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -770,8 +770,12 @@ static ModifierData *curve_get_tessellate_point(Scene *scene, } /* Return true if any modifier was applied. */ -static bool curve_calc_modifiers_pre( - Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *nurb, const bool for_render) +bool BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph, + Scene *scene, + Object *ob, + ListBase *source_nurb, + ListBase *target_nurb, + const bool for_render) { VirtualModifierData virtualModifierData; ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); @@ -810,13 +814,13 @@ static bool curve_calc_modifiers_pre( keyVerts = BKE_key_evaluate_object(ob, &numElems); if (keyVerts) { - BLI_assert(BKE_keyblock_curve_element_count(nurb) == numElems); + BLI_assert(BKE_keyblock_curve_element_count(source_nurb) == numElems); /* split coords from key data, the latter also includes * tilts, which is passed through in the modifier stack. * this is also the reason curves do not use a virtual * shape key modifier yet. */ - deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(nurb, keyVerts, &numVerts); + deformedVerts = BKE_curve_nurbs_key_vert_coords_alloc(source_nurb, keyVerts, &numVerts); } } @@ -832,7 +836,7 @@ static bool curve_calc_modifiers_pre( } if (!deformedVerts) { - deformedVerts = BKE_curve_nurbs_vert_coords_alloc(nurb, &numVerts); + deformedVerts = BKE_curve_nurbs_vert_coords_alloc(source_nurb, &numVerts); } mti->deformVerts(md, &mectx, NULL, deformedVerts, numVerts); @@ -845,11 +849,11 @@ static bool curve_calc_modifiers_pre( } if (deformedVerts) { - BKE_curve_nurbs_vert_coords_apply(nurb, deformedVerts, false); + BKE_curve_nurbs_vert_coords_apply(target_nurb, deformedVerts, false); MEM_freeN(deformedVerts); } if (keyVerts) { /* these are not passed through modifier stack */ - BKE_curve_nurbs_key_vert_tilts_apply(nurb, keyVerts); + BKE_curve_nurbs_key_vert_tilts_apply(target_nurb, keyVerts); } if (keyVerts) { @@ -1151,7 +1155,8 @@ void BKE_displist_make_surf(Depsgraph *depsgraph, } if (!for_orco) { - force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render); + force_mesh_conversion = BKE_curve_calc_modifiers_pre( + depsgraph, scene, ob, &nubase, &nubase, for_render); } LISTBASE_FOREACH (Nurb *, nu, &nubase) { @@ -1501,7 +1506,8 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph, } if (!for_orco) { - force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render); + force_mesh_conversion = BKE_curve_calc_modifiers_pre( + depsgraph, scene, ob, &nubase, &nubase, for_render); } BKE_curve_bevelList_make(ob, &nubase, for_render); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 9b5a1614dc0..04071282a52 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1742,6 +1742,7 @@ void BKE_object_free_derived_caches(Object *ob) } BKE_object_to_mesh_clear(ob); + BKE_object_to_curve_clear(ob); BKE_object_free_curve_cache(ob); /* Clear grease pencil data. */ @@ -5057,6 +5058,7 @@ void BKE_object_runtime_reset_on_copy(Object *object, const int UNUSED(flag)) runtime->mesh_deform_eval = NULL; runtime->curve_cache = NULL; runtime->object_as_temp_mesh = NULL; + runtime->object_as_temp_curve = NULL; runtime->geometry_set_eval = NULL; } @@ -5615,6 +5617,24 @@ void BKE_object_to_mesh_clear(Object *object) object->runtime.object_as_temp_mesh = NULL; } +Curve *BKE_object_to_curve(Object *object, Depsgraph *depsgraph, bool apply_modifiers) +{ + BKE_object_to_curve_clear(object); + + Curve *curve = BKE_curve_new_from_object(object, depsgraph, apply_modifiers); + object->runtime.object_as_temp_curve = curve; + return curve; +} + +void BKE_object_to_curve_clear(Object *object) +{ + if (object->runtime.object_as_temp_curve == NULL) { + return; + } + BKE_id_free(NULL, object->runtime.object_as_temp_curve); + object->runtime.object_as_temp_curve = NULL; +} + void BKE_object_check_uuids_unique_and_report(const Object *object) { BKE_pose_check_uuids_unique_and_report(object->pose); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 8b13db8a012..5f414aa2bdd 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -38,6 +38,7 @@ extern "C" { struct AnimData; struct BoundBox; +struct Curve; struct FluidsimSettings; struct GeometrySet; struct Ipo; @@ -186,6 +187,12 @@ typedef struct Object_Runtime { */ struct Mesh *object_as_temp_mesh; + /** + * This is a curve representation of corresponding object. + * It created when Python calls `object.to_curve()`. + */ + struct Curve *object_as_temp_curve; + /** Runtime evaluated curve-specific data, not stored in the file. */ struct CurveCache *curve_cache; @@ -623,7 +630,7 @@ enum { */ #define BA_TRANSFORM_LOCKED_IN_PLACE (1 << 7) -#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */ +#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */ #define BA_TRANSFORM_PARENT (1 << 13) /* parent of a transformed object */ #define OB_FROMDUPLI (1 << 9) diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 9fb883568c9..df628caa000 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -404,6 +404,29 @@ static void rna_Object_to_mesh_clear(Object *object) BKE_object_to_mesh_clear(object); } +static Curve *rna_Object_to_curve(Object *object, + ReportList *reports, + Depsgraph *depsgraph, + bool apply_modifiers) +{ + if (!ELEM(object->type, OB_FONT, OB_CURVE)) { + BKE_report(reports, RPT_ERROR, "Object is not a curve or a text"); + return NULL; + } + + if (depsgraph == NULL) { + BKE_report(reports, RPT_ERROR, "Invalid depsgraph"); + return NULL; + } + + return BKE_object_to_curve(object, depsgraph, apply_modifiers); +} + +static void rna_Object_to_curve_clear(Object *object) +{ + BKE_object_to_curve_clear(object); +} + static PointerRNA rna_Object_shape_key_add( Object *ob, bContext *C, ReportList *reports, const char *name, bool from_mix) { @@ -977,6 +1000,29 @@ void RNA_api_object(StructRNA *srna) func = RNA_def_function(srna, "to_mesh_clear", "rna_Object_to_mesh_clear"); RNA_def_function_ui_description(func, "Clears mesh data-block created by to_mesh()"); + /* curve */ + func = RNA_def_function(srna, "to_curve", "rna_Object_to_curve"); + RNA_def_function_ui_description( + func, + "Create a Curve data-block from the current state of the object. This only works for curve " + "and text objects. The object owns the data-block. To force free it, use to_curve_clear(). " + "The result is temporary and can not be used by objects from the main database"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer( + func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + RNA_def_boolean(func, + "apply_modifiers", + false, + "", + "Apply the deform modifiers on the control points of the curve. This is only " + "supported for curve objects"); + parm = RNA_def_pointer(func, "curve", "Curve", "", "Curve created from object"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "to_curve_clear", "rna_Object_to_curve_clear"); + RNA_def_function_ui_description(func, "Clears curve data-block created by to_curve()"); + /* Armature */ func = RNA_def_function(srna, "find_armature", "BKE_modifiers_is_deformed_by_armature"); RNA_def_function_ui_description( From cab26abbdb07fd43cd85d1decf4859f11055e484 Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Sat, 20 Feb 2021 18:52:53 +0100 Subject: [PATCH 339/519] UI: Correct the text alignment of the RGB/HSV/Hex toggle in the color picker Expanded enum items like this usually have centered text, but there are limitations in the popup code that break this here. Add a workaround for this limitation. Differential Revision: https://developer.blender.org/D9854 Reviewed by: Julian Eisel --- .../blender/editors/interface/interface_region_color_picker.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/editors/interface/interface_region_color_picker.c b/source/blender/editors/interface/interface_region_color_picker.c index 82028d4e595..e68705e4321 100644 --- a/source/blender/editors/interface/interface_region_color_picker.c +++ b/source/blender/editors/interface/interface_region_color_picker.c @@ -565,6 +565,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; bt = uiDefButC(block, @@ -582,6 +583,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; bt = uiDefButC(block, @@ -599,6 +601,7 @@ static void ui_block_colorpicker(uiBlock *block, 0, ""); UI_but_flag_disable(bt, UI_BUT_UNDO); + UI_but_drawflag_disable(bt, UI_BUT_TEXT_LEFT); UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL); bt->custom_data = cpicker; UI_block_align_end(block); From d8b4246b9fde78d6eaab170eb34951d7c46778f3 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Sat, 20 Feb 2021 19:29:17 +0100 Subject: [PATCH 340/519] GPencil: Remove old Interpolate menu option This option was before move this action as a tool. --- release/scripts/startup/bl_ui/space_view3d.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 43866add7dd..4690abe5cec 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -4900,7 +4900,7 @@ class VIEW3D_MT_draw_gpencil(Menu): layout.separator() layout.menu("VIEW3D_MT_gpencil_animation") - layout.menu("VIEW3D_MT_edit_gpencil_interpolate") + layout.operator("gpencil.interpolate_sequence", text="Interpolate Sequence") layout.separator() @@ -4962,7 +4962,7 @@ class VIEW3D_MT_edit_gpencil(Menu): layout.separator() layout.menu("VIEW3D_MT_gpencil_animation") - layout.menu("VIEW3D_MT_edit_gpencil_interpolate") + layout.operator("gpencil.interpolate_sequence", text="Interpolate Sequence") layout.separator() @@ -5126,16 +5126,6 @@ class VIEW3D_MT_edit_gpencil_showhide(Menu): layout.operator("gpencil.hide", text="Hide Inactive Layers").unselected = True -class VIEW3D_MT_edit_gpencil_interpolate(Menu): - bl_label = "Interpolate" - - def draw(self, _context): - layout = self.layout - - layout.operator("gpencil.interpolate", text="Interpolate") - layout.operator("gpencil.interpolate_sequence", text="Sequence") - - class VIEW3D_MT_object_mode_pie(Menu): bl_label = "Mode" @@ -7648,7 +7638,6 @@ classes = ( VIEW3D_MT_edit_armature_names, VIEW3D_MT_edit_armature_delete, VIEW3D_MT_edit_gpencil_transform, - VIEW3D_MT_edit_gpencil_interpolate, VIEW3D_MT_object_mode_pie, VIEW3D_MT_view_pie, VIEW3D_MT_transform_gizmo_pie, From 6c2e1f33983766ee5ee028e14a24e36c28d0a566 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Sat, 20 Feb 2021 22:05:27 +0100 Subject: [PATCH 341/519] BLI: cleanup StringRef and Span and improve parameter validation Previously, methods like `Span.drop_front` would crash when more elements would be dropped than are available. While this is most efficient, it is not very practical in some use cases. Also other languages silently clamp the index, so one can easily write wrong code accidentally. Now, `Span.drop_front` and similar methods will only crash when n is negative. Too large values will be clamped down to their maximum possible value. While this is slightly less efficient, I did not have a case where this actually mattered yet. If it does matter in the future, we can add a separate `*_unchecked` method. This should not change the behavior of existing code. --- source/blender/blenlib/BLI_span.hh | 80 +++++++++++-------- source/blender/blenlib/BLI_string_ref.hh | 24 +++--- source/blender/blenlib/tests/BLI_span_test.cc | 42 +++++++++- .../blenlib/tests/BLI_string_ref_test.cc | 22 ++++- 4 files changed, 119 insertions(+), 49 deletions(-) diff --git a/source/blender/blenlib/BLI_span.hh b/source/blender/blenlib/BLI_span.hh index 8011b2f9abc..5f55efe3f63 100644 --- a/source/blender/blenlib/BLI_span.hh +++ b/source/blender/blenlib/BLI_span.hh @@ -142,15 +142,15 @@ template class Span { } /** - * Returns a contiguous part of the array. This invokes undefined behavior when the slice does - * not stay within the bounds of the array. + * Returns a contiguous part of the array. This invokes undefined behavior when the start or size + * is negative. */ constexpr Span slice(int64_t start, int64_t size) const { BLI_assert(start >= 0); BLI_assert(size >= 0); - BLI_assert(start + size <= this->size() || size == 0); - return Span(data_ + start, size); + const int64_t new_size = std::max(0, std::min(size, size_ - start)); + return Span(data_ + start, new_size); } constexpr Span slice(IndexRange range) const @@ -160,46 +160,46 @@ template class Span { /** * Returns a new Span with n elements removed from the beginning. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span drop_front(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(n, this->size() - n); + const int64_t new_size = std::max(0, size_ - n); + return Span(data_ + n, new_size); } /** * Returns a new Span with n elements removed from the beginning. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span drop_back(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(0, this->size() - n); + const int64_t new_size = std::max(0, size_ - n); + return Span(data_, new_size); } /** * Returns a new Span that only contains the first n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span take_front(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(0, n); + const int64_t new_size = std::min(size_, n); + return Span(data_, new_size); } /** * Returns a new Span that only contains the last n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr Span take_back(int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= this->size()); - return this->slice(this->size() - n, n); + const int64_t new_size = std::min(size_, n); + return Span(data_ + size_ - new_size, new_size); } /** @@ -480,6 +480,14 @@ template class MutableSpan { return size_; } + /** + * Returns true if the size is zero. + */ + constexpr bool is_empty() const + { + return size_ == 0; + } + /** * Replace all elements in the referenced array with the given value. */ @@ -534,53 +542,59 @@ template class MutableSpan { } /** - * Returns a contiguous part of the array. This invokes undefined behavior when the slice would - * go out of bounds. + * Returns a contiguous part of the array. This invokes undefined behavior when the start or size + * is negative. */ - constexpr MutableSpan slice(const int64_t start, const int64_t length) const + constexpr MutableSpan slice(const int64_t start, const int64_t size) const { - BLI_assert(start + length <= this->size()); - return MutableSpan(data_ + start, length); + BLI_assert(start >= 0); + BLI_assert(size >= 0); + const int64_t new_size = std::max(0, std::min(size, size_ - start)); + return MutableSpan(data_ + start, new_size); } /** * Returns a new MutableSpan with n elements removed from the beginning. This invokes - * undefined behavior when the array is too small. + * undefined behavior when n is negative. */ constexpr MutableSpan drop_front(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(n, this->size() - n); + BLI_assert(n >= 0); + const int64_t new_size = std::max(0, size_ - n); + return MutableSpan(data_ + n, new_size); } /** * Returns a new MutableSpan with n elements removed from the end. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan drop_back(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(0, this->size() - n); + BLI_assert(n >= 0); + const int64_t new_size = std::max(0, size_ - n); + return MutableSpan(data_, new_size); } /** * Returns a new MutableSpan that only contains the first n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan take_front(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(0, n); + BLI_assert(n >= 0); + const int64_t new_size = std::min(size_, n); + return MutableSpan(data_, new_size); } /** * Return a new MutableSpan that only contains the last n elements. This invokes undefined - * behavior when the array is too small. + * behavior when n is negative. */ constexpr MutableSpan take_back(const int64_t n) const { - BLI_assert(n <= this->size()); - return this->slice(this->size() - n, n); + BLI_assert(n >= 0); + const int64_t new_size = std::min(size_, n); + return MutableSpan(data_ + size_ - new_size, new_size); } /** diff --git a/source/blender/blenlib/BLI_string_ref.hh b/source/blender/blenlib/BLI_string_ref.hh index a2562c6100a..0cff8fa7fb4 100644 --- a/source/blender/blenlib/BLI_string_ref.hh +++ b/source/blender/blenlib/BLI_string_ref.hh @@ -321,37 +321,36 @@ class StringRef : public StringRefBase { } /** - * Returns a new StringRef that does not contain the first n chars. - * - * This is similar to std::string_view::remove_prefix. + * Returns a new StringRef that does not contain the first n chars. This invokes undefined + * behavior when n is negative. */ constexpr StringRef drop_prefix(const int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= size_); - return StringRef(data_ + n, size_ - n); + const int64_t clamped_n = std::min(n, size_); + const int64_t new_size = size_ - clamped_n; + return StringRef(data_ + clamped_n, new_size); } /** * Return a new StringRef with the given prefix being skipped. This invokes undefined behavior if * the string does not begin with the given prefix. */ - constexpr StringRef drop_prefix(StringRef prefix) const + constexpr StringRef drop_known_prefix(StringRef prefix) const { BLI_assert(this->startswith(prefix)); return this->drop_prefix(prefix.size()); } /** - * Return a new StringRef that does not contain the last n chars. - * - * This is similar to std::string_view::remove_suffix. + * Return a new StringRef that does not contain the last n chars. This invokes undefined behavior + * when n is negative. */ constexpr StringRef drop_suffix(const int64_t n) const { BLI_assert(n >= 0); - BLI_assert(n <= size_); - return StringRef(data_, size_ - n); + const int64_t new_size = std::max(0, size_ - n); + return StringRef(data_, new_size); } /** @@ -460,7 +459,8 @@ constexpr inline bool StringRefBase::endswith(StringRef suffix) const } /** - * Return a new #StringRef containing only a sub-string of the original string. + * Return a new #StringRef containing only a sub-string of the original string. This invokes + * undefined if the start or max_size is negative. */ constexpr inline StringRef StringRefBase::substr(const int64_t start, const int64_t max_size = INT64_MAX) const diff --git a/source/blender/blenlib/tests/BLI_span_test.cc b/source/blender/blenlib/tests/BLI_span_test.cc index d1c9f312b97..002c97b0c7d 100644 --- a/source/blender/blenlib/tests/BLI_span_test.cc +++ b/source/blender/blenlib/tests/BLI_span_test.cc @@ -62,6 +62,15 @@ TEST(span, DropFront) EXPECT_EQ(slice[2], 7); } +TEST(span, DropFrontLargeN) +{ + Vector a = {1, 2, 3, 4, 5}; + Span slice1 = Span(a).drop_front(100); + MutableSpan slice2 = MutableSpan(a).drop_front(100); + EXPECT_TRUE(slice1.is_empty()); + EXPECT_TRUE(slice2.is_empty()); +} + TEST(span, DropFrontAll) { Vector a = {4, 5, 6, 7}; @@ -78,6 +87,15 @@ TEST(span, TakeFront) EXPECT_EQ(slice[1], 5); } +TEST(span, TakeFrontLargeN) +{ + Vector a = {4, 5, 6, 7}; + Span slice1 = Span(a).take_front(100); + MutableSpan slice2 = MutableSpan(a).take_front(100); + EXPECT_EQ(slice1.size(), 4); + EXPECT_EQ(slice2.size(), 4); +} + TEST(span, TakeBack) { Vector a = {5, 6, 7, 8}; @@ -87,6 +105,15 @@ TEST(span, TakeBack) EXPECT_EQ(slice[1], 8); } +TEST(span, TakeBackLargeN) +{ + Vector a = {3, 4, 5, 6}; + Span slice1 = Span(a).take_back(100); + MutableSpan slice2 = MutableSpan(a).take_back(100); + EXPECT_EQ(slice1.size(), 4); + EXPECT_EQ(slice2.size(), 4); +} + TEST(span, Slice) { Vector a = {4, 5, 6, 7}; @@ -112,6 +139,19 @@ TEST(span, SliceRange) EXPECT_EQ(slice[1], 4); } +TEST(span, SliceLargeN) +{ + Vector a = {1, 2, 3, 4, 5}; + Span slice1 = Span(a).slice(3, 100); + MutableSpan slice2 = MutableSpan(a).slice(3, 100); + EXPECT_EQ(slice1.size(), 2); + EXPECT_EQ(slice2.size(), 2); + EXPECT_EQ(slice1[0], 4); + EXPECT_EQ(slice2[0], 4); + EXPECT_EQ(slice1[1], 5); + EXPECT_EQ(slice2[1], 5); +} + TEST(span, Contains) { Vector a = {4, 5, 6, 7}; @@ -337,7 +377,7 @@ TEST(span, MutableReverseIterator) EXPECT_EQ_ARRAY(src.data(), Span({14, 15, 16, 17}).data(), 4); } -TEST(span, constexpr_) +TEST(span, Constexpr) { static constexpr std::array src = {3, 2, 1}; constexpr Span span(src); diff --git a/source/blender/blenlib/tests/BLI_string_ref_test.cc b/source/blender/blenlib/tests/BLI_string_ref_test.cc index 401a7bc1118..fb8b894bfd5 100644 --- a/source/blender/blenlib/tests/BLI_string_ref_test.cc +++ b/source/blender/blenlib/tests/BLI_string_ref_test.cc @@ -246,10 +246,18 @@ TEST(string_ref, DropPrefixN) EXPECT_EQ(ref3, ""); } -TEST(string_ref, DropPrefix) +TEST(string_ref, DropPrefixLargeN) { StringRef ref("test"); - StringRef ref2 = ref.drop_prefix("tes"); + StringRef ref2 = ref.drop_prefix(100); + EXPECT_EQ(ref2.size(), 0); + EXPECT_EQ(ref2, ""); +} + +TEST(string_ref, DropKnownPrefix) +{ + StringRef ref("test"); + StringRef ref2 = ref.drop_known_prefix("tes"); EXPECT_EQ(ref2.size(), 1); EXPECT_EQ(ref2, "t"); } @@ -262,6 +270,14 @@ TEST(string_ref, DropSuffix) EXPECT_EQ(ref2, "tes"); } +TEST(string_ref, DropSuffixLargeN) +{ + StringRef ref("test"); + StringRef ref2 = ref.drop_suffix(100); + EXPECT_EQ(ref2.size(), 0); + EXPECT_EQ(ref2, ""); +} + TEST(string_ref, Substr) { StringRef ref("hello world"); @@ -298,7 +314,7 @@ TEST(string_ref, ToStringView) EXPECT_EQ(view, "hello"); } -TEST(string_ref, constexpr_) +TEST(string_ref, Constexpr) { constexpr StringRef sref("World"); BLI_STATIC_ASSERT(sref[2] == 'r', ""); From 64d96f68d6ef0411383bb46d1a95d47769d927e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 16 Feb 2021 17:01:15 +0100 Subject: [PATCH 342/519] EEVEE: Ambient Occlusion: Refactor - Fix noise/banding artifact on distant geometry. - Fix overshadowing on un-occluded surfaces at grazing angle producing "fresnel" like shadowing. Some of it still appears but this is caused to the low number of horizons per pixel. - Improve performance by using a fixed number of samples and fixing the sampling area size. A better sampling pattern is planned to recover the lost precision on large AO radius. - Improved normal reconstruction for the AO pass. - Improve Bent Normal reconstruction resulting in less faceted look on smoothed geometry. - Add Thickness heuristic to avoid overshadowing of thin objects. Factor is currently hardcoded. - Add bent normal support to Glossy reflections. - Change Glossy occlusion to give less light leaks from lightprobes. It can overshadow on smooth surface but this should be mitigated by using SSR. - Use Bent Normal for rough Glossy surfaces. - Occlusion is now correctly evaluated for each BSDF. However this does make everything slower. This is mitigated by the fact the search is a lot faster than before. --- .../eevee/shaders/ambient_occlusion_lib.glsl | 460 ++++++++++-------- .../eevee/shaders/bsdf_common_lib.glsl | 8 +- .../shaders/closure_eval_diffuse_lib.glsl | 10 +- .../shaders/closure_eval_glossy_lib.glsl | 6 +- .../eevee/shaders/closure_eval_lib.glsl | 17 +- .../eevee/shaders/effect_gtao_frag.glsl | 113 +++-- .../engines/eevee/shaders/lightprobe_lib.glsl | 18 +- .../draw/intern/shaders/common_math_lib.glsl | 6 + ...gpu_shader_material_ambient_occlusion.glsl | 8 +- 9 files changed, 386 insertions(+), 260 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl index 7c0ae3881d7..0017307ba34 100644 --- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl @@ -1,5 +1,6 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) #pragma BLENDER_REQUIRE(raytrace_lib.glsl) /* Based on Practical Realtime Strategies for Accurate Indirect Occlusion @@ -23,10 +24,6 @@ # endif #endif -#define MAX_PHI_STEP 32 -#define MAX_SEARCH_ITER 32 -#define MAX_LOD 6.0 - uniform sampler2D horizonBuffer; /* aoSettings flags */ @@ -34,191 +31,224 @@ uniform sampler2D horizonBuffer; #define USE_BENT_NORMAL 2 #define USE_DENOISE 4 -vec4 pack_horizons(vec4 v) +#define MAX_LOD 6.0 +#define NO_OCCLUSION_DATA OcclusionData(vec4(M_PI, -M_PI, M_PI, -M_PI), 1.0) + +struct OcclusionData { + /* 4 horizons angles, one in each direction around the view vector to form a cross pattern. */ + vec4 horizons; + /* Custom large scale occlusion. */ + float custom_occlusion; +}; + +vec4 pack_occlusion_data(OcclusionData data) { - return v * 0.5 + 0.5; -} -vec4 unpack_horizons(vec4 v) -{ - return v * 2.0 - 1.0; + return vec4(1.0 - data.horizons * vec4(1, -1, 1, -1) * M_1_PI); } -/* Returns maximum screen distance an AO ray can travel for a given view depth */ -vec2 get_max_dir(float view_depth) +OcclusionData unpack_occlusion_data(vec4 v) +{ + return OcclusionData((1.0 - v) * vec4(1, -1, 1, -1) * M_PI, 0.0); +} + +/* Returns maximum screen distance an AO ray can travel for a given view depth, in NDC space. */ +vec2 get_ao_area(float view_depth, float radius) { float homcco = ProjectionMatrix[2][3] * view_depth + ProjectionMatrix[3][3]; - float max_dist = aoDistance / homcco; + float max_dist = radius / homcco; return vec2(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) * max_dist; } +vec2 get_ao_noise(void) +{ + return texelfetch_noise_tex(gl_FragCoord.xy).xy; +} + vec2 get_ao_dir(float jitter) { - /* Only half a turn because we integrate in slices. */ - jitter *= M_PI; + /* Only a quarter of a turn because we integrate using 2 slices. + * We use this instead of using utiltex circle noise to improve cache hits + * since all tracing direction will be in the same quadrant. */ + jitter *= M_PI_2; return vec2(cos(jitter), sin(jitter)); } -void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h) +/* Return horizon angle cosine. */ +float search_horizon(vec3 vI, + vec3 vP, + float noise, + vec2 uv_start, + vec2 uv_dir, + sampler2D depth_tx, + float radius, + const float sample_count) { - int mip = int(lod) + hizMipOffset; - co1 *= mipRatio[mip].xyxy; - co2 *= mipRatio[mip].xyxy; + float sample_count_inv = 1.0 / sample_count; + /* Init at cos(M_PI). */ + float h = -1.0; - float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r; - float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r; - float depth3 = textureLod(maxzBuffer, co2.xy, floor(lod)).r; - float depth4 = textureLod(maxzBuffer, co2.zw, floor(lod)).r; + /* TODO(fclem) samples steps should be using the same approach as raytrace. (DDA line algo.) */ + for (float i = 0.0; i < sample_count; i++) { + float t = ((i + noise) * sample_count_inv); + vec2 uv = uv_start + uv_dir * t; + float lod = min(MAX_LOD, max(i - noise, 0.0) * aoQuality); - vec4 len, s_h; + int mip = int(lod) + hizMipOffset; + float depth = textureLod(depth_tx, uv * mipRatio[mip].xy, floor(lod)).r; - vec3 s1 = get_view_space_from_depth(co1.xy, depth1); /* s View coordinate */ - vec3 omega_s1 = s1 - x; - len.x = length(omega_s1); - s_h.x = omega_s1.z / len.x; + /* Bias depth a bit to avoid self shadowing issues. */ + depth += 2.0 * 2.4e-7; - vec3 s2 = get_view_space_from_depth(co1.zw, depth2); /* s View coordinate */ - vec3 omega_s2 = s2 - x; - len.y = length(omega_s2); - s_h.y = omega_s2.z / len.y; + vec3 s = get_view_space_from_depth(uv, depth); + vec3 omega_s = s - vP; + float len = length(omega_s); + /* Sample's horizon angle cosine. */ + float s_h = dot(vI, omega_s / len); + /* Blend weight to fade artifacts. */ + float dist_ratio = abs(len) / radius; + /* TODO(fclem) parameter. */ + float dist_fac = sqr(saturate(dist_ratio * 2.0 - 1.0)); - vec3 s3 = get_view_space_from_depth(co2.xy, depth3); /* s View coordinate */ - vec3 omega_s3 = s3 - x; - len.z = length(omega_s3); - s_h.z = omega_s3.z / len.z; - - vec3 s4 = get_view_space_from_depth(co2.zw, depth4); /* s View coordinate */ - vec3 omega_s4 = s4 - x; - len.w = length(omega_s4); - s_h.w = omega_s4.z / len.w; - - /* Blend weight after half the aoDistance to fade artifacts */ - vec4 blend = saturate((1.0 - len / aoDistance) * 2.0); - - h = mix(h, max(h, s_h.x), blend.x); - h = mix(h, max(h, s_h.y), blend.y); - h = mix(h, max(h, s_h.z), blend.z); - h = mix(h, max(h, s_h.w), blend.w); + /* TODO This need to take the stride distance into account. Now it works because stride is + * constant. */ + /* Thickness heuristic (Eq. 9). */ + if (s_h < h) { + /* TODO(fclem) parameter. */ + const float thickness_fac = 0.2; + s_h = mix(h, s_h, thickness_fac); + } + else { + s_h = max(h, s_h); + } + h = mix(s_h, h, dist_fac); + } + return fast_acos(h); } -vec2 search_horizon_sweep(vec2 t_phi, vec3 pos, vec2 uvs, float jitter, vec2 max_dir) +OcclusionData occlusion_search(vec3 vP, + sampler2D depth_tx, + float radius, + const float dir_sample_count) { - max_dir *= max_v2(abs(t_phi)); - - /* Convert to pixel space. */ - t_phi /= vec2(textureSize(maxzBuffer, 0)); - - /* Avoid division by 0 */ - t_phi += vec2(1e-5); - - jitter *= 0.25; - - /* Compute end points */ - vec2 corner1 = min(vec2(1.0) - uvs, max_dir); /* Top right */ - vec2 corner2 = max(vec2(0.0) - uvs, -max_dir); /* Bottom left */ - vec2 iter1 = corner1 / t_phi; - vec2 iter2 = corner2 / t_phi; - - vec2 min_iter = max(-iter1, -iter2); - vec2 max_iter = max(iter1, iter2); - - vec2 times = vec2(-min_v2(min_iter), min_v2(max_iter)); - - vec2 h = vec2(-1.0); /* init at cos(pi) */ - - /* This is freaking sexy optimized. */ - for (float i = 0.0, ofs = 4.0, time = -1.0; i < MAX_SEARCH_ITER && time > times.x; - i++, time -= ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) { - vec4 t = max(times.xxxx, vec4(time) - (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs); - vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy; - vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww; - float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality); - get_max_horizon_grouped(cos1, cos2, pos, lod, h.y); + if ((int(aoSettings) & USE_AO) == 0) { + return NO_OCCLUSION_DATA; } - for (float i = 0.0, ofs = 4.0, time = 1.0; i < MAX_SEARCH_ITER && time < times.y; - i++, time += ofs, ofs = min(exp2(MAX_LOD) * 4.0, ofs + ofs * aoQuality)) { - vec4 t = min(times.yyyy, vec4(time) + (vec4(0.25, 0.5, 0.75, 1.0) - jitter) * ofs); - vec4 cos1 = uvs.xyxy + t_phi.xyxy * t.xxyy; - vec4 cos2 = uvs.xyxy + t_phi.xyxy * t.zzww; - float lod = min(MAX_LOD, max(i - jitter * 4.0, 0.0) * aoQuality); - get_max_horizon_grouped(cos1, cos2, pos, lod, h.x); + vec2 noise = get_ao_noise(); + vec2 area = get_ao_area(vP.z, radius); + vec2 dir = get_ao_dir(noise.x); + vec2 uv = get_uvs_from_view(vP); + vec3 vI = ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0)); + vec3 avg_dir = vec3(0.0); + float avg_apperture = 0.0; + + OcclusionData data = NO_OCCLUSION_DATA; + + for (int i = 0; i < 2; i++) { + /* View > NDC > Uv space. */ + vec2 uv_dir = dir * area * 0.5; + /* Offset the start one pixel to avoid self shadowing. */ + /* TODO(fclem) Using DDA line algo should fix this. */ + vec2 px_dir = uv_dir * textureSize(depth_tx, 0); + float max_px_dir = max_v2(abs(px_dir)); + vec2 uv_ofs = (px_dir / max_px_dir) / textureSize(depth_tx, 0); + /* No need to trace more. */ + uv_dir -= uv_ofs; + + if (max_px_dir > 0.0) { + data.horizons[0 + i * 2] = search_horizon( + vI, vP, noise.y, uv + uv_ofs, uv_dir, depth_tx, radius, dir_sample_count); + data.horizons[1 + i * 2] = -search_horizon( + vI, vP, noise.y, uv - uv_ofs, -uv_dir, depth_tx, radius, dir_sample_count); + } + /* Rotate 90 degrees. */ + dir = vec2(-dir.y, dir.x); } - return h; + return data; } -void integrate_slice( - vec3 normal, vec2 t_phi, vec2 horizons, inout float visibility, inout vec3 bent_normal) +void occlusion_eval( + OcclusionData data, vec3 V, vec3 N, vec3 Ng, out float visibility, out vec3 bent_normal) { - /* Projecting Normal to Plane P defined by t_phi and omega_o */ - vec3 np = vec3(t_phi.y, -t_phi.x, 0.0); /* Normal vector to Integration plane */ - vec3 t = vec3(-t_phi, 0.0); - vec3 n_proj = normal - np * dot(np, normal); - float n_proj_len = max(1e-16, length(n_proj)); + if ((int(aoSettings) & USE_AO) == 0) { + visibility = data.custom_occlusion; + bent_normal = N; + return; + } - float cos_n = clamp(n_proj.z / n_proj_len, -1.0, 1.0); - float n = sign(dot(n_proj, t)) * fast_acos(cos_n); /* Angle between view vec and normal */ + if (min_v4(abs(data.horizons)) == M_PI) { + visibility = dot(N, Ng) * 0.5 + 0.5; + visibility = min(visibility, data.custom_occlusion); - /* (Slide 54) */ - vec2 h = fast_acos(horizons); - h.x = -h.x; + if ((int(aoSettings) & USE_BENT_NORMAL) == 0) { + bent_normal = N; + } + else { + bent_normal = normalize(N + Ng); + } + return; + } - /* Clamping thetas (slide 58) */ - h.x = n + max(h.x - n, -M_PI_2); - h.y = n + min(h.y - n, M_PI_2); - - /* Solving inner integral */ - vec2 h_2 = 2.0 * h; - vec2 vd = -cos(h_2 - n) + cos_n + h_2 * sin(n); - float vis = saturate((vd.x + vd.y) * 0.25 * n_proj_len); - - visibility += vis; - - /* O. Klehm, T. Ritschel, E. Eisemann, H.-P. Seidel - * Bent Normals and Cones in Screen-space - * Sec. 3.1 : Bent normals */ - float b_angle = (h.x + h.y) * 0.5; - bent_normal += vec3(sin(b_angle) * -t_phi, cos(b_angle)) * vis; -} - -void gtao_deferred( - vec3 normal, vec4 noise, float frag_depth, out float visibility, out vec3 bent_normal) -{ - /* Fetch early, hide latency! */ - vec4 horizons = texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0); - - vec4 dirs; - dirs.xy = get_ao_dir(noise.x * 0.5); - dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5); - - bent_normal = vec3(0.0); - visibility = 0.0; - - horizons = unpack_horizons(horizons); - - integrate_slice(normal, dirs.xy, horizons.xy, visibility, bent_normal); - integrate_slice(normal, dirs.zw, horizons.zw, visibility, bent_normal); - - bent_normal = safe_normalize(bent_normal); - - visibility *= 0.5; /* We integrated 2 slices. */ -} - -void gtao(vec3 normal, vec3 position, vec4 noise, out float visibility, out vec3 bent_normal) -{ - vec2 uvs = get_uvs_from_view(position); - vec2 max_dir = get_max_dir(position.z); + vec2 noise = get_ao_noise(); vec2 dir = get_ao_dir(noise.x); - bent_normal = normal * 1e-8; - visibility = 1e-8; + visibility = 0.0; + bent_normal = N * 0.001; - /* Only trace in 2 directions. May lead to a darker result but since it's mostly for - * alpha blended objects that will have overdraw, we limit the performance impact. */ - vec2 horizons = search_horizon_sweep(dir, position, uvs, noise.y, max_dir); - integrate_slice(normal, dir, horizons, visibility, bent_normal); + for (int i = 0; i < 2; i++) { + vec3 T = transform_direction(ViewMatrixInverse, vec3(dir, 0.0)); + /* Setup integration domain around V. */ + vec3 B = normalize(cross(V, T)); + T = normalize(cross(B, V)); - bent_normal = normalize(bent_normal / visibility); + float proj_N_len; + vec3 proj_N = normalize_len(N - B * dot(N, B), proj_N_len); + vec3 proj_Ng = normalize(Ng - B * dot(Ng, B)); + + vec2 h = (i == 0) ? data.horizons.xy : data.horizons.zw; + + float N_sin = dot(proj_N, T); + float Ng_sin = dot(proj_Ng, T); + float N_cos = saturate(dot(proj_N, V)); + float Ng_cos = saturate(dot(proj_Ng, V)); + /* Gamma, angle between normalized projected normal and view vector. */ + float angle_Ng = sign(Ng_sin) * fast_acos(Ng_cos); + float angle_N = sign(N_sin) * fast_acos(N_cos); + /* Add a little bias to fight self shadowing. */ + const float max_angle = M_PI_2 - 0.05; + /* Clamp horizons to hemisphere around shading normal. */ + h = clamp(h, angle_N - max_angle, angle_N + max_angle); + + float bent_angle = (h.x + h.y) * 0.5; + /* NOTE: here we multiply z by 0.5 as it shows less difference with the geometric normal. + * Also modulate by projected normal length to reduce issues with slanted surfaces. + * All of this is ad-hoc and not really grounded. */ + bent_normal += proj_N_len * (T * sin(bent_angle) + V * 0.5 * cos(bent_angle)); + + /* Clamp to geometric normal only for integral to keep smooth bent normal. */ + /* This is done to match Cycles ground truth but adds some computation. */ + h = clamp(h, angle_Ng - max_angle, angle_Ng + max_angle); + + /* Inner integral (Eq. 7). */ + float a = dot(-cos(2.0 * h - angle_N) + cos(angle_N) + 2.0 * h * sin(angle_N), vec2(0.25)); + /* Correct normal not on plane (Eq. 8). */ + visibility += proj_N_len * a; + + /* Rotate 90 degrees. */ + dir = vec2(-dir.y, dir.x); + } + /* We integrated 2 directions. */ + visibility *= 0.5; + + visibility = min(visibility, data.custom_occlusion); + + if ((int(aoSettings) & USE_BENT_NORMAL) == 0) { + bent_normal = N; + } + else { + bent_normal = normalize(mix(bent_normal, N, sqr(sqr(sqr(visibility))))); + } } /* Multibounce approximation base on surface albedo. @@ -240,53 +270,103 @@ float gtao_multibounce(float visibility, vec3 albedo) return max(x, ((x * a + b) * x + c) * x); } -float diffuse_occlusion(vec3 N, vec3 vis_cone_dir, float vis_cone_aperture_cos, vec3 albedo) +float diffuse_occlusion(OcclusionData data, vec3 V, vec3 N, vec3 Ng) { - if ((int(aoSettings) & USE_AO) == 0) { - return 1.0; + vec3 unused; + float visibility; + occlusion_eval(data, V, N, Ng, visibility, unused); + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; +} + +float diffuse_occlusion( + OcclusionData data, vec3 V, vec3 N, vec3 Ng, vec3 albedo, out vec3 bent_normal) +{ + float visibility; + occlusion_eval(data, V, N, Ng, visibility, bent_normal); + + visibility = gtao_multibounce(visibility, albedo); + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; +} + +/** + * Approximate the area of intersection of two spherical caps + * radius1 : First cap’s radius (arc length in radians) + * radius2 : Second caps’ radius (in radians) + * dist : Distance between caps (radians between centers of caps) + * Note: Result is divided by pi to save one multiply. + **/ +float spherical_cap_intersection(float radius1, float radius2, float dist) +{ + /* From "Ambient Aperture Lighting" by Chris Oat + * Slide 15. */ + float max_radius = max(radius1, radius2); + float min_radius = min(radius1, radius2); + float sum_radius = radius1 + radius2; + float area; + if (dist <= max_radius - min_radius) { + /* One cap in completely inside the other */ + area = 1.0 - cos(min_radius); } - /* If the shading normal is orthogonal to the geometric normal, it should be half lit. */ - float horizon_fac = saturate(dot(N, vis_cone_dir) * 0.5 + 0.5); - float ao = vis_cone_aperture_cos * horizon_fac; - return gtao_multibounce(ao, albedo); + else if (dist >= sum_radius) { + /* No intersection exists */ + area = 0; + } + else { + float diff = max_radius - min_radius; + area = smoothstep(0.0, 1.0, 1.0 - saturate((dist - diff) / (sum_radius - diff))); + area *= 1.0 - cos(min_radius); + } + return area; } -float specular_occlusion(float NV, float AO, float roughness) +float specular_occlusion( + OcclusionData data, vec3 V, vec3 N, float roughness, inout vec3 specular_dir) { - return saturate(pow(NV + AO, roughness) - 1.0 + AO); + vec3 visibility_dir; + float visibility; + occlusion_eval(data, V, N, N, visibility, visibility_dir); + + specular_dir = normalize(mix(specular_dir, visibility_dir, roughness * (1.0 - visibility))); + + /* Visibility to cone angle (eq. 18). */ + float vis_angle = fast_acos(sqrt(1 - visibility)); + /* Roughness to cone angle (eq. 26). */ + float spec_angle = max(0.001, fast_acos(cone_cosine(roughness))); + /* Angle between cone axes. */ + float cone_cone_dist = fast_acos(saturate(dot(visibility_dir, specular_dir))); + float cone_nor_dist = fast_acos(saturate(dot(N, specular_dir))); + + float isect_solid_angle = spherical_cap_intersection(vis_angle, spec_angle, cone_cone_dist); + float specular_solid_angle = spherical_cap_intersection(M_PI_2, spec_angle, cone_nor_dist); + float specular_occlusion = isect_solid_angle / specular_solid_angle; + /* Mix because it is unstable in unoccluded areas. */ + visibility = mix(isect_solid_angle / specular_solid_angle, 1.0, pow(visibility, 8.0)); + + /* Scale by user factor */ + visibility = pow(saturate(visibility), aoFactor); + return visibility; } -/* Use the right occlusion */ -float occlusion_compute(vec3 N, vec3 vpos, vec4 rand, out vec3 bent_normal) +/* Use the right occlusion. */ +OcclusionData occlusion_load(vec3 vP, float custom_occlusion) { -#ifndef USE_REFRACTION + /* Default to fully openned cone. */ + OcclusionData data = NO_OCCLUSION_DATA; + +#ifdef ENABLE_DEFERED_AO if ((int(aoSettings) & USE_AO) != 0) { - float visibility; - vec3 vnor = mat3(ViewMatrix) * N; - -# ifdef ENABLE_DEFERED_AO - gtao_deferred(vnor, rand, gl_FragCoord.z, visibility, bent_normal); -# else - gtao(vnor, vpos, rand, visibility, bent_normal); -# endif - - /* Prevent some problems down the road. */ - visibility = max(1e-3, visibility); - - if ((int(aoSettings) & USE_BENT_NORMAL) != 0) { - bent_normal = transform_direction(ViewMatrixInverse, bent_normal); - } - else { - bent_normal = N; - } - - /* Scale by user factor */ - visibility = pow(visibility, aoFactor); - - return visibility; + data = unpack_occlusion_data(texelFetch(horizonBuffer, ivec2(gl_FragCoord.xy), 0)); } +#else + /* For blended surfaces and */ + data = occlusion_search(vP, maxzBuffer, aoDistance, 8.0); #endif - bent_normal = N; - return 1.0; + data.custom_occlusion = custom_occlusion; + + return data; } diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index cb4d8931af0..241b9240606 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -1,13 +1,9 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) -vec3 diffuse_dominant_dir(vec3 N, vec3 vis_cone_dir, float vis_cone_aperture_cos) +vec3 diffuse_dominant_dir(vec3 bent_normal) { - /* TODO(fclem) revisit this. bent too much towards vis_cone_dir. */ - vis_cone_aperture_cos *= sqr(vis_cone_aperture_cos); - - N = mix(vis_cone_dir, N, vis_cone_aperture_cos); - return normalize(N); + return bent_normal; } vec3 specular_dominant_dir(vec3 N, vec3 V, float roughness) diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl index 1e65d3ccb87..c5996f5160a 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_diffuse_lib.glsl @@ -27,10 +27,12 @@ ClosureEvalDiffuse closure_Diffuse_eval_init(inout ClosureInputDiffuse cl_in, cl_out.radiance = vec3(0.0); ClosureEvalDiffuse cl_eval; - cl_eval.ambient_occlusion = diffuse_occlusion( - cl_in.N, cl_common.bent_normal, cl_common.occlusion, cl_in.albedo); - cl_eval.probe_sampling_dir = diffuse_dominant_dir( - cl_in.N, cl_common.bent_normal, cl_common.occlusion); + cl_eval.ambient_occlusion = diffuse_occlusion(cl_common.occlusion_data, + cl_common.V, + cl_in.N, + cl_common.Ng, + cl_in.albedo, + cl_eval.probe_sampling_dir); return cl_eval; } diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl index 2e506d6ba78..ae7f371e8d2 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -45,7 +45,11 @@ ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in, ClosureEvalGlossy cl_eval; cl_eval.ltc_mat = texture(utilTex, vec3(lut_uv, LTC_MAT_LAYER)); cl_eval.probe_sampling_dir = specular_dominant_dir(cl_in.N, cl_common.V, sqr(cl_in.roughness)); - cl_eval.spec_occlusion = specular_occlusion(NV, cl_common.occlusion, cl_in.roughness); + cl_eval.spec_occlusion = specular_occlusion(cl_common.occlusion_data, + cl_common.V, + cl_common.N, + cl_in.roughness, + cl_eval.probe_sampling_dir); cl_eval.raytrace_radiance = vec3(0.0); #ifdef STEP_RESOLVE /* SSR */ diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl index b1bb5f96f5c..7b38d5442dc 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -167,6 +167,8 @@ struct ClosureInputCommon { #define CLOSURE_INPUT_COMMON_DEFAULT ClosureInputCommon(1.0) struct ClosureEvalCommon { + /** Result of SSAO. */ + OcclusionData occlusion_data; /** View vector. */ vec3 V; /** Surface position. */ @@ -177,15 +179,12 @@ struct ClosureEvalCommon { vec3 vN; /** Surface position. (viewspace) */ vec3 vP; + /** Geometric normal, always facing camera. */ + vec3 Ng; /** Geometric normal, always facing camera. (viewspace) */ vec3 vNg; /** Random numbers. 3 random sequences. zw is a random point on a circle. */ vec4 rand; - /** Final occlusion factor. Mix of the user occlusion and SSAO. */ - float occlusion; - /** Least occluded direction in the hemisphere. */ - vec3 bent_normal; - /** Specular probe accumulator. Shared between planar and cubemap probe. */ float specular_accum; /** Diffuse probe accumulator. */ @@ -208,7 +207,8 @@ ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) cl_eval.N = safe_normalize(gl_FrontFacing ? worldNormal : -worldNormal); cl_eval.vN = safe_normalize(gl_FrontFacing ? viewNormal : -viewNormal); cl_eval.vP = viewPosition; - cl_eval.vNg = safe_normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + cl_eval.Ng = safe_normalize(cross(dFdx(cl_eval.P), dFdy(cl_eval.P))); + cl_eval.vNg = transform_direction(ViewMatrix, cl_eval.Ng); /* TODO(fclem) See if we can avoid this complicated setup. */ cl_eval.tracing_depth = gl_FragCoord.z; /* Constant bias (due to depth buffer precision) */ @@ -218,10 +218,7 @@ ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) /* Convert to view Z. */ cl_eval.tracing_depth = get_view_z_from_depth(cl_eval.tracing_depth); - /* TODO(fclem) Do occlusion evaluation per Closure using shading normal. */ - cl_eval.occlusion = min( - cl_in.occlusion, - occlusion_compute(cl_eval.N, cl_eval.vP, cl_eval.rand, cl_eval.bent_normal)); + cl_eval.occlusion_data = occlusion_load(cl_eval.vP, cl_in.occlusion); cl_eval.specular_accum = 1.0; cl_eval.diffuse_accum = 1.0; diff --git a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl index 47fe21928b3..1cabceebcc8 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl @@ -26,60 +26,101 @@ uniform sampler2D depthBuffer; #endif -uniform float rotationOffset; +/* Similar to https://atyuwen.github.io/posts/normal-reconstruction/. + * This samples the depth buffer 4 time for each direction to get the most correct + * implicit normal reconstruction out of the depth buffer. */ +vec3 view_position_derivative_from_depth(vec2 uvs, vec2 ofs, vec3 vP, float depth_center) +{ + vec2 uv1 = uvs - ofs * 2.0; + vec2 uv2 = uvs - ofs; + vec2 uv3 = uvs + ofs; + vec2 uv4 = uvs + ofs * 2.0; + vec4 H; + H.x = gtao_textureLod(gtao_depthBuffer, uv1, 0.0).r; + H.y = gtao_textureLod(gtao_depthBuffer, uv2, 0.0).r; + H.z = gtao_textureLod(gtao_depthBuffer, uv3, 0.0).r; + H.w = gtao_textureLod(gtao_depthBuffer, uv4, 0.0).r; + /* Fix issue with depth precision. Take even larger diff. */ + vec4 diff = abs(vec4(depth_center, H.yzw) - H.x); + if (max_v4(diff) < 2.4e-7 && all(lessThan(diff.xyz, diff.www))) { + return 0.25 * (get_view_space_from_depth(uv3, H.w) - get_view_space_from_depth(uv1, H.x)); + } + /* Simplified (H.xw + 2.0 * (H.yz - H.xw)) - depth_center */ + vec2 deltas = abs((2.0 * H.yz - H.xw) - depth_center); + if (deltas.x < deltas.y) { + return vP - get_view_space_from_depth(uv2, H.y); + } + else { + return get_view_space_from_depth(uv3, H.z) - vP; + } +} + +/* TODO(fclem) port to a common place for other effects to use. */ +bool reconstruct_view_position_and_normal_from_depth(vec2 texel, out vec3 vP, out vec3 vNg) +{ + vec2 texel_size = 1.0 / vec2(textureSize(gtao_depthBuffer, 0).xy); + vec2 uvs = gl_FragCoord.xy * texel_size; + float depth_center = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r; + + /* Background case. */ + if (depth_center == 1.0) { + return false; + } + + vP = get_view_space_from_depth(uvs, depth_center); + + vec3 dPdx = view_position_derivative_from_depth(uvs, texel_size * vec2(1, 0), vP, depth_center); + vec3 dPdy = view_position_derivative_from_depth(uvs, texel_size * vec2(0, 1), vP, depth_center); + + vNg = safe_normalize(cross(dPdx, dPdy)); + + return true; +} #ifdef DEBUG_AO +in vec4 uvcoordsvar; + void main() { - vec2 texel_size = 1.0 / vec2(textureSize(depthBuffer, 0)).xy; - vec2 uvs = saturate(gl_FragCoord.xy * texel_size); + vec3 vP, vNg; - float depth = textureLod(depthBuffer, uvs, 0.0).r; + if (!reconstruct_view_position_and_normal_from_depth(gl_FragCoord.xy, vP, vNg)) { + /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */ + FragColor = vec4(0.0); + } + else { + vec3 P = transform_point(ViewMatrixInverse, vP); + vec3 worldPosition = P; /* For cameraVec macro. TODO(fclem) make cameraVec(P). */ + vec3 viewPosition = vP; /* For viewCameraVec macro. TODO(fclem) make viewCameraVec(vP). */ + vec3 V = cameraVec; + vec3 vV = viewCameraVec; + vec3 vN = normal_decode(texture(normalBuffer, uvcoordsvar.xy).rg, vV); + vec3 N = transform_direction(ViewMatrixInverse, vN); + vec3 Ng = transform_direction(ViewMatrixInverse, vNg); - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 V = viewCameraVec; - vec3 normal = normal_decode(texture(normalBuffer, uvs).rg, V); + OcclusionData data = occlusion_load(vP, 1.0); - vec3 bent_normal; - float visibility; + float visibility = diffuse_occlusion(data, V, N, Ng); - vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy); - - gtao_deferred(normal, noise, depth, visibility, bent_normal); - - /* Handle Background case. Prevent artifact due to uncleared Horizon Render Target. */ - FragColor = vec4((depth == 1.0) ? 0.0 : visibility); + FragColor = vec4(visibility); + } } #else void main() { - vec2 uvs = saturate(gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy)); + vec2 uvs = gl_FragCoord.xy / vec2(textureSize(gtao_depthBuffer, 0).xy); float depth = gtao_textureLod(gtao_depthBuffer, uvs, 0.0).r; + vec3 vP = get_view_space_from_depth(uvs, depth); - if (depth == 1.0) { - /* Do not trace for background */ - FragColor = vec4(0.0); - return; + OcclusionData data = NO_OCCLUSION_DATA; + /* Do not trace for background */ + if (depth != 1.0) { + data = occlusion_search(vP, maxzBuffer, aoDistance, 8.0); } - /* Avoid self shadowing. */ - depth = saturate(depth - 3e-6); /* Tweaked for 24bit depth buffer. */ - - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec4 noise = texelfetch_noise_tex(gl_FragCoord.xy); - vec2 max_dir = get_max_dir(viewPosition.z); - vec4 dirs; - dirs.xy = get_ao_dir(noise.x * 0.5); - dirs.zw = get_ao_dir(noise.x * 0.5 + 0.5); - - /* Search in 4 directions. */ - FragColor.xy = search_horizon_sweep(dirs.xy, viewPosition, uvs, noise.y, max_dir); - FragColor.zw = search_horizon_sweep(dirs.zw, viewPosition, uvs, noise.y, max_dir); - - /* Resize output for integer texture. */ - FragColor = pack_horizons(FragColor); + FragColor = pack_occlusion_data(data); } #endif diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index 5e78fae5b82..d2381537772 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -215,8 +215,8 @@ vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 W, vec3 N, vec3 V, float void fallback_cubemap(vec3 N, vec3 V, - vec3 W, - vec3 viewPosition, + vec3 P, + vec3 vP, float roughness, float roughnessSquared, inout vec4 spec_accum) @@ -224,21 +224,15 @@ void fallback_cubemap(vec3 N, /* Specular probes */ vec3 spec_dir = specular_dominant_dir(N, V, roughnessSquared); -#ifdef SSR_AO - vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - vec3 bent_normal; - float final_ao = occlusion_compute(N, viewPosition, rand, bent_normal); - final_ao = specular_occlusion(dot(N, V), final_ao, roughness); -#else - const float final_ao = 1.0; -#endif + OcclusionData occlusion_data = occlusion_load(vP, 1.0); + float final_ao = specular_occlusion(occlusion_data, V, N, roughness, spec_dir); /* Starts at 1 because 0 is world probe */ for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; i++) { - float fade = probe_attenuation_cube(i, W); + float fade = probe_attenuation_cube(i, P); if (fade > 0.0) { - vec3 spec = final_ao * probe_evaluate_cube(i, W, spec_dir, roughness); + vec3 spec = final_ao * probe_evaluate_cube(i, P, spec_dir, roughness); accumulate_light(spec, fade, spec_accum); } } diff --git a/source/blender/draw/intern/shaders/common_math_lib.glsl b/source/blender/draw/intern/shaders/common_math_lib.glsl index 0213ba2622b..d02fd27f35f 100644 --- a/source/blender/draw/intern/shaders/common_math_lib.glsl +++ b/source/blender/draw/intern/shaders/common_math_lib.glsl @@ -122,6 +122,12 @@ vec3 safe_normalize(vec3 v) return v / len; } +vec3 normalize_len(vec3 v, out float len) +{ + len = length(v); + return v / len; +} + /** \} */ /* ---------------------------------------------------------------------- */ diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl index d718cc3f4fe..f3eea9869e5 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl @@ -4,7 +4,13 @@ void node_ambient_occlusion( { vec3 bent_normal; vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - result_ao = occlusion_compute(normalize(normal), viewPosition, rand, bent_normal); + OcclusionData data = occlusion_load(viewPosition, 1.0); + + vec3 V = cameraVec; + vec3 N = normalize(normal); + vec3 Ng = safe_normalize(cross(dFdx(worldPosition), dFdy(worldPosition))); + + result_ao = diffuse_occlusion(data, V, N, Ng); result_color = result_ao * color; } #else From 274d7b87fdf25bff97569ae346ec1d5020558637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 20 Feb 2021 15:31:33 +0100 Subject: [PATCH 343/519] Cleanup: EEVEE: Remove SSR variant with AO AO is always on in this case. --- source/blender/draw/engines/eevee/eevee_private.h | 3 +-- source/blender/draw/engines/eevee/eevee_screen_raytrace.c | 5 +---- source/blender/draw/engines/eevee/eevee_shaders.c | 3 --- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 17d0ead86c5..5a93853900e 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -205,8 +205,7 @@ enum { typedef enum EEVEE_SSRShaderOptions { SSR_RESOLVE = (1 << 0), SSR_FULL_TRACE = (1 << 1), - SSR_AO = (1 << 3), - SSR_MAX_SHADER = (1 << 4), + SSR_MAX_SHADER = (1 << 2), } EEVEE_SSRShaderOptions; /* DOF Gather pass shader variations */ diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index db5c86dc5e1..19b7a1ea2f6 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -143,7 +143,6 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v if ((effects->enabled_effects & EFFECT_SSR) != 0) { EEVEE_SSRShaderOptions options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0; - options |= ((effects->enabled_effects & EFFECT_GTAO) != 0) ? SSR_AO : 0; struct GPUShader *trace_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(options); struct GPUShader *resolve_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(SSR_RESOLVE | @@ -203,9 +202,7 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); DRW_shgroup_uniform_int(grp, "neighborOffset", &effects->ssr_neighbor_ofs, 1); - if ((effects->enabled_effects & EFFECT_GTAO) != 0) { - DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); - } + DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); DRW_shgroup_call(grp, quad, NULL); } diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 0bdec20b215..a3e9236dc79 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -753,9 +753,6 @@ struct GPUShader *EEVEE_shaders_effect_screen_raytrace_sh_get(EEVEE_SSRShaderOpt if (options & SSR_FULL_TRACE) { BLI_dynstr_append(ds_defines, "#define FULLRES\n"); } - if (options & SSR_AO) { - BLI_dynstr_append(ds_defines, "#define SSR_AO\n"); - } char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines); BLI_dynstr_free(ds_defines); From 1a9fe57a9f6e53e5f34c95441be27296dadefa75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 20 Feb 2021 16:54:06 +0100 Subject: [PATCH 344/519] EEVEE: Planar Reflections: Fix regression Fix regression with roughness not masking reflections when not using Screen Space raytracing. The trick was to only evaluate one planar per pixel, the one with the most influence. This should not be too limiting since this is what we do for SSR. Also change evaluation order do not apply occlusion on planars probes. --- .../shaders/closure_eval_glossy_lib.glsl | 10 +++---- .../eevee/shaders/closure_eval_lib.glsl | 30 +++++++++++-------- .../eevee/shaders/effect_ssr_frag.glsl | 6 ++-- .../engines/eevee/shaders/lightprobe_lib.glsl | 21 ++++++------- 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl index ae7f371e8d2..5c10a7f451f 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -84,13 +84,13 @@ void closure_Glossy_planar_eval(ClosureInputGlossy cl_in, inout ClosureOutputGlossy cl_out) { #ifndef STEP_RESOLVE /* SSR already evaluates planar reflections. */ + float attenuation = planar.attenuation * probe_attenuation_planar_normal_roughness( + planar.data, cl_in.N, cl_in.roughness); + vec3 probe_radiance = probe_evaluate_planar( planar.id, planar.data, cl_common.P, cl_in.N, cl_common.V, cl_in.roughness); - cl_out.radiance += planar.attenuation * probe_radiance; -#else - /* HACK: Fix an issue with planar reflections still being counted inside the specular - * accumulator. This only works because we only use one Glossy closure in the resolve pass. */ - cl_common.specular_accum += planar.attenuation; + + cl_out.radiance = mix(cl_out.radiance, probe_radiance, attenuation); #endif } diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl index 7b38d5442dc..b372a8c2467 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -64,13 +64,6 @@ out ClosureOutput##t3 out_##t3##_3) \ { \ CLOSURE_EVAL_DECLARE(t0, t1, t2, t3); \ -\ - for (int i = 0; cl_common.specular_accum > 0.0 && i < prbNumPlanar && i < MAX_PLANAR; i++) { \ - ClosurePlanarData planar = closure_planar_eval_init(i, cl_common); \ - if (planar.attenuation > 1e-8) { \ - CLOSURE_META_SUBROUTINE_DATA(planar_eval, planar, t0, t1, t2, t3); \ - } \ - } \ \ /* Starts at 1 because 0 is world cubemap. */ \ for (int i = 1; cl_common.specular_accum > 0.0 && i < prbNumRenderCube && i < MAX_PROBE; \ @@ -90,6 +83,11 @@ } \ \ CLOSURE_META_SUBROUTINE(indirect_end, t0, t1, t2, t3); \ +\ + ClosurePlanarData planar = closure_planar_eval_init(cl_common); \ + if (planar.attenuation > 1e-8) { \ + CLOSURE_META_SUBROUTINE_DATA(planar_eval, planar, t0, t1, t2, t3); \ + } \ \ for (int i = 0; i < laNumLight && i < MAX_LIGHT; i++) { \ ClosureLightData light = closure_light_eval_init(cl_common, i); \ @@ -281,14 +279,20 @@ struct ClosurePlanarData { float attenuation; /** Attenuation. */ }; -ClosurePlanarData closure_planar_eval_init(int planar_id, inout ClosureEvalCommon cl_common) +ClosurePlanarData closure_planar_eval_init(inout ClosureEvalCommon cl_common) { ClosurePlanarData planar; - planar.id = planar_id; - planar.data = planars_data[planar_id]; - planar.attenuation = probe_attenuation_planar(planar.data, cl_common.P, cl_common.N, 0.0); - planar.attenuation = min(planar.attenuation, cl_common.specular_accum); - cl_common.specular_accum -= planar.attenuation; + planar.attenuation = 0.0; + + /* Find planar with the maximum weight. TODO(fclem) */ + for (int i = 0; i < prbNumPlanar && i < MAX_PLANAR; i++) { + float attenuation = probe_attenuation_planar(planars_data[i], cl_common.P); + if (attenuation > planar.attenuation) { + planar.id = i; + planar.attenuation = attenuation; + planar.data = planars_data[i]; + } + } return planar; } diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index b49cd987a6e..b7caaf127bf 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -182,7 +182,8 @@ void main() for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { PlanarData pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, W, wN, 0.0); + float fade = probe_attenuation_planar(pd, W); + fade *= probe_attenuation_planar_normal_roughness(pd, wN, 0.0); if (fade > 0.5) { /* Find view vector / reflection plane intersection. */ @@ -525,7 +526,8 @@ void raytrace_resolve(ClosureInputGlossy cl_in, for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, P, N, 0.0); + float fade = probe_attenuation_planar(pd, P); + fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0); if (fade > 0.5) { planar_index = float(i); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index d2381537772..6507534ce67 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -116,27 +116,28 @@ float probe_attenuation_cube(int pd_id, vec3 W) return fac; } -float probe_attenuation_planar(PlanarData pd, vec3 W, vec3 N, float roughness) +float probe_attenuation_planar(PlanarData pd, vec3 W) { - /* Normal Facing */ - float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias); - /* Distance from plane */ - fac *= saturate(abs(dot(pd.pl_plane_eq, vec4(W, 1.0))) * pd.pl_fade_scale + pd.pl_fade_bias); - + float fac = saturate(abs(dot(pd.pl_plane_eq, vec4(W, 1.0))) * pd.pl_fade_scale + + pd.pl_fade_bias); /* Fancy fast clipping calculation */ vec2 dist_to_clip; dist_to_clip.x = dot(pd.pl_clip_pos_x, W); dist_to_clip.y = dot(pd.pl_clip_pos_y, W); /* compare and add all tests */ fac *= step(2.0, dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy)); - - /* Decrease influence for high roughness */ - fac *= saturate(1.0 - roughness * 10.0); - return fac; } +float probe_attenuation_planar_normal_roughness(PlanarData pd, vec3 N, float roughness) +{ + /* Normal Facing */ + float fac = saturate(dot(pd.pl_normal, N) * pd.pl_facing_scale + pd.pl_facing_bias); + /* Decrease influence for high roughness */ + return fac * saturate(1.0 - roughness * 10.0); +} + float probe_attenuation_grid(GridData gd, vec3 W, out vec3 localpos) { localpos = transform_point(gd.localmat, W); From 6fa984a1afaadcfd5d7a630da4c44bdee4676bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 20 Feb 2021 17:01:28 +0100 Subject: [PATCH 345/519] GPU: Add RGB10_A2 format support Nice format to output high definition normals or normalized colors. --- source/blender/draw/intern/draw_manager_texture.c | 1 + source/blender/gpu/GPU_texture.h | 9 +++++---- source/blender/gpu/intern/gpu_texture_private.hh | 7 +++++++ source/blender/gpu/opengl/gl_texture.hh | 5 +++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/intern/draw_manager_texture.c b/source/blender/draw/intern/draw_manager_texture.c index e9432f370b8..73afdd6e1e3 100644 --- a/source/blender/draw/intern/draw_manager_texture.c +++ b/source/blender/draw/intern/draw_manager_texture.c @@ -43,6 +43,7 @@ static bool drw_texture_format_supports_framebuffer(eGPUTextureFormat format) case GPU_RG16F: case GPU_RG16I: case GPU_RG32F: + case GPU_RGB10_A2: case GPU_R11F_G11F_B10F: case GPU_RGBA8: case GPU_RGBA16: diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index 2b4d8c8f577..d9a01663de0 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -114,15 +114,15 @@ typedef enum eGPUTextureFormat { GPU_R16F, GPU_R16, /* Max texture buffer format. */ -/* Special formats texture & renderbuffer */ -#if 0 + /* Special formats texture & renderbuffer */ GPU_RGB10_A2, - GPU_RGB10_A2UI, -#endif GPU_R11F_G11F_B10F, GPU_DEPTH32F_STENCIL8, GPU_DEPTH24_STENCIL8, GPU_SRGB8_A8, +#if 0 + GPU_RGB10_A2UI, +#endif /* Texture only format */ GPU_RGB16F, @@ -175,6 +175,7 @@ typedef enum eGPUDataFormat { GPU_DATA_UBYTE, GPU_DATA_UINT_24_8, GPU_DATA_10_11_11_REV, + GPU_DATA_2_10_10_10_REV, } eGPUDataFormat; unsigned int GPU_texture_memory_usage_get(void); diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index e03d5f6e6ce..3d808bce152 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -283,6 +283,7 @@ inline size_t to_bytesize(eGPUTextureFormat format) case GPU_RGBA8UI: case GPU_RGBA8: case GPU_SRGB8_A8: + case GPU_RGB10_A2: case GPU_R11F_G11F_B10F: case GPU_R32F: case GPU_R32UI: @@ -368,6 +369,7 @@ inline int to_component_len(eGPUTextureFormat format) case GPU_RGBA16: case GPU_RGBA32F: case GPU_SRGB8_A8: + case GPU_RGB10_A2: return 4; case GPU_RGB16F: case GPU_R11F_G11F_B10F: @@ -395,6 +397,7 @@ inline size_t to_bytesize(eGPUDataFormat data_format) return 4; case GPU_DATA_UINT_24_8: case GPU_DATA_10_11_11_REV: + case GPU_DATA_2_10_10_10_REV: return 4; default: BLI_assert(!"Data format incorrect or unsupported\n"); @@ -432,6 +435,8 @@ inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat da case GPU_RGBA8UI: case GPU_SRGB8_A8: return ELEM(data_format, GPU_DATA_UBYTE, GPU_DATA_FLOAT); + case GPU_RGB10_A2: + return ELEM(data_format, GPU_DATA_2_10_10_10_REV, GPU_DATA_FLOAT); case GPU_R11F_G11F_B10F: return ELEM(data_format, GPU_DATA_10_11_11_REV, GPU_DATA_FLOAT); default: @@ -464,6 +469,8 @@ inline eGPUDataFormat to_data_format(eGPUTextureFormat tex_format) case GPU_RGBA8UI: case GPU_SRGB8_A8: return GPU_DATA_UBYTE; + case GPU_RGB10_A2: + return GPU_DATA_2_10_10_10_REV; case GPU_R11F_G11F_B10F: return GPU_DATA_10_11_11_REV; default: diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh index afe0e0195ce..9da27056269 100644 --- a/source/blender/gpu/opengl/gl_texture.hh +++ b/source/blender/gpu/opengl/gl_texture.hh @@ -158,6 +158,8 @@ inline GLenum to_gl_internal_format(eGPUTextureFormat format) case GPU_R16: return GL_R16; /* Special formats texture & renderbuffer */ + case GPU_RGB10_A2: + return GL_RGB10_A2; case GPU_R11F_G11F_B10F: return GL_R11F_G11F_B10F; case GPU_DEPTH32F_STENCIL8: @@ -280,6 +282,8 @@ inline GLenum to_gl(eGPUDataFormat format) return GL_UNSIGNED_BYTE; case GPU_DATA_UINT_24_8: return GL_UNSIGNED_INT_24_8; + case GPU_DATA_2_10_10_10_REV: + return GL_UNSIGNED_INT_2_10_10_10_REV; case GPU_DATA_10_11_11_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; default: @@ -333,6 +337,7 @@ inline GLenum to_gl_data_format(eGPUTextureFormat format) case GPU_RGBA16: case GPU_RGBA16F: case GPU_RGBA32F: + case GPU_RGB10_A2: return GL_RGBA; case GPU_DEPTH24_STENCIL8: case GPU_DEPTH32F_STENCIL8: From 764082676b4c8761573f5e7b91e004a3a83f2ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 20 Feb 2021 17:02:52 +0100 Subject: [PATCH 346/519] GPU: Add define to ouput more context lines for GLSL errors This is work in progress, but it is very useful even as it is. --- source/blender/gpu/intern/gpu_shader.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 97673e92bcf..bb657ff1645 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -166,6 +166,11 @@ void Shader::print_log(Span sources, char *log, const char *stage, found_line_id = true; break; } +/* TODO(fclem) Make this an option to display N lines before error. */ +#if 0 /* Uncomment to print shader file up to the error line to have more context. */ + BLI_dynstr_appendf(dynstr, "%5d | ", src_line_index); + BLI_dynstr_nappend(dynstr, src_line, (src_line_end + 1) - src_line); +#endif /* Continue to next line. */ src_line = src_line_end + 1; src_line_index++; From dee94afd039de7b7d3002ff2f8f1f0bf4c515bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 20 Feb 2021 20:33:28 +0100 Subject: [PATCH 347/519] EEVEE: Ambient Occlusion Node: Support inverted and distance parameters This adds an approximation of inverted AO by reversing the max horizon search (becoming a min horizon). The horizons are correctly clamped in the reverse direction to the shading and geometric normals. The arc integration is untouched as it seems to be symetrical. The limitation of this technique is that since it is still screen-space AO you don't get other hidden surfaces occlusion. This is more problematic in the case of inverted AO than for normal AO but it's better than no support AO. Support of distance parameter was easy thanks to recent AO refactor. --- .../eevee/shaders/ambient_occlusion_lib.glsl | 87 ++++++++++++------- .../eevee/shaders/effect_gtao_frag.glsl | 2 +- ...gpu_shader_material_ambient_occlusion.glsl | 15 ++-- .../nodes/node_shader_ambient_occlusion.c | 4 +- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl index 0017307ba34..473990e1683 100644 --- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl @@ -80,12 +80,13 @@ float search_horizon(vec3 vI, vec2 uv_start, vec2 uv_dir, sampler2D depth_tx, + const float inverted, float radius, const float sample_count) { float sample_count_inv = 1.0 / sample_count; /* Init at cos(M_PI). */ - float h = -1.0; + float h = (inverted != 0.0) ? 1.0 : -1.0; /* TODO(fclem) samples steps should be using the same approach as raytrace. (DDA line algo.) */ for (float i = 0.0; i < sample_count; i++) { @@ -97,7 +98,8 @@ float search_horizon(vec3 vI, float depth = textureLod(depth_tx, uv * mipRatio[mip].xy, floor(lod)).r; /* Bias depth a bit to avoid self shadowing issues. */ - depth += 2.0 * 2.4e-7; + const float bias = 2.0 * 2.4e-7; + depth += (inverted != 0.0) ? -bias : bias; vec3 s = get_view_space_from_depth(uv, depth); vec3 omega_s = s - vP; @@ -109,26 +111,29 @@ float search_horizon(vec3 vI, /* TODO(fclem) parameter. */ float dist_fac = sqr(saturate(dist_ratio * 2.0 - 1.0)); - /* TODO This need to take the stride distance into account. Now it works because stride is - * constant. */ /* Thickness heuristic (Eq. 9). */ - if (s_h < h) { - /* TODO(fclem) parameter. */ - const float thickness_fac = 0.2; - s_h = mix(h, s_h, thickness_fac); + if (inverted != 0.0) { + h = min(h, s_h); } else { - s_h = max(h, s_h); + /* TODO This need to take the stride distance into account. Now it works because stride is + * constant. */ + if (s_h < h) { + /* TODO(fclem) parameter. */ + const float thickness_fac = 0.2; + s_h = mix(h, s_h, thickness_fac); + } + else { + s_h = max(h, s_h); + } + h = mix(s_h, h, dist_fac); } - h = mix(s_h, h, dist_fac); } return fast_acos(h); } -OcclusionData occlusion_search(vec3 vP, - sampler2D depth_tx, - float radius, - const float dir_sample_count) +OcclusionData occlusion_search( + vec3 vP, sampler2D depth_tx, float radius, const float inverted, const float dir_sample_count) { if ((int(aoSettings) & USE_AO) == 0) { return NO_OCCLUSION_DATA; @@ -142,7 +147,8 @@ OcclusionData occlusion_search(vec3 vP, vec3 avg_dir = vec3(0.0); float avg_apperture = 0.0; - OcclusionData data = NO_OCCLUSION_DATA; + OcclusionData data = (inverted != 0.0) ? OcclusionData(vec4(0, 0, 0, 0), 1.0) : + NO_OCCLUSION_DATA; for (int i = 0; i < 2; i++) { /* View > NDC > Uv space. */ @@ -155,11 +161,11 @@ OcclusionData occlusion_search(vec3 vP, /* No need to trace more. */ uv_dir -= uv_ofs; - if (max_px_dir > 0.0) { + if (max_px_dir > 1.0) { data.horizons[0 + i * 2] = search_horizon( - vI, vP, noise.y, uv + uv_ofs, uv_dir, depth_tx, radius, dir_sample_count); + vI, vP, noise.y, uv + uv_ofs, uv_dir, depth_tx, inverted, radius, dir_sample_count); data.horizons[1 + i * 2] = -search_horizon( - vI, vP, noise.y, uv - uv_ofs, -uv_dir, depth_tx, radius, dir_sample_count); + vI, vP, noise.y, uv - uv_ofs, -uv_dir, depth_tx, inverted, radius, dir_sample_count); } /* Rotate 90 degrees. */ dir = vec2(-dir.y, dir.x); @@ -168,8 +174,29 @@ OcclusionData occlusion_search(vec3 vP, return data; } -void occlusion_eval( - OcclusionData data, vec3 V, vec3 N, vec3 Ng, out float visibility, out vec3 bent_normal) +vec2 clamp_horizons_to_hemisphere(vec2 horizons, float angle_N, const float inverted) +{ + /* Add a little bias to fight self shadowing. */ + const float max_angle = M_PI_2 - 0.05; + + if (inverted != 0.0) { + horizons.x = max(horizons.x, angle_N + max_angle); + horizons.y = min(horizons.y, angle_N - max_angle); + } + else { + horizons.x = min(horizons.x, angle_N + max_angle); + horizons.y = max(horizons.y, angle_N - max_angle); + } + return horizons; +} + +void occlusion_eval(OcclusionData data, + vec3 V, + vec3 N, + vec3 Ng, + const float inverted, + out float visibility, + out vec3 bent_normal) { if ((int(aoSettings) & USE_AO) == 0) { visibility = data.custom_occlusion; @@ -177,7 +204,9 @@ void occlusion_eval( return; } - if (min_v4(abs(data.horizons)) == M_PI) { + bool early_out = (inverted != 0.0) ? (max_v4(abs(data.horizons)) == 0.0) : + (min_v4(abs(data.horizons)) == M_PI); + if (early_out) { visibility = dot(N, Ng) * 0.5 + 0.5; visibility = min(visibility, data.custom_occlusion); @@ -215,10 +244,8 @@ void occlusion_eval( /* Gamma, angle between normalized projected normal and view vector. */ float angle_Ng = sign(Ng_sin) * fast_acos(Ng_cos); float angle_N = sign(N_sin) * fast_acos(N_cos); - /* Add a little bias to fight self shadowing. */ - const float max_angle = M_PI_2 - 0.05; /* Clamp horizons to hemisphere around shading normal. */ - h = clamp(h, angle_N - max_angle, angle_N + max_angle); + h = clamp_horizons_to_hemisphere(h, angle_N, inverted); float bent_angle = (h.x + h.y) * 0.5; /* NOTE: here we multiply z by 0.5 as it shows less difference with the geometric normal. @@ -228,10 +255,10 @@ void occlusion_eval( /* Clamp to geometric normal only for integral to keep smooth bent normal. */ /* This is done to match Cycles ground truth but adds some computation. */ - h = clamp(h, angle_Ng - max_angle, angle_Ng + max_angle); + h = clamp_horizons_to_hemisphere(h, angle_Ng, inverted); /* Inner integral (Eq. 7). */ - float a = dot(-cos(2.0 * h - angle_N) + cos(angle_N) + 2.0 * h * sin(angle_N), vec2(0.25)); + float a = dot(-cos(2.0 * h - angle_N) + N_cos + 2.0 * h * N_sin, vec2(0.25)); /* Correct normal not on plane (Eq. 8). */ visibility += proj_N_len * a; @@ -274,7 +301,7 @@ float diffuse_occlusion(OcclusionData data, vec3 V, vec3 N, vec3 Ng) { vec3 unused; float visibility; - occlusion_eval(data, V, N, Ng, visibility, unused); + occlusion_eval(data, V, N, Ng, 0.0, visibility, unused); /* Scale by user factor */ visibility = pow(saturate(visibility), aoFactor); return visibility; @@ -284,7 +311,7 @@ float diffuse_occlusion( OcclusionData data, vec3 V, vec3 N, vec3 Ng, vec3 albedo, out vec3 bent_normal) { float visibility; - occlusion_eval(data, V, N, Ng, visibility, bent_normal); + occlusion_eval(data, V, N, Ng, 0.0, visibility, bent_normal); visibility = gtao_multibounce(visibility, albedo); /* Scale by user factor */ @@ -328,7 +355,7 @@ float specular_occlusion( { vec3 visibility_dir; float visibility; - occlusion_eval(data, V, N, N, visibility, visibility_dir); + occlusion_eval(data, V, N, N, 0.0, visibility, visibility_dir); specular_dir = normalize(mix(specular_dir, visibility_dir, roughness * (1.0 - visibility))); @@ -363,7 +390,7 @@ OcclusionData occlusion_load(vec3 vP, float custom_occlusion) } #else /* For blended surfaces and */ - data = occlusion_search(vP, maxzBuffer, aoDistance, 8.0); + data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0); #endif data.custom_occlusion = custom_occlusion; diff --git a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl index 1cabceebcc8..369b0735cd2 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl @@ -118,7 +118,7 @@ void main() OcclusionData data = NO_OCCLUSION_DATA; /* Do not trace for background */ if (depth != 1.0) { - data = occlusion_search(vP, maxzBuffer, aoDistance, 8.0); + data = occlusion_search(vP, maxzBuffer, aoDistance, 0.0, 8.0); } FragColor = pack_occlusion_data(data); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl index f3eea9869e5..4721b9f0132 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl @@ -1,19 +1,24 @@ #ifndef VOLUMETRICS -void node_ambient_occlusion( - vec4 color, float distance, vec3 normal, out vec4 result_color, out float result_ao) +void node_ambient_occlusion(vec4 color, + float dist, + vec3 normal, + const float inverted, + out vec4 result_color, + out float result_ao) { vec3 bent_normal; vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); - OcclusionData data = occlusion_load(viewPosition, 1.0); + OcclusionData data = occlusion_search(viewPosition, maxzBuffer, dist, inverted, 8.0); vec3 V = cameraVec; vec3 N = normalize(normal); vec3 Ng = safe_normalize(cross(dFdx(worldPosition), dFdy(worldPosition))); - result_ao = diffuse_occlusion(data, V, N, Ng); + vec3 unused; + occlusion_eval(data, V, N, Ng, inverted, result_ao, unused); result_color = result_ao * color; } #else /* Stub ambient occlusion because it is not compatible with volumetrics. */ -# define node_ambient_occlusion(a, b, c, d, e) (e = CLOSURE_DEFAULT) +# define node_ambient_occlusion(a, b, c, d, e, f) (e = vec4(0); f = 0.0) #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c index 5d3a9dfc025..36971d4e799 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c @@ -46,7 +46,9 @@ static int node_shader_gpu_ambient_occlusion(GPUMaterial *mat, GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE); - return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out); + float inverted = node->custom2 ? 1.0f : 0.0f; + + return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out, GPU_constant(&inverted)); } static void node_shader_init_ambient_occlusion(bNodeTree *UNUSED(ntree), bNode *node) From 1d51cb6be24e3097de2a20f490ef0dd535240f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 00:46:41 +0100 Subject: [PATCH 348/519] Cleanup: EEVEE: change cameraVec macro to cameraVec(P) This makes is clearer and avoid having to setup worldPosition if shader is not a material shader. --- .../eevee/shaders/closure_eval_lib.glsl | 2 +- .../eevee/shaders/closure_type_lib.glsl | 2 +- .../eevee/shaders/effect_gtao_frag.glsl | 6 ++-- .../eevee/shaders/effect_ssr_frag.glsl | 30 +++++++++---------- .../shaders/renderpass_postprocess_frag.glsl | 2 +- .../draw/engines/eevee/shaders/ssr_lib.glsl | 9 +++--- .../shaders/volumetric_scatter_frag.glsl | 2 +- .../draw/intern/shaders/common_view_lib.glsl | 6 ++-- ...gpu_shader_material_ambient_occlusion.glsl | 2 +- .../gpu_shader_material_eevee_specular.glsl | 6 ++-- .../gpu_shader_material_emission.glsl | 2 +- .../material/gpu_shader_material_glass.glsl | 2 +- .../material/gpu_shader_material_glossy.glsl | 2 +- .../gpu_shader_material_principled.glsl | 6 ++-- .../gpu_shader_material_refraction.glsl | 3 +- .../gpu_shader_material_shader_to_rgba.glsl | 4 +-- ...u_shader_material_texture_coordinates.glsl | 2 +- 17 files changed, 44 insertions(+), 44 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl index b372a8c2467..8cb702796da 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -200,7 +200,7 @@ ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) { ClosureEvalCommon cl_eval; cl_eval.rand = texelfetch_noise_tex(gl_FragCoord.xy); - cl_eval.V = cameraVec; + cl_eval.V = cameraVec(worldPosition); cl_eval.P = worldPosition; cl_eval.N = safe_normalize(gl_FrontFacing ? worldNormal : -worldNormal); cl_eval.vN = safe_normalize(gl_FrontFacing ? viewNormal : -viewNormal); diff --git a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl index 9ca25ef240f..38ae3972aa7 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl @@ -159,7 +159,7 @@ void closure_load_ssr_data( { /* Still encode to avoid artifacts in the SSR pass. */ vec3 vN = normalize(mat3(ViewMatrix) * N); - cl.ssr_normal = normal_encode(vN, viewCameraVec); + cl.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition)); if (ssrToggle && int(ssr_id) == outputSsrId) { cl.ssr_data = vec4(ssr_radiance, roughness); diff --git a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl index 369b0735cd2..19ae0acc443 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_gtao_frag.glsl @@ -91,10 +91,8 @@ void main() } else { vec3 P = transform_point(ViewMatrixInverse, vP); - vec3 worldPosition = P; /* For cameraVec macro. TODO(fclem) make cameraVec(P). */ - vec3 viewPosition = vP; /* For viewCameraVec macro. TODO(fclem) make viewCameraVec(vP). */ - vec3 V = cameraVec; - vec3 vV = viewCameraVec; + vec3 V = cameraVec(P); + vec3 vV = viewCameraVec(vP); vec3 vN = normal_decode(texture(normalBuffer, uvcoordsvar.xy).rg, vV); vec3 N = transform_direction(ViewMatrixInverse, vN); vec3 Ng = transform_direction(ViewMatrixInverse, vNg); diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index b7caaf127bf..71aead9155d 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -142,9 +142,12 @@ void main() vec2 uvs = vec2(fullres_texel) / vec2(textureSize(depthBuffer, 0)); /* Using view space */ - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 V = viewCameraVec; - vec3 N = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, V); + vec3 vP = get_view_space_from_depth(uvs, depth); + vec3 P = transform_point(ViewMatrixInverse, vP); + vec3 vV = viewCameraVec(vP); + vec3 V = cameraVec(P); + vec3 vN = normal_decode(texelFetch(normalBuffer, fullres_texel, 0).rg, vV); + vec3 N = transform_direction(ViewMatrixInverse, vN); /* Retrieve pixel data */ vec4 speccol_roughness = texelFetch(specroughBuffer, fullres_texel, 0).rgba; @@ -172,27 +175,24 @@ void main() /* Importance sampling bias */ rand.x = mix(rand.x, 0.0, ssrBrdfBias); - vec3 W = transform_point(ViewMatrixInverse, viewPosition); - vec3 wN = transform_direction(ViewMatrixInverse, N); - - vec3 T, B; - make_orthonormal_basis(N, T, B); /* Generate tangent space */ + vec3 vT, vB; + make_orthonormal_basis(vN, vT, vB); /* Generate tangent space */ /* Planar Reflections */ for (int i = 0; i < MAX_PLANAR && i < prbNumPlanar; i++) { PlanarData pd = planars_data[i]; - float fade = probe_attenuation_planar(pd, W); - fade *= probe_attenuation_planar_normal_roughness(pd, wN, 0.0); + float fade = probe_attenuation_planar(pd, P); + fade *= probe_attenuation_planar_normal_roughness(pd, N, 0.0); if (fade > 0.5) { /* Find view vector / reflection plane intersection. */ /* TODO optimize, use view space for all. */ - vec3 tracePosition = line_plane_intersect(W, cameraVec, pd.pl_plane_eq); + vec3 tracePosition = line_plane_intersect(P, V, pd.pl_plane_eq); tracePosition = transform_point(ViewMatrix, tracePosition); vec3 planeNormal = transform_direction(ViewMatrix, pd.pl_normal); - do_planar_ssr(i, V, N, T, B, planeNormal, tracePosition, a2, rand); + do_planar_ssr(i, vV, vN, vT, vB, planeNormal, tracePosition, a2, rand); return; } } @@ -200,9 +200,9 @@ void main() /* Constant bias (due to depth buffer precision). Helps with self intersection. */ /* Magic numbers for 24bits of precision. * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ - viewPosition.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth)); + vP.z = get_view_z_from_depth(depth - mix(2.4e-7, 4.8e-7, depth)); - do_ssr(V, N, T, B, viewPosition, a2, rand); + do_ssr(vV, vN, vT, vB, vP, a2, rand); } #else /* STEP_RESOLVE */ @@ -580,7 +580,7 @@ void main() worldPosition = transform_point(ViewMatrixInverse, viewPosition); vec2 normal_encoded = texelFetch(normalBuffer, texel, 0).rg; - viewNormal = normal_decode(normal_encoded, viewCameraVec); + viewNormal = normal_decode(normal_encoded, viewCameraVec(viewPosition)); worldNormal = transform_direction(ViewMatrixInverse, viewNormal); CLOSURE_VARS_DECLARE_1(Glossy); diff --git a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl index 0bbbe58c44a..363b5cb978a 100644 --- a/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl @@ -82,7 +82,7 @@ void main() * with NaN's */ if (depth != 1.0 && any(notEqual(encoded_normal, vec2(0.0)))) { vec3 decoded_normal = normal_decode(texelFetch(inputBuffer, texel, 0).rg, vec3(0.0)); - vec3 world_normal = mat3(ViewMatrixInverse) * decoded_normal; + vec3 world_normal = transform_direction(ViewMatrixInverse, decoded_normal); color.rgb = world_normal; } else { diff --git a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl index 29495e98355..15c28efe622 100644 --- a/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ssr_lib.glsl @@ -9,8 +9,7 @@ #define BTDF_BIAS 0.85 -vec4 screen_space_refraction( - vec3 viewPosition, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand) +vec4 screen_space_refraction(vec3 vP, vec3 N, vec3 V, float ior, float roughnessSquared, vec4 rand) { float a2 = max(5e-6, roughnessSquared * roughnessSquared); @@ -29,7 +28,7 @@ vec4 screen_space_refraction( pdf = pdf_ggx_reflect(NH, a2); } - vec3 vV = viewCameraVec; + vec3 vV = viewCameraVec(vP); float eta = 1.0 / ior; if (dot(H, V) < 0.0) { H = -H; @@ -41,11 +40,11 @@ vec4 screen_space_refraction( R = transform_direction(ViewMatrix, R); vec3 hit_pos = raycast( - -1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false); + -1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, roughnessSquared, false); if ((hit_pos.z > 0.0) && (F_eta(ior, dot(H, V)) < 1.0)) { hit_pos = get_view_space_from_depth(hit_pos.xy, hit_pos.z); - float hit_dist = distance(hit_pos, viewPosition); + float hit_dist = distance(hit_pos, vP); float cone_cos = cone_cosine(roughnessSquared); float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos; diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl index 806f1b5b205..13287eab82b 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl @@ -30,7 +30,7 @@ void main() vec3 s_scattering = texelFetch(volumeScattering, volume_cell, 0).rgb; vec3 volume_ndc = volume_to_ndc((vec3(volume_cell) + volJitter.xyz) * volInvTexSize.xyz); vec3 worldPosition = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z); - vec3 wdir = cameraVec; + vec3 wdir = cameraVec(worldPosition); vec2 phase = texelFetch(volumePhase, volume_cell, 0).rg; float s_anisotropy = phase.x / max(1.0, phase.y); diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 0f2782fc2b2..4012de4f95b 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -27,10 +27,8 @@ layout(std140) uniform viewBlock #define cameraForward ViewMatrixInverse[2].xyz #define cameraPos ViewMatrixInverse[3].xyz -#define cameraVec \ - ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - worldPosition) : cameraForward) -#define viewCameraVec \ - ((ProjectionMatrix[3][3] == 0.0) ? normalize(-viewPosition) : vec3(0.0, 0.0, 1.0)) +#define cameraVec(P) ((ProjectionMatrix[3][3] == 0.0) ? normalize(cameraPos - P) : cameraForward) +#define viewCameraVec(vP) ((ProjectionMatrix[3][3] == 0.0) ? normalize(-vP) : vec3(0.0, 0.0, 1.0)) #ifdef world_clip_planes_calc_clip_distance # undef world_clip_planes_calc_clip_distance diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl index 4721b9f0132..0231aeca04b 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_ambient_occlusion.glsl @@ -10,7 +10,7 @@ void node_ambient_occlusion(vec4 color, vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy); OcclusionData data = occlusion_search(viewPosition, maxzBuffer, dist, inverted, 8.0); - vec3 V = cameraVec; + vec3 V = cameraVec(worldPosition); vec3 N = normalize(normal); vec3 Ng = safe_normalize(cross(dFdx(worldPosition), dFdy(worldPosition))); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl index 429c4ed41ac..d5623c890e4 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl @@ -32,6 +32,8 @@ void node_eevee_specular(vec4 diffuse, result = CLOSURE_DEFAULT; + vec3 V = cameraVec(worldPosition); + { /* Diffuse. */ out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1), out_Diffuse_0.radiance); @@ -40,7 +42,7 @@ void node_eevee_specular(vec4 diffuse, } { /* Glossy. */ - float NV = dot(in_Glossy_1.N, cameraVec); + float NV = dot(in_Glossy_1.N, V); vec2 split_sum = brdf_lut(NV, in_Glossy_1.roughness); vec3 brdf = F_brdf_single_scatter(specular.rgb, vec3(1.0), split_sum); @@ -52,7 +54,7 @@ void node_eevee_specular(vec4 diffuse, } { /* Clearcoat. */ - float NV = dot(in_Glossy_2.N, cameraVec); + float NV = dot(in_Glossy_2.N, V); vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl index 502bc7f92d6..f2de7c2da39 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_emission.glsl @@ -3,7 +3,7 @@ void node_emission(vec4 color, float strength, vec3 vN, out Closure result) result = CLOSURE_DEFAULT; #ifndef VOLUMETRICS result.radiance = render_pass_emission_mask(color.rgb) * strength; - result.ssr_normal = normal_encode(vN, viewCameraVec); + result.ssr_normal = normal_encode(vN, viewCameraVec(viewPosition)); #else result.emission = color.rgb * strength; #endif diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl index 6788b34c938..aa0a8873596 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glass.glsl @@ -23,7 +23,7 @@ void node_bsdf_glass(vec4 color, result = CLOSURE_DEFAULT; - float NV = dot(in_Refraction_1.N, cameraVec); + float NV = dot(in_Refraction_1.N, cameraVec(worldPosition)); float fresnel = (do_multiscatter != 0.0) ? btdf_lut(NV, in_Refraction_1.roughness, in_Refraction_1.ior).y : diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl index ca7c3749597..fa83bfb6c7a 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_glossy.glsl @@ -16,7 +16,7 @@ void node_bsdf_glossy( result = CLOSURE_DEFAULT; - vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec), in_Glossy_0.roughness); + vec2 split_sum = brdf_lut(dot(in_Glossy_0.N, cameraVec(worldPosition)), in_Glossy_0.roughness); vec3 brdf = (use_multiscatter != 0.0) ? F_brdf_multi_scatter(vec3(1.0), vec3(1.0), split_sum) : F_brdf_single_scatter(vec3(1.0), vec3(1.0), split_sum); out_Glossy_0.radiance = closure_mask_ssr_radiance(out_Glossy_0.radiance, ssr_id); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 139dcb33222..40fe83a3616 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -86,8 +86,10 @@ void node_bsdf_principled(vec4 base_color, out_Refraction_3.radiance = vec3(0); } + vec3 V = cameraVec(worldPosition); + /* Glossy_1 will always be evaluated. */ - float NV = dot(in_Glossy_1.N, cameraVec); + float NV = dot(in_Glossy_1.N, V); vec3 base_color_tint = tint_from_color(base_color.rgb); @@ -172,7 +174,7 @@ void node_bsdf_principled(vec4 base_color, } if (clearcoat > 1e-5) { - float NV = dot(in_Glossy_2.N, cameraVec); + float NV = dot(in_Glossy_2.N, V); vec2 split_sum = brdf_lut(NV, in_Glossy_2.roughness); vec3 brdf = F_brdf_single_scatter(vec3(0.04), vec3(1.0), split_sum); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl index db820efa42e..7cbc7218f5c 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_refraction.glsl @@ -22,7 +22,8 @@ void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Cl result.radiance = out_Refraction_0.radiance; /* TODO(fclem) Try to not use this. */ - result.ssr_normal = normal_encode(mat3(ViewMatrix) * in_Refraction_0.N, viewCameraVec); + result.ssr_normal = normal_encode(mat3(ViewMatrix) * in_Refraction_0.N, + viewCameraVec(viewPosition)); } #else diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl index f495157f6e1..a5fdc7a2337 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_shader_to_rgba.glsl @@ -3,8 +3,8 @@ void node_shader_to_rgba(Closure cl, out vec4 outcol, out float outalpha) { vec4 spec_accum = vec4(0.0); if (ssrToggle && FLAG_TEST(cl.flag, CLOSURE_SSR_FLAG)) { - vec3 V = cameraVec; - vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec); + vec3 V = cameraVec(worldPosition); + vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec(viewPosition)); vec3 N = transform_direction(ViewMatrixInverse, vN); float roughness = cl.ssr_data.a; float roughnessSquared = max(1e-3, roughness * roughness); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl index 24276156d55..08d566224bf 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_texture_coordinates.glsl @@ -50,7 +50,7 @@ void node_tex_coord(vec3 I, camera = vec3(I.xy, -I.z); vec4 projvec = ProjectionMatrix * vec4(I, 1.0); window = vec3(mtex_2d_mapping(projvec.xyz / projvec.w).xy * camerafac.xy + camerafac.zw, 0.0); - reflection = -reflect(cameraVec, normalize(wN)); + reflection = -reflect(cameraVec(worldPosition), normalize(wN)); } void node_tex_coord_background(vec3 I, From d0959924ad057077cf71a1d401ec05ee011ee29e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 00:52:47 +0100 Subject: [PATCH 349/519] Cleanup: EEVEE: Use P for world position instead of W This removes the last places where this was not the case. We follow cycles convention of P being for Postion. --- .../shaders/effect_translucency_frag.glsl | 16 +++++----- .../engines/eevee/shaders/lightprobe_lib.glsl | 30 +++++++++---------- .../engines/eevee/shaders/lights_lib.glsl | 22 +++++++------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl index 724e63eaba8..737ef7dc509 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl @@ -81,7 +81,7 @@ float shadow_cube_radial_depth(vec3 cubevec, float tex_id, int shadow_id) return depth; } -vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, float sss_scale) +vec3 light_translucent(LightData ld, vec3 P, vec3 N, vec4 l_vector, vec2 rand, float sss_scale) { int shadow_id = int(ld.l_shadowid); @@ -98,7 +98,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f float d, dist; int data_id = int(sd(shadow_id).sh_data_index); if (ld.l_type == SUN) { - vec4 view_z = vec4(dot(W - cameraPos, cameraForward)); + vec4 view_z = vec4(dot(P - cameraPos, cameraForward)); vec4 weights = step(scascade(data_id).split_end_distances, view_z); float id = abs(4.0 - dot(weights, weights)); @@ -109,7 +109,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f /* Same factor as in get_cascade_world_distance(). */ float range = abs(sd(shadow_id).sh_far - sd(shadow_id).sh_near); - vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(W, 1.0); + vec4 shpos = scascade(data_id).shadowmat[int(id)] * vec4(P, 1.0); dist = shpos.z * range; if (shpos.z > 1.0 || shpos.z < 0.0) { @@ -149,7 +149,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f else { float ofs = 1.0 / float(textureSize(sssShadowCubes, 0).x); - vec3 cubevec = transform_point(scube(data_id).shadowmat, W); + vec3 cubevec = transform_point(scube(data_id).shadowmat, P); dist = length(cubevec); cubevec /= dist; /* tex_id == data_id for cube shadowmap */ @@ -187,8 +187,8 @@ void main(void) { vec2 uvs = uvcoordsvar.xy; float sss_scale = texture(sssRadius, uvs).r; - vec3 W = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r); - vec3 N = normalize(cross(dFdx(W), dFdy(W))); + vec3 P = get_world_space_from_depth(uvs, texture(depthBuffer, uvs).r); + vec3 N = normalize(cross(dFdx(P), dFdy(P))); vec3 rand = texelfetch_noise_tex(gl_FragCoord.xy).zwy; rand.xy *= fast_sqrt(rand.z); @@ -203,7 +203,7 @@ void main(void) } vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - W; + l_vector.xyz = ld.l_position - P; l_vector.w = length(l_vector.xyz); float att = light_attenuation(ld, l_vector); @@ -211,7 +211,7 @@ void main(void) continue; } - accum += att * ld.l_color * light_translucent(ld, W, -N, l_vector, rand.xy, sss_scale); + accum += att * ld.l_color * light_translucent(ld, P, -N, l_vector, rand.xy, sss_scale); } FragColor = vec4(accum, 1.0); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index 6507534ce67..c1c0138e002 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -99,9 +99,9 @@ layout(std140) uniform planar_block /* ----------- Functions --------- */ -float probe_attenuation_cube(int pd_id, vec3 W) +float probe_attenuation_cube(int pd_id, vec3 P) { - vec3 localpos = transform_point(probes_data[pd_id].influencemat, W); + vec3 localpos = transform_point(probes_data[pd_id].influencemat, P); float probe_atten_fac = probes_data[pd_id].p_atten_fac; float fac; @@ -116,15 +116,15 @@ float probe_attenuation_cube(int pd_id, vec3 W) return fac; } -float probe_attenuation_planar(PlanarData pd, vec3 W) +float probe_attenuation_planar(PlanarData pd, vec3 P) { /* Distance from plane */ - float fac = saturate(abs(dot(pd.pl_plane_eq, vec4(W, 1.0))) * pd.pl_fade_scale + + float fac = saturate(abs(dot(pd.pl_plane_eq, vec4(P, 1.0))) * pd.pl_fade_scale + pd.pl_fade_bias); /* Fancy fast clipping calculation */ vec2 dist_to_clip; - dist_to_clip.x = dot(pd.pl_clip_pos_x, W); - dist_to_clip.y = dot(pd.pl_clip_pos_y, W); + dist_to_clip.x = dot(pd.pl_clip_pos_x, P); + dist_to_clip.y = dot(pd.pl_clip_pos_y, P); /* compare and add all tests */ fac *= step(2.0, dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy)); return fac; @@ -138,18 +138,18 @@ float probe_attenuation_planar_normal_roughness(PlanarData pd, vec3 N, float rou return fac * saturate(1.0 - roughness * 10.0); } -float probe_attenuation_grid(GridData gd, vec3 W, out vec3 localpos) +float probe_attenuation_grid(GridData gd, vec3 P, out vec3 localpos) { - localpos = transform_point(gd.localmat, W); + localpos = transform_point(gd.localmat, P); vec3 pos_to_edge = max(vec3(0.0), abs(localpos) - 1.0); float fade = length(pos_to_edge); return saturate(-fade * gd.g_atten_scale + gd.g_atten_bias); } -vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) +vec3 probe_evaluate_cube(int pd_id, vec3 P, vec3 R, float roughness) { /* Correct reflection ray using parallax volume intersection. */ - vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, W); + vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, P); vec3 localray = transform_direction(probes_data[pd_id].parallaxmat, R); float dist; @@ -161,7 +161,7 @@ vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness) } /* Use Distance in WS directly to recover intersection */ - vec3 intersection = W + R * dist - probes_data[pd_id].p_position; + vec3 intersection = P + R * dist - probes_data[pd_id].p_position; /* From Frostbite PBR Course * Distance based roughness @@ -186,10 +186,10 @@ vec3 probe_evaluate_world_spec(vec3 R, float roughness) return textureLod_cubemapArray(probeCubes, vec4(R, 0.0), lod).rgb; } -vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 W, vec3 N, vec3 V, float roughness) +vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 P, vec3 N, vec3 V, float roughness) { /* Find view vector / reflection plane intersection. */ - vec3 point_on_plane = line_plane_intersect(W, V, pd.pl_plane_eq); + vec3 point_on_plane = line_plane_intersect(P, V, pd.pl_plane_eq); /* How far the pixel is from the plane. */ float ref_depth = 1.0; /* TODO parameter */ @@ -245,7 +245,7 @@ void fallback_cubemap(vec3 N, } } -vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos) +vec3 probe_evaluate_grid(GridData gd, vec3 P, vec3 N, vec3 localpos) { localpos = localpos * 0.5 + 0.5; localpos = localpos * vec3(gd.g_resolution) - 0.5; @@ -274,7 +274,7 @@ vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos) (gd.g_increment_x * cell_cos.x + gd.g_increment_y * cell_cos.y + gd.g_increment_z * cell_cos.z); - vec3 ws_point_to_cell = ws_cell_location - W; + vec3 ws_point_to_cell = ws_cell_location - P; float ws_dist_point_to_cell = length(ws_point_to_cell); vec3 ws_light = ws_point_to_cell / ws_dist_point_to_cell; diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl index b0845057a43..04ad53eabb7 100644 --- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl @@ -164,10 +164,10 @@ vec4 sample_cascade(sampler2DArray tex, vec2 co, float cascade_id) #define scube(x) shadows_cube_data[x] #define scascade(x) shadows_cascade_data[x] -float sample_cube_shadow(int shadow_id, vec3 W) +float sample_cube_shadow(int shadow_id, vec3 P) { int data_id = int(sd(shadow_id).sh_data_index); - vec3 cubevec = transform_point(scube(data_id).shadowmat, W); + vec3 cubevec = transform_point(scube(data_id).shadowmat, P); float dist = max(sd(shadow_id).sh_near, max_v3(abs(cubevec)) - sd(shadow_id).sh_bias); dist = buffer_depth(true, dist, sd(shadow_id).sh_far, sd(shadow_id).sh_near); /* Manual Shadow Cube Layer indexing. */ @@ -179,11 +179,11 @@ float sample_cube_shadow(int shadow_id, vec3 W) return texture(shadowCubeTexture, vec4(coord, tex_id * 6.0 + face, dist)); } -float sample_cascade_shadow(int shadow_id, vec3 W) +float sample_cascade_shadow(int shadow_id, vec3 P) { int data_id = int(sd(shadow_id).sh_data_index); float tex_id = scascade(data_id).sh_tex_index; - vec4 view_z = vec4(dot(W - cameraPos, cameraForward)); + vec4 view_z = vec4(dot(P - cameraPos, cameraForward)); vec4 weights = 1.0 - smoothstep(scascade(data_id).split_end_distances, scascade(data_id).split_start_distances.yzwx, view_z); @@ -194,13 +194,13 @@ float sample_cascade_shadow(int shadow_id, vec3 W) float vis = weights.w; vec4 coord, shpos; /* Main cascade. */ - shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0); + shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0); coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias); vis += texture(shadowCascadeTexture, coord) * (1.0 - blend); cascade = min(3, cascade + 1); /* Second cascade. */ - shpos = scascade(data_id).shadowmat[cascade] * vec4(W, 1.0); + shpos = scascade(data_id).shadowmat[cascade] * vec4(P, 1.0); coord = vec4(shpos.xy, tex_id + float(cascade), shpos.z - sd(shadow_id).sh_bias); vis += texture(shadowCascadeTexture, coord) * blend; @@ -252,15 +252,15 @@ float light_attenuation(LightData ld, vec4 l_vector) return vis; } -float light_shadowing(LightData ld, vec3 W, float vis) +float light_shadowing(LightData ld, vec3 P, float vis) { #if !defined(VOLUMETRICS) || defined(VOLUME_SHADOW) if (ld.l_shadowid >= 0.0 && vis > 0.001) { if (ld.l_type == SUN) { - vis *= sample_cascade_shadow(int(ld.l_shadowid), W); + vis *= sample_cascade_shadow(int(ld.l_shadowid), P); } else { - vis *= sample_cube_shadow(int(ld.l_shadowid), W); + vis *= sample_cube_shadow(int(ld.l_shadowid), P); } } #endif @@ -308,10 +308,10 @@ float light_contact_shadows( } #endif /* VOLUMETRICS */ -float light_visibility(LightData ld, vec3 W, vec4 l_vector) +float light_visibility(LightData ld, vec3 P, vec4 l_vector) { float l_atten = light_attenuation(ld, l_vector); - return light_shadowing(ld, W, l_atten); + return light_shadowing(ld, P, l_atten); } float light_diffuse(LightData ld, vec3 N, vec3 V, vec4 l_vector) From 33b4a03ca98997a074783599b816768e7f90dd2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 01:01:15 +0100 Subject: [PATCH 350/519] Cleanup: EEVEE: Use P and vP instead of worldPosition and viewPosition ... for local variables. --- .../engines/eevee/shaders/effect_ssr_frag.glsl | 17 +++++------------ .../eevee/shaders/shadow_accum_frag.glsl | 13 ++++++------- .../eevee/shaders/volumetric_scatter_frag.glsl | 16 +++++++--------- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index 71aead9155d..1b7c535379e 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -42,15 +42,8 @@ uniform sampler2D specroughBuffer; layout(location = 0) out ivec2 hitData; layout(location = 1) out float pdfData; -void do_planar_ssr(int index, - vec3 V, - vec3 N, - vec3 T, - vec3 B, - vec3 planeNormal, - vec3 viewPosition, - float a2, - vec4 rand) +void do_planar_ssr( + int index, vec3 V, vec3 N, vec3 T, vec3 B, vec3 planeNormal, vec3 vP, float a2, vec4 rand) { float NH; vec3 H = sample_ggx(rand.xzw, a2, N, T, B, NH); /* Microfacet normal */ @@ -75,12 +68,12 @@ void do_planar_ssr(int index, * below the reflection plane). This way it's garanted that the hit will * be in front of the camera. That let us tag the bad rays with a negative * sign in the Z component. */ - vec3 hit_pos = raycast(index, viewPosition, R * 1e16, 1e16, rand.y, ssrQuality, a2, false); + vec3 hit_pos = raycast(index, vP, R * 1e16, 1e16, rand.y, ssrQuality, a2, false); hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), true); } -void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 rand) +void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 vP, float a2, vec4 rand) { float NH; /* Microfacet normal */ @@ -112,7 +105,7 @@ void do_ssr(vec3 V, vec3 N, vec3 T, vec3 B, vec3 viewPosition, float a2, vec4 ra pdfData = min(1024e32, pdf_ggx_reflect(NH, a2)); /* Theoretical limit of 16bit float */ - vec3 hit_pos = raycast(-1, viewPosition, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true); + vec3 hit_pos = raycast(-1, vP, R * 1e16, ssrThickness, rand.y, ssrQuality, a2, true); hitData = encode_hit_data(hit_pos.xy, (hit_pos.z > 0.0), false); } diff --git a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl index 19eecdb5b79..c48828b7b8d 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl @@ -36,22 +36,21 @@ void main() /* Convert to view Z. */ tracing_depth = get_view_z_from_depth(tracing_depth); - vec3 viewPosition = get_view_space_from_depth(uvs, depth); - vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); + vec3 vP = get_view_space_from_depth(uvs, depth); + vec3 P = transform_point(ViewMatrixInverse, vP); - vec3 true_normal = safe_normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + vec3 vNg = safe_normalize(cross(dFdx(vP), dFdy(vP))); for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { LightData ld = lights_data[i]; vec4 l_vector; /* Non-Normalized Light Vector with length in last component. */ - l_vector.xyz = ld.l_position - worldPosition; + l_vector.xyz = ld.l_position - P; l_vector.w = length(l_vector.xyz); - float l_vis = light_shadowing(ld, worldPosition, 1.0); + float l_vis = light_shadowing(ld, P, 1.0); - l_vis *= light_contact_shadows( - ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, 1.0); + l_vis *= light_contact_shadows(ld, P, vP, tracing_depth, vNg, rand.x, 1.0); accum_light += l_vis; } diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl index 13287eab82b..e72bf8b9150 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl @@ -29,15 +29,14 @@ void main() outTransmittance = texelFetch(volumeExtinction, volume_cell, 0); vec3 s_scattering = texelFetch(volumeScattering, volume_cell, 0).rgb; vec3 volume_ndc = volume_to_ndc((vec3(volume_cell) + volJitter.xyz) * volInvTexSize.xyz); - vec3 worldPosition = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z); - vec3 wdir = cameraVec(worldPosition); + vec3 P = get_world_space_from_depth(volume_ndc.xy, volume_ndc.z); + vec3 V = cameraVec(P); vec2 phase = texelFetch(volumePhase, volume_cell, 0).rg; float s_anisotropy = phase.x / max(1.0, phase.y); /* Environment : Average color. */ - outScattering.rgb += irradiance_volumetric(worldPosition) * s_scattering * - phase_function_isotropic(); + outScattering.rgb += irradiance_volumetric(P) * s_scattering * phase_function_isotropic(); #ifdef VOLUME_LIGHTING /* Lights */ for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { @@ -45,16 +44,15 @@ void main() LightData ld = lights_data[i]; vec4 l_vector; - l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - worldPosition; + l_vector.xyz = (ld.l_type == SUN) ? -ld.l_forward : ld.l_position - P; l_vector.w = length(l_vector.xyz); - float Vis = light_visibility(ld, worldPosition, l_vector); + float Vis = light_visibility(ld, P, l_vector); - vec3 Li = light_volume(ld, l_vector) * - light_volume_shadow(ld, worldPosition, l_vector, volumeExtinction); + vec3 Li = light_volume(ld, l_vector) * light_volume_shadow(ld, P, l_vector, volumeExtinction); outScattering.rgb += Li * Vis * s_scattering * - phase_function(-wdir, l_vector.xyz / l_vector.w, s_anisotropy); + phase_function(-V, l_vector.xyz / l_vector.w, s_anisotropy); } #endif From 2ce4a403d99ccd5c3d608ae9eae2f8b32ec835f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 01:04:33 +0100 Subject: [PATCH 351/519] Cleanup: EEVEE: Rename aperture to cone angle when it make sense Aperture for a cone is 2 times the cone angle. --- source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl | 2 +- .../blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 241b9240606..bc2895ef3df 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -135,7 +135,7 @@ void accumulate_light(vec3 light, float fac, inout vec4 accum) accum += vec4(light, 1.0) * min(fac, (1.0 - accum.a)); } -/* ----------- Cone Aperture Approximation --------- */ +/* ----------- Cone angle Approximation --------- */ /* Return a fitted cone angle given the input roughness */ float cone_cosine(float r) diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl index 20c3b64e07a..4abc313d7e3 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl @@ -34,7 +34,7 @@ float pdf_hemisphere() vec3 sample_ggx(vec3 rand, float a2) { - /* Theta is the aperture angle of the cone */ + /* Theta is the cone angle. */ float z = sqrt((1.0 - rand.x) / (1.0 + a2 * rand.x - rand.x)); /* cos theta */ float r = sqrt(max(0.0, 1.0f - z * z)); /* sin theta */ float x = r * rand.y; From ba43b4c04dd53d9935ce05c7c09ffe4bc8202d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 01:07:04 +0100 Subject: [PATCH 352/519] Cleanup: EEVEE: Rename variable named sample because ... .. it's a reserved keyword on GL > 4.0. --- source/blender/draw/engines/eevee/eevee_screen_raytrace.c | 6 +++--- .../draw/engines/eevee/shaders/effect_bloom_frag.glsl | 6 +++--- .../eevee/shaders/lightprobe_filter_diffuse_frag.glsl | 4 ++-- .../eevee/shaders/lightprobe_filter_visibility_frag.glsl | 6 +++--- .../blender/draw/engines/eevee/shaders/lightprobe_lib.glsl | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index 19b7a1ea2f6..97255f15d9b 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -245,13 +245,13 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v EEVEE_downsample_buffer(vedata, txl->color_double_buffer, 9); /* Resolve at fullres */ - int sample = (DRW_state_is_image_render()) ? effects->taa_render_sample : + int samp = (DRW_state_is_image_render()) ? effects->taa_render_sample : effects->taa_current_sample; /* Doing a neighbor shift only after a few iteration. * We wait for a prime number of cycles to avoid noise correlation. * This reduces variance faster. */ - effects->ssr_neighbor_ofs = ((sample / 5) % 8) * 4; - switch ((sample / 11) % 4) { + effects->ssr_neighbor_ofs = ((samp / 5) % 8) * 4; + switch ((samp / 11) % 4) { case 0: effects->ssr_halfres_ofs[0] = 0; effects->ssr_halfres_ofs[1] = 0; diff --git a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl index 489e87e9a7d..33d7347a377 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl @@ -177,11 +177,11 @@ vec4 step_blit(void) vec4 step_downsample(void) { #ifdef HIGH_QUALITY /* Anti flicker */ - vec3 sample = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); + vec3 samp = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); #else - vec3 sample = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); + vec3 samp = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize); #endif - return vec4(sample, 1.0); + return vec4(samp, 1.0); } vec4 step_upsample(void) diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl index 4c4cbb069fe..0d0ae6ea4a5 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_diffuse_frag.glsl @@ -108,8 +108,8 @@ void main() weight = texel_solid_angle(facecoord, halfpix); - vec4 sample = textureLod(probeHdr, cubevec, lodMax); - sh += sample.rgb * coef * weight; + vec4 samp = textureLod(probeHdr, cubevec, lodMax); + sh += samp.rgb * coef * weight; weight_accum += weight; } } diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl index a974e1d538d..b802b39c56e 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_visibility_frag.glsl @@ -80,9 +80,9 @@ void main() vec2 accum = vec2(0.0); for (float i = 0; i < sampleCount; i++) { - vec3 sample = sample_cone(i, invSampleCount, M_PI_2 * visibilityBlur, cos, T, B); - float depth = texture(probeDepth, sample).r; - depth = get_world_distance(depth, sample); + vec3 samp = sample_cone(i, invSampleCount, M_PI_2 * visibilityBlur, cos, T, B); + float depth = texture(probeDepth, samp).r; + depth = get_world_distance(depth, samp); accum += vec2(depth, depth * depth); } diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl index c1c0138e002..de384146b80 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl @@ -209,9 +209,9 @@ vec3 probe_evaluate_planar(int id, PlanarData pd, vec3 P, vec3 N, vec3 V, float /* TODO: If we support non-ssr planar reflection, we should blur them with gaussian * and chose the right mip depending on the cone footprint after projection */ /* NOTE: X is inverted here to compensate inverted drawing. */ - vec3 sample = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb; + vec3 radiance = textureLod(probePlanars, vec3(refco.xy * vec2(-0.5, 0.5) + 0.5, id), 0.0).rgb; - return sample; + return radiance; } void fallback_cubemap(vec3 N, From 48167644b7e9798ed7a38ffd5f7324fd99007900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 01:31:59 +0100 Subject: [PATCH 353/519] Fix T85603 EEVEE: Baking Indirect lighting crashes Blender Was caused by non initialized render_timesteps. --- source/blender/draw/engines/eevee/eevee_lightcache.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index c7c457711f5..145fddf62a0 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -914,6 +914,7 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__); stl->g_data->background_alpha = 1.0f; + stl->g_data->render_timesteps = 1; /* XXX TODO remove this. This is in order to make the init functions work. */ if (DRW_view_default_get() == NULL) { From 4dd782a1a39572a0515c076341f538a288226ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 21 Feb 2021 01:52:57 +0100 Subject: [PATCH 354/519] Fix T85714 Crash when Viewport Rending an image using EEVEE. Was caused by non initialized render_timesteps. --- source/blender/draw/engines/eevee/eevee_engine.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index d1238d7b82e..582bfad323b 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -66,6 +66,7 @@ static void eevee_engine_init(void *ved) stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL); stl->g_data->valid_taa_history = (txl->taa_history != NULL); stl->g_data->queued_shaders_count = 0; + stl->g_data->render_timesteps = 1; /* Main Buffer */ DRW_texture_ensure_fullscreen_2d(&txl->color, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP); From af37c3e8f169b2f519990a24d21ea3251c79711f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 21 Feb 2021 19:48:11 +1100 Subject: [PATCH 355/519] Cleanup: remove duplicate settings from operator_mesh_add template Also move align items into the enum call as there is no need to have this accessible from the class. --- .../modules/bpy_extras/object_utils.py | 11 ++++----- .../scripts/templates_py/operator_mesh_add.py | 23 +------------------ 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index 8d85c19d066..977cbc20f0d 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -172,14 +172,13 @@ class AddObjectHelper: if self.align == 'WORLD': self.rotation.zero() - align_items = ( - ('WORLD', "World", "Align the new object to the world"), - ('VIEW', "View", "Align the new object to the view"), - ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object") - ) align: EnumProperty( name="Align", - items=align_items, + items=( + ('WORLD', "World", "Align the new object to the world"), + ('VIEW', "View", "Align the new object to the view"), + ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object"), + ), default='WORLD', update=align_update_callback, ) diff --git a/release/scripts/templates_py/operator_mesh_add.py b/release/scripts/templates_py/operator_mesh_add.py index 01a9ad6160e..d0e92888d3b 100644 --- a/release/scripts/templates_py/operator_mesh_add.py +++ b/release/scripts/templates_py/operator_mesh_add.py @@ -45,7 +45,7 @@ from bpy.props import ( ) -class AddBox(bpy.types.Operator): +class AddBox(bpy.types.Operator, AddObjectHelper): """Add a simple box mesh""" bl_idname = "mesh.primitive_box_add" bl_label = "Add Box" @@ -76,27 +76,6 @@ class AddBox(bpy.types.Operator): options={'HIDDEN', 'SKIP_SAVE'}, ) - # generic transform props - align_items = ( - ('WORLD', "World", "Align the new object to the world"), - ('VIEW', "View", "Align the new object to the view"), - ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object") - ) - align: EnumProperty( - name="Align", - items=align_items, - default='WORLD', - update=AddObjectHelper.align_update_callback, - ) - location: FloatVectorProperty( - name="Location", - subtype='TRANSLATION', - ) - rotation: FloatVectorProperty( - name="Rotation", - subtype='EULER', - ) - def execute(self, context): verts_loc, faces = add_box( From c6ddb68b7a71c0f661967bb3fd84596063ea7a27 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 21 Feb 2021 20:53:18 +1100 Subject: [PATCH 356/519] Cleanup: remove unused layers property from template Also remove unused imports. --- .../scripts/templates_py/operator_mesh_add.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/release/scripts/templates_py/operator_mesh_add.py b/release/scripts/templates_py/operator_mesh_add.py index d0e92888d3b..aa5b9ebf880 100644 --- a/release/scripts/templates_py/operator_mesh_add.py +++ b/release/scripts/templates_py/operator_mesh_add.py @@ -2,6 +2,9 @@ import bpy import bmesh from bpy_extras.object_utils import AddObjectHelper +from bpy.props import ( + FloatProperty, +) def add_box(width, height, depth): """ @@ -36,15 +39,6 @@ def add_box(width, height, depth): return verts, faces -from bpy.props import ( - BoolProperty, - BoolVectorProperty, - EnumProperty, - FloatProperty, - FloatVectorProperty, -) - - class AddBox(bpy.types.Operator, AddObjectHelper): """Add a simple box mesh""" bl_idname = "mesh.primitive_box_add" @@ -69,12 +63,6 @@ class AddBox(bpy.types.Operator, AddObjectHelper): min=0.01, max=100.0, default=1.0, ) - layers: BoolVectorProperty( - name="Layers", - description="Object Layers", - size=20, - options={'HIDDEN', 'SKIP_SAVE'}, - ) def execute(self, context): From de67e3c0c02e9d08022cff58338099d287505f91 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 21 Feb 2021 21:15:13 +1100 Subject: [PATCH 357/519] PyAPI: expose bpy_prop_deferred function & keywords While not needed for Blender, Animation Nodes uses this information, expose this information for scripts to access that need it. --- source/blender/python/intern/bpy_props.c | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index c596f81a91c..2b3599df86e 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -227,6 +227,37 @@ static PyObject *bpy_prop_deferred_repr(BPy_PropDeferred *self) return PyUnicode_FromFormat("<%.200s, %R, %R>", Py_TYPE(self)->tp_name, self->fn, self->kw); } +/* Get/Set Items. */ + +/** + * Expose the function in case scripts need to introspect this information + * (not currently used by Blender it's self). + */ +static PyObject *bpy_prop_deferred_function_get(BPy_PropDeferred *self, void *UNUSED(closure)) +{ + PyObject *ret = self->fn; + Py_IncRef(ret); + return ret; +} + +/** + * Expose keywords in case scripts need to introspect this information + * (not currently used by Blender it's self). + */ +static PyObject *bpy_prop_deferred_keywords_get(BPy_PropDeferred *self, void *UNUSED(closure)) +{ + PyObject *ret = self->kw; + Py_IncRef(ret); + return ret; +} + +static PyGetSetDef bpy_prop_deferred_getset[] = { + {"function", (getter)bpy_prop_deferred_function_get, (setter)NULL, NULL, NULL}, + {"keywords", (getter)bpy_prop_deferred_keywords_get, (setter)NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ +}; + + PyTypeObject bpy_prop_deferred_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -239,6 +270,8 @@ PyTypeObject bpy_prop_deferred_Type = { .tp_traverse = (traverseproc)bpy_prop_deferred_traverse, .tp_clear = (inquiry)bpy_prop_deferred_clear, + + .tp_getset = bpy_prop_deferred_getset, }; static PyObject *bpy_prop_deferred_data_CreatePyObject(PyObject *fn, PyObject *kw) From 08dbc4f996e4e95f3ab64f7bb3e1193700c585f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 21 Feb 2021 21:21:18 +1100 Subject: [PATCH 358/519] PyAPI: use postponed annotations to support Python 3.10 Support Python 3.10a5 or 3.9x with support explicitly enabled. - Enable Python's postponed annotations for Blender's RNA classes types registered on startup. - Using postponed annotations has implications for how they are defined, since they must evaluate in the modules name-space instead of the classes name-space. See changes to annotations in `release/scripts`. - Use `from __future__ import annotations` at the top of the module to ensure the script will run with Python 3.10. - Old logic is kept since it could be used if PEP-649 is supported. Resolves T83626 Ref D10474 --- intern/cycles/blender/addon/__init__.py | 1 + intern/cycles/blender/addon/engine.py | 1 + intern/cycles/blender/addon/operators.py | 1 + intern/cycles/blender/addon/osl.py | 1 + intern/cycles/blender/addon/presets.py | 1 + intern/cycles/blender/addon/properties.py | 9 +-- intern/cycles/blender/addon/ui.py | 1 + intern/cycles/blender/addon/version_update.py | 1 + .../modules/bpy_extras/object_utils.py | 3 +- .../scripts/startup/bl_operators/__init__.py | 1 + .../startup/bl_operators/add_mesh_torus.py | 4 +- release/scripts/startup/bl_operators/anim.py | 1 + .../scripts/startup/bl_operators/assets.py | 3 + .../scripts/startup/bl_operators/console.py | 1 + .../startup/bl_operators/constraint.py | 1 + release/scripts/startup/bl_operators/node.py | 3 +- release/scripts/startup/bl_operators/wm.py | 9 ++- source/blender/python/intern/bpy_props.c | 16 +++- source/blender/python/intern/bpy_rna.c | 77 +++++++++++++++++++ 19 files changed, 123 insertions(+), 12 deletions(-) diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index b1deb5cb64e..10b95133912 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations bl_info = { "name": "Cycles Render Engine", diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 7595261f523..dfa696714fb 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations def _is_using_buggy_driver(): diff --git a/intern/cycles/blender/addon/operators.py b/intern/cycles/blender/addon/operators.py index 087e5b666a5..dca727e316e 100644 --- a/intern/cycles/blender/addon/operators.py +++ b/intern/cycles/blender/addon/operators.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy.types import Operator diff --git a/intern/cycles/blender/addon/osl.py b/intern/cycles/blender/addon/osl.py index 4c6e7952491..d4c3c447951 100644 --- a/intern/cycles/blender/addon/osl.py +++ b/intern/cycles/blender/addon/osl.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy import _cycles diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py index 78a8605e93f..04b18b38927 100644 --- a/intern/cycles/blender/addon/presets.py +++ b/intern/cycles/blender/addon/presets.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations from bl_operators.presets import AddPresetBase from bpy.types import Operator diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index dd218d93d32..0708c371a0e 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy.props import ( @@ -841,7 +842,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): ('MEGA', "Mega", ""), ('SPLIT', "Split", ""), ), - update=_devices_update_callback + update=CyclesRenderSettings._devices_update_callback ) debug_opencl_device_type: EnumProperty( @@ -855,11 +856,9 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): ('GPU', "GPU", ""), ('ACCELERATOR', "Accelerator", ""), ), - update=_devices_update_callback + update=CyclesRenderSettings._devices_update_callback ) - del _devices_update_callback - debug_use_opencl_debug: BoolProperty(name="Debug OpenCL", default=False) debug_opencl_mem_limit: IntProperty( @@ -1481,7 +1480,7 @@ class CyclesPreferences(bpy.types.AddonPreferences): compute_device_type: EnumProperty( name="Compute Device Type", description="Device to use for computation (rendering with Cycles)", - items=get_device_types, + items=CyclesPreferences.get_device_types, ) devices: bpy.props.CollectionProperty(type=CyclesDeviceSettings) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 4576cf4e413..68f6291b373 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy from bpy_extras.node_utils import find_node_input diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py index cdff3c2b915..aeecc265399 100644 --- a/intern/cycles/blender/addon/version_update.py +++ b/intern/cycles/blender/addon/version_update.py @@ -15,6 +15,7 @@ # # +from __future__ import annotations import bpy import math diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index 977cbc20f0d..8afb09882fd 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations __all__ = ( "add_object_align_init", @@ -180,7 +181,7 @@ class AddObjectHelper: ('CURSOR', "3D Cursor", "Use the 3D cursor orientation for the new object"), ), default='WORLD', - update=align_update_callback, + update=AddObjectHelper.align_update_callback, ) location: FloatVectorProperty( name="Location", diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py index e91d3b3ce60..7e6f14a0a51 100644 --- a/release/scripts/startup/bl_operators/__init__.py +++ b/release/scripts/startup/bl_operators/__init__.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations # support reloading sub-modules if "bpy" in locals(): diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py index c2f9a4189cf..0ebb6ae27e1 100644 --- a/release/scripts/startup/bl_operators/add_mesh_torus.py +++ b/release/scripts/startup/bl_operators/add_mesh_torus.py @@ -17,6 +17,8 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations + import bpy from bpy.types import Operator @@ -156,7 +158,7 @@ class AddTorus(Operator, object_utils.AddObjectHelper): ('EXT_INT', "Exterior/Interior", "Use the exterior/interior radii for torus dimensions"), ), - update=mode_update_callback, + update=AddTorus.mode_update_callback, ) major_radius: FloatProperty( name="Major Radius", diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py index 279b66a0833..85290bfe3f0 100644 --- a/release/scripts/startup/bl_operators/anim.py +++ b/release/scripts/startup/bl_operators/anim.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations if "bpy" in locals(): from importlib import reload diff --git a/release/scripts/startup/bl_operators/assets.py b/release/scripts/startup/bl_operators/assets.py index 317555280e5..e7fbb155b2f 100644 --- a/release/scripts/startup/bl_operators/assets.py +++ b/release/scripts/startup/bl_operators/assets.py @@ -16,6 +16,9 @@ # # ##### END GPL LICENSE BLOCK ##### +# +from __future__ import annotations + import bpy from bpy_extras.asset_utils import ( diff --git a/release/scripts/startup/bl_operators/console.py b/release/scripts/startup/bl_operators/console.py index bffac4eef55..231dade820d 100644 --- a/release/scripts/startup/bl_operators/console.py +++ b/release/scripts/startup/bl_operators/console.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy from bpy.types import Operator diff --git a/release/scripts/startup/bl_operators/constraint.py b/release/scripts/startup/bl_operators/constraint.py index 213122952ae..49fc6a04112 100644 --- a/release/scripts/startup/bl_operators/constraint.py +++ b/release/scripts/startup/bl_operators/constraint.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations from bpy.types import ( Operator, diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py index 1c5ebb4fa17..7884a7287b7 100644 --- a/release/scripts/startup/bl_operators/node.py +++ b/release/scripts/startup/bl_operators/node.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy import nodeitems_utils @@ -218,7 +219,7 @@ class NODE_OT_add_search(NodeAddOperator, Operator): node_item: EnumProperty( name="Node Type", description="Node type", - items=node_enum_items, + items=NODE_OT_add_search.node_enum_items, ) def execute(self, context): diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index c5457713d36..db15f4597bf 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -17,6 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### # +from __future__ import annotations import bpy from bpy.types import ( @@ -859,9 +860,7 @@ class WM_OT_url_open_preset(Operator): type: EnumProperty( name="Site", - items=lambda self, _context: ( - item for (item, _) in WM_OT_url_open_preset.preset_items - ), + items=WM_OT_url_open_preset._preset_items, ) id: StringProperty( @@ -916,6 +915,10 @@ class WM_OT_url_open_preset(Operator): "https://www.blender.org/about/credits/"), ] + @staticmethod + def _preset_items(_self, _context): + return (item for (item, _) in WM_OT_url_open_preset.preset_items) + def execute(self, context): url = None type = self.type diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 2b3599df86e..3cc894826bd 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -227,6 +227,20 @@ static PyObject *bpy_prop_deferred_repr(BPy_PropDeferred *self) return PyUnicode_FromFormat("<%.200s, %R, %R>", Py_TYPE(self)->tp_name, self->fn, self->kw); } +/** + * HACK: needed by `typing.get_type_hints` + * with `from __future__ import annotations` enabled or when using Python 3.10 or newer. + * + * When callable this object type passes the test for being an acceptable annotation. + */ +static PyObject *bpy_prop_deferred_call(BPy_PropDeferred *UNUSED(self), + PyObject *UNUSED(args), + PyObject *UNUSED(kw)) +{ + /* Dummy value. */ + Py_RETURN_NONE; +} + /* Get/Set Items. */ /** @@ -257,7 +271,6 @@ static PyGetSetDef bpy_prop_deferred_getset[] = { {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; - PyTypeObject bpy_prop_deferred_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -265,6 +278,7 @@ PyTypeObject bpy_prop_deferred_Type = { .tp_basicsize = sizeof(BPy_PropDeferred), .tp_dealloc = (destructor)bpy_prop_deferred_dealloc, .tp_repr = (reprfunc)bpy_prop_deferred_repr, + .tp_call = (ternaryfunc)bpy_prop_deferred_call, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 0c091d7cd7c..ae0d5b46458 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -80,6 +80,15 @@ #define USE_MATHUTILS #define USE_STRING_COERCE +/** + * This _must_ be enabled to support Python 3.10's postponed annotations, + * `from __future__ import annotations`. + * + * This has the disadvantage of evaluating strings at run-time, in the future we might be able to + * reinstate the older, more efficient logic using descriptors, see: pep-0649 + */ +#define USE_POSTPONED_ANNOTATIONS + /* Unfortunately Python needs to hold a global reference to the context. * If we remove this is means `bpy.context` won't be usable from some parts of the code: * `bpy.app.handler` callbacks for example. @@ -7935,6 +7944,65 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item return 0; } +/** + * Extract `__annotations__` using `typing.get_type_hints` which handles the delayed evaluation. + */ +static int pyrna_deferred_register_class_from_type_hints(StructRNA *srna, PyTypeObject *py_class) +{ + PyObject *annotations_dict = NULL; + + /* `typing.get_type_hints(py_class)` */ + { + PyObject *typing_mod = PyImport_ImportModuleLevel("typing", NULL, NULL, NULL, 0); + if (typing_mod != NULL) { + PyObject *get_type_hints_fn = PyObject_GetAttrString(typing_mod, "get_type_hints"); + if (get_type_hints_fn != NULL) { + PyObject *args = PyTuple_New(1); + + PyTuple_SET_ITEM(args, 0, (PyObject *)py_class); + Py_INCREF(py_class); + + annotations_dict = PyObject_CallObject(get_type_hints_fn, args); + + Py_DECREF(args); + Py_DECREF(get_type_hints_fn); + } + Py_DECREF(typing_mod); + } + } + + int ret = 0; + if (annotations_dict != NULL) { + if (PyDict_CheckExact(annotations_dict)) { + PyObject *item, *key; + Py_ssize_t pos = 0; + + while (PyDict_Next(annotations_dict, &pos, &key, &item)) { + ret = deferred_register_prop(srna, key, item); + if (ret != 0) { + break; + } + } + } + else { + /* Should never happen, an error wont have been raised, so raise one. */ + PyErr_Format(PyExc_TypeError, + "typing.get_type_hints returned: %.200s, expected dict\n", + Py_TYPE(annotations_dict)->tp_name); + ret = -1; + } + + Py_DECREF(annotations_dict); + } + else { + BLI_assert(PyErr_Occurred()); + fprintf(stderr, "typing.get_type_hints failed with: %.200s\n", py_class->tp_name); + ret = -1; + } + + return ret; +} + static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict) { PyObject *annotations_dict; @@ -7999,6 +8067,15 @@ int pyrna_deferred_register_class(StructRNA *srna, PyTypeObject *py_class) return 0; } +#ifdef USE_POSTPONED_ANNOTATIONS + const bool use_postponed_annotations = true; +#else + const bool use_postponed_annotations = false; +#endif + + if (use_postponed_annotations) { + return pyrna_deferred_register_class_from_type_hints(srna, py_class); + } return pyrna_deferred_register_class_recursive(srna, py_class); } From 0c62906a4145b242d5ed772209038f65d7b493a8 Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Sun, 21 Feb 2021 17:26:55 +0100 Subject: [PATCH 359/519] UI: Correct the text alignment in the quick setup (splash screen) dialog The "quick setup" dialog is actually a 'menu', and the "splash screen" block contains the UI_BLOCK_LOOP flag which causes the buttons' text to align to the left, however, usually regular buttons have centered text. As a workaround, add the UI_BLOCK_QUICK_SETUP flag which prevents the text from being left-aligned. Differential Revision: https://developer.blender.org/D10486 Reviewed by: Julian Eisel --- release/scripts/startup/bl_operators/wm.py | 22 +++++++------------ source/blender/editors/include/UI_interface.h | 2 ++ source/blender/editors/interface/interface.c | 3 ++- .../windowmanager/intern/wm_splash_screen.c | 21 +++++++++++++++++- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index db15f4597bf..3b94a964148 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2479,10 +2479,10 @@ class WM_OT_batch_rename(Operator): return wm.invoke_props_dialog(self, width=400) -class WM_MT_splash(Menu): - bl_label = "Splash" +class WM_MT_splash_quick_setup(Menu): + bl_label = "Quick Setup" - def draw_setup(self, context): + def draw(self, context): wm = context.window_manager # prefs = context.preferences @@ -2570,18 +2570,11 @@ class WM_MT_splash(Menu): layout.separator() layout.separator() + +class WM_MT_splash(Menu): + bl_label = "Splash" + def draw(self, context): - # Draw setup screen if no preferences have been saved yet. - import os - - userconfig_path = bpy.utils.user_resource('CONFIG') - userdef_path = os.path.join(userconfig_path, "userpref.blend") - - if not os.path.isfile(userdef_path): - self.draw_setup(context) - return - - # Pass layout = self.layout layout.operator_context = 'EXEC_DEFAULT' layout.emboss = 'PULLDOWN_MENU' @@ -2730,6 +2723,7 @@ classes = ( WM_OT_toolbar_prompt, BatchRenameAction, WM_OT_batch_rename, + WM_MT_splash_quick_setup, WM_MT_splash, WM_MT_splash_about, ) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index bc013953b1e..81641239c6a 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -166,6 +166,8 @@ enum { /** The block is only used during the search process and will not be drawn. * Currently just for the case of a closed panel's sub-panel (and its sub-panels). */ UI_BLOCK_SEARCH_ONLY = 1 << 25, + /** Hack for quick setup (splash screen) to draw text centered. */ + UI_BLOCK_QUICK_SETUP = 1 << 26, }; /** #uiPopupBlockHandle.menuretval */ diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 3fec88810c9..1aff68871e4 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -4060,7 +4060,8 @@ static uiBut *ui_def_but(uiBlock *block, but->drawflag |= UI_BUT_ICON_LEFT; } } - else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) || + else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block) && + !(block->flag & UI_BLOCK_QUICK_SETUP)) || ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_TEXT, diff --git a/source/blender/windowmanager/intern/wm_splash_screen.c b/source/blender/windowmanager/intern/wm_splash_screen.c index a3619a69152..ae726e73fe7 100644 --- a/source/blender/windowmanager/intern/wm_splash_screen.c +++ b/source/blender/windowmanager/intern/wm_splash_screen.c @@ -226,7 +226,26 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *region, void *UNUSE 0, style); - MenuType *mt = WM_menutype_find("WM_MT_splash", true); + MenuType *mt; + char userpref[FILE_MAX]; + const char *const cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, NULL); + + if (cfgdir) { + BLI_path_join(userpref, sizeof(userpref), cfgdir, BLENDER_USERPREF_FILE, NULL); + } + + /* Draw setup screen if no preferences have been saved yet. */ + if (!BLI_exists(userpref)) { + mt = WM_menutype_find("WM_MT_splash_quick_setup", true); + + /* The UI_BLOCK_QUICK_SETUP flag prevents the button text from being left-aligned, + as it is for all menus due to the UI_BLOCK_LOOP flag, see in 'ui_def_but'. */ + UI_block_flag_enable(block, UI_BLOCK_QUICK_SETUP); + } + else { + mt = WM_menutype_find("WM_MT_splash", true); + } + if (mt) { UI_menutype_draw(C, mt, layout); } From e6b7905fe6510a31893ca14383fd2cafafbc8e2f Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Sun, 21 Feb 2021 17:29:52 +0100 Subject: [PATCH 360/519] Fix memory leak when loading previous preferences from splash screen When opening a Blender version for which there are no preferences, the splash shows a button like "Load 2.92 Settings". Using this could cause a memory leak of the storage for recently opened files. --- source/blender/windowmanager/intern/wm_files.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 090c28a81a6..8bea2203abe 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -140,6 +140,7 @@ static RecentFile *wm_file_history_find(const char *filepath); static void wm_history_file_free(RecentFile *recent); +static void wm_history_files_free(void); static void wm_history_file_update(void); static void wm_history_file_write(void); @@ -1188,7 +1189,7 @@ void wm_history_file_read(void) lines = BLI_file_read_as_lines(name); - BLI_listbase_clear(&G.recent_files); + wm_history_files_free(); /* read list of recent opened files from recent-files.txt to memory */ for (l = lines, num = 0; l && (num < U.recent_files); l = l->next) { @@ -1219,6 +1220,13 @@ static void wm_history_file_free(RecentFile *recent) BLI_freelinkN(&G.recent_files, recent); } +static void wm_history_files_free(void) +{ + LISTBASE_FOREACH_MUTABLE (RecentFile *, recent, &G.recent_files) { + wm_history_file_free(recent); + } +} + static RecentFile *wm_file_history_find(const char *filepath) { return BLI_findstring_ptr(&G.recent_files, filepath, offsetof(RecentFile, filepath)); From 7883eb04ed3a3718a5a3b5e598c0e12eb9708d9f Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Sun, 21 Feb 2021 09:34:22 -0700 Subject: [PATCH 361/519] CMake/Deps: OpenEXR 2.5.5 --- build_files/build_environment/cmake/versions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 361c9fd9843..9cf9d2330fd 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -47,9 +47,9 @@ set(PTHREADS_VERSION 3.0.0) set(PTHREADS_URI http://sourceforge.mirrorservice.org/p/pt/pthreads4w/pthreads4w-code-v${PTHREADS_VERSION}.zip) set(PTHREADS_HASH f3bf81bb395840b3446197bcf4ecd653) -set(OPENEXR_VERSION 2.4.0) +set(OPENEXR_VERSION 2.5.5) set(OPENEXR_URI https://github.com/AcademySoftwareFoundation/openexr/archive/v${OPENEXR_VERSION}.tar.gz) -set(OPENEXR_HASH 9e4d69cf2a12c6fb19b98af7c5e0eaee) +set(OPENEXR_HASH 85e8a979092c9055d10ed103062d31a0) if(WIN32) # Openexr started appending _d on its own so now # we need to tell the build the postfix is _s while From a3f091d7ceda77181422625135225e55afa612c8 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Sun, 21 Feb 2021 17:57:03 -0500 Subject: [PATCH 362/519] Change Exact Boolean modifier to skip round trip through BMesh. The Exact modifier code had been written to avoid using BMesh but in the initial release the modifier still converted all Meshes to BMeshes, and then after running the boolean code on the BMeshes, converted the result back to a Mesh. This change skips that. Most of the work here is in getting the Custom Data layers right. The approach taken is to merge default layers from all operand meshes into the final result, and then use the original verts, edges, polys, and loops to copy or interpolate the appropriate custom data layers from all operands into the result. --- source/blender/blenkernel/BKE_customdata.h | 7 + .../blenkernel/BKE_mesh_boolean_convert.h | 38 + source/blender/blenkernel/CMakeLists.txt | 10 + source/blender/blenkernel/intern/customdata.c | 14 +- .../blenkernel/intern/mesh_boolean_convert.cc | 834 ++++++++++++++++++ source/blender/blenlib/intern/mesh_boolean.cc | 28 +- source/blender/modifiers/intern/MOD_boolean.c | 81 +- 7 files changed, 993 insertions(+), 19 deletions(-) create mode 100644 source/blender/blenkernel/BKE_mesh_boolean_convert.h create mode 100644 source/blender/blenkernel/intern/mesh_boolean_convert.cc diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 57fdafaf8d9..ed319948160 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -249,6 +249,13 @@ void CustomData_copy_data(const struct CustomData *source, int source_index, int dest_index, int count); +void CustomData_copy_data_layer(const CustomData *source, + CustomData *dest, + int src_layer_index, + int dst_layer_index, + int src_index, + int dst_index, + int count); void CustomData_copy_data_named(const struct CustomData *source, struct CustomData *dest, int source_index, diff --git a/source/blender/blenkernel/BKE_mesh_boolean_convert.h b/source/blender/blenkernel/BKE_mesh_boolean_convert.h new file mode 100644 index 00000000000..be5cbb305fa --- /dev/null +++ b/source/blender/blenkernel/BKE_mesh_boolean_convert.h @@ -0,0 +1,38 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2019 Blender Foundation. + * All rights reserved. + */ + +#pragma once + +/** \file + * \ingroup bke + */ + +#ifdef __cplusplus +extern "C" { +#endif + +Mesh *BKE_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const int boolean_mode); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 325744f4006..1e7986eedd9 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -172,6 +172,7 @@ set(SRC intern/mball.c intern/mball_tessellate.c intern/mesh.c + intern/mesh_boolean_convert.cc intern/mesh_convert.c intern/mesh_evaluate.c intern/mesh_fair.cc @@ -363,6 +364,7 @@ set(SRC BKE_mball.h BKE_mball_tessellate.h BKE_mesh.h + BKE_mesh_boolean_convert.h BKE_mesh_fair.h BKE_mesh_iterators.h BKE_mesh_mapping.h @@ -728,6 +730,14 @@ if(WITH_TBB) ) endif() +if(WITH_GMP) + add_definitions(-DWITH_GMP) + + list(APPEND INC_SYS + ${GMP_INCLUDE_DIRS} + ) + endif() + # # Warnings as errors, this is too strict! # if(MSVC) # string(APPEND CMAKE_C_FLAGS " /WX") diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 9188d8c1afd..ab57676fde3 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -2881,13 +2881,13 @@ void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, } } -static void CustomData_copy_data_layer(const CustomData *source, - CustomData *dest, - int src_i, - int dst_i, - int src_index, - int dst_index, - int count) +void CustomData_copy_data_layer(const CustomData *source, + CustomData *dest, + int src_i, + int dst_i, + int src_index, + int dst_index, + int count) { const LayerTypeInfo *typeInfo; diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc new file mode 100644 index 00000000000..807bb3534f6 --- /dev/null +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -0,0 +1,834 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + */ + +/** \file + * \ingroup bke + */ + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" + +#include "BKE_customdata.h" +#include "BKE_material.h" +#include "BKE_mesh.h" +#include "BKE_mesh_boolean_convert.h" + +#include "BLI_alloca.h" +#include "BLI_float2.hh" +#include "BLI_math.h" +#include "BLI_mesh_boolean.hh" +#include "BLI_mesh_intersect.hh" +#include "BLI_span.hh" + +namespace blender::meshintersect { + +#ifdef WITH_GMP + +constexpr int estimated_max_facelen = 100; /* Used for initial size of some Vectors. */ + +/* Snap entries that are near 0 or 1 or -1 to those values. + * Sometimes Blender's rotation matrices for multiples of 90 degrees have + * tiny numbers where there should be zeros. That messes makes some things + * every so slightly non-coplanar when users expect coplanarity, + * so this is a hack to clean up such matrices. + * Would be better to change the transformation code itself. + */ +static void clean_obmat(float cleaned[4][4], const float mat[4][4]) +{ + const float fuzz = 1e-6f; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + float f = mat[i][j]; + if (fabsf(f) <= fuzz) { + f = 0.0f; + } + else if (fabsf(f - 1.0f) <= fuzz) { + f = 1.0f; + } + else if (fabsf(f + 1.0f) <= fuzz) { + f = -1.0f; + } + cleaned[i][j] = f; + } + } +} + +/* Need to wrap this in a class to use it in an Array. */ +class TransMat { + public: + float mat[4][4]; +}; + +/* `MeshesToIMeshInfo` keeps track of information used when combining a number + * of `Mesh`es into a single `IMesh` for doing boolean on. + * Mostly this means keeping track of the index offsets for various mesh elements. */ +class MeshesToIMeshInfo { + public: + /* The input meshes, */ + Span meshes; + /* Numbering the vertices of the meshes in order of meshes, + * at what offset does the vertex range for mesh[i] start? */ + Array mesh_vert_offset; + /* Similarly for edges of meshes. */ + Array mesh_edge_offset; + /* Similarly for polys of meshes. */ + Array mesh_poly_offset; + /* For each Mesh vertex in all the meshes (with concatenated indexing), + * what is the IMesh Vert* allocated for it in the intput IMesh? */ + Array mesh_to_imesh_vert; + /* Similarly for each Mesh poly. */ + Array mesh_to_imesh_face; + /* Transformation matrix to transform a coordinate in the corresponding + * Mesh to the local space of the first Mesh. */ + Array to_obj0; + /* Total number of input mesh vertices. */ + int tot_meshes_verts; + /* Total number of input mesh edges. */ + int tot_meshes_edges; + /* Total number of input mesh polys. */ + int tot_meshes_polys; + + int input_mesh_for_imesh_vert(int imesh_v) const; + int input_mesh_for_imesh_edge(int imesh_e) const; + int input_mesh_for_imesh_face(int imesh_f) const; + const MPoly *input_mpoly_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_orig_mesh_index, + int *r_index_in_orig_mesh) const; + const MVert *input_mvert_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const; + const MEdge *input_medge_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const; +}; + +/* Given an index `imesh_v` in the `IMesh`, return the index of the + * input `Mesh` that contained the `MVert` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_vert(int imesh_v) const +{ + int n = static_cast(mesh_vert_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_v < mesh_vert_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index `imesh_e` used as an original index in the `IMesh`, + * return the index of the input `Mesh` that contained the `MVert` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_edge(int imesh_e) const +{ + int n = static_cast(mesh_edge_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_e < mesh_edge_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index `imesh_f` in the `IMesh`, return the index of the + * input `Mesh` that contained the `MPoly` that it came from. */ +int MeshesToIMeshInfo::input_mesh_for_imesh_face(int imesh_f) const +{ + int n = static_cast(mesh_poly_offset.size()); + for (int i = 0; i < n - 1; ++i) { + if (imesh_f < mesh_poly_offset[i + 1]) { + return i; + } + } + return n - 1; +} + +/* Given an index of an original face in the `IMesh`, find out the input + * `Mesh` that it came from and return it in `*r_orig_mesh`, + * and also return the index of that `Mesh` in `*r_orig_mesh_index`. + * Finally, return the index of the corresponding `MPoly` in that `Mesh` + * in `*r_index_in_orig_mesh`. */ +const MPoly *MeshesToIMeshInfo::input_mpoly_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_orig_mesh_index, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_face(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_poly_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totpoly); + const MPoly *mp = &me->mpoly[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_orig_mesh_index) { + *r_orig_mesh_index = orig_mesh_index; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return mp; +} + +/* Given an index of an original vertex in the `IMesh`, find out the input + * `Mesh` that it came from and return it in `*r_orig_mesh`. + * Also find the index of the `MVert` in that `Mesh` and return it in + * `*r_index_in_orig_mesh`. */ +const MVert *MeshesToIMeshInfo::input_mvert_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_vert(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_vert_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totvert); + const MVert *mv = &me->mvert[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return mv; +} + +/* Similarly for edges. */ +const MEdge *MeshesToIMeshInfo::input_medge_for_orig_index(int orig_index, + const Mesh **r_orig_mesh, + int *r_index_in_orig_mesh) const +{ + int orig_mesh_index = input_mesh_for_imesh_edge(orig_index); + BLI_assert(0 <= orig_mesh_index && orig_mesh_index < meshes.size()); + const Mesh *me = meshes[orig_mesh_index]; + int index_in_mesh = orig_index - mesh_edge_offset[orig_mesh_index]; + BLI_assert(0 <= index_in_mesh && index_in_mesh < me->totedge); + const MEdge *medge = &me->medge[index_in_mesh]; + if (r_orig_mesh) { + *r_orig_mesh = me; + } + if (r_index_in_orig_mesh) { + *r_index_in_orig_mesh = index_in_mesh; + } + return medge; +} + +/** Convert all of the meshes in `meshes` to an `IMesh` and return that. + * All of the coordinates are transformed into the local space of the + * first Mesh. To do this transformation, we also need the transformation + * obmats corresponding to the Meshes, so they are in the `obmats` argument. + * The 'original' indexes in the IMesh are the indexes you get by + * a scheme that offsets each MVert, MEdge, and MPoly index by the sum of the + * vertices, edges, and polys in the preceding Meshes in the mesh span. + * The `*r_info class` is filled in with information needed to make the + * correspondence between the Mesh MVerts/MPolys and the IMesh Verts/Faces. + * All allocation of memory for the IMesh comes from `arena`. + */ +static IMesh meshes_to_imesh(Span meshes, + const float (*obmats[])[4][4], + IMeshArena &arena, + MeshesToIMeshInfo *r_info) +{ + int nmeshes = meshes.size(); + BLI_assert(nmeshes > 0); + r_info->meshes = meshes; + r_info->tot_meshes_verts = 0; + r_info->tot_meshes_polys = 0; + int &totvert = r_info->tot_meshes_verts; + int &totedge = r_info->tot_meshes_edges; + int &totpoly = r_info->tot_meshes_polys; + for (const Mesh *me : meshes) { + totvert += me->totvert; + totedge += me->totedge; + totpoly += me->totpoly; + } + + /* Estimate the number of vertices and faces in the boolean output, + * so that the memory arena can reserve some space. It is OK if these + * estimates are wrong. */ + const int estimate_num_outv = 3 * totvert; + const int estimate_num_outf = 4 * totpoly; + arena.reserve(estimate_num_outv, estimate_num_outf); + r_info->mesh_to_imesh_vert = Array(totvert); + r_info->mesh_to_imesh_face = Array(totpoly); + r_info->mesh_vert_offset = Array(nmeshes); + r_info->mesh_edge_offset = Array(nmeshes); + r_info->mesh_poly_offset = Array(nmeshes); + r_info->to_obj0 = Array(nmeshes); + int v = 0; + int e = 0; + int f = 0; + + /* Put these Vectors here, with a size unlikely to need resizing, + * so that the loop to make new Faces will likely not need to allocate + * over and over. */ + Vector face_vert; + Vector face_edge_orig; + + /* To convert the coordinates of objects 1, 2, etc. into the local space + * of object 0, we multiply each object's `obmat` by the inverse of + * object 0's `obmat`. Exact Boolean works better if these matrices + * are 'cleaned' -- see the comment for the `clean_obmat` function, above. */ + float obj0_mat[4][4]; + float inv_obj0_mat[4][4]; + if (obmats[0] == nullptr) { + unit_m4(obj0_mat); + unit_m4(inv_obj0_mat); + } + else { + clean_obmat(obj0_mat, *obmats[0]); + invert_m4_m4(inv_obj0_mat, obj0_mat); + } + + /* For each input `Mesh`, make `Vert`s and `Face`s for the corresponding + * `MVert`s and `MPoly`s, and keep track of the original indices (using the + * concatenating offset scheme) inside the `Vert`s and `Face`s. + * When making `Face`s, we also put in the original indices for `MEdge`s that + * make up the `MPoly`s using the same scheme. */ + for (int mi : meshes.index_range()) { + float objn_to_obj0_mat[4][4]; + const Mesh *me = meshes[mi]; + if (mi == 0) { + r_info->mesh_vert_offset[mi] = 0; + r_info->mesh_edge_offset[mi] = 0; + r_info->mesh_poly_offset[mi] = 0; + unit_m4(r_info->to_obj0[0].mat); + } + else { + r_info->mesh_vert_offset[mi] = v; + r_info->mesh_edge_offset[mi] = e; + r_info->mesh_poly_offset[mi] = f; + /* Get matrix that transforms a coordinate in objects[mi]'s local space + * to object[0]'s local space.*/ + float objn_mat[4][4]; + if (obmats[mi] == nullptr) { + unit_m4(objn_mat); + } + else { + clean_obmat(objn_mat, *obmats[mi]); + } + mul_m4_m4m4(objn_to_obj0_mat, inv_obj0_mat, objn_mat); + copy_m4_m4(r_info->to_obj0[mi].mat, objn_to_obj0_mat); + } + for (int vi = 0; vi < me->totvert; ++vi) { + float co[3]; + copy_v3_v3(co, me->mvert[vi].co); + if (mi > 0) { + mul_m4_v3(objn_to_obj0_mat, co); + } + r_info->mesh_to_imesh_vert[v] = arena.add_or_find_vert(mpq3(co[0], co[1], co[2]), v); + ++v; + } + for (const MPoly &poly : Span(me->mpoly, me->totpoly)) { + int flen = poly.totloop; + face_vert.clear(); + face_edge_orig.clear(); + const MLoop *l = &me->mloop[poly.loopstart]; + for (int i = 0; i < flen; ++i) { + int mverti = r_info->mesh_vert_offset[mi] + l->v; + const Vert *fv = r_info->mesh_to_imesh_vert[mverti]; + face_vert.append(fv); + face_edge_orig.append(e + l->e); + ++l; + } + r_info->mesh_to_imesh_face[f] = arena.add_face(face_vert, f, face_edge_orig); + ++f; + } + e += me->totedge; + } + return IMesh(r_info->mesh_to_imesh_face); +} + +/* Copy vertex attributes, including customdata, from `orig_mv` to `mv`. + * `mv` is in `dest_mesh` with index `mv_index`. + * The `orig_mv` vertex came from Mesh `orig_me` and had index `index_in_orig_me` there. */ +static void copy_vert_attributes(Mesh *dest_mesh, + MVert *mv, + const MVert *orig_mv, + const Mesh *orig_me, + int mv_index, + int index_in_orig_me) +{ + mv->bweight = orig_mv->bweight; + mv->flag = orig_mv->flag; + + /* For all layers in the orig mesh, copy the layer information. */ + CustomData *target_cd = &dest_mesh->vdata; + const CustomData *source_cd = &orig_me->vdata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + /* The (first) CD_MVERT layer is the same as dest_mesh->vdata, so we've + * already set the coordinate to the right value. */ + if (ty == CD_MVERT) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + /* Not all layers were merged in target: some are marked CD_FLAG_NOCOPY + * and some are not in the CD_MASK_MESH.vdata. */ + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mv_index, 1); + } + } +} + +/* Similar to copy_vert_attributes but for poly attributes. */ +static void copy_poly_attributes(Mesh *dest_mesh, + MPoly *mp, + const MPoly *orig_mp, + const Mesh *orig_me, + int mp_index, + int index_in_orig_me) +{ + mp->mat_nr = orig_mp->mat_nr; + if (mp->mat_nr >= dest_mesh->totcol) { + mp->mat_nr = 0; + } + mp->flag = orig_mp->flag; + CustomData *target_cd = &dest_mesh->pdata; + const CustomData *source_cd = &orig_me->pdata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MPOLY) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, mp_index, 1); + } + } +} + +/* Similar to copy_vert_attributes but for edge attributes. */ +static void copy_edge_attributes(Mesh *dest_mesh, + MEdge *medge, + const MEdge *orig_medge, + const Mesh *orig_me, + int medge_index, + int index_in_orig_me) +{ + medge->bweight = orig_medge->bweight; + medge->crease = orig_medge->crease; + medge->flag = orig_medge->flag; + CustomData *target_cd = &dest_mesh->edata; + const CustomData *source_cd = &orig_me->edata; + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MEDGE) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, index_in_orig_me, medge_index, 1); + } + } +} + +/* For Imesh face `f`, with corresponding output Mesh poly `mp`, + * where the original Mesh poly is `orig_mp`, coming from the Mesh + * `orig_me`, which has index `orig_me_index` in `mim`: + * fill in the `orig_loops` Array with corresponding indices of MLoops from `orig_me` + * where they have the same start and end vertices; for cases where that is + * not true, put -1 in the `orig_loops` slot. + * For now, we only try to do this if `mp` and `orig_mp` have the same size. + * Return the number of non-null MLoops filled in. + */ +static int fill_orig_loops(const Face *f, + const MPoly *orig_mp, + const Mesh *orig_me, + int orig_me_index, + MeshesToIMeshInfo &mim, + Array &orig_loops) +{ + orig_loops.fill(-1); + int orig_mplen = orig_mp->totloop; + if (f->size() != orig_mplen) { + return 0; + } + BLI_assert(orig_loops.size() == orig_mplen); + /* We'll look for the case where the first vertex in f has an original vertex + * that is the same as one in orig_me (after correcting for offset in mim meshes). + * Then see that loop and any subsequent ones have the same start and end vertex. + * This may miss some cases of partial alignment, but that's OK since discovering + * aligned loops is only an optimization to avoid some reinterpolation. + */ + int first_orig_v = f->vert[0]->orig; + if (first_orig_v == NO_INDEX) { + return 0; + } + /* It is possible that the original vert was merged with another in another mesh. */ + if (orig_me_index != mim.input_mesh_for_imesh_vert(first_orig_v)) { + return 0; + } + int orig_me_vert_offset = mim.mesh_vert_offset[orig_me_index]; + int first_orig_v_in_orig_me = first_orig_v - orig_me_vert_offset; + BLI_assert(0 <= first_orig_v_in_orig_me && first_orig_v_in_orig_me < orig_me->totvert); + /* Assume all vertices in an mpoly are unique. */ + int offset = -1; + for (int i = 0; i < orig_mplen; ++i) { + int loop_i = i + orig_mp->loopstart; + if (orig_me->mloop[loop_i].v == first_orig_v_in_orig_me) { + offset = i; + break; + } + } + if (offset == -1) { + return 0; + } + int num_orig_loops_found = 0; + for (int mp_loop_index = 0; mp_loop_index < orig_mplen; ++mp_loop_index) { + int orig_mp_loop_index = (mp_loop_index + offset) % orig_mplen; + MLoop *l = &orig_me->mloop[orig_mp->loopstart + orig_mp_loop_index]; + int fv_orig = f->vert[mp_loop_index]->orig; + if (fv_orig != NO_INDEX) { + fv_orig -= orig_me_vert_offset; + if (fv_orig < 0 || fv_orig >= orig_me->totvert) { + fv_orig = NO_INDEX; + } + } + if (l->v == fv_orig) { + MLoop *lnext = &orig_me->mloop[orig_mp->loopstart + ((orig_mp_loop_index + 1) % orig_mplen)]; + int fvnext_orig = f->vert[(mp_loop_index + 1) % orig_mplen]->orig; + if (fvnext_orig != NO_INDEX) { + fvnext_orig -= orig_me_vert_offset; + if (fvnext_orig < 0 || fvnext_orig >= orig_me->totvert) { + fvnext_orig = NO_INDEX; + } + } + if (lnext->v == fvnext_orig) { + orig_loops[mp_loop_index] = orig_mp->loopstart + orig_mp_loop_index; + ++num_orig_loops_found; + } + } + } + return num_orig_loops_found; +} + +/* Fill `cos_2d` with the 2d coordinates found by projection MPoly `mp` along + * its normal. Also fill in r_axis_mat with the matrix that does that projection. + * But before projecting, also transform the 3d coordinate by multiplying by trans_mat. + * `cos_2d` should have room for `mp->totloop` entries. */ +static void get_poly2d_cos(const Mesh *me, + const MPoly *mp, + float (*cos_2d)[2], + const TransMat &trans_mat, + float r_axis_mat[3][3]) +{ + int n = mp->totloop; + + /* Project coordinates to 2d in cos_2d, using normal as projection axis. */ + float axis_dominant[3]; + BKE_mesh_calc_poly_normal(mp, &me->mloop[mp->loopstart], me->mvert, axis_dominant); + axis_dominant_v3_to_m3(r_axis_mat, axis_dominant); + MLoop *ml = &me->mloop[mp->loopstart]; + const MVert *mverts = me->mvert; + for (int i = 0; i < n; ++i) { + float co[3]; + copy_v3_v3(co, mverts[ml->v].co); + mul_m4_v3(trans_mat.mat, co); + mul_v2_m3v3(cos_2d[i], r_axis_mat, co); + ++ml; + } +} + +/* For the loops of `mp`, see if the face is unchanged from `orig_mp`, and if so, + * copy the Loop attributes from corresponding loops to corresponding loops. + * Otherwise, interpolate the Loop attributes in the face `orig_mp`. */ +static void copy_or_interp_loop_attributes(Mesh *dest_mesh, + const Face *f, + MPoly *mp, + const MPoly *orig_mp, + const Mesh *orig_me, + int orig_me_index, + MeshesToIMeshInfo &mim) +{ + Array orig_loops(mp->totloop); + int norig = fill_orig_loops(f, orig_mp, orig_me, orig_me_index, mim, orig_loops); + /* We may need these arrays if we have to interpolate Loop attributes rather than just copy. + * Right now, trying Array complains, so declare cos_2d a different way. */ + float(*cos_2d)[2]; + Array weights; + Array src_blocks_ofs; + float axis_mat[3][3]; + if (norig != mp->totloop) { + /* We will need to interpolate. Make `cos_2d` hold 2d-projected coordinates of `orig_mp`, + * which are transformed into object 0's local space before projecting. + * At this point we cannot yet calculate the interpolation weights, as they depend on + * the coordinate where interpolation is to happen, but we can allocate the needed arrays, + * so they don't have to be allocated per-layer. */ + cos_2d = BLI_array_alloca(cos_2d, orig_mp->totloop); + weights = Array(orig_mp->totloop); + src_blocks_ofs = Array(orig_mp->totloop); + get_poly2d_cos(orig_me, orig_mp, cos_2d, mim.to_obj0[orig_me_index], axis_mat); + } + CustomData *target_cd = &dest_mesh->ldata; + for (int i = 0; i < mp->totloop; ++i) { + int loop_index = mp->loopstart + i; + int orig_loop_index = norig > 0 ? orig_loops[i] : -1; + const CustomData *source_cd = &orig_me->ldata; + if (orig_loop_index == -1) { + /* Will need interpolation weights for this loop's vertex's coordinates. + * The coordinate needs to be projected into 2d, just like the interpolating polygon's + * coordinates were. The `dest_mesh` coordinates are already in object 0 local space. */ + float co[2]; + mul_v2_m3v3(co, axis_mat, dest_mesh->mvert[dest_mesh->mloop[loop_index].v].co); + interp_weights_poly_v2(weights.data(), cos_2d, orig_mp->totloop, co); + } + for (int source_layer_i = 0; source_layer_i < source_cd->totlayer; ++source_layer_i) { + int ty = source_cd->layers[source_layer_i].type; + if (ty == CD_MLOOP) { + continue; + } + const char *name = source_cd->layers[source_layer_i].name; + int target_layer_i = CustomData_get_named_layer_index(target_cd, ty, name); + if (target_layer_i == -1) { + continue; + } + if (orig_loop_index != -1) { + CustomData_copy_data_layer( + source_cd, target_cd, source_layer_i, target_layer_i, orig_loop_index, loop_index, 1); + } + else { + /* Note: although CustomData_bmesh_interp_n function has bmesh in its name, nothing about + * it is BMesh-specific. We can't use CustomData_interp because it assumes that + * all source layers exist in the dest. + * A non bmesh version could have the benefit of not copying data into src_blocks_ofs - + * using the contiguous data instead. TODO: add to the custom data API. */ + int target_layer_type_index = CustomData_get_named_layer(target_cd, ty, name); + int source_layer_type_index = source_layer_i - source_cd->typemap[ty]; + BLI_assert(target_layer_type_index != -1 && source_layer_type_index >= 0); + for (int j = 0; j < orig_mp->totloop; ++j) { + src_blocks_ofs[j] = CustomData_get_n( + source_cd, ty, orig_mp->loopstart + j, source_layer_type_index); + } + void *dst_block_ofs = CustomData_get_n(target_cd, ty, loop_index, target_layer_type_index); + CustomData_bmesh_interp_n(target_cd, + src_blocks_ofs.data(), + weights.data(), + nullptr, + orig_mp->totloop, + dst_block_ofs, + target_layer_i); + } + } + } +} + +/** Make sure that there are custom data layers in the target mesh + * corresponding to all target layers in all of the operands after the first. + * (The target should already have layers for those in the first operand mesh). + * Edges done separately -- will have to be done later, after edges are made. + */ +static void merge_vertex_loop_poly_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim) +{ + for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) { + const Mesh *me = mim.meshes[mesh_index]; + if (me->totvert) { + CustomData_merge( + &me->vdata, &target->vdata, CD_MASK_MESH.vmask, CD_DEFAULT, target->totvert); + } + if (me->totloop) { + CustomData_merge( + &me->ldata, &target->ldata, CD_MASK_MESH.lmask, CD_DEFAULT, target->totloop); + } + if (me->totpoly) { + CustomData_merge( + &me->pdata, &target->pdata, CD_MASK_MESH.pmask, CD_DEFAULT, target->totpoly); + } + } +} + +static void merge_edge_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim) +{ + for (int mesh_index = 1; mesh_index < mim.meshes.size(); ++mesh_index) { + const Mesh *me = mim.meshes[mesh_index]; + if (me->totedge) { + CustomData_merge( + &me->edata, &target->edata, CD_MASK_MESH.emask, CD_DEFAULT, target->totedge); + } + } +} + +/** Convert the output IMesh im to a Blender Mesh, + * using the information in mim to get all the attributes right. + */ +static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim) +{ + constexpr int dbg_level = 0; + + im->populate_vert(); + int out_totvert = im->vert_size(); + int out_totpoly = im->face_size(); + int out_totloop = 0; + for (const Face *f : im->faces()) { + out_totloop += f->size(); + } + /* Will calculate edges later. */ + Mesh *result = BKE_mesh_new_nomain_from_template( + mim.meshes[0], out_totvert, 0, 0, out_totloop, out_totpoly); + + merge_vertex_loop_poly_customdata_layers(result, mim); + /* Set the vertex coordinate values and other data. */ + for (int vi : im->vert_index_range()) { + const Vert *v = im->vert(vi); + MVert *mv = &result->mvert[vi]; + copy_v3fl_v3db(mv->co, v->co); + if (v->orig != NO_INDEX) { + const Mesh *orig_me; + int index_in_orig_me; + const MVert *orig_mv = mim.input_mvert_for_orig_index(v->orig, &orig_me, &index_in_orig_me); + copy_vert_attributes(result, mv, orig_mv, orig_me, vi, index_in_orig_me); + } + } + + /* Set the loopstart and totloop for each output poly, + * and set the vertices in the appropriate loops. */ + int cur_loop_index = 0; + MLoop *l = result->mloop; + for (int fi : im->face_index_range()) { + const Face *f = im->face(fi); + const Mesh *orig_me; + int index_in_orig_me; + int orig_me_index; + const MPoly *orig_mp = mim.input_mpoly_for_orig_index( + f->orig, &orig_me, &orig_me_index, &index_in_orig_me); + MPoly *mp = &result->mpoly[fi]; + mp->totloop = f->size(); + mp->loopstart = cur_loop_index; + for (int j : f->index_range()) { + const Vert *vf = f->vert[j]; + const int vfi = im->lookup_vert(vf); + l->v = vfi; + ++l; + ++cur_loop_index; + } + copy_poly_attributes(result, mp, orig_mp, orig_me, fi, index_in_orig_me); + copy_or_interp_loop_attributes(result, f, mp, orig_mp, orig_me, orig_me_index, mim); + } + + /* BKE_mesh_calc_edges will calculate and populate all the + * MEdges from the MPolys. */ + BKE_mesh_calc_edges(result, false, false); + merge_edge_customdata_layers(result, mim); + + /* Now that the MEdges are populated, we can copy over the required attributes and custom layers. + */ + for (int fi : im->face_index_range()) { + const Face *f = im->face(fi); + MPoly *mp = &result->mpoly[fi]; + for (int j : f->index_range()) { + if (f->edge_orig[j] != NO_INDEX) { + const Mesh *orig_me; + int index_in_orig_me; + const MEdge *orig_medge = mim.input_medge_for_orig_index( + f->edge_orig[j], &orig_me, &index_in_orig_me); + int e_index = result->mloop[mp->loopstart + j].e; + MEdge *medge = &result->medge[e_index]; + copy_edge_attributes(result, medge, orig_medge, orig_me, e_index, index_in_orig_me); + } + } + } + + BKE_mesh_calc_normals(result); + if (dbg_level > 0) { + BKE_mesh_validate(result, true, true); + } + return result; +} + +/* Do Exact Boolean directly, without a round trip through BMesh. + * The Mesh operands are in `meshes`, with corresponding transfprms in in `obmats`. */ +static Mesh *direct_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const BoolOpType boolean_mode) +{ + const int dbg_level = 0; + if (meshes_len <= 0) { + return nullptr; + } + if (dbg_level > 0) { + std::cout << "\nDIRECT_MESH_INTERSECT, nmeshes = " << meshes_len << "\n"; + } + Span mesh_span(meshes, meshes_len); + MeshesToIMeshInfo mim; + IMeshArena arena; + IMesh m_in = meshes_to_imesh(mesh_span, obmats, arena, &mim); + std::function shape_fn = [&mim](int f) { + for (int mi = 0; mi < mim.mesh_poly_offset.size() - 1; ++mi) { + if (f < mim.mesh_poly_offset[mi + 1]) { + return mi; + } + } + return static_cast(mim.mesh_poly_offset.size()) - 1; + }; + IMesh m_out = boolean_mesh(m_in, boolean_mode, meshes_len, shape_fn, use_self, nullptr, &arena); + if (dbg_level > 1) { + std::cout << m_out; + write_obj_mesh(m_out, "m_out"); + } + + return imesh_to_mesh(&m_out, mim); +} + +#endif // WITH_GMP +} // namespace blender::meshintersect + +extern "C" { + +#ifdef WITH_GMP +/* Do a mesh boolean directly on meshes (without going back and forth to BMesh). + * The \a meshes argument is an array of \a meshes_len of Mesh pointers. + * The \a obmats argument is an array of \a meshes_len of pointers to the obmat + * matrices that transform local coordinates to global ones. It is allowed + * for the pointers to be nullptr, meaning the transformation is the identity. */ +Mesh *BKE_mesh_boolean(const Mesh **meshes, + const float (*obmats[])[4][4], + const int meshes_len, + const bool use_self, + const int boolean_mode) +{ + return blender::meshintersect::direct_mesh_boolean( + meshes, + obmats, + meshes_len, + use_self, + static_cast(boolean_mode)); +} + +#else +Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes), + const Object **UNUSED(objects), + const int UNUSED(meshes_len), + const bool UNUSED(use_self), + const int UNUSED(boolean_mode)) +{ + return NULL; +} + +#endif + +} // extern "C" \ No newline at end of file diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index bfc1e4b01d3..defcb414c86 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -2605,6 +2605,26 @@ static int find_cdt_edge(const CDT_result &cdt_out, int v1, int v2) return -1; } +/* Return the original edge id for the cdt output edge e_out, given that + * the only input to CDT was face f. Pick the first, if there are several. */ +static int orig_edge_for_cdt_edge(const CDT_result &cdt_out, + int cdt_e_out, + const Face *f) +{ + for (int cdt_e_orig : cdt_out.edge_orig[cdt_e_out]) { + if (cdt_e_orig != NO_INDEX) { + BLI_assert(cdt_e_orig >= cdt_out.face_edge_offset); + int a = cdt_e_orig / cdt_out.face_edge_offset; + int b = cdt_e_orig % cdt_out.face_edge_offset; + /* It is the bth position within cdt input face a - 1. There is only one face, f. */ + BLI_assert(a == 1); + BLI_assert(b < f->size()); + return f->edge_orig[b]; + } + } + return NO_INDEX; +} + /** * Tessellate face f into triangles and return an array of `const Face *` * giving that triangulation. @@ -2660,13 +2680,7 @@ static Array triangulate_poly(Face *f, IMeshArena *arena) for (int i = 0; i < 3; ++i) { int e_out = find_cdt_edge(cdt_out, i_v_out[i], i_v_out[(i + 1) % 3]); BLI_assert(e_out != -1); - eo[i] = NO_INDEX; - for (int orig : cdt_out.edge_orig[e_out]) { - if (orig != NO_INDEX) { - eo[i] = orig; - break; - } - } + eo[i] = orig_edge_for_cdt_edge(cdt_out, e_out, f); } if (rev) { ans[t] = arena->add_face( diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index e290fd9dab7..070ba3a1bcf 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -49,6 +49,7 @@ #include "BKE_lib_query.h" #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_mesh_boolean_convert.h" #include "BKE_mesh_wrapper.h" #include "BKE_modifier.h" #include "BKE_screen.h" @@ -70,12 +71,17 @@ #include "tools/bmesh_boolean.h" #include "tools/bmesh_intersect.h" -// #define DEBUG_TIME #ifdef DEBUG_TIME # include "PIL_time.h" # include "PIL_time_utildefines.h" #endif +#ifdef WITH_GMP +const bool bypass_bmesh = true; +#else +const bool bypass_bmesh = false; +#endif + static void initData(ModifierData *md) { BooleanModifierData *bmd = (BooleanModifierData *)md; @@ -600,6 +606,68 @@ static Mesh *collection_boolean_exact(BooleanModifierData *bmd, return result; } +#ifdef WITH_GMP +/* New method: bypass trip through BMesh. */ +static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, + const ModifierEvalContext *ctx, + Mesh *mesh) +{ + Mesh *result; + Mesh *mesh_operand; + Mesh **meshes = NULL; + const float(**obmats)[4][4] = NULL; + BLI_array_declare(meshes); + BLI_array_declare(obmats); + +# ifdef DEBUG_TIME + TIMEIT_START(boolean_bmesh); +# endif + + BLI_array_append(meshes, mesh); + BLI_array_append(obmats, &ctx->object->obmat); + if (bmd->flag & eBooleanModifierFlag_Object) { + if (bmd->object == NULL) { + return mesh; + } + mesh_operand = BKE_modifier_get_evaluated_mesh_from_evaluated_object(bmd->object, false); + BKE_mesh_wrapper_ensure_mdata(mesh_operand); + BLI_array_append(meshes, mesh_operand); + BLI_array_append(obmats, &bmd->object->obmat); + } + else if (bmd->flag & eBooleanModifierFlag_Collection) { + Collection *collection = bmd->collection; + /* Allow collection to be empty: then target mesh will just removed self-intersections. */ + if (collection) { + FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, ob) { + if (ob->type == OB_MESH && ob != ctx->object) { + Mesh *collection_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob, false); + BKE_mesh_wrapper_ensure_mdata(collection_mesh); + BLI_array_append(meshes, collection_mesh); + BLI_array_append(obmats, &ob->obmat); + } + } + FOREACH_COLLECTION_OBJECT_RECURSIVE_END; + } + } + + const bool use_self = (bmd->flag & eBooleanModifierFlag_Self) != 0; + result = BKE_mesh_boolean((const Mesh **)meshes, + (const float(**)[4][4])obmats, + BLI_array_len(meshes), + use_self, + bmd->operation); + + BLI_array_free(meshes); + BLI_array_free(obmats); + +# ifdef DEBUG_TIME + TIMEIT_END(boolean_bmesh); +# endif + + return result; +} +#endif + static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { BooleanModifierData *bmd = (BooleanModifierData *)md; @@ -607,12 +675,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * Mesh *result = mesh; Mesh *mesh_operand_ob; BMesh *bm; - Collection *col = bmd->collection; + Collection *collection = bmd->collection; bool is_flip = false; const bool confirm_return = true; #ifdef WITH_GMP const bool use_exact = bmd->solver == eBooleanModifierSolver_Exact; + if (use_exact && bypass_bmesh) { + return exact_boolean_mesh(bmd, ctx, mesh); + } #else const bool use_exact = false; #endif @@ -692,12 +763,12 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } else { - if (col == NULL && !use_exact) { + if (collection == NULL && !use_exact) { return result; } /* Return result for certain errors. */ - if (BMD_error_messages(ctx->object, md, col) == confirm_return) { + if (BMD_error_messages(ctx->object, md, collection) == confirm_return) { return result; } @@ -705,7 +776,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * result = collection_boolean_exact(bmd, ctx, mesh); } else { - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (col, operand_ob) { + FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, operand_ob) { if (operand_ob->type == OB_MESH && operand_ob != ctx->object) { mesh_operand_ob = BKE_modifier_get_evaluated_mesh_from_evaluated_object(operand_ob, From af940c68cbed7e840d6ae58f2645ff12ed6abffb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 22 Feb 2021 00:00:56 +0100 Subject: [PATCH 363/519] Fix Cycles world volume scattering missing light in some cases With very large distances there were precision / overflow errors, normalize the average albedo to avoid that. This was causing test failures on macOS Arm, but also other architectures had slightly wrong results. Ref T78710 --- intern/cycles/kernel/kernel_volume.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index 2e73da166b9..e46b0436107 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -840,7 +840,7 @@ ccl_device void kernel_volume_decoupled_record(KernelGlobals *kg, /* compute average albedo for channel sampling */ if (closure_flag & SD_SCATTER) { - accum_albedo += dt * safe_divide_color(coeff.sigma_s, sigma_t); + accum_albedo += (dt / ray->t) * safe_divide_color(coeff.sigma_s, sigma_t); } /* compute accumulated transmittance */ From 29a28a87e43da4d8727f574babad91d17e754fb5 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Sun, 21 Feb 2021 22:11:59 -0500 Subject: [PATCH 364/519] Added a cast needed to shut up an error in last commit. --- source/blender/blenkernel/intern/mesh_boolean_convert.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index 807bb3534f6..b546550a85f 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -578,7 +578,7 @@ static void copy_or_interp_loop_attributes(Mesh *dest_mesh, * At this point we cannot yet calculate the interpolation weights, as they depend on * the coordinate where interpolation is to happen, but we can allocate the needed arrays, * so they don't have to be allocated per-layer. */ - cos_2d = BLI_array_alloca(cos_2d, orig_mp->totloop); + cos_2d = (float(*)[2])BLI_array_alloca(cos_2d, orig_mp->totloop); weights = Array(orig_mp->totloop); src_blocks_ofs = Array(orig_mp->totloop); get_poly2d_cos(orig_me, orig_mp, cos_2d, mim.to_obj0[orig_me_index], axis_mat); From b4147aeeab7d34552a7b7bfe45a9d03217bcdc33 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 22 Feb 2021 10:29:34 +0100 Subject: [PATCH 365/519] Cleanup: unused variable --- source/blender/blenlib/intern/mesh_boolean.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index defcb414c86..fffa37b935b 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -2618,6 +2618,7 @@ static int orig_edge_for_cdt_edge(const CDT_result &cdt_out, int b = cdt_e_orig % cdt_out.face_edge_offset; /* It is the bth position within cdt input face a - 1. There is only one face, f. */ BLI_assert(a == 1); + UNUSED_VARS_NDEBUG(a); BLI_assert(b < f->size()); return f->edge_orig[b]; } From 06212759bc7285a131c3ee811aec1ee240841c2c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 22 Feb 2021 21:20:48 +1100 Subject: [PATCH 366/519] Fix missing NULL check on macOS when system-python isn't found Regression from cafd6b519c5f5c4b67d0dfe3d453cd4223b38716. D10494 by @ysano with edits. --- source/blender/python/intern/bpy_interface.c | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 9fea65935e1..c5f5e9c71b8 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -419,16 +419,19 @@ void BPY_python_start(bContext *C, int argc, const char **argv) /* Allow to use our own included Python. `py_path_bundle` may be NULL. */ { const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); -# ifdef __APPLE__ - /* OSX allow file/directory names to contain : character (represented as / in the Finder) - * but current Python lib (release 3.1.1) doesn't handle these correctly */ - if (strchr(py_path_bundle, ':')) { - fprintf(stderr, - "Warning! Blender application is located in a path containing ':' or '/' chars\n" - "This may make python import function fail\n"); - } -# endif if (py_path_bundle != NULL) { + +# ifdef __APPLE__ + /* Mac-OS allows file/directory names to contain `:` character + * (represented as `/` in the Finder) but current Python lib (as of release 3.1.1) + * doesn't handle these correctly. */ + if (strchr(py_path_bundle, ':')) { + fprintf(stderr, + "Warning! Blender application is located in a path containing ':' or '/' chars\n" + "This may make python import function fail\n"); + } +# endif /* __APPLE__ */ + status = PyConfig_SetBytesString(&config, &config.home, py_path_bundle); pystatus_exit_on_error(status); } From 623ddc4aa6fc4006308fdbd9c7172d1fc7efcf17 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 22 Feb 2021 11:37:31 +0100 Subject: [PATCH 367/519] Fix i18n messages extraction tool after update to support py 3.10. The new defferred approach broke existing way to access items from struct definition... See T85872. --- release/scripts/modules/bl_i18n_utils/bl_extract_messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 8e0832fe8da..9e59a245cc4 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -862,7 +862,7 @@ def dump_messages(do_messages, do_checks, settings): dump_src_messages(msgs, reports, settings) # Get strings from addons' categories. - for uid, label, tip in bpy.types.WindowManager.addon_filter[1]['items'](bpy.context.window_manager, bpy.context): + for uid, label, tip in bpy.types.WindowManager.addon_filter.keywords['items'](bpy.context.window_manager, bpy.context): process_msg(msgs, settings.DEFAULT_CONTEXT, label, "Add-ons' categories", reports, None, settings) if tip: process_msg(msgs, settings.DEFAULT_CONTEXT, tip, "Add-ons' categories", reports, None, settings) From 78c3caf3c1b87f449837b11c903ddeaf00afe7b9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 22 Feb 2021 22:26:20 +1100 Subject: [PATCH 368/519] Fix crash auto-completing bpy.types in the Python console Reference counting error in dc61a63e3f1bb3773677fb009fd787af7bd5c727 --- source/blender/python/intern/bpy_rna.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index ae0d5b46458..189d8308c14 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -7729,7 +7729,7 @@ static PyObject *bpy_types_module_dir(PyObject *self) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(submodule_dict, &pos, &key, &value)) { - PyList_APPEND(ret, key); + PyList_Append(ret, key); } return ret; } From 086d70e910a09185e220169342367a0c95ade0fc Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 22 Feb 2021 08:26:45 -0300 Subject: [PATCH 369/519] GPU Python: Use 'PyC_ParseStringEnum' to parse items Currently the GPU module for python has different ways to handle enums. - Organizing items in `PyC_StringEnumItems` arrays and parsing them with `PyC_ParseStringEnum`. - Using dedicated functions for each type of enum (`bpygpu_ParsePrimType`, `pygpu_ParseVertCompType` and `pygpu_ParseVertFetchMode`). Although apparently more efficient (especially `pygpu_ParseVertCompType` which transforms strings into integers for simple comparison), these dedicated functions duplicate functionality, increase the complexity of the code and consequently make it less readable. Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D10456 --- release/scripts/addons | 2 +- source/blender/python/gpu/gpu_py.c | 17 ++- source/blender/python/gpu/gpu_py.h | 1 + source/blender/python/gpu/gpu_py_api.c | 45 ------ source/blender/python/gpu/gpu_py_api.h | 2 - source/blender/python/gpu/gpu_py_batch.c | 44 +++--- source/blender/python/gpu/gpu_py_element.c | 21 ++- .../blender/python/gpu/gpu_py_vertex_format.c | 144 ++++-------------- source/tools | 2 +- 9 files changed, 78 insertions(+), 200 deletions(-) diff --git a/release/scripts/addons b/release/scripts/addons index dfeb905d62a..f01d08b7c5f 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit dfeb905d62ae6d759d8da930f291e73505e6ca67 +Subproject commit f01d08b7c5f7873e0ce8a77b84788e2f6b1ad716 diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c index 35cc945e76c..2c5daaf1962 100644 --- a/source/blender/python/gpu/gpu_py.c +++ b/source/blender/python/gpu/gpu_py.c @@ -23,6 +23,7 @@ #include +#include "GPU_primitive.h" #include "GPU_texture.h" #include "../generic/py_capi_utils.h" @@ -30,9 +31,23 @@ #include "gpu_py.h" /* own include */ /* -------------------------------------------------------------------- */ -/** \name GPU Module +/** \name GPU Enums * \{ */ +struct PyC_StringEnumItems bpygpu_primtype_items[] = { + {GPU_PRIM_POINTS, "POINTS"}, + {GPU_PRIM_LINES, "LINES"}, + {GPU_PRIM_TRIS, "TRIS"}, + {GPU_PRIM_LINE_STRIP, "LINE_STRIP"}, + {GPU_PRIM_LINE_LOOP, "LINE_LOOP"}, + {GPU_PRIM_TRI_STRIP, "TRI_STRIP"}, + {GPU_PRIM_TRI_FAN, "TRI_FAN"}, + {GPU_PRIM_LINES_ADJ, "LINES_ADJ"}, + {GPU_PRIM_TRIS_ADJ, "TRIS_ADJ"}, + {GPU_PRIM_LINE_STRIP_ADJ, "LINE_STRIP_ADJ"}, + {0, NULL}, +}; + struct PyC_StringEnumItems bpygpu_dataformat_items[] = { {GPU_DATA_FLOAT, "FLOAT"}, {GPU_DATA_INT, "INT"}, diff --git a/source/blender/python/gpu/gpu_py.h b/source/blender/python/gpu/gpu_py.h index 8a96391664f..28b3e41a08f 100644 --- a/source/blender/python/gpu/gpu_py.h +++ b/source/blender/python/gpu/gpu_py.h @@ -20,4 +20,5 @@ #pragma once +extern struct PyC_StringEnumItems bpygpu_primtype_items[]; extern struct PyC_StringEnumItems bpygpu_dataformat_items[]; diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 38e9b61e147..7213dc59886 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -31,7 +31,6 @@ #include "../generic/python_utildefines.h" #include "GPU_init_exit.h" -#include "GPU_primitive.h" #include "gpu_py_matrix.h" #include "gpu_py_select.h" @@ -58,50 +57,6 @@ bool bpygpu_is_init_or_error(void) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Primitive Type Utils - * \{ */ - -int bpygpu_ParsePrimType(PyObject *o, void *p) -{ - Py_ssize_t mode_id_len; - const char *mode_id = PyUnicode_AsUTF8AndSize(o, &mode_id_len); - if (mode_id == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } -#define MATCH_ID(id) \ - if (mode_id_len == strlen(STRINGIFY(id))) { \ - if (STREQ(mode_id, STRINGIFY(id))) { \ - mode = GPU_PRIM_##id; \ - goto success; \ - } \ - } \ - ((void)0) - - GPUPrimType mode; - MATCH_ID(POINTS); - MATCH_ID(LINES); - MATCH_ID(TRIS); - MATCH_ID(LINE_STRIP); - MATCH_ID(LINE_LOOP); - MATCH_ID(TRI_STRIP); - MATCH_ID(TRI_FAN); - MATCH_ID(LINES_ADJ); - MATCH_ID(TRIS_ADJ); - MATCH_ID(LINE_STRIP_ADJ); - -#undef MATCH_ID - PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", mode_id); - return 0; - -success: - (*(GPUPrimType *)p) = mode; - return 1; -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name GPU Module * \{ */ diff --git a/source/blender/python/gpu/gpu_py_api.h b/source/blender/python/gpu/gpu_py_api.h index fe645d8cd3a..5e399a233aa 100644 --- a/source/blender/python/gpu/gpu_py_api.h +++ b/source/blender/python/gpu/gpu_py_api.h @@ -24,8 +24,6 @@ * However, it is currently of little use. */ // #define BPYGPU_USE_GPUOBJ_FREE_METHOD -int bpygpu_ParsePrimType(PyObject *o, void *p); - PyObject *BPyInit_gpu(void); bool bpygpu_is_init_or_error(void); diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c index 0e4cc4d2219..9989077670b 100644 --- a/source/blender/python/gpu/gpu_py_batch.c +++ b/source/blender/python/gpu/gpu_py_batch.c @@ -38,12 +38,14 @@ #include "../generic/py_capi_utils.h" +#include "gpu_py.h" #include "gpu_py_api.h" -#include "gpu_py_batch.h" /* own include */ #include "gpu_py_element.h" #include "gpu_py_shader.h" #include "gpu_py_vertex_buffer.h" +#include "gpu_py_batch.h" /* own include */ + /* -------------------------------------------------------------------- */ /** \name Utility Functions * \{ */ @@ -69,50 +71,44 @@ static PyObject *pygpu_batch__tp_new(PyTypeObject *UNUSED(type), PyObject *args, const char *exc_str_missing_arg = "GPUBatch.__new__() missing required argument '%s' (pos %d)"; - struct { - GPUPrimType type_id; - BPyGPUVertBuf *py_vertbuf; - BPyGPUIndexBuf *py_indexbuf; - } params = {GPU_PRIM_NONE, NULL, NULL}; + struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE}; + BPyGPUVertBuf *py_vertbuf = NULL; + BPyGPUIndexBuf *py_indexbuf = NULL; static const char *_keywords[] = {"type", "buf", "elem", NULL}; static _PyArg_Parser _parser = {"|$O&O!O!:GPUBatch.__new__", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - bpygpu_ParsePrimType, - ¶ms.type_id, + PyC_ParseStringEnum, + &prim_type, &BPyGPUVertBuf_Type, - ¶ms.py_vertbuf, + &py_vertbuf, &BPyGPUIndexBuf_Type, - ¶ms.py_indexbuf)) { + &py_indexbuf)) { return NULL; } - if (params.type_id == GPU_PRIM_NONE) { - PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[0], 1); - return NULL; - } + BLI_assert(prim_type.value_found != GPU_PRIM_NONE); - if (params.py_vertbuf == NULL) { + if (py_vertbuf == NULL) { PyErr_Format(PyExc_TypeError, exc_str_missing_arg, _keywords[1], 2); return NULL; } - GPUBatch *batch = GPU_batch_create(params.type_id, - params.py_vertbuf->buf, - params.py_indexbuf ? params.py_indexbuf->elem : NULL); + GPUBatch *batch = GPU_batch_create( + prim_type.value_found, py_vertbuf->buf, py_indexbuf ? py_indexbuf->elem : NULL); BPyGPUBatch *ret = (BPyGPUBatch *)BPyGPUBatch_CreatePyObject(batch); #ifdef USE_GPU_PY_REFERENCES - ret->references = PyList_New(params.py_indexbuf ? 2 : 1); - PyList_SET_ITEM(ret->references, 0, (PyObject *)params.py_vertbuf); - Py_INCREF(params.py_vertbuf); + ret->references = PyList_New(py_indexbuf ? 2 : 1); + PyList_SET_ITEM(ret->references, 0, (PyObject *)py_vertbuf); + Py_INCREF(py_vertbuf); - if (params.py_indexbuf != NULL) { - PyList_SET_ITEM(ret->references, 1, (PyObject *)params.py_indexbuf); - Py_INCREF(params.py_indexbuf); + if (py_indexbuf != NULL) { + PyList_SET_ITEM(ret->references, 1, (PyObject *)py_indexbuf); + Py_INCREF(py_indexbuf); } PyObject_GC_Track(ret); diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c index f43338c42d2..0e5094cbbc0 100644 --- a/source/blender/python/gpu/gpu_py_element.c +++ b/source/blender/python/gpu/gpu_py_element.c @@ -32,6 +32,7 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" +#include "gpu_py.h" #include "gpu_py_api.h" #include "gpu_py_element.h" /* own include */ @@ -46,10 +47,8 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar const char *error_prefix = "IndexBuf.__new__"; bool ok = true; - struct { - GPUPrimType type_id; - PyObject *seq; - } params; + struct PyC_StringEnum prim_type = {bpygpu_primtype_items, GPU_PRIM_NONE}; + PyObject *seq; uint verts_per_prim; uint index_len; @@ -58,11 +57,11 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar static const char *_keywords[] = {"type", "seq", NULL}; static _PyArg_Parser _parser = {"$O&O:IndexBuf.__new__", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast( - args, kwds, &_parser, bpygpu_ParsePrimType, ¶ms.type_id, ¶ms.seq)) { + args, kwds, &_parser, PyC_ParseStringEnum, &prim_type, &seq)) { return NULL; } - verts_per_prim = GPU_indexbuf_primitive_len(params.type_id); + verts_per_prim = GPU_indexbuf_primitive_len(prim_type.value_found); if (verts_per_prim == -1) { PyErr_Format(PyExc_ValueError, "The argument 'type' must be " @@ -70,10 +69,10 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar return NULL; } - if (PyObject_CheckBuffer(params.seq)) { + if (PyObject_CheckBuffer(seq)) { Py_buffer pybuffer; - if (PyObject_GetBuffer(params.seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) { + if (PyObject_GetBuffer(seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) { /* PyObject_GetBuffer already handles error messages. */ return NULL; } @@ -97,7 +96,7 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar /* The `vertex_len` parameter is only used for asserts in the Debug build. */ /* Not very useful in python since scripts are often tested in Release build. */ /* Use `INT_MAX` instead of the actual number of vertices. */ - GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX); + GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX); #if 0 uint *buf = pybuffer.buf; @@ -111,7 +110,7 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar PyBuffer_Release(&pybuffer); } else { - PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix); + PyObject *seq_fast = PySequence_Fast(seq, error_prefix); if (seq_fast == NULL) { return false; @@ -126,7 +125,7 @@ static PyObject *pygpu_IndexBuf__tp_new(PyTypeObject *UNUSED(type), PyObject *ar /* The `vertex_len` parameter is only used for asserts in the Debug build. */ /* Not very useful in python since scripts are often tested in Release build. */ /* Use `INT_MAX` instead of the actual number of vertices. */ - GPU_indexbuf_init(&builder, params.type_id, index_len, INT_MAX); + GPU_indexbuf_init(&builder, prim_type.value_found, index_len, INT_MAX); if (verts_per_prim == 1) { for (uint i = 0; i < seq_len; i++) { diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c index 67f612f8ba3..343cf06b20a 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.c +++ b/source/blender/python/gpu/gpu_py_vertex_format.c @@ -32,115 +32,31 @@ #include "gpu_py_vertex_format.h" /* own include */ -#ifdef __BIG_ENDIAN__ -/* big endian */ -# define MAKE_ID2(c, d) ((c) << 8 | (d)) -# define MAKE_ID3(a, b, c) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8) -# define MAKE_ID4(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -/* little endian */ -# define MAKE_ID2(c, d) ((d) << 8 | (c)) -# define MAKE_ID3(a, b, c) ((int)(c) << 16 | (b) << 8 | (a)) -# define MAKE_ID4(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - /* -------------------------------------------------------------------- */ /** \name Enum Conversion * * Use with PyArg_ParseTuple's "O&" formatting. * \{ */ -static int pygpu_vertformat_parse_component_type(const char *str, int length) -{ - if (length == 2) { - switch (*((ushort *)str)) { - case MAKE_ID2('I', '8'): - return GPU_COMP_I8; - case MAKE_ID2('U', '8'): - return GPU_COMP_U8; - default: - break; - } - } - else if (length == 3) { - switch (*((uint *)str)) { - case MAKE_ID3('I', '1', '6'): - return GPU_COMP_I16; - case MAKE_ID3('U', '1', '6'): - return GPU_COMP_U16; - case MAKE_ID3('I', '3', '2'): - return GPU_COMP_I32; - case MAKE_ID3('U', '3', '2'): - return GPU_COMP_U32; - case MAKE_ID3('F', '3', '2'): - return GPU_COMP_F32; - case MAKE_ID3('I', '1', '0'): - return GPU_COMP_I10; - default: - break; - } - } - return -1; -} +static struct PyC_StringEnumItems pygpu_vertcomptype_items[] = { + {GPU_COMP_I8, "I8"}, + {GPU_COMP_U8, "U8"}, + {GPU_COMP_I16, "I16"}, + {GPU_COMP_U16, "U16"}, + {GPU_COMP_I32, "I32"}, + {GPU_COMP_U32, "U32"}, + {GPU_COMP_F32, "F32"}, + {GPU_COMP_I10, "I10"}, + {0, NULL}, +}; -static int pygpu_vertformat_parse_fetch_mode(const char *str, int length) -{ -#define MATCH_ID(id) \ - if (length == strlen(STRINGIFY(id))) { \ - if (STREQ(str, STRINGIFY(id))) { \ - return GPU_FETCH_##id; \ - } \ - } \ - ((void)0) - - MATCH_ID(FLOAT); - MATCH_ID(INT); - MATCH_ID(INT_TO_FLOAT_UNIT); - MATCH_ID(INT_TO_FLOAT); -#undef MATCH_ID - - return -1; -} - -static int pygpu_ParseVertCompType(PyObject *o, void *p) -{ - Py_ssize_t length; - const char *str = PyUnicode_AsUTF8AndSize(o, &length); - - if (str == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } - - const int comp_type = pygpu_vertformat_parse_component_type(str, length); - if (comp_type == -1) { - PyErr_Format(PyExc_ValueError, "unknown component type: '%s", str); - return 0; - } - - *((GPUVertCompType *)p) = comp_type; - return 1; -} - -static int pygpu_ParseVertFetchMode(PyObject *o, void *p) -{ - Py_ssize_t length; - const char *str = PyUnicode_AsUTF8AndSize(o, &length); - - if (str == NULL) { - PyErr_Format(PyExc_ValueError, "expected a string, got %s", Py_TYPE(o)->tp_name); - return 0; - } - - const int fetch_mode = pygpu_vertformat_parse_fetch_mode(str, length); - if (fetch_mode == -1) { - PyErr_Format(PyExc_ValueError, "unknown type literal: '%s'", str); - return 0; - } - - (*(GPUVertFetchMode *)p) = fetch_mode; - return 1; -} +static struct PyC_StringEnumItems pygpu_vertfetchmode_items[] = { + {GPU_FETCH_FLOAT, "FLOAT"}, + {GPU_FETCH_INT, "INT"}, + {GPU_FETCH_INT_TO_FLOAT_UNIT, "INT_TO_FLOAT_UNIT"}, + {GPU_FETCH_INT_TO_FLOAT, "INT_TO_FLOAT"}, + {0, NULL}, +}; /** \} */ @@ -181,12 +97,10 @@ PyDoc_STRVAR( " :type fetch_mode: `str`\n"); static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds) { - struct { - const char *id; - GPUVertCompType comp_type; - uint len; - GPUVertFetchMode fetch_mode; - } params; + const char *id; + uint len; + struct PyC_StringEnum comp_type = {pygpu_vertcomptype_items, GPU_COMP_I8}; + struct PyC_StringEnum fetch_mode = {pygpu_vertfetchmode_items, GPU_FETCH_FLOAT}; if (self->fmt.attr_len == GPU_VERT_ATTR_MAX_LEN) { PyErr_SetString(PyExc_ValueError, "Maximum attr reached " STRINGIFY(GPU_VERT_ATTR_MAX_LEN)); @@ -198,17 +112,17 @@ static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *arg if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, - ¶ms.id, - pygpu_ParseVertCompType, - ¶ms.comp_type, - ¶ms.len, - pygpu_ParseVertFetchMode, - ¶ms.fetch_mode)) { + &id, + PyC_ParseStringEnum, + &comp_type, + &len, + PyC_ParseStringEnum, + &fetch_mode)) { return NULL; } uint attr_id = GPU_vertformat_attr_add( - &self->fmt, params.id, params.comp_type, params.len, params.fetch_mode); + &self->fmt, id, comp_type.value_found, len, fetch_mode.value_found); return PyLong_FromLong(attr_id); } diff --git a/source/tools b/source/tools index dd131bc4f95..2afbb8ec472 160000 --- a/source/tools +++ b/source/tools @@ -1 +1 @@ -Subproject commit dd131bc4f95103efa60ce11cafbf174efd7b3d4e +Subproject commit 2afbb8ec472cac5102eb239f57b006f8c9387685 From c44c611c6d8c6ae071b48efb5fc07168f18cd17e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 22 Feb 2021 22:58:03 +1100 Subject: [PATCH 370/519] PyAPI: expose unstable type bpy.props._PropertyDeferred Even though this might change, rigify, animation-nodes & translation extraction depend on being able to extract this information. --- source/blender/python/intern/bpy_props.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 3cc894826bd..b2812e0eba7 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -271,10 +271,17 @@ static PyGetSetDef bpy_prop_deferred_getset[] = { {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; +PyDoc_STRVAR(bpy_prop_deferred_doc, + "Intermediate storage for properties before registration.\n" + "\n" + ".. note::\n" + "\n" + " This is not part of the stable API and may change between releases."); + PyTypeObject bpy_prop_deferred_Type = { PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "bpy_prop_deferred", + .tp_name = "_PropertyDeferred", .tp_basicsize = sizeof(BPy_PropDeferred), .tp_dealloc = (destructor)bpy_prop_deferred_dealloc, .tp_repr = (reprfunc)bpy_prop_deferred_repr, @@ -282,6 +289,7 @@ PyTypeObject bpy_prop_deferred_Type = { .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_doc = bpy_prop_deferred_doc, .tp_traverse = (traverseproc)bpy_prop_deferred_traverse, .tp_clear = (inquiry)bpy_prop_deferred_clear, @@ -3762,6 +3770,7 @@ PyObject *BPY_rna_props(void) if (PyType_Ready(&bpy_prop_deferred_Type) < 0) { return NULL; } + PyModule_AddType(submodule, &bpy_prop_deferred_Type); return submodule; } From e497c1b93ca518f6eac50b95f95ad48ec0221113 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Mon, 22 Feb 2021 10:06:16 +0100 Subject: [PATCH 371/519] Fix T85865: Crash when selecting Image texture node Typo in rB7470c10601d0. Maniphest Tasks: T85865 Differential Revision: https://developer.blender.org/D10496 --- source/blender/editors/space_node/node_edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 30eee416b12..e261e11d713 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -703,7 +703,7 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node, bool *r_acti } } - LISTBASE_FOREACH (World *, wo, &bmain->materials) { + LISTBASE_FOREACH (World *, wo, &bmain->worlds) { if (wo->nodetree && wo->use_nodes && ntreeHasTree(wo->nodetree, ntree)) { GPU_material_free(&wo->gpumaterial); } From 1a5027449aafc55c571ad125fd2c81f22a3fc42a Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Mon, 22 Feb 2021 12:24:22 +0100 Subject: [PATCH 372/519] Fix proportional connected not working with loose edges due to hidden geometry This was introduced in the new geodesic distances algorithm for proportional editing. When all faces of an edge are hidden, that edge should be considered as loose geometry. Initial patch by Pablo with modifications by Brecht. Differential Revision: https://developer.blender.org/D10488 --- source/blender/bmesh/bmesh_class.h | 3 +- .../transform/transform_convert_mesh.c | 44 ++++++++++++++----- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index 65f3d8bbad3..7cbad1ed069 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -373,7 +373,8 @@ enum { BM_ELEM_DRAW = (1 << 5), /* edge display */ /* spare tag, assumed dirty, use define in each function to name based on use */ - // _BM_ELEM_TAG_ALT = (1 << 6), // UNUSED + BM_ELEM_TAG_ALT = (1 << 6), + /** * For low level internal API tagging, * since tools may want to tag verts and not have functions clobber them. diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c index 5e2eca13f90..7270763c4e4 100644 --- a/source/blender/editors/transform/transform_convert_mesh.c +++ b/source/blender/editors/transform/transform_convert_mesh.c @@ -306,6 +306,24 @@ static bool bmesh_test_dist_add(BMVert *v0, return false; } +static bool bmesh_test_loose_edge(BMEdge *edge) +{ + /* Actual loose edge. */ + if (edge->l == NULL) { + return true; + } + + /* Loose edge due to hidden adjacent faces. */ + BMIter iter; + BMFace *face; + BM_ITER_ELEM (face, &iter, edge, BM_FACES_OF_EDGE) { + if (BM_elem_flag_test(face, BM_ELEM_HIDDEN) == 0) { + return false; + } + } + return true; +} + /** * \param mtx: Measure distance in this space. * \param dists: Store the closest connected distance to selected vertices. @@ -319,6 +337,9 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BLI_LINKSTACK_DECLARE(queue, BMEdge *); /* any BM_ELEM_TAG'd edge is in 'queue_next', so we don't add in twice */ + const int tag_queued = BM_ELEM_TAG; + const int tag_loose = BM_ELEM_TAG_ALT; + BLI_LINKSTACK_DECLARE(queue_next, BMEdge *); BLI_LINKSTACK_INIT(queue); @@ -366,7 +387,8 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, if (dists[i1] != FLT_MAX || dists[i2] != FLT_MAX) { BLI_LINKSTACK_PUSH(queue, e); } - BM_elem_flag_disable(e, BM_ELEM_TAG); + BM_elem_flag_disable(e, tag_queued); + BM_elem_flag_set(e, tag_loose, bmesh_test_loose_edge(e)); } } @@ -379,7 +401,7 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, int i1 = BM_elem_index_get(v1); int i2 = BM_elem_index_get(v2); - if (e->l == NULL || (dists[i1] == FLT_MAX || dists[i2] == FLT_MAX)) { + if (BM_elem_flag_test(e, tag_loose) || (dists[i1] == FLT_MAX || dists[i2] == FLT_MAX)) { /* Propagate along edge from vertex with smallest to largest distance. */ if (dists[i1] > dists[i2]) { SWAP(int, i1, i2); @@ -392,16 +414,16 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BMEdge *e_other; BMIter eiter; BM_ITER_ELEM (e_other, &eiter, v2, BM_EDGES_OF_VERT) { - if (e_other != e && BM_elem_flag_test(e_other, BM_ELEM_TAG) == 0 && - (e->l == NULL || e_other->l == NULL)) { - BM_elem_flag_enable(e_other, BM_ELEM_TAG); + if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 && + (BM_elem_flag_test(e, tag_loose) || BM_elem_flag_test(e_other, tag_loose))) { + BM_elem_flag_enable(e_other, tag_queued); BLI_LINKSTACK_PUSH(queue_next, e_other); } } } } - if (e->l != NULL) { + if (!BM_elem_flag_test(e, tag_loose)) { /* Propagate across edge to vertices in adjacent faces. */ BMLoop *l; BMIter liter; @@ -417,10 +439,10 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, BMEdge *e_other; BMIter eiter; BM_ITER_ELEM (e_other, &eiter, v_other, BM_EDGES_OF_VERT) { - if (e_other != e && BM_elem_flag_test(e_other, BM_ELEM_TAG) == 0 && - (e_other->l == NULL || + if (e_other != e && BM_elem_flag_test(e_other, tag_queued) == 0 && + (BM_elem_flag_test(e_other, tag_loose) || dists[BM_elem_index_get(BM_edge_other_vert(e_other, v_other))] != FLT_MAX)) { - BM_elem_flag_enable(e_other, BM_ELEM_TAG); + BM_elem_flag_enable(e_other, tag_queued); BLI_LINKSTACK_PUSH(queue_next, e_other); } } @@ -434,13 +456,13 @@ void transform_convert_mesh_connectivity_distance(struct BMesh *bm, for (LinkNode *lnk = queue_next; lnk; lnk = lnk->next) { BMEdge *e_link = lnk->link; - BM_elem_flag_disable(e_link, BM_ELEM_TAG); + BM_elem_flag_disable(e_link, tag_queued); } BLI_LINKSTACK_SWAP(queue, queue_next); /* None should be tagged now since 'queue_next' is empty. */ - BLI_assert(BM_iter_mesh_count_flag(BM_EDGES_OF_MESH, bm, BM_ELEM_TAG, true) == 0); + BLI_assert(BM_iter_mesh_count_flag(BM_EDGES_OF_MESH, bm, tag_queued, true) == 0); } while (BLI_LINKSTACK_SIZE(queue)); BLI_LINKSTACK_FREE(queue); From bc851700a61b49005d010e7cc6063d8a4f74c873 Mon Sep 17 00:00:00 2001 From: Evan Wilson Date: Mon, 22 Feb 2021 14:45:18 +0100 Subject: [PATCH 373/519] Fix T85820: False Color not available in color management Differential Revision: https://developer.blender.org/D10489 --- release/datafiles/colormanagement/config.ocio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio index 8da4b13df00..156ca960e88 100644 --- a/release/datafiles/colormanagement/config.ocio +++ b/release/datafiles/colormanagement/config.ocio @@ -64,7 +64,7 @@ displays: - ! {name: Standard, colorspace: Raw} active_displays: [sRGB, XYZ, None] -active_views: [Standard, Filmic, Filmic Log, Raw] +active_views: [Standard, Filmic, Filmic Log, Raw, False Color] colorspaces: - ! From dd2e0150ae00b91a8e8da3def7aeb247ad7ff101 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 22 Feb 2021 15:48:54 +0100 Subject: [PATCH 374/519] Various UI messages fixes and tweaks. --- release/scripts/modules/bl_i18n_utils/settings.py | 1 + release/scripts/modules/bl_i18n_utils/utils_spell_check.py | 1 + source/blender/editors/animation/fmodifier_ui.c | 2 +- source/blender/makesrna/intern/rna_nodetree.c | 2 +- source/blender/makesrna/intern/rna_scene.c | 6 +++--- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index 86070262e56..51b326fb338 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -353,6 +353,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "wav", "wmOwnerID '%s' not in workspace '%s'", "y", + "y = (Ax + B)", # Sub-strings. "available with", "brown fox", diff --git a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py index 49dadd422ca..6046e8e74d8 100644 --- a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -645,6 +645,7 @@ class SpellChecker: # Acronyms "aa", "msaa", "ao", + "aov", "aovs", "api", "apic", # Affine Particle-In-Cell "asc", "cdl", diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index 0821cfbd282..b344e67f62d 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -795,7 +795,7 @@ static void limits_panel_draw(const bContext *C, Panel *panel) /* Minimums. */ col = uiLayoutColumn(layout, false); - row = uiLayoutRowWithHeading(col, true, IFACE_("Minumum X")); + row = uiLayoutRowWithHeading(col, true, IFACE_("Minimum X")); uiItemR(row, ptr, "use_min_x", 0, "", ICON_NONE); sub = uiLayoutColumn(row, true); uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min_x")); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 65de8c479b8..46fdfe4a862 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -9078,7 +9078,7 @@ static void def_geo_collection_info(StructRNA *srna) 0, "Relative", "Bring the input collection geometry into the modified object, maintaining the relative " - "position between the objects in the scene."}, + "position between the objects in the scene"}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 7f3d470372a..0ad11aa9538 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -7277,16 +7277,16 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_DOF_JITTER); RNA_def_property_ui_text(prop, "Jitter Camera", - "Jitter camera position to create accurate bluring " + "Jitter camera position to create accurate blurring " "using render samples"); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "bokeh_overblur", PROP_FLOAT, PROP_PERCENTAGE); RNA_def_property_ui_text(prop, - "Overblur", + "Over-blur", "Apply blur to each jittered sample to reduce " - "undersampling artifacts"); + "under-sampling artifacts"); RNA_def_property_range(prop, 0, 100); RNA_def_property_ui_range(prop, 0.0f, 20.0f, 1, 1); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); From 6cd8c33d000a9febdb9f4d1596bf8f94b56f9025 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Mon, 22 Feb 2021 09:53:29 -0500 Subject: [PATCH 375/519] Fix compilation error in bypass bmesh commit when GMP not defined. --- source/blender/blenkernel/intern/mesh_boolean_convert.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index b546550a85f..02c99d2c5da 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -821,11 +821,12 @@ Mesh *BKE_mesh_boolean(const Mesh **meshes, #else Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes), - const Object **UNUSED(objects), + const float (*obmats[])[4][4], const int UNUSED(meshes_len), const bool UNUSED(use_self), const int UNUSED(boolean_mode)) { + UNUSED_VARS(obmats); return NULL; } From 046fe55e6390bbcbb946f4d1f07ab1f295cd8fb0 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Mon, 22 Feb 2021 16:05:03 +0100 Subject: [PATCH 376/519] Fix T85869: GPencill Fill tool panel was not aligned as expected The direction of the brush was displayed vertically. --- .../scripts/startup/bl_ui/properties_paint_common.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 54c6de30ef8..f40c947fac9 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -1215,14 +1215,22 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) # FIXME: tools must use their own UI drawing! elif brush.gpencil_tool == 'FILL': - row = layout.row(align=True) - row.prop(gp_settings, "fill_direction", text="", expand=True) + use_property_split_prev = layout.use_property_split + if compact: + row = layout.row(align=True) + row.prop(gp_settings, "fill_direction", text="", expand=True) + else: + layout.use_property_split = False + row = layout.row(align=True) + row.prop(gp_settings, "fill_direction", expand=True) + row = layout.row(align=True) row.prop(gp_settings, "fill_factor") row = layout.row(align=True) row.prop(gp_settings, "fill_leak", text="Leak Size") row = layout.row(align=True) row.prop(brush, "size", text="Thickness") + layout.use_property_split = use_property_split_prev else: # brush.gpencil_tool == 'DRAW/TINT': row = layout.row(align=True) From fcac3d04f5507f8fa5440f89be3025f926a2a2fc Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Mon, 22 Feb 2021 16:12:40 +0100 Subject: [PATCH 377/519] Fix T85850: GPencil Interpolate tool panel wrongly aligned The layout was wrong. --- .../startup/bl_ui/space_toolsystem_toolbar.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 75bca09a044..8e99c3af4c3 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -2039,11 +2039,10 @@ class _defs_gpencil_paint: def interpolate(): def draw_settings(context, layout, tool): props = tool.operator_properties("gpencil.interpolate") - row = layout.row() - row.prop(props, "layers") - row.prop(props, "flip") - row.prop(props, "smooth_factor") - row.prop(props, "smooth_steps") + layout.prop(props, "layers") + layout.prop(props, "flip") + layout.prop(props, "smooth_factor") + layout.prop(props, "smooth_steps") return dict( idname="builtin.interpolate", @@ -2222,12 +2221,11 @@ class _defs_gpencil_edit: def interpolate(): def draw_settings(context, layout, tool): props = tool.operator_properties("gpencil.interpolate") - row = layout.row() - row.prop(props, "layers") - row.prop(props, "interpolate_selected_only") - row.prop(props, "flip") - row.prop(props, "smooth_factor") - row.prop(props, "smooth_steps") + layout.prop(props, "layers") + layout.prop(props, "interpolate_selected_only") + layout.prop(props, "flip") + layout.prop(props, "smooth_factor") + layout.prop(props, "smooth_steps") return dict( idname="builtin.interpolate", From 9ef2679ca9ffcc2aa6bd4eaf2697c185de1f6e1b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 22 Feb 2021 09:28:00 -0600 Subject: [PATCH 378/519] Cleanup: Clang tidy inconsistent parameter name Use the most recent names for the conflicting parameters. --- source/blender/blenkernel/intern/customdata.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index ab57676fde3..d8d9675b42b 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -2883,18 +2883,18 @@ void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, void CustomData_copy_data_layer(const CustomData *source, CustomData *dest, - int src_i, - int dst_i, + int src_layer_index, + int dst_layer_index, int src_index, int dst_index, int count) { const LayerTypeInfo *typeInfo; - const void *src_data = source->layers[src_i].data; - void *dst_data = dest->layers[dst_i].data; + const void *src_data = source->layers[src_layer_index].data; + void *dst_data = dest->layers[dst_layer_index].data; - typeInfo = layerType_getInfo(source->layers[src_i].type); + typeInfo = layerType_getInfo(source->layers[src_layer_index].type); const size_t src_offset = (size_t)src_index * typeInfo->size; const size_t dst_offset = (size_t)dst_index * typeInfo->size; @@ -2903,7 +2903,7 @@ void CustomData_copy_data_layer(const CustomData *source, if (count && !(src_data == NULL && dst_data == NULL)) { CLOG_WARN(&LOG, "null data for %s type (%p --> %p), skipping", - layerType_getName(source->layers[src_i].type), + layerType_getName(source->layers[src_layer_index].type), (void *)src_data, (void *)dst_data); } From af89c9f9a6d5b3b386ce2cbf73c13a2d62aa853d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 22 Feb 2021 09:28:17 -0600 Subject: [PATCH 379/519] Cleanup: Decrease variable scope --- .../interface/interface_region_search.c | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c index d1d4290bd11..2c07f5c3c03 100644 --- a/source/blender/editors/interface/interface_region_search.c +++ b/source/blender/editors/interface/interface_region_search.c @@ -724,19 +724,13 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc wmWindow *win = CTX_wm_window(C); const uiStyle *style = UI_style_get(); uiBut *but = &search_but->but; - static ARegionType type; - ARegion *region; - uiSearchboxData *data; const float aspect = but->block->aspect; - rctf rect_fl; - rcti rect_i; const int margin = UI_POPUP_MARGIN; - int winx /*, winy */, ofsx, ofsy; - int i; /* create area region */ - region = ui_region_temp_add(CTX_wm_screen(C)); + ARegion *region = ui_region_temp_add(CTX_wm_screen(C)); + static ARegionType type; memset(&type, 0, sizeof(ARegionType)); type.draw = ui_searchbox_region_draw_cb; type.free = ui_searchbox_region_free_cb; @@ -744,7 +738,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc region->type = &type; /* create searchbox data */ - data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData"); + uiSearchboxData *data = MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData"); /* set font, get bb */ data->fstyle = style->widget; /* copy struct */ @@ -799,13 +793,14 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc else { const int searchbox_width = UI_searchbox_size_x(); + rctf rect_fl; rect_fl.xmin = but->rect.xmin - 5; /* align text with button */ rect_fl.xmax = but->rect.xmax + 5; /* symmetrical */ rect_fl.ymax = but->rect.ymin; rect_fl.ymin = rect_fl.ymax - UI_searchbox_size_y(); - ofsx = (but->block->panel) ? but->block->panel->ofsx : 0; - ofsy = (but->block->panel) ? but->block->panel->ofsy : 0; + const int ofsx = (but->block->panel) ? but->block->panel->ofsx : 0; + const int ofsy = (but->block->panel) ? but->block->panel->ofsy : 0; BLI_rctf_translate(&rect_fl, ofsx, ofsy); @@ -815,6 +810,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc } /* copy to int, gets projected if possible too */ + rcti rect_i; BLI_rcti_rctf_copy(&rect_i, &rect_fl); if (butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) { @@ -823,7 +819,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc BLI_rcti_translate(&rect_i, butregion->winrct.xmin, butregion->winrct.ymin); - winx = WM_window_pixels_x(win); + int winx = WM_window_pixels_x(win); // winy = WM_window_pixels_y(win); /* UNUSED */ // wm_window_get_size(win, &winx, &winy); @@ -885,7 +881,7 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiButSearc data->items.icons = MEM_callocN(data->items.maxitem * sizeof(int), "search icons"); data->items.states = MEM_callocN(data->items.maxitem * sizeof(int), "search flags"); data->items.name_prefix_offsets = NULL; /* Lazy initialized as needed. */ - for (i = 0; i < data->items.maxitem; i++) { + for (int i = 0; i < data->items.maxitem; i++) { data->items.names[i] = MEM_callocN(but->hardmax + 1, "search pointers"); } @@ -1000,10 +996,8 @@ static void ui_searchbox_region_draw_cb__operator(const bContext *UNUSED(C), ARe ARegion *ui_searchbox_create_operator(bContext *C, ARegion *butregion, uiButSearch *search_but) { - ARegion *region; - UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT); - region = ui_searchbox_create_generic(C, butregion, search_but); + ARegion *region = ui_searchbox_create_generic(C, butregion, search_but); region->type->draw = ui_searchbox_region_draw_cb__operator; @@ -1022,10 +1016,8 @@ static void ui_searchbox_region_draw_cb__menu(const bContext *UNUSED(C), ARegion ARegion *ui_searchbox_create_menu(bContext *C, ARegion *butregion, uiButSearch *search_but) { - ARegion *region; - UI_but_drawflag_enable(&search_but->but, UI_BUT_HAS_SHORTCUT); - region = ui_searchbox_create_generic(C, butregion, search_but); + ARegion *region = ui_searchbox_create_generic(C, butregion, search_but); if (false) { region->type->draw = ui_searchbox_region_draw_cb__menu; From da5eed7ee6bc85104a484b67555457daf0ea369f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 22 Feb 2021 15:39:36 +0100 Subject: [PATCH 380/519] Cleanup: Spelling in comment --- source/blender/makesdna/DNA_movieclip_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h index b72b7c41b1c..f8076ee3bfb 100644 --- a/source/blender/makesdna/DNA_movieclip_types.h +++ b/source/blender/makesdna/DNA_movieclip_types.h @@ -144,7 +144,7 @@ typedef struct MovieClipScopes { struct ImBuf *track_search; /** #ImBuf displayed in track preview. */ struct ImBuf *track_preview; - /** Sub-pizel position of marker in track ImBuf. */ + /** Sub-pixel position of marker in track ImBuf. */ float track_pos[2]; /** Active track is disabled, special notifier should be drawn. */ short track_disabled; From dec73ed4099f98cd5f109d2bc036c07f48abc73b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 22 Feb 2021 15:45:09 +0100 Subject: [PATCH 381/519] Cleanup: Tracking, reduce indentation level --- source/blender/blenkernel/intern/movieclip.c | 138 ++++++++++--------- 1 file changed, 70 insertions(+), 68 deletions(-) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index c1ebd06465b..85b1362c11e 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -1728,76 +1728,78 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip scopes->track = NULL; scopes->track_locked = true; - if (clip) { - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(&clip->tracking); - - if (act_track) { - MovieTrackingTrack *track = act_track; - int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr); - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - - scopes->marker = marker; - scopes->track = track; - - if (marker->flag & MARKER_DISABLED) { - scopes->track_disabled = true; - } - else { - ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user); - - scopes->track_disabled = false; - - if (ibuf && (ibuf->rect || ibuf->rect_float)) { - MovieTrackingMarker undist_marker = *marker; - - if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) { - int width, height; - float aspy = 1.0f / clip->tracking.camera.pixel_aspect; - - BKE_movieclip_get_size(clip, user, &width, &height); - - undist_marker.pos[0] *= width; - undist_marker.pos[1] *= height * aspy; - - BKE_tracking_undistort_v2( - &clip->tracking, width, height, undist_marker.pos, undist_marker.pos); - - undist_marker.pos[0] /= width; - undist_marker.pos[1] /= height * aspy; - } - - scopes->track_search = BKE_tracking_get_search_imbuf( - ibuf, track, &undist_marker, true, true); - - scopes->undist_marker = undist_marker; - - scopes->frame_width = ibuf->x; - scopes->frame_height = ibuf->y; - - scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0; - } - - IMB_freeImBuf(ibuf); - } - - if ((track->flag & TRACK_LOCKED) == 0) { - float pat_min[2], pat_max[2]; - - scopes->track_locked = false; - - /* XXX: would work fine with non-transformed patterns, but would likely fail - * with transformed patterns, but that would be easier to debug when - * we'll have real pattern sampling (at least to test) */ - BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); - - scopes->slide_scale[0] = pat_max[0] - pat_min[0]; - scopes->slide_scale[1] = pat_max[1] - pat_min[1]; - } - } - } - scopes->framenr = user->framenr; scopes->ok = true; + + if (clip == NULL) { + return; + } + + MovieTrackingTrack *track = BKE_tracking_track_get_active(&clip->tracking); + if (track == NULL) { + return; + } + + const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr); + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + + scopes->marker = marker; + scopes->track = track; + + if (marker->flag & MARKER_DISABLED) { + scopes->track_disabled = true; + } + else { + ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user); + + scopes->track_disabled = false; + + if (ibuf && (ibuf->rect || ibuf->rect_float)) { + MovieTrackingMarker undist_marker = *marker; + + if (user->render_flag & MCLIP_PROXY_RENDER_UNDISTORT) { + int width, height; + float aspy = 1.0f / clip->tracking.camera.pixel_aspect; + + BKE_movieclip_get_size(clip, user, &width, &height); + + undist_marker.pos[0] *= width; + undist_marker.pos[1] *= height * aspy; + + BKE_tracking_undistort_v2( + &clip->tracking, width, height, undist_marker.pos, undist_marker.pos); + + undist_marker.pos[0] /= width; + undist_marker.pos[1] /= height * aspy; + } + + scopes->track_search = BKE_tracking_get_search_imbuf( + ibuf, track, &undist_marker, true, true); + + scopes->undist_marker = undist_marker; + + scopes->frame_width = ibuf->x; + scopes->frame_height = ibuf->y; + + scopes->use_track_mask = (track->flag & TRACK_PREVIEW_ALPHA) != 0; + } + + IMB_freeImBuf(ibuf); + } + + if ((track->flag & TRACK_LOCKED) == 0) { + float pat_min[2], pat_max[2]; + + scopes->track_locked = false; + + /* XXX: would work fine with non-transformed patterns, but would likely fail + * with transformed patterns, but that would be easier to debug when + * we'll have real pattern sampling (at least to test) */ + BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); + + scopes->slide_scale[0] = pat_max[0] - pat_min[0]; + scopes->slide_scale[1] = pat_max[1] - pat_min[1]; + } } static void movieclip_build_proxy_ibuf( From 80793fc740cb8a15402527df091f426f0dd30b7b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 22 Feb 2021 15:54:56 +0100 Subject: [PATCH 382/519] Cleanup: Use more clear field name Disambiguate which time the frames are measured in. --- source/blender/blenkernel/intern/movieclip.c | 2 +- source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/makesdna/DNA_movieclip_types.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 85b1362c11e..0265e1c8b2c 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -1728,7 +1728,7 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip scopes->track = NULL; scopes->track_locked = true; - scopes->framenr = user->framenr; + scopes->scene_framenr = user->framenr; scopes->ok = true; if (clip == NULL) { diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 3a4eda29206..37ce269777c 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -7491,7 +7491,7 @@ static bool ui_numedit_but_TRACKPREVIEW( if (!scopes->track_locked) { const MovieClip *clip = CTX_data_edit_movieclip(C); - const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->framenr); + const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scopes->scene_framenr); if (scopes->marker->framenr != clip_framenr) { scopes->marker = BKE_tracking_marker_ensure(scopes->track, clip_framenr); } diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h index f8076ee3bfb..8e01a9e1f1f 100644 --- a/source/blender/makesdna/DNA_movieclip_types.h +++ b/source/blender/makesdna/DNA_movieclip_types.h @@ -150,8 +150,8 @@ typedef struct MovieClipScopes { short track_disabled; /** Active track is locked, no transformation should be allowed. */ short track_locked; - /** Frame number scopes are created for. */ - int framenr; + /** Frame number scopes are created for (measured in scene frames). */ + int scene_framenr; /** Track scopes are created for. */ struct MovieTrackingTrack *track; /** Marker scopes are created for. */ From 1ec626f4bd06e830edc13a8a6986eec2885499dd Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Mon, 22 Feb 2021 17:18:26 +0100 Subject: [PATCH 383/519] Fix T85549: GPencil draw tool offset when UI scale is not 1 There was a mistake in the variables saved and when resolution of the UI was not 1.0, the viewport was offset. --- source/blender/editors/gpencil/gpencil_fill.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index a81d319ab42..bf228af88a5 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -621,8 +621,8 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) } /* set temporary new size */ - tgpf->bwinx = tgpf->region->sizex; - tgpf->bwiny = tgpf->region->sizey; + tgpf->bwinx = tgpf->region->winx; + tgpf->bwiny = tgpf->region->winy; tgpf->brect = tgpf->region->winrct; /* resize region */ From cd1a08398437bb6be4ea82bb553ef3e8dcaee7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 22 Feb 2021 16:59:18 +0100 Subject: [PATCH 384/519] Fix T85720 EEVEE: Contact shadows do not appear when enabling SSR Contact shadows needed correct `gl_FragCoord.z` but this is not correctly set for fullscreen passes. Need to pass depth using a global variable until we get rid of `cl_eval.tracing_depth`. --- .../draw/engines/eevee/shaders/closure_eval_lib.glsl | 9 ++++++++- .../draw/engines/eevee/shaders/effect_ssr_frag.glsl | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl index 8cb702796da..93492762bbe 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_lib.glsl @@ -196,6 +196,9 @@ struct ClosureOutput { vec3 radiance; }; +/* Workaround for screenspace shadows in SSR pass. */ +float FragDepth; + ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) { ClosureEvalCommon cl_eval; @@ -208,11 +211,15 @@ ClosureEvalCommon closure_Common_eval_init(ClosureInputCommon cl_in) cl_eval.Ng = safe_normalize(cross(dFdx(cl_eval.P), dFdy(cl_eval.P))); cl_eval.vNg = transform_direction(ViewMatrix, cl_eval.Ng); /* TODO(fclem) See if we can avoid this complicated setup. */ +#ifdef STEP_RESOLVE /* SSR */ + cl_eval.tracing_depth = FragDepth; +#else cl_eval.tracing_depth = gl_FragCoord.z; +#endif /* Constant bias (due to depth buffer precision) */ /* Magic numbers for 24bits of precision. * From http://terathon.com/gdc07_lengyel.pdf (slide 26) */ - cl_eval.tracing_depth -= mix(2.4e-7, 4.8e-7, gl_FragCoord.z); + cl_eval.tracing_depth -= mix(2.4e-7, 4.8e-7, cl_eval.tracing_depth); /* Convert to view Z. */ cl_eval.tracing_depth = get_view_z_from_depth(cl_eval.tracing_depth); diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl index 1b7c535379e..a4b29d68ac4 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -569,6 +569,8 @@ void main() discard; } + FragDepth = depth; + viewPosition = get_view_space_from_depth(uvcoordsvar.xy, depth); worldPosition = transform_point(ViewMatrixInverse, viewPosition); From d45a89ee443ec4469505caef4a7d64e525da08fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 22 Feb 2021 17:32:26 +0100 Subject: [PATCH 385/519] Fix T85609 EEVEE: Viewport "vibrates" when mouse input is active Taa offset was applied on first sample. This wasn't happening before DOF refactor. Also fixes T85618 Wireframe Displays Strangely in Eevee (Rendered, material Preview) --- source/blender/draw/engines/eevee/eevee_temporal_sampling.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 226d98cc50d..97bbf37a07e 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -151,7 +151,9 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou float ofs[2]; EEVEE_temporal_sampling_offset_calc(ht_point, rd->gauss, ofs); - window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + if (effects->taa_current_sample > 1) { + window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + } /* Jitter is in pixel space. Focus distance in world space units. */ float dof_jitter[2], focus_distance; From 46bdf6d59fc6ee003a575bbcc56516aea03169e7 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 22 Feb 2021 09:31:04 -0800 Subject: [PATCH 386/519] Fix T85768: Win32 Full-Screen Owned Windows Improvements to how window states are determined and changed. Differential Revision: https://developer.blender.org/D10470 Reviewed by Brecht Van Lommel --- intern/ghost/intern/GHOST_WindowWin32.cpp | 57 ++++++----------------- intern/ghost/intern/GHOST_WindowWin32.h | 2 + 2 files changed, 17 insertions(+), 42 deletions(-) diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 1a4ed753112..e29505a5abf 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -76,6 +76,7 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, m_inLiveResize(false), m_system(system), m_hDC(0), + m_isDialog(dialog), m_hasMouseCaptured(false), m_hasGrabMouse(false), m_nPressedButtons(0), @@ -112,6 +113,11 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, /* Forces owned windows onto taskbar and allows minimization. */ DWORD extended_style = parentwindow ? WS_EX_APPWINDOW : 0; + if (dialog) { + style = WS_POPUPWINDOW | WS_CAPTION; + extended_style = WS_EX_DLGMODALFRAME | WS_EX_TOPMOST; + } + /* Monitor details. */ MONITORINFOEX monitor; monitor.cbSize = sizeof(MONITORINFOEX); @@ -480,31 +486,14 @@ GHOST_TSuccess GHOST_WindowWin32::setClientSize(GHOST_TUns32 width, GHOST_TUns32 GHOST_TWindowState GHOST_WindowWin32::getState() const { - GHOST_TWindowState state; - - // XXX 27.04.2011 - // we need to find a way to combine parented windows + resizing if we simply set the - // state as GHOST_kWindowStateEmbedded we will need to check for them somewhere else. - // It's also strange that in Windows is the only platform we need to make this separation. - if ((m_parentWindowHwnd != 0) && !isDialog()) { - state = GHOST_kWindowStateEmbedded; - return state; - } - if (::IsIconic(m_hWnd)) { - state = GHOST_kWindowStateMinimized; + return GHOST_kWindowStateMinimized; } else if (::IsZoomed(m_hWnd)) { LONG_PTR result = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); - if ((result & (WS_DLGFRAME | WS_MAXIMIZE)) == (WS_DLGFRAME | WS_MAXIMIZE)) - state = GHOST_kWindowStateMaximized; - else - state = GHOST_kWindowStateFullScreen; + return (result & WS_CAPTION) ? GHOST_kWindowStateMaximized : GHOST_kWindowStateFullScreen; } - else { - state = GHOST_kWindowStateNormal; - } - return state; + return GHOST_kWindowStateNormal; } void GHOST_WindowWin32::screenToClient(GHOST_TInt32 inX, @@ -532,46 +521,33 @@ void GHOST_WindowWin32::clientToScreen(GHOST_TInt32 inX, GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) { GHOST_TWindowState curstate = getState(); - LONG_PTR newstyle = -1; + LONG_PTR style = GetWindowLongPtr(m_hWnd, GWL_STYLE) | WS_CAPTION; WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd, &wp); - if (state == GHOST_kWindowStateNormal) - state = m_normal_state; - switch (state) { case GHOST_kWindowStateMinimized: wp.showCmd = SW_SHOWMINIMIZED; break; case GHOST_kWindowStateMaximized: wp.showCmd = SW_SHOWMAXIMIZED; - newstyle = WS_OVERLAPPEDWINDOW; break; case GHOST_kWindowStateFullScreen: - if (curstate != state && curstate != GHOST_kWindowStateMinimized) + if (curstate != state && curstate != GHOST_kWindowStateMinimized) { m_normal_state = curstate; + } wp.showCmd = SW_SHOWMAXIMIZED; wp.ptMaxPosition.x = 0; wp.ptMaxPosition.y = 0; - newstyle = WS_MAXIMIZE; - break; - case GHOST_kWindowStateEmbedded: - newstyle = WS_CHILD; + style &= ~WS_CAPTION; break; case GHOST_kWindowStateNormal: default: wp.showCmd = SW_SHOWNORMAL; - newstyle = WS_OVERLAPPEDWINDOW; break; } - if ((newstyle >= 0) && !isDialog()) { - ::SetWindowLongPtr(m_hWnd, GWL_STYLE, newstyle); - } - - /* Clears window cache for SetWindowLongPtr */ - ::SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - + ::SetWindowLongPtr(m_hWnd, GWL_STYLE, style); return ::SetWindowPlacement(m_hWnd, &wp) == TRUE ? GHOST_kSuccess : GHOST_kFailure; } @@ -718,10 +694,7 @@ void GHOST_WindowWin32::lostMouseCapture() bool GHOST_WindowWin32::isDialog() const { - HWND parent = (HWND)::GetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT); - long int style = (long int)::GetWindowLongPtr(m_hWnd, GWL_STYLE); - - return (parent != 0) && (style & WS_POPUPWINDOW); + return m_isDialog; } void GHOST_WindowWin32::updateMouseCapture(GHOST_MouseCaptureEventWin32 event) diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index d2d251fa2f2..0965be509e4 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -534,6 +534,8 @@ class GHOST_WindowWin32 : public GHOST_Window { /** Device context handle. */ HDC m_hDC; + bool m_isDialog; + /** Flag for if window has captured the mouse. */ bool m_hasMouseCaptured; /** From 32073993a8fcd235a5c7a2022dcdd7aef8a49687 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 22 Feb 2021 18:29:52 +0100 Subject: [PATCH 387/519] i18n messages extraction script: fix handling of C unicode-escapes. rB1f5647c07d15 introduced for the first time a unicode escape in strings to be translated, directly extracted from C-code itself. This revealed that this case was not properly handled by current code, for now we work around using `raw_unicode_escape` encoding/decoding of python. --- release/scripts/modules/bl_i18n_utils/bl_extract_messages.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 9e59a245cc4..180f9f0a01c 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -735,7 +735,9 @@ def dump_src_messages(msgs, reports, settings): _clean_str = re.compile(settings.str_clean_re).finditer def clean_str(s): - return "".join(m.group("clean") for m in _clean_str(s)) + # The encode/decode to/from 'raw_unicode_escape' allows to transform the C-type unicode hexadecimal escapes + # (like '\u2715' for the '×' symbol) back into a proper unicode character. + return "".join(m.group("clean") for m in _clean_str(s)).encode('raw_unicode_escape').decode('raw_unicode_escape') def dump_src_file(path, rel_path, msgs, reports, settings): def process_entry(_msgctxt, _msgid): From 277b4f4b9377b7d43e730aa3219ee1a82f9885d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Sch=C3=B6n?= Date: Mon, 22 Feb 2021 17:50:13 +0100 Subject: [PATCH 388/519] Fix Principled BSDF specular color for black base color Specular color is set to black instead of white inside the Principled BSDF when the base color is set to fully black. This is contradictory to the sample code of the Disney BRDF in BRDF Explorer. This patch aligns both implementations. Differential Revision: https://developer.blender.org/D10448 --- intern/cycles/kernel/shaders/node_principled_bsdf.osl | 2 +- intern/cycles/kernel/svm/svm_closure.h | 2 +- .../gpu/shaders/material/gpu_shader_material_principled.glsl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/intern/cycles/kernel/shaders/node_principled_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_bsdf.osl index 1711811ac65..23949f406c7 100644 --- a/intern/cycles/kernel/shaders/node_principled_bsdf.osl +++ b/intern/cycles/kernel/shaders/node_principled_bsdf.osl @@ -50,7 +50,7 @@ shader node_principled_bsdf(string distribution = "Multiscatter GGX", float m_cdlum = luminance(BaseColor); color m_ctint = m_cdlum > 0.0 ? BaseColor / m_cdlum : - color(0.0, 0.0, 0.0); // normalize lum. to isolate hue+sat + color(1.0, 1.0, 1.0); // normalize lum. to isolate hue+sat /* rotate tangent */ if (AnisotropicRotation != 0.0) diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 1ae94f1d766..f6bf860631e 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -308,7 +308,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3( - 0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat + 1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 40fe83a3616..49c8973a8ce 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -2,7 +2,7 @@ vec3 tint_from_color(vec3 color) { float lum = dot(color, vec3(0.3, 0.6, 0.1)); /* luminance approx. */ - return (lum > 0.0) ? color / lum : vec3(0.0); /* normalize lum. to isolate hue+sat */ + return (lum > 0.0) ? color / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */ } float principled_sheen(float NV) From 5f8b6a9c0eb3ae61c3b3e910e6a59cdd2cd9d260 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 18 Feb 2021 16:30:08 +0100 Subject: [PATCH 389/519] Fix T85753: Default UVs for Icosphere are flipped horizontally These were flipped since their introduction in rBa070a5befa11. Maniphest Tasks: T85753 Differential Revision: https://developer.blender.org/D10465 --- .../blender/bmesh/operators/bmo_primitive.c | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/source/blender/bmesh/operators/bmo_primitive.c b/source/blender/bmesh/operators/bmo_primitive.c index 8e088683d62..7d980299771 100644 --- a/source/blender/bmesh/operators/bmo_primitive.c +++ b/source/blender/bmesh/operators/bmo_primitive.c @@ -55,21 +55,21 @@ static const short icoface[20][3] = { }; static const float icouvs[60][2] = { - {0.818181f, 0.000000f}, {0.727272f, 0.157461f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f}, - {0.636363f, 0.000000f}, {0.545454f, 0.157461f}, {0.090909f, 0.000000f}, {0.000000f, 0.157461f}, - {0.181818f, 0.157461f}, {0.272727f, 0.000000f}, {0.181818f, 0.157461f}, {0.363636f, 0.157461f}, - {0.454545f, 0.000000f}, {0.363636f, 0.157461f}, {0.545454f, 0.157461f}, {0.727272f, 0.157461f}, - {0.545454f, 0.157461f}, {0.636363f, 0.314921f}, {0.909090f, 0.157461f}, {0.727272f, 0.157461f}, - {0.818181f, 0.314921f}, {0.181818f, 0.157461f}, {0.000000f, 0.157461f}, {0.090909f, 0.314921f}, - {0.363636f, 0.157461f}, {0.181818f, 0.157461f}, {0.272727f, 0.314921f}, {0.545454f, 0.157461f}, - {0.363636f, 0.157461f}, {0.454545f, 0.314921f}, {0.727272f, 0.157461f}, {0.636363f, 0.314921f}, - {0.818181f, 0.314921f}, {0.909090f, 0.157461f}, {0.818181f, 0.314921f}, {1.000000f, 0.314921f}, - {0.181818f, 0.157461f}, {0.090909f, 0.314921f}, {0.272727f, 0.314921f}, {0.363636f, 0.157461f}, - {0.272727f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.157461f}, {0.454545f, 0.314921f}, - {0.636363f, 0.314921f}, {0.818181f, 0.314921f}, {0.636363f, 0.314921f}, {0.727272f, 0.472382f}, - {1.000000f, 0.314921f}, {0.818181f, 0.314921f}, {0.909090f, 0.472382f}, {0.272727f, 0.314921f}, - {0.090909f, 0.314921f}, {0.181818f, 0.472382f}, {0.454545f, 0.314921f}, {0.272727f, 0.314921f}, - {0.363636f, 0.472382f}, {0.636363f, 0.314921f}, {0.454545f, 0.314921f}, {0.545454f, 0.472382f}, + {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f}, + {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f}, + {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f}, + {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f}, + {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f}, + {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f}, + {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f}, + {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f}, + {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f}, + {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f}, + {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f}, + {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f}, + {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f}, + {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f}, + {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f}, }; static const int monkeyo = 4; From cd8f2dfecc58604bb7a8bc342380e5236fbb4ba8 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 22 Feb 2021 11:03:44 -0700 Subject: [PATCH 390/519] CMake/Windows: Detect Boost version Rather than hardcoding the lib names, read boosts version.hpp and extract the version from there. This will make it easier to land lib changes in the near future. --- build_files/cmake/platform/platform_win32.cmake | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 06cee51344a..b303358d0b8 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -454,10 +454,18 @@ if(WITH_BOOST) set(BOOST ${LIBDIR}/boost) set(BOOST_INCLUDE_DIR ${BOOST}/include) set(BOOST_LIBPATH ${BOOST}/lib) - if(CMAKE_CL_64) - set(BOOST_POSTFIX "vc141-mt-x64-1_70.lib") - set(BOOST_DEBUG_POSTFIX "vc141-mt-gd-x64-1_70.lib") + set(BOOST_VERSION_HEADER ${BOOST_INCLUDE_DIR}/boost/version.hpp) + if(EXISTS ${BOOST_VERSION_HEADER}) + file(STRINGS "${BOOST_VERSION_HEADER}" BOOST_LIB_VERSION REGEX "#define BOOST_LIB_VERSION ") + if(BOOST_LIB_VERSION MATCHES "#define BOOST_LIB_VERSION \"([0-9_]+)\"") + set(BOOST_VERSION "${CMAKE_MATCH_1}") + endif() endif() + if(NOT BOOST_VERSION) + message(FATAL_ERROR "Unable to determine Boost version") + endif() + set(BOOST_POSTFIX "vc141-mt-x64-${BOOST_VERSION}.lib") + set(BOOST_DEBUG_POSTFIX "vc141-mt-gd-x64-${BOOST_VERSION}.lib") set(BOOST_LIBRARIES optimized ${BOOST_LIBPATH}/libboost_date_time-${BOOST_POSTFIX} optimized ${BOOST_LIBPATH}/libboost_filesystem-${BOOST_POSTFIX} From 449ccf07e05fdcd8f837ffaddb8768510e8500f7 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 22 Feb 2021 11:08:52 -0700 Subject: [PATCH 391/519] CMake/Windows: Update for new XR_OPENXR version This updates platform/platform_win32.cmake to support both the old and new library names for OpenXR. The new version links against one additional system library and the debug library filename changed ever so slightly. This is a temporary workaround and can be removed once the new lib versions have landed. --- build_files/cmake/platform/platform_win32.cmake | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index b303358d0b8..e739e8ee5a2 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -119,6 +119,7 @@ string(APPEND CMAKE_MODULE_LINKER_FLAGS " /SAFESEH:NO /ignore:4099") list(APPEND PLATFORM_LINKLIBS ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32 Comctl32 version advapi32 shfolder shell32 ole32 oleaut32 uuid psapi Dbghelp Shlwapi + pathcch ) if(WITH_INPUT_IME) @@ -791,7 +792,14 @@ if(WITH_XR_OPENXR) set(XR_OPENXR_SDK ${LIBDIR}/xr_openxr_sdk) set(XR_OPENXR_SDK_LIBPATH ${LIBDIR}/xr_openxr_sdk/lib) set(XR_OPENXR_SDK_INCLUDE_DIR ${XR_OPENXR_SDK}/include) - set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + # This is the old name of this library, it is checked to + # support the transition between the old and new lib versions + # this can be removed after the next lib update. + if(EXISTS ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib) + else() + set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loaderd.lib) + endif() else() message(WARNING "OpenXR-SDK was not found, disabling WITH_XR_OPENXR") set(WITH_XR_OPENXR OFF) From 441c6602704e3a7b828dd4b71ea8061fe9c531bc Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 22 Feb 2021 13:18:49 -0600 Subject: [PATCH 392/519] Cleanup: Use bool instead of char --- source/blender/editors/interface/interface.c | 11 +++++------ source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/editors/interface/interface_intern.h | 8 ++++---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 1aff68871e4..636efbc50ce 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -988,10 +988,9 @@ bool UI_but_active_only(const bContext *C, ARegion *region, uiBlock *block, uiBu */ bool UI_block_active_only_flagged_buttons(const bContext *C, ARegion *region, uiBlock *block) { - /* Running this command before end-block has run, means buttons that open menus * wont have those menus correctly positioned, see T83539. */ - BLI_assert(block->endblock != 0); + BLI_assert(block->endblock); bool done = false; LISTBASE_FOREACH (uiBut *, but, &block->buttons) { @@ -1914,7 +1913,7 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x ui_update_flexible_spacing(region, block); - block->endblock = 1; + block->endblock = true; } void UI_block_end(const bContext *C, uiBlock *block) @@ -3434,7 +3433,7 @@ void UI_blocklist_free_inactive(const bContext *C, ListBase *lb) UI_block_free(C, block); } else { - block->active = 0; + block->active = false; } } } @@ -3451,7 +3450,7 @@ void UI_block_region_set(uiBlock *block, ARegion *region) oldblock = BLI_findstring(lb, block->name, offsetof(uiBlock, name)); if (oldblock) { - oldblock->active = 0; + oldblock->active = false; oldblock->panel = NULL; oldblock->handle = NULL; } @@ -3469,7 +3468,7 @@ uiBlock *UI_block_begin(const bContext *C, ARegion *region, const char *name, eU Scene *scene = CTX_data_scene(C); uiBlock *block = MEM_callocN(sizeof(uiBlock), "uiBlock"); - block->active = 1; + block->active = true; block->emboss = emboss; block->evil_C = (void *)C; /* XXX */ diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 37ce269777c..5de330d7136 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -8267,7 +8267,7 @@ static void button_activate_exit( bt->flag &= ~UI_BUT_LAST_ACTIVE; } - block_iter->tooltipdisabled = 1; + block_iter->tooltipdisabled = true; } ui_blocks_set_tooltips(data->region, false); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 6a921f3f541..3da66d45abd 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -510,13 +510,13 @@ struct uiBlock { const char *lockstr; - char lock; + bool lock; /** to keep blocks while drawing and free them afterwards */ - char active; + bool active; /** to avoid tooltip after click */ - char tooltipdisabled; + bool tooltipdisabled; /** UI_block_end done? */ - char endblock; + bool endblock; /** for doing delayed */ eBlockBoundsCalc bounds_type; From 3d2d8a1aab0f0141a1a55d1cc93de60815c26946 Mon Sep 17 00:00:00 2001 From: Sebastian Parborg Date: Mon, 22 Feb 2021 20:26:51 +0100 Subject: [PATCH 393/519] Fix: Geometry nodes not depending on instanced collections properly Geometry nodes were not adding referenced instanced collections as dependencies to depsgraph. This would lead to meshes and data not being ready on evaluation in certain cases. --- source/blender/modifiers/intern/MOD_nodes.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 9ec7bdf3b80..fe5a8bc59d4 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -151,11 +151,20 @@ static void find_used_ids_from_settings(const NodesModifierSettings &settings, S &ids); } +static void add_collection_object_relations_recursive(const ModifierUpdateDepsgraphContext *ctx, + Collection &collection); + static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object) { DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); if (&(ID &)object != &ctx->object->id) { - if (object.type != OB_EMPTY) { + if (object.type == OB_EMPTY) { + Collection *collection_instance = object.instance_collection; + if (collection_instance != nullptr) { + add_collection_object_relations_recursive(ctx, *collection_instance); + } + } + else { DEG_add_object_relation(ctx->node, &object, DEG_OB_COMP_GEOMETRY, "Nodes Modifier"); } } From be9842f65b85d64ab8b7baa686ded9c79c31227e Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 22 Feb 2021 11:37:25 -0800 Subject: [PATCH 394/519] UI: Simplify Window Creation Refactoring: WM_window_open() that can open different types of windows. 'New Window' with simplified layout. Differential Revision: https://developer.blender.org/D10419 Reviewed by Brecht Van Lommel --- source/blender/editors/render/render_view.c | 12 +- source/blender/editors/screen/screen_edit.c | 11 +- source/blender/editors/screen/screen_ops.c | 123 ++++++++---------- source/blender/windowmanager/WM_api.h | 27 ++-- .../blender/windowmanager/intern/wm_window.c | 120 +++++++++-------- 5 files changed, 150 insertions(+), 143 deletions(-) diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c index fd5963b217b..465438f814a 100644 --- a/source/blender/editors/render/render_view.c +++ b/source/blender/editors/render/render_view.c @@ -157,8 +157,16 @@ ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports) } /* changes context! */ - if (WM_window_open_temp( - C, IFACE_("Blender Render"), mx, my, sizex, sizey, SPACE_IMAGE, false) == NULL) { + if (WM_window_open(C, + IFACE_("Blender Render"), + mx, + my, + sizex, + sizey, + SPACE_IMAGE, + false, + true, + WIN_ALIGN_LOCATION_CENTER) == NULL) { BKE_report(reports, RPT_ERROR, "Failed to open window!"); return NULL; } diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 1735b02ffe3..3e498522071 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1441,7 +1441,16 @@ ScrArea *ED_screen_temp_space_open(bContext *C, switch (display_type) { case USER_TEMP_SPACE_DISPLAY_WINDOW: - if (WM_window_open_temp(C, title, x, y, sizex, sizey, (int)space_type, dialog)) { + if (WM_window_open(C, + title, + x, + y, + sizex, + sizey, + (int)space_type, + dialog, + true, + WIN_ALIGN_LOCATION_CENTER)) { area = CTX_wm_area(C); } break; diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 47feb49bd44..8a53154cc85 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1332,67 +1332,46 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot) /* operator callback */ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - Main *bmain = CTX_data_main(C); - wmWindow *win = CTX_wm_window(C); - WorkSpace *workspace = WM_window_get_active_workspace(win); - WorkSpaceLayout *layout_old = WM_window_get_active_layout(win); - - Scene *scene = CTX_data_scene(C); ScrArea *area = CTX_wm_area(C); - /* XXX hrmf! */ - if (event->type == EVT_ACTIONZONE_AREA) { + if (event && event->customdata) { sActionzoneData *sad = event->customdata; - if (sad == NULL) { return OPERATOR_PASS_THROUGH; } - area = sad->sa1; } - /* adds window to WM */ - rcti rect = area->totrct; - BLI_rcti_translate(&rect, win->posx, win->posy); - rect.xmax = rect.xmin + BLI_rcti_size_x(&rect); - rect.ymax = rect.ymin + BLI_rcti_size_y(&rect); + /* Create new window. No need to set space_type since it will be copied over. */ + wmWindow *newwin = WM_window_open(C, + "Blender", + area->totrct.xmin, + area->totrct.ymin, + area->winx, + area->winy, + SPACE_EMPTY, + true, + false, + WIN_ALIGN_ABSOLUTE); - wmWindow *newwin = WM_window_open(C, &rect); - if (newwin == NULL) { + if (newwin) { + /* copy area to new screen */ + bScreen *newsc = WM_window_get_active_screen(newwin); + ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true); + ED_area_tag_redraw((ScrArea *)newsc->areabase.first); + + /* screen, areas init */ + WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); + } + else { BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); - goto finally; } - *newwin->stereo3d_format = *win->stereo3d_format; - - newwin->scene = scene; - - STRNCPY(newwin->view_layer_name, win->view_layer_name); - - BKE_workspace_active_set(newwin->workspace_hook, workspace); - /* allocs new screen and adds to newly created window, using window size */ - WorkSpaceLayout *layout_new = ED_workspace_layout_add( - bmain, workspace, newwin, BKE_workspace_layout_name_get(layout_old)); - bScreen *newsc = BKE_workspace_layout_screen_get(layout_new); - WM_window_set_active_layout(newwin, workspace, layout_new); - - /* copy area to new screen */ - ED_area_data_copy((ScrArea *)newsc->areabase.first, area, true); - - ED_area_tag_redraw((ScrArea *)newsc->areabase.first); - - /* screen, areas init */ - WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); - -finally: - if (event->type == EVT_ACTIONZONE_AREA) { + if (event && event->customdata) { actionzone_exit(op); } - if (newwin) { - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; + return newwin ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } static void SCREEN_OT_area_dupli(wmOperatorType *ot) @@ -4866,14 +4845,16 @@ static int userpref_show_exec(bContext *C, wmOperator *op) int sizey = 520 * UI_DPI_FAC; /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Preferences"), - event->x, - event->y, - sizex, - sizey, - SPACE_USERPREF, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Preferences"), + event->x, + event->y, + sizex, + sizey, + SPACE_USERPREF, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { /* The header only contains the editor switcher and looks empty. * So hiding in the temp window makes sense. */ ScrArea *area = CTX_wm_area(C); @@ -4925,14 +4906,16 @@ static int drivers_editor_show_exec(bContext *C, wmOperator *op) uiBut *but = UI_context_active_but_prop_get(C, &ptr, &prop, &index); /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Drivers Editor"), - event->x, - event->y, - sizex, - sizey, - SPACE_GRAPH, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Drivers Editor"), + event->x, + event->y, + sizex, + sizey, + SPACE_GRAPH, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { ED_drivers_editor_init(C, CTX_wm_area(C)); /* activate driver F-Curve for the property under the cursor */ @@ -4991,14 +4974,16 @@ static int info_log_show_exec(bContext *C, wmOperator *op) int shift_y = 480; /* changes context! */ - if (WM_window_open_temp(C, - IFACE_("Blender Info Log"), - event->x, - event->y + shift_y, - sizex, - sizey, - SPACE_INFO, - false) != NULL) { + if (WM_window_open(C, + IFACE_("Blender Info Log"), + event->x, + event->y + shift_y, + sizex, + sizey, + SPACE_INFO, + false, + true, + WIN_ALIGN_LOCATION_CENTER) != NULL) { return OPERATOR_FINISHED; } BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index d5de45c74fd..9eb4dd832cb 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -171,15 +171,24 @@ void WM_opengl_context_dispose(void *context); void WM_opengl_context_activate(void *context); void WM_opengl_context_release(void *context); -struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect); -struct wmWindow *WM_window_open_temp(struct bContext *C, - const char *title, - int x, - int y, - int sizex, - int sizey, - int space_type, - bool dialog); +/* WM_window_open alignment */ +typedef enum WindowAlignment { + WIN_ALIGN_ABSOLUTE = 0, + WIN_ALIGN_LOCATION_CENTER, + WIN_ALIGN_PARENT_CENTER, +} WindowAlignment; + +struct wmWindow *WM_window_open(struct bContext *C, + const char *title, + int x, + int y, + int sizex, + int sizey, + int space_type, + bool dialog, + bool temp, + WindowAlignment alignment); + void WM_window_set_dpi(const wmWindow *win); bool WM_stereo3d_enabled(struct wmWindow *win, bool only_fullscreen_test); diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index c4452b4c4f7..733a9b74f2c 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -462,7 +462,7 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win) { if (WM_window_is_temp_screen(win)) { /* nothing to do for 'temp' windows, - * because WM_window_open_temp always sets window title */ + * because WM_window_open always sets window title */ } else if (win->ghostwin) { /* this is set to 1 if you don't have startup.blend open */ @@ -776,68 +776,51 @@ static bool wm_window_update_size_position(wmWindow *win) } /** - * new window, no screen yet, but we open ghostwindow for it, - * also gets the window level handlers - * \note area-rip calls this. - * \return the window or NULL. - */ -wmWindow *WM_window_open(bContext *C, const rcti *rect) -{ - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win_prev = CTX_wm_window(C); - wmWindow *win = wm_window_new(CTX_data_main(C), wm, win_prev, false); - - const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin); - - win->posx = rect->xmin / native_pixel_size; - win->posy = rect->ymin / native_pixel_size; - win->sizex = BLI_rcti_size_x(rect) / native_pixel_size; - win->sizey = BLI_rcti_size_y(rect) / native_pixel_size; - - WM_check(C); - - if (win->ghostwin) { - return win; - } - - wm_window_close(C, wm, win); - CTX_wm_window_set(C, win_prev); - return NULL; -} - -/** - * Uses `screen->temp` tag to define what to do, currently it limits - * to only one "temp" window for render out, preferences, filewindow, etc... - * * \param space_type: SPACE_VIEW3D, SPACE_INFO, ... (eSpace_Type) + * \param dialog: whether this should be made as a dialog-style window + * \param temp: whether this is considered a short-lived window + * \param alignment: how this window is positioned relative to its parent * \return the window or NULL in case of failure. */ -wmWindow *WM_window_open_temp(bContext *C, - const char *title, - int x, - int y, - int sizex, - int sizey, - int space_type, - bool dialog) +wmWindow *WM_window_open(bContext *C, + const char *title, + int x, + int y, + int sizex, + int sizey, + int space_type, + bool dialog, + bool temp, + WindowAlignment alignment) { Main *bmain = CTX_data_main(C); wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win_prev = CTX_wm_window(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + rcti rect; - /* convert to native OS window coordinates */ const float native_pixel_size = GHOST_GetNativePixelSize(win_prev->ghostwin); - x /= native_pixel_size; - y /= native_pixel_size; + /* convert to native OS window coordinates */ + rect.xmin = win_prev->posx + (x / native_pixel_size); + rect.ymin = win_prev->posy + (y / native_pixel_size); sizex /= native_pixel_size; sizey /= native_pixel_size; - /* calculate position */ - rcti rect; - rect.xmin = x + win_prev->posx - sizex / 2; - rect.ymin = y + win_prev->posy - sizey / 2; + if (alignment == WIN_ALIGN_LOCATION_CENTER) { + /* Window centered around x,y location. */ + rect.xmin -= sizex / 2; + rect.ymin -= sizey / 2; + } + else if (alignment == WIN_ALIGN_PARENT_CENTER) { + /* Centered within parent. X,Y as offsets from there. */ + rect.xmin += (win_prev->sizex - sizex) / 2; + rect.ymin += (win_prev->sizey - sizey) / 2; + } + else { + /* Positioned absolutely within parent bounds. */ + } + rect.xmax = rect.xmin + sizex; rect.ymax = rect.ymin + sizey; @@ -846,22 +829,24 @@ wmWindow *WM_window_open_temp(bContext *C, /* Reuse temporary windows when they share the same title. */ wmWindow *win = NULL; - LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) { - if (WM_window_is_temp_screen(win_iter)) { - char *wintitle = GHOST_GetTitle(win_iter->ghostwin); - if (strcmp(title, wintitle) == 0) { - win = win_iter; + if (temp) { + LISTBASE_FOREACH (wmWindow *, win_iter, &wm->windows) { + if (WM_window_is_temp_screen(win_iter)) { + char *wintitle = GHOST_GetTitle(win_iter->ghostwin); + if (strcmp(title, wintitle) == 0) { + win = win_iter; + } + free(wintitle); } - free(wintitle); } } /* add new window? */ if (win == NULL) { win = wm_window_new(bmain, wm, win_prev, dialog); - win->posx = rect.xmin; win->posy = rect.ymin; + *win->stereo3d_format = *win_prev->stereo3d_format; } bScreen *screen = WM_window_get_active_screen(win); @@ -889,7 +874,7 @@ wmWindow *WM_window_open_temp(bContext *C, ED_screen_scene_change(C, win, scene); } - screen->temp = 1; + screen->temp = temp; /* make window active, and validate/resize */ CTX_wm_window_set(C, win); @@ -906,10 +891,11 @@ wmWindow *WM_window_open_temp(bContext *C, */ /* ensure it shows the right spacetype editor */ - ScrArea *area = screen->areabase.first; - CTX_wm_area_set(C, area); - - ED_area_newspace(C, area, space_type, false); + if (space_type != SPACE_EMPTY) { + ScrArea *area = screen->areabase.first; + CTX_wm_area_set(C, area); + ED_area_newspace(C, area, space_type, false); + } ED_screen_change(C, screen); @@ -949,8 +935,18 @@ int wm_window_close_exec(bContext *C, wmOperator *UNUSED(op)) int wm_window_new_exec(bContext *C, wmOperator *UNUSED(op)) { wmWindow *win_src = CTX_wm_window(C); + ScrArea *area = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TYPE_ANY, 0); - bool ok = (wm_window_copy_test(C, win_src, true, true) != NULL); + bool ok = (WM_window_open(C, + IFACE_("Blender"), + 0, + 0, + win_src->sizex * 0.95f, + win_src->sizey * 0.9f, + area->spacetype, + false, + false, + WIN_ALIGN_PARENT_CENTER) != NULL); return ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } From 9c395d6275a06ec6adbf5c3d1faa827adc1cf54e Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 22 Feb 2021 11:52:19 -0800 Subject: [PATCH 395/519] UI: Remove Blend Thumb Passepartout Removal of 'camera frame' around blend file thumbnail images. Differential Revision: https://developer.blender.org/D10490 Reviewed by Brecht Van Lommel --- source/blender/imbuf/IMB_thumbs.h | 1 - source/blender/imbuf/intern/thumbs_blend.c | 58 ------------------- .../blender/windowmanager/intern/wm_files.c | 6 -- 3 files changed, 65 deletions(-) diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h index a013e7e38dd..9dd0cbe895f 100644 --- a/source/blender/imbuf/IMB_thumbs.h +++ b/source/blender/imbuf/IMB_thumbs.h @@ -80,7 +80,6 @@ void IMB_thumb_makedirs(void); struct ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const char *blen_id); -void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect); /* special function for previewing fonts */ struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y); diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c index 0d1fa354b3e..106e4618847 100644 --- a/source/blender/imbuf/intern/thumbs_blend.c +++ b/source/blender/imbuf/intern/thumbs_blend.c @@ -100,61 +100,3 @@ ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const return ima; } - -/* add a fake passepartout overlay to a byte buffer, use for blend file thumbnails */ -#define MARGIN 2 - -void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect) -{ - unsigned char *px = (unsigned char *)thumb; - int margin_l = MARGIN; - int margin_b = MARGIN; - int margin_r = width - MARGIN; - int margin_t = height - MARGIN; - - if (aspect < 1.0f) { - margin_l = (int)((width - ((float)width * aspect)) / 2.0f); - margin_l += MARGIN; - CLAMP(margin_l, MARGIN, (width / 2)); - margin_r = width - margin_l; - } - else if (aspect > 1.0f) { - margin_b = (int)((height - ((float)height / aspect)) / 2.0f); - margin_b += MARGIN; - CLAMP(margin_b, MARGIN, (height / 2)); - margin_t = height - margin_b; - } - - { - int x, y; - int stride_x = (margin_r - margin_l) - 2; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++, px += 4) { - int hline = 0, vline = 0; - if ((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) { - /* interior. skip */ - x += stride_x; - px += stride_x * 4; - } - else if ((hline = (((x == margin_l || x == margin_r)) && y >= margin_b && - y <= margin_t)) || - (vline = (((y == margin_b || y == margin_t)) && x >= margin_l && - x <= margin_r))) { - /* dashed line */ - if ((hline && y % 2) || (vline && x % 2)) { - px[0] = px[1] = px[2] = 0; - px[3] = 255; - } - } - else { - /* outside, fill in alpha, like passepartout */ - px[0] *= 0.5f; - px[1] *= 0.5f; - px[2] *= 0.5f; - px[3] = (px[3] * 0.5f) + 96; - } - } - } - } -} diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 8bea2203abe..d2d080a9a68 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1398,14 +1398,8 @@ static ImBuf *blend_file_thumb(const bContext *C, } if (ibuf) { - float aspect = (scene->r.xsch * scene->r.xasp) / (scene->r.ysch * scene->r.yasp); - /* dirty oversampling */ IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE); - - /* add pretty overlay */ - IMB_thumb_overlay_blend(ibuf->rect, ibuf->x, ibuf->y, aspect); - thumb = BKE_main_thumbnail_from_imbuf(NULL, ibuf); } else { From beb1f1b8053a0ace883506b2442381c616acaa98 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 22 Feb 2021 12:46:45 -0800 Subject: [PATCH 396/519] Win32: Do not (yet) set window styles for Dialog Remove the setting of Dialog window styles until we confirm expected behavior between platforms. Differential Revision: https://developer.blender.org/D10470 Own Code --- intern/ghost/intern/GHOST_WindowWin32.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index e29505a5abf..a166fa490e2 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -114,8 +114,10 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, DWORD extended_style = parentwindow ? WS_EX_APPWINDOW : 0; if (dialog) { - style = WS_POPUPWINDOW | WS_CAPTION; - extended_style = WS_EX_DLGMODALFRAME | WS_EX_TOPMOST; + /* When we are ready to make windows of this type: + * style = WS_POPUPWINDOW | WS_CAPTION + * extended_style = WS_EX_DLGMODALFRAME | WS_EX_TOPMOST + */ } /* Monitor details. */ From d447bd3e4a9a793364b5f4951ad280fe0293d79e Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Mon, 22 Feb 2021 13:47:21 -0800 Subject: [PATCH 397/519] Fix T85638: Child Window Positioning on Multiple Monitors Constraint of new window position can be incorrect when using multiple monitors. Differential Revision: https://developer.blender.org/D10469 Reviewed by Brecht Van Lommel --- .../blender/windowmanager/intern/wm_window.c | 35 ++++--------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 733a9b74f2c..ada4093080c 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -158,37 +158,16 @@ void wm_get_desktopsize(int *r_width, int *r_height) *r_height = uiheight; } -/* keeps offset and size within monitor bounds */ -/* XXX solve dual screen... */ -static void wm_window_check_position(rcti *rect) +/* keeps size within monitor bounds */ +static void wm_window_check_size(rcti *rect) { int width, height; wm_get_screensize(&width, &height); - - if (rect->xmin < 0) { - rect->xmax -= rect->xmin; - rect->xmin = 0; + if (BLI_rcti_size_x(rect) > width) { + BLI_rcti_resize_x(rect, width); } - if (rect->ymin < 0) { - rect->ymax -= rect->ymin; - rect->ymin = 0; - } - if (rect->xmax > width) { - int d = rect->xmax - width; - rect->xmax -= d; - rect->xmin -= d; - } - if (rect->ymax > height) { - int d = rect->ymax - height; - rect->ymax -= d; - rect->ymin -= d; - } - - if (rect->xmin < 0) { - rect->xmin = 0; - } - if (rect->ymin < 0) { - rect->ymin = 0; + if (BLI_rcti_size_y(rect) > height) { + BLI_rcti_resize_y(rect, height); } } @@ -825,7 +804,7 @@ wmWindow *WM_window_open(bContext *C, rect.ymax = rect.ymin + sizey; /* changes rect to fit within desktop */ - wm_window_check_position(&rect); + wm_window_check_size(&rect); /* Reuse temporary windows when they share the same title. */ wmWindow *win = NULL; From 9fe53bd4a1ac0eaa63fcf1ebd151fe4db0411b49 Mon Sep 17 00:00:00 2001 From: Ankit Meel Date: Tue, 23 Feb 2021 08:34:33 +0530 Subject: [PATCH 398/519] Build Environment/macOS/Python: link against zlib statically rBc70eb30240f8b5d5a8f2ac509f0eb585936142b5 added patch to use static zlib on Linux. But also added flags to use the zlib in LIBDIR for Python on macOS. That causes some shared libraries (binascii for one) to link against libz.1.dylib which will not be there on users' systems. Reuse the said patch for macOS also to avoid rpath issues. Fix T85648. Reviewed By: #platform_macos, brecht Differential Revision: https://developer.blender.org/D10479 --- build_files/build_environment/cmake/python.cmake | 4 ++-- .../patches/{python_linux.diff => python_unix.diff} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename build_files/build_environment/patches/{python_linux.diff => python_unix.diff} (100%) diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index 5731a0e0ae8..fa1498dda82 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -77,9 +77,9 @@ else() else() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV}) set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python) - set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff) endif() - + # Link against zlib statically (Unix). Avoid rpath issues (macOS). + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_unix.diff) set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl") set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include") set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib") diff --git a/build_files/build_environment/patches/python_linux.diff b/build_files/build_environment/patches/python_unix.diff similarity index 100% rename from build_files/build_environment/patches/python_linux.diff rename to build_files/build_environment/patches/python_unix.diff From d9abcee47eb5540f6f5fd60b83cc7d45ad7bc56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 23 Feb 2021 01:57:03 +0100 Subject: [PATCH 399/519] Alembic procedural: fix crash when accessing data out of frame bounds --- intern/cycles/render/alembic.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 5942e512e60..0f11a9368da 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -1344,6 +1344,11 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress) assert(scene_ == nullptr || scene_ == scene); scene_ = scene; + if (frame < start_frame || frame > end_frame) { + clear_modified(); + return; + } + bool need_shader_updates = false; /* Check for changes in shaders (newly requested attributes). */ From 3d5e290ee0fd0c2dcda21f66b9e1c4f276f0a39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 23 Feb 2021 05:31:34 +0100 Subject: [PATCH 400/519] Alembic procedural: use an enumeration to discriminate IObjects Using the various IObject::matches() to do so was expensive and would show up in profiles as requires creating std::strings for each call. --- intern/cycles/render/alembic.cpp | 10 +++++++--- intern/cycles/render/alembic.h | 12 ++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 0f11a9368da..2f69cc99638 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -609,6 +609,7 @@ NODE_DEFINE(AlembicObject) AlembicObject::AlembicObject() : Node(node_type) { + schema_type = INVALID; } AlembicObject::~AlembicObject() @@ -1402,13 +1403,13 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress) continue; } - if (IPolyMesh::matches(object->iobject.getHeader())) { + if (object->schema_type == AlembicObject::POLY_MESH) { read_mesh(scene, object, frame_time, progress); } - else if (ICurves::matches(object->iobject.getHeader())) { + else if (object->schema_type == AlembicObject::CURVES) { read_curves(scene, object, frame_time, progress); } - else if (ISubD::matches(object->iobject.getHeader())) { + else if (object->schema_type == AlembicObject::SUBD) { read_subd(scene, object, frame_time, progress); } @@ -1823,6 +1824,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = subd; + abc_object->schema_type = AlembicObject::SUBD; if (xform_samples) { abc_object->xform_samples = *xform_samples; @@ -1840,6 +1842,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = mesh; + abc_object->schema_type = AlembicObject::POLY_MESH; if (xform_samples) { abc_object->xform_samples = *xform_samples; @@ -1857,6 +1860,7 @@ void AlembicProcedural::walk_hierarchy( if (iter != object_map.end()) { AlembicObject *abc_object = iter->second; abc_object->iobject = curves; + abc_object->schema_type = AlembicObject::CURVES; if (xform_samples) { abc_object->xform_samples = *xform_samples; diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h index 6b0d32fb3ab..1bfdc9e6757 100644 --- a/intern/cycles/render/alembic.h +++ b/intern/cycles/render/alembic.h @@ -263,12 +263,24 @@ class AlembicObject : public Node { bool has_data_loaded() const; + /* Enumeration used to speed up the discrimination of an IObject as IObject::matches() methods + * are too expensive and show up in profiles. */ + enum AbcSchemaType { + INVALID, + POLY_MESH, + SUBD, + CURVES, + }; + bool need_shader_update = true; MatrixSampleMap xform_samples; Alembic::AbcGeom::IObject iobject; Transform xform; + /* Set if the path points to a valid IObject whose type is supported. */ + AbcSchemaType schema_type; + CachedData &get_cached_data() { return cached_data; From 87ef03745971e1c860894ddc18172a183f42ed26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 23 Feb 2021 05:45:55 +0100 Subject: [PATCH 401/519] Alembic procedural: cleanup, demultiply Object and Geometry Node creation --- intern/cycles/render/alembic.cpp | 107 +++++++++++-------------------- 1 file changed, 36 insertions(+), 71 deletions(-) diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 2f69cc99638..13144f46314 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -1466,6 +1466,37 @@ void AlembicProcedural::load_objects(Progress &progress) for (size_t i = 0; i < root.getNumChildren(); ++i) { walk_hierarchy(root, root.getChildHeader(i), nullptr, object_map, progress); } + + /* Create nodes in the scene. */ + for (std::pair pair : object_map) { + AlembicObject *abc_object = pair.second; + + Geometry *geometry = nullptr; + + if (abc_object->schema_type == AlembicObject::CURVES) { + geometry = scene_->create_node(); + } + else if (abc_object->schema_type == AlembicObject::POLY_MESH || + abc_object->schema_type == AlembicObject::SUBD) { + geometry = scene_->create_node(); + } + else { + continue; + } + + geometry->set_owner(this); + geometry->name = abc_object->iobject.getName(); + + array used_shaders = abc_object->get_used_shaders(); + geometry->set_used_shaders(used_shaders); + + Object *object = scene_->create_node(); + object->set_owner(this); + object->set_geometry(geometry); + object->name = abc_object->iobject.getName(); + + abc_object->set_object(object); + } } void AlembicProcedural::read_mesh(Scene *scene, @@ -1475,29 +1506,7 @@ void AlembicProcedural::read_mesh(Scene *scene, { IPolyMesh polymesh(abc_object->iobject, Alembic::Abc::kWrapExisting); - Mesh *mesh = nullptr; - - /* create a mesh node in the scene if not already done */ - if (!abc_object->get_object()) { - mesh = scene->create_node(); - mesh->set_owner(this); - mesh->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - mesh->set_used_shaders(used_shaders); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(mesh); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - mesh = static_cast(abc_object->get_object()->get_geometry()); - } + Mesh *mesh = static_cast(abc_object->get_object()->get_geometry()); CachedData &cached_data = abc_object->get_cached_data(); IPolyMeshSchema schema = polymesh.getSchema(); @@ -1570,32 +1579,10 @@ void AlembicProcedural::read_subd(Scene *scene, ISubD subd_mesh(abc_object->iobject, Alembic::Abc::kWrapExisting); ISubDSchema schema = subd_mesh.getSchema(); - Mesh *mesh = nullptr; + Mesh *mesh = static_cast(abc_object->get_object()->get_geometry()); - /* create a mesh node in the scene if not already done */ - if (!abc_object->get_object()) { - mesh = scene->create_node(); - mesh->set_owner(this); - mesh->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - mesh->set_used_shaders(used_shaders); - - /* Alembic is OpenSubDiv compliant, there is no option to set another subdivision type. */ - mesh->set_subdivision_type(Mesh::SubdivisionType::SUBDIVISION_CATMULL_CLARK); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(mesh); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - mesh = static_cast(abc_object->get_object()->get_geometry()); - } + /* Alembic is OpenSubDiv compliant, there is no option to set another subdivision type. */ + mesh->set_subdivision_type(Mesh::SubdivisionType::SUBDIVISION_CATMULL_CLARK); if (!abc_object->has_data_loaded()) { abc_object->load_all_data(this, schema, scale, progress); @@ -1696,29 +1683,7 @@ void AlembicProcedural::read_curves(Scene *scene, Progress &progress) { ICurves curves(abc_object->iobject, Alembic::Abc::kWrapExisting); - Hair *hair; - - /* create a hair node in the scene if not already done */ - if (!abc_object->get_object()) { - hair = scene->create_node(); - hair->set_owner(this); - hair->name = abc_object->iobject.getName(); - - array used_shaders = abc_object->get_used_shaders(); - hair->set_used_shaders(used_shaders); - - /* create object*/ - Object *object = scene->create_node(); - object->set_owner(this); - object->set_geometry(hair); - object->set_tfm(abc_object->xform); - object->name = abc_object->iobject.getName(); - - abc_object->set_object(object); - } - else { - hair = static_cast(abc_object->get_object()->get_geometry()); - } + Hair *hair = static_cast(abc_object->get_object()->get_geometry()); ICurvesSchema schema = curves.getSchema(); From 82605093e9bf3b68f6a218d46660ed62ea89816d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 23 Feb 2021 06:01:28 +0100 Subject: [PATCH 402/519] Alembic procedural: avoid storing constant hair topology for each frame Only store the curve keys and radiuses for each frame if the topology does not change through time, this helps saving quit a bit of memory. --- intern/cycles/render/alembic.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 13144f46314..627ffe2318a 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -966,6 +966,8 @@ void AlembicObject::load_all_data(AlembicProcedural *proc, array curve_first_key; array curve_shader; + const bool is_homogenous = schema.getTopologyVariance() == kHomogenousTopology; + curve_keys.reserve(position->size()); curve_radius.reserve(position->size()); curve_first_key.reserve(curves_num_vertices->size()); @@ -986,16 +988,21 @@ void AlembicObject::load_all_data(AlembicProcedural *proc, curve_radius.push_back_reserved(radius * radius_scale); } - curve_first_key.push_back_reserved(offset); - curve_shader.push_back_reserved(0); + if (!is_homogenous || cached_data.curve_first_key.size() == 0) { + curve_first_key.push_back_reserved(offset); + curve_shader.push_back_reserved(0); + } offset += num_vertices; } cached_data.curve_keys.add_data(curve_keys, time); cached_data.curve_radius.add_data(curve_radius, time); - cached_data.curve_first_key.add_data(curve_first_key, time); - cached_data.curve_shader.add_data(curve_shader, time); + + if (!is_homogenous || cached_data.curve_first_key.size() == 0) { + cached_data.curve_first_key.add_data(curve_first_key, time); + cached_data.curve_shader.add_data(curve_shader, time); + } } // TODO(@kevindietrich): attributes, need example files From bfb2e87a9ea0d8490cb5faec4d0d8a7066f0093a Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 22 Feb 2021 23:33:04 -0600 Subject: [PATCH 403/519] Cleanup: Use shorter enum names With the full node name at the beginning, these names can get quite long. Slightly different words shorten them just a bit. --- source/blender/makesdna/DNA_node_types.h | 10 +++++----- .../nodes/geometry/nodes/node_geo_point_distribute.cc | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index e72e9632483..8b0bc235861 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1203,7 +1203,7 @@ typedef struct NodeGeometryCollectionInfo { } NodeGeometryCollectionInfo; typedef struct NodeGeometryAttributeProximity { - /* GeometryNodeAttributeProximityTargetGeometryElement. */ + /* GeometryNodeAttributeProximityTargetType. */ uint8_t target_geometry_element; } NodeGeometryAttributeProximity; @@ -1613,11 +1613,11 @@ typedef enum NodeShaderOutputTarget { /* Geometry Nodes */ -typedef enum GeometryNodeAttributeProximityTargetGeometryElement { +typedef enum GeometryNodeAttributeProximityTargetType { GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS = 0, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES = 1, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES = 2, -} GeometryNodeAttributeProximityTargetGeometryElement; +} GeometryNodeAttributeProximityTargetType; /* Boolean Node */ typedef enum GeometryNodeBooleanOperation { @@ -1657,10 +1657,10 @@ typedef enum GeometryNodeAttributeInputMode { GEO_NODE_ATTRIBUTE_INPUT_INTEGER = 5, } GeometryNodeAttributeInputMode; -typedef enum GeometryNodePointDistributeMethod { +typedef enum GeometryNodePointDistributeMode { GEO_NODE_POINT_DISTRIBUTE_RANDOM = 0, GEO_NODE_POINT_DISTRIBUTE_POISSON = 1, -} GeometryNodePointDistributeMethod; +} GeometryNodePointDistributeMode; typedef enum GeometryNodeRotatePointsType { GEO_NODE_POINT_ROTATE_TYPE_EULER = 0, diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index 9b36090b6a0..553b8ea364f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -425,8 +425,8 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params) /* TODO: This node only needs read-only access to input instances. */ geometry_set = geometry_set_realize_instances(geometry_set); - GeometryNodePointDistributeMethod distribute_method = - static_cast(params.node().custom1); + GeometryNodePointDistributeMode distribute_method = static_cast( + params.node().custom1); if (!geometry_set.has_mesh()) { params.error_message_add(NodeWarningType::Error, "Geometry must contain a mesh."); From b2e1b13abde787c2aad97d5c317357cf84360bdb Mon Sep 17 00:00:00 2001 From: Patrick Mours Date: Mon, 22 Feb 2021 18:09:48 +0100 Subject: [PATCH 404/519] Cycles: Add option to change input passes for viewport denoising There are cases where the default input passes of color+albedo do not yield useful results and while this was possible to change that for final frame rendering (in the layer settings), viewport denoising always used a fixed color+albedo. This adds an option to change the input passes for viewport denoising too, so that one can use it in scenes that otherwise wouldn't work well with it. Reviewed By: brecht Differential Revision: https://developer.blender.org/D10404 --- intern/cycles/blender/addon/properties.py | 7 ++++++- intern/cycles/blender/addon/ui.py | 5 +++++ intern/cycles/blender/blender_sync.cpp | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 0708c371a0e..dc4437bdc52 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -646,6 +646,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): min=0, max=(1 << 24), default=1, ) + preview_denoising_input_passes: EnumProperty( + name="Viewport Input Passes", + description="Passes used by the denoiser to distinguish noise from shader and geometry detail", + items=enum_denoising_input_passes, + default='RGB_ALBEDO', + ) debug_reset_timeout: FloatProperty( name="Reset timeout", @@ -1434,7 +1440,6 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup): items=enum_denoising_input_passes, default='RGB_ALBEDO', ) - denoising_openimagedenoise_input_passes: EnumProperty( name="Input Passes", description="Passes used by the denoiser to distinguish noise from shader and geometry detail", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 68f6291b373..c9b4dc25cf2 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -275,6 +275,8 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel): sub.prop(cscene, "denoiser", text="") + layout.separator() + heading = layout.column(align=False, heading="Viewport") row = heading.row(align=True) row.prop(cscene, "use_preview_denoising", text="") @@ -285,6 +287,9 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel): sub = heading.row(align=True) sub.active = cscene.use_preview_denoising sub.prop(cscene, "preview_denoising_start_sample", text="Start Sample") + sub = heading.row(align=True) + sub.active = cscene.use_preview_denoising + sub.prop(cscene, "preview_denoising_input_passes", text="Input Passes") class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel): diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index b6a5f67ec2d..0e61f4f2615 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -1005,6 +1005,9 @@ DenoiseParams BlenderSync::get_denoise_params(BL::Scene &b_scene, cscene, "preview_denoiser", DENOISER_NUM, DENOISER_NONE); denoising.start_sample = get_int(cscene, "preview_denoising_start_sample"); + denoising.input_passes = (DenoiserInput)get_enum( + cscene, "preview_denoising_input_passes", DENOISER_INPUT_NUM, (int)denoising.input_passes); + /* Auto select fastest denoiser. */ if (denoising.type == DENOISER_NONE) { if (!Device::available_devices(DEVICE_MASK_OPTIX).empty()) { From aa4882506c9acb5483b506c5e1d1569ca8cf5dd3 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 23 Feb 2021 11:47:01 +0100 Subject: [PATCH 405/519] BLI: new FunctionRef type Using `FunctionRef` is better than using `std::function`, templates and c function pointers in some cases. The trade offs are explained in more detail in code documentation. The following are some of the main benefits of using `FunctionRef`: * It is convenient to use with all kinds of callables. * It is cheaper to construct, copy and (possibly) call compared to `std::function`. * Functions taking a `FunctionRef` as parameter don't need to be declared in header files (as is necessary when using templates usually). Differential Revision: https://developer.blender.org/D10476 --- source/blender/blenlib/BLI_function_ref.hh | 154 ++++++++++++++++++ source/blender/blenlib/CMakeLists.txt | 2 + .../blenlib/tests/BLI_function_ref_test.cc | 102 ++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 source/blender/blenlib/BLI_function_ref.hh create mode 100644 source/blender/blenlib/tests/BLI_function_ref_test.cc diff --git a/source/blender/blenlib/BLI_function_ref.hh b/source/blender/blenlib/BLI_function_ref.hh new file mode 100644 index 00000000000..86f761bbded --- /dev/null +++ b/source/blender/blenlib/BLI_function_ref.hh @@ -0,0 +1,154 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include +#include + +#include "BLI_utildefines.h" + +/** \file + * \ingroup bli + * + * A `FunctionRef` is a non-owning reference to some callable object with a specific + * signature. It can be used to pass some callback to another function. + * + * A `FunctionRef` is small and cheap to copy. Therefore it should generally be passed by value. + * + * Example signatures: + * FunctionRef - A function without parameters and void return type. + * FunctionRef - A function with a float paramter and an int return value. + * FunctionRef - A function with two int parameters and an int return value. + * + * There are multiple ways to achieve that, so here is a comparison of the different approaches: + * 1. Pass function pointer and user data (as void *) separately: + * - The only method that is compatible with C interfaces. + * - Is cumbersome to work with in many cases, because one has to keep track of two parameters. + * - Not type safe at all, because of the void pointer. + * - It requires workarounds when one wants to pass a lambda into a function. + * 2. Using `std::function`: + * - It works well with most callables and is easy to use. + * - Owns the callable, so it can be returned from a function more safely than other methods. + * - Requires that the callable is copyable. + * - Requires an allocation when the callable is too large (typically > 16 bytes). + * 3. Using a template for the callable type: + * - Most efficient solution at runtime, because compiler knows the exact callable at the place + * where it is called. + * - Works well with all callables. + * - Requires the function to be in a header file. + * - It's difficult to constrain the signature of the function. + * 4. Using `FunctionRef`: + * - Second most efficient solution at runtime. + * - It's easy to constrain the signature of the callable. + * - Does not require the function to be in a header file. + * - Works well with all callables. + * - It's a non-owning reference, so it *cannot* be stored safely in general. + * + * The fact that this is a non-owning reference makes `FunctionRef` very well suited for some use + * cases, but one has to be a bit more careful when using it to make sure that the referenced + * callable is not destructed. + * + * In particular, one must not construct a `FunctionRef` variable from a lambda directly as shown + * below. This is because the lambda object goes out of scope after the line finished executing and + * will be destructed. Calling the reference afterwards invokes undefined behavior. + * + * Don't: + * FunctionRef ref = []() { return 0; }; + * Do: + * auto f = []() { return 0; }; + * FuntionRef ref = f; + * + * It is fine to pass a lambda directly to a function: + * + * void some_function(FunctionRef f); + * some_function([]() { return 0; }); + * + */ + +namespace blender { + +template class FunctionRef; + +template class FunctionRef { + private: + /** + * A function pointer that knows how to call the referenced callable with the given parameters. + */ + Ret (*callback_)(intptr_t callable, Params... params) = nullptr; + + /** + * A pointer to the referenced callable object. This can be a C function, a lambda object or any + * other callable. + * + * The value does not need to be initialized because it is not used unless callback_ is set as + * well, in which case it will be initialized as well. + * + * Use `intptr_t` to avoid warnings when casting to function pointers. + */ + intptr_t callable_; + + template static Ret callback_fn(intptr_t callable, Params... params) + { + return (*reinterpret_cast(callable))(std::forward(params)...); + } + + public: + FunctionRef() = default; + + /** + * A `FunctionRef` itself is a callable as well. However, we don't want that this + * constructor is called when `Callable` is a `FunctionRef`. If we would allow this, it + * would be easy to accidentally create a `FunctionRef` that internally calls another + * `FunctionRef`. Usually, when assigning a `FunctionRef` to another, we want that both + * contain a reference to the same underlying callable afterwards. + * + * It is still possible to reference another `FunctionRef` by first wrapping it in + * another lambda. + */ + template>, + FunctionRef>> * = nullptr> + FunctionRef(Callable &&callable) + : callback_(callback_fn>), + callable_(reinterpret_cast(&callable)) + { + } + + /** + * Call the referenced function and forward all parameters to it. + * + * This invokes undefined behavior if the `FunctionRef` does not reference a function currently. + */ + Ret operator()(Params... params) const + { + BLI_assert(callback_ != nullptr); + return callback_(callable_, std::forward(params)...); + } + + /** + * Returns true, when the `FunctionRef` references a function currently. + * If this returns false, the `FunctionRef` must not be called. + */ + operator bool() const + { + /* Just checking `callback_` is enough to determine if the `FunctionRef` is in a state that it + * can be called in. */ + return callback_ != nullptr; + } +}; + +} // namespace blender diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 363d3003b3c..5a851b7b2cb 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -192,6 +192,7 @@ set(SRC BLI_float3.hh BLI_float4x4.hh BLI_fnmatch.h + BLI_function_ref.hh BLI_ghash.h BLI_gsqueue.h BLI_hash.h @@ -388,6 +389,7 @@ if(WITH_GTESTS) tests/BLI_disjoint_set_test.cc tests/BLI_edgehash_test.cc tests/BLI_expr_pylike_eval_test.cc + tests/BLI_function_ref_test.cc tests/BLI_ghash_test.cc tests/BLI_hash_mm2a_test.cc tests/BLI_heap_simple_test.cc diff --git a/source/blender/blenlib/tests/BLI_function_ref_test.cc b/source/blender/blenlib/tests/BLI_function_ref_test.cc new file mode 100644 index 00000000000..cdcbccc72e8 --- /dev/null +++ b/source/blender/blenlib/tests/BLI_function_ref_test.cc @@ -0,0 +1,102 @@ +/* Apache License, Version 2.0 */ + +#include "BLI_function_ref.hh" + +#include "testing/testing.h" + +namespace blender::tests { + +static int perform_binary_operation(int a, int b, FunctionRef operation) +{ + return operation(a, b); +} + +TEST(function_ref, StatelessLambda) +{ + const int result = perform_binary_operation(4, 6, [](int a, int b) { return a - b; }); + EXPECT_EQ(result, -2); +} + +TEST(function_ref, StatefullLambda) +{ + const int factor = 10; + const int result = perform_binary_operation( + 2, 3, [&](int a, int b) { return factor * (a + b); }); + EXPECT_EQ(result, 50); +} + +static int add_two_numbers(int a, int b) +{ + return a + b; +} + +TEST(function_ref, StandaloneFunction) +{ + const int result = perform_binary_operation(10, 5, add_two_numbers); + EXPECT_EQ(result, 15); +} + +TEST(function_ref, ConstantFunction) +{ + auto f = []() { return 42; }; + FunctionRef ref = f; + EXPECT_EQ(ref(), 42); +} + +TEST(function_ref, MutableStatefullLambda) +{ + int counter = 0; + auto f = [&]() mutable { return counter++; }; + FunctionRef ref = f; + EXPECT_EQ(ref(), 0); + EXPECT_EQ(ref(), 1); + EXPECT_EQ(ref(), 2); +} + +TEST(function_ref, Null) +{ + FunctionRef ref; + EXPECT_FALSE(ref); + + auto f = []() { return 1; }; + ref = f; + EXPECT_TRUE(ref); + + ref = {}; + EXPECT_FALSE(ref); +} + +TEST(function_ref, CopyDoesNotReferenceFunctionRef) +{ + auto f1 = []() { return 1; }; + auto f2 = []() { return 2; }; + FunctionRef x = f1; + FunctionRef y = x; + x = f2; + EXPECT_EQ(y(), 1); +} + +TEST(function_ref, CopyDoesNotReferenceFunctionRef2) +{ + auto f = []() { return 1; }; + FunctionRef x; + FunctionRef y = f; + FunctionRef z = static_cast &&>(y); + x = z; + y = {}; + EXPECT_EQ(x(), 1); +} + +TEST(function_ref, ReferenceAnotherFunctionRef) +{ + auto f1 = []() { return 1; }; + auto f2 = []() { return 2; }; + FunctionRef x = f1; + auto f3 = [&]() { return x(); }; + FunctionRef y = f3; + EXPECT_EQ(y(), 1); + x = f2; + EXPECT_EQ(y(), 2); +} + +} // namespace blender::tests From 420f538fadfdd7f9713db9aea44cd7829cbc2ef4 Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Tue, 23 Feb 2021 11:37:12 +0100 Subject: [PATCH 406/519] Fix T84707: Wrong icon for Movie Clip Editor Sync the list of icons in CMakeLists.txt with UI_icons.h. Restore, in the source file, the FUND icon that was accidentally deleted. Delete four old/unused icons. See also D9715. --- release/datafiles/blender_icons.svg | 1 + .../blender_icons16/icon16_brush_blob.dat | Bin 1048 -> 0 bytes .../datafiles/blender_icons16/icon16_clip.dat | Bin 1048 -> 0 bytes .../blender_icons16/icon16_force_boid.dat | Bin 1048 -> 1048 bytes .../blender_icons16/icon16_sculpt_dyntopo.dat | Bin 1048 -> 0 bytes .../blender_icons16/icon16_sealed.dat | Bin 1048 -> 0 bytes .../datafiles/blender_icons16/icon16_temp.dat | Bin 1048 -> 1048 bytes .../blender_icons32/icon32_axis_front.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_brush_blob.dat | Bin 4120 -> 0 bytes .../datafiles/blender_icons32/icon32_clip.dat | Bin 4120 -> 0 bytes .../blender_icons32/icon32_force_boid.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_mod_offset.dat | Bin 4120 -> 4120 bytes .../blender_icons32/icon32_sculpt_dyntopo.dat | Bin 4120 -> 0 bytes .../blender_icons32/icon32_sealed.dat | Bin 4120 -> 0 bytes .../datafiles/blender_icons32/icon32_temp.dat | Bin 4120 -> 4120 bytes release/datafiles/locale | 2 +- release/datafiles/prvicons.png | Bin 16045 -> 23983 bytes release/scripts/addons | 2 +- release/scripts/addons_contrib | 2 +- .../blender/editors/datafiles/CMakeLists.txt | 103 +++++++++++++++++- source/tools | 2 +- 21 files changed, 105 insertions(+), 7 deletions(-) delete mode 100644 release/datafiles/blender_icons16/icon16_brush_blob.dat delete mode 100644 release/datafiles/blender_icons16/icon16_clip.dat delete mode 100644 release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat delete mode 100644 release/datafiles/blender_icons16/icon16_sealed.dat delete mode 100644 release/datafiles/blender_icons32/icon32_brush_blob.dat delete mode 100644 release/datafiles/blender_icons32/icon32_clip.dat delete mode 100644 release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat delete mode 100644 release/datafiles/blender_icons32/icon32_sealed.dat diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 16d50623fa4..6fa54c25de2 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -3209,6 +3209,7 @@ + diff --git a/release/datafiles/blender_icons16/icon16_brush_blob.dat b/release/datafiles/blender_icons16/icon16_brush_blob.dat deleted file mode 100644 index 4f57ce5ef276d8c727efe59ec8a3bad074421798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmb7@%?ZLl5JneG0YNZ$+cqRxi3M1PC4^uJ2CYT(q6Z7`2kk&TxW17DHk(1sz$4jj z=bM?`kk}X#L$71Z6echO=iC}Lkg(l4@NGe253Ot9>B9~r4lrmt1fB$>zr<$_o+&Kh z3{N;h0Yj}mx?khQ`UP5uoC&c`G+x0Qcmf5%##ZcXEj@sR*YE%-1U-T$@BpbSLwsL$m$g|E z5&ZC&o$UPC$%YhWR={y&HYYAJvpxJmUDq`*RE zcV@YC^;t{iv@XmcHc~)=>88Mco8;aD^6P-AN8G1^&des3}2bYX;2{t4g~+cQNLmJJH?L Ge)k2$fv{fy diff --git a/release/datafiles/blender_icons16/icon16_force_boid.dat b/release/datafiles/blender_icons16/icon16_force_boid.dat index 71f89bd7c0440f75ecd56ac975e9a5f6d398c668..f719054d84acac167b928f37977b0aa9eb1f556a 100644 GIT binary patch delta 20 ccmbQiF@s~nW=2M?$y*rh86R){!l=Ro07@eU=>Px# delta 20 ccmbQiF@s~nW=2NN$y*rh86R!_!l=Ro07?-C=Kufz diff --git a/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat b/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat deleted file mode 100644 index 08fc3aba73c5bc29285b2ede70e65976eec2cf41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmb`GISzqA7>0+6h^4l)oPrv$)eb->AreZJI2DHw6grMT|9f8fM<$bu5GHvt-(=oz zo26ikDZoBq%oc`8V^;9*5k*l3>M()@tO88@+~}$>hb~kg?Q247wDO%n3FNHR(QIxF?NgMs#$TX2bK`abR&%@R_eezURv z72A%BtM_e0zxuoN_v8F+;;IJG@^iXt_8Xw{>%#%QJwNyUHgOEy#q%uOTp=564W>{8 n)v<#+gvRUr*q8_vL+?nvlp$sJKArKg|7VQ-)&Kc4hpT%4;82hd diff --git a/release/datafiles/blender_icons16/icon16_sealed.dat b/release/datafiles/blender_icons16/icon16_sealed.dat deleted file mode 100644 index 2c6e3bac48ff3931678820d7406738c836bc1865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmcIiK@NgI46MF@r|7mEkvXM zwhNIR_RUhH27a+(j16#`z!~}A-AA1lw=vYLfD=&JIC+j<>s*gq{X362di4m7Q!SLGMu jLB9UfKXY?E=c?EuDt%D}L|C{q2Ve4}< diff --git a/release/datafiles/blender_icons16/icon16_temp.dat b/release/datafiles/blender_icons16/icon16_temp.dat index 0c3a0bd5deba3d3645f959d75bccaf53bc90bf06..9abd6ac2a0d81d7b620d3f26472f77dab2a2b229 100644 GIT binary patch delta 134 zcmbQiF@s~mcE&)EEE^`6SPh)DhY87q RKgb*#W^2a(lPj1P008<5S=|5t delta 110 zcmbQiF@s~mcE-aKci3<+0KxzN|9K|P_pnAzQG#=5wD?JH70rm*HK)#5(M4&Sos*g z!n8DH7crD>I$WWHigNQBWyo*%dei*-)0{dAyl$h(6k<{`;%kS3(&Y{=JM zhj*wcn8?|;Jz{g}mcUtJ{TN-|Kjhz^I^d50^+Qj*FrggTu|Dc)-rKcx;1VR23-8at_ut=CrXU{j3+_ z^Y%t^olT7kr{?l}?tPnkiTNq`k$gWtk$tIg;S-)!mfTy(_x2Ur^dT``QHd@K-RCOi zd@hdN0ZVaud#(1S#48%bVd(3nis$Y_tG?1};!N6VQy;M7vrW(Wgx1gd(*KIlmz+MW zeqaC2m8(xp%{}N#1^!y85#A}d2j^fU{#+K$wr^bD!*ArsaQE>OxCBSJ&Jf~3V;`&< z9|Z5f8OZ)`0?rAD9iJp-?Gt<(;22ziXAnDj=@a66-~v2?ZxB1O_X*(CI=@eK-KovkdS6 diff --git a/release/datafiles/blender_icons32/icon32_mod_offset.dat b/release/datafiles/blender_icons32/icon32_mod_offset.dat index 232c79c0c597ce9ab1c073a8cb3a278320052da4..eb767471c255dff461dececaaafb3de6b61bb807 100644 GIT binary patch delta 37 scmbQCFhgO&o{0uEn=Ke^m?kQ^Oy0q41Ee-vuw-y;KEM~jIMF}>00V~%wg3PC delta 57 zcmbQCFhgO&9+vr5fUFjA43Qs?tBH}Qg`Y? zpFk6DiOcc(hCWHr={9|tHZDBLM_1QWpTFwVsSDG+UT+#UCVIU!c(sq0{qWx^MPM)( zjKL|m0t@gEp1{)vEL9Sv5x&RaBCIsfDeGImiavVBVJXqQPx&g$!X$K-LHIrkkHImh zI|t)c`rWn-I%i-V)V>7=^~v)9+=dtM4t_ur+bQcK&Ww4C`#R;ZO#3F~k1z^*U8Ij= zb1mlEahvlK@C?GQ83+A1G_*bNVlLs|){br)}$$@wNu)dommU z*jtXKeyBI*W%e~~Tc?b}s`}r{#HnwiUp4;bTA6Lt8FShehl^nRhdIP^6SS3FyOY$J zYk9M7Ds5Y*%(waVcPA5g!!y7B?1OP|F2tN1uA4fVXa`Cu%(8@Nx*z%dw}716$nCmQCY>%u#qeHaCm|Nn_Gq3c>W4UT^i9zmR0b^Fx$ Leir@y*Pp)upw)~y diff --git a/release/datafiles/blender_icons32/icon32_sealed.dat b/release/datafiles/blender_icons32/icon32_sealed.dat deleted file mode 100644 index 37d48608be24fdf96692b0af0f0c5959ea90e9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4120 zcmeHJO-n;D5RA0`18qI_H+fWlrZ+(-^k6~o1N|kQ%j@hj1L=^wP2|OkKG<$|vO6<< zkTjbR!Ul1@2;t@|g!?6mbHx8MzJXyFwur+_u?Nqp<<-uloBDri@j(3+&$(XkTq0g0 z-zV}_u1~Spe^C4PHVNXxN^#J-Rn6eR}Jg z7BtMmct)h!aV?7{b9Scf5Q`X($Pdcn)tJfZOyKEzv)MbuZK=P5zWwgeb1r*&x=xN( zoO7C$$E!K7eICwr&C27|oYy`N=elO)@oLU%pNDf@v+{T~=e5tnxvp7xyqfdcM;!U& z-jd*@J#e91Q#JXt2RQfH$-M>mGiM6<1$eawa%A+gcLwy^`SZ@XLaz3}dDXWXYu!Ce z>HmfYPrtW^8vULgYV~`0Xwi=z(*NHl!|Vai8u3BC*8I&<_X%$EVCTRtoj`3Kz7VCe Msf2G+p1=J42vjk8vj6}9 diff --git a/release/datafiles/blender_icons32/icon32_temp.dat b/release/datafiles/blender_icons32/icon32_temp.dat index 645206e8560be9929e74c0707a1581532824b967..74f6401712cd43061aaaf6fde708e909d288dd3e 100644 GIT binary patch delta 468 zcmbQCFhgNOFw^8GOyZM2FmX>VWr~Bd3z*ng-~9jo-)W+v#bgU+iOGpf!jqGka|M86 zC}8pf<^oK?1QtxeiHahVzp%t$D4wV&F}Z>@0;~8Btl~10YuG}tsF#`ihb??^3X{O( zWcC6u{g}Og7sa^~6@i*L!Z8K^U=yt2#HJEc5ayF!=#D lW{^!z;3)uy{9_;uizZOiyajp+95p+5rC}1Azw#Eu8rWyaT&8<;I7E3mLnwq_O;V1NRk zG&c}yOio}fn5Zc+`2};vL<5D%1uO{@4OAw7VTqY6z@$C7nl%(m|7H!HXrME>hAjj{ z{b38|{R`9#$CDG-i_t_Luots}+%X_We&9|3IXQzT1Km67lOOODBl~?4FU0G+c_m=Mv-vx(A`<{UOpopW diff --git a/release/datafiles/locale b/release/datafiles/locale index 6c693b5b0b2..aafea2abb18 160000 --- a/release/datafiles/locale +++ b/release/datafiles/locale @@ -1 +1 @@ -Subproject commit 6c693b5b0b27468d4fd2d2c47ea023eebbb0dbc0 +Subproject commit aafea2abb18bb42e7d31a6926b2caba90f4e0316 diff --git a/release/datafiles/prvicons.png b/release/datafiles/prvicons.png index 4b7b23aa00626b59e3d90708e07839c75866f453..e97e2ae330e64f901cd5ee6c64317b19cfb1f3af 100644 GIT binary patch literal 23983 zcmdqJ_g7O}7cQJa5fLyVy-7e(suFrt2_h&U9i%Bp=uLW0^c;vHpdcl56{I&&dWnao z59@G<$VABtzVymA<(X67tRd-e((e$zt9Zre9C< zc>*Au#Ti#5Dph+t8^+K)Vob;`sizmo&t4aJ8fAb!pAqkwb{XE;(X*&koL@ECxgC<1 zxxTX!wuf6@E?pk@MOex$@y!Xink=sW|EJH89d{x0=ARQWNg(P$+l<@LZHN!67n?L# z=^}51p(R8ak`8r+#4s2!86{v{&Og?dltP3+*crB&eV|^9b}ZS@gHyD-NIP@cSAVqQ zF8zSqLWqn+MN1*93Q)^?gabR&y4jwqq8@m@ zLTaA{E-am(A&*Em4EG-BCA8jJOc{y6h0zLL)1_*c?OQ9?L~?P;irZoI%T$9u%iOqw zYV$JXcnQd$z50Dj8y8mAwCG3;YP*Eskj^nQr9U9QCbZNH_RkJ2L>p)QnyC)`YIFXN z(TSDH9x3J|GQ@rrmZJRdvtu~{Npd<6=DCM zU4*CL>cNRlYpOHz=%O2)Pal?a>mcn;tTJbtRNZ9|Ovg>8-#TAntmG+8ukDGda+CJ` z7AIZn1itg<$mHk1r6TZew@Mu$#z|Pk1=ECdYy*GjML+#k4`veQ!WsSL6i)48lX^-{upvQK#gv=mKfaYR*m9B2resihR)dI?edYr6+~kK%oH4sD%h znc3xw#P#WLgfd`M%ah%O)Zcbpux@UE-ey>ifnyuO*YLb7PVcadVL#EIp&kABitd~N^fEJ;PL`S(AZ$Ork z3i$wK5)9vl7eeP0$9~Fkluv(Z%Vx)H$8f-szhi`Zk#+29ItfP%Eg9GU)2fz z2q9&BAv8ni;HkpEH12&rWMpOFi4rkH{aeY=S*`|z#eS<;wcjTbAEqP7!3&RfE83v; zB&<|iwho|oh)?6?^+CK;@yVFnjXTO`RQPBhN(J`QKVb!x56H?TGgQzK0zPwBK1mX{ ztCUZz1q9c4cTZ5i_Bk#K(hd!-va)As0jb>oIm?O*J4Zao%bA<~8$S)7%M|Uhm!O{$ zzK>HC$q<1_@vkT`I&f&5h&dW=6o<246uLeyh4AH=;%RU^+zNK#G+en&3M846eqm|0 z-!%Zy_@THk4w5r|rm)t{XkV2whoyNhog3N%oE`5{-pU)Agr!A%yjki(uE4OO!^~R~ z>vx>o-PcR$-3M2Q#ZQD5M^-BH`GeMGF`5ENvmgy|c(hh|_KGvu4e3H=!q>t4{hg=T z@ys^1A4V16bGd~Gx5yF3J!U8ev+xbYm#+1eP^seZ#R`z6VN->V7xP!Xe`*mI4iCD= z7*l-Wi;rroN51i%jjBMI+T1Dj;Lo8<`6^@hkYNr2iveodrqa9avfT-T}GJ|ooj$q-=9|^MoOwf z21~7ft3|aUX#2x+x_!W zm#Le5bms(w)P`of>dqdIogEo2Y2^>SQoV3C%bqn-khXzs@X6SH>&$_NneousnP+%m z$|Eb>5It~2DnW_o8}!a&z$l=`pxm28!^qM(o1Q*=Lc-)v40ATF3!mKWJs4hR&vw8- zlef4+nfTa~0!UR{9C0MXrcvv6HlgkfW^tVJj&}-f7A$Ns8|8x(w2)7_@P!a(lJFOU zpDA+HQ9h~QsKirl2Q}Bl!@*?aW7IKvVH+eUx+Orwv06SGnhOU-6Y8>{ah-)2P{7I%M|$$p~SziTd%$ibwQjhlsNu^f!YR05%Q z`8TCzr=}h)2jP}G`-tX$U$Vo&56BNkjhbt0fzWk1@xo_9nE7HPXcYMuPx(!;Zb*JC z%5-zXgJcQw4>%mZflsR0nSEvhGOs!ggb8>vT)1$HKuPT9mROI50e_{W($fu!7AAi0 zvM>YCjh`a?fb+PJQ!viA7Qb4nslXHEgswwA5fsZci<-@l2X7t-AC{r~&%rh5vI!ZD z=AdjVH8iSHc)Ql@07{E4qFFU7bJGi6eIfu!{RMs&?TVGb z7t!;lYw1|=Zj&@57n+U3iS!bL;zUe!^YxZEyg?K@)TSo%aGUnM zqU{hgG!RAnrWU~BV$z5m$hw7ET=!@zf*M??10;y8e;_151>J%6L~Wy{_8z}8`tuS9 zo(JUkl9MrVP;O;mhmR9ZqlM<2J!R@;z`EKdt+9RANlqj#ybW&mHNo!AxjdjO`Vtzt z1mch2kP-r_)e;_V&|*f=uY(m8-=V__ro5Z{+PK}Tq!7Fw8s+;w6|ZaFRVIZ#7;Dv= zF)a;acP&GBE$0P~X`4+HjgU`^R3{%!k zemPvD1xgs2ePXI)^D95esnm(M@XYl)2dN(a7;{)czNV4s5#9c+Mc5Nqz5i=|pDJYI z)PV{@J00ghIj5hjFtIHubk%u-{deK91vg;66S6!v+Z28TJ`LlH&c*GnTwCN1g82^& z@r|(K!cJQxwR=lw2C`8&O7Cm;Ovl0JGCoTo0&Gdw@H!av{-3H!ARk6AP4~kEd|6R= zG+<19QMfRnYWF2Ue$TNRfAQQcYarNlOawHk>vn1zkO$kp5Nu`t%8hKZ9GV*Qn#bRO z)s$OjxYL*vm;(WmVnsi`2fh=uxon09rwHFQP}G|?)ZrjHxPs$!J5yIC&LKhyBpHNH ztg6H>PVkQNjk^u)`GN-GvAwSTUcl}jZlfw8^QqF8<3YaD|*PS7F67} z1XvX}h#5%Tp}hoVXdX1!t=s`>ck&=*Q)oFL$`T5c-%z6@Z0*~Li-<*V1T+b{4MqJ- z3It8w;X0G0bJvkwLml3x`PdmKG)w-zkmL5^DFxX!frs4Nw*kGpk;Qm*OINN-yBef& zf*aIhhLUBPVQR^I@^_&CkSZ4#o%$^31(}FVX4qzWiP9&6H(J7s3z|+Ksd9sxL0JkM zw}=7M1z1fWQ_oAl8{(}&<^rK`NAG*!>O*Oe!J9rvKB{7DPQ)4{$iRvQ>^1~y1X>@p zZe?o7D0Ri5)?XIMwxWzW`A zT+G{ZW}^g@USGKct7+Q3cX(}&frP`SX$nW^0F|0&4-qd4+kA{;N&^mI!wn)b<$lT& zSZ0mj00}d!8U)q+P&$t&@wB>=AReeibh|$L3`>1_ArlO!X#8mLz3Si*BH$LObZ`9~ zcD(pO?h=h@L>?h?gki*A12iivk3f%sH$Y@%;il};#o5d=joqCt_!|6}1P2j^6Mz^) za{D{KYZf6m8WcI{cw4p>mQZ74=ug1;-4km-#Yz-pbh8V&4d0B}Pwju*rp6c=h0L~8 zyIC&{V$WNPdGMj~(3PBn(H;$v!(#1w3vs!=S7qe0{-^ghRqNi{?xd0gq9>ZwCPFce zX(OCehOdG78&WZZDM+X&F=D>u(zboNObMCEYdt`N@(b%HtOvw*)lNwM1fFwu4Txwa zhmJA#mZbTMtH1+Kuw}QHafyuh?=^=>38U}ngh)Z6>TR@$Ugu*2GR{a&!c_5Ut;~`B zvc0|a9+)#eMhXqYS!J&*$N;461x}7Yunj-Z?No$q`jFhs1NMSeJWBIi0_@fwqeWcF zqfwuv0pHMoxle*7ob&t~uNPH0{eLJBc_o(mOV?Fr%lqjiKn$ObZp=#pBVhF?fHN~BECKpaNq5;X2 z!~^pW2L8+LKF8G$7|pPWLgCmo^HNp=MXgHc_7kjjI{Q0Wpx)4!q>oF^9Ia&bYA!b$ zW3g40zWYOwP|5Ne&4%**Atsl?@Qe}%~8d; zz424!n&K`sEg>i!%#ny4b*w;?%2Pq4gxlE>0fJGQ@EIGmzZ9f{HaB2+`&+K=m|^&w zE08w=FpPj`59W z@ioCGuH65!CN(R?T0*?N$$o7Kk>9ansed-J{z8 zv#Jz&EJ5%2R*5$$)G6kjq=!zXK3t=#mamzII8DaK0O5l-K4ysGLY~22!n5aCn71Cu zN^*Ow?*}67&cNEAU^#RjT2^%SMRNg3h1WBpY7+d+)|gMnl5)RUz%=p65QhUk~Lon@UHK?4vxG9r!r9NS=B zA@n^Vao88GpUi($76| h1(U|El(|%z1o`u81Gq`q_wQ(TP6d^FK8wD)3-)KoztP zeCg?EUZLpYEdjMK=6gQ5 z7>LHJqZ67{x>4pjHv-?;v95~1+Ou4gf!R9T1;*Ar!G@&wpZky# z04in6?k#KCbNbqz*8j?~(H@y?p@vKe0I|oeIhyer0Get=J3<9U%W{Qbc_P24+mAIt zai4O3UtF%aCOxyOJ)oL4CU=dNCY=Qc2gxI4J!$OuqnjElwCY38 zcbIxQVd^x^ag>`LZ8Dq3353HZUE1z6`2YzL@?LYlWNB{97#FMJUN9)vK=JnC7=o&b zQ@vkYk5!R_A91RHR1&{&L3Wth#_B$bcq~DQ_%L2_pf<4OHPDdQE4Od`z zK(qY>jtAs+7qU!i8+`5yHdKUIo$m;>9H4|L6)m&Se)VsP&0QcZ;FU*f21fDyE1_Pl zq@WOUi>8-wFdkYzb?QDQx9HtcQ?zN%`H&>B!D({@76n32k$1q|uMH zgd04axBk8@xNg#c;27tiUH0=rX}vq*1B#_|-OgsT4%)GQPL&-xlZuO9nXgR5hJf<& zmk+*W^}A-1r7C=fU3XM{BPfa!?9tu!_%P#&RY>;bBM>GZP(s` zRIUQGw3F5ejraa^dD7GCHVT8n_(@Ea3mJn`ZKqyEW^=;iAP$Un@*VTq3@Y-7dN;ux zGklC07r6fQe%WJTc0tt+!Q=f3jsgm}4eRuQB9(u#{lbbTU|ydH63`f@x#zVaAcwJm zMSgBpG}LL+SW*n(2x%#`9rUH58S(S~D#E9r<-ndOzg2ap-dMoZ z;KW@E((o@W1$=-!wF~hHC@GKcv}8d(;66$#*WnsoF%yGDb}jLFpQoF7!kTl zyW|<6g~Kn@nP^Hnkar&`%)x|!^8f@f5Qum~*idbXAn6gGV2DI1{2nz!gjq}BvGbuZ zYQ~po|Gy3NJ)RKkUg9PnkY{jVZYW_LV%Wb@cuj$xjge5nn_dsa7doohmTRRv_}S=kK6NAt&TyK|0w@N zn1pf^`_`|`2OOTJRbd+ne*l;ybOY)$+;wDY(znZF?i?&~2G*mTxFtk_X`;f-kS%3B zQ3{OOZ{Gf5C7IzHVg6A-X3l>=7BFyid*ujeXYzT5wJ7Yk>22;9 z*7njPp$(^1glX=`+o}w1DA~8m_92&RH@F&@fPCP!Xpr3$x^tcM^-^74DQ(OjL1btv z8tM6#;ZgZ%E#gyv5`_+*dn>#>C?0*o{ge!&gXw^`+9)8}sS2 z{T#OgMBAy5w1F*7l6T*g1^}+cub}&T3hF4qq>|^{Sb>?c{rq3U6JEVV6=}G}VAP zqin+RAf?+7H6s%0<4kn1K9Kspjb}y6xsX|KyDte-1&!B`2N&S%ZLF|MimTKmkSQYG~Rg7T2WjN8q_HR@46hR?JBS#Es4=Tx3^ z2#E>|47&Y|!7~i2*LO50>!C&!ac9oMjUY3lI*Fjf@;J5B0tb!iK#+bHA=o9@)7qf zyLaP0o~XG>&m>Hh#jTxp?*L*17b0fQ@OJ>#mIeiXp358IkAn(~^h%*`okW@JtQ#vD zlLX`gR{FnSRX9SqDOc{fB=t;js{r9}LS^PVK5MD%1TUUhUAG0>z@h@Oo?bW-xU=;D zXg+`EkkM+;IAeT_DKO}HgNaiBqKmJNR%!Vzejd#!PtET>h$s`Ab0hKLRqcg614{4z zB7=SV2+D!N#c@9m+&CJ!A+rO7-L0b{u-YV-%%E{*=%d(&Cy;Wp~b~*923x;EkywSeH&HY;*_NAtEXt44d=;-8fZ zFg2hCc0l0mPlN=_n6jlki?q~PSHV^Z_>2&&3M7o&s-?j!?)%lHfqXv`c2MLSAXv=> zxYo&*zn?Jn1aZ;T$k4oALd0l~4cioR!`ohIu;BEkO9 zaFc3sOm$`HW1w_yf_$RSrF>l=QPND1Ex8_A-67D$t?#Pa%!ywJLi__;nxrs%5FSZ-nFbQx$N+)4Ci(|h;Uh-2j}pT! z!wdsWLe#V2l9Q>^;gP5#+t!Vf;Q|xX54gqxz(W7K=#mX-kP_g)cbCo|m*D)QcaLnk ziT(J9lJL>P5R_Jd>WB;S0rJ2RDR_hEy#5S`7-{$yxZUFJP5KFqCo?D8o54MbiJO)r z9{Y854w|X+Y!yg3xN$?tyuJ3%Y0RH7;wMg=r5_Epq~NHx7+>rauKNdDI};ZIwO_v3 z^A#&q1kQ>bzoMS zr$QD98vN%Fd5m6D9aLeZ#`=Q)R42}s!g%!@f(O!r2#JpYO$y0T3VO9Ompd`G=Xp)G|R_zLrjE_T55ef6rT%mV4dRR$1IdB)G zosMF*YkkK{Eh$7gRB!l@@&=?1iu+aF`e(~6;y4dzWo|Yd1HI*ndlg?2KHm~Gw0Fq* z;Kkkr#AA>3`oyxD9Y+C1KgZJh>Odnu>WU&43G^JC zp}ZAN{2)r{(BIFS>NrBIecpMx7h?TKm$5$AmO$qXC68nnjSAFE4kAciq$X@bquoEa z&xF2`@Yssh#{Y2vjPwJ(>7dmW*C+R@4!4=wp5q*uwS-|-I*QV6C@ro~Hp(Xeak=Ct zaKRz}A&@xZvFRf{`&EP%0YAU=#%%&2M7L95WuF<$bBBwWdBMoMy+fOq6!7ekX9?Lu zgRkKtJdL|wY|CELb-5oOZN6cfm2Nn~e+%PicGwpcg#0BxP^KU;GJM;MWtC+r<>S$s z=&{XlKJ(uA>&B+994Q7ZheXx~=zOr$+!%?&G^h8=pZq;=dIn6#nf$Is?WmD980U*a z#y}fSv3W{XD6%NNH=~Jp&%CSMHki>t7$#Dl#A(jsIaS!Jp$v_<(fRk*Q5Dn7L-+8WSXWzE?9z_ zk)7wEk?cSNQA7HFmI2N?b0b~t65!c*tdzkbu42#Nr)F_%X2hxLYOmLWPRAlfic$La z)=!e2J@O|f@0xd28!k_J&2m_Rlt=14OHTfc@V`QNid8A9g(G~8iTmLKO+cX{&FCWn z<01BZ^h+1P$Z85;l#`*0~#unFf;+ zZvhAfXkjJmYPJN*cmO~j)C`VE!e;*(PXp%55hh$Cbxdie)Za{WK}Y}&qERXw(>zut z3zn5hFW!1oimv0T=9}gkL^-h$@044aY;~`0B~@mj$8DUC+01ppd^m zASf!E{)*r7y+9dy7F1st-p8~icrWR5o@(icP9tFTqC~$+fpkN0woXI52wF^RF6LI8 zdwkR3tU!ZywU~umko(BgDPVYFgFJX0n9J9<2-$wJq0QScXtQGtJqcB>TFg*}rkijN{g4K)VgD- zAq&qPQR)9?uG^~A6obsRQ$tRUNYJ$zHJSst-LZ*Jv5RT!CU>Wg@|af5)Z!J806}5# zR$Rvaqi%g)m_Vd2YVoS@Hi-DG?7fOdr>8&-&zcRS);}r@A*X5z zAAQ2o0_PirnFaNHdG3o-8nCqRsAuZX_O(skj-NHyQ2(XVz(CU&ns_NkN0M|2=I^z1 z`n(G{3hkQOFUmz(!qQxpP6wnO_XFOlpH=!J<-VFvj4H|e2gbPT2mpy1l*h2H)%R8c zJm77VqTtr$n0-b*073F2`4rX`PXnS`Y2M!G!q;t;0ze+FdnpyhLiI3PT0Bs(n_ zIW;vPQ6ZNRsz5nKf*q{*FL1^Hzr}mgSJjV!7`bz6d9oG5F`9Huv2a*fKHwrxSE2>DdVM#9fvE4HzZP)E zc{jW?*L&Uvde6AD@hG$F11DNjZ0;+Tcj9sh%pZl+i1(<(S1F6U=1&Xc7>(-cJySa8 zxLCXRl@Mt=KR&>4^wqhbXOw#546N)&l*-V3RkuCE?*4ys%ZD1QP1UZlsvNX+r?&3{ zq79w+M6gF2S8qqI{f%#h&n*CC0Bl1^+o3$%;fBSD)!W4PT*T+Epvp>&_;9z6J0z|i zQz;^6q1L;aD3pF#)jIz zN>x;L0~QT&-wqnJPdB`ZyGSjr%nZ{-3A3)wbhLH+D*mtQ2eh@-uH=f9d3#2U6ps_*KHdh3RVyj(8&h@l z03MUd{yT*N(8Fk^5WiMi+nl4GJ;MRgnaH`H>ycb@5rhJ0AP9rS=kFajJf-CrEmKbp zL2M!Q_tzqR_2H>vbI-9q3PYyuAUn5Uo8qOaG&QRl!kax|pRUgP+C}eRl=<#WBT$=m z#(P~&um5@%;JiU%tl(guPL;a2Pkr7Svw2qcr@LQ+PG~SM@+VJJ+6eM3&cpy+z`Ht$ z$t`?`nA64i>jO8Cg8IbNRU_OC9@_y1WPaJx}kW5RWZ z0nTBhVPZlg_%cEnB5bb~R}fS-xulg~F_!+tbo|UcWdQV)W!_H0rhL&|HbiEhSmm(0 z@_5=Y8&_YJ6d**|i$-~3q7VTf_45s4w0TFbzDHFAm~~}A5pT#? z`|=(3iH?f{^D*_sOm>KX?5x7XeT^^%h$buv`ywvyV;|Wgx0+>tuOsfRu&UVMEw>)> z{B!p!P(#QPDETdM^)Q6w!7-(EIgCYvB)JvrYb< z7q-o{6yVX8lDFGObkemVn3~(*2rIDfQb2)H!^W>HAjKXF=TWnvkd~K+3&Hus5n7}u zE#0MZTbe}i`8%MgSAd3B(s1AdTW4Ye8@-XG+I#*;0w6#X{`1Qg83|VLU~2Bqi%wBp zYTMdq`6FH95)}U>JnRZ(ZHo&G6twjvZ%;r}uE3+!zW()059~J&xIo32H(Ewur>BJZ z9!OnzJrCT{awqMY+9{gZ(rK9*u4>!=dj+Tq@P1~8S?dp+lwQKYJ=BZ@B7LNO{{cA; z?RX~v!t8gRGXla+DDJCJNHtm0g(o~Er^2MrL_n|ALPRb&$P>MIqx0RPFeW%W&4pZB zto5V&`#&j5Q-431|LYGWG1FG-YEbkJaqCdmTu7ANc0kJt!hEAM4BF2W3b!;33-OUo zvfK33%lg47V)ri6?;SG~hg7iGXV@{2 zF@x-yQ@Y6U7-^U}%d5iw2l!&ibY|D{!Y<_dzNC^KNZ zap<^-E8&38p-9xN3PnMPx#<;vS2kWz;}KROty9P4DTi->(fmG2cWhrHy&V!gIjM;_ zJV+I1`$wLHEqNLv1oMYcv}s|#$B$xtoX?XDCSc?F{xP~G=XB~UoOg?{4W-t}qGj!4 zZwwYMdWjM@+JIc~zCSl6#fIS+hbR~Xcr>Q^eKRp-#}{{M(CGqu;}*{J+Q~hyC6G+@ zEx=t0UJPA2${AZ@=LR1O?EW4Y#+#ego{*PqrPp~$(?#J&*3$aGOge(}Y)JLwr1x>) zSvD8|n%Jfjp$vbX`q%pRQ=rg*nzJ1rY@Bz;oi2S5Slkd=1z!Z1pL{%YHTc|hX~^#@ z{8R&|v|x?DS1P`cH+L5wo3O7f%~ik{ZLW6p{v*0}zlpaAx&A=( z1f(5xFYErPLZH{PoZk9L#E-MlzfmGcnSk;pJdOpsTeJX7d-~VLz%u{s<;E8W$uHRU z;J#+bb?b_TfO48~B37|0`7AfA3}XhU?bESYy!Bzy8XA~$jMKe(?7I9y+@SNR?}MDf z0QZmQ?~S>b_FA*Mk-6abs&7x7id2F33y*MG|4}kPx-iwZRY>arB2Yt3q-D+7HGe=@ zM(<-{j(a~}=>I)OU)1r!BdaiF_Ky2X?X&)}(Lv9sp4FkpvN!3vjt^h}P5n{R6zcco zJ+kJ$bw!Yhqvb~Umzk7-#i0=ddv3v+$1rcL5j&Xv+nNWwOkc+|Lx;SkY_C3v8qHuf*L~w=`B=?GGYU z{qFK)`JOn?Lq%VP_pgv?F#r1~VQ|Z-@rFse-vY}27Ldy`;<~rJ{HNzK{e&>smCDvx zv~BFg$?BTrhozjkZ#;BH0XA9V*Gu}DIb4Jm+Ssl8{eP^d+MgE^xEk^8rcB-IK=gHT zP2Jd}iY-K8@!VZ|$xqJ}+Q&>}0}YZ0jOV$b@5p1FQG}xz_5zpDr!9wH<0;$9fxbAHf_I9Q2*APg`h4IG{g|? z$vEFHgqU8!Zee>mKs5o5;xGGXH66$LcGgRQIJ*y&3(Bcqi!HHV^kAed283+Wnm1Eee+tglzCh8~a_p2aI8=9St15nTi4(*%*eQt;?CKrwv;xnC+W z*FASpVkHFtS>fX9ec*O}eeM2f_^fB@S|5bO_4_10HgS!I<{S#-0|C@#)f+R0DeqEd zL;w#7{rv`@YRM|uxu_@08}EGvY6hSVY>}dfRxy#5eC?4ATw_*sG!-v=c9|HApA^9Fu=X0v~nb1+c^}yL}HkS|UuSKm?|B%t=FYxDc zuswdBNfzGEFr)0g#fb<=IujOtAIMGaJdpHs_Q5mtU@aT9PLLpDU{jX_aUe3=3s9UZ z^4a9hpYcYY%LcU4Z7PqWCI3!Z<#8xAM~eG}F9|~5c`@w^X5-}6Ba*MnQ!kS?6D-m% z*YqB!SPxliRRHGs-?=s8v03OOi@OIkxr@f7 z4vIrw-;O4C4+2^bV@`&0dd9@mLDyLhTC88YKhpt!RlQuWE$~4YU4}6RAv>FaX`;CZ z)AU_Xl`6Z}PGl3qQ&WJ7l1G@%8;9OZR=DYD9dRa1 ztNQ*omCQmS-r%19(z#4dFZ!Fppfzo{>=(l9C0bClL;8oy^uZW*Q>TK4pBNmmw6<9D)*(N>q^k4tJ* zPL&tS8&$m+sS;U(VcOjjUTj{hQ$nGqt6c|?%k>431N>W7MbC$uuA}evY-@*4OdJ_I zIe{rYg^vO|fZQ_&ARdGRK1%hF&E5|~+-?cB0S=c1AZn=Z$|i3XWVV+8u)F^{(pzmO zXq=#FR2MsZh%Kclr|h2A`-n|h+BJYvnKV=pLB2nSsW->pDo~}FunjGrS%p`0Ds@SW82fmeS2@0n{rBHSKA<( zMMH=d>}+3j;@r0*JzLvJdRNN2uiAp8%&})mAv!@a=8L1JEKQtIYWrK^S7&u@9M z)5DCAx7)5CmnOC8=2YK22Q@6Y#S!d_hyS$OG9+p94Kyz5O-qv2%(dqehcwYgBSrJs zgGKYt)FFQG={#tzEpoqvrV4(cXHU*v@;C0DFWM6CA}(N!;K{*pi|@nv;amA zQ_IsQbaNwF0RDy^owS>@u4kk0kz8?MJGpJ~T3-kekRnhXQ=N}SAe#kw;rzo7gtUZ( zx+5Q;KkW9jR@HZhV|uyLgM#if=4@Jd)eF8Xw{cGG5n7^LO1B ziK_6R!)jg!#yS8BAGzQtD|An&Zh)W*f^B+|GK6<#p)`+0BV^?1P{*hcMc`c%H;rg^ zKbVDaXJQn_(Un|}plWH7aW#Y%UsQD5^742TKSu>vwqWn_df`>IQYBED!g~Eyh;6b$ z?$adkb6cNX@Ol6d@YC*P;`>vX>RO$hg8>SeX=Wb=0B0M3`KM>(0ON+dTQPEC_-$?B zyTeC|{J+%|ND?X3xqaW6RGY9r@Mb6G1P6gI7P5})^u#3HVN3nir@@(i>^`35tfUus zx(gZjup$C_FYV<1O_-8I0H}?2QB%_%EJdlYu0L3}JuiZN@^wulj1p7$=-B+L>5SwN zi}6fOOOPY*MwI=&`cb>0kx^mO&AX6EdPB|O0Pr%7egzE3lT|PKYuK4X!Y6b)B}=~x zkCw-z$87c!B7*@VkG;%|6#Wo-fEx6#*>p-Gv_hD!=QTyx0=$M}owQ;UU<=3o= zJ_+ERD!Axq*O?hdKV6H-eqVVwz{qOA%nO-iC}>Pdi9sqjy9SG&VmiLG8!k}^KJ z@Uh$7c3GjTIy;`EuYm2HtfOx_?{5sMoCTfl16pk=;efSz>~!w>8IrF#b;fHYFR}asfd<4T~vDqIM8k&Z=b7XJ>MH^eru!Md&%g8TapvD}Q@n z_J;RLH>2+0rlEqzS-9-EjOsT|Qy{jFR(4ld;O9>8!;rU6*UV2(J$l-5ET+hPvW3(PG*@s<}COcA!YhY-eUsYv)(sbY*G8I#uw8%gF&txSz~D z9fLDfhZ}o$@p)EBo7PNIj+!l;b+ri|1HdakW&H6-pd2Fa*$ji-x|>gOqK7}axghJ9 z$Wa?G7Ru*0=oI_6==Pp&|#UT?{?L=!}J#F4L+ zH~omWK54XlkxtQ|OT1vYs&6*v{_=sfwkE`j2NsVAkTW=Z{==y~N}hUvZ79B*Ym8$G zn3mm+f;9XsFAp$mG&JCqOjzuSe1Id#+Oh>4yz*k%pT`9`J3(~rGg1%wZbB0M;`TAl z4;iHVDEXPUYDLLaATgmD1TxvLB4)M>ne!_TYC7ujU)GNEj&qGy^sIp-AX!jfCWoHV z*?4tt5s1;-sd9Bw`r{vrcnP%O#HbwTNX~ET;=cCRq+hy{A^l$nePvNRkSf$K{?Lkl9X)?d zso_84cK0kFV;h*q<9RKa}oLQPQYcXkf6y&ODIb~PNOS}8H25{-V2RlLE)?4vO=$)X!w`P|f=|s3u*JURT zqT-a6`@9SiwyW;kIBf^cW^YMd@0C7PG&z=$xfL4cU1lcR5B0hdyLKlz!h9_@OSO1- zyRp2OLmN0girHZ3{o$N8u_*=ZnlKbMtX)=^w@44Ik2tFGfcMjl+5^}+81f4)6&aM; ze_iY-&%x=9rOn>n5rHp)wLcMTK*Y02%vT-`Rch{zy;GwAlNoWun`KXT0AFrNk=I=c z)wssjSpPivQ}c(X^B2BMmycNu_?FZiR(kCFeW(hzqMr`9wskj6++98h@#f=Do1W;F zW4+kbnHxBdW$$N^Y!3!X`*OwJ^Ob(!E6EeRmsHv}BPLihgQ{BpXY8WVo2kGM6^h^& z>5HBab%+S0AEYGYJew&0{K5?LQg%k3*@qVj)X*bkJaB}P<$v{6y1(NZxvnCmL0Z5( z!Wb&+BZKV3;RnmrOxIbyoPCwEOkU#v-b6MYrI)>BnofE6Zs)>l5J*V;`0oNNdbI25 zcsP~o>a*A1?)J1!E(l%;93-dxCvyn8{>Hz7k{DB8gx#4aZmG(=k-RZBi%B&hDG%?a zl53UyqxsLo$J=zWTtRuxUSeP&mve^YeHWkX4X%C~=iEttdtrbcn*n;Ma2|LK2tTkF zneh#;?Add`^JOG`I@|)KWm9$;o(M_2uY0CC^&p}lzAYHs|CzA+;Yc_EYlfc2_|7Y2 zo7qSGnzbMv3-?*c!+s9ikUEiYJ6XYS4eT|k+gxOVihMCr-WTqsE>m=yz@C|C=rR6G zn_g6E6oS_`9ZrNEz3GWM6Z%q~zf1sl<>Il}+%4iyN0YZ5tHE@Dm0SVym%oY>e1R)7 z@pv4Vb>L|uqN0QVP?#iaT&Wfv1W>)`H*iKjh@m|cb3_(bKr=KlxF8l7_k1%$1YCrx zjdCVpS>>rr1~~~fITPD%vJ0$7!#{k~O!fK8#(sU>u0q%DabXK8H70Z>9V!bI)~xV( z+h32Gq8Z_a_YqqMc|UK13^Kp8fe#SXLFsFpS;4co~b{h$H=da;#?Vkyp^0nz%DHpoViGy;SZ8B%t7^bFO zCL4ji(|cDYFlKP+8!pV$Qxv`p4d1<^#7c8QwKa_PZ~?D&Xlni%_7MO``Wgs?qnV-H z#Bxj+($0b?8!6;>IjSk%QOLXd>0nF5QR z3W_}0a1pUHKnQPbw3G*4r2f}mSg#ew=4EZGr3U9#=6WWsp9j$@Xk=c#R;9*H7F}(Pgwi590`;TYIlq_gD|TSF|6X4}f|gWg&yXN(&Re1`pXv zA}#a^Hg z^cVA-#SlI{2?47p`(#|v1G24rt=8ecW)dXc<(af{yZsHRzQ5u6Lk4xwZ4b2*Z^`MQ z`iPFkK;?HE+@!3iL|xOJGc>o!m2wQ&Ki-6Wdj_2L_`uh((CRh~+eU%Q-lE zg@L^085oCNr!jm^6CZEWcxvPcPBr3;j&K@KMhtiHy%ha^oNYe?nFqER6<*d`cizth zFi=^h?fXRd`(DiKyNCa$o$GvSD*M(cRH*?0rD{L~M+OA~h!jf%snUB>Bq$JysC1IZ z3`A)P5ey)p6cwc?hN4K01Ih@2C|zk02T%k-Fw~ITo!_1N+<)MHyw7vK!IORV+H0@1 z&b!w8F4z6Yg6OyzAzE8)nZ{1$_q`<_#NkJsEr07Rgi;1Sy3=Oq0=?k}q^)yJMg-#s zIP>6VQoi&_a4Fg+3JiAvQf*<|gkxgLr3e26*kXMpiouC* zisn>Xx!lug)wr?`{X3HpiHMxLRL~SMV}zc%PyU;cv~QnivwOi7T}OX0hfJ@_=DlGk zBh0OKubO!;*9FJ0faZea(gxYnmmPZ%$GvmOW6mE^^jm#^t9jeiPra*z^2iYVTTX$jp7RvCJN{!#jo&=}e!`UlC;I zjHp=##}n)8!Cn)IvcaXKI{#XgFg8i79?g|oEX{GAJ7kkuOxQ@u^~! z1Lo2n=jl(o+-)u?2L0^5gn+)sE;y21s(TOMdH5nhuDvUdmIdR^TeSCjb zz$6B2&BR2$xhj2?`Hu0$M+_A$vXrX2D#iMnF;+g*iJ?3?x;THYG=Hznz0C~0m{La4 zGeZaL7$Am;a4=Ca^?~Bsk1f))M91<25c>^wg2>5VrGnf1V3p%#Ht!LcxF+yM50`oq z#;8KxG=xC&-O{B*Kk5>tr*Y-y`;6DW}wqrWmp z-S|fZjfxJyCdsWUv9ws;nvLc;2~Bc`9wcxDq8!=Y{|-hQ#P~WTws}ZxE%+s-O#izg z#Q+I{c(xkt^NyMX;!*c4T|s|@>7lL^QI33^^c}$@Q~kBaZ=%(r4n-Z8dis1+X5CK$f&=re%k2;SN3m4<6^qVwc2}(>U|Q z=PG(D8xUOm*9Q?)3l#D+=z6c3SQNwesBD?!wjAYARQH50Vz4RR!MQ9wRtC2lTU zDUdd|0hC8jhfA<^|DNrmg=6jvRe*`CFid~f51>%P+;R%e&&-la5k(&O#Y*1>d@(=x zd1J?5Ne?^6OC)_Ks#_FL7J?Jd4eX~2@96mo@PKYc$k5b=#8MN~l1Uf(7S3Wr-zeu< zC~Aw#Z}DCkgWeCe8;(@E2X%i&MF+V6`IrB!K1V07W0ox4HQ>WA^JCh~Us3G!!%Goe zSA2| zA;43kY+4KBVu<*#ZX@KDdmZLKR|d@A??FdolRaQ{LT%z>0;bMp5dvJfxL|B+LUkr5 z>@c{gmSnOp$&ZwtFviZJ#$T-|RU)R6CUf>?Za^QYEw(lEH=y3F7hXy|{Oi#>Be9XT zO@*$ajUT9|4_o+@2mXTr;Wdk#ik|X99j;55mqsmSlDmttBaK07?b(HjmJR;YtUTgUR=49Y85iGNizpCx$S^r_r3Fdou-vzE+HoDyJV&aA>?1jtdiiH zoI zU=+KsX$R5SaC6CnyMs;>5CBil>0vw={E|rqRPVij>L*6D>WmZ5VroJ-+O!&C%cG9p zzvVxL?)-PWg+3>`m8R&{z@f<{(_+K<(K?N)`0EyV9fzG4o);>{TAwQvpU;sXJs8T56!e!vtzmXD z_x!}v9G?!GSvV@9nFus)}B>6r8*etSf67^+`3BSFtMf3_~cQK?wW)x}Wx@DO{ ztqF(|V{qdg&Bpq?z51njRHsO3l$iR|Uu0wD^wk6CkRIr45iPT4nD zMVjx#Wta=3V=uf1(=iN2RB|h0LjEXQBQikM?g93CSEAq%co80PQWWmgLtl}RYT~~!OGTE z;qiUYa#iY0&5xH@^diXKMw^n+!hH=eH#l&DzH98OR(O)>232bTN2&01IEFmIa9ymJMu;wl@Bd zwBusX=oGl}AJ)etvMZtEVC=C9dC?p5X;b-0de!Tv%Em|05s@a+)`f8HNMq~S^hP#Q zv3)!Vh={DR+mo+;d;Y43JNPo|Q@&cb#tzI`Jti+Da(E<;yY@HmE0VKcT>QSM7(D2{ ztzKR;iZ+bWsx)LZ(oz(#9k+l$SDog83Gbwrh)&o8q;4^bEByK(>mp?{M~5!tFOSN8 z7=9XC44)TBQfY4bc%h=LMZs8ML>t}q>GB~LKo*xwN?R^zso?*`>qLB(ni9$(S;tzo z{1t9%sJ-z(KElYAS+~3WDlzOaf#6144Bje-t_-e}UM0J{`dEeEShE+nXK6RHVKK2# z!rOjoKl*Hzr{x}I0<$g*M@4(!+QgfswK$@ zFZRNFt@YoJLz1-V0))l5$!N0MlsNfYPF%O}MqX zkz>P(vuwK+D;kxY&VBJQW!$(?H+Wi4L$UM-#A&=Td2x>TH_vUiRbl7uXIN9zM zf_Q7UdmnUz{05q!NQvn@cCyT1>s^XG%AznhcDM*9esxnUF)yT?-rl!=)I}@y++ZG| z6CP=}v7aB;`upPX-AeF80~A^Dr=fez*3}eQ(nC}UFSQ5!Hi&tO7f=9AloXVNd6!Ee zMsjmUiUv={)(NzgP}4zlSLdRqo|28lK*gq>X^J6gz73@mX8Sm%6gZ|dZCQ1k9Tc(W zuhVBBi)w;dg!#Nut9L_wzHrG*Zlno6&Q$*^>>%>56+&4&H;0eLBG6Np14Gawo!p}XNnDnVXYUu9IHlT0@66!rIGvLW~`gWB(dL)(&Zr?5$t)c?+W zvR}!K(^rU0#EK&MR9+B1ji*AWCwUGWWb$5r*|3lV>F*H`UJ&rdQe9eu4TBZm^>`gF ze4-TQ9Ln>%LtO-8|D)M#z#A=x!bnWVP$AET%k$UtrWSWoCcU~Vp%riT?*HV4elTfS zdg&y7{3@ttJ|-D7nBHD~Io^ohK81?j_$R$wGoCA@%;ZIbpka+cMeA0UEp2%@VU3AB zTI$_Hb5FbDA#)0rtR5|8Am-qQS}+_kuD=l*J)pfrssd;QOb#Y#N)%uRpG20L5o zhPvrDj3w&lwW=UTz#12X=q{GG%~}+j6`GZHh3T|}Y5kc&S3=pQg#j5em~N$=?F-p` z?<#LgILR~=JzL)Th=)eir#iE+V8<1r1=McO7W1{=p&-BcO^d;lZjypNCuF_UdG2)1 z0PbO^zJMvb^*qJU_Oao@96sNzvu^;S(EO~i^&r|k^1!Z|1Nx;B91+jhJ3VXg0+*EZ zSh(2NACYN=`U)d|=uL$v0G+3__UAqVts3ZvI~^kiZ{oO2;}Tx-Gw*)*={{FElm(M9 zi|m98JLlRRk3Z>Mu)KHb_2J9gA%kC*7#zbW(WS@axJv^807dN;?qxDCB-zKwu1~DA zmwiir=#yMX?dYk`miK`}I@3*0JX-00WUE_qZd|LT%$( zr5~(9WA;s78(d5KI1w5nc!+*d$zEkaLA7&v{7mvr)Nsg529a06*x}N&cd2Ub9`%cR zpocCO+{!(`ok{AjN=aq-LqJRVGuL-BuhCx0Nrv?0Ro+)s)={Vu_4E7LY`Q|!SL2++ zvQLgv`(JHK*7=ZPu^qAdE%@1#?Sq^6yGvnxRk(KH(%KcR*vy=!9@nG!o8McYi?nGa z^wdXt!SY)`)sM3H{iTsg#wKVjy+-{!)=#=Hx5QD~Rl*B8FLBIz?gW2&L~30;_(e%R zO`8U9I+s*lZ6v%Z$Tica-=(VcGB&73jP!@^4eV1s|JbDpK0>;kN9ZO75iKzMC}B`O z4iZq1)YjF!@S=x*jGb4t-DZz9P6uFQ{$lpurphzU4f`Dly4!8+HWA2`2y&2!XnGY zPQR3>jNoWWq*eT&)jk>%N>XS(g#K~CP{V$I39r9!mY@c(Ym-CphYorx_7oIpv=N_h zZ8`0Vu55vbvcX*$LK8gQsv|y6m4Cw&Z&8_uIZQylbLg_p1x<8MRFUJHO^v_LS|*_I z--`qPk}$KgEY|>BD*G-9#R|4IXxMY#?%RfP*Ff3O-h~O}F4s~f+%RbRpUGs<4p*_` z@@u1fGMLr%!Vk_-Oo+}F%71sgqpKBhfc{-Sze-a~C&!thxq>5->${c$@hj5Py&pn6 zMrZ94i2a?PD7^9zq*BB3R(~pFMOr{l>7#zeA%B9OeH7nG(^<6K5ZAV^SRnb04&5EW z?g4iD@_A>Ov#lt{a{Y+Qd+uMq$Kfv}&%i1Y~gGtXgCsu-cHhFUv= z3*=inK`%xg5Z{=gj~4}2;i{n;T0I8eVF8tlfBKeVSf^08dj0_WH!#!$u5AYkeFEkj zf^F_gIo^=0>-$6R*#exE11(#N)q0(T5}-}!g*earvQiWx${TB{cl{}N--|c88Fz_l z&Jmhn8-h#61D({5U##*JHkMys`ShX^>IJP!9B9f~D;||4Ity#UF#gmQ#rmU54uR(F zym7zY8|PVQ*7bKcB6At{lc*81Ph*Z6&A)o-yad5aS z8)0wrEK(&<$1;V!fegNJSJ$dTCvRsF*n8Dep!Dj>A~xE06BivL4!jI`_NDLnbJ3+( zN|9km6aJ_UTC$kKPeht&qQ@Q~Wr=g?jADsap}5~Fn>n9U3N7HKcGf!@xpzbR|CDsf zObetgBHaSVj^a6gbO}GPL{EXsTyi zdCq2$Jhal2T~C|5*>~I$&C_$&zfa${LC^)bO3l00ug5a^N^WX;EAfyvh1u8Vxh-P6 z2c0s0neV}}XQgF`!m!0q6G?m92UZ>0_QLmG-=>BkkHU44{@!LYhKd7!=Q~w-Y@(J< zvYwGWN5c8Qf#ObpOb)wP3bYl&n2n$!0?4|chhtW=MyRoSU*3e=0l?QE_~7!x~Kp}~oGtP0})6qn};cJlwv|A__q cD62ep7o&L5k#RK~h^@n{PdQ*~PXu23FVR`Qj{pDw literal 16045 zcmdtJby$>d^FDkp3P_7|2#V4T(y3C?NK3a$H%P65(jd}}q=cl>u}J44NOvyXUHjgP zpXd2L-{13l|9_8nk3;dmz2}-aXRdQ*uDR}DRb^Q`Y)WhZ0PtSONxcLBOz@u&;LdIE z2TgxLG57<``PmDNJ9jiUWl+Dwa*)$?1_1n4)E`JJD?SzYO9~fh9T#iGu})y^~e)wkRb4h_k(rdaB_uv6X5C)z=({?l3%jcw6O6Cj;+58Ll13y=_y4g^Vt|t1Co0dVU^Zit7sezw{{R+A%wlAf+|iNlVc1wnzN_txX*c{sRSL8m=XFd17@0)LKFTH0-XbzQ!4J0 zGE(3t`;2G<+ZXnD@K>_Dv99GBha%?}!lCi5V?xyD%}nb#PJL9eyf!zKRVazG94qzS z-j?w1RL-GzJ&M$exM9)Gyl{P8i#G(hpH>Ox^ETUa50?bfGANZ zuPN6Uqf*_>rj6~XzWrU>yt2sOtXZNB%-@h_8h_5t2-(o*WG3ZqG|GQ-1aBdUi4@|b z(7sH%Y}ea2KJ8Z!8o3kqBF)VN3(zL^*joCGw=t=FV`cb;(U!XFWbV2bZ8J5XbzqyN zLz?)G32IHjF5%qfFJ;;el32nw;k>O@8h&XuIO+d`XG$5gbad{>Z|RX&RQBmDPyV2(_-M z6B-NsYJ_c?ZGbesv_$wQEo3(y6t_hpc_XZy;m<6lF;=>YEBiZjbeN;elf|=lk~(>n znRA7Ukki_&$Ac3bBjHM80d|!EK|yjd@T2=JQK_z%>?!N}%b*^H{AQy@(F=9sAaKk~eRp4~`j*~Ma&*myYtgoiu$7k5NO^IE zv(LZl`_&H-qbZ8^mHd=+bX%fy_V97h?mMIbg%rz*BnK4zk5Z&nc+Kvw=+go#gM3GP zXT&(bs+k6FS_L2c%%>Iq$af~10CMVY`==7)n&+fS^E`D!G}VQcWTGhuPLGm`(2vMGDtd;gXQqpY}UDiW1ud?s8R(i#6%K zn>IM1K|f4wW}@G}GbE~S(e8_JgV!tlN`K$WQOAAl7xb|*`NMwfLTMKXnujvU7T&$omc0JVipFea6m3j0 zTp!fJOxes5VZ@eP$wJ=0%1ez@pIbU|`izZ{k`caHIn{5LE*jZMYG&cs6*d;JGV0@1 zf5fYvJ{l@^pCM5lmXF>Zw6bK z5;`AdhT*KMKldV5^D>ZkymthYZW^}Td6i^x_Gs2Q50~I8_X2MyMd>mPc{i0e= zRD0vk2-ErR(a}k_uVK>+ti9??Z@?alpg2VXB)S!St_h$JnM#|@9Cvaue1#p3xIO;4 zp`V2ej!&JAR3J8PQYYCG3hOC6qq|r`6gA3=yeZ7Rg?TAGo+&M&2BAU39>q?qu8^ki@z4K{}#TYdc`Ykg)^fDsNe6iOX*vECt%)hg7#dV zH0PnBv2sJQvaEBZ2zE%&ABqyMn(^m_I$O@-TXFt;RRddJ63=b)D+p4eG=ZG_PaC~M zu;6*WCgpO_V5Qdm3Vl6ZXS{Sic{(~ZVrdui0FF`lPt`=W zA{HinEmUHloACKgL@9L9Rg<#(4%Y5TtF>ZuHD2cd{P()HYD)UmJwg-P2gV-p$Gl-H zKDfQmV7JCfcTYOyTgT7$jh3o)<|cjp(Rx-&m|;a|OyPVJ??mxn&*zbWkM)qmFgnMn zq`Cus7o(ObH^ZfztDHem{BLgt>m3vayQ@D!_mJ!)Ot z?+HE{H!Ye6G~@3QmWhGwx7Je^&^!8Y3vL% zCTwE`O6vw;@X?jv`g|bw@dq&vE^t-dGR~8I#@d1RoX(^K+|?BKP`bdH23vwcKcgc1=+IRm#OS5N=b*+czR3qR91aQ;@t-?IdvlK(5n6|f;|w!= z5ji!rqAe>j+EU$?Z04zK@S17S0x+*bDYa<;k;mhiGIIUCp4?z==tMBZbyEtz7 z2Mq#?Q!->h6m6NRg>TO*-d|}*5rg)T+&ty_%@5m{C9_Jb#cA}~l0p0>+yO&x#pl8< zr8hL38fhqq)vWq%LR(r2G)fhs0ptXGxZ}6HpA7k_4@MEO)Xv;gIcE<=@};2K3wrLW0nkmKmWoa8FS<(~2dJxidxEK}yFlcE+B49_a=? zj0evAeE>9jzN~OgyJi_}rL}SXxk8VG(3>sWRF`F!Ydsg|pb1Dxh{Cth(Hm)xpwyko z7DV*|f|8IY*INT`jnIs15iwe;AOx#pt}FI6dJ=g#iq~&@fPTwp{c!&Imlz~MPH(rF zJ34e{(^%=SGh+OKL4T`m4yej+15k#oO^rBEzb=$R0y>UC&@Fj)_HK4;e$7#ZgQq|5 zIFoisYIRkoqnR$@+e@vh@AOh2hFxhuIhA@hPeAmzCQ8KHx(!J6u(Letp$bINX7e2n zf525rjO_4;1e|sK?ElG!R(kL7r1f58u~chABQO+BSKzW?e~m^1)zNc4J6{X zaMBHQq)d*l04R}_t?6kRw+ctv`dTeAz<{7LtFpH1IS~qu=;E{KN=xZ6WA}g?SZhNU zev`C=|}2)A0#phxYQ=X=_xy4Jp468-FrxVLDnr z%_-EIS=JB^IHA_q)f#y56e6+0$}IMC(z)A{y738f+l^$p3S+A*^06{%^nueV`s>YK zJb?1C_nL}p1>_{VKBN(yk4eNw1G2iI- z4Wwm(z@osFu9(x7;dW5dMeQKh%e8J*U?%6+!3$O}1uCj;R+?Cb6kqeP!FRJRk5a~B zaFSzS+SciNSyWYIp7?i-G4xoW$J95wnVuKzv|J6hULy|e^`#z#pYX0Apm3IH6@5b{ z31hacyLZ2=<^O3);t5I~x8E`{KV^&ODix^s8n&YKfI69p3xlw#))ek@rUxN$DYixDppNv{Y{3JdfL79_?k(z4*T>ML?T z7QrZ?d3J%bLnA5_W>SZ~q#w#2@Sba{r!DMGaCBqn!!l$de3EQ`MOg(5OW-(GqP>Qr zC^PTcl$2Zvz0`X_#VP`Bn_QN3AQt*V7qsoRR0$bt%VN=UUIu8ah7)ok&}BT8kxFPk zcH&XZ&)2oZnN|Omp-j<-mX!}!id?&x@E(7qCHSN?3(0jTMSONc@!;{Q&nMldwle0b z$hUExHDTe;Z0npnAIVcvLaH>Td&U~h0_|flpr-H91*}gdiSv9}{B<+H$R(~w zm@R*A_1Wz=C}?HXb%_rsph#!QuSef{ zrLkS9^Np{=uV#-V`P1~)n9rw0jgweuqK6np8Y?pHAAX;`M++cW99nzzR2xhn1Fu=2 zzj(yWnId-;+}wZ1yP=ZZ$mv$kTVN$`Gq>OU?dWDN*0d+?>yhpZuK;%&80~rkKVQ{h zk9CQ~L|6|ZRvBjiL2U`Ou(imgP@OKp12Qeal8=lQtUP%wtK`qn`v=smUVY<(cw z^0K-S5p1KD$GG*E!xZy(u_Bt&L8$S#bNJUHhVlvo89blL4rrIn9;v8!N z?x&s$S!e*D_4f8!pkp7)l=`uxU-xkOA!NP3DyJSV9W%_j`fTyO@J@b@eps^dbQUhH zM!Y8!NBm;Si&#?O_dXpJ3)DiNL++d%u6&xplZ1{cp}0ZK$n|bFk!B;Va5s-nt|sy> zGMPfglAHMUB09!-sJ$N8^XAMo`q7Rk&I>)BV$e%}i?0c4){~EItQ+5w^1szGmoBxg zzH+8`&ci+Jn_M{lP`eHre=$)e5~;GK^p09yGwKgDjU8!2QRfDcjuGSsF*5A2CwdDPTde1Uy zv_uVHZ`)UZux&V%sY~RA{Ri6FkyHSNd86XOB7L86ogh>q$Y~bzuc_*GHWam3t;QM zB)%-3z)Kv5QlVmlvY$Y<;pJm#TKp0fj??wW!mLnI^npx37z_)rY8sd+0&_xF*rMnB zS|vAgL%BP%fIw}vg0E+|*|YB=4*dQ&tF)3Nvv^gZ%53|O=N!T6-uq{#DK|)I|1IZ5 zn3;h1ZDTw6ykXgotnX&$PU?Rbxfe|zUj;pgh^7+Vsrt|WhRJIGhYv4mGgf#{^_sOM zzFpz{4-NpBRwi$7co9|4G<7UUmov0}b+BG8?sF>3J9EIL7vR3x?w6q9P!k_%ZAWH- zq?>G%ps`D5ucur+`yV+d`u+>cAYBb1E#%G2^*l3vj)Gx0%UI;(f!#KnzTryG{OPo= z+GE1JLFSOmphE1%+D})YdZ)_G+KBS6D1h0qGt^~3QBSUqEm7pE#pXw1Zt2mjeR_Fo zwzp~P%d}@k@JW4N)vvOSk79SJ_RR$srazSQ-znh$!KVLDeQxY(%Jt;DOp8!n9r0wV z+kNU`$&N#`DNqxzwO@SOHyY%7UoNXavq(;-WGg<2kW401B2rTCt81o(L%Iv}#&kb} zm#BCFl>(#I^8F1*tWnblAM^^_9a;afpBTZK7LK%RQq)Hlvbt7PxEofc^<-prC}$>N z{)(DqEl)#~Q|2srNk6fdew654`(GxOa9cXEZ+x6}O(LpwrS8L)f$XYboLo#k+_4j5U8W`YNR_>#abVHVUP-{B#f~Q~`Uua=1SGGHuxg-}u1QGn6WQ zg@n;%Loh8cP?R>cx$F1=M~>GwD}iE`0zbeHw?jFw zOU(;u%Z@(0vBdPSNQ<=c0QJ9X&t#JG+YI_kYhI+L+qa?em-uSq-AA^0cD@+s}{eG*8o%bXrR? zlOO3S+Rla-nj-OKhsNbv{~Q|#PW-1mYqLI=-z;@6U9amZSDxChy+VAix6nB?H~paJ zL9Cw8CQ4cnLsDeP$Ewq9y22gW7528BQ9o+(@an+~+c!U;P>2n*Z`)hn;qjd)j&f#i zN3Dt+v%nz1Bj@hdq)gEE*_jlXE0K?V^84ERV%0%aKDl|fZG9*JR-*CpmV|auE&lQ6 z+B}hOaIFt3(v}atwu>B;d^pD}jj{c}pha@2WFYkH=OeuQPvOyc?Ei?}pt6*mSF0Z(KF!=2Rej< z2+~rf;gL31!?)Y`OCn!qW?wJWE@aIoyx0;Bp^jm?s)L(|F>EVIU8<;cnzAs8fS7#) zK+Kv_7F5t@m&DsE0_elCBm#3?jaPpq*5@2rNC7(-#wH(LIlsHlmkc)&%vq`I&2$}$ zQ}-&)Fz?YrT#{8hs5^ZmD_ugo!z$c31XPfuR9nzCJ>{PTA$ z{RMa$?wj4RTW@LQ<%ddlnYYzX%juvlrue|ny}>VL2X^vB3qle0*QAeJ=0!x)-OUiD z?ZlV&i98R> zTf}nOd?5J1!2g*_n)(UPV`$(PKij*AFPp@({HSJqVy_G;m73-9%<3RkW$1pJka z@vH@WkP5%Wky3Y;R3;p$U-U}*rC)`{wv~0vS|Lq+NC*BM&&zlH8fjO4_SAgzS(Onu zp4W=QL|24sN{YAfb{pp2E|vHkb{~)}6&#&S%eG2>`%_E>A#P3hXy3Qzbc*B`YfD*6 z=;0Y3pBE-i&Haw3y8Bb~Sn2>h+YA_YG{q>-NL=h$)$JmVDK@nbh&o;(C^8%2*6gLx zz=rjJq*uNZFJsYJWm0Lr(=C5eO%X4>I>{05kf1=21&lZvHkQE+vV8>_j(5?otv%q) z24JRBm+-1aL)C*kcVTtEhMT4->&v}#)^|U<}^dA_Uhc3=dPN~PDv2!mD$p& z3-^5D&S(Ep?CO?I_XwD=4&P{ZS*J`>Pf3Gaf9m;oOCK7TXRHhXYpwjIoH^?%h=U5{ zpb3$o_8|`glnk9Pr0OUa1ESZgGSTqK>Qhsh#)0qq@M*??EJL<&Ij8sjb$?0NtNNx+ zKEoX zz=mKIgv<^_08NTxrN&hDcODz7Rp&;V+?r86D5rAvvyHJWgn6)px4>=3u<{RVD)7Y8yh!?~)n~rp5NsqB_&DK@7 z-ss%^6nLYC#CySXAcg4NXfS>L)(O?xtR_9RLYnjcUOC+nQZJ^zGS<+{YJ?w8kFV^@ zgR8m^0-?c03w^=;b39<6O8$71U|XqGhbIyn(_Mw>KS7ijLK}yBFIoi;SxL zVMDc;{?$d$*3f5MdBc(0r33)0+1oN*pvYwQ%ZO*mJH6(P7DxQ;G*z%y1h<#i6dPEG z`n98%e%J{0-j&@kj6|xvo`HvQY8<(ov-9`R z2YxsIjROhxJ;d!9``xk^t4p+n!p=a z&GJu%%OV*Tsi(xgGC|o{ss=0iPi8+QlSs;9{tak9uL=;B%ExK{@ zzMbYT39`|#E)EVS0hvIh7ILrzs(iIM|4;o4Iz#8&!;XqaB!W-U`u1kr*t)Ov=3*EB z4M;G{4Wnk)!NH>ce#93KI?VlJcy%DpE%N)eSF3p1q1)djq>+Q)|NHxCXs|)@i2_UZ z?D?`0U-RC@uCBjJRIV9SN6%aS51_L%MPR$!7mO%@=-hp-$BsUisblT;0(@fmpC{Ih z-jSfZr~gkI0TP4)EnEVPD{qONFYGOF9Q5WR z_o-PPK?| zQX4s#{hv7f4G<0tW1HZ~H&UxA)21az8Swj|e?damy1w*|+L<&SHf9N-9*@>TMdZKh zT=3yBuCzjcTz$cf5)YPS8eMg7r0IDz1s{!;;LUo;UPqC(f|<>5e2&T&-ju~?C|YFw z+nBL}hhl4sx>*vmdrx2Vhyrm8ndot7T!Fgu?6f0H{~$Pi?#|mGaJoh~m1KyHB1G+f zI%j|cHrU~85!UcVseTd`$O;_>!dM)0!}d_UFkbil@O2~P2edJXhX2GrCBmFMd&y## z0#-f7b$o75-PpBz&#GGoAQiq*_u$YzPv)p30m#+*zhFvc?Kc5B*q)@ZYXE%81Ewi? zvt55TEuba5{BP|Ju5>Pj8p}rgB!H0^QFR7@tLKK^N&V*wNt(wL)xgw2~k%$B$ks;4*~tp@mWp|cvm z{ri7U0QR&|&0{G;n!nkWN>g~lb<-_l-!5JYO5oQ08(KL;aE#c0y5^&YN|SuXtJVW4 z%HeOZYXt5v5*Sm62lL4FA$)8DNe5JbOYT5+Gj9Uz^R>SA?xgMX+*$)zjZ~w7J6Kp) z(BcWsLIi`DkeK(>8yo9O-e!4Ht`NrRl&e+LdDxp^#Pc$@WNDX>pU0^>cVMkwthzA) z(bc)_fM<|w3HNeC$W>i_v!fD@@l*6{))OXZ1U`0#?p>=VTEU6I5IKH22nTI=aXbTy93puo=R0^f*$5cVDddjCNV6D2?-1li!25e>631R63KW%3`7qumy1@xy;dqd+$EdAV-Fk z#f0*@i+n>%;D%g2?M*d*7Uo)F4B}_n8DjyYfZPF^+six$aS5Rlc6?ApB9!|TpwV6G zlyD;7kR{wW=*tGrZC-<6-6I8**ezsn3S6&+OQfzfr=|S5)ti6tN&74ej0XmRv<9;s z^|I;P@+G@?GVPz4HGxgUO+fUrRyng*3GBZ+KrfZJs!0Y%-{*OMMKUINr^PCHAMR(* z@Vx$`ch7HRaT2%JtB1HT14Q6OI6|xJB!7(I=_M9ePAqlps-Cd_jTLq#b|P3SS>83s zj-|M_ch4=oPk**cufZqS~-tI%MNW=!(jv@`k* z5ax7~Wl#@q&09XrMR!mGACB6Czr0-QG;+50=Ih$1XMrxWK_lB|3Q6Oywd5*Iu>fAP zE^svOG4}8Bp$bgCiKH-MM2MQbZNTbhfx1Q=Fv_FJe=86Tl*ku96UBh7le+;$**rE9 zNY;NBF0=n+ee1nER{s{g_!WD_Y!p<%tG|O+bpzvm^cxX0xxQ2MEXRgs{pCoo_4oUy z>fCHgPt~EEx%`as7-!}reWsPtiaLGaUS1+L>`Owqxzx9V%D-8TG*%q7=l>~Dgcsnk z^L?6|H*N`iE#2^)b#bBW%kU`{c)Uub9;b*g_Z-vx?+Nj-14t7Z051!4I)Q4&H~MC+ zT$T7zOm^#~pA`x(C!JgDlS%aA{;)v~vj3?C|7yqr)eV=>4y^K%V+6CE;wwc?CS9aZ z;csaxE$3e0k_|@uOr>T6p}erEBCRO;Mg#aZ|i=sWU;x2jS$Zh zT#O6hHX`)WJ~WRQwAEE(0!|asC&JSGcQx6x!BVZRwaKmDD-mT9d#(Xx19yd3%@eRL zw$;@=4Eji2-oJi!RC?c<#LToeDi~nPsZbXML4grt&v{&T5(p(-jaBsa_)_-~)I?)h zJc15e@JWtFqY`6P0bU6K?JfbzY(ovCX6E*fus+nmlG3A&qSu05*73r}7Sg8|!>2mV z*_K_YWS3M;sHx5RZHGIIaSg{LER5W22WZs{CndpC9h`!(W;{B|%Vd{AmtRTmMB1Pl zhNHb5B5~uG8+Q~SVr|+lUY&;Hsl*i~QeY&oaO6F&8!5Tfgq7a#DVQ4}*Jl*duLhu+ zA9Z?YVRcADOaq+-XEDA=y`?%(=sfBNXA1R5OROudlS0k@LXh#lFncvYTbHC=5nuW| z3WeBjnzN!jKeK#u@9pjV`0@JbwaeOGag+*X~PyGm|ytHdfdV-vO~!fXg?zLH=k z8M{eD(G1!-^+lZ0lauAMTI@OYjP@o?+p&h@Ykm|wruuo6i$!jDRgNqNq4l*f-$9rJ zp~FY0VO)Cv6`u)5p4#t~cbWr{kxl~f5fNg~Edef}-vXY&py@17wFZgl)WSKwtQ74N z=KL_Mxe5z6bPvun+juLO4Bw(T*WjrY|8*)a4-FHPf&?}>>8K?l1e($iQcS|fU4-$< zt3cntO5xbVJ4Iw4uW=&x)m9tQDg7tZ1grCN8!%M>pc;hS*Xv04<>JKU`Cja~$H$y? zuW4X0Zg-&u&L`Kz!xCaQT_WuiRls~%oOpjS;b?dvM=VX4x~~#&bgFsU;7&aL#pH4N()}xZtHFkG*R|&H z`s9=CNQ%VImkC&~-pbjD0uU-x@m2nN9;2-oeR)L@doG*D0C>&GzzS_gWn^Afs9G!g z);Y0p3D{iXcj*aMUlU5;HdS%@hyGYu622fRo-@+#Olup(%z5PH_>gmW+`@r5`d$nz zp8#|wW+1s<3Y0E!0QPF!jxB)3{fnEZT$83 zyl`ys$K_AB*mG(}>mF$Cj^2-u5@~g-lbuMFB6sf;3qRksTcR*}^mrkmR}dSS%L^x~ zEM$qFw{9B>&1jlQqe{CPGUbB0UDs^}cvcoT8~M>c5J00V+u%b-lZ1gy6svgn4 ze(h&Z`bR{(aet_O7<*-R5u*g0BWNZ>joaRn$>~`?maJAou$|2~S%g85N(aj>RZWPb)Q zVjo^BFXY@Qy|BBvbL>z(kV`%7qEsF2utLnX{|Km&8vKQ)%eqmT@qk$Fwd$BWQM*Wgnbe@3|9qu zwmi?-vwEA!c12iU~P<}FEA>`MQ%S99>> za07G=VCW%;o*)-(J`fiS#4(`??}SgM_;2^9-BdjgrF12MN(863hNV%&XE;AM<$j8* zO*TzQ_uWDqxJ86I=1KUpe}LvHs0_x}sAEmTZjBN|u>rWQHa7RG-@eTijCjvO3cGg` ze?xa?cS!DM6;Rn!sP?G*vdvHkso&Y$9Ty-SZc1`Or&@08h|q5nN$d)ZGI4VGfVyKu z)!p~;7-AtCk)u-4eNqDjhkxJ^gN14Hw#X~gI=)TD<|_J(Xo3ZuZ;Z3i5{_;diE?2w zcuo4rww_vRpS0G@6dlNVjnb7qB?}$%Lrs&dJe(y?XsJ%KIhYc*E?z;0F*Sgqo}R$X z6`$DD34O%(8ZFQsJ=Np4rD3{TiQtH(4gfE&VmMw2a)wT-1Mcj*^%P;|+UQ&xH#^%! z>U8QuUaiIaFxE%pJxW8Lj84(2g5&Y~_zU3-6T4XW-531##{xq=nTbY`zHxJ?Scwrw z9}9Wq7bgM+8|vE6c=RM?>rvb$I5}ejZya>ln&5dryQaF`)|5WE$JB@6%$@hLc$9CD zf#-GG(v{{-kLtZ#ez%#v`}oN1b-R2z!M@*_cF!tIJ9&(et84iYU^ys_x+WFAOjBtW z_ztN7t}*G2v&w|dbqlRp09iydjMy;$iI(6B(GT3q`*5JEY0U4PhRWT1?N%hB9S-vg$;0hW@$i8-fl+ugYG7WAF!y#WE7u=vBV;ggc^qiV=EEE2CLH6_o% zOLxXNCpgI(c^mwVg!MNm-+~?Lg6H0%WEL+hfyAz8@vd<`|MC>Vh6&k}v}itC$8-UQ z;R|VW2jk82SBz@0LruX)6RYqVrCEW6!Cot=zTttdA4yBJK~A%At%1TTYe$kD0zuK0 zrJEgiVdl&V6wR)OEMyj{H!Us+n#a59^C|^@?MCoK!B+)@AesWS8X-n^uuopWMaJW<5L0A1N z+aVQeP92z1-TheyoYvih!=MUr4c_4@7!8$dwd|L)Ef;W8zUYvdKc2o@NeM2CY}fH! zHsmyRAAQ)+Q9!M+`OS5tzzC^liuT!kdugZd7(z5CZmKZ-K(tdDz=-+u)lSl6CyHnD zqpqoYu={n%My7sso&3UTdf0@M?jVMF_%#}#5HLtAqmNBy!is-wjpiuMUOvdPe!$yhK#lw?>I3)UuHi7ANB?UCX4i zB%tQCB$BaDLD3|z<1h((G_LQ(Xe<05{FuYLGJv>PK!&i6SQn3&VMKIRreun67?0n# zI#eYPeufq)kcB?GBJT#DloElQ$@1mFL}E48z|KWHTS*k@N>kv zz-ZV^DmOrzC9rkYD!>4{$eSqQLCs6RB6kmAjYktzF#qUX4le~UY@Y~*oyIKe?;}L* zEZCE%pRGBQsj^+sIMG^=akkua8MpIWLX(1v`A3hsb^K3M2Xmw8O)M=F`?)P0eX3Z| zFa)oD^r!<_K`Pv3tJKH&Q{OX@cG(toOX@WnP%A6`P#HCJ*lm90@&D5;+}GazUKAbo z;<)0x1O@w02z~_-6sh>O%69zQq1WxQ;`gMmvo%c_o`40{dCRYg&kB^q7ujHacH@W} z=Y}_d>f|!-Gm@sZX*rt+TJqA^{qQL^sOx6D*d0}D^OaMMYKs5$ukgLOcY$gWQT&)X zW~45K%zfEK(85jSAe+U0$TDkK*UpH^_b}`Y%fT}*{nYONmj|_X9Uxc9_tt$)!pD9G zhbFzw2|SgbvD$_kPy~5zO{5d#nC+qFI$)%L;|b<0P)V?FL=~sWA-+}^#MS58dUhEK zg4?SM`{rB%`ycD!(}_KvkJ=p5DJB;CCP-EP7uq*_E?43@nWqvq+%(}NG2P-=_oViL zA}V#fs)S!G*-^u9^-VEy=~~FVj^sX++xi#Us7oq069Q0?Qb`P(wwM8`71G!5$;RlZ ztGGw`#tr?eJ-4Ja1R-ptMMXF?p?DV;N=8cd!8ytuc-f0?h#enLrhkW-8E%|UTt@yhV^ zMxxzs}DE?_i*~RS8>=)qSf_RpHYAeoGX|;rvg_%30@> z7BXwT&j$Bsw#I8nPfg!0Rx=hJl_uzDo*W}|7LY>QTCJum?nCOJSJWQ?nBa9y8ZZwD zUhCe2fu$z6LQyi7SR(biHd$O|57yNeKSi#~gqp0IoqaeR(F4mx+!^0Zp45Cj9y%E1 zRWhMgQHPifHmMU4BK>{vxfrf4UdbbmOMtj|z?ZtfNk8@csDP};5YMy@18OLJ?Pu)2 z7_HZM|J7V{dCEZ*$F`hb_IGa#0{BgtmL~0XxFqyi7OZ8ySCiPs< zH@3rBn3dl1II?4*={!CZi4Y1D(I~$cCn6XK&pTe>L@%ws?V$Lr+wH@VM|NpF4VZu9uWnjkq2&b}h@-RzXu=ZBR{xghB(JvNXN9-%! zJpS^rv0j`?NB-rAijp#_94Qs=0mN zKq$YZcUibYqpa%^h@c5H>|awR0I#TP02Pf6qW;e;NJsSUWK(xn=~BOy zsJ7{VEEna zpwFN;YU9U9d8&__`?dT0(o|(fd8W{)6}6mg0}2B1ws_ zldlYO4F54CqOayo;ZnKuY0G{;BPfa@Txg@(ebuJMScD*ot+tyN9TO8 za;nddE0)GW>>fFiCXE2~jr_|o)+zyGKIf24d>y^*MLFS7&yyAJWGatGPYLgLW7b$0 z<(4-+f(FHOy*4C~X`Df4kkf=E38Pil&Zrz);;9bLF&6I6s2@ZRCnk#@7hgr2SUQ<# zi+4?SxzMOM(D-0m%1k^O4NN~Uw_EN=vYK^cz9@s8q6!TD#D`S-c_}>Kjb9S6^Fwh? z?~%BQo7~z~kP~G@6u;IQO2-Q?4vOj1Y2*s?l_g7HYQV04iC`=NN=DAQBy`%$Tz&T` zcT0pN&Nz2puH;5_j3~$O#^8zYL^zpa*9nu7`=L$|S1h{Thr#Pij1{A|j;STg^6F30 zW1u<_{THF5#Q3}gbT73QJ+=aN4nKTxmgDsuG~AKbTO)gAr#OSKcQq3Vx`mDNHD=>BpOu&fb*S%lk#{p`g2s z9FB9+dtKAP6Hjz;@NQi3+Q>{o7P81`-GY>$2j4uhEZ*#Gax!>>NBcwpjg_Jkmf(Kj zC2_KegKO;mh?&kp@B@-3?87b1TGF_Q)FI!ruKLw3A<+)G6?3NviNGk)9w8gVoxiH- zrE_*5zSC&7ZCc73^DNo3_=IHy#jLGfwQ=1mUbvG39!A~K`WQFa%ytj8YuMmny6K?@ zS{kofsAcGR+_DmSlIk^!Im~^s80joT-w||+VP%c*HT@B1K8mAwd=r!Xx)t0_U3xEb zlF-9cG^Q9zADr~kdjBG^vH2sF-7CAjvs?^0*4#|eRqhnKx;EgIy9vQ5-aL^}E{PrG zjph1yDAlvT1Dc+L#$j(?1@|m^x@WSVK1MlWV6wXRy;^p$d|lS;S|xCg5al?hzBD|c z_&1)lntdILwx)Hbu2pRp8shzR+nDM?@pdvVq#lQjU#t{cX<9n9d^#R!dRSwf>y;=* zhpK~LCO=ITd=GJLwZ_9q_*MEv`VG0d&gYYQS`A(((W<$Nl+=3ISo~6Z7sbq-iPpY! zUT0g^vcyLyJDH9SUdtAjR0TQkg(kL*xl*Q=^;$aKKMNqJ>Hj$)C50U^OfnTu#jbsT zCR_LpUHjTQAhyP>7G8ftM=`%@{v?{6iiECj{d(EP*lYPrWQJTg2CH`^x*m__txoH# zP*T6lGpX!Vx#=hgM0j!`d8_T=qRzYchU23ZopVPjeW=QA17KS9J65$0hv=32@Xqf%%H&bc^Iv-GU4}QTe^*{LTsR zFPZAGZ$CM(H(Xs51<8fBua@ja_>SI2nlbW9OO<=xJN=q8Dks!~`^L=Iw$((xi`tYvJd1qhn9Znv8`;J7>UtB8){val!I9~tvm$A{~zk2V2 zZ|%adWXaqX9Qx-dx949Nnh~p?2BEWI7<1#C1~G>%@TD!$6wl-0TgldrIo-U-`v23v df)|mHNU;|7f(Slw@a1ygg|xC%@iXHO{}0e#(@OvV diff --git a/release/scripts/addons b/release/scripts/addons index f01d08b7c5f..37af7e130b9 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit f01d08b7c5f7873e0ce8a77b84788e2f6b1ad716 +Subproject commit 37af7e130b99865575f1fa2315ef806f815b0f42 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index d71985e9019..a140f066ac9 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit d71985e901986970dfc86c3d5d1124d0f8c27518 +Subproject commit a140f066ac99e1860af38080f008507029a34706 diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index bd37df49e39..4c0d1b65465 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -53,6 +53,9 @@ set(ICON_NAMES collapsemenu x duplicate + trash + collection_new + options node node_sel window @@ -65,6 +68,7 @@ set(ICON_NAMES panel_close copy_id eyedropper + checkmark auto checkbox_dehlt checkbox_hlt @@ -75,6 +79,10 @@ set(ICON_NAMES screen_back rightarrow downarrow_hlt + fcurve_snapshot + object_hidden + topbar + statusbar plugin help ghost_enabled @@ -101,6 +109,7 @@ set(ICON_NAMES three_dots fullscreen_enter fullscreen_exit + brushes_all light material texture @@ -132,7 +141,7 @@ set(ICON_NAMES time nodetree console - clip + tracker asset_manager node_compositing node_texture @@ -140,6 +149,7 @@ set(ICON_NAMES object_datamode editmode_hlt uv + uv_data vpaint_hlt tpaint_hlt wpaint_hlt @@ -213,6 +223,7 @@ set(ICON_NAMES mouse_lmb_drag mouse_mmb_drag mouse_rmb_drag + memory preset_new decorate decorate_keyframe @@ -223,7 +234,8 @@ set(ICON_NAMES decorate_unlocked decorate_locked decorate_override - sealed + fund + tracker_data heart orphan_data user @@ -245,6 +257,7 @@ set(ICON_NAMES outliner_ob_greasepencil outliner_ob_lightprobe outliner_ob_image + outliner_collection restrict_color_off restrict_color_on hide_on @@ -253,6 +266,7 @@ set(ICON_NAMES restrict_select_off restrict_render_on restrict_render_off + restrict_instanced_off outliner_data_empty outliner_data_mesh outliner_data_curve @@ -264,17 +278,21 @@ set(ICON_NAMES outliner_data_font outliner_data_surface outliner_data_speaker + outliner_data_lightprobe + outliner_data_gp_layer outliner_data_greasepencil gp_select_points gp_select_strokes gp_multiframe_editing gp_only_selected + gp_select_between_strokes modifier_off modifier_on onionskin_off onionskin_on restrict_view_on restrict_view_off + restrict_instanced_on mesh_plane mesh_cube mesh_circle @@ -337,6 +355,8 @@ set(ICON_NAMES force_turbulence force_drag force_fluidflow + rigid_body + rigid_body_constraint image_plane image_background image_reference @@ -345,6 +365,16 @@ set(ICON_NAMES node_top node_side node_corner + anchor_top + anchor_bottom + anchor_left + anchor_right + anchor_center + select_set + select_extend + select_subtract + select_intersect + select_difference align_left align_center align_right @@ -358,6 +388,38 @@ set(ICON_NAMES underline small_caps modifier + con_action + holdout_off + holdout_on + indirect_only_off + indirect_only_on + con_camerasolver + con_followtrack + con_objectsolver + con_loclike + con_rotlike + con_sizelike + con_translike + con_distlimit + con_loclimit + con_rotlimit + con_sizelimit + con_samevol + con_transform + con_transform_cache + con_clampto + con_kinematic + con_locktrack + con_splineik + con_stretchto + con_trackto + con_armature + con_childof + con_floor + con_followpath + con_pivot + con_shrinkwrap + modifier_data mod_wave mod_build mod_decim @@ -385,6 +447,7 @@ set(ICON_NAMES mod_mask mod_cloth mod_explode + mod_fluidsim mod_multires mod_fluid mod_solidify @@ -415,6 +478,7 @@ set(ICON_NAMES pause prev_keyframe next_keyframe + play_sound play_reverse preview_range action_tweak @@ -456,6 +520,7 @@ set(ICON_NAMES vertexsel edgesel facesel + cursor pivot_boundbox pivot_cursor pivot_individual @@ -464,6 +529,7 @@ set(ICON_NAMES center_only smoothcurve spherecurve + inversesquarecurve rootcurve sharpcurve lincurve @@ -472,10 +538,13 @@ set(ICON_NAMES prop_off prop_on prop_con - sculpt_dyntopo + prop_projected particle_point particle_tip particle_path + snap_face_center + snap_perpendicular + snap_midpoint snap_off snap_on snap_normal @@ -513,6 +582,9 @@ set(ICON_NAMES uv_facesel uv_islandsel uv_sync_select + transform_origins + gizmo + orientation_cursor normals_vertex normals_face normals_vertex_face @@ -530,6 +602,18 @@ set(ICON_NAMES axis_top layer_used layer_active + outliner_ob_hair + outliner_data_hair + hair_data + outliner_ob_pointcloud + outliner_data_pointcloud + pointcloud_data + outliner_ob_volume + outliner_data_volume + volume_data + home + documents + temp sortalpha sortbyext sorttime @@ -541,6 +625,7 @@ set(ICON_NAMES fontpreview filter newfolder + folder_redirect file_parent file_refresh file_folder @@ -562,6 +647,7 @@ set(ICON_NAMES loop_forwards back forward + file_archive file_cache file_volume file_3d @@ -586,16 +672,27 @@ set(ICON_NAMES linenumbers_off linenumbers_on scriptplugins + disc + desktop + external_drive + network_drive seq_sequencer seq_preview seq_luma_waveform seq_chroma_scope seq_histogram seq_splitview + seq_strip_meta + seq_strip_duplicate image_rgb image_rgb_alpha image_alpha image_zdepth + handle_autoclamped + handle_auto + handle_aligned + handle_vector + handle_free view_perspective view_ortho view_camera diff --git a/source/tools b/source/tools index 2afbb8ec472..42a86b05869 160000 --- a/source/tools +++ b/source/tools @@ -1 +1 @@ -Subproject commit 2afbb8ec472cac5102eb239f57b006f8c9387685 +Subproject commit 42a86b05869c464c87185be378e668b4a9abec8b From 18be02b8590b0d7d8bbf9e26b1c49264e9fadd99 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 23 Feb 2021 15:15:23 +0100 Subject: [PATCH 407/519] Geometry Nodes: improve accessing attribute meta data This allows accessing attribute meta data like domain and data type without having to create a `ReadAttribute`. I kept the `attribute_names` method for now to keep the patch more self contained. Differential Revision: https://developer.blender.org/D10511 --- source/blender/blenkernel/BKE_geometry_set.hh | 17 ++++ .../blenkernel/intern/attribute_access.cc | 88 ++++++++++++++----- .../intern/geometry_set_instances.cc | 26 +++--- 3 files changed, 95 insertions(+), 36 deletions(-) diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 5b1882d0d4c..ad01814ce82 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -25,6 +25,7 @@ #include "BLI_float3.hh" #include "BLI_float4x4.hh" +#include "BLI_function_ref.hh" #include "BLI_hash.hh" #include "BLI_map.hh" #include "BLI_set.hh" @@ -128,6 +129,20 @@ class OutputAttributePtr { void apply_span_and_save(); }; +/** + * Contains information about an attribute in a geometry component. + * More information can be added in the future. E.g. whether the attribute is builtin and how it is + * stored (uv map, vertex group, ...). + */ +struct AttributeMetaData { + AttributeDomain domain; + CustomDataType data_type; +}; + +/* Returns false when the iteration should be stopped. */ +using AttributeForeachCallback = blender::FunctionRef; + /** * This is the base class for specialized geometry component types. */ @@ -185,6 +200,8 @@ class GeometryComponent { const CustomDataType data_type); blender::Set attribute_names() const; + void attribute_foreach(const AttributeForeachCallback callback) const; + virtual bool is_empty() const; /* Get a read-only attribute for the given domain and data type. diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index f394a4acb0c..2146dc805d1 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -685,7 +685,8 @@ class DynamicAttributesProvider { return false; }; - virtual void list(const GeometryComponent &component, Set &r_names) const = 0; + virtual bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const = 0; virtual void supported_domains(Vector &r_domains) const = 0; }; @@ -964,17 +965,23 @@ class CustomDataAttributeProvider final : public DynamicAttributesProvider { return true; } - void list(const GeometryComponent &component, Set &r_names) const final + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final { const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); if (custom_data == nullptr) { - return; + return true; } for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { - if (this->type_is_supported((CustomDataType)layer.type)) { - r_names.add(layer.name); + const CustomDataType data_type = (CustomDataType)layer.type; + if (this->type_is_supported(data_type)) { + AttributeMetaData meta_data{domain_, data_type}; + if (!callback(layer.name, meta_data)) { + return false; + } } } + return true; } void supported_domains(Vector &r_domains) const final @@ -1026,6 +1033,7 @@ class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider { using AsReadAttribute = ReadAttributePtr (*)(const void *data, const int domain_size); using AsWriteAttribute = WriteAttributePtr (*)(void *data, const int domain_size); const AttributeDomain domain_; + const CustomDataType attribute_type_; const CustomDataType stored_type_; const CustomDataAccessInfo custom_data_access_; const AsReadAttribute as_read_attribute_; @@ -1033,11 +1041,13 @@ class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider { public: NamedLegacyCustomDataProvider(const AttributeDomain domain, + const CustomDataType attribute_type, const CustomDataType stored_type, const CustomDataAccessInfo custom_data_access, const AsReadAttribute as_read_attribute, const AsWriteAttribute as_write_attribute) : domain_(domain), + attribute_type_(attribute_type), stored_type_(stored_type), custom_data_access_(custom_data_access), as_read_attribute_(as_read_attribute), @@ -1107,17 +1117,22 @@ class NamedLegacyCustomDataProvider final : public DynamicAttributesProvider { return false; } - void list(const GeometryComponent &component, Set &r_names) const final + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final { const CustomData *custom_data = custom_data_access_.get_const_custom_data(component); if (custom_data == nullptr) { - return; + return true; } for (const CustomDataLayer &layer : Span(custom_data->layers, custom_data->totlayer)) { if (layer.type == stored_type_) { - r_names.add(layer.name); + AttributeMetaData meta_data{domain_, attribute_type_}; + if (!callback(layer.name, meta_data)) { + return false; + } } } + return true; } void supported_domains(Vector &r_domains) const final @@ -1201,16 +1216,22 @@ class VertexGroupsAttributeProvider final : public DynamicAttributesProvider { return true; } - void list(const GeometryComponent &component, Set &r_names) const final + bool foreach_attribute(const GeometryComponent &component, + const AttributeForeachCallback callback) const final { BLI_assert(component.type() == GeometryComponentType::Mesh); const MeshComponent &mesh_component = static_cast(component); - mesh_component.vertex_group_names().foreach_item( - [&](StringRef name, const int vertex_group_index) { - if (vertex_group_index >= 0) { - r_names.add(name); - } - }); + for (const auto &item : mesh_component.vertex_group_names().items()) { + const StringRefNull name = item.key; + const int vertex_group_index = item.value; + if (vertex_group_index >= 0) { + AttributeMetaData meta_data{ATTR_DOMAIN_POINT, CD_PROP_FLOAT}; + if (!callback(name, meta_data)) { + return false; + } + } + } + return true; } void supported_domains(Vector &r_domains) const final @@ -1453,12 +1474,14 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() nullptr); static NamedLegacyCustomDataProvider uvs(ATTR_DOMAIN_CORNER, + CD_PROP_FLOAT2, CD_MLOOPUV, corner_access, make_uvs_read_attribute, make_uvs_write_attribute); static NamedLegacyCustomDataProvider vertex_colors(ATTR_DOMAIN_CORNER, + CD_PROP_COLOR, CD_MLOOPCOL, corner_access, make_vertex_color_read_attribute, @@ -1669,23 +1692,48 @@ bool GeometryComponent::attribute_try_create(const StringRef attribute_name, } Set GeometryComponent::attribute_names() const +{ + Set attributes; + this->attribute_foreach([&](StringRefNull name, const AttributeMetaData &UNUSED(meta_data)) { + attributes.add(name); + return true; + }); + return attributes; +} + +void GeometryComponent::attribute_foreach(const AttributeForeachCallback callback) const { using namespace blender::bke; const ComponentAttributeProviders *providers = this->get_attribute_providers(); if (providers == nullptr) { - return {}; + return; } - Set names; + + /* Keep track handled attribute names to make sure that we do not return the same name twice. */ + Set handled_attribute_names; + for (const BuiltinAttributeProvider *provider : providers->builtin_attribute_providers().values()) { if (provider->exists(*this)) { - names.add_new(provider->name()); + AttributeMetaData meta_data{provider->domain(), provider->data_type()}; + if (!callback(provider->name(), meta_data)) { + return; + } + handled_attribute_names.add_new(provider->name()); } } for (const DynamicAttributesProvider *provider : providers->dynamic_attribute_providers()) { - provider->list(*this, names); + const bool continue_loop = provider->foreach_attribute( + *this, [&](StringRefNull name, const AttributeMetaData &meta_data) { + if (handled_attribute_names.add(name)) { + return callback(name, meta_data); + } + return true; + }); + if (!continue_loop) { + return; + } } - return names; } bool GeometryComponent::attribute_exists(const blender::StringRef attribute_name) const diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index b315ff8a509..1a260c5d48e 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -178,29 +178,23 @@ void gather_attribute_info(Map &attributes, } const GeometryComponent &component = *set.get_component_for_read(component_type); - for (const std::string &name : component.attribute_names()) { + component.attribute_foreach([&](StringRefNull name, const AttributeMetaData &meta_data) { if (ignored_attributes.contains(name)) { - continue; + return true; } - const ReadAttributePtr read_attribute = component.attribute_try_get_for_read(name); - if (!read_attribute) { - continue; - } - const AttributeDomain domain = read_attribute->domain(); - const CustomDataType data_type = read_attribute->custom_data_type(); - - auto add_info = [&, data_type, domain](AttributeKind *attribute_kind) { - attribute_kind->domain = domain; - attribute_kind->data_type = data_type; + auto add_info = [&](AttributeKind *attribute_kind) { + attribute_kind->domain = meta_data.domain; + attribute_kind->data_type = meta_data.data_type; }; - auto modify_info = [&, data_type, domain](AttributeKind *attribute_kind) { - attribute_kind->domain = domain; /* TODO: Use highest priority domain. */ + auto modify_info = [&](AttributeKind *attribute_kind) { + attribute_kind->domain = meta_data.domain; /* TODO: Use highest priority domain. */ attribute_kind->data_type = bke::attribute_data_type_highest_complexity( - {attribute_kind->data_type, data_type}); + {attribute_kind->data_type, meta_data.data_type}); }; attributes.add_or_modify(name, add_info, modify_info); - } + return true; + }); } } } From c62e60f01f2afb445380f7a38975848cc0496873 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Tue, 23 Feb 2021 16:14:56 +0100 Subject: [PATCH 408/519] Annotations: Add layer Opacity paramater This option was removed in the refactor of grease pencil and never was set again. --- release/scripts/startup/bl_ui/properties_grease_pencil_common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py index 67905192fe8..8e47b3103cd 100644 --- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py +++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py @@ -478,6 +478,7 @@ class AnnotationDataPanel: tool_settings = context.tool_settings if gpd and gpl: + layout.prop(gpl, "opacity", text="Opacity", slider=True) layout.prop(gpl, "thickness") else: layout.prop(tool_settings, "annotation_thickness", text="Thickness") From 64c35769f921e2c7e83ac966d07e0aace7e5f1fa Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 23 Feb 2021 11:25:13 -0600 Subject: [PATCH 409/519] Cleanup: Remove unecessary double negative --- source/blender/editors/interface/interface.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 636efbc50ce..6e25ec9d275 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3428,12 +3428,12 @@ void UI_blocklist_free_inactive(const bContext *C, ListBase *lb) { LISTBASE_FOREACH_MUTABLE (uiBlock *, block, lb) { if (!block->handle) { - if (!block->active) { - BLI_remlink(lb, block); - UI_block_free(C, block); + if (block->active) { + block->active = false; } else { - block->active = false; + BLI_remlink(lb, block); + UI_block_free(C, block); } } } From b123aadeeebe20317183c7c9d833caee1eb7e59b Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 23 Feb 2021 11:43:06 +0100 Subject: [PATCH 410/519] Fix T85895: Viewing value passes in Image Editor displays the value as alpha There was a similar report prior to the introduction of the Image Engine, see T74586. This was fixed by rB6a5bd812b569 at that time, but got lost in the refactor it seems. Above commit introduced the `ED_space_image_get_display_channel_mask` function that will determine the valid bitflags for the display channel of a given ImBuf. But since the refactor, this is not called anymore (`draw_image_main` is not called anymore) Now it seems we can safely reuse that said function `ED_space_image_get_display_channel_mask` also for the Image Engine. Maniphest Tasks: T85895 Differential Revision: https://developer.blender.org/D10510 --- source/blender/draw/engines/image/image_engine.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c index 886f211189b..d75f887ce2b 100644 --- a/source/blender/draw/engines/image/image_engine.c +++ b/source/blender/draw/engines/image/image_engine.c @@ -113,7 +113,8 @@ static void space_image_gpu_texture_get(Image *image, BKE_image_multiview_index(image, &sima->iuser); if (ibuf) { - if (sima->flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { + const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf); + if (sima_flag & SI_SHOW_ZBUF && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1))) { if (ibuf->zbuf) { BLI_assert(!"Integer based depth buffers not supported"); } @@ -204,30 +205,31 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser int draw_flags = 0; if (space_type == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; + const int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf); const bool do_repeat = (!is_tiled_texture) && ((sima->flag & SI_DRAW_TILE) != 0); SET_FLAG_FROM_TEST(draw_flags, do_repeat, IMAGE_DRAW_FLAG_DO_REPEAT); SET_FLAG_FROM_TEST(draw_flags, is_tiled_texture, IMAGE_DRAW_FLAG_USE_WORLD_POS); - if ((sima->flag & SI_USE_ALPHA) != 0) { + if ((sima_flag & SI_USE_ALPHA) != 0) { /* Show RGBA */ draw_flags |= IMAGE_DRAW_FLAG_SHOW_ALPHA | IMAGE_DRAW_FLAG_APPLY_ALPHA; } - else if ((sima->flag & SI_SHOW_ALPHA) != 0) { + else if ((sima_flag & SI_SHOW_ALPHA) != 0) { draw_flags |= IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 0.0f, 0.0f, 1.0f); } - else if ((sima->flag & SI_SHOW_ZBUF) != 0) { + else if ((sima_flag & SI_SHOW_ZBUF) != 0) { draw_flags |= IMAGE_DRAW_FLAG_DEPTH | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_R) != 0) { + else if ((sima_flag & SI_SHOW_R) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 1.0f, 0.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_G) != 0) { + else if ((sima_flag & SI_SHOW_G) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 1.0f, 0.0f, 0.0f); } - else if ((sima->flag & SI_SHOW_B) != 0) { + else if ((sima_flag & SI_SHOW_B) != 0) { draw_flags |= IMAGE_DRAW_FLAG_APPLY_ALPHA | IMAGE_DRAW_FLAG_SHUFFLING; copy_v4_fl4(shuffle, 0.0f, 0.0f, 1.0f, 0.0f); } From cd9dbe317d59456fa10495d2cfc4db70e5cfc162 Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Mon, 22 Feb 2021 21:07:21 -0800 Subject: [PATCH 411/519] Revert high fequency mouse input for Windows. Windows mouse history function GetMouesMovePointsEx has well documented bugs where it receives and returns 32 bit screen coordinates, but internally truncates to unsigned 16 bits. For mouse (relative position) input this is not a problem as motion events and the resulting screen coordinates reliably fit within 16 bit precision. For tablets (absolute position) the 16 bit truncation results in corrupt history when tablet drivers use mouse_event or SendInput from the Windows API to move the mouse cursor. Both of these functions take absolute mouse position as singed 32 bit value on the range of 0-65535 (or 0x0-0xFFFF) inclusive. Values larger than 0x7FFF (the largest signed 16 bit value) are reliably corrupt when retrieved from GetMouesMovePointsEx history. This is true regardless of whether mouse history is retrieved using display resolution (GMMP_USE_DISPLAY_POINTS) or high resolution points (GMMP_USE_HIGH_RESOLUTION_POINTS), the latter of which should return points in range 0-65535. Reviewed By: brecht Maniphest Tasks: T85874 Differential Revision: https://developer.blender.org/D10507 --- intern/ghost/intern/GHOST_SystemWin32.cpp | 133 ++++++---------------- intern/ghost/intern/GHOST_SystemWin32.h | 16 +-- 2 files changed, 38 insertions(+), 111 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 43780b6d618..5d5ba90b299 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -225,9 +225,6 @@ GHOST_SystemWin32::GHOST_SystemWin32() #ifdef WITH_INPUT_NDOF m_ndofManager = new GHOST_NDOFManagerWin32(*this); #endif - - getCursorPosition(m_mousePosX, m_mousePosY); - m_mouseTimestamp = ::GetTickCount(); } GHOST_SystemWin32::~GHOST_SystemWin32() @@ -941,16 +938,6 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, if (window->m_tabletInRange) { td = window->getTabletData(); - - /* Check if tablet cursor position is in sync with Win32 cursor position, if not then move - * cursor to position where button event occurred. */ - DWORD msgPos = ::GetMessagePos(); - int msgPosX = GET_X_LPARAM(msgPos); - int msgPosY = GET_Y_LPARAM(msgPos); - if (msgPosX != system->m_mousePosX || msgPosY != system->m_mousePosY) { - system->pushEvent(new GHOST_EventCursor( - ::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td)); - } } return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); @@ -1033,82 +1020,26 @@ void GHOST_SystemWin32::processPointerEvent( system->setCursorPosition(pointerInfo[0].pixelLocation.x, pointerInfo[0].pixelLocation.y); } -void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) +GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) { - if (window->m_tabletInRange && window->useTabletAPI(GHOST_kTabletNative)) { - /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet - * input aren't normally generated when using WM_POINTER events, but manually moving the - * system cursor as we do in WM_POINTER handling does. */ - return; - } - + GHOST_TInt32 x_screen, y_screen; GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = window->getTabletData(); - DWORD msgPos = ::GetMessagePos(); - LONG msgTime = ::GetMessageTime(); - - /* GetMessagePointsEx processes points as 16 bit integers and can fail or return erroneous values - * if negative input is not truncated. */ - int msgPosX = GET_X_LPARAM(msgPos) & 0x0000FFFF; - int msgPosY = GET_Y_LPARAM(msgPos) & 0x0000FFFF; - - const int maxPoints = 64; - MOUSEMOVEPOINT currentPoint = {msgPosX, msgPosY, (DWORD)msgTime, 0}; - MOUSEMOVEPOINT points[maxPoints] = {0}; - /* GetMouseMovePointsEx returns the number of points returned that are less than or equal to the - * requested point. If the requested point is the most recent, this returns up to 64 requested - * points. */ - int numPoints = ::GetMouseMovePointsEx( - sizeof(MOUSEMOVEPOINT), ¤tPoint, points, maxPoints, GMMP_USE_DISPLAY_POINTS); - - if (numPoints == -1) { - /* Points at edge of screen are often not in the queue, use the message's point instead. */ - numPoints = 1; - points[0] = currentPoint; - } - - GHOST_TInt32 x_accum = 0, y_accum = 0; - window->getCursorGrabAccum(x_accum, y_accum); - - /* Points are in reverse chronological order. Find least recent, unprocessed mouse move. */ - int i; - for (i = 0; i < numPoints; i++) { - if (points[i].time < system->m_mouseTimestamp) { - break; - } - - /* GetMouseMovePointsEx returns 16 bit number as 32 bit. If negative, we need to sign extend. - */ - points[i].x = points[i].x > 32767 ? points[i].x | 0xFFFF0000 : points[i].x; - points[i].y = points[i].y > 32767 ? points[i].y | 0xFFFF0000 : points[i].y; - - if (points[i].time == system->m_mouseTimestamp && points[i].x == system->m_mousePosX && - points[i].y == system->m_mousePosY) { - break; + if (window->m_tabletInRange) { + if (window->useTabletAPI(GHOST_kTabletNative)) { + /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet + * input aren't normally generated when using WM_POINTER events, but manually moving the + * system cursor as we do in WM_POINTER handling does. */ + return NULL; } } - while (--i >= 0) { - system->pushEvent(new GHOST_EventCursor(system->getMilliSeconds(), - GHOST_kEventCursorMove, - window, - points[i].x + x_accum, - points[i].y + y_accum, - td)); - } - DWORD lastTimestamp = points[0].time; + system->getCursorPosition(x_screen, y_screen); - /* Check if we need to wrap the cursor. */ if (window->getCursorGrabModeIsWarp() && !window->m_tabletInRange) { - /* Wrap based on current cursor position in case Win32 mouse move queue is out of order due to - * prior wrap. */ - POINT point; - ::GetCursorPos(&point); - GHOST_TInt32 x_current = point.x; - GHOST_TInt32 y_current = point.y; - GHOST_TInt32 x_wrap = point.x; - GHOST_TInt32 y_wrap = point.y; + GHOST_TInt32 x_new = x_screen; + GHOST_TInt32 y_new = y_screen; + GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* Fallback to window bounds. */ @@ -1118,24 +1049,33 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) /* Could also clamp to screen bounds wrap with a window outside the view will fail atm. * Use offset of 8 in case the window is at screen bounds. */ - bounds.wrapPoint(x_wrap, y_wrap, 2, window->getCursorGrabAxis()); + bounds.wrapPoint(x_new, y_new, 2, window->getCursorGrabAxis()); - if (x_wrap != x_current || y_wrap != y_current) { - system->setCursorPosition(x_wrap, y_wrap); - window->setCursorGrabAccum(x_accum + (x_current - x_wrap), y_accum + (y_current - y_wrap)); - - /* First message after SendInput wrap is invalid for unknown reasons, skip events until one - * tick after SendInput event time. */ - lastTimestamp = ::GetTickCount() + 1; + window->getCursorGrabAccum(x_accum, y_accum); + if (x_new != x_screen || y_new != y_screen) { + /* When wrapping we don't need to add an event because the setCursorPosition call will cause + * a new event after. */ + system->setCursorPosition(x_new, y_new); /* wrap */ + window->setCursorGrabAccum(x_accum + (x_screen - x_new), y_accum + (y_screen - y_new)); + } + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen + x_accum, + y_screen + y_accum, + window->getTabletData()); } } - - system->m_mousePosX = points[0].x; - system->m_mousePosY = points[0].y; - /* Use latest time, checking for overflow. */ - if (lastTimestamp > system->m_mouseTimestamp || ::GetTickCount() < system->m_mouseTimestamp) { - system->m_mouseTimestamp = lastTimestamp; + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen, + y_screen, + window->getTabletData()); } + return NULL; } void GHOST_SystemWin32::processWheelEvent(GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam) @@ -1586,8 +1526,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, } break; case WM_MOUSEMOVE: - processCursorEvent(window); - eventHandled = true; + event = processCursorEvent(window); break; case WM_MOUSEWHEEL: { /* The WM_MOUSEWHEEL message is sent to the focus window diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 86c443bb1c7..51c0c984710 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -308,12 +308,6 @@ class GHOST_SystemWin32 : public GHOST_System { GHOST_WindowWin32 *window, GHOST_TButtonMask mask); - /** - * Creates tablet events from Wintab events. - * \param window: The window receiving the event (the active window). - */ - static void processWintabEvent(GHOST_WindowWin32 *window); - /** * Creates tablet events from pointer events. * \param type: The type of pointer event. @@ -328,8 +322,9 @@ class GHOST_SystemWin32 : public GHOST_System { /** * Creates cursor event. * \param window: The window receiving the event (the active window). + * \return The event created. */ - static void processCursorEvent(GHOST_WindowWin32 *window); + static GHOST_EventCursor *processCursorEvent(GHOST_WindowWin32 *window); /** * Handles a mouse wheel event. @@ -453,13 +448,6 @@ class GHOST_SystemWin32 : public GHOST_System { /** Wheel delta accumulator. */ int m_wheelDeltaAccum; - - /** Last mouse x position. */ - int m_mousePosX; - /** Last mouse y position. */ - int m_mousePosY; - /** Last mouse timestamp. */ - DWORD m_mouseTimestamp; }; inline void GHOST_SystemWin32::retrieveModifierKeys(GHOST_ModifierKeys &keys) const From 37afeb7eaa8c2965fa4348b66b6ef600b7a3769a Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 23 Feb 2021 09:50:03 -0800 Subject: [PATCH 412/519] Fix T85844: high pressure at start of line. m_tabletInRange is no longer set for Wintab after 2e81f2c01abd21fdbc reverted Wintab changes. This reverts most button processing to behavior present in 2.91.2. Left in place is a bugfix for Windows Ink: button events while a Windows Ink pen is in range should still be processed. Events processed by Windows Ink and not passed to DefWindowProc do not create WM_*BUTTON events, but button events from e.g. tablet pad express keys do create WM_*BUTTON events and should be handled. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 5d5ba90b299..c12fec4fe3c 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -934,13 +934,15 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, { GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = GHOST_TABLET_DATA_NONE; - - if (window->m_tabletInRange) { - td = window->getTabletData(); + if (type == GHOST_kEventButtonDown) { + window->updateMouseCapture(MousePressed); + } + else if (type == GHOST_kEventButtonUp) { + window->updateMouseCapture(MouseReleased); } - return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); + return new GHOST_EventButton( + system->getMilliSeconds(), type, window, mask, window->getTabletData()); } void GHOST_SystemWin32::processPointerEvent( @@ -1482,46 +1484,36 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Mouse events, processed //////////////////////////////////////////////////////////////////////// case WM_LBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONDOWN: if ((short)HIWORD(wParam) == XBUTTON1) { - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton5); } break; case WM_LBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONUP: if ((short)HIWORD(wParam) == XBUTTON1) { - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton5); } break; From 6844b768f3693332bea1bef0fcb76f4168ce08fe Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 23 Feb 2021 10:04:19 -0800 Subject: [PATCH 413/519] Revert Automatic Tablet API dynamic fallback. Removes fallback to Windows Ink when Wintab reports no devices present. Returns to old behavior of using only Wintab if Wintab.dll exists. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 4 ---- intern/ghost/intern/GHOST_WindowWin32.cpp | 12 +----------- intern/ghost/intern/GHOST_WindowWin32.h | 7 ------- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index c12fec4fe3c..85eeec8aa0d 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1459,10 +1459,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, //////////////////////////////////////////////////////////////////////// // Wintab events, processed //////////////////////////////////////////////////////////////////////// - case WT_INFOCHANGE: - window->processWintabInfoChangeEvent(lParam); - eventHandled = true; - break; case WT_PACKET: window->processWin32TabletEvent(wParam, lParam); break; diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index f443fc3153f..8696a146c98 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -355,8 +355,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, if (m_wintab.enable && m_wintab.tablet) { m_wintab.enable(m_wintab.tablet, TRUE); } - - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); } } CoCreateInstance( @@ -1122,7 +1120,7 @@ bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const return true; } else if (m_system->getTabletAPI() == GHOST_kTabletAutomatic) { - if (m_wintab.numDevices) + if (m_wintab.tablet) return api == GHOST_kTabletWintab; else return api == GHOST_kTabletNative; @@ -1164,14 +1162,6 @@ void GHOST_WindowWin32::processWin32TabletInitEvent() m_tabletData.Active = GHOST_kTabletModeNone; } -void GHOST_WindowWin32::processWintabInfoChangeEvent(LPARAM lParam) -{ - /* Update number of connected Wintab digitizers */ - if (LOWORD(lParam) == WTI_INTERFACE && HIWORD(lParam) == IFC_NDEVICES) { - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - } -} - void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) { if (!useTabletAPI(GHOST_kTabletWintab)) { diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index c65f6a3319f..18897a246b2 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -446,12 +446,6 @@ class GHOST_WindowWin32 : public GHOST_Window { WPARAM wParam, LPARAM lParam); - /** - * Handle Wintab info changes such as change in number of connected tablets. - * \param lParam: LPARAM of the event. - */ - void processWintabInfoChangeEvent(LPARAM lParam); - void processWin32TabletActivateEvent(WORD state); void processWin32TabletInitEvent(); void processWin32TabletEvent(WPARAM wParam, LPARAM lParam); @@ -572,7 +566,6 @@ class GHOST_WindowWin32 : public GHOST_Window { HCTX tablet; LONG maxPressure; LONG maxAzimuth, maxAltitude; - UINT numDevices; } m_wintab; GHOST_TWindowState m_normal_state; From 8d02fdc7e02241ba2c47a8575651fab86c3e0a41 Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 16 Feb 2021 19:33:11 -0800 Subject: [PATCH 414/519] WM_MOUSEMOVE cleanup. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 50 +++++++++++++++-------- intern/ghost/intern/GHOST_SystemWin32.h | 4 ++ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 1f85c7a4c5c..e0974373caf 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1045,11 +1045,27 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); GHOST_TabletData td = window->getTabletData(); + /* Window's mouse history function returns a history of up to 64 mouse moves, including those + * processed during previous mouse move events. This means we must track and filter out events we + * have already processed. + * + * The API accepts and returns 32 bit points, but error or fails when passed a negative number + * where the HIWORD is not zeroed, and will return a negative numbers with HIWORD zeroed. + * Therefore we must zero the HIWORD of points passed in and sign extend from the LOWORD of + * points received. Note: negative position values occur for multi-monitor systems whose primary + * display is not the top-leftmost display. + * + * Querying the mouse history with valid mouse positions sometimes fails, commonly at the screen + * edge. In these cases we fall back to using information provided by the event instead of the + * mouse event history. + * + * Further explanation - https://devblogs.microsoft.com/oldnewthing/20120314-00/?p=8103 */ + DWORD msgPos = ::GetMessagePos(); LONG msgTime = ::GetMessageTime(); - /* GetMessagePointsEx processes points as 16 bit integers and can fail or return erroneous values - * if negative input is not truncated. */ + /* GetMessagePointsEx processes 32 bit points as 16 bit integers and can fail or return erroneous + * values if negative input's HIWORD is not zeroed. */ int msgPosX = GET_X_LPARAM(msgPos) & 0x0000FFFF; int msgPosY = GET_Y_LPARAM(msgPos) & 0x0000FFFF; @@ -1078,10 +1094,10 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) break; } - /* GetMouseMovePointsEx returns 16 bit number as 32 bit. If negative, we need to sign extend. - */ - points[i].x = points[i].x > 32767 ? points[i].x | 0xFFFF0000 : points[i].x; - points[i].y = points[i].y > 32767 ? points[i].y | 0xFFFF0000 : points[i].y; + /* GetMouseMovePointsEx returns 16 bit number as 32 bit with HIWORD zeroed. If the signed + * LOWORD is negative, we need to sign extend. */ + points[i].x = points[i].x & 0x8000 ? points[i].x | 0xFFFF0000 : points[i].x; + points[i].y = points[i].y & 0x8000 ? points[i].y | 0xFFFF0000 : points[i].y; if (points[i].time == system->m_mouseTimestamp && points[i].x == system->m_mousePosX && points[i].y == system->m_mousePosY) { @@ -1097,7 +1113,14 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) td)); } - DWORD lastTimestamp = points[0].time; + /* Update last processed mouse position and time, checking for time overflow. If not overflown + * and the this event's time is less than the last, this mousemove event occurred before a cursor + * wrap so we should not update last mouse position and time. */ + if (points[0].time >= system->m_mouseTimestamp || ::GetTickCount() < system->m_mouseTimestamp) { + system->m_mousePosX = points[0].x; + system->m_mousePosY = points[0].y; + system->m_mouseTimestamp = points[0].time; + } /* Check if we need to wrap the cursor. */ if (window->getCursorGrabModeIsWarp() && !window->m_tabletInRange) { @@ -1124,18 +1147,11 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) system->setCursorPosition(x_wrap, y_wrap); window->setCursorGrabAccum(x_accum + (x_current - x_wrap), y_accum + (y_current - y_wrap)); - /* First message after SendInput wrap is invalid for unknown reasons, skip events until one - * tick after SendInput event time. */ - lastTimestamp = ::GetTickCount() + 1; + /* Update the mouse timestamp so that mouse moves prior to wrap are skipped. This is a lower + * bound, the timestamp for the generated mouse move may be different. */ + system->m_mouseTimestamp = ::GetTickCount(); } } - - system->m_mousePosX = points[0].x; - system->m_mousePosY = points[0].y; - /* Use latest time, checking for overflow. */ - if (lastTimestamp > system->m_mouseTimestamp || ::GetTickCount() < system->m_mouseTimestamp) { - system->m_mouseTimestamp = lastTimestamp; - } } void GHOST_SystemWin32::processWheelEvent(GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam) diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 86c443bb1c7..0d55188b325 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -454,6 +454,10 @@ class GHOST_SystemWin32 : public GHOST_System { /** Wheel delta accumulator. */ int m_wheelDeltaAccum; + /** + * Last mouse position and time values, used when inspecting mouse history to know what has + * already been processed. + */ /** Last mouse x position. */ int m_mousePosX; /** Last mouse y position. */ From f227a69a87307491e2375f5778d3da6f5653f47d Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Mon, 22 Feb 2021 21:07:21 -0800 Subject: [PATCH 415/519] Revert high fequency mouse input for Windows. Windows mouse history function GetMouesMovePointsEx has well documented bugs where it receives and returns 32 bit screen coordinates, but internally truncates to unsigned 16 bits. For mouse (relative position) input this is not a problem as motion events and the resulting screen coordinates reliably fit within 16 bit precision. For tablets (absolute position) the 16 bit truncation results in corrupt history when tablet drivers use mouse_event or SendInput from the Windows API to move the mouse cursor. Both of these functions take absolute mouse position as singed 32 bit value on the range of 0-65535 (or 0x0-0xFFFF) inclusive. Values larger than 0x7FFF (the largest signed 16 bit value) are reliably corrupt when retrieved from GetMouesMovePointsEx history. This is true regardless of whether mouse history is retrieved using display resolution (GMMP_USE_DISPLAY_POINTS) or high resolution points (GMMP_USE_HIGH_RESOLUTION_POINTS), the latter of which should return points in range 0-65535. Reviewed By: brecht Maniphest Tasks: T85874 Differential Revision: https://developer.blender.org/D10507 --- intern/ghost/intern/GHOST_SystemWin32.cpp | 151 ++++++---------------- intern/ghost/intern/GHOST_SystemWin32.h | 20 +-- 2 files changed, 39 insertions(+), 132 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index e0974373caf..e7a72136bc6 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -225,9 +225,6 @@ GHOST_SystemWin32::GHOST_SystemWin32() #ifdef WITH_INPUT_NDOF m_ndofManager = new GHOST_NDOFManagerWin32(*this); #endif - - getCursorPosition(m_mousePosX, m_mousePosY); - m_mouseTimestamp = ::GetTickCount(); } GHOST_SystemWin32::~GHOST_SystemWin32() @@ -941,16 +938,6 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, if (window->m_tabletInRange) { td = window->getTabletData(); - - /* Check if tablet cursor position is in sync with Win32 cursor position, if not then move - * cursor to position where button event occurred. */ - DWORD msgPos = ::GetMessagePos(); - int msgPosX = GET_X_LPARAM(msgPos); - int msgPosY = GET_Y_LPARAM(msgPos); - if (msgPosX != system->m_mousePosX || msgPosY != system->m_mousePosY) { - system->pushEvent(new GHOST_EventCursor( - ::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td)); - } } return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); @@ -1033,105 +1020,26 @@ void GHOST_SystemWin32::processPointerEvent( system->setCursorPosition(pointerInfo[0].pixelLocation.x, pointerInfo[0].pixelLocation.y); } -void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) +GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) { - if (window->m_tabletInRange && window->useTabletAPI(GHOST_kTabletNative)) { - /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet - * input aren't normally generated when using WM_POINTER events, but manually moving the - * system cursor as we do in WM_POINTER handling does. */ - return; - } - + GHOST_TInt32 x_screen, y_screen; GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = window->getTabletData(); - /* Window's mouse history function returns a history of up to 64 mouse moves, including those - * processed during previous mouse move events. This means we must track and filter out events we - * have already processed. - * - * The API accepts and returns 32 bit points, but error or fails when passed a negative number - * where the HIWORD is not zeroed, and will return a negative numbers with HIWORD zeroed. - * Therefore we must zero the HIWORD of points passed in and sign extend from the LOWORD of - * points received. Note: negative position values occur for multi-monitor systems whose primary - * display is not the top-leftmost display. - * - * Querying the mouse history with valid mouse positions sometimes fails, commonly at the screen - * edge. In these cases we fall back to using information provided by the event instead of the - * mouse event history. - * - * Further explanation - https://devblogs.microsoft.com/oldnewthing/20120314-00/?p=8103 */ - - DWORD msgPos = ::GetMessagePos(); - LONG msgTime = ::GetMessageTime(); - - /* GetMessagePointsEx processes 32 bit points as 16 bit integers and can fail or return erroneous - * values if negative input's HIWORD is not zeroed. */ - int msgPosX = GET_X_LPARAM(msgPos) & 0x0000FFFF; - int msgPosY = GET_Y_LPARAM(msgPos) & 0x0000FFFF; - - const int maxPoints = 64; - MOUSEMOVEPOINT currentPoint = {msgPosX, msgPosY, (DWORD)msgTime, 0}; - MOUSEMOVEPOINT points[maxPoints] = {0}; - /* GetMouseMovePointsEx returns the number of points returned that are less than or equal to the - * requested point. If the requested point is the most recent, this returns up to 64 requested - * points. */ - int numPoints = ::GetMouseMovePointsEx( - sizeof(MOUSEMOVEPOINT), ¤tPoint, points, maxPoints, GMMP_USE_DISPLAY_POINTS); - - if (numPoints == -1) { - /* Points at edge of screen are often not in the queue, use the message's point instead. */ - numPoints = 1; - points[0] = currentPoint; - } - - GHOST_TInt32 x_accum = 0, y_accum = 0; - window->getCursorGrabAccum(x_accum, y_accum); - - /* Points are in reverse chronological order. Find least recent, unprocessed mouse move. */ - int i; - for (i = 0; i < numPoints; i++) { - if (points[i].time < system->m_mouseTimestamp) { - break; - } - - /* GetMouseMovePointsEx returns 16 bit number as 32 bit with HIWORD zeroed. If the signed - * LOWORD is negative, we need to sign extend. */ - points[i].x = points[i].x & 0x8000 ? points[i].x | 0xFFFF0000 : points[i].x; - points[i].y = points[i].y & 0x8000 ? points[i].y | 0xFFFF0000 : points[i].y; - - if (points[i].time == system->m_mouseTimestamp && points[i].x == system->m_mousePosX && - points[i].y == system->m_mousePosY) { - break; + if (window->m_tabletInRange) { + if (window->useTabletAPI(GHOST_kTabletNative)) { + /* Tablet input handled in WM_POINTER* events. WM_MOUSEMOVE events in response to tablet + * input aren't normally generated when using WM_POINTER events, but manually moving the + * system cursor as we do in WM_POINTER handling does. */ + return NULL; } } - while (--i >= 0) { - system->pushEvent(new GHOST_EventCursor(system->getMilliSeconds(), - GHOST_kEventCursorMove, - window, - points[i].x + x_accum, - points[i].y + y_accum, - td)); - } - /* Update last processed mouse position and time, checking for time overflow. If not overflown - * and the this event's time is less than the last, this mousemove event occurred before a cursor - * wrap so we should not update last mouse position and time. */ - if (points[0].time >= system->m_mouseTimestamp || ::GetTickCount() < system->m_mouseTimestamp) { - system->m_mousePosX = points[0].x; - system->m_mousePosY = points[0].y; - system->m_mouseTimestamp = points[0].time; - } + system->getCursorPosition(x_screen, y_screen); - /* Check if we need to wrap the cursor. */ if (window->getCursorGrabModeIsWarp() && !window->m_tabletInRange) { - /* Wrap based on current cursor position in case Win32 mouse move queue is out of order due to - * prior wrap. */ - POINT point; - ::GetCursorPos(&point); - GHOST_TInt32 x_current = point.x; - GHOST_TInt32 y_current = point.y; - GHOST_TInt32 x_wrap = point.x; - GHOST_TInt32 y_wrap = point.y; + GHOST_TInt32 x_new = x_screen; + GHOST_TInt32 y_new = y_screen; + GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* Fallback to window bounds. */ @@ -1141,17 +1049,33 @@ void GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window) /* Could also clamp to screen bounds wrap with a window outside the view will fail atm. * Use offset of 8 in case the window is at screen bounds. */ - bounds.wrapPoint(x_wrap, y_wrap, 2, window->getCursorGrabAxis()); + bounds.wrapPoint(x_new, y_new, 2, window->getCursorGrabAxis()); - if (x_wrap != x_current || y_wrap != y_current) { - system->setCursorPosition(x_wrap, y_wrap); - window->setCursorGrabAccum(x_accum + (x_current - x_wrap), y_accum + (y_current - y_wrap)); - - /* Update the mouse timestamp so that mouse moves prior to wrap are skipped. This is a lower - * bound, the timestamp for the generated mouse move may be different. */ - system->m_mouseTimestamp = ::GetTickCount(); + window->getCursorGrabAccum(x_accum, y_accum); + if (x_new != x_screen || y_new != y_screen) { + /* When wrapping we don't need to add an event because the setCursorPosition call will cause + * a new event after. */ + system->setCursorPosition(x_new, y_new); /* wrap */ + window->setCursorGrabAccum(x_accum + (x_screen - x_new), y_accum + (y_screen - y_new)); + } + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen + x_accum, + y_screen + y_accum, + window->getTabletData()); } } + else { + return new GHOST_EventCursor(system->getMilliSeconds(), + GHOST_kEventCursorMove, + window, + x_screen, + y_screen, + window->getTabletData()); + } + return NULL; } void GHOST_SystemWin32::processWheelEvent(GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam) @@ -1596,8 +1520,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, } break; case WM_MOUSEMOVE: - processCursorEvent(window); - eventHandled = true; + event = processCursorEvent(window); break; case WM_MOUSEWHEEL: { /* The WM_MOUSEWHEEL message is sent to the focus window diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 0d55188b325..51c0c984710 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -308,12 +308,6 @@ class GHOST_SystemWin32 : public GHOST_System { GHOST_WindowWin32 *window, GHOST_TButtonMask mask); - /** - * Creates tablet events from Wintab events. - * \param window: The window receiving the event (the active window). - */ - static void processWintabEvent(GHOST_WindowWin32 *window); - /** * Creates tablet events from pointer events. * \param type: The type of pointer event. @@ -328,8 +322,9 @@ class GHOST_SystemWin32 : public GHOST_System { /** * Creates cursor event. * \param window: The window receiving the event (the active window). + * \return The event created. */ - static void processCursorEvent(GHOST_WindowWin32 *window); + static GHOST_EventCursor *processCursorEvent(GHOST_WindowWin32 *window); /** * Handles a mouse wheel event. @@ -453,17 +448,6 @@ class GHOST_SystemWin32 : public GHOST_System { /** Wheel delta accumulator. */ int m_wheelDeltaAccum; - - /** - * Last mouse position and time values, used when inspecting mouse history to know what has - * already been processed. - */ - /** Last mouse x position. */ - int m_mousePosX; - /** Last mouse y position. */ - int m_mousePosY; - /** Last mouse timestamp. */ - DWORD m_mouseTimestamp; }; inline void GHOST_SystemWin32::retrieveModifierKeys(GHOST_ModifierKeys &keys) const From ee4f306509679cf4aacb5367680f13044db60ea8 Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 23 Feb 2021 09:50:03 -0800 Subject: [PATCH 416/519] Fix T85844: high pressure at start of line. m_tabletInRange is no longer set for Wintab after 2e81f2c01abd21fdbc reverted Wintab changes. This reverts most button processing to behavior present in 2.91.2. Left in place is a bugfix for Windows Ink: button events while a Windows Ink pen is in range should still be processed. Events processed by Windows Ink and not passed to DefWindowProc do not create WM_*BUTTON events, but button events from e.g. tablet pad express keys do create WM_*BUTTON events and should be handled. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index e7a72136bc6..45944d4d889 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -934,13 +934,15 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, { GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); - GHOST_TabletData td = GHOST_TABLET_DATA_NONE; - - if (window->m_tabletInRange) { - td = window->getTabletData(); + if (type == GHOST_kEventButtonDown) { + window->updateMouseCapture(MousePressed); + } + else if (type == GHOST_kEventButtonUp) { + window->updateMouseCapture(MouseReleased); } - return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td); + return new GHOST_EventButton( + system->getMilliSeconds(), type, window, mask, window->getTabletData()); } void GHOST_SystemWin32::processPointerEvent( @@ -1476,46 +1478,36 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Mouse events, processed //////////////////////////////////////////////////////////////////////// case WM_LBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONDOWN: - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONDOWN: if ((short)HIWORD(wParam) == XBUTTON1) { - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { - window->updateMouseCapture(MousePressed); event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton5); } break; case WM_LBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft); break; case WM_MBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle); break; case WM_RBUTTONUP: - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight); break; case WM_XBUTTONUP: if ((short)HIWORD(wParam) == XBUTTON1) { - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4); } else if ((short)HIWORD(wParam) == XBUTTON2) { - window->updateMouseCapture(MouseReleased); event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton5); } break; From eb554051e7a3a9b9bfd611c07a4d01ef26048d44 Mon Sep 17 00:00:00 2001 From: Nicholas Rishel Date: Tue, 23 Feb 2021 10:04:19 -0800 Subject: [PATCH 417/519] Revert Automatic Tablet API dynamic fallback. Removes fallback to Windows Ink when Wintab reports no devices present. Returns to old behavior of using only Wintab if Wintab.dll exists. --- intern/ghost/intern/GHOST_SystemWin32.cpp | 4 ---- intern/ghost/intern/GHOST_WindowWin32.cpp | 12 +----------- intern/ghost/intern/GHOST_WindowWin32.h | 7 ------- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 45944d4d889..430e8216ae3 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1453,10 +1453,6 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, //////////////////////////////////////////////////////////////////////// // Wintab events, processed //////////////////////////////////////////////////////////////////////// - case WT_INFOCHANGE: - window->processWintabInfoChangeEvent(lParam); - eventHandled = true; - break; case WT_PACKET: window->processWin32TabletEvent(wParam, lParam); break; diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index a166fa490e2..ad5643fcd89 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -299,8 +299,6 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, if (m_wintab.enable && m_wintab.tablet) { m_wintab.enable(m_wintab.tablet, TRUE); } - - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); } } CoCreateInstance( @@ -1033,7 +1031,7 @@ bool GHOST_WindowWin32::useTabletAPI(GHOST_TTabletAPI api) const return true; } else if (m_system->getTabletAPI() == GHOST_kTabletAutomatic) { - if (m_wintab.numDevices) + if (m_wintab.tablet) return api == GHOST_kTabletWintab; else return api == GHOST_kTabletNative; @@ -1075,14 +1073,6 @@ void GHOST_WindowWin32::processWin32TabletInitEvent() m_tabletData.Active = GHOST_kTabletModeNone; } -void GHOST_WindowWin32::processWintabInfoChangeEvent(LPARAM lParam) -{ - /* Update number of connected Wintab digitizers */ - if (LOWORD(lParam) == WTI_INTERFACE && HIWORD(lParam) == IFC_NDEVICES) { - m_wintab.info(WTI_INTERFACE, IFC_NDEVICES, &m_wintab.numDevices); - } -} - void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) { if (!useTabletAPI(GHOST_kTabletWintab)) { diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 0965be509e4..d86a5c12040 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -446,12 +446,6 @@ class GHOST_WindowWin32 : public GHOST_Window { WPARAM wParam, LPARAM lParam); - /** - * Handle Wintab info changes such as change in number of connected tablets. - * \param lParam: LPARAM of the event. - */ - void processWintabInfoChangeEvent(LPARAM lParam); - void processWin32TabletActivateEvent(WORD state); void processWin32TabletInitEvent(); void processWin32TabletEvent(WPARAM wParam, LPARAM lParam); @@ -576,7 +570,6 @@ class GHOST_WindowWin32 : public GHOST_Window { HCTX tablet; LONG maxPressure; LONG maxAzimuth, maxAltitude; - UINT numDevices; } m_wintab; GHOST_TWindowState m_normal_state; From 4d9d87d2bf1eb36168f54f94d353d804a6978ed5 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Tue, 23 Feb 2021 23:05:44 +0100 Subject: [PATCH 418/519] GPencil: Improve Flip algorithm for Interpolate If the lines cross, but the angle is very sharp, check the distance between the extremes. --- .../blender/editors/gpencil/gpencil_interpolate.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 1823a962926..c242d3a73c1 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -198,6 +198,20 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2b[0], &v2b[1]); if (isect_seg_seg_v2(v1a, v1b, v2a, v2b) == ISECT_LINE_LINE_CROSS) { + float v1[2], v2[2]; + sub_v2_v2v2(v1, v1b, v1a); + sub_v2_v2v2(v2, v2b, v2a); + float angle = angle_v2v2(v1, v2); + /* For very sharp angles, check distance between extremes. */ + if (angle < DEG2RADF(15.0f)) { + float dist_start = len_squared_v2v2(v1a, v1a); + float dist_end = len_squared_v2v2(v1a, v1b); + if (dist_end < dist_start) { + return true; + } + return false; + } + return true; } From dde7d4417a850222c2e05bd6fc8f6c354f2515e9 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Tue, 23 Feb 2021 23:09:33 +0100 Subject: [PATCH 419/519] GPencil: Fix typo error in previous commit --- source/blender/editors/gpencil/gpencil_interpolate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index c242d3a73c1..9045cc8cfda 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -204,8 +204,8 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, float angle = angle_v2v2(v1, v2); /* For very sharp angles, check distance between extremes. */ if (angle < DEG2RADF(15.0f)) { - float dist_start = len_squared_v2v2(v1a, v1a); - float dist_end = len_squared_v2v2(v1a, v1b); + float dist_start = len_squared_v2v2(v1a, v2a); + float dist_end = len_squared_v2v2(v1a, v2b); if (dist_end < dist_start) { return true; } From b2c7ea6d82c453cfa35bf754e07dbbf08ae0a018 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 23 Feb 2021 17:15:03 -0600 Subject: [PATCH 420/519] Geometry Nodes: Move node UI storage function to BKE This function will be used in another file with attribute search, so it makes sense to share from the UI storage header. --- .../blender/blenkernel/BKE_node_ui_storage.hh | 5 ++++ .../blenkernel/intern/node_ui_storage.cc | 26 +++++++++++++++++ .../blender/editors/space_node/node_draw.cc | 28 +------------------ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh index 2084382aac5..951c3bdc62d 100644 --- a/source/blender/blenkernel/BKE_node_ui_storage.hh +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -28,6 +28,7 @@ struct ModifierData; struct Object; struct bNode; struct bNodeTree; +struct bContext; /** * Contains the context necessary to determine when to display settings for a certain node tree @@ -81,6 +82,10 @@ struct NodeTreeUIStorage { blender::Map> context_map; }; +const NodeUIStorage *BKE_node_tree_ui_storage_get_from_context(const bContext *C, + const bNodeTree &ntree, + const bNode &node); + void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, const NodeTreeEvaluationContext &context); diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc index 7bf8895262d..e03617a6505 100644 --- a/source/blender/blenkernel/intern/node_ui_storage.cc +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -23,7 +23,9 @@ #include "DNA_node_types.h" #include "DNA_object_types.h" +#include "BKE_context.h" #include "BKE_node_ui_storage.hh" +#include "BKE_object.h" static CLG_LogRef LOG = {"bke.node_ui_storage"}; @@ -38,6 +40,30 @@ static void ui_storage_ensure(bNodeTree &ntree) } } +const NodeUIStorage *BKE_node_tree_ui_storage_get_from_context(const bContext *C, + const bNodeTree &ntree, + const bNode &node) +{ + const NodeTreeUIStorage *ui_storage = ntree.ui_storage; + if (ui_storage == nullptr) { + return nullptr; + } + + const Object *active_object = CTX_data_active_object(C); + const ModifierData *active_modifier = BKE_object_active_modifier(active_object); + if (active_object == nullptr || active_modifier == nullptr) { + return nullptr; + } + + const NodeTreeEvaluationContext context(*active_object, *active_modifier); + const Map *storage = ui_storage->context_map.lookup_ptr(context); + if (storage == nullptr) { + return nullptr; + } + + return storage->lookup_ptr_as(StringRef(node.name)); +} + /** * Removes only the UI data associated with a particular evaluation context. The same node tree * can be used for execution in multiple places, but the entire UI storage can't be removed when diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index d0b62463ad9..40d62b0b10f 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -81,9 +81,7 @@ # include "COM_compositor.h" #endif -using blender::Map; using blender::Span; -using blender::StringRef; using blender::Vector; extern "C" { @@ -1254,34 +1252,10 @@ static char *node_errors_tooltip_fn(bContext *UNUSED(C), void *argN, const char #define NODE_HEADER_ICON_SIZE (0.8f * U.widget_unit) -static const NodeUIStorage *node_ui_storage_get_from_context(const bContext *C, - const bNodeTree &ntree, - const bNode &node) -{ - const NodeTreeUIStorage *ui_storage = ntree.ui_storage; - if (ui_storage == nullptr) { - return nullptr; - } - - const Object *active_object = CTX_data_active_object(C); - const ModifierData *active_modifier = BKE_object_active_modifier(active_object); - if (active_object == nullptr || active_modifier == nullptr) { - return nullptr; - } - - const NodeTreeEvaluationContext context(*active_object, *active_modifier); - const Map *storage = ui_storage->context_map.lookup_ptr(context); - if (storage == nullptr) { - return nullptr; - } - - return storage->lookup_ptr_as(StringRef(node.name)); -} - static void node_add_error_message_button( const bContext *C, bNodeTree &ntree, bNode &node, const rctf &rect, float &icon_offset) { - const NodeUIStorage *node_ui_storage = node_ui_storage_get_from_context(C, ntree, node); + const NodeUIStorage *node_ui_storage = BKE_node_tree_ui_storage_get_from_context(C, ntree, node); if (node_ui_storage == nullptr || node_ui_storage->warnings.is_empty()) { return; } From 5c2e10d5ed4b4e321925d4f35b049594efd66bbf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 24 Feb 2021 15:37:37 +1100 Subject: [PATCH 421/519] Docs: clarify radial/cycle use for BMesh loops Also add minor corrections clarifications elsewhere. --- source/blender/bmesh/bmesh_class.h | 176 ++++++++++++++++++++++++----- 1 file changed, 145 insertions(+), 31 deletions(-) diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index 7cbad1ed069..c83fc0645c4 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -18,10 +18,11 @@ /** \file * \ingroup bmesh + * + * #BMesh data structures, used for mesh editing operations + * that benefit from accessing connectivity information. */ -/* bmesh data structures */ - /* disable holes for now, * these are ifdef'd because they use more memory and cant be saved in DNA currently */ // #define USE_BMESH_HOLES @@ -46,15 +47,15 @@ struct BLI_mempool; // #pragma GCC diagnostic error "-Wpadded" /** - * BMHeader + * #BMHeader * - * All mesh elements begin with a BMHeader. This structure + * All mesh elements begin with a #BMHeader. This structure * hold several types of data * * 1: The type of the element (vert, edge, loop or face) * 2: Persistent "header" flags/markings (smooth, seam, select, hidden, etc) - * note that this is different from the "tool" flags. - * 3: Unique ID in the bmesh. + * note that this is different from the "tool" flags. + * 3: Unique ID in the #BMesh. * 4: some elements for internal record keeping. */ typedef struct BMHeader { @@ -102,7 +103,7 @@ typedef struct BMVert { * Pointer to (any) edge using this vertex (for disk cycles). * * \note Some higher level functions set this to different edges that use this vertex, - * which is a bit of an abuse of internal bmesh data but also works OK for now + * which is a bit of an abuse of internal #BMesh data but also works OK for now * (use with care!). */ struct BMEdge *e; @@ -121,10 +122,21 @@ typedef struct BMDiskLink { typedef struct BMEdge { BMHeader head; - struct BMVert *v1, *v2; /* vertices (unordered) */ + /** + * Vertices (unordered), + * + * Although the order can be used at times, + * when extruding a face from a wire-edge for example. + * + * Operations that create/subdivide edges shouldn't flip the order + * unless there is a good reason to do so. + */ + BMVert *v1, *v2; - /* the list of loops around the edge (use l->radial_prev/next) - * to access the other loops using the edge */ + /** + * The list of loops around the edge, see doc-string for #BMLoop.radial_next + * for an example of using this to loop over all faces used by an edge. + */ struct BMLoop *l; /** @@ -145,17 +157,92 @@ typedef struct BMLoop { BMHeader head; /* notice no flags layer */ + /** + * The vertex this loop points to. + * + * - This vertex must be unique within the cycle. + */ struct BMVert *v; - struct BMEdge *e; /* edge, using verts (v, next->v) */ + + /** + * The edge this loop uses. + * + * Vertices (#BMLoop.v & #BMLoop.next.v) always contain vertices from (#BMEdge.v1 & #BMEdge.v2). + * Although no assumptions can be made about the order, + * as this isn't meaningful for mesh topology. + * + * - This edge must be unique within the cycle (defined by #BMLoop.next & #BMLoop.prev links). + */ + struct BMEdge *e; + /** + * The face this loop is part of. + * + * - This face must be shared by all within the cycle. + * Used as a back-pointer so loops can know the face they define. + */ struct BMFace *f; - /* circular linked list of loops which all use the same edge as this one '->e', - * but not necessarily the same vertex (can be either v1 or v2 of our own '->e') */ + /** + * Other loops connected to this edge,. + * + * This is typically use for accessing an edges faces, + * however this is done by stepping over it's loops. + * + * - This is a circular list, so there are no first/last storage of the "radial" data. + * Instead #BMEdge.l points to any one of the loops that use it. + * + * - Since the list is circular, the particular loop referenced doesn't matter, + * as all other loops can be accessed from it. + * + * - Every loop in this radial list has the same value for #BMLoop.e. + * + * - The value for #BMLoop.v might not match the radial next/previous + * as this depends on the face-winding. + * You can be sure #BMLoop.v will either #BMEdge.v1 or #BMEdge.v2 of #BMLoop.e, + * + * - Unlike face-winding (which defines if the direction the face points), + * next and previous are insignificant. The list could be reversed for example, + * without any impact on the topology. + * + * This is an example of looping over an edges faces using #BMLoop.radial_next. + * + * \code{.c} + * BMLoop *l_iter = edge->l; + * do { + * operate_on_face(l_iter->f); + * } while ((l_iter = l_iter->radial_next) != edge->l); + * \endcode + */ struct BMLoop *radial_next, *radial_prev; - /* these were originally commented as private but are used all over the code */ - /* can't use ListBase API, due to head */ - struct BMLoop *next, *prev; /* next/prev verts around the face */ + /** + * Other loops that are part of this face. + * + * This is typically used for accessing all vertices/edges in a faces. + * + * - This is a circular list, so there are no first/last storage of the "cycle" data. + * Instead #BMFace.l_first points to any one of the loops that are part of this face. + * + * - Since the list is circular, the particular loop referenced doesn't matter, + * as all other loops can be accessed from it. + * + * - Every loop in this "cycle" list has the same value for #BMLoop.f. + * + * - The direction of this list defines the face winding. + * Reversing the list flips the face. + * + * This is an example loop over all vertices and edges of a face. + * + * \code{.c} + * BMLoop *l_first, *l_iter; + * l_iter = l_first = BM_FACE_FIRST_LOOP(f); + * do { + * operate_on_vert(l_iter->v); + * operate_on_edge(l_iter->e); + * } while ((l_iter = l_iter->next) != l_first); + * \endcode + */ + struct BMLoop *next, *prev; } BMLoop; /* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these don't have a flag layer */ @@ -185,7 +272,11 @@ typedef struct BMFace { #else BMLoop *l_first; #endif - int len; /* number of vertices in the face */ + /** + * Number of vertices in the face + * (the length of #BMFace.l_first circular linked list). + */ + int len; float no[3]; /* face normal */ short mat_nr; /* material index */ // short _pad[3]; @@ -206,13 +297,17 @@ typedef struct BMesh { int totvert, totedge, totloop, totface; int totvertsel, totedgesel, totfacesel; - /* flag index arrays as being dirty so we can check if they are clean and + /** + * Flag index arrays as being dirty so we can check if they are clean and * avoid looping over the entire vert/edge/face/loop array in those cases. - * valid flags are - BM_VERT | BM_EDGE | BM_FACE | BM_LOOP. */ + * valid flags are: `(BM_VERT | BM_EDGE | BM_FACE | BM_LOOP)` + */ char elem_index_dirty; - /* flag array table as being dirty so we know when its safe to use it, - * or when it needs to be re-created */ + /** + * Flag array table as being dirty so we know when its safe to use it, + * or when it needs to be re-created. + */ char elem_table_dirty; /* element pools */ @@ -248,8 +343,8 @@ typedef struct BMesh { struct MLoopNorSpaceArray *lnor_spacearr; char spacearr_dirty; - /* should be copy of scene select mode */ - /* stored in BMEditMesh too, this is a bit confusing, + /* Should be copy of scene select mode. */ + /* Stored in #BMEditMesh too, this is a bit confusing, * make sure they're in sync! * Only use when the edit mesh cant be accessed - campbell */ short selectmode; @@ -260,14 +355,30 @@ typedef struct BMesh { int totflags; ListBase selected; + /** + * The active face. + * This is kept even when unselected, mainly so UV editing can keep showing the + * active faces image while the selection is being modified in the 3D viewport. + * + * Without this the active image in the UV editor would flicker in a distracting way + * while changing selection in the 3D viewport. + */ BMFace *act_face; + /** List of #BMOpError, used for operator error handling. */ ListBase errorstack; + /** + * Keep a single reference to the Python instance of this #BMesh (if any exists). + * + * This allows save invalidation of a #BMesh when it's freed, + * so the Python object will report it as having been removed, + * instead of crashing on invalid memory access. + */ void *py_handle; } BMesh; -/* BMHeader->htype (char) */ +/** #BMHeader.htype (char) */ enum { BM_VERT = 1, BM_EDGE = 2, @@ -288,7 +399,7 @@ typedef struct BMLoopNorEditDataArray { BMLoopNorEditData *lnor_editdata; /** * This one has full amount of loops, - * used to map loop index to actual BMLoopNorEditData struct. + * used to map loop index to actual #BMLoopNorEditData struct. */ BMLoopNorEditData **lidx_to_lnor_editdata; @@ -299,6 +410,7 @@ typedef struct BMLoopNorEditDataArray { #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE) #define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE) +/** #BMesh.spacearr_dirty */ enum { BM_SPACEARR_DIRTY = 1 << 0, BM_SPACEARR_DIRTY_ALL = 1 << 1, @@ -354,7 +466,7 @@ enum { # define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), ele #endif -/* BMHeader->hflag (char) */ +/** #BMHeader.hflag (char) */ enum { BM_ELEM_SELECT = (1 << 0), BM_ELEM_HIDDEN = (1 << 1), @@ -364,21 +476,23 @@ enum { * this is a sharp edge when disabled */ BM_ELEM_SMOOTH = (1 << 3), /** - * internal flag, used for ensuring correct normals - * during multires interpolation, and any other time + * Internal flag, used for ensuring correct normals + * during multi-resolution interpolation, and any other time * when temp tagging is handy. - * always assume dirty & clear before use. */ + * always assume dirty & clear before use. + */ BM_ELEM_TAG = (1 << 4), BM_ELEM_DRAW = (1 << 5), /* edge display */ - /* spare tag, assumed dirty, use define in each function to name based on use */ + /** Spare tag, assumed dirty, use define in each function to name based on use. */ BM_ELEM_TAG_ALT = (1 << 6), /** * For low level internal API tagging, * since tools may want to tag verts and not have functions clobber them. - * Leave cleared! */ + * Leave cleared! + */ BM_ELEM_INTERNAL_TAG = (1 << 7), }; From d4c0c40015111f335dfaca90ed1b8741a6ca8f76 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 24 Feb 2021 15:53:03 +1100 Subject: [PATCH 422/519] Cleanup: spelling --- source/blender/blenkernel/intern/mesh_boolean_convert.cc | 4 ++-- source/blender/blenkernel/intern/mesh_remesh_voxel.c | 4 ++-- source/blender/blenlib/BLI_function_ref.hh | 6 +++--- source/blender/draw/engines/eevee/eevee_screen_raytrace.c | 2 +- source/blender/makesdna/DNA_object_types.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index 02c99d2c5da..4b47294e61a 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -91,7 +91,7 @@ class MeshesToIMeshInfo { /* Similarly for polys of meshes. */ Array mesh_poly_offset; /* For each Mesh vertex in all the meshes (with concatenated indexing), - * what is the IMesh Vert* allocated for it in the intput IMesh? */ + * what is the IMesh Vert* allocated for it in the input IMesh? */ Array mesh_to_imesh_vert; /* Similarly for each Mesh poly. */ Array mesh_to_imesh_face; @@ -832,4 +832,4 @@ Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes), #endif -} // extern "C" \ No newline at end of file +} // extern "C" diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index e093e3024c3..0a5aa360553 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -71,7 +71,7 @@ struct OpenVDBLevelSet *BKE_mesh_remesh_voxel_ovdb_mesh_to_level_set_create( unsigned int totverts = mesh->totvert; float *verts = (float *)MEM_malloc_arrayN(totverts * 3, sizeof(float), "remesh_input_verts"); unsigned int *faces = (unsigned int *)MEM_malloc_arrayN( - totfaces * 3, sizeof(unsigned int), "remesh_intput_faces"); + totfaces * 3, sizeof(unsigned int), "remesh_input_faces"); for (unsigned int i = 0; i < totverts; i++) { MVert *mvert = &mesh->mvert[i]; @@ -175,7 +175,7 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh, unsigned int totverts = input_mesh->totvert; float *verts = (float *)MEM_malloc_arrayN(totverts * 3, sizeof(float), "remesh_input_verts"); unsigned int *faces = (unsigned int *)MEM_malloc_arrayN( - totfaces * 3, sizeof(unsigned int), "remesh_intput_faces"); + totfaces * 3, sizeof(unsigned int), "remesh_input_faces"); for (unsigned int i = 0; i < totverts; i++) { MVert *mvert = &input_mesh->mvert[i]; diff --git a/source/blender/blenlib/BLI_function_ref.hh b/source/blender/blenlib/BLI_function_ref.hh index 86f761bbded..57fffdc09b4 100644 --- a/source/blender/blenlib/BLI_function_ref.hh +++ b/source/blender/blenlib/BLI_function_ref.hh @@ -30,9 +30,9 @@ * A `FunctionRef` is small and cheap to copy. Therefore it should generally be passed by value. * * Example signatures: - * FunctionRef - A function without parameters and void return type. - * FunctionRef - A function with a float paramter and an int return value. - * FunctionRef - A function with two int parameters and an int return value. + * `FunctionRef` - A function without parameters and void return type. + * `FunctionRef` - A function with a float parameter and an int return value. + * `FunctionRef` - A function with two int parameters and an int return value. * * There are multiple ways to achieve that, so here is a comparison of the different approaches: * 1. Pass function pointer and user data (as void *) separately: diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index 97255f15d9b..f9e22f5c08d 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -246,7 +246,7 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v /* Resolve at fullres */ int samp = (DRW_state_is_image_render()) ? effects->taa_render_sample : - effects->taa_current_sample; + effects->taa_current_sample; /* Doing a neighbor shift only after a few iteration. * We wait for a prime number of cycles to avoid noise correlation. * This reduces variance faster. */ diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 5f414aa2bdd..f6372a0c240 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -630,7 +630,7 @@ enum { */ #define BA_TRANSFORM_LOCKED_IN_PLACE (1 << 7) -#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */ +#define BA_TRANSFORM_CHILD (1 << 8) /* child of a transformed object */ #define BA_TRANSFORM_PARENT (1 << 13) /* parent of a transformed object */ #define OB_FROMDUPLI (1 << 9) From 8d50a3e19e025ef470132e7edadd7b180db833f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 24 Feb 2021 16:16:53 +1100 Subject: [PATCH 423/519] Fix T85930: Custom Property Error: Wrong Subtype Regression in 08dbc4f996e4e95f3ab64f7bb3e1193700c585f5 Unfortunately lambda functions don't work with postponed annotations. --- release/scripts/startup/bl_operators/wm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 3b94a964148..b14f9c05210 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1220,11 +1220,14 @@ class WM_OT_properties_edit(Operator): ) subtype: EnumProperty( name="Subtype", - items=lambda self, _context: WM_OT_properties_edit.subtype_items, + items=WM_OT_properties_edit._subtype_items_fn, ) subtype_items = rna_vector_subtype_items + def _subtype_items_fn(_self, _context): + return WM_OT_properties_edit.subtype_items + def _init_subtype(self, prop_type, is_array, subtype): subtype = subtype or 'NONE' subtype_items = rna_vector_subtype_items From 0fe25a6232c4f8eacda02e23945ac3d2ad8808ff Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 24 Feb 2021 10:45:25 +0100 Subject: [PATCH 424/519] Fix T85939: Eevee Specular BSDF shader compile error Introduced by 7f7e6830991b. --- .../material/gpu_shader_material_eevee_specular.glsl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl index d5623c890e4..0941482df45 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_eevee_specular.glsl @@ -38,7 +38,7 @@ void node_eevee_specular(vec4 diffuse, /* Diffuse. */ out_Diffuse_0.radiance = render_pass_diffuse_mask(vec3(1), out_Diffuse_0.radiance); out_Diffuse_0.radiance *= in_Diffuse_0.albedo; - result += out_Diffuse_0.radiance; + result.radiance += out_Diffuse_0.radiance; } { /* Glossy. */ @@ -48,7 +48,7 @@ void node_eevee_specular(vec4 diffuse, out_Glossy_1.radiance = closure_mask_ssr_radiance(out_Glossy_1.radiance, ssr_id); out_Glossy_1.radiance *= brdf; - out_Glossy_1.radiance = render_pass_glossy_mask(spec_color, out_Glossy_1.radiance); + out_Glossy_1.radiance = render_pass_glossy_mask(specular.rgb, out_Glossy_1.radiance); closure_load_ssr_data( out_Glossy_1.radiance, in_Glossy_1.roughness, in_Glossy_1.N, ssr_id, result); } @@ -64,12 +64,12 @@ void node_eevee_specular(vec4 diffuse, } { /* Emission. */ - vec3 out_emission_radiance = render_pass_emission_mask(emission.rgb); + vec3 out_emission_radiance = render_pass_emission_mask(emissive.rgb); result.radiance += out_emission_radiance; } - float trans = 1.0 - trans; - result.transmittance = vec3(trans); + float alpha = 1.0 - transp; + result.transmittance = vec3(transp); result.radiance *= alpha; result.ssr_data.rgb *= alpha; } From daf7f423642cad3e807ac35d669a404eac39a640 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Wed, 24 Feb 2021 11:16:51 +0100 Subject: [PATCH 425/519] Fix line width broken for consecutive line draw calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit D9054 did multiple consecutive `immBegin()`/`immEnd()` draw calls to draw multiple lines at varying thickness. This would only work for the first line, then they'd all get a 1px thickness (at least on macOS). Issue was that `wide_line_workaround_end()` called `immBindShader()` directly to restore the old shader (which the workaround overrides). However this doesn't set `imm->builtin_shader_bound` which has to be done for the workaround to work on the next `immBegin()` call. Instead `immBindBuiltinProgram()` can be called. Differential Revision: https://developer.blender.org/D10520 Reviewed by: Clément Foucault --- source/blender/gpu/intern/gpu_immediate.cc | 8 ++++---- source/blender/gpu/intern/gpu_immediate_private.hh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/gpu/intern/gpu_immediate.cc b/source/blender/gpu/intern/gpu_immediate.cc index 95718391165..e56dcd16528 100644 --- a/source/blender/gpu/intern/gpu_immediate.cc +++ b/source/blender/gpu/intern/gpu_immediate.cc @@ -166,7 +166,7 @@ static void wide_line_workaround_start(GPUPrimType prim_type) return; } - imm->prev_shader = imm->shader; + imm->prev_builtin_shader = imm->builtin_shader_bound; immUnbindProgram(); @@ -194,15 +194,15 @@ static void wide_line_workaround_start(GPUPrimType prim_type) static void wide_line_workaround_end() { - if (imm->prev_shader) { + if (imm->prev_builtin_shader) { if (GPU_blend_get() == GPU_BLEND_NONE) { /* Restore default. */ immUniform1i("lineSmooth", 1); } immUnbindProgram(); - immBindShader(imm->prev_shader); - imm->prev_shader = nullptr; + immBindBuiltinProgram(imm->prev_builtin_shader); + imm->prev_builtin_shader = GPU_SHADER_TEXT; } } diff --git a/source/blender/gpu/intern/gpu_immediate_private.hh b/source/blender/gpu/intern/gpu_immediate_private.hh index 98399897ea9..382f70eeec4 100644 --- a/source/blender/gpu/intern/gpu_immediate_private.hh +++ b/source/blender/gpu/intern/gpu_immediate_private.hh @@ -58,7 +58,7 @@ class Immediate { /** Wide Line workaround. */ /** Previously bound shader to restore after drawing. */ - GPUShader *prev_shader = NULL; + eGPUBuiltinShader prev_builtin_shader = GPU_SHADER_TEXT; /** Builtin shader index. Used to test if the workaround can be done. */ eGPUBuiltinShader builtin_shader_bound = GPU_SHADER_TEXT; /** Uniform color: Kept here to update the wide-line shader just before #immBegin. */ From 1a427973b4593b6f61a0100147236664c79eec41 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Wed, 24 Feb 2021 00:48:09 +0100 Subject: [PATCH 426/519] Fix incorrect icon .dat files after recent commit Using `make icons` for 420f538fadfd changed some icons that it shouldn't have touched on my system. Not sure what caused this, maybe a bug in the slightly outdated Inkscape version there (1.0.1). Here on macOS the version is only reported as 1.0 so I'm not sure what the situation is. Either way, this fixes the icons. --- .../blender_icons16/icon16_force_boid.dat | Bin 1048 -> 1048 bytes .../datafiles/blender_icons16/icon16_temp.dat | Bin 1048 -> 1048 bytes .../blender_icons32/icon32_force_boid.dat | Bin 4120 -> 4120 bytes .../datafiles/blender_icons32/icon32_temp.dat | Bin 4120 -> 4120 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/release/datafiles/blender_icons16/icon16_force_boid.dat b/release/datafiles/blender_icons16/icon16_force_boid.dat index f719054d84acac167b928f37977b0aa9eb1f556a..71f89bd7c0440f75ecd56ac975e9a5f6d398c668 100644 GIT binary patch delta 20 ccmbQiF@s~nW=2NN$y*rh86R!_!l=Ro07?-C=Kufz delta 20 ccmbQiF@s~nW=2M?$y*rh86R){!l=Ro07@eU=>Px# diff --git a/release/datafiles/blender_icons16/icon16_temp.dat b/release/datafiles/blender_icons16/icon16_temp.dat index 9abd6ac2a0d81d7b620d3f26472f77dab2a2b229..0c3a0bd5deba3d3645f959d75bccaf53bc90bf06 100644 GIT binary patch delta 110 zcmbQiF@s~mcE-aKci3<+0KxzN|9K|&)EEE^`6SPh)DhY87q RKgb*#W^2a(lPj1P008<5S=|5t diff --git a/release/datafiles/blender_icons32/icon32_force_boid.dat b/release/datafiles/blender_icons32/icon32_force_boid.dat index 9043989024be2e3d6d1b218b91ffe3253dc060f9..7fc7cb5ee8ca45304a05a9e6e49dc86f44b069e1 100644 GIT binary patch delta 30 mcmbQCFhgO(X*O1Y|NsB1Prkrb&3JXP4|_f1>CI=@eK-KovkdS6 delta 30 mcmbQCFhgO(X*O2D|NsAMPrkrb&3JRN4|_f1+0AFzeK-KpO$_@0 diff --git a/release/datafiles/blender_icons32/icon32_temp.dat b/release/datafiles/blender_icons32/icon32_temp.dat index 74f6401712cd43061aaaf6fde708e909d288dd3e..645206e8560be9929e74c0707a1581532824b967 100644 GIT binary patch delta 307 zcmbQCFhgNOFw^AAj53oGm^dbvGsUp_{Qv*|>Eu8rWyaT&8<;I7E3mLnwq_O;V1NRk zG&c}yOio}fn5Zc+`2};vL<5D%1uO{@4OAw7VTqY6z@$C7nl%(m|7H!HXrME>hAjj{ z{b38|{R`9#$CDG-i_t_Luots}+%X_We&9|3IXQzT1Km67lOOODBl~?4FU0G+c_m=Mv-vx(A`<{UOpopW delta 468 zcmbQCFhgNOFw^8GOyZM2FmX>VWr~Bd3z*ng-~9jo-)W+v#bgU+iOGpf!jqGka|M86 zC}8pf<^oK?1QtxeiHahVzp%t$D4wV&F}Z>@0;~8Btl~10YuG}tsF#`ihb??^3X{O( zWcC6u{g}Og7sa^~6@i*L!Z8K^U=yt2#HJEc5ayF!=#D lW{^!z;3)uy{9_;uizZOiyajp+95p+5rC}1Azw# Date: Wed, 24 Feb 2021 11:24:49 +0100 Subject: [PATCH 427/519] Fix T85726 Workbench: Orthographic view is blurry This was caused by the window_translate_m4 not offsetting the winmat in the right direction for perspective view. Thus leading to incorrect weights. The workbench sample weight computation was also inverted. This fix will change the sampling pattern for EEVEE too (it will just mirror it in perspective view). --- source/blender/blenlib/intern/math_geom.c | 4 ++-- .../draw/engines/workbench/workbench_effect_antialiasing.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index b7e94e6c512..01cda6c9e4a 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -4886,8 +4886,8 @@ void window_translate_m4(float winmat[4][4], float perspmat[4][4], const float x len1 = (1.0f / len_v3(v1)); len2 = (1.0f / len_v3(v2)); - winmat[2][0] += len1 * winmat[0][0] * x; - winmat[2][1] += len2 * winmat[1][1] * y; + winmat[2][0] -= len1 * winmat[0][0] * x; + winmat[2][1] -= len2 * winmat[1][1] * y; } else { winmat[3][0] += x; diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index c9f876f9573..77fdbde99ef 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -285,7 +285,7 @@ static void workbench_antialiasing_weights_get(const float offset[2], for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++, i++) { float sample_co[2] = {x, y}; - add_v2_v2(sample_co, offset); + sub_v2_v2(sample_co, offset); float r = len_v2(sample_co); /* fclem: is radial distance ok here? */ float weight = filter_blackman_harris(r, filter_width); From 32ca8e58a374dc28df0b0a744e407a8ebf58e56e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 24 Feb 2021 11:36:16 +0100 Subject: [PATCH 428/519] Workbench: Fix samples taken outside of pixel footprint With the previous implementation, we could have pixels with offset larger than 1 pixel. Also fix a bug when the closest_index is not last. The sample positions were incorrect in this case. --- .../workbench/workbench_effect_antialiasing.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index 77fdbde99ef..84cc4359aa6 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -64,10 +64,17 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num) } } - /* move jitter table so that closest sample is in center */ + float closest_sample[2]; + copy_v2_v2(closest_sample, table[closest_index]); for (int index = 0; index < num; index++) { - sub_v2_v2(table[index], table[closest_index]); - mul_v2_fl(table[index], 2.0f); + /* move jitter table so that closest sample is in center */ + sub_v2_v2(table[index], closest_sample); + for (int i = 0; i < 2; i++) { + /* Avoid samples outside range (wrap arround). */ + table[index][i] = fmodf(table[index][i] + 0.5f, 1.0f); + /* Recenter the distribution[-1..1]. */ + table[index][i] += table[index][i] * 2.0f - 1.0f; + } } /* swap center sample to the start of the table */ From 12b805148f754ec95eb2b236fbd28fbb0153bb3c Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 24 Feb 2021 12:10:45 +0100 Subject: [PATCH 429/519] Cleanup: quiet asan overflow warning --- .../blender/nodes/geometry/nodes/node_geo_point_distribute.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc index 553b8ea364f..d9878d54353 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc @@ -379,7 +379,7 @@ BLI_NOINLINE static void compute_special_attributes(const Mesh &mesh, const float3 v1_pos = mesh.mvert[v1_index].co; const float3 v2_pos = mesh.mvert[v2_index].co; - ids[i] = (int)(bary_coord.hash()) + looptri_index; + ids[i] = (int)(bary_coord.hash() + (uint64_t)looptri_index); normal_tri_v3(normals[i], v0_pos, v1_pos, v2_pos); rotations[i] = normal_to_euler_rotation(normals[i]); } From 812a362bd84f900c75f4c0f0eb2bae1b8bd7a059 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 25 Nov 2020 12:06:48 +0100 Subject: [PATCH 430/519] Docs: 2.91 release description for Linux appdata --- .../org.blender.Blender.appdata.xml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/release/freedesktop/org.blender.Blender.appdata.xml b/release/freedesktop/org.blender.Blender.appdata.xml index edadf9d7438..33a40a07bf1 100644 --- a/release/freedesktop/org.blender.Blender.appdata.xml +++ b/release/freedesktop/org.blender.Blender.appdata.xml @@ -40,6 +40,30 @@ + + +

New features:

+
    +
  • Volume modifiers
  • +
  • Precise boolean
  • +
  • Cloth brush collision
  • +
  • Custom curve bevels
  • +
  • Grease Pencil image tracer
  • +
  • Property search and fuzzy search
  • +
+

Enhancements:

+
    +
  • Boundary and pose cloth brushes
  • +
  • Material holdout for Grease Pencil
  • +
  • Sculpting gestures
  • +
  • Overrides resync and transform support
  • +
  • Animation proxy conversion
  • +
  • Compound shape collision
  • +
  • Outliner collection colors
  • +
  • Snappier F-Curves and seamless keyframe insertion
  • +
+
+

New features:

From 5c098ef58c4b1b8e9111d33ae64fda8a300dd84d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 24 Feb 2021 23:34:00 +1100 Subject: [PATCH 431/519] Fix crash updating themes in background mode --- source/blender/makesrna/intern/rna_userdef.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 7f7adc69dd1..1abd16caaeb 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -274,7 +274,9 @@ static void rna_userdef_gizmo_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_userdef_theme_update_icons(Main *bmain, Scene *scene, PointerRNA *ptr) { - UI_icons_reload_internal_textures(); + if (!G.background) { + UI_icons_reload_internal_textures(); + } rna_userdef_theme_update(bmain, scene, ptr); } From 0c0553ace7b31107ba03952e013d802a5f6b1f35 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 24 Feb 2021 23:36:15 +1100 Subject: [PATCH 432/519] Fix T85915: Cannot save new theme preset Since making bpy.types a real module `dir(bpy.types)` now includes __dir__ and __getattr__ methods which need to be ignored. --- release/scripts/modules/rna_xml.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py index d9fc09e7d18..58abb5c90db 100644 --- a/release/scripts/modules/rna_xml.py +++ b/release/scripts/modules/rna_xml.py @@ -26,14 +26,21 @@ def build_property_typemap(skip_classes, skip_typemap): property_typemap = {} for attr in dir(bpy.types): + # Skip internal methods. + if attr.startswith("_"): + continue cls = getattr(bpy.types, attr) if issubclass(cls, skip_classes): continue + bl_rna = getattr(cls, "bl_rna", None) + # Needed to skip classes added to the modules `__dict__`. + if bl_rna is None: + continue # # to support skip-save we can't get all props - # properties = cls.bl_rna.properties.keys() + # properties = bl_rna.properties.keys() properties = [] - for prop_id, prop in cls.bl_rna.properties.items(): + for prop_id, prop in bl_rna.properties.items(): if not prop.is_skip_save: properties.append(prop_id) From 8f6fd07b54653befe9568cca2752603c74ab5667 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Feb 2021 14:14:46 +0100 Subject: [PATCH 433/519] Fix T85947: Missing check of master collection for objects being instanced. `object_in_any_collection` used during linking/appending to check whether an object is already instanced by at least one collection, was not taking into account embedded master collections from scenes. --- source/blender/blenloader/intern/readfile.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 6528e1cdf79..bea05699579 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4600,6 +4600,13 @@ static bool object_in_any_collection(Main *bmain, Object *ob) } } + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + if (scene->master_collection != NULL && + BKE_collection_has_object(scene->master_collection, ob)) { + return true; + } + } + return false; } From 5be72125bf4dfddf5dfe720caa12b3163f540faf Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 22 Feb 2021 09:44:57 -0300 Subject: [PATCH 434/519] Cleanup: Move some utilities to 'gpu_py.h' --- source/blender/python/gpu/gpu_py.c | 19 ++++++++++++++++++ source/blender/python/gpu/gpu_py.h | 13 ++++++++++++ source/blender/python/gpu/gpu_py_api.c | 20 ------------------- source/blender/python/gpu/gpu_py_api.h | 12 ----------- source/blender/python/gpu/gpu_py_batch.c | 1 - source/blender/python/gpu/gpu_py_element.c | 1 - .../blender/python/gpu/gpu_py_framebuffer.c | 2 +- source/blender/python/gpu/gpu_py_offscreen.c | 2 +- source/blender/python/gpu/gpu_py_shader.c | 2 +- source/blender/python/gpu/gpu_py_texture.c | 1 - .../blender/python/gpu/gpu_py_uniformbuffer.c | 1 - 11 files changed, 35 insertions(+), 39 deletions(-) diff --git a/source/blender/python/gpu/gpu_py.c b/source/blender/python/gpu/gpu_py.c index 2c5daaf1962..7aea940da94 100644 --- a/source/blender/python/gpu/gpu_py.c +++ b/source/blender/python/gpu/gpu_py.c @@ -23,6 +23,7 @@ #include +#include "GPU_init_exit.h" #include "GPU_primitive.h" #include "GPU_texture.h" @@ -58,3 +59,21 @@ struct PyC_StringEnumItems bpygpu_dataformat_items[] = { {0, NULL}, }; /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Utilities + * \{ */ + +bool bpygpu_is_init_or_error(void) +{ + if (!GPU_is_init()) { + PyErr_SetString(PyExc_SystemError, + "GPU functions for drawing are not available in background mode"); + + return false; + } + + return true; +} + +/** \} */ diff --git a/source/blender/python/gpu/gpu_py.h b/source/blender/python/gpu/gpu_py.h index 28b3e41a08f..39e5997f866 100644 --- a/source/blender/python/gpu/gpu_py.h +++ b/source/blender/python/gpu/gpu_py.h @@ -22,3 +22,16 @@ extern struct PyC_StringEnumItems bpygpu_primtype_items[]; extern struct PyC_StringEnumItems bpygpu_dataformat_items[]; + +bool bpygpu_is_init_or_error(void); + +#define BPYGPU_IS_INIT_OR_ERROR_OBJ \ + if (UNLIKELY(!bpygpu_is_init_or_error())) { \ + return NULL; \ + } \ + ((void)0) +#define BPYGPU_IS_INIT_OR_ERROR_INT \ + if (UNLIKELY(!bpygpu_is_init_or_error())) { \ + return -1; \ + } \ + ((void)0) diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 7213dc59886..68f7eb9816c 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -30,8 +30,6 @@ #include "../generic/python_utildefines.h" -#include "GPU_init_exit.h" - #include "gpu_py_matrix.h" #include "gpu_py_select.h" #include "gpu_py_state.h" @@ -39,24 +37,6 @@ #include "gpu_py_api.h" /* own include */ -/* -------------------------------------------------------------------- */ -/** \name Utils to invalidate functions - * \{ */ - -bool bpygpu_is_init_or_error(void) -{ - if (!GPU_is_init()) { - PyErr_SetString(PyExc_SystemError, - "GPU functions for drawing are not available in background mode"); - - return false; - } - - return true; -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name GPU Module * \{ */ diff --git a/source/blender/python/gpu/gpu_py_api.h b/source/blender/python/gpu/gpu_py_api.h index 5e399a233aa..38452ad67c1 100644 --- a/source/blender/python/gpu/gpu_py_api.h +++ b/source/blender/python/gpu/gpu_py_api.h @@ -25,15 +25,3 @@ // #define BPYGPU_USE_GPUOBJ_FREE_METHOD PyObject *BPyInit_gpu(void); - -bool bpygpu_is_init_or_error(void); -#define BPYGPU_IS_INIT_OR_ERROR_OBJ \ - if (UNLIKELY(!bpygpu_is_init_or_error())) { \ - return NULL; \ - } \ - ((void)0) -#define BPYGPU_IS_INIT_OR_ERROR_INT \ - if (UNLIKELY(!bpygpu_is_init_or_error())) { \ - return -1; \ - } \ - ((void)0) diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c index 9989077670b..ef795268158 100644 --- a/source/blender/python/gpu/gpu_py_batch.c +++ b/source/blender/python/gpu/gpu_py_batch.c @@ -39,7 +39,6 @@ #include "../generic/py_capi_utils.h" #include "gpu_py.h" -#include "gpu_py_api.h" #include "gpu_py_element.h" #include "gpu_py_shader.h" #include "gpu_py_vertex_buffer.h" diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c index 0e5094cbbc0..2beabe6a93d 100644 --- a/source/blender/python/gpu/gpu_py_element.c +++ b/source/blender/python/gpu/gpu_py_element.c @@ -33,7 +33,6 @@ #include "../generic/python_utildefines.h" #include "gpu_py.h" -#include "gpu_py_api.h" #include "gpu_py_element.h" /* own include */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/python/gpu/gpu_py_framebuffer.c b/source/blender/python/gpu/gpu_py_framebuffer.c index 04d49a9f15d..5bf577f3b96 100644 --- a/source/blender/python/gpu/gpu_py_framebuffer.c +++ b/source/blender/python/gpu/gpu_py_framebuffer.c @@ -34,7 +34,7 @@ #include "../generic/python_utildefines.h" #include "../mathutils/mathutils.h" -#include "gpu_py_api.h" +#include "gpu_py.h" #include "gpu_py_texture.h" #include "gpu_py_framebuffer.h" /* own include */ diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index a98d9649f6f..9d5671ff702 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -52,7 +52,7 @@ #include "../generic/py_capi_utils.h" -#include "gpu_py_api.h" +#include "gpu_py.h" #include "gpu_py_offscreen.h" /* own include */ /* Define the free method to avoid breakage. */ diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index 2f9b67bdb6a..4237e2d4b2d 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -33,7 +33,7 @@ #include "../generic/python_utildefines.h" #include "../mathutils/mathutils.h" -#include "gpu_py_api.h" +#include "gpu_py.h" #include "gpu_py_texture.h" #include "gpu_py_uniformbuffer.h" #include "gpu_py_vertex_format.h" diff --git a/source/blender/python/gpu/gpu_py_texture.c b/source/blender/python/gpu/gpu_py_texture.c index 85246bffac7..12855b8dbcc 100644 --- a/source/blender/python/gpu/gpu_py_texture.c +++ b/source/blender/python/gpu/gpu_py_texture.c @@ -33,7 +33,6 @@ #include "../generic/py_capi_utils.h" #include "gpu_py.h" -#include "gpu_py_api.h" #include "gpu_py_buffer.h" #include "gpu_py_texture.h" /* own include */ diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.c b/source/blender/python/gpu/gpu_py_uniformbuffer.c index d1b86455918..c60d6216834 100644 --- a/source/blender/python/gpu/gpu_py_uniformbuffer.c +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.c @@ -34,7 +34,6 @@ #include "../generic/py_capi_utils.h" #include "gpu_py.h" -#include "gpu_py_api.h" #include "gpu_py_buffer.h" #include "gpu_py_uniformbuffer.h" /* own include */ From 4fb0c83c1c8529b61d38d8a409caf58d05a53bd9 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Wed, 24 Feb 2021 07:13:37 -0700 Subject: [PATCH 435/519] Cmake/deps: Update OSL to 1.11.10.0 This bumps OSL to 1.11.10.0. OSL Has a new build time dependency: Clang, and more importantly it expects clang and llvm to share a library folder, which it previously for us did not. This patch changes: -OSL Update to 1.11.10.0 -refactor the llvm/clang/clang-tools-extra builds into the llvm build using the llvm-project tarball for building that has all of the subprojects in it. -update ispc/openmp builds since clang no longer its own dependency and they have to depend on the llvm build now. -Update the windows builder to use the 64 bit host tools since it ran out of ram linking clang -Since OSL now needs clang to link successfully a findclang.cmake has been provided for linux/OSX Differential Revision: https://developer.blender.org/D10212 Reviewed By: brecht, sebbas, sybren --- CMakeLists.txt | 3 + build_files/build_environment/CMakeLists.txt | 1 - .../build_environment/cmake/clang.cmake | 104 ---------------- .../build_environment/cmake/harvest.cmake | 10 +- .../build_environment/cmake/ispc.cmake | 13 +- .../build_environment/cmake/llvm.cmake | 21 ++++ .../build_environment/cmake/openmp.cmake | 2 +- build_files/build_environment/cmake/osl.cmake | 42 ++----- .../build_environment/cmake/versions.cmake | 22 +--- .../build_environment/patches/llvm.diff | 4 +- .../build_environment/patches/osl.diff | 24 ++-- .../build_environment/windows/build_deps.cmd | 4 +- build_files/cmake/Modules/FindClang.cmake | 111 ++++++++++++++++++ .../cmake/platform/platform_apple.cmake | 7 ++ .../cmake/platform/platform_unix.cmake | 11 +- .../cmake/platform/platform_win32.cmake | 4 + intern/cycles/kernel/osl/CMakeLists.txt | 1 + source/creator/blender.map | 1 + source/creator/osx_locals.map | 1 + 19 files changed, 201 insertions(+), 185 deletions(-) delete mode 100644 build_files/build_environment/cmake/clang.cmake create mode 100644 build_files/cmake/Modules/FindClang.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c95b8f0f7af..5b8d68a60f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -416,6 +416,7 @@ else() option(LLVM_STATIC "Link with LLVM static libraries" OFF) endif() mark_as_advanced(LLVM_STATIC) +option(WITH_CLANG "Use Clang" OFF) # disable for now, but plan to support on all platforms eventually option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" ON) @@ -742,6 +743,7 @@ if(WITH_CYCLES) # auto enable llvm for cycles_osl if(WITH_CYCLES_OSL) set(WITH_LLVM ON CACHE BOOL "" FORCE) + set(WITH_CLANG ON CACHE BOOL "" FORCE) endif() else() set(WITH_CYCLES_OSL OFF) @@ -1881,6 +1883,7 @@ if(FIRST_RUN) info_cfg_text("Build Options:") info_cfg_option(WITH_ALEMBIC) info_cfg_option(WITH_BULLET) + info_cfg_option(WITH_CLANG) info_cfg_option(WITH_CYCLES) info_cfg_option(WITH_FFTW3) info_cfg_option(WITH_FREESTYLE) diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index b2f16508bb5..aa6b1cbe539 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -71,7 +71,6 @@ include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) include(cmake/opencollada.cmake) include(cmake/llvm.cmake) -include(cmake/clang.cmake) if(APPLE) include(cmake/openmp.cmake) endif() diff --git a/build_files/build_environment/cmake/clang.cmake b/build_files/build_environment/cmake/clang.cmake deleted file mode 100644 index d8d83619e1a..00000000000 --- a/build_files/build_environment/cmake/clang.cmake +++ /dev/null @@ -1,104 +0,0 @@ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# ***** END GPL LICENSE BLOCK ***** - -set(CLANG_EXTRA_ARGS - -DLLVM_DIR="${LIBDIR}/llvm/lib/cmake/llvm/" - -DLLVM_USE_CRT_RELEASE=MD - -DLLVM_USE_CRT_DEBUG=MDd - -DLLVM_CONFIG=${LIBDIR}/llvm/bin/llvm-config -) - -set(BUILD_CLANG_TOOLS OFF) - -if(WIN32) - set(CLANG_GENERATOR "Ninja") -else() - set(CLANG_GENERATOR "Unix Makefiles") -endif() - -if(APPLE) - set(BUILD_CLANG_TOOLS ON) - set(CLANG_EXTRA_ARGS ${CLANG_EXTRA_ARGS} - -DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a - ) -endif() - -if(BUILD_CLANG_TOOLS) - # ExternalProject_Add does not allow multiple tarballs to be - # downloaded. Work around this by having an empty build action - # for the extra tools, and referring the clang build to the location - # of the clang-tools-extra source. - ExternalProject_Add(external_clang_tools - URL ${CLANG_TOOLS_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${CLANG_TOOLS_HASH} - INSTALL_DIR ${LIBDIR}/clang_tools - PREFIX ${BUILD_DIR}/clang_tools - CONFIGURE_COMMAND echo "." - BUILD_COMMAND echo "." - INSTALL_COMMAND echo "." - ) - list(APPEND CLANG_EXTRA_ARGS - -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=${BUILD_DIR}/clang_tools/src/external_clang_tools/ - ) -endif() - -ExternalProject_Add(external_clang - URL ${CLANG_URI} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH MD5=${CLANG_HASH} - PREFIX ${BUILD_DIR}/clang - CMAKE_GENERATOR ${CLANG_GENERATOR} - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/clang ${DEFAULT_CMAKE_FLAGS} ${CLANG_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/clang -) - -if(MSVC) - if(BUILD_MODE STREQUAL Release) - set(CLANG_HARVEST_COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/clang/ ${HARVEST_TARGET}/llvm/) - else() - set(CLANG_HARVEST_COMMAND - ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/clang/lib/ ${HARVEST_TARGET}/llvm/debug/lib/ - ) - endif() - ExternalProject_Add_Step(external_clang after_install - COMMAND ${CLANG_HARVEST_COMMAND} - DEPENDEES mkdir update patch download configure build install - ) -endif() - -add_dependencies( - external_clang - ll -) - -if(BUILD_CLANG_TOOLS) - # `external_clang_tools` is for downloading the source, not compiling it. - add_dependencies( - external_clang - external_clang_tools - ) -endif() - -# We currently do not build libxml2 on Windows. -if(NOT WIN32) - add_dependencies( - external_clang - external_xml2 - ) -endif() diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 388c8adb5dc..23d0dcbab7b 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -97,15 +97,15 @@ harvest(jemalloc/lib jemalloc/lib "*.a") harvest(jpg/include jpeg/include "*.h") harvest(jpg/lib jpeg/lib "libjpeg.a") harvest(lame/lib ffmpeg/lib "*.a") -harvest(clang/bin llvm/bin "clang-format") +harvest(llvm/bin llvm/bin "clang-format") if(BUILD_CLANG_TOOLS) - harvest(clang/bin llvm/bin "clang-tidy") - harvest(clang/share/clang llvm/share "run-clang-tidy.py") + harvest(llvm/bin llvm/bin "clang-tidy") + harvest(llvm/share/clang llvm/share "run-clang-tidy.py") endif() -harvest(clang/include llvm/include "*") harvest(llvm/include llvm/include "*") harvest(llvm/bin llvm/bin "llvm-config") harvest(llvm/lib llvm/lib "libLLVM*.a") +harvest(llvm/lib llvm/lib "libclang*.a") if(APPLE) harvest(openmp/lib openmp/lib "*") harvest(openmp/include openmp/include "*.h") @@ -158,7 +158,7 @@ harvest(xr_openxr_sdk/lib xr_openxr_sdk/lib "*.a") harvest(osl/bin osl/bin "oslc") harvest(osl/include osl/include "*.h") harvest(osl/lib osl/lib "*.a") -harvest(osl/shaders osl/shaders "*.h") +harvest(osl/share/OSL/shaders osl/share/OSL/shaders "*.h") harvest(png/include png/include "*.h") harvest(png/lib png/lib "*.a") harvest(pugixml/include pugixml/include "*.hpp") diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 440f6e5bace..58e3873097d 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -39,8 +39,8 @@ elseif(APPLE) endif() elseif(UNIX) set(ISPC_EXTRA_ARGS_UNIX - -DCMAKE_C_COMPILER=${LIBDIR}/clang/bin/clang - -DCMAKE_CXX_COMPILER=${LIBDIR}/clang/bin/clang++ + -DCMAKE_C_COMPILER=${LIBDIR}/llvm/bin/clang + -DCMAKE_CXX_COMPILER=${LIBDIR}/llvm/bin/clang++ -DARM_ENABLED=Off ) endif() @@ -51,11 +51,11 @@ set(ISPC_EXTRA_ARGS -DISPC_INCLUDE_TESTS=Off -DLLVM_ROOT=${LIBDIR}/llvm/lib/cmake/llvm -DLLVM_LIBRARY_DIR=${LIBDIR}/llvm/lib - -DCLANG_EXECUTABLE=${LIBDIR}/clang/bin/clang - -DCLANGPP_EXECUTABLE=${LIBDIR}/clang/bin/clang++ + -DCLANG_EXECUTABLE=${LIBDIR}/llvm/bin/clang + -DCLANGPP_EXECUTABLE=${LIBDIR}/llvm/bin/clang++ -DISPC_INCLUDE_TESTS=Off - -DCLANG_LIBRARY_DIR=${LIBDIR}/clang/lib - -DCLANG_INCLUDE_DIRS=${LIBDIR}/clang/include + -DCLANG_LIBRARY_DIR=${LIBDIR}/llvm/lib + -DCLANG_INCLUDE_DIRS=${LIBDIR}/llvm/include ${ISPC_EXTRA_ARGS_WIN} ${ISPC_EXTRA_ARGS_APPLE} ${ISPC_EXTRA_ARGS_UNIX} @@ -74,7 +74,6 @@ ExternalProject_Add(external_ispc add_dependencies( external_ispc ll - external_clang ) if(WIN32) diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index a4c7ccd9e27..da2f7364e4a 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -22,6 +22,15 @@ else() set(LLVM_TARGETS X86) endif() +if(APPLE) + set(LLVM_XML2_ARGS + -DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a + ) + set(LLVM_BUILD_CLANG_TOOLS_EXTRA ^^clang-tools-extra) + set(BUILD_CLANG_TOOLS ON) +endif() + + set(LLVM_EXTRA_ARGS -DLLVM_USE_CRT_RELEASE=MD -DLLVM_USE_CRT_DEBUG=MDd @@ -31,6 +40,8 @@ set(LLVM_EXTRA_ARGS -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_ENABLE_UNWIND_TABLES=OFF + -DLLVM_ENABLE_PROJECTS=clang${LLVM_BUILD_CLANG_TOOLS_EXTRA} + ${LLVM_XML2_ARGS} ) if(WIN32) @@ -45,7 +56,9 @@ ExternalProject_Add(ll DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH MD5=${LLVM_HASH} CMAKE_GENERATOR ${LLVM_GENERATOR} + LIST_SEPARATOR ^^ PREFIX ${BUILD_DIR}/ll + SOURCE_SUBDIR llvm PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ll/src/ll < ${PATCH_DIR}/llvm.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/llvm ${DEFAULT_CMAKE_FLAGS} ${LLVM_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/llvm @@ -65,3 +78,11 @@ if(MSVC) DEPENDEES mkdir update patch download configure build install ) endif() + +# We currently do not build libxml2 on Windows. +if(APPLE) + add_dependencies( + ll + external_xml2 + ) +endif() diff --git a/build_files/build_environment/cmake/openmp.cmake b/build_files/build_environment/cmake/openmp.cmake index ec0756a6693..92a96b4dd8b 100644 --- a/build_files/build_environment/cmake/openmp.cmake +++ b/build_files/build_environment/cmake/openmp.cmake @@ -30,5 +30,5 @@ ExternalProject_Add(external_openmp add_dependencies( external_openmp - external_clang + ll ) diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake index 118657461fe..78930182f2b 100644 --- a/build_files/build_environment/cmake/osl.cmake +++ b/build_files/build_environment/cmake/osl.cmake @@ -19,12 +19,7 @@ if(WIN32) set(OSL_CMAKE_CXX_STANDARD_LIBRARIES "kernel32${LIBEXT} user32${LIBEXT} gdi32${LIBEXT} winspool${LIBEXT} shell32${LIBEXT} ole32${LIBEXT} oleaut32${LIBEXT} uuid${LIBEXT} comdlg32${LIBEXT} advapi32${LIBEXT} psapi${LIBEXT}") set(OSL_FLEX_BISON -DFLEX_EXECUTABLE=${LIBDIR}/flexbison/win_flex.exe -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe) - set(OSL_OPENIMAGEIO_LIBRARY "${LIBDIR}/openimageio/lib/${LIBPREFIX}OpenImageIO${LIBEXT};${LIBDIR}/openimageio/lib/${LIBPREFIX}OpenImageIO_Util${LIBEXT};${LIBDIR}/png/lib/libpng16${LIBEXT};${LIBDIR}/jpg/lib/${LIBPREFIX}jpeg${LIBEXT};${LIBDIR}/tiff/lib/${LIBPREFIX}tiff${LIBEXT};${LIBDIR}/openexr/lib/${LIBPREFIX}IlmImf${OPENEXR_VERSION_POSTFIX}${LIBEXT}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") - set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=0) - else() - set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=sse2) - endif() + set(OSL_SIMD_FLAGS -DOIIO_NOSIMD=1 -DOIIO_SIMD=sse2) SET(OSL_PLATFORM_FLAGS -DLINKSTATIC=ON) else() set(OSL_CMAKE_CXX_STANDARD_LIBRARIES) @@ -34,7 +29,6 @@ else() endif() set(OSL_ILMBASE_CUSTOM_LIBRARIES "${LIBDIR}/openexr/lib/Imath${OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/Half{OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/IlmThread${OPENEXR_VERSION_POSTFIX}.lib^^${LIBDIR}/openexr/lib/Iex${OPENEXR_VERSION_POSTFIX}.lib") -set(OSL_LLVM_LIBRARY "${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAnalysis${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAsmParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMAsmPrinter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMBitReader${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMBitWriter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMCodeGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMCore${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMDebugInfo${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMExecutionEngine${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInstCombine${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInstrumentation${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMInterpreter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMJIT${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMLinker${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMC${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCDisassembler${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCJIT${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMMCParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMObject${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMRuntimeDyld${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMScalarOpts${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMSelectionDAG${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMSupport${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTableGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTarget${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMTransformUtils${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMVectorize${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86AsmParser${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86AsmPrinter${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86CodeGen${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Desc${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Disassembler${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Info${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMX86Utils${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMipa${LIBEXT};${LIBDIR}/llvm/lib/${LIBPREFIX}LLVMipo${LIBEXT}") set(OSL_EXTRA_ARGS -DBoost_COMPILER:STRING=${BOOST_COMPILER_STRING} @@ -45,13 +39,8 @@ set(OSL_EXTRA_ARGS -DBOOST_LIBRARYDIR=${LIBDIR}/boost/lib/ -DBoost_NO_SYSTEM_PATHS=ON -DBoost_NO_BOOST_CMAKE=ON - -DLLVM_DIRECTORY=${LIBDIR}/llvm - -DLLVM_INCLUDES=${LIBDIR}/llvm/include - -DLLVM_LIB_DIR=${LIBDIR}/llvm/lib - -DLLVM_VERSION=3.4 - -DLLVM_LIBRARY=${OSL_LLVM_LIBRARY} - -DOPENEXR_HOME=${LIBDIR}/openexr/ - -DILMBASE_HOME=${LIBDIR}/openexr/ + -DOpenEXR_ROOT=${LIBDIR}/openexr/ + -DIlmBase_ROOT=${LIBDIR}/openexr/ -DILMBASE_INCLUDE_DIR=${LIBDIR}/openexr/include/ -DOPENEXR_HALF_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Half${OPENEXR_VERSION_POSTFIX}${LIBEXT} -DOPENEXR_IMATH_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Imath${OPENEXR_VERSION_POSTFIX}${LIBEXT} @@ -59,37 +48,29 @@ set(OSL_EXTRA_ARGS -DOPENEXR_IEX_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}Iex${OPENEXR_VERSION_POSTFIX}${LIBEXT} -DOPENEXR_INCLUDE_DIR=${LIBDIR}/openexr/include/ -DOPENEXR_ILMIMF_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}IlmImf${OPENEXR_VERSION_POSTFIX}${LIBEXT} + -DOpenImageIO_ROOT=${LIBDIR}/openimageio/ -DOSL_BUILD_TESTS=OFF -DOSL_BUILD_MATERIALX=OFF -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ - -DOPENIMAGEIOHOME=${LIBDIR}/openimageio/ - -DOPENIMAGEIO_INCLUDE_DIR=${LIBDIR}/openimageio/include - -DOPENIMAGEIO_LIBRARY=${OSL_OPENIMAGEIO_LIBRARY} ${OSL_FLEX_BISON} -DCMAKE_CXX_STANDARD_LIBRARIES=${OSL_CMAKE_CXX_STANDARD_LIBRARIES} - -DBUILDSTATIC=ON + -DBUILD_SHARED_LIBS=OFF ${OSL_PLATFORM_FLAGS} - -DOSL_BUILD_PLUGINS=Off + -DOSL_BUILD_PLUGINS=OFF -DSTOP_ON_WARNING=OFF -DUSE_LLVM_BITCODE=OFF + -DLLVM_ROOT=${LIBDIR}/llvm/ + -DLLVM_DIRECTORY=${LIBDIR}/llvm/ -DUSE_PARTIO=OFF -DUSE_QT=OFF + -DUSE_Qt5=OFF -DINSTALL_DOCS=OFF ${OSL_SIMD_FLAGS} - -DPARTIO_LIBRARIES= - -DPUGIXML_HOME=${LIBDIR}/pugixml + -Dpugixml_ROOT=${LIBDIR}/pugixml + -DUSE_PYTHON=OFF ) -if(APPLE) - # Make symbol hiding consistent with OIIO which defaults to OFF, - # avoids linker warnings on macOS - set(OSL_EXTRA_ARGS - ${OSL_EXTRA_ARGS} - -DHIDE_SYMBOLS=OFF - ) -endif() - ExternalProject_Add(external_osl URL ${OSL_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} @@ -105,7 +86,6 @@ add_dependencies( external_osl external_boost ll - external_clang external_openexr external_zlib external_flexbison diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 9cf9d2330fd..5b9c709d04b 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -116,28 +116,16 @@ set(OPENCOLORIO_HASH 1a2e3478b6cd9a1549f24e1b2205e3f0) if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) # Newer version required by ISPC with arm support. set(LLVM_VERSION 11.0.1) - set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.tar.xz) set(LLVM_HASH 6ec7ae9fd43da9b87cda15b3ab9cc7af) - set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) - set(CLANG_HASH b4cb0b74b1f3292a89c9720f3e1e2934) - - set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) - set(CLANG_TOOLS_HASH 1e577a85948a0f07483b7c405e59a0ca) - set(OPENMP_VERSION 9.0.1) set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${OPENMP_VERSION}/openmp-${OPENMP_VERSION}.src.tar.xz) set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) else() set(LLVM_VERSION 9.0.1) - set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz) - set(LLVM_HASH 31eb9ce73dd2a0f8dcab8319fb03f8fc) - - set(CLANG_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz) - set(CLANG_HASH 13468e4a44940efef1b75e8641752f90) - - set(CLANG_TOOLS_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz) - set(CLANG_TOOLS_HASH c76293870b564c6a7968622b475b7646) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.tar.xz) + set(LLVM_HASH b4268e733dfe352960140dc07ef2efcb) set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/openmp-${LLVM_VERSION}.src.tar.xz) set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) @@ -151,9 +139,9 @@ set(TIFF_VERSION 4.1.0) set(TIFF_URI http://download.osgeo.org/libtiff/tiff-${TIFF_VERSION}.tar.gz) set(TIFF_HASH 2165e7aba557463acc0664e71a3ed424) -set(OSL_VERSION 1.10.10) +set(OSL_VERSION 1.11.10.0) set(OSL_URI https://github.com/imageworks/OpenShadingLanguage/archive/Release-${OSL_VERSION}.tar.gz) -set(OSL_HASH 00dec08a93c8084e53848b9ad047889f) +set(OSL_HASH dfdc23597aeef083832cbada62211756) set(PYTHON_VERSION 3.9.1) set(PYTHON_SHORT_VERSION 3.9) diff --git a/build_files/build_environment/patches/llvm.diff b/build_files/build_environment/patches/llvm.diff index b797bb030ee..5f89816292b 100644 --- a/build_files/build_environment/patches/llvm.diff +++ b/build_files/build_environment/patches/llvm.diff @@ -1,5 +1,5 @@ ---- a/lib/Support/Unix/Path.inc 2020-02-17 09:24:26.000000000 +0100 -+++ b/lib/Support/Unix/Path.inc 2020-02-17 09:26:25.000000000 +0100 +--- a/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:24:26.000000000 +0100 ++++ b/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:26:25.000000000 +0100 @@ -1200,7 +1200,9 @@ /// implementation. std::error_code copy_file(const Twine &From, const Twine &To) { diff --git a/build_files/build_environment/patches/osl.diff b/build_files/build_environment/patches/osl.diff index 989800174e2..badb6c0d9b3 100644 --- a/build_files/build_environment/patches/osl.diff +++ b/build_files/build_environment/patches/osl.diff @@ -43,27 +43,23 @@ diff -Naur OpenShadingLanguage-Release-1.9.9/src/liboslexec/llvm_util.cpp extern - +void LLVM_Util::Cleanup () +{ -+ jitmm_hold.clear(); ++ if(jitmm_hold) jitmm_hold->clear(); +} size_t LLVM_Util::total_jit_memory_held () -diff -Naur OpenShadingLanguage-Release-1.9.9/CMakeLists.txt external_osl/CMakeLists.txt - --- orig/CMakeLists.txt 2020-01-27 16:22:31 -0700 -+++ external_osl/CMakeLists.txt 2020-05-13 18:04:52 -0600 -@@ -102,10 +102,11 @@ - set (OPTIX_EXTRA_LIBS CACHE STRING "Extra lib targets needed for OptiX") - set (CUDA_TARGET_ARCH "sm_35" CACHE STRING "CUDA GPU architecture (e.g. sm_35)") - --# set (USE_OIIO_STATIC ON CACHE BOOL "If OIIO is built static") --# if (USE_OIIO_STATIC) --# add_definitions ("-DOIIO_STATIC_BUILD=1") --# endif () +diff -Naur org/CMakeLists.txt external_osl/CMakeLists.txt +--- org/CMakeLists.txt 2020-12-01 12:37:15 -0700 ++++ external_osl/CMakeLists.txt 2021-01-20 13:26:50 -0700 +@@ -84,6 +84,11 @@ + CACHE STRING "Directory where OptiX PTX files will be installed") + set (CMAKE_DEBUG_POSTFIX "" CACHE STRING "Library naming postfix for Debug builds (e.g., '_debug')") + +set (USE_OIIO_STATIC ON CACHE BOOL "If OIIO is built static") +if (USE_OIIO_STATIC) + add_definitions ("-DOIIO_STATIC_BUILD=1") + add_definitions ("-DOIIO_STATIC_DEFINE=1") +endif () - + set (OSL_NO_DEFAULT_TEXTURESYSTEM OFF CACHE BOOL "Do not use create a raw OIIO::TextureSystem") - if (OSL_NO_DEFAULT_TEXTURESYSTEM) \ No newline at end of file + if (OSL_NO_DEFAULT_TEXTURESYSTEM) diff --git a/build_files/build_environment/windows/build_deps.cmd b/build_files/build_environment/windows/build_deps.cmd index ea8bfdaa3d2..2552b74711f 100644 --- a/build_files/build_environment/windows/build_deps.cmd +++ b/build_files/build_environment/windows/build_deps.cmd @@ -117,7 +117,7 @@ set path=%BUILD_DIR%\downloads\mingw\mingw64\msys\1.0\bin\;%BUILD_DIR%\downloads mkdir %STAGING%\%BuildDir%%ARCH%R cd %Staging%\%BuildDir%%ARCH%R echo %DATE% %TIME% : Start > %StatusFile% -cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ +cmake -G "%CMAKE_BUILDER%" -Thost=x64 %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ echo %DATE% %TIME% : Release Configuration done >> %StatusFile% if "%dobuild%" == "1" ( msbuild /m "ll.vcxproj" /p:Configuration=Release /fl /flp:logfile=BlenderDeps_llvm.log;Verbosity=normal @@ -130,7 +130,7 @@ if "%NODEBUG%" == "1" goto exit cd %BUILD_DIR% mkdir %STAGING%\%BuildDir%%ARCH%D cd %Staging%\%BuildDir%%ARCH%D -cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DCMAKE_BUILD_TYPE=Debug -DBUILD_MODE=Debug -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ %CMAKE_DEBUG_OPTIONS% +cmake -G "%CMAKE_BUILDER%" -Thost=x64 %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DCMAKE_BUILD_TYPE=Debug -DBUILD_MODE=Debug -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ %CMAKE_DEBUG_OPTIONS% echo %DATE% %TIME% : Debug Configuration done >> %StatusFile% if "%dobuild%" == "1" ( msbuild /m "ll.vcxproj" /p:Configuration=Debug /fl /flp:logfile=BlenderDeps_llvm.log;;Verbosity=normal diff --git a/build_files/cmake/Modules/FindClang.cmake b/build_files/cmake/Modules/FindClang.cmake new file mode 100644 index 00000000000..b5c2cfbc28d --- /dev/null +++ b/build_files/cmake/Modules/FindClang.cmake @@ -0,0 +1,111 @@ +# - Find Clang library +# Find the native Clang includes and library +# This module defines +# CLANG_INCLUDE_DIRS, where to find AST/AST.h, Set when +# CLANG_INCLUDE_DIR is found. +# CLANG_LIBRARIES, libraries to link against to use Clang. +# CLANG_ROOT_DIR, The base directory to search for Clang. +# This can also be an environment variable. +# CLANG_FOUND, If false, do not try to use Clang. + +#============================================================================= +# Copyright 2021 Blender Foundation. +# +# Distributed under the OSI-approved BSD 3-Clause License, +# see accompanying file BSD-3-Clause-license.txt for details. +#============================================================================= + +# If CLANG_ROOT_DIR was defined in the environment, use it. +if(NOT CLANG_ROOT_DIR AND NOT $ENV{CLANG_ROOT_DIR} STREQUAL "") + set(CLANG_ROOT_DIR $ENV{CLANG_ROOT_DIR}) +endif() + +set(_CLANG_SEARCH_DIRS + ${CLANG_ROOT_DIR} + /opt/lib/clang +) + +find_path(CLANG_INCLUDE_DIR + NAMES + AST/AST.h + HINTS + ${_CLANG_SEARCH_DIRS} + PATH_SUFFIXES + include + include/clang +) + + +set(_CLANG_FIND_COMPONENTS + clangDependencyScanning + clangDynamicASTMatchers + clangFrontendTool + clangStaticAnalyzerFrontend + clangHandleCXX + clangStaticAnalyzerCheckers + clangStaticAnalyzerCore + clangToolingASTDiff + clangToolingRefactoring + clangToolingSyntax + clangARCMigrate + clangCodeGen + clangCrossTU + clangIndex + clangTooling + clangFormat + clangToolingInclusions + clangRewriteFrontend + clangFrontend + clangSerialization + clangDriver + clangToolingCore + clangParse + clangRewrite + clangSema + clangEdit + clangAnalysis + clangASTMatchers + clangAST + clangLex + clangBasic +) + +set(_CLANG_LIBRARIES) +foreach(COMPONENT ${_CLANG_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + + find_library(CLANG_${UPPERCOMPONENT}_LIBRARY + NAMES + ${COMPONENT} + HINTS + ${_CLANG_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + list(APPEND _CLANG_LIBRARIES "${CLANG_${UPPERCOMPONENT}_LIBRARY}") +endforeach() + + +# Handle the QUIETLY and REQUIRED arguments and set CLANG_FOUND to TRUE if +# all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Clang DEFAULT_MSG + _CLANG_LIBRARIES CLANG_INCLUDE_DIR) + +if(CLANG_FOUND) + set(CLANG_LIBRARIES ${_CLANG_LIBRARIES}) + set(CLANG_INCLUDE_DIRS ${CLANG_INCLUDE_DIR}) +endif() + +mark_as_advanced( + CLANG_INCLUDE_DIR +) + +foreach(COMPONENT ${_CLANG_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + mark_as_advanced(CLANG_${UPPERCOMPONENT}_LIBRARY) +endforeach() + +unset(_CLANG_SEARCH_DIRS) +unset(_CLANG_FIND_COMPONENTS) +unset(_CLANG_LIBRARIES) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index e7b0097a137..31302bf1100 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -333,6 +333,13 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) message(FATAL_ERROR "LLVM not found.") endif() + if(WITH_CLANG) + find_package(Clang) + if(NOT CLANG_FOUND) + message(FATAL_ERROR "Clang not found.") + endif() + endif() + endif() if(WITH_CYCLES_OSL) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 5d3f074bdda..ef73ef40ac3 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -70,6 +70,7 @@ if(EXISTS ${LIBDIR}) set(BOOST_LIBRARYDIR ${LIBDIR}/boost/lib) set(Boost_NO_SYSTEM_PATHS ON) set(OPENEXR_ROOT_DIR ${LIBDIR}/openexr) + set(CLANG_ROOT_DIR ${LIBDIR}/llvm) endif() if(WITH_STATIC_LIBS) @@ -420,7 +421,9 @@ if(WITH_LLVM) endif() find_package_wrapper(LLVM) - + if(WITH_CLANG) + find_package_wrapper(Clang) + endif() # Symbol conflicts with same UTF library used by OpenCollada if(EXISTS ${LIBDIR}) if(WITH_OPENCOLLADA AND (${LLVM_VERSION} VERSION_LESS "4.0.0")) @@ -430,7 +433,13 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) set(WITH_LLVM OFF) + set(WITH_CLANG OFF) message(STATUS "LLVM not found") + else() + if(NOT CLANG_FOUND) + set(WITH_CLANG OFF) + message(STATUS "Clang not found") + endif() endif() endif() diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index e739e8ee5a2..e1cc1219249 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -672,6 +672,10 @@ endif() if(WITH_CYCLES_OSL) set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation") set(OSL_SHADER_DIR ${CYCLES_OSL}/shaders) + # Shaders have moved around a bit between OSL versions, check multiple locations + if(NOT EXISTS "${OSL_SHADER_DIR}") + set(OSL_SHADER_DIR ${CYCLES_OSL}/share/OSL/shaders) + endif() find_library(OSL_LIB_EXEC NAMES oslexec PATHS ${CYCLES_OSL}/lib) find_library(OSL_LIB_COMP NAMES oslcomp PATHS ${CYCLES_OSL}/lib) find_library(OSL_LIB_QUERY NAMES oslquery PATHS ${CYCLES_OSL}/lib) diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index cdd3b24be86..6cdc7367fbb 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -44,6 +44,7 @@ set(LIB ${OSL_LIBRARIES} ${OPENIMAGEIO_LIBRARIES} ${PUGIXML_LIBRARIES} + ${CLANG_LIBRARIES} ${LLVM_LIBRARY} ) diff --git a/source/creator/blender.map b/source/creator/blender.map index 5171e94382d..9aafddd9666 100644 --- a/source/creator/blender.map +++ b/source/creator/blender.map @@ -16,6 +16,7 @@ local: *boost*; *ceres*; *cineon*; + *clang*; *COLLADA*; cu*; *default_error_condition*; diff --git a/source/creator/osx_locals.map b/source/creator/osx_locals.map index 86cd32791dd..5619f151bd2 100644 --- a/source/creator/osx_locals.map +++ b/source/creator/osx_locals.map @@ -7,6 +7,7 @@ blosc* *boost* *ceres* *cineon* +*clang* *COLLADA* cu* decodeInstruction From 79f34447d649a0fc680e3ebf95fa730981831668 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 24 Feb 2021 15:17:29 +0100 Subject: [PATCH 436/519] Cleanup: CryptomatteLayer structure. Current implementation was to restricting for future enhancements where the CryptomatterLayer could be read from existing metadata. --- source/blender/blenkernel/BKE_cryptomatte.h | 1 - .../blender/blenkernel/intern/cryptomatte.cc | 84 +++++++------------ .../draw/engines/eevee/eevee_cryptomatte.c | 6 -- .../draw/engines/eevee/eevee_private.h | 1 - .../draw/engines/eevee/eevee_renderpasses.c | 4 - 5 files changed, 32 insertions(+), 64 deletions(-) diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h index 2b5a6a2044b..4b62c795a5a 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.h +++ b/source/blender/blenkernel/BKE_cryptomatte.h @@ -38,7 +38,6 @@ struct Object; struct RenderResult; struct CryptomatteSession *BKE_cryptomatte_init(void); -void BKE_cryptomatte_finish(struct CryptomatteSession *session); void BKE_cryptomatte_free(struct CryptomatteSession *session); uint32_t BKE_cryptomatte_hash(const char *name, int name_len); diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index db83547fe36..d2a3f6eebbe 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -35,7 +35,7 @@ #include "BLI_dynstr.h" #include "BLI_hash_mm3.h" #include "BLI_listbase.h" -#include "BLI_set.hh" +#include "BLI_map.hh" #include "BLI_string.h" #include "MEM_guardedalloc.h" @@ -47,54 +47,47 @@ #include #include -enum class CryptomatteLayerState { - EMPTY, - FILLED, - CLOSED, -}; - struct CryptomatteLayer { - CryptomatteLayerState state = CryptomatteLayerState::EMPTY; - blender::Set names; - std::stringstream manifest; + blender::Map hashes; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") #endif - - void add_hash(std::string name, uint32_t cryptomatte_hash) + std::string encode_hash(uint32_t cryptomatte_hash) { - BLI_assert(state != CryptomatteLayerState::CLOSED); - const bool first_item = names.is_empty(); - if (!names.add(name)) { - return; - } - - if (first_item) { - state = CryptomatteLayerState::FILLED; - manifest << "{"; - } - else { - manifest << ","; - } - manifest << quoted(name) << ":\""; - manifest << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex - << cryptomatte_hash; - manifest << "\""; + std::stringstream encoded; + encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex + << cryptomatte_hash; + return encoded.str(); } - void close_manifest() + void add_hash(blender::StringRef name, uint32_t cryptomatte_hash) { - BLI_assert(state != CryptomatteLayerState::CLOSED); - if (state == CryptomatteLayerState::FILLED) { - manifest << "}"; - } - state = CryptomatteLayerState::CLOSED; + hashes.add_overwrite(name, encode_hash(cryptomatte_hash)); } - std::string manifest_get_string() + void add_encoded_hash(blender::StringRef name, std::string &cryptomatte_encoded_hash) { - BLI_assert(state == CryptomatteLayerState::CLOSED); + hashes.add_overwrite(name, cryptomatte_encoded_hash); + } + + std::string manifest() + { + std::stringstream manifest; + + bool is_first = true; + const blender::Map &const_map = hashes; + manifest << "{"; + for (blender::Map::Item item : const_map.items()) { + if (is_first) { + is_first = false; + } + else { + manifest << ","; + } + manifest << quoted(item.key) << ":\"" << item.value << "\""; + } + manifest << "}"; return manifest.str(); } }; @@ -107,13 +100,6 @@ struct CryptomatteSession { #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteSession") #endif - - void finish() - { - objects.close_manifest(); - materials.close_manifest(); - assets.close_manifest(); - } }; CryptomatteSession *BKE_cryptomatte_init(void) @@ -122,12 +108,6 @@ CryptomatteSession *BKE_cryptomatte_init(void) return session; } -void BKE_cryptomatte_finish(CryptomatteSession *session) -{ - BLI_assert(session != nullptr); - session->finish(); -} - void BKE_cryptomatte_free(CryptomatteSession *session) { BLI_assert(session != nullptr); @@ -147,7 +127,7 @@ static uint32_t cryptomatte_hash(CryptomatteLayer *layer, const ID *id) uint32_t cryptohash_int = BKE_cryptomatte_hash(name, name_len); if (layer != nullptr) { - layer->add_hash(std::string(name, name_len), cryptohash_int); + layer->add_hash(blender::StringRef(name, name_len), cryptohash_int); } return cryptohash_int; @@ -336,7 +316,7 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, break; } - const std::string manifest = layer->manifest_get_string(); + const std::string manifest = layer->manifest(); const std::string name = cryptomatte_determine_name(view_layer, cryptomatte_layer_name); /* Store the meta data into the render result. */ diff --git a/source/blender/draw/engines/eevee/eevee_cryptomatte.c b/source/blender/draw/engines/eevee/eevee_cryptomatte.c index 13a3f1766a9..c95279fc078 100644 --- a/source/blender/draw/engines/eevee/eevee_cryptomatte.c +++ b/source/blender/draw/engines/eevee/eevee_cryptomatte.c @@ -321,12 +321,6 @@ void EEVEE_cryptomatte_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *s } } -void EEVEE_cryptomatte_cache_finish(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) -{ - EEVEE_PrivateData *g_data = vedata->stl->g_data; - BKE_cryptomatte_finish(g_data->cryptomatte_session); -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 5a93853900e..4e32854dedc 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -1341,7 +1341,6 @@ void EEVEE_cryptomatte_output_init(EEVEE_ViewLayerData *sldata, int tot_samples); void EEVEE_cryptomatte_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_cryptomatte_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob); -void EEVEE_cryptomatte_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_cryptomatte_particle_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob); diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c index c759e426875..0e16037f42d 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.c +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c @@ -255,10 +255,6 @@ void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve else { psl->renderpass_pass = NULL; } - - if ((g_data->render_passes & (EEVEE_RENDER_PASS_CRYPTOMATTE)) != 0) { - EEVEE_cryptomatte_cache_finish(sldata, vedata); - } } /* Post-process data to construct a specific render-pass From bb3e54d8beaf5c02056c1cc314c1c58256bcaa21 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 24 Feb 2021 15:25:42 +0100 Subject: [PATCH 437/519] Cleanup: Cryptomatte Use StringRef(Null). --- source/blender/blenkernel/intern/cryptomatte.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index d2a3f6eebbe..e5f4eed35d3 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -66,7 +66,7 @@ struct CryptomatteLayer { hashes.add_overwrite(name, encode_hash(cryptomatte_hash)); } - void add_encoded_hash(blender::StringRef name, std::string &cryptomatte_encoded_hash) + void add_encoded_hash(blender::StringRef name, blender::StringRefNull cryptomatte_encoded_hash) { hashes.add_overwrite(name, cryptomatte_encoded_hash); } @@ -269,7 +269,7 @@ void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, } static std::string cryptomatte_determine_name(const ViewLayer *view_layer, - const std::string cryptomatte_layer_name) + const blender::StringRefNull cryptomatte_layer_name) { std::stringstream stream; const size_t view_layer_name_len = BLI_strnlen(view_layer->name, sizeof(view_layer->name)); @@ -277,9 +277,9 @@ static std::string cryptomatte_determine_name(const ViewLayer *view_layer, return stream.str(); } -static uint32_t cryptomatte_determine_identifier(const std::string name) +static uint32_t cryptomatte_determine_identifier(const blender::StringRef name) { - return BLI_hash_mm3(reinterpret_cast(name.c_str()), name.length(), 0); + return BLI_hash_mm3(reinterpret_cast(name.data()), name.size(), 0); } static void add_render_result_meta_data(RenderResult *render_result, From 9243d286f4a3cb6c6e5ecc6018353bb351b3a2ca Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 24 Feb 2021 15:30:29 +0100 Subject: [PATCH 438/519] Cleanup: CryptomatteLayer Missing code flow. --- source/blender/blenkernel/intern/cryptomatte.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index e5f4eed35d3..628c8c6e86a 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -63,7 +63,7 @@ struct CryptomatteLayer { void add_hash(blender::StringRef name, uint32_t cryptomatte_hash) { - hashes.add_overwrite(name, encode_hash(cryptomatte_hash)); + add_encoded_hash(name, encode_hash(cryptomatte_hash)); } void add_encoded_hash(blender::StringRef name, blender::StringRefNull cryptomatte_encoded_hash) From 7bbf27891cecb6156de7b65ad4273af24bc21835 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 24 Feb 2021 15:31:58 +0100 Subject: [PATCH 439/519] GPencil: Improve Interpolate AutoFlip algorithm II Improved the calculation of the distances and changed the variable names to make it more readable. Still, there are some corner cases that could be not handled properly, but we keep as is to test more real drawings to analyze if the small number of corner cases needs to be fixed or not. --- .../editors/gpencil/gpencil_interpolate.c | 59 ++++++++++++++----- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 9045cc8cfda..4fdae7f9c53 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -177,44 +177,71 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, /* calculate parent matrix */ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat); bGPDspoint *pt, pt_dummy_ps; - float v1a[2], v1b[2], v2a[2], v2b[2]; + float v_from_start[2], v_to_start[2], v_from_end[2], v_to_end[2]; /* Line from start of strokes. */ pt = &gps_from->points[0]; gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); - gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1a[0], &v1a[1]); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_from_start[0], &v_from_start[1]); pt = &gps_to->points[0]; gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); - gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v1b[0], &v1b[1]); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_to_start[0], &v_to_start[1]); /* Line from end of strokes. */ pt = &gps_from->points[gps_from->totpoints - 1]; gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); - gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2a[0], &v2a[1]); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_from_end[0], &v_from_end[1]); pt = &gps_to->points[gps_to->totpoints - 1]; gpencil_point_to_parent_space(pt, diff_mat, &pt_dummy_ps); - gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v2b[0], &v2b[1]); + gpencil_point_to_xy_fl(gsc, gps_from, &pt_dummy_ps, &v_to_end[0], &v_to_end[1]); - if (isect_seg_seg_v2(v1a, v1b, v2a, v2b) == ISECT_LINE_LINE_CROSS) { - float v1[2], v2[2]; - sub_v2_v2v2(v1, v1b, v1a); - sub_v2_v2v2(v2, v2b, v2a); - float angle = angle_v2v2(v1, v2); + const bool isect_lines = (isect_seg_seg_v2(v_from_start, v_to_start, v_from_end, v_to_end) == + ISECT_LINE_LINE_CROSS); + + /* If the vectors intersect or are almost parallel. */ + if (isect_lines) { /* For very sharp angles, check distance between extremes. */ + float v1[2], v2[2]; + sub_v2_v2v2(v1, v_to_start, v_from_start); + sub_v2_v2v2(v2, v_to_end, v_from_end); + float angle = angle_v2v2(v1, v2); if (angle < DEG2RADF(15.0f)) { - float dist_start = len_squared_v2v2(v1a, v2a); - float dist_end = len_squared_v2v2(v1a, v2b); - if (dist_end < dist_start) { - return true; + /* Check the original stroke orientation using a point of destination stroke + * `(S)<--??-->(E) <--->`. */ + float dist_start = len_squared_v2v2(v_from_start, v_to_start); + float dist_end = len_squared_v2v2(v_from_end, v_to_start); + /* Oriented with end nearer of destination stroke. + * `(S)--->(E) <--->` */ + if (dist_start >= dist_end) { + dist_start = len_squared_v2v2(v_from_end, v_to_start); + dist_end = len_squared_v2v2(v_from_end, v_to_end); + /* `(S)--->(E) (E)<---(S)` */ + return (dist_start >= dist_end); + } + else { + /* Oriented inversed with original stroke start near of destination stroke. + * `(E)<----(S) <--->` */ + dist_start = len_squared_v2v2(v_from_start, v_to_start); + dist_end = len_squared_v2v2(v_from_start, v_to_end); + /* `(E)<---(S) (S)--->(E)` */ + return (dist_start < dist_end); } - return false; } return true; } - + else { + /* Check that both vectors have the same direction. */ + float v1[2], v2[2]; + sub_v2_v2v2(v1, v_from_end, v_from_start); + sub_v2_v2v2(v2, v_to_end, v_to_start); + if (((v1[0] > 0.0f && v2[0] < 0.0f) || (v1[0] < 0.0f && v2[0] > 0.0f)) && + ((v1[1] > 0.0f && v2[1] < 0.0f) || (v1[1] < 0.0f && v2[1] > 0.0f))) { + return true; + } + } return false; } From 6b6469a2e552e1454cb09987d931cc5e72a99fdf Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 24 Feb 2021 15:47:11 +0100 Subject: [PATCH 440/519] Cleanup: Fix comment --- source/blender/editors/gpencil/gpencil_interpolate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index 4fdae7f9c53..ff5ce7101f1 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -200,9 +200,9 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, const bool isect_lines = (isect_seg_seg_v2(v_from_start, v_to_start, v_from_end, v_to_end) == ISECT_LINE_LINE_CROSS); - /* If the vectors intersect or are almost parallel. */ + /* If the vectors intersect. */ if (isect_lines) { - /* For very sharp angles, check distance between extremes. */ + /* For sharp angles, check distance between extremes. */ float v1[2], v2[2]; sub_v2_v2v2(v1, v_to_start, v_from_start); sub_v2_v2v2(v2, v_to_end, v_from_end); From 7972785d7b90771f50534fe3e1101d8adb615fa3 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 24 Feb 2021 11:57:29 -0300 Subject: [PATCH 441/519] PyAPI: Fix memory leak of parameters used for python 'draw_callbacks' When closing the blender, while the callbacks are removed, the reference count of the object used as `customdata` is not decremented. This commit adds two functions that correctly release the python `draw_callbacks` before releasing all `draw_callbacks`. Differential Revision: https://developer.blender.org/D10478 --- source/blender/blenkernel/intern/screen.c | 7 ++ source/blender/editors/include/ED_space_api.h | 3 + source/blender/editors/space_api/spacetypes.c | 16 +++++ source/blender/python/BPY_extern.h | 6 ++ .../blender/python/intern/bpy_rna_callback.c | 67 +++++++++++++++---- source/blender/windowmanager/WM_api.h | 3 + source/blender/windowmanager/intern/wm.c | 3 + .../windowmanager/intern/wm_operators.c | 16 +++++ 8 files changed, 107 insertions(+), 14 deletions(-) diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 80a83aecea8..df239b0c4ee 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -65,6 +65,10 @@ #include "BLO_read_write.h" +#ifdef WITH_PYTHON +# include "BPY_extern.h" +#endif + static void screen_free_data(ID *id) { bScreen *screen = (bScreen *)id; @@ -328,6 +332,9 @@ static ListBase spacetypes = {NULL, NULL}; static void spacetype_free(SpaceType *st) { LISTBASE_FOREACH (ARegionType *, art, &st->regiontypes) { +#ifdef WITH_PYTHON + BPY_callback_screen_free(art); +#endif BLI_freelistN(&art->drawcalls); LISTBASE_FOREACH (PanelType *, pt, &art->paneltypes) { diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h index 47c2d4f790c..c50bbc2f1e9 100644 --- a/source/blender/editors/include/ED_space_api.h +++ b/source/blender/editors/include/ED_space_api.h @@ -73,6 +73,9 @@ void *ED_region_draw_cb_activate(struct ARegionType *art, int type); void ED_region_draw_cb_draw(const struct bContext *, struct ARegion *, int); void ED_region_draw_cb_exit(struct ARegionType *, void *); +void ED_region_draw_cb_remove_by_type(struct ARegionType *art, + void *draw_fn, + void (*free)(void *)); /* generic callbacks */ /* ed_util.c */ void ED_region_draw_mouse_line_cb(const struct bContext *C, diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 817760615df..c112c678a09 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -272,6 +272,22 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *region, int type) } } +void ED_region_draw_cb_remove_by_type(ARegionType *art, void *draw_fn, void (*free)(void *)) +{ + RegionDrawCB *rdc = art->drawcalls.first; + while (rdc) { + RegionDrawCB *rdc_next = rdc->next; + if (rdc->draw == draw_fn) { + if (free) { + free(rdc->customdata); + } + BLI_remlink(&art->drawcalls, rdc); + MEM_freeN(rdc); + } + rdc = rdc_next; + } +} + /* ********************* space template *********************** */ /* forward declare */ void ED_spacetype_xxx(void); diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 366d801a888..90f54c50a6d 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -21,6 +21,7 @@ #pragma once struct AnimationEvalContext; +struct ARegionType; struct ChannelDriver; /* DNA_anim_types.h */ struct ID; /* DNA_ID.h */ struct ListBase; /* DNA_listBase.h */ @@ -33,6 +34,7 @@ struct bConstraintTarget; /* DNA_constraint_types.h*/ struct bContext; struct bContextDataResult; struct bPythonConstraint; /* DNA_constraint_types.h */ +struct wmWindowManager; #include "BLI_utildefines.h" @@ -100,6 +102,10 @@ void BPY_id_release(struct ID *id); bool BPY_string_is_keyword(const char *str); +/* bpy_rna_callback.c */ +void BPY_callback_screen_free(struct ARegionType *art); +void BPY_callback_wm_free(struct wmWindowManager *wm); + /* I18n for addons */ #ifdef WITH_INTERNATIONAL const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid); diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index 2f8be0c44e0..fdd3cb363ea 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -23,28 +23,24 @@ #include -#include "RNA_types.h" +#include "../generic/python_utildefines.h" -#include "BLI_utildefines.h" - -#include "bpy_capi_utils.h" -#include "bpy_rna.h" -#include "bpy_rna_callback.h" - -#include "DNA_screen_types.h" #include "DNA_space_types.h" #include "RNA_access.h" #include "RNA_enum_types.h" -#include "BKE_context.h" #include "BKE_screen.h" #include "WM_api.h" #include "ED_space_api.h" -#include "../generic/python_utildefines.h" +#include "BPY_extern.h" /* For public API. */ + +#include "bpy_capi_utils.h" +#include "bpy_rna.h" +#include "bpy_rna_callback.h" /* Own include. */ /* Use this to stop other capsules from being mis-used. */ static const char *rna_capsual_id = "RNA_HANDLE"; @@ -261,6 +257,12 @@ static eSpace_Type rna_Space_refine_reverse(StructRNA *srna) return SPACE_EMPTY; } +static void cb_rna_capsule_destructor(PyObject *capsule) +{ + PyObject *args = PyCapsule_GetContext(capsule); + Py_DECREF(args); +} + PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args) { void *handle; @@ -378,10 +380,14 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args) return NULL; } + /* Keep the 'args' reference as long as the callback exists. + * This reference is decremented in #BPY_callback_screen_free and #BPY_callback_wm_free. */ + Py_INCREF(args); + PyObject *ret = PyCapsule_New((void *)handle, rna_capsual_id, NULL); - /* Store 'args' in context as well as the handler custom-data, - * because the handle may be freed by Blender (new file, new window... etc) */ + /* Store 'args' in context as well for simple access. */ + PyCapsule_SetDestructor(ret, cb_rna_capsule_destructor); PyCapsule_SetContext(ret, args); Py_INCREF(args); @@ -412,7 +418,6 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar "callback_remove(handler): NULL handler given, invalid or already removed"); return NULL; } - PyObject *handle_args = PyCapsule_GetContext(py_handle); if (srna == &RNA_WindowManager) { if (!PyArg_ParseTuple( @@ -466,11 +471,45 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar return NULL; } + /* The handle has been removed, so decrement its customdata. */ + PyObject *handle_args = PyCapsule_GetContext(py_handle); + Py_DECREF(handle_args); + /* don't allow reuse */ if (capsule_clear) { - Py_DECREF(handle_args); + PyCapsule_Destructor destructor_fn = PyCapsule_GetDestructor(py_handle); + if (destructor_fn) { + destructor_fn(py_handle); + PyCapsule_SetDestructor(py_handle, NULL); + } PyCapsule_SetName(py_handle, rna_capsual_id_invalid); } Py_RETURN_NONE; } + +/* -------------------------------------------------------------------- */ +/** \name Public API + * \{ */ + +static void cb_customdata_free(void *customdata) +{ + PyObject *tuple = customdata; + Py_DECREF(tuple); +} + +void BPY_callback_screen_free(struct ARegionType *art) +{ + PyGILState_STATE gilstate = PyGILState_Ensure(); + ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); + PyGILState_Release(gilstate); +} + +void BPY_callback_wm_free(struct wmWindowManager *wm) +{ + PyGILState_STATE gilstate = PyGILState_Ensure(); + WM_paint_cursor_remove_by_type(wm, cb_wm_cursor_draw, cb_customdata_free); + PyGILState_Release(gilstate); +} + +/** \} */ diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 9eb4dd832cb..545371f4540 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -227,6 +227,9 @@ struct wmPaintCursor *WM_paint_cursor_activate( void *customdata); bool WM_paint_cursor_end(struct wmPaintCursor *handle); +void WM_paint_cursor_remove_by_type(struct wmWindowManager *wm, + void *draw_fn, + void (*free)(void *)); void WM_paint_cursor_tag_redraw(struct wmWindow *win, struct ARegion *region); void WM_cursor_warp(struct wmWindow *win, int x, int y); diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 549b59e9e1d..b43357b1462 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -595,6 +595,9 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) WM_msgbus_destroy(wm->message_bus); } +#ifdef WITH_PYTHON + BPY_callback_wm_free(wm); +#endif BLI_freelistN(&wm->paintcursors); WM_drag_free_list(&wm->drags); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 297575e8dff..bab8359472f 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2056,6 +2056,22 @@ bool WM_paint_cursor_end(wmPaintCursor *handle) return false; } +void WM_paint_cursor_remove_by_type(wmWindowManager *wm, void *draw_fn, void (*free)(void *)) +{ + wmPaintCursor *pc = wm->paintcursors.first; + while (pc) { + wmPaintCursor *pc_next = pc->next; + if (pc->draw == draw_fn) { + if (free) { + free(pc->customdata); + } + BLI_remlink(&wm->paintcursors, pc); + MEM_freeN(pc); + } + pc = pc_next; + } +} + /** \} */ /* -------------------------------------------------------------------- */ From c0b2c75c441db711ea27f23b0539371eeb159649 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 24 Feb 2021 15:59:44 +0100 Subject: [PATCH 442/519] Geometry Nodes: store available attribute names in node ui storage This information will be used by the attribute search in string sockets. Ref T85657. Differential Revision: https://developer.blender.org/D10462 --- .../blender/blenkernel/BKE_node_ui_storage.hh | 7 +++++ .../blenkernel/intern/node_ui_storage.cc | 9 ++++++ source/blender/modifiers/intern/MOD_nodes.cc | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh index 951c3bdc62d..231eb11d473 100644 --- a/source/blender/blenkernel/BKE_node_ui_storage.hh +++ b/source/blender/blenkernel/BKE_node_ui_storage.hh @@ -19,6 +19,7 @@ #include "BLI_hash.hh" #include "BLI_map.hh" #include "BLI_session_uuid.h" +#include "BLI_set.hh" #include "DNA_ID.h" #include "DNA_modifier_types.h" @@ -76,6 +77,7 @@ struct NodeWarning { struct NodeUIStorage { blender::Vector warnings; + blender::Set attribute_name_hints; }; struct NodeTreeUIStorage { @@ -94,3 +96,8 @@ void BKE_nodetree_error_message_add(bNodeTree &ntree, const bNode &node, const NodeWarningType type, std::string message); + +void BKE_nodetree_attribute_hint_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const blender::StringRef attribute_name); diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc index e03617a6505..ea492c4d36a 100644 --- a/source/blender/blenkernel/intern/node_ui_storage.cc +++ b/source/blender/blenkernel/intern/node_ui_storage.cc @@ -136,3 +136,12 @@ void BKE_nodetree_error_message_add(bNodeTree &ntree, NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node); node_ui_storage.warnings.append({type, std::move(message)}); } + +void BKE_nodetree_attribute_hint_add(bNodeTree &ntree, + const NodeTreeEvaluationContext &context, + const bNode &node, + const StringRef attribute_name) +{ + NodeUIStorage &node_ui_storage = find_node_ui_storage(ntree, context, node); + node_ui_storage.attribute_name_hints.add_as(attribute_name); +} diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index fe5a8bc59d4..c7731815a2a 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -82,6 +82,7 @@ using blender::Map; using blender::Set; using blender::Span; using blender::StringRef; +using blender::StringRefNull; using blender::Vector; using blender::bke::PersistentCollectionHandle; using blender::bke::PersistentDataHandleMap; @@ -388,6 +389,8 @@ class GeometryNodesEvaluator { { const bNode &bnode = params.node(); + this->store_ui_hints(node, params); + /* Use the geometry-node-execute callback if it exists. */ if (bnode.typeinfo->geometry_node_execute != nullptr) { bnode.typeinfo->geometry_node_execute(params); @@ -405,6 +408,33 @@ class GeometryNodesEvaluator { this->execute_unknown_node(node, params); } + void store_ui_hints(const DNode &node, GeoNodeExecParams params) const + { + for (const DInputSocket *dsocket : node.inputs()) { + if (!dsocket->is_available()) { + continue; + } + if (dsocket->bsocket()->type != SOCK_GEOMETRY) { + continue; + } + + bNodeTree *btree_cow = node.node_ref().tree().btree(); + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + const NodeTreeEvaluationContext context(*self_object_, *modifier_); + + const GeometrySet &geometry_set = params.get_input(dsocket->identifier()); + const Vector components = geometry_set.get_components_for_read(); + + for (const GeometryComponent *component : components) { + component->attribute_foreach([&](StringRefNull attribute_name, + const AttributeMetaData &UNUSED(meta_data)) { + BKE_nodetree_attribute_hint_add(*btree_original, context, *node.bnode(), attribute_name); + return true; + }); + } + } + } + void execute_multi_function_node(const DNode &node, GeoNodeExecParams params, const MultiFunction &fn) From c778fd981e636d99f819806471e2ee83a3cb76c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastia=CC=81n=20Barschkis?= Date: Wed, 24 Feb 2021 16:12:50 +0100 Subject: [PATCH 443/519] CMake: Temporarily removing find clang block New libs have not landed in the SVN repository. Once they are up, this commit will be reverted. --- build_files/cmake/platform/platform_apple.cmake | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 31302bf1100..c2e46206046 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -333,12 +333,13 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) message(FATAL_ERROR "LLVM not found.") endif() - if(WITH_CLANG) - find_package(Clang) - if(NOT CLANG_FOUND) - message(FATAL_ERROR "Clang not found.") - endif() - endif() +# Temporarily removing clang - new libs still need to be committed +# if(WITH_CLANG) +# find_package(Clang) +# if(NOT CLANG_FOUND) +# message(FATAL_ERROR "Clang not found.") +# endif() +# endif() endif() From b22204fa370d93e4b484407942d35aaa2ad986a1 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 24 Feb 2021 16:43:18 +0100 Subject: [PATCH 444/519] Cleanup: Simplify vector direction comparison Multiply the two number together. If the sign of the result is positive, then the sign was the same. If the sign of the result is negative, then the signs were different. --- source/blender/editors/gpencil/gpencil_interpolate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index ff5ce7101f1..ae3dae326c0 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -237,8 +237,8 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, float v1[2], v2[2]; sub_v2_v2v2(v1, v_from_end, v_from_start); sub_v2_v2v2(v2, v_to_end, v_to_start); - if (((v1[0] > 0.0f && v2[0] < 0.0f) || (v1[0] < 0.0f && v2[0] > 0.0f)) && - ((v1[1] > 0.0f && v2[1] < 0.0f) || (v1[1] < 0.0f && v2[1] > 0.0f))) { + mul_v2_v2v2(v1, v1, v2); + if ((v1[0] < 0.0f) && (v1[1] < 0.0f)) { return true; } } From b0b33b77fae0d3def497fcbab6fa3ac85abaa98b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 24 Feb 2021 17:09:40 +0100 Subject: [PATCH 445/519] Workbench: Fix typo in rB32ca8e58a374 This was creating incorrectly occluded overlays. --- .../draw/engines/workbench/workbench_effect_antialiasing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index 84cc4359aa6..07121519ef4 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -73,7 +73,7 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num) /* Avoid samples outside range (wrap arround). */ table[index][i] = fmodf(table[index][i] + 0.5f, 1.0f); /* Recenter the distribution[-1..1]. */ - table[index][i] += table[index][i] * 2.0f - 1.0f; + table[index][i] = table[index][i] * 2.0f - 1.0f; } } From 069d96fce594be2d9735e3dbbc9fd2f76983c040 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 24 Feb 2021 17:24:11 +0100 Subject: [PATCH 446/519] Docs: 2.92 release description for Linux appdata --- .../org.blender.Blender.appdata.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/release/freedesktop/org.blender.Blender.appdata.xml b/release/freedesktop/org.blender.Blender.appdata.xml index 33a40a07bf1..f6d17834150 100644 --- a/release/freedesktop/org.blender.Blender.appdata.xml +++ b/release/freedesktop/org.blender.Blender.appdata.xml @@ -40,6 +40,26 @@ + + +

New features:

+
    +
  • Geometry nodes
  • +
  • EEVEE AOV and Cryptomatte support
  • +
  • Grease pencil Bézier curves edit
  • +
  • APIC fluid simulation method
  • +
  • Add primitive tool
  • +
+

Enhancements:

+
    +
  • Silhouette, elastic snake and smearing for sculpting
  • +
  • Grease pencil tracing image sequences support
  • +
  • Sparse NanoVDB grid for volume
  • +
  • OptiX hybrid rendering and new AO and bevel
  • +
  • Viscosity settings for fluid simulation
  • +
+
+

New features:

From 02948a2cab44f74ed101fc1b2ad9fe4431123e85 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 24 Feb 2021 17:25:10 +0100 Subject: [PATCH 447/519] Blender 2.92.0 release tagging --- source/blender/blenkernel/BKE_blender_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index a904bb439df..5372d86d187 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -35,7 +35,7 @@ extern "C" { /* Blender patch version for bugfix releases. */ #define BLENDER_VERSION_PATCH 0 /** Blender release cycle stage: alpha/beta/rc/release. */ -#define BLENDER_VERSION_CYCLE rc +#define BLENDER_VERSION_CYCLE release /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION From 5dd176cde8aa04132e9ffaa02c95ccf1022bc217 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 24 Feb 2021 13:54:57 -0300 Subject: [PATCH 448/519] PyAPI: Ensure GIL state only when a callback exists There are fewer python callbacks than `ARegionType`s. This also broke GTests's `bf_blenderloader_tests`. --- source/blender/python/intern/bpy_rna_callback.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index fdd3cb363ea..7f8ea54ab98 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -495,21 +495,28 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar static void cb_customdata_free(void *customdata) { PyObject *tuple = customdata; + bool use_gil = true; /* !PyC_IsInterpreterActive(); */ + + PyGILState_STATE gilstate; + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + Py_DECREF(tuple); + + if (use_gil) { + PyGILState_Release(gilstate); + } } void BPY_callback_screen_free(struct ARegionType *art) { - PyGILState_STATE gilstate = PyGILState_Ensure(); ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); - PyGILState_Release(gilstate); } void BPY_callback_wm_free(struct wmWindowManager *wm) { - PyGILState_STATE gilstate = PyGILState_Ensure(); WM_paint_cursor_remove_by_type(wm, cb_wm_cursor_draw, cb_customdata_free); - PyGILState_Release(gilstate); } /** \} */ From e8a99dda25813aa54497c816bb2f918ce0bdc826 Mon Sep 17 00:00:00 2001 From: Kdaf Date: Wed, 24 Feb 2021 12:27:25 -0600 Subject: [PATCH 449/519] Fix T84796: Particle tool properties displayed for select tool When using particle mode, the particle tool settings were always displayed, even if select/cursor is the active tool. This patch hides the properties of the particle tools for non-brush tools, using the same check as in other modes. Differential Revision: https://developer.blender.org/D10266 --- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 257b9edf4e8..a469973c28f 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -333,6 +333,17 @@ class VIEW3D_PT_tools_particlemode(Panel, View3DPaintPanel): layout.use_property_split = True layout.use_property_decorate = False # No animation. + from bl_ui.space_toolsystem_common import ToolSelectPanelHelper + tool_context = ToolSelectPanelHelper.tool_active_from_context(context) + + if not tool_context: + # If there is no active tool, then there can't be an active brush. + tool = None + + if not tool_context.has_datablock: + # tool.has_datablock is always true for tools that use brushes. + tool = None + if tool is not None: col = layout.column() col.prop(brush, "size", slider=True) From 89196765ba28e3d48e45c0f9f3c69d9d0b5fb624 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 24 Feb 2021 12:57:49 -0600 Subject: [PATCH 450/519] Cleanup: Clang tidy else after return --- .../editors/gpencil/gpencil_interpolate.c | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c index ae3dae326c0..7c541f61d75 100644 --- a/source/blender/editors/gpencil/gpencil_interpolate.c +++ b/source/blender/editors/gpencil/gpencil_interpolate.c @@ -220,28 +220,27 @@ static bool gpencil_stroke_need_flip(Depsgraph *depsgraph, /* `(S)--->(E) (E)<---(S)` */ return (dist_start >= dist_end); } - else { - /* Oriented inversed with original stroke start near of destination stroke. - * `(E)<----(S) <--->` */ - dist_start = len_squared_v2v2(v_from_start, v_to_start); - dist_end = len_squared_v2v2(v_from_start, v_to_end); - /* `(E)<---(S) (S)--->(E)` */ - return (dist_start < dist_end); - } + + /* Oriented inversed with original stroke start near of destination stroke. + * `(E)<----(S) <--->` */ + dist_start = len_squared_v2v2(v_from_start, v_to_start); + dist_end = len_squared_v2v2(v_from_start, v_to_end); + /* `(E)<---(S) (S)--->(E)` */ + return (dist_start < dist_end); } return true; } - else { - /* Check that both vectors have the same direction. */ - float v1[2], v2[2]; - sub_v2_v2v2(v1, v_from_end, v_from_start); - sub_v2_v2v2(v2, v_to_end, v_to_start); - mul_v2_v2v2(v1, v1, v2); - if ((v1[0] < 0.0f) && (v1[1] < 0.0f)) { - return true; - } + + /* Check that both vectors have the same direction. */ + float v1[2], v2[2]; + sub_v2_v2v2(v1, v_from_end, v_from_start); + sub_v2_v2v2(v2, v_to_end, v_to_start); + mul_v2_v2v2(v1, v1, v2); + if ((v1[0] < 0.0f) && (v1[1] < 0.0f)) { + return true; } + return false; } From b54b56fcbea62b958dc48441b150aecfb04c8a00 Mon Sep 17 00:00:00 2001 From: Fabian Schempp Date: Wed, 24 Feb 2021 13:01:24 -0600 Subject: [PATCH 451/519] UI: Make node virtual sockets more visible This commit tweaks how virtual sockets (unconnected node group input and output sockets) are drawn to make them more recognizable. The outline is changed to a gray color, and they get a dark inner color. Differential Revision: https://developer.blender.org/D10080 --- source/blender/editors/space_node/drawnode.c | 5 +++-- source/blender/editors/space_node/node_draw.cc | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 4716f1c29ea..82a1cd818c9 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3261,6 +3261,8 @@ void ED_init_custom_node_socket_type(bNodeSocketType *stype) stype->draw = node_socket_button_label; } +static const float virtual_node_socket_color[4] = {0.2, 0.2, 0.2, 1.0}; + /* maps standard socket integer type to a color */ static const float std_node_socket_colors[][4] = { {0.63, 0.63, 0.63, 1.0}, /* SOCK_FLOAT */ @@ -3461,8 +3463,7 @@ static void node_socket_virtual_draw_color(bContext *UNUSED(C), PointerRNA *UNUSED(node_ptr), float *r_color) { - /* alpha = 0, empty circle */ - zero_v4(r_color); + copy_v4_v4(r_color, virtual_node_socket_color); } void ED_init_node_socket_type_virtual(bNodeSocketType *stype) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 40d62b0b10f..83c7dd8eea5 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -791,7 +791,11 @@ static void node_socket_draw_multi_input(const float color[4], &rect, color, nullptr, 1.0f, color_outline, outline_width, width - outline_width * 0.5f); } -static void node_socket_outline_color_get(bool selected, float r_outline_color[4]) +static const float virtual_node_socket_outline_color[4] = {0.5, 0.5, 0.5, 1.0}; + +static void node_socket_outline_color_get(const bool selected, + const int socket_type, + float r_outline_color[4]) { if (selected) { UI_GetThemeColor4fv(TH_TEXT_HI, r_outline_color); @@ -801,6 +805,12 @@ static void node_socket_outline_color_get(bool selected, float r_outline_color[4 copy_v4_fl(r_outline_color, 0.0f); r_outline_color[3] = 0.6f; } + + /* Until there is a better place for per socket color, + * the outline color for virtual sockets is set here. */ + if (socket_type == SOCK_CUSTOM) { + copy_v4_v4(r_outline_color, virtual_node_socket_outline_color); + } } /* Usual convention here would be node_socket_get_color(), but that's already used (for setting a @@ -836,7 +846,7 @@ static void node_socket_draw_nested(const bContext *C, float outline_color[4]; node_socket_color_get((bContext *)C, ntree, node_ptr, sock, color); - node_socket_outline_color_get(selected, outline_color); + node_socket_outline_color_get(selected, sock->type, outline_color); node_socket_draw(sock, color, @@ -862,7 +872,7 @@ void ED_node_socket_draw(bNodeSocket *sock, const rcti *rect, const float color[ rcti draw_rect = *rect; float outline_color[4] = {0}; - node_socket_outline_color_get(sock->flag & SELECT, outline_color); + node_socket_outline_color_get(sock->flag & SELECT, sock->type, outline_color); BLI_rcti_resize(&draw_rect, size, size); @@ -1177,7 +1187,7 @@ void node_draw_sockets(const View2D *v2d, float color[4]; float outline_color[4]; node_socket_color_get((bContext *)C, ntree, &node_ptr, socket, color); - node_socket_outline_color_get(selected, outline_color); + node_socket_outline_color_get(selected, socket->type, outline_color); node_socket_draw_multi_input(color, outline_color, width, height, socket->locx, socket->locy); } From 66874824e6ee6e77b783b8867d1b584c25160601 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 24 Feb 2021 20:04:02 +0100 Subject: [PATCH 452/519] GPencil: Fix missing change material menu using U key The menu was not activated when vertex mode was enabled. --- .../scripts/startup/bl_ui/properties_grease_pencil_common.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py index 8e47b3103cd..0eb5d60457c 100644 --- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py +++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py @@ -328,11 +328,6 @@ class GPENCIL_MT_material_active(Menu): @classmethod def poll(cls, context): ob = context.active_object - tool_settings = context.scene.tool_settings - mode = tool_settings.gpencil_paint.color_mode - if mode != 'MATERIAL': - return False - if ob is None or len(ob.material_slots) == 0: return False From bc0e121bce257a8ea9d7855b074a7a22a8c3699b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 24 Feb 2021 13:08:26 -0600 Subject: [PATCH 453/519] UI: Reorder mesh merge operator types for consistent shortcuts In vertex selection mode, the "At First" and "At Last" options are contextually added to the beginning of the list of merge operations. This means the automatic shortcuts in the merge menu are different, making learning the shortcuts much more difficult than necessary. This patch reorders the items so that "At First" and "At Last" are added after the first three options so the shortcuts are always consistent. Fixes T84335 Differential Revision: https://developer.blender.org/D10008 --- source/blender/editors/mesh/editmesh_tools.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 231e6fbc2d9..2ea68c3354a 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3261,11 +3261,11 @@ static int edbm_merge_exec(bContext *C, wmOperator *op) } static const EnumPropertyItem merge_type_items[] = { - {MESH_MERGE_FIRST, "FIRST", 0, "At First", ""}, - {MESH_MERGE_LAST, "LAST", 0, "At Last", ""}, {MESH_MERGE_CENTER, "CENTER", 0, "At Center", ""}, {MESH_MERGE_CURSOR, "CURSOR", 0, "At Cursor", ""}, {MESH_MERGE_COLLAPSE, "COLLAPSE", 0, "Collapse", ""}, + {MESH_MERGE_FIRST, "FIRST", 0, "At First", ""}, + {MESH_MERGE_LAST, "LAST", 0, "At Last", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -3284,6 +3284,11 @@ static const EnumPropertyItem *merge_type_itemf(bContext *C, int totitem = 0; BMEditMesh *em = BKE_editmesh_from_object(obedit); + /* Keep these first so that their automatic shortcuts don't change. */ + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CENTER); + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CURSOR); + RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_COLLAPSE); + /* Only active object supported: * In practice it doesn't make sense to run this operation on non-active meshes * since selecting will activate - we could have own code-path for these but it's a hassle @@ -3305,9 +3310,6 @@ static const EnumPropertyItem *merge_type_itemf(bContext *C, } } - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CENTER); - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_CURSOR); - RNA_enum_items_add_value(&item, &totitem, merge_type_items, MESH_MERGE_COLLAPSE); RNA_enum_item_end(&item, &totitem); *r_free = true; From 8cc4366a98065c2162ca0ab8daa1e4f6458245f6 Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Wed, 24 Feb 2021 13:15:48 -0600 Subject: [PATCH 454/519] UI: Remove colons from some labels The colons are not necessary in these situations because it's clear that the label applies to the next group of buttons anyway, and they add unecessary visual complexity. Committing as part of D9924. --- release/scripts/startup/bl_ui/properties_paint_common.py | 2 +- release/scripts/startup/bl_ui/properties_physics_fluid.py | 2 +- release/scripts/startup/bl_ui/space_outliner.py | 8 ++++---- release/scripts/startup/bl_ui/space_userpref.py | 2 +- release/scripts/startup/bl_ui/space_view3d.py | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index f40c947fac9..dfdc6ab79f4 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -902,7 +902,7 @@ def brush_settings_advanced(layout, context, brush, popover=False): if popover: brush_settings(layout, context, brush, popover=True) layout.separator() - layout.label(text="Advanced:") + layout.label(text="Advanced") # These options are shared across many modes. use_accumulate = False diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 5c3975ffb76..5d3417fad0f 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -958,7 +958,7 @@ class PHYSICS_PT_particles(PhysicButtonsPanel, Panel): col.separator() col = flow.column() - col.prop(domain, "sndparticle_boundary", text="Particles in Boundary:") + col.prop(domain, "sndparticle_boundary", text="Particles in Boundary") if domain.cache_type == 'MODULAR': col.separator() diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index 1df7360774f..43a5e17e50e 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -323,7 +323,7 @@ class OUTLINER_PT_filter(Panel): display_mode = space.display_mode if display_mode == 'VIEW_LAYER': - layout.label(text="Restriction Toggles:") + layout.label(text="Restriction Toggles") row = layout.row(align=True) row.prop(space, "show_restrict_column_enable", text="") row.prop(space, "show_restrict_column_select", text="") @@ -334,7 +334,7 @@ class OUTLINER_PT_filter(Panel): row.prop(space, "show_restrict_column_indirect_only", text="") layout.separator() elif display_mode == 'SCENES': - layout.label(text="Restriction Toggles:") + layout.label(text="Restriction Toggles") row = layout.row(align=True) row.prop(space, "show_restrict_column_select", text="") row.prop(space, "show_restrict_column_hide", text="") @@ -354,7 +354,7 @@ class OUTLINER_PT_filter(Panel): layout.separator() col = layout.column(align=True) - col.label(text="Search:") + col.label(text="Search") col.prop(space, "use_filter_complete", text="Exact Match") col.prop(space, "use_filter_case_sensitive", text="Case Sensitive") @@ -363,7 +363,7 @@ class OUTLINER_PT_filter(Panel): layout.separator() - layout.label(text="Filter:") + layout.label(text="Filter") col = layout.column(align=True) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index a0b5355e64d..94a1e2bec4d 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -1333,7 +1333,7 @@ class USERPREF_PT_saveload_autorun(FilePathsPanel, Panel): box = layout.box() row = box.row() - row.label(text="Excluded Paths:") + row.label(text="Excluded Paths") row.operator("preferences.autoexec_path_add", text="", icon='ADD', emboss=False) for i, path_cmp in enumerate(prefs.autoexec_paths): row = box.row() diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 4690abe5cec..41a1831f46a 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -6210,7 +6210,7 @@ class VIEW3D_PT_overlay_motion_tracking(Panel): col = layout.column() col.active = display_all - col.label(text="Tracks:") + col.label(text="Tracks") row = col.row(align=True) row.prop(view, "tracks_display_type", text="") row.prop(view, "tracks_display_size", text="Size") @@ -6923,7 +6923,7 @@ class VIEW3D_PT_view3d_stereo(Panel): col = layout.column() col.row().prop(view, "stereo_3d_camera", expand=True) - col.label(text="Display:") + col.label(text="Display") row = col.row() row.active = basic_stereo row.prop(view, "show_stereo_3d_cameras") From d3a96e5022e121426c8926d0507effe4e9b4005f Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 24 Feb 2021 15:13:24 -0300 Subject: [PATCH 455/519] t --- .../blender/python/intern/bpy_rna_callback.c | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index 7f8ea54ab98..34c1b8e84d6 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -24,6 +24,7 @@ #include #include "../generic/python_utildefines.h" +#include "../generic/py_capi_utils.h" #include "DNA_space_types.h" @@ -495,28 +496,40 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar static void cb_customdata_free(void *customdata) { PyObject *tuple = customdata; - bool use_gil = true; /* !PyC_IsInterpreterActive(); */ + + Py_DECREF(tuple); +} + +void BPY_callback_screen_free(struct ARegionType *art) +{ + bool use_gil = !PyC_IsInterpreterActive(); PyGILState_STATE gilstate; if (use_gil) { gilstate = PyGILState_Ensure(); } - - Py_DECREF(tuple); + ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); if (use_gil) { PyGILState_Release(gilstate); } } -void BPY_callback_screen_free(struct ARegionType *art) -{ - ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); -} - void BPY_callback_wm_free(struct wmWindowManager *wm) { + bool use_gil = !PyC_IsInterpreterActive(); + + PyGILState_STATE gilstate; + if (use_gil) { + gilstate = PyGILState_Ensure(); + } + + BLI_assert(PyC_IsInterpreterActive()); WM_paint_cursor_remove_by_type(wm, cb_wm_cursor_draw, cb_customdata_free); + + if (use_gil) { + PyGILState_Release(gilstate); + } } /** \} */ From 201ab7c54025afc42570ce3df3d2bb7f37fe36be Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 24 Feb 2021 16:19:44 -0300 Subject: [PATCH 456/519] Fix T85823: bpy.ops.transform... ignoring 'center_override' for Bezier control points `transform_around_single_fallback_ex` ignored that the center could be overwritten. --- .../editors/transform/transform_convert.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 6b2e9dd9840..e2ec857b670 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -73,12 +73,20 @@ bool transform_mode_use_local_origins(const TransInfo *t) */ void transform_around_single_fallback_ex(TransInfo *t, int data_len_all) { - if ((ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) && - transform_mode_use_local_origins(t)) { - if (data_len_all == 1) { - t->around = V3D_AROUND_LOCAL_ORIGINS; - } + if (data_len_all != 1) { + return; } + if (!ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) { + return; + } + if (!transform_mode_use_local_origins(t)) { + return; + } + if (t->flag | T_OVERRIDE_CENTER) { + return; + } + + t->around = V3D_AROUND_LOCAL_ORIGINS; } void transform_around_single_fallback(TransInfo *t) From 7a8a8241b930826a43ca2ddb37c531ba73b5317e Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 24 Feb 2021 16:23:18 -0300 Subject: [PATCH 457/519] Revert "t" This reverts commit d3a96e5022e121426c8926d0507effe4e9b4005f. --- .../blender/python/intern/bpy_rna_callback.c | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index 34c1b8e84d6..7f8ea54ab98 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -24,7 +24,6 @@ #include #include "../generic/python_utildefines.h" -#include "../generic/py_capi_utils.h" #include "DNA_space_types.h" @@ -496,40 +495,28 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar static void cb_customdata_free(void *customdata) { PyObject *tuple = customdata; + bool use_gil = true; /* !PyC_IsInterpreterActive(); */ + + PyGILState_STATE gilstate; + if (use_gil) { + gilstate = PyGILState_Ensure(); + } Py_DECREF(tuple); + + if (use_gil) { + PyGILState_Release(gilstate); + } } void BPY_callback_screen_free(struct ARegionType *art) { - bool use_gil = !PyC_IsInterpreterActive(); - - PyGILState_STATE gilstate; - if (use_gil) { - gilstate = PyGILState_Ensure(); - } ED_region_draw_cb_remove_by_type(art, cb_region_draw, cb_customdata_free); - - if (use_gil) { - PyGILState_Release(gilstate); - } } void BPY_callback_wm_free(struct wmWindowManager *wm) { - bool use_gil = !PyC_IsInterpreterActive(); - - PyGILState_STATE gilstate; - if (use_gil) { - gilstate = PyGILState_Ensure(); - } - - BLI_assert(PyC_IsInterpreterActive()); WM_paint_cursor_remove_by_type(wm, cb_wm_cursor_draw, cb_customdata_free); - - if (use_gil) { - PyGILState_Release(gilstate); - } } /** \} */ From 9a1b29e16c216c2827f28214d4f7af4ee072beec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastia=CC=81n=20Barschkis?= Date: Wed, 24 Feb 2021 20:18:07 +0100 Subject: [PATCH 458/519] CMake: Removed temporarily disabled clang block Was disabled in rBc778fd981e63. Libraries have been updated in rBL62576. --- build_files/cmake/platform/platform_apple.cmake | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index c2e46206046..31302bf1100 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -333,13 +333,12 @@ if(WITH_LLVM) if(NOT LLVM_FOUND) message(FATAL_ERROR "LLVM not found.") endif() -# Temporarily removing clang - new libs still need to be committed -# if(WITH_CLANG) -# find_package(Clang) -# if(NOT CLANG_FOUND) -# message(FATAL_ERROR "Clang not found.") -# endif() -# endif() + if(WITH_CLANG) + find_package(Clang) + if(NOT CLANG_FOUND) + message(FATAL_ERROR "Clang not found.") + endif() + endif() endif() From 4f247dba5ea99d9c3a3544c9dd302192cc1dab75 Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Wed, 24 Feb 2021 13:25:44 -0600 Subject: [PATCH 459/519] UI: Cleanup and fix labels and descriptions in various places Changes include using proper and consistent grammar, simplifying phrasing, using correct terminology, and not including python API identifiers in tooltips. Differential Revision: https://developer.blender.org/D9924 --- .../startup/bl_operators/object_align.py | 4 ++-- .../startup/bl_operators/uvcalc_lightmap.py | 4 ++-- .../editors/animation/anim_channels_edit.c | 4 ++-- source/blender/editors/mesh/editmesh_tools.c | 2 +- .../editors/object/object_data_transfer.c | 2 +- source/blender/editors/object/object_select.c | 2 +- .../blender/editors/space_node/node_select.c | 4 ++-- .../editors/space_sequencer/sequencer_add.c | 3 ++- .../editors/space_view3d/view3d_edit.c | 2 +- source/blender/makesrna/intern/rna_fcurve.c | 4 ++-- source/blender/makesrna/intern/rna_mesh.c | 2 +- source/blender/makesrna/intern/rna_modifier.c | 8 ++++---- source/blender/makesrna/intern/rna_particle.c | 8 ++++---- source/blender/makesrna/intern/rna_scene.c | 2 +- source/blender/makesrna/intern/rna_space.c | 2 +- source/blender/makesrna/intern/rna_speaker.c | 4 ++-- source/blender/makesrna/intern/rna_userdef.c | 20 +++++++++---------- .../windowmanager/intern/wm_files_link.c | 2 +- .../windowmanager/intern/wm_operators.c | 2 +- 19 files changed, 41 insertions(+), 40 deletions(-) diff --git a/release/scripts/startup/bl_operators/object_align.py b/release/scripts/startup/bl_operators/object_align.py index cc6724a620e..70b80f7198f 100644 --- a/release/scripts/startup/bl_operators/object_align.py +++ b/release/scripts/startup/bl_operators/object_align.py @@ -366,9 +366,9 @@ class AlignObjects(Operator): bb_quality: BoolProperty( name="High Quality", description=( - "Enables high quality calculation of the " + "Enables high quality but slow calculation of the " "bounding box for perfect results on complex " - "shape meshes with rotation/scale (Slow)" + "shape meshes with rotation/scale" ), default=True, ) diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py index 34c36443431..29c17711c2a 100644 --- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py +++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py @@ -614,8 +614,8 @@ class LightMapPack(Operator): PREF_PACK_IN_ONE: BoolProperty( name="Share Texture Space", description=( - "Objects Share texture space, map all objects " - "into 1 uvmap" + "Objects share texture space, map all objects " + "into a single UV map" ), default=True, ) diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index 109cf79c786..38820e05869 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -2284,7 +2284,7 @@ static void ANIM_OT_channels_expand(wmOperatorType *ot) /* identifiers */ ot->name = "Expand Channels"; ot->idname = "ANIM_OT_channels_expand"; - ot->description = "Expand (i.e. open) all selected expandable animation channels"; + ot->description = "Expand (open) all selected expandable animation channels"; /* api callbacks */ ot->exec = animchannels_expand_exec; @@ -2329,7 +2329,7 @@ static void ANIM_OT_channels_collapse(wmOperatorType *ot) /* identifiers */ ot->name = "Collapse Channels"; ot->idname = "ANIM_OT_channels_collapse"; - ot->description = "Collapse (i.e. close) all selected expandable animation channels"; + ot->description = "Collapse (close) all selected expandable animation channels"; /* api callbacks */ ot->exec = animchannels_collapse_exec; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 2ea68c3354a..43e0ab97f5d 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -6889,7 +6889,7 @@ void MESH_OT_sort_elements(wmOperatorType *ot) "MATERIAL", 0, "Material", - "Sort selected elements from smallest to greatest material index (faces only!)"}, + "Sort selected faces from smallest to greatest material index"}, {SRT_SELECTED, "SELECTED", 0, diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index b251e617a4c..72ef72403cf 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -615,7 +615,7 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) ot->name = "Transfer Mesh Data"; ot->idname = "OBJECT_OT_data_transfer"; ot->description = - "Transfer data layer(s) (weights, edge sharp, ...) from active to selected meshes"; + "Transfer data layer(s) (weights, edge sharp, etc.) from active to selected meshes"; /* API callbacks.*/ ot->poll = data_transfer_poll; diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 1e6a7b9f14e..398ad89a694 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -1311,7 +1311,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot) /* identifiers */ ot->name = "Select Mirror"; - ot->description = "Select the Mirror objects of the selected object eg. L.sword -> R.sword"; + ot->description = "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\""; ot->idname = "OBJECT_OT_select_mirror"; /* api callbacks */ diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 1e6ca66dd31..58d22c2864f 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -729,7 +729,7 @@ void NODE_OT_select_box(wmOperatorType *ot) "tweak", 0, "Tweak", - "Only activate when mouse is not over a node - useful for tweak gesture"); + "Only activate when mouse is not over a node (useful for tweak gesture)"); WM_operator_properties_gesture_box(ot); WM_operator_properties_select_operation_simple(ot); @@ -905,7 +905,7 @@ void NODE_OT_select_lasso(wmOperatorType *ot) "tweak", 0, "Tweak", - "Only activate when mouse is not over a node - useful for tweak gesture"); + "Only activate when mouse is not over a node (useful for tweak gesture)"); WM_operator_properties_gesture_lasso(ot); WM_operator_properties_select_operation_simple(ot); diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index e605cf4a889..a9033b98708 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -1144,6 +1144,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) "Type", "Sequencer effect type"); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME | SEQPROP_ENDFRAME); + /* Only used when strip is of the Color type. */ prop = RNA_def_float_color(ot->srna, "color", 3, @@ -1151,7 +1152,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) 0.0f, 1.0f, "Color", - "Initialize the strip with this color (only used when type='COLOR')", + "Initialize the strip with this color", 0.0f, 1.0f); RNA_def_property_subtype(prop, PROP_COLOR_GAMMA); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 5c2969f47d7..dc590833368 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -5274,7 +5274,7 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot) static const EnumPropertyItem prop_shading_type_items[] = { {OB_WIRE, "WIREFRAME", 0, "Wireframe", "Toggle wireframe shading"}, {OB_SOLID, "SOLID", 0, "Solid", "Toggle solid shading"}, - {OB_MATERIAL, "MATERIAL", 0, "LookDev", "Toggle lookdev shading"}, + {OB_MATERIAL, "MATERIAL", 0, "Material Preview", "Toggle material preview shading"}, {OB_RENDER, "RENDERED", 0, "Rendered", "Toggle rendered shading"}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index 989a41b9ad6..1c7f6ef5cb3 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -112,7 +112,7 @@ const EnumPropertyItem rna_enum_beztriple_keyframe_type_items[] = { "EXTREME", ICON_KEYTYPE_EXTREME_VEC, "Extreme", - "An 'extreme' pose, or some other purpose as needed"}, + "An \"extreme\" pose, or some other purpose as needed"}, {BEZT_KEYTYPE_JITTER, "JITTER", ICON_KEYTYPE_JITTER_VEC, @@ -128,7 +128,7 @@ const EnumPropertyItem rna_enum_beztriple_interpolation_easing_items[] = { ICON_IPO_EASE_IN_OUT, "Automatic Easing", "Easing type is chosen automatically based on what the type of interpolation used " - "(e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)"}, + "(e.g. Ease In for transitional types, and Ease Out for dynamic effects)"}, {BEZT_IPO_EASE_IN, "EASE_IN", diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index f51bd2f9678..ed1024116fb 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -1893,7 +1893,7 @@ static void rna_def_mloop(BlenderRNA *brna) prop, "Bitangent", "Bitangent vector of this vertex for this polygon (must be computed beforehand using " - "calc_tangents, *use it only if really needed*, slower access than bitangent_sign)"); + "calc_tangents, use it only if really needed, slower access than bitangent_sign)"); } static void rna_def_mpolygon(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index ae10b637b30..e2ec90ae9aa 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -180,7 +180,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { "Skin", "Create a solid shape from vertices and edges, using the vertex radius to define the " "thickness"}, - {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", " Make the surface thick"}, + {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", "Make the surface thick"}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, @@ -279,7 +279,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { "WAVE", ICON_MOD_WAVE, "Wave", - "Adds a ripple-like motion to an object’s geometry"}, + "Adds a ripple-like motion to an object's geometry"}, {eModifierType_VolumeDisplace, "VOLUME_DISPLACE", ICON_VOLUME_DATA, @@ -4562,7 +4562,7 @@ static void rna_def_modifier_solidify(BlenderRNA *brna) 0, "Complex", "Output a manifold mesh even if the base mesh is non-manifold, " - "where edges have 3 or more connecting faces." + "where edges have 3 or more connecting faces. " "This method is slower"}, {0, NULL, 0, NULL, NULL}, }; @@ -6740,7 +6740,7 @@ static void rna_def_modifier_normaledit(BlenderRNA *brna) "MUL", 0, "Multiply", - "Copy product of old and new normals (*not* cross product)"}, + "Copy product of old and new normals (not cross product)"}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index ab8c1b0bb3f..1952029d793 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -2783,7 +2783,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "draw_size"); RNA_def_property_range(prop, 0, 1000); RNA_def_property_ui_range(prop, 0, 100, 1, -1); - RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in BU"); + RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport"); RNA_def_property_update(prop, 0, "rna_Particle_redo"); prop = RNA_def_property(srna, "child_type", PROP_ENUM, PROP_NONE); @@ -2860,7 +2860,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Integration", "Algorithm used to calculate physics, from the fastest to the " - "most stable/accurate: Midpoint, Euler, Verlet, RK4 (Old)"); + "most stable and accurate: Midpoint, Euler, Verlet, RK4"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); prop = RNA_def_property(srna, "kink", PROP_ENUM, PROP_NONE); @@ -3163,14 +3163,14 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "child_nbr"); /*optional if prop names are the same */ RNA_def_property_range(prop, 0, 100000); RNA_def_property_ui_range(prop, 0, 1000, 1, -1); - RNA_def_property_ui_text(prop, "Children Per Parent", "Number of children/parent"); + RNA_def_property_ui_text(prop, "Children Per Parent", "Number of children per parent"); RNA_def_property_update(prop, 0, "rna_Particle_redo_child"); prop = RNA_def_property(srna, "rendered_child_count", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr"); RNA_def_property_range(prop, 0, 100000); RNA_def_property_ui_range(prop, 0, 10000, 1, -1); - RNA_def_property_ui_text(prop, "Rendered Children", "Number of children/parent for rendering"); + RNA_def_property_ui_text(prop, "Rendered Children", "Number of children per parent for rendering"); prop = RNA_def_property(srna, "virtual_parents", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "parents"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 0ad11aa9538..170bbc7e372 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -262,7 +262,7 @@ const EnumPropertyItem rna_enum_curve_fit_method_items[] = { #define R_IMF_ENUM_BMP \ {R_IMF_IMTYPE_BMP, "BMP", ICON_FILE_IMAGE, "BMP", "Output image in bitmap format"}, #define R_IMF_ENUM_IRIS \ - {R_IMF_IMTYPE_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", "Output image in (old!) SGI IRIS format"}, + {R_IMF_IMTYPE_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", "Output image in SGI IRIS format"}, #define R_IMF_ENUM_PNG \ {R_IMF_IMTYPE_PNG, "PNG", ICON_FILE_IMAGE, "PNG", "Output image in PNG format"}, #define R_IMF_ENUM_JPEG \ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 38f5b65fbc2..3b43ad5e766 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4336,7 +4336,7 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Render Region", - "Use a region within the frame size for rendered viewport" + "Use a region within the frame size for rendered viewport " "(when not viewing through the camera)"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); diff --git a/source/blender/makesrna/intern/rna_speaker.c b/source/blender/makesrna/intern/rna_speaker.c index 27e8654306a..43f0d27f514 100644 --- a/source/blender/makesrna/intern/rna_speaker.c +++ b/source/blender/makesrna/intern/rna_speaker.c @@ -96,7 +96,7 @@ static void rna_def_speaker(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_text( - prop, "Reference Distance", "Reference distance at which volume is 100 %"); + prop, "Reference Distance", "Reference distance at which volume is 100%"); /* RNA_def_property_float_funcs(prop, NULL, "rna_Speaker_distance_reference_set", NULL); */ /* RNA_def_property_update(prop, 0, "rna_Speaker_update"); */ @@ -125,7 +125,7 @@ static void rna_def_speaker(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Inner Cone Angle", - "Angle of the inner cone, in degrees, inside the cone the volume is 100 %"); + "Angle of the inner cone, in degrees, inside the cone the volume is 100%"); /* RNA_def_property_float_funcs(prop, NULL, "rna_Speaker_cone_angle_inner_set", NULL); */ /* RNA_def_property_update(prop, 0, "rna_Speaker_update"); */ diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 1abd16caaeb..4a50718c91d 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -3544,59 +3544,59 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna) prop = RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "strip"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Strips", "Action-Clip Strip - Unselected"); + RNA_def_property_ui_text(prop, "Strips", "Unselected Action-Clip Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "strip_select"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Strips Selected", "Action-Clip Strip - Selected"); + RNA_def_property_ui_text(prop, "Strips Selected", "Selected Action-Clip Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "transition_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_transition"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Transitions", "Transition Strip - Unselected"); + RNA_def_property_ui_text(prop, "Transitions", "Unselected Transition Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "transition_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_transition_sel"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Transitions Selected", "Transition Strip - Selected"); + RNA_def_property_ui_text(prop, "Transitions Selected", "Selected Transition Strip"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "meta_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_meta"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Meta Strips", "Meta Strip - Unselected (for grouping related strips)"); + prop, "Meta Strips", "Unselected Meta Strip (for grouping related strips)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "meta_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_meta_sel"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Meta Strips Selected", "Meta Strip - Selected (for grouping related strips)"); + prop, "Meta Strips Selected", "Selected Meta Strip (for grouping related strips)"); RNA_def_property_update(prop, 0, "rna_userdef_update"); prop = RNA_def_property(srna, "sound_strips", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_sound"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Sound Strips", "Sound Strip - Unselected (for timing speaker sounds)"); + prop, "Sound Strips", "Unselected Sound Strip (for timing speaker sounds)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "sound_strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_sound_sel"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text( - prop, "Sound Strips Selected", "Sound Strip - Selected (for timing speaker sounds)"); + prop, "Sound Strips Selected", "Selected Sound Strip (for timing speaker sounds)"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "tweak", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "nla_tweaking"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Tweak", "Color for strip/action being 'tweaked' or edited"); + RNA_def_property_ui_text(prop, "Tweak", "Color for strip/action being \"tweaked\" or edited"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "tweak_duplicate", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -6022,7 +6022,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) static const EnumPropertyItem anim_player_presets[] = { {0, "INTERNAL", 0, "Internal", "Built-in animation player"}, - {2, "DJV", 0, "DJV", "Open source frame player: http://djv.sourceforge.net"}, + {2, "DJV", 0, "DJV", "Open source frame player"}, {3, "FRAMECYCLER", 0, "FrameCycler", "Frame player from IRIDAS"}, {4, "RV", 0, "RV", "Frame player from Tweak Software"}, {5, "MPLAYER", 0, "MPlayer", "Media player for video and PNG/JPEG/SGI image sequences"}, diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c index 49ac250d9a3..d4495821672 100644 --- a/source/blender/windowmanager/intern/wm_files_link.c +++ b/source/blender/windowmanager/intern/wm_files_link.c @@ -629,7 +629,7 @@ void WM_OT_append(wmOperatorType *ot) "set_fake", false, "Fake User", - "Set Fake User for appended items (except Objects and Groups)"); + "Set \"Fake User\" for appended items (except objects and collections)"); RNA_def_boolean( ot->srna, "use_recursive", diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index bab8359472f..f96c45f8a05 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3010,7 +3010,7 @@ static void WM_OT_radial_control(wmOperatorType *ot) { ot->name = "Radial Control"; ot->idname = "WM_OT_radial_control"; - ot->description = "Set some size property (like e.g. brush size) with mouse wheel"; + ot->description = "Set some size property (e.g. brush size) with mouse wheel"; ot->invoke = radial_control_invoke; ot->modal = radial_control_modal; From 962b87f06a8e3dfadf86ca93ca2083db7866b98e Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Wed, 24 Feb 2021 13:44:24 -0600 Subject: [PATCH 460/519] UI: Clean up use of the term "Metaballs" Clear the weird term "Metaelement". These are the metaballs (elements) inside one metaball objects. - "Meta Ball" to "Metaball" - "Metaelement", "Meta element" to "Metaball element" Differential Revision: https://developer.blender.org/D9910 --- release/scripts/startup/bl_operators/wm.py | 2 +- source/blender/editors/metaball/mball_edit.c | 14 +++++++------- source/blender/editors/metaball/mball_ops.c | 2 +- source/blender/makesrna/intern/rna_meta.c | 12 ++++++------ source/blender/makesrna/intern/rna_meta_api.c | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index b14f9c05210..06b3b4defcc 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2066,7 +2066,7 @@ class WM_OT_batch_rename(Operator): # Enum identifiers are compared with 'object.type'. ('MESH', "Meshes", ""), ('CURVE', "Curves", ""), - ('META', "Meta Balls", ""), + ('META', "Metaballs", ""), ('ARMATURE', "Armatures", ""), ('LATTICE', "Lattices", ""), ('GPENCIL', "Grease Pencils", ""), diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index cf453bf0c32..292052b778a 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -205,7 +205,7 @@ void MBALL_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name = "(De)select All"; - ot->description = "Change selection of all meta elements"; + ot->description = "Change selection of all metaball elements"; ot->idname = "MBALL_OT_select_all"; /* callback functions */ @@ -529,7 +529,7 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot) { /* identifiers */ ot->name = "Select Random"; - ot->description = "Randomly select metaelements"; + ot->description = "Randomly select metaball elements"; ot->idname = "MBALL_OT_select_random_metaelems"; /* callback functions */ @@ -587,8 +587,8 @@ static int duplicate_metaelems_exec(bContext *C, wmOperator *UNUSED(op)) void MBALL_OT_duplicate_metaelems(wmOperatorType *ot) { /* identifiers */ - ot->name = "Duplicate Metaelements"; - ot->description = "Duplicate selected metaelement(s)"; + ot->name = "Duplicate Metaball Elements"; + ot->description = "Duplicate selected metaball element(s)"; ot->idname = "MBALL_OT_duplicate_metaelems"; /* callback functions */ @@ -647,7 +647,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Delete"; - ot->description = "Delete selected metaelement(s)"; + ot->description = "Delete selected metaball element(s)"; ot->idname = "MBALL_OT_delete_metaelems"; /* callback functions */ @@ -692,7 +692,7 @@ void MBALL_OT_hide_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Hide Selected"; - ot->description = "Hide (un)selected metaelement(s)"; + ot->description = "Hide (un)selected metaball element(s)"; ot->idname = "MBALL_OT_hide_metaelems"; /* callback functions */ @@ -739,7 +739,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name = "Reveal Hidden"; - ot->description = "Reveal all hidden metaelements"; + ot->description = "Reveal all hidden metaball elements"; ot->idname = "MBALL_OT_reveal_metaelems"; /* callback functions */ diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index a54ec384d8e..e57161928b0 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -53,7 +53,7 @@ void ED_operatormacros_metaball(void) ot = WM_operatortype_append_macro("MBALL_OT_duplicate_move", "Duplicate", - "Make copies of the selected metaelements and move them", + "Make copies of the selected metaball elements and move them", OPTYPE_UNDO | OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "MBALL_OT_duplicate_metaelems"); otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c index a391defe542..ffdd75e63ac 100644 --- a/source/blender/makesrna/intern/rna_meta.c +++ b/source/blender/makesrna/intern/rna_meta.c @@ -198,7 +198,7 @@ static void rna_def_metaelement(BlenderRNA *brna) srna = RNA_def_struct(brna, "MetaElement", NULL); RNA_def_struct_sdna(srna, "MetaElem"); - RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a Metaball data-block"); + RNA_def_struct_ui_text(srna, "Metaball Element", "Blobby element in a metaball data-block"); RNA_def_struct_path_func(srna, "rna_MetaElement_path"); RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META); @@ -290,13 +290,13 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_srna(cprop, "MetaBallElements"); srna = RNA_def_struct(brna, "MetaBallElements", NULL); RNA_def_struct_sdna(srna, "MetaBall"); - RNA_def_struct_ui_text(srna, "Meta Elements", "Collection of metaball elements"); + RNA_def_struct_ui_text(srna, "Metaball Elements", "Collection of metaball elements"); func = RNA_def_function(srna, "new", "rna_MetaBall_elements_new"); RNA_def_function_ui_description(func, "Add a new element to the metaball"); RNA_def_enum( - func, "type", rna_enum_metaelem_type_items, MB_BALL, "", "type for the new meta-element"); - parm = RNA_def_pointer(func, "element", "MetaElement", "", "The newly created meta-element"); + func, "type", rna_enum_metaelem_type_items, MB_BALL, "", "Type for the new metaball element"); + parm = RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaball element"); RNA_def_function_return(func, parm); func = RNA_def_function(srna, "remove", "rna_MetaBall_elements_remove"); @@ -337,7 +337,7 @@ static void rna_def_metaball(BlenderRNA *brna) prop = RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "elems", NULL); RNA_def_property_struct_type(prop, "MetaElement"); - RNA_def_property_ui_text(prop, "Elements", "Meta elements"); + RNA_def_property_ui_text(prop, "Elements", "Metaball elements"); rna_def_metaball_elements(brna, prop); /* enums */ @@ -365,7 +365,7 @@ static void rna_def_metaball(BlenderRNA *brna) prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "thresh"); RNA_def_property_range(prop, 0.0f, 5.0f); - RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements"); + RNA_def_property_ui_text(prop, "Threshold", "Influence of metaball elements"); RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); /* texture space */ diff --git a/source/blender/makesrna/intern/rna_meta_api.c b/source/blender/makesrna/intern/rna_meta_api.c index 178209d1152..19d0b35959b 100644 --- a/source/blender/makesrna/intern/rna_meta_api.c +++ b/source/blender/makesrna/intern/rna_meta_api.c @@ -54,7 +54,7 @@ void RNA_api_meta(StructRNA *srna) PropertyRNA *parm; func = RNA_def_function(srna, "transform", "rna_Meta_transform"); - RNA_def_function_ui_description(func, "Transform meta elements by a matrix"); + RNA_def_function_ui_description(func, "Transform metaball elements by a matrix"); parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); From a50f6bc40b65b72381546d4ca0f3b617798577cf Mon Sep 17 00:00:00 2001 From: Yevgeny Makarov Date: Wed, 24 Feb 2021 13:49:14 -0600 Subject: [PATCH 461/519] UI: Clean up "Dupli" to "Instance" Following the naming conventions defined in T56648, where in this instance there were still a few remaining uses of the old term. Differential Revision: https://developer.blender.org/D9817 --- source/blender/editors/object/object_add.c | 2 +- .../blender/editors/physics/particle_object.c | 20 +++++++++---------- .../blender/makesrna/intern/rna_depsgraph.c | 2 +- source/blender/makesrna/intern/rna_nodetree.c | 4 ++-- source/blender/makesrna/intern/rna_particle.c | 14 ++++++------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 351b762c8cd..dc941f12eba 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -2404,7 +2404,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot) "use_base_parent", 0, "Parent", - "Parent newly created objects to the original duplicator"); + "Parent newly created objects to the original instancer"); RNA_def_boolean( ot->srna, "use_hierarchy", 0, "Keep Hierarchy", "Maintain parent child relationships"); } diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index f5c3fc17552..6bcc9df16bf 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -416,9 +416,9 @@ static int dupliob_refresh_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_refresh(wmOperatorType *ot) { - ot->name = "Refresh Dupli Objects"; + ot->name = "Refresh Instance Objects"; ot->idname = "PARTICLE_OT_dupliob_refresh"; - ot->description = "Refresh list of dupli objects and their weights"; + ot->description = "Refresh list of instance objects and their weights"; ot->exec = dupliob_refresh_exec; @@ -456,9 +456,9 @@ static int dupliob_move_up_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot) { - ot->name = "Move Up Dupli Object"; + ot->name = "Move Up Instance Object"; ot->idname = "PARTICLE_OT_dupliob_move_up"; - ot->description = "Move dupli object up in the list"; + ot->description = "Move instance object up in the list"; ot->exec = dupliob_move_up_exec; @@ -498,9 +498,9 @@ static int copy_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_copy(wmOperatorType *ot) { /* identifiers */ - ot->name = "Copy Particle Dupliob"; + ot->name = "Copy Particle Instance Object"; ot->idname = "PARTICLE_OT_dupliob_copy"; - ot->description = "Duplicate the current dupliobject"; + ot->description = "Duplicate the current instance object"; /* api callbacks */ ot->exec = copy_particle_dupliob_exec; @@ -543,9 +543,9 @@ static int remove_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_remove(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Particle Dupliobject"; + ot->name = "Remove Particle Instance Object"; ot->idname = "PARTICLE_OT_dupliob_remove"; - ot->description = "Remove the selected dupliobject"; + ot->description = "Remove the selected instance object"; /* api callbacks */ ot->exec = remove_particle_dupliob_exec; @@ -584,9 +584,9 @@ static int dupliob_move_down_exec(bContext *C, wmOperator *UNUSED(op)) void PARTICLE_OT_dupliob_move_down(wmOperatorType *ot) { - ot->name = "Move Down Dupli Object"; + ot->name = "Move Down Instance Object"; ot->idname = "PARTICLE_OT_dupliob_move_down"; - ot->description = "Move dupli object down in the list"; + ot->description = "Move instance object down in the list"; ot->exec = dupliob_move_down_exec; diff --git a/source/blender/makesrna/intern/rna_depsgraph.c b/source/blender/makesrna/intern/rna_depsgraph.c index aab81b2bd1f..36d39c5c201 100644 --- a/source/blender/makesrna/intern/rna_depsgraph.c +++ b/source/blender/makesrna/intern/rna_depsgraph.c @@ -570,7 +570,7 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna) prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE); RNA_def_property_ui_text( - prop, "Dupli random id", "Random id for this instance, typically for randomized shading"); + prop, "Instance Random ID", "Random id for this instance, typically for randomized shading"); RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL); prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 46fdfe4a862..b8a3f0878b1 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -5222,7 +5222,7 @@ static void def_sh_tex_coord(StructRNA *srna) prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); RNA_def_property_ui_text( - prop, "From Instancer", "Use the parent of the dupli object if possible"); + prop, "From Instancer", "Use the parent of the instance object if possible"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } @@ -5554,7 +5554,7 @@ static void def_sh_uvmap(StructRNA *srna) prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); RNA_def_property_ui_text( - prop, "From Instancer", "Use the parent of the dupli object if possible"); + prop, "From Instancer", "Use the parent of the instance object if possible"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); RNA_def_struct_sdna_from(srna, "NodeShaderUVMap", "storage"); diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 1952029d793..9e8a2b83f07 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -1922,13 +1922,13 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna) srna = RNA_def_struct(brna, "ParticleDupliWeight", NULL); RNA_def_struct_ui_text( - srna, "Particle Dupliobject Weight", "Weight of a particle dupliobject in a collection"); + srna, "Particle Instance Object Weight", "Weight of a particle instance object in a collection"); RNA_def_struct_sdna(srna, "ParticleDupliWeight"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs( prop, "rna_ParticleDupliWeight_name_get", "rna_ParticleDupliWeight_name_length", NULL); - RNA_def_property_ui_text(prop, "Name", "Particle dupliobject name"); + RNA_def_property_ui_text(prop, "Name", "Particle instance object name"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_struct_name_property(srna, prop); @@ -3457,32 +3457,32 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_ui_text( - prop, "Dupli Collection", "Show Objects in this collection in place of particles"); + prop, "Instance Collection", "Show objects in this collection in place of particles"); RNA_def_property_update(prop, 0, "rna_Particle_redo_count"); prop = RNA_def_property(srna, "instance_weights", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "instance_weights", NULL); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); RNA_def_property_ui_text( - prop, "Dupli Collection Weights", "Weights for all of the objects in the dupli collection"); + prop, "Instance Collection Weights", "Weights for all of the objects in the instance collection"); prop = RNA_def_property(srna, "active_instanceweight", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); RNA_def_property_pointer_funcs(prop, "rna_ParticleDupliWeight_active_get", NULL, NULL, NULL); - RNA_def_property_ui_text(prop, "Active Dupli Object", ""); + RNA_def_property_ui_text(prop, "Active Instance Object", ""); prop = RNA_def_property(srna, "active_instanceweight_index", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_funcs(prop, "rna_ParticleDupliWeight_active_index_get", "rna_ParticleDupliWeight_active_index_set", "rna_ParticleDupliWeight_active_index_range"); - RNA_def_property_ui_text(prop, "Active Dupli Object Index", ""); + RNA_def_property_ui_text(prop, "Active Instance Object Index", ""); prop = RNA_def_property(srna, "instance_object", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text(prop, "Instance Object", "Show this Object in place of particles"); + RNA_def_property_ui_text(prop, "Instance Object", "Show this object in place of particles"); RNA_def_property_update(prop, 0, "rna_Particle_redo_dependency"); /* boids */ From 01e13e2c95132c92d37c832cbe9e814fae2007a2 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 24 Feb 2021 14:53:37 -0600 Subject: [PATCH 462/519] Cleanup: Remove unused node editor button event defines These defines seem to be left over from the initial implementation of the node editor. In a few places the values were used in button creation, but the callbacks never checked the value anyway. Node uiBlocks also had a callback what would never do anything since the value it checked for was never used. --- .../blender/editors/space_node/node_draw.cc | 19 ++++-------------- .../blender/editors/space_node/node_intern.h | 20 ------------------- 2 files changed, 4 insertions(+), 35 deletions(-) diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 83c7dd8eea5..162f3878f7e 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -302,16 +302,6 @@ void ED_node_sort(bNodeTree *ntree) } } -static void do_node_internal_buttons(bContext *C, void *UNUSED(node_v), int event) -{ - if (event == B_NODE_EXEC) { - SpaceNode *snode = CTX_wm_space_node(C); - if (snode && snode->id) { - ED_node_tag_update_id(snode->id); - } - } -} - static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) { /* Add node uiBlocks in drawing order - prevents events going to overlapping nodes. */ @@ -321,7 +311,6 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) char uiblockstr[32]; BLI_snprintf(uiblockstr, sizeof(uiblockstr), "node buttons %p", (void *)node); node->block = UI_block_begin(C, CTX_wm_region(C), uiblockstr, UI_EMBOSS); - UI_block_func_handle_set(node->block, do_node_internal_buttons, node); /* this cancels events for background nodes */ UI_block_flag_enable(node->block, UI_BLOCK_CLIP_EVENTS); @@ -1354,7 +1343,7 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefIconBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, ICON_MATERIAL, iconofs, rct->ymax - NODE_DY, @@ -1380,7 +1369,7 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefIconBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, ICON_NODETREE, iconofs, rct->ymax - NODE_DY, @@ -1432,7 +1421,7 @@ static void node_draw_basis(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, "", rct->xmin + 0.35f * U.widget_unit, rct->ymax - NODE_DY / 2.2f - but_size / 2, @@ -1607,7 +1596,7 @@ static void node_draw_hidden(const bContext *C, UI_block_emboss_set(node->block, UI_EMBOSS_NONE); uiBut *but = uiDefBut(node->block, UI_BTYPE_BUT_TOGGLE, - B_REDR, + 0, "", rct->xmin + 0.35f * U.widget_unit, centy - but_size / 2, diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 1566c1e8571..5973d59e68f 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -307,26 +307,6 @@ extern const char *node_context_dir[]; #define NODE_RESIZE_MARGIN (0.20f * U.widget_unit) #define NODE_LINK_RESOL 12 -/* Button events (butspace) */ -enum eNodeSpace_ButEvents { - B_NOP = 0, - B_REDR = 1, - B_NODE_USEMAT, - B_NODE_USESCENE, - B_NODE_USETEX, - B_TEXBROWSE, - B_TEXALONE, - B_TEXLOCAL, - B_TEXDELETE, - B_TEXPRV, - B_AUTOTEXNAME, - B_KEEPDATA, - B_NODE_EXEC, - B_MATPRV, - B_NODE_LOADIMAGE, - B_NODE_SETIMAGE, -}; - #ifdef __cplusplus } #endif From 17260c9b9a2c591e5269b5025f884630f7aa66c6 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 24 Feb 2021 16:11:21 -0600 Subject: [PATCH 463/519] Fix T85963: Combine and separate XYZ nodes don't work on instances They were missing the `geometry_set_realize_instances` function used to make any input instances real for writing. --- .../nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc | 2 ++ .../nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc index 564668af274..9c5c7e270b1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_combine_xyz.cc @@ -121,6 +121,8 @@ static void geo_node_attribute_combine_xyz_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { combine_attributes(geometry_set.get_component_for_write(), params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc index 0ba89562ec1..55b933e8582 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -147,6 +147,8 @@ static void geo_node_attribute_separate_xyz_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); + geometry_set = geometry_set_realize_instances(geometry_set); + if (geometry_set.has()) { separate_attribute(geometry_set.get_component_for_write(), params); } From c47990f41c7364058a72f5f162e5cdc06bce0adc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 12:00:45 +1100 Subject: [PATCH 464/519] PyAPI: expose imbuf.types.ImBuf, include in API docs Without this, the ImBuf type wasn't part of documentation. --- doc/python_api/sphinx_doc_gen.py | 2 + source/blender/python/generic/imbuf_py_api.c | 48 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index ee9b9df5bef..9eeab6d82bc 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -228,6 +228,7 @@ else: "blf", "bl_math", "imbuf", + "imbuf.types", "bmesh", "bmesh.ops", "bmesh.types", @@ -1976,6 +1977,7 @@ def write_rst_importable_modules(basepath): "aud": "Audio System", "blf": "Font Drawing", "imbuf": "Image Buffer", + "imbuf.types": "Image Buffer Types", "gpu": "GPU Shader Module", "gpu.types": "GPU Types", "gpu.matrix": "GPU Matrix", diff --git a/source/blender/python/generic/imbuf_py_api.c b/source/blender/python/generic/imbuf_py_api.c index fe72f267a5d..5b4a4fd237e 100644 --- a/source/blender/python/generic/imbuf_py_api.c +++ b/source/blender/python/generic/imbuf_py_api.c @@ -40,6 +40,8 @@ #include #include +static PyObject *BPyInit_imbuf_types(void); + static PyObject *Py_ImBuf_CreatePyObject(ImBuf *ibuf); /* -------------------------------------------------------------------- */ @@ -522,7 +524,7 @@ static PyObject *M_imbuf_write(PyObject *UNUSED(self), PyObject *args, PyObject /** \} */ /* -------------------------------------------------------------------- */ -/** \name Module Definition +/** \name Module Definition (`imbuf`) * \{ */ static PyMethodDef IMB_methods[] = { @@ -547,11 +549,51 @@ static struct PyModuleDef IMB_module_def = { PyObject *BPyInit_imbuf(void) { + PyObject *mod; PyObject *submodule; + PyObject *sys_modules = PyImport_GetModuleDict(); - submodule = PyModule_Create(&IMB_module_def); + mod = PyModule_Create(&IMB_module_def); - PyType_Ready(&Py_ImBuf_Type); + /* `imbuf.types` */ + PyModule_AddObject(mod, "types", (submodule = BPyInit_imbuf_types())); + PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + + return mod; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Module Definition (`imbuf.types`) + * + * `imbuf.types` module, only include this to expose access to `imbuf.types.ImBuf` + * for docs and the ability to use with built-ins such as `isinstance`, `issubclass`. + * \{ */ + +PyDoc_STRVAR(IMB_types_doc, "This module provides access to image buffer types."); + +static struct PyModuleDef IMB_types_module_def = { + PyModuleDef_HEAD_INIT, + "imbuf.types", /* m_name */ + IMB_types_doc, /* m_doc */ + 0, /* m_size */ + NULL, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; + +PyObject *BPyInit_imbuf_types(void) +{ + PyObject *submodule = PyModule_Create(&IMB_types_module_def); + + if (PyType_Ready(&Py_ImBuf_Type) < 0) { + return NULL; + } + + PyModule_AddType(submodule, &Py_ImBuf_Type); return submodule; } From 72370b92be0db6c7726e1b74e73c393ed1d00538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Thu, 25 Feb 2021 02:16:58 +0100 Subject: [PATCH 465/519] Fix T85926: Cycles missing viewport updates when making materials single user This issue seems to be caused by the reallocation flag not being set on the device shader data array so it was never updated on the GPU although the host memory was modified. --- intern/cycles/render/geometry.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index 2c2b987e5c0..9f8bf68dadf 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1585,6 +1585,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro dscene->tri_patch.tag_realloc(); dscene->tri_vnormal.tag_realloc(); dscene->tri_patch_uv.tag_realloc(); + dscene->tri_shader.tag_realloc(); dscene->patches.tag_realloc(); } From 3ed6d9f9662118d80ed1c66c277045cd6a26254c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 12:14:30 +1100 Subject: [PATCH 466/519] Cleanup: use low level edit-object access functions for undo Use OBEDIT_FROM_VIEW_LAYER macro for curve & fonts (matching edit-mesh). While the difference isn't significant at the moment, there are no reason these should be different between undo systems. --- source/blender/editors/curve/editcurve_undo.c | 3 ++- source/blender/editors/curve/editfont_undo.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c index 681f387e83e..61106667d8f 100644 --- a/source/blender/editors/curve/editcurve_undo.c +++ b/source/blender/editors/curve/editcurve_undo.c @@ -173,7 +173,8 @@ static void undocurve_free_data(UndoCurve *uc) static Object *editcurve_object_from_context(bContext *C) { - Object *obedit = CTX_data_edit_object(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer); if (obedit && ELEM(obedit->type, OB_CURVE, OB_SURF)) { Curve *cu = obedit->data; if (BKE_curve_editNurbs_get(cu) != NULL) { diff --git a/source/blender/editors/curve/editfont_undo.c b/source/blender/editors/curve/editfont_undo.c index 88f3ed0582c..8f7eb19dfe8 100644 --- a/source/blender/editors/curve/editfont_undo.c +++ b/source/blender/editors/curve/editfont_undo.c @@ -28,6 +28,7 @@ #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BKE_context.h" #include "BKE_font.h" @@ -314,7 +315,8 @@ static void undofont_free_data(UndoFont *uf) static Object *editfont_object_from_context(bContext *C) { - Object *obedit = CTX_data_edit_object(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer); if (obedit && obedit->type == OB_FONT) { Curve *cu = obedit->data; EditFont *ef = cu->editfont; From 2b60d7d09c51716e8d98834061c1a61ed6b96cf5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 15:38:57 +1100 Subject: [PATCH 467/519] Fix entering edit-mode when object mode and edit-data don't match In rare cases, it's possible for an object to have edit-mode data without it's Object.mode set to edit-mode. This could happen with undo, part of fix for: T85974. --- source/blender/editors/object/object_edit.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 4cf49d262ca..da14d4ef52a 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -718,20 +718,26 @@ bool ED_object_editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag return false; } - /* this checks actual object->data, for cases when other scenes have it in editmode context */ - if (BKE_object_is_in_editmode(ob)) { - return true; - } - if (BKE_object_obdata_is_libdata(ob)) { /* Ideally the caller should check this. */ CLOG_WARN(&LOG, "Unable to enter edit-mode on library data for object '%s'", ob->id.name + 2); return false; } - ob->restore_mode = ob->mode; + if ((ob->mode & OB_MODE_EDIT) == 0) { + ob->restore_mode = ob->mode; - ob->mode = OB_MODE_EDIT; + ob->mode = OB_MODE_EDIT; + } + + /* This checks actual `object->data`, + * for cases when other scenes have it in edit-mode context. + * + * It's important to run this after setting the object's mode (above), since in rare cases + * the object may have the edit-data but not it's object-mode set. See T85974. */ + if (BKE_object_is_in_editmode(ob)) { + return true; + } if (ob->type == OB_MESH) { ok = true; From e301f3422d9922598e0cabf12a4e22eda0ae0880 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 15:43:30 +1100 Subject: [PATCH 468/519] Fix T85974: Edit-mode undo/redo causes assertion Assert the poll function succeeds after setting the active object. --- source/blender/editors/armature/editarmature_undo.c | 6 +++++- source/blender/editors/curve/editcurve_undo.c | 6 +++++- source/blender/editors/lattice/editlattice_undo.c | 6 +++++- source/blender/editors/mesh/editmesh_undo.c | 6 +++++- source/blender/editors/metaball/editmball_undo.c | 9 ++++++++- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/armature/editarmature_undo.c b/source/blender/editors/armature/editarmature_undo.c index 337d1138b23..cbca171d3af 100644 --- a/source/blender/editors/armature/editarmature_undo.c +++ b/source/blender/editors/armature/editarmature_undo.c @@ -37,6 +37,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -190,7 +191,7 @@ static void armature_undosys_step_decode(struct bContext *C, ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(armature_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { ArmatureUndoStep_Elem *elem = &us->elems[i]; @@ -213,6 +214,9 @@ static void armature_undosys_step_decode(struct bContext *C, ED_undo_object_set_active_or_warn( CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + /* Check after setting active. */ + BLI_assert(armature_undosys_poll(C)); + bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c index 61106667d8f..8f7aa786da5 100644 --- a/source/blender/editors/curve/editcurve_undo.c +++ b/source/blender/editors/curve/editcurve_undo.c @@ -36,6 +36,7 @@ #include "BKE_fcurve.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -251,7 +252,7 @@ static void curve_undosys_step_decode(struct bContext *C, ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(curve_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { CurveUndoStep_Elem *elem = &us->elems[i]; @@ -274,6 +275,9 @@ static void curve_undosys_step_decode(struct bContext *C, ED_undo_object_set_active_or_warn( CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + /* Check after setting active. */ + BLI_assert(curve_undosys_poll(C)); + bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); diff --git a/source/blender/editors/lattice/editlattice_undo.c b/source/blender/editors/lattice/editlattice_undo.c index 3ffbc3712fc..94b3dfbfe88 100644 --- a/source/blender/editors/lattice/editlattice_undo.c +++ b/source/blender/editors/lattice/editlattice_undo.c @@ -40,6 +40,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -224,7 +225,7 @@ static void lattice_undosys_step_decode(struct bContext *C, ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(lattice_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { LatticeUndoStep_Elem *elem = &us->elems[i]; @@ -247,6 +248,9 @@ static void lattice_undosys_step_decode(struct bContext *C, ED_undo_object_set_active_or_warn( CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + /* Check after setting active. */ + BLI_assert(lattice_undosys_poll(C)); + bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index cea006f0faa..e46363eafcc 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -39,6 +39,7 @@ #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_mesh.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -778,7 +779,7 @@ static void mesh_undosys_step_decode(struct bContext *C, ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(mesh_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { MeshUndoStep_Elem *elem = &us->elems[i]; @@ -802,6 +803,9 @@ static void mesh_undosys_step_decode(struct bContext *C, ED_undo_object_set_active_or_warn( CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + /* Check after setting active. */ + BLI_assert(mesh_undosys_poll(C)); + Scene *scene = CTX_data_scene(C); scene->toolsettings->selectmode = us->elems[0].data.selectmode; diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c index b817bc3a718..86f67879c5f 100644 --- a/source/blender/editors/metaball/editmball_undo.c +++ b/source/blender/editors/metaball/editmball_undo.c @@ -38,6 +38,7 @@ #include "BKE_context.h" #include "BKE_layer.h" #include "BKE_main.h" +#include "BKE_object.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -199,7 +200,7 @@ static void mball_undosys_step_decode(struct bContext *C, ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); - BLI_assert(mball_undosys_poll(C)); + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); for (uint i = 0; i < us->elems_len; i++) { MBallUndoStep_Elem *elem = &us->elems[i]; @@ -222,6 +223,12 @@ static void mball_undosys_step_decode(struct bContext *C, ED_undo_object_set_active_or_warn( CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + /* Check after setting active. */ + + BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); + + BLI_assert(mball_undosys_poll(C)); + bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); From b073e59d4e0de2a22c0a15ded1df4d29c0fa7a8e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 16:08:48 +1100 Subject: [PATCH 469/519] Fix T85975: Edit-mode undo/redo removes overlays Setting the active object when decoding undo steps missed a call to ED_object_base_active_refresh. --- source/blender/editors/armature/editarmature_undo.c | 2 +- source/blender/editors/curve/editcurve_undo.c | 2 +- source/blender/editors/include/ED_undo.h | 3 ++- source/blender/editors/lattice/editlattice_undo.c | 2 +- source/blender/editors/mesh/editmesh_undo.c | 2 +- source/blender/editors/metaball/editmball_undo.c | 2 +- source/blender/editors/undo/ed_undo.c | 7 +++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/armature/editarmature_undo.c b/source/blender/editors/armature/editarmature_undo.c index cbca171d3af..3768de96340 100644 --- a/source/blender/editors/armature/editarmature_undo.c +++ b/source/blender/editors/armature/editarmature_undo.c @@ -212,7 +212,7 @@ static void armature_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ BLI_assert(armature_undosys_poll(C)); diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c index 8f7aa786da5..48666821732 100644 --- a/source/blender/editors/curve/editcurve_undo.c +++ b/source/blender/editors/curve/editcurve_undo.c @@ -273,7 +273,7 @@ static void curve_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ BLI_assert(curve_undosys_poll(C)); diff --git a/source/blender/editors/include/ED_undo.h b/source/blender/editors/include/ED_undo.h index 7b643e7c764..ed1ec96a13f 100644 --- a/source/blender/editors/include/ED_undo.h +++ b/source/blender/editors/include/ED_undo.h @@ -76,7 +76,8 @@ struct Base **ED_undo_editmode_bases_from_view_layer(struct ViewLayer *view_laye struct UndoStack *ED_undo_stack_get(void); /* helpers */ -void ED_undo_object_set_active_or_warn(struct ViewLayer *view_layer, +void ED_undo_object_set_active_or_warn(struct Scene *scene, + struct ViewLayer *view_layer, struct Object *ob, const char *info, struct CLG_LogRef *log); diff --git a/source/blender/editors/lattice/editlattice_undo.c b/source/blender/editors/lattice/editlattice_undo.c index 94b3dfbfe88..2a6edc3249f 100644 --- a/source/blender/editors/lattice/editlattice_undo.c +++ b/source/blender/editors/lattice/editlattice_undo.c @@ -246,7 +246,7 @@ static void lattice_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ BLI_assert(lattice_undosys_poll(C)); diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index e46363eafcc..67816f069f6 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -801,7 +801,7 @@ static void mesh_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ BLI_assert(mesh_undosys_poll(C)); diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c index 86f67879c5f..170d25e5a16 100644 --- a/source/blender/editors/metaball/editmball_undo.c +++ b/source/blender/editors/metaball/editmball_undo.c @@ -221,7 +221,7 @@ static void mball_undosys_step_decode(struct bContext *C, /* The first element is always active */ ED_undo_object_set_active_or_warn( - CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); + CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index baa178a6a94..2e5d233f207 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -846,16 +846,15 @@ void ED_OT_undo_history(wmOperatorType *ot) /** \name Undo Helper Functions * \{ */ -void ED_undo_object_set_active_or_warn(ViewLayer *view_layer, - Object *ob, - const char *info, - CLG_LogRef *log) +void ED_undo_object_set_active_or_warn( + Scene *scene, ViewLayer *view_layer, Object *ob, const char *info, CLG_LogRef *log) { Object *ob_prev = OBACT(view_layer); if (ob_prev != ob) { Base *base = BKE_view_layer_base_find(view_layer, ob); if (base != NULL) { view_layer->basact = base; + ED_object_base_active_refresh(G_MAIN, scene, view_layer); } else { /* Should never fail, may not crash but can give odd behavior. */ From 94dc6ceaa78c360de9e3e9403b6f1fb73400aad0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 16:33:55 +1100 Subject: [PATCH 470/519] Cleanup: remove assert left in by accident, outdated comment --- source/blender/editors/metaball/editmball_undo.c | 3 --- source/blender/editors/screen/screendump.c | 1 - 2 files changed, 4 deletions(-) diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c index 170d25e5a16..457c5330595 100644 --- a/source/blender/editors/metaball/editmball_undo.c +++ b/source/blender/editors/metaball/editmball_undo.c @@ -224,9 +224,6 @@ static void mball_undosys_step_decode(struct bContext *C, CTX_data_scene(C), CTX_data_view_layer(C), us->elems[0].obedit_ref.ptr, us_p->name, &LOG); /* Check after setting active. */ - - BLI_assert(BKE_object_is_in_editmode(us->elems[0].obedit_ref.ptr)); - BLI_assert(mball_undosys_poll(C)); bmain->is_memfile_undo_flush_needed = true; diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 7d7a3340dc3..ff0dab7f1c7 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -229,7 +229,6 @@ static bool screenshot_poll(bContext *C) void SCREEN_OT_screenshot(wmOperatorType *ot) { - /* weak: opname starting with 'save' makes filewindow give save-over */ ot->name = "Save Screenshot"; ot->idname = "SCREEN_OT_screenshot"; ot->description = "Capture a picture of the active area or whole Blender window"; From 0e1c6a29cbb21476d6913a592fb12e29bf700b43 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Feb 2021 16:34:27 +1100 Subject: [PATCH 471/519] Cleanup: spelling --- .../blender/blenkernel/intern/mesh_boolean_convert.cc | 11 +++++++---- source/blender/blenlib/intern/mesh_boolean.cc | 6 ++++-- .../engines/workbench/workbench_effect_antialiasing.c | 2 +- source/blender/editors/space_file/space_file.c | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index 4b47294e61a..299b1ff1c71 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -446,7 +446,8 @@ static void copy_edge_attributes(Mesh *dest_mesh, } } -/* For Imesh face `f`, with corresponding output Mesh poly `mp`, +/** + * For #IMesh face `f`, with corresponding output Mesh poly `mp`, * where the original Mesh poly is `orig_mp`, coming from the Mesh * `orig_me`, which has index `orig_me_index` in `mim`: * fill in the `orig_loops` Array with corresponding indices of MLoops from `orig_me` @@ -472,7 +473,7 @@ static int fill_orig_loops(const Face *f, * that is the same as one in orig_me (after correcting for offset in mim meshes). * Then see that loop and any subsequent ones have the same start and end vertex. * This may miss some cases of partial alignment, but that's OK since discovering - * aligned loops is only an optimization to avoid some reinterpolation. + * aligned loops is only an optimization to avoid some re-interpolation. */ int first_orig_v = f->vert[0]->orig; if (first_orig_v == NO_INDEX) { @@ -758,8 +759,10 @@ static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim) return result; } -/* Do Exact Boolean directly, without a round trip through BMesh. - * The Mesh operands are in `meshes`, with corresponding transfprms in in `obmats`. */ +/** + * Do Exact Boolean directly, without a round trip through #BMesh. + * The Mesh operands are in `meshes`, with corresponding transforms in in `obmats`. + */ static Mesh *direct_mesh_boolean(const Mesh **meshes, const float (*obmats[])[4][4], const int meshes_len, diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index fffa37b935b..37205ecef41 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -2605,8 +2605,10 @@ static int find_cdt_edge(const CDT_result &cdt_out, int v1, int v2) return -1; } -/* Return the original edge id for the cdt output edge e_out, given that - * the only input to CDT was face f. Pick the first, if there are several. */ +/** + * Return the original edge id for the CDT output edge e_out, given that + * the only input to CDT was face f. Pick the first, if there are several. + */ static int orig_edge_for_cdt_edge(const CDT_result &cdt_out, int cdt_e_out, const Face *f) diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c index 07121519ef4..10a782c9987 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c @@ -70,7 +70,7 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num) /* move jitter table so that closest sample is in center */ sub_v2_v2(table[index], closest_sample); for (int i = 0; i < 2; i++) { - /* Avoid samples outside range (wrap arround). */ + /* Avoid samples outside range (wrap around). */ table[index][i] = fmodf(table[index][i] + 0.5f, 1.0f); /* Recenter the distribution[-1..1]. */ table[index][i] = table[index][i] * 2.0f - 1.0f; diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index 66d24c7ab53..b175844a710 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -558,7 +558,7 @@ static void file_main_region_draw(const bContext *C, ARegion *region) v2d->keepofs |= V2D_LOCKOFS_Y; /* XXX this happens on scaling down Screen (like from startup.blend) */ - /* view2d has no type specific for filewindow case, which doesn't scroll vertically */ + /* view2d has no type specific for file-window case, which doesn't scroll vertically. */ if (v2d->cur.ymax < 0) { v2d->cur.ymin -= v2d->cur.ymax; v2d->cur.ymax = 0; From de25b79ff5c4da7d2d604eaa33b8c520c246679b Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 10:17:31 +0100 Subject: [PATCH 472/519] Refactor: IDTypeInfo: Add `owner_get` to get owner of embedded IDs. This concerns currently only collections (`master_collection` of scenes) and root node trees. It removes the matching type-specific helpers (`BKE_collection_master_scene_search` and `BKE_node_tree_find_owner_ID`). No functional change expected here. NOTE: Current implementation of `owner_get` is far from optimal, we could probably do it better, see {T69169}. NOTE: While it could also have it, shapekeys IDTypeInfo was left out of this change for now. Mainly because it sould not be used currently, and we ultimately want to demote shape keys from ID status anyway. --- source/blender/blenkernel/BKE_collection.h | 2 - source/blender/blenkernel/BKE_idtype.h | 7 +++ source/blender/blenkernel/BKE_node.h | 1 - source/blender/blenkernel/intern/action.c | 1 + source/blender/blenkernel/intern/armature.c | 1 + source/blender/blenkernel/intern/brush.c | 1 + source/blender/blenkernel/intern/cachefile.c | 1 + source/blender/blenkernel/intern/camera.c | 1 + source/blender/blenkernel/intern/collection.c | 34 +++++++----- source/blender/blenkernel/intern/curve.c | 1 + source/blender/blenkernel/intern/font.c | 1 + source/blender/blenkernel/intern/gpencil.c | 1 + source/blender/blenkernel/intern/hair.c | 1 + source/blender/blenkernel/intern/image.c | 1 + source/blender/blenkernel/intern/ipo.c | 1 + source/blender/blenkernel/intern/key.c | 1 + source/blender/blenkernel/intern/lattice.c | 1 + source/blender/blenkernel/intern/library.c | 1 + source/blender/blenkernel/intern/light.c | 1 + source/blender/blenkernel/intern/lightprobe.c | 1 + source/blender/blenkernel/intern/linestyle.c | 1 + source/blender/blenkernel/intern/mask.c | 1 + source/blender/blenkernel/intern/material.c | 1 + source/blender/blenkernel/intern/mball.c | 1 + source/blender/blenkernel/intern/mesh.c | 1 + source/blender/blenkernel/intern/movieclip.c | 1 + source/blender/blenkernel/intern/node.cc | 53 +++++++++++-------- source/blender/blenkernel/intern/object.c | 1 + source/blender/blenkernel/intern/paint.c | 2 + source/blender/blenkernel/intern/particle.c | 1 + .../blender/blenkernel/intern/pointcloud.cc | 1 + source/blender/blenkernel/intern/scene.c | 1 + source/blender/blenkernel/intern/screen.c | 1 + .../blender/blenkernel/intern/simulation.cc | 1 + source/blender/blenkernel/intern/sound.c | 1 + source/blender/blenkernel/intern/speaker.c | 1 + source/blender/blenkernel/intern/text.c | 1 + source/blender/blenkernel/intern/texture.c | 1 + source/blender/blenkernel/intern/volume.cc | 1 + source/blender/blenkernel/intern/workspace.c | 1 + source/blender/blenkernel/intern/world.c | 1 + .../space_outliner/outliner_collections.c | 28 +++++++--- source/blender/makesrna/intern/rna_access.c | 39 +++++++------- source/blender/windowmanager/intern/wm.c | 1 + 44 files changed, 138 insertions(+), 64 deletions(-) diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index f35dafa15a8..d15aebfe03d 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -77,8 +77,6 @@ struct Collection *BKE_collection_duplicate(struct Main *bmain, /* Master Collection for Scene */ struct Collection *BKE_collection_master_add(void); -struct Scene *BKE_collection_master_scene_search(const struct Main *bmain, - const struct Collection *master_collection); /* Collection Objects */ diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h index edfc96f3059..4578f1c3ca5 100644 --- a/source/blender/blenkernel/BKE_idtype.h +++ b/source/blender/blenkernel/BKE_idtype.h @@ -95,6 +95,8 @@ typedef void (*IDTypeForeachCacheFunction)(struct ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data); +typedef struct ID *(*IDTypeEmbeddedOwnerGetFunction)(struct Main *bmain, struct ID *id); + typedef void (*IDTypeBlendWriteFunction)(struct BlendWriter *writer, struct ID *id, const void *id_address); @@ -181,6 +183,11 @@ typedef struct IDTypeInfo { */ IDTypeForeachCacheFunction foreach_cache; + /** + * For embedded IDs, return their owner ID. + */ + IDTypeEmbeddedOwnerGetFunction owner_get; + /* ********** Callbacks for reading and writing .blend files. ********** */ /** diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 8652adecaf9..76d5eb945bb 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -442,7 +442,6 @@ struct bNodeTree *ntreeCopyTree(struct Main *bmain, const struct bNodeTree *ntre struct bNodeTree **BKE_ntree_ptr_from_id(struct ID *id); struct bNodeTree *ntreeFromID(struct ID *id); -struct ID *BKE_node_tree_find_owner_ID(struct Main *bmain, struct bNodeTree *ntree); void ntreeFreeLocalNode(struct bNodeTree *ntree, struct bNode *node); void ntreeFreeLocalTree(struct bNodeTree *ntree); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 94680dc5c0c..06b8bd5f0f2 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -303,6 +303,7 @@ IDTypeInfo IDType_ID_AC = { .make_local = NULL, .foreach_id = action_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = action_blend_write, .blend_read_data = action_blend_read_data, diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index a59ead84aca..83aab758f86 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -324,6 +324,7 @@ IDTypeInfo IDType_ID_AR = { .make_local = NULL, .foreach_id = armature_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = armature_blend_write, .blend_read_data = armature_blend_read_data, diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 59ff59b82e0..13ba1957a32 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -403,6 +403,7 @@ IDTypeInfo IDType_ID_BR = { .make_local = brush_make_local, .foreach_id = brush_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = brush_blend_write, .blend_read_data = brush_blend_read_data, diff --git a/source/blender/blenkernel/intern/cachefile.c b/source/blender/blenkernel/intern/cachefile.c index 1e2139522f1..d233022fd3f 100644 --- a/source/blender/blenkernel/intern/cachefile.c +++ b/source/blender/blenkernel/intern/cachefile.c @@ -135,6 +135,7 @@ IDTypeInfo IDType_ID_CF = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = cache_file_blend_write, .blend_read_data = cache_file_blend_read_data, diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index b0e3743add1..bab9e2a5592 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -196,6 +196,7 @@ IDTypeInfo IDType_ID_CA = { .make_local = camera_make_local, .foreach_id = camera_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = camera_blend_write, .blend_read_data = camera_blend_read_data, diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index dd0572f9b12..28b91dcc8ce 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -172,6 +172,26 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) } } +static ID *collection_owner_get(Main *bmain, ID *id) +{ + if ((id->flag & LIB_EMBEDDED_DATA) == 0) { + return id; + } + BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); + + Collection *master_collection = (Collection *)id; + BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); + + for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { + if (scene->master_collection == master_collection) { + return &scene->id; + } + } + + BLI_assert(!"Embedded collection with no owner. Critical Main inconsistency."); + return NULL; +} + void BKE_collection_blend_write_nolib(BlendWriter *writer, Collection *collection) { BKE_id_blend_write(writer, &collection->id); @@ -355,6 +375,7 @@ IDTypeInfo IDType_ID_GR = { .make_local = NULL, .foreach_id = collection_foreach_id, .foreach_cache = NULL, + .owner_get = collection_owner_get, .blend_write = collection_blend_write, .blend_read_data = collection_blend_read_data, @@ -839,19 +860,6 @@ Collection *BKE_collection_master_add() return master_collection; } -Scene *BKE_collection_master_scene_search(const Main *bmain, const Collection *master_collection) -{ - BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); - - for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) { - if (scene->master_collection == master_collection) { - return scene; - } - } - - return NULL; -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index f4485b2565e..f3551c98f07 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -320,6 +320,7 @@ IDTypeInfo IDType_ID_CU = { .make_local = NULL, .foreach_id = curve_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = curve_blend_write, .blend_read_data = curve_blend_read_data, diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 25a0259abe3..febc9e24c9f 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -169,6 +169,7 @@ IDTypeInfo IDType_ID_VF = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = vfont_blend_write, .blend_read_data = vfont_blend_read_data, diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 28477e9dc30..00dcaad83db 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -322,6 +322,7 @@ IDTypeInfo IDType_ID_GD = { .make_local = NULL, .foreach_id = greasepencil_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = greasepencil_blend_write, .blend_read_data = greasepencil_blend_read_data, diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c index f76e5a73478..2894d6daf23 100644 --- a/source/blender/blenkernel/intern/hair.c +++ b/source/blender/blenkernel/intern/hair.c @@ -190,6 +190,7 @@ IDTypeInfo IDType_ID_HA = { .make_local = NULL, .foreach_id = hair_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = hair_blend_write, .blend_read_data = hair_blend_read_data, diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 10f15519ea4..368b1c2e66b 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -331,6 +331,7 @@ IDTypeInfo IDType_ID_IM = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = image_foreach_cache, + .owner_get = NULL, .blend_write = image_blend_write, .blend_read_data = image_blend_read_data, diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index d43a0cb3813..bdc763cf4ca 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -193,6 +193,7 @@ IDTypeInfo IDType_ID_IP = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = NULL, .blend_read_data = ipo_blend_read_data, diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 540337b84b3..f2893e162cb 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -216,6 +216,7 @@ IDTypeInfo IDType_ID_KE = { .make_local = NULL, .foreach_id = shapekey_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, /* Could have one actually? */ .blend_write = shapekey_blend_write, .blend_read_data = shapekey_blend_read_data, diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 625d2353e3e..678bd94b68b 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -198,6 +198,7 @@ IDTypeInfo IDType_ID_LT = { .make_local = NULL, .foreach_id = lattice_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = lattice_blend_write, .blend_read_data = lattice_blend_read_data, diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index d2f1196d804..677b9497c98 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -77,6 +77,7 @@ IDTypeInfo IDType_ID_LI = { .make_local = NULL, .foreach_id = library_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = NULL, .blend_read_data = NULL, diff --git a/source/blender/blenkernel/intern/light.c b/source/blender/blenkernel/intern/light.c index 4a2afb7f5e6..d91d80ac683 100644 --- a/source/blender/blenkernel/intern/light.c +++ b/source/blender/blenkernel/intern/light.c @@ -202,6 +202,7 @@ IDTypeInfo IDType_ID_LA = { .make_local = NULL, .foreach_id = light_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = light_blend_write, .blend_read_data = light_blend_read_data, diff --git a/source/blender/blenkernel/intern/lightprobe.c b/source/blender/blenkernel/intern/lightprobe.c index 4ef3b8c3237..d872ecf7578 100644 --- a/source/blender/blenkernel/intern/lightprobe.c +++ b/source/blender/blenkernel/intern/lightprobe.c @@ -100,6 +100,7 @@ IDTypeInfo IDType_ID_LP = { .make_local = NULL, .foreach_id = lightprobe_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = lightprobe_blend_write, .blend_read_data = lightprobe_blend_read_data, diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index 283e2a94732..26d9ab7a8c7 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -760,6 +760,7 @@ IDTypeInfo IDType_ID_LS = { .make_local = NULL, .foreach_id = linestyle_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = linestyle_blend_write, .blend_read_data = linestyle_blend_read_data, diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index 83d9449934c..3a3ad9ef051 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -263,6 +263,7 @@ IDTypeInfo IDType_ID_MSK = { .make_local = NULL, .foreach_id = mask_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = mask_blend_write, .blend_read_data = mask_blend_read_data, diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 70906065347..37d47a984cc 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -267,6 +267,7 @@ IDTypeInfo IDType_ID_MA = { .make_local = NULL, .foreach_id = material_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = material_blend_write, .blend_read_data = material_blend_read_data, diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 849c7ef57fb..6bef11dea76 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -197,6 +197,7 @@ IDTypeInfo IDType_ID_MB = { .make_local = NULL, .foreach_id = metaball_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = metaball_blend_write, .blend_read_data = metaball_blend_read_data, diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index c15484f8e72..e7a16463d87 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -357,6 +357,7 @@ IDTypeInfo IDType_ID_ME = { .make_local = NULL, .foreach_id = mesh_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = mesh_blend_write, .blend_read_data = mesh_blend_read_data, diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 0265e1c8b2c..017a73593ee 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -355,6 +355,7 @@ IDTypeInfo IDType_ID_MC = { .make_local = NULL, .foreach_id = movie_clip_foreach_id, .foreach_cache = movie_clip_foreach_cache, + .owner_get = NULL, .blend_write = movieclip_blend_write, .blend_read_data = movieclip_blend_read_data, diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index b96adce7cca..58003c03f8c 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -367,6 +367,35 @@ static void node_foreach_cache(ID *id, } } +static ID *node_owner_get(Main *bmain, ID *id) +{ + if ((id->flag & LIB_EMBEDDED_DATA) == 0) { + return id; + } + BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); + + ListBase *lists[] = {&bmain->materials, + &bmain->lights, + &bmain->worlds, + &bmain->textures, + &bmain->scenes, + &bmain->linestyles, + &bmain->simulations, + nullptr}; + + bNodeTree *ntree = (bNodeTree *)id; + for (int i = 0; lists[i] != nullptr; i++) { + LISTBASE_FOREACH (ID *, id_iter, lists[i]) { + if (ntreeFromID(id_iter) == ntree) { + return id_iter; + } + } + } + + BLI_assert(!"Embedded node tree with no owner. Critical Main inconsistency."); + return nullptr; +} + static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock) { if (sock->default_value == nullptr) { @@ -916,6 +945,7 @@ IDTypeInfo IDType_ID_NT = { /* make_local */ nullptr, /* foreach_id */ node_foreach_id, /* foreach_cache */ node_foreach_cache, + /* owner_get */ node_owner_get, /* blend_write */ ntree_blend_write, /* blend_read_data */ ntree_blend_read_data, @@ -2980,29 +3010,6 @@ bNodeTree *ntreeFromID(ID *id) return (nodetree != nullptr) ? *nodetree : nullptr; } -/* Finds and returns the datablock that privately owns the given tree, or null. */ -ID *BKE_node_tree_find_owner_ID(Main *bmain, struct bNodeTree *ntree) -{ - ListBase *lists[] = {&bmain->materials, - &bmain->lights, - &bmain->worlds, - &bmain->textures, - &bmain->scenes, - &bmain->linestyles, - &bmain->simulations, - nullptr}; - - for (int i = 0; lists[i] != nullptr; i++) { - LISTBASE_FOREACH (ID *, id, lists[i]) { - if (ntreeFromID(id) == ntree) { - return id; - } - } - } - - return nullptr; -} - bool ntreeNodeExists(const bNodeTree *ntree, const bNode *testnode) { LISTBASE_FOREACH (const bNode *, node, &ntree->nodes) { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 04071282a52..704d6d1cf4f 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1148,6 +1148,7 @@ IDTypeInfo IDType_ID_OB = { .make_local = object_make_local, .foreach_id = object_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = object_blend_write, .blend_read_data = object_blend_read_data, diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 3c770a85b2a..d8fb2edb36d 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -151,6 +151,7 @@ IDTypeInfo IDType_ID_PAL = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = palette_blend_write, .blend_read_data = palette_blend_read_data, @@ -216,6 +217,7 @@ IDTypeInfo IDType_ID_PC = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = paint_curve_blend_write, .blend_read_data = paint_curve_blend_read_data, diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 21d1e070389..acda59ce96c 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -504,6 +504,7 @@ IDTypeInfo IDType_ID_PA = { .make_local = NULL, .foreach_id = particle_settings_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = particle_settings_blend_write, .blend_read_data = particle_settings_blend_read_data, diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc index b9ff2a1179d..d9a7a376e2e 100644 --- a/source/blender/blenkernel/intern/pointcloud.cc +++ b/source/blender/blenkernel/intern/pointcloud.cc @@ -183,6 +183,7 @@ IDTypeInfo IDType_ID_PT = { /* make_local */ nullptr, /* foreach_id */ pointcloud_foreach_id, /* foreach_cache */ nullptr, + /* owner_get */ nullptr, /* blend_write */ pointcloud_blend_write, /* blend_read_data */ pointcloud_blend_read_data, diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index c7279dbc815..3633dff8690 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1718,6 +1718,7 @@ IDTypeInfo IDType_ID_SCE = { .make_local = NULL, .foreach_id = scene_foreach_id, .foreach_cache = scene_foreach_cache, + .owner_get = NULL, .blend_write = scene_blend_write, .blend_read_data = scene_blend_read_data, diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index df239b0c4ee..07619466bc5 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -311,6 +311,7 @@ IDTypeInfo IDType_ID_SCR = { .make_local = NULL, .foreach_id = screen_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = screen_blend_write, /* Cannot be used yet, because #direct_link_screen has a return value. */ diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc index 4e0a08455e6..6b46804c251 100644 --- a/source/blender/blenkernel/intern/simulation.cc +++ b/source/blender/blenkernel/intern/simulation.cc @@ -166,6 +166,7 @@ IDTypeInfo IDType_ID_SIM = { /* make_local */ nullptr, /* foreach_id */ simulation_foreach_id, /* foreach_cache */ nullptr, + /* owner_get */ nullptr, /* blend_write */ simulation_blend_write, /* blend_read_data */ simulation_blend_read_data, diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 0c917434bd1..a33fedb3ea6 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -214,6 +214,7 @@ IDTypeInfo IDType_ID_SO = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = sound_foreach_cache, + .owner_get = NULL, .blend_write = sound_blend_write, .blend_read_data = sound_blend_read_data, diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c index 9caeaf05e6a..af9b2268879 100644 --- a/source/blender/blenkernel/intern/speaker.c +++ b/source/blender/blenkernel/intern/speaker.c @@ -107,6 +107,7 @@ IDTypeInfo IDType_ID_SPK = { .make_local = NULL, .foreach_id = speaker_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = speaker_blend_write, .blend_read_data = speaker_blend_read_data, diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 9bf215515f7..43d587861a5 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -251,6 +251,7 @@ IDTypeInfo IDType_ID_TXT = { .make_local = NULL, .foreach_id = NULL, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = text_blend_write, .blend_read_data = text_blend_read_data, diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index ce84bfcd95a..29c41b88135 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -219,6 +219,7 @@ IDTypeInfo IDType_ID_TE = { .make_local = NULL, .foreach_id = texture_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = texture_blend_write, .blend_read_data = texture_blend_read_data, diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index edf40ab3861..9b5231f7d6f 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -637,6 +637,7 @@ IDTypeInfo IDType_ID_VO = { /* make_local */ nullptr, /* foreach_id */ volume_foreach_id, /* foreach_cache */ volume_foreach_cache, + /* owner_get */ nullptr, /* blend_write */ volume_blend_write, /* blend_read_data */ volume_blend_read_data, diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index 5a101cf009b..481d190952f 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -185,6 +185,7 @@ IDTypeInfo IDType_ID_WS = { .make_local = NULL, .foreach_id = workspace_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = workspace_blend_write, .blend_read_data = workspace_blend_read_data, diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index a2ce37a5d90..e889d8af1d5 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -199,6 +199,7 @@ IDTypeInfo IDType_ID_WO = { .make_local = NULL, .foreach_id = world_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = world_blend_write, .blend_read_data = world_blend_read_data, diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index e686648038d..0afc26e0d8a 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -28,6 +28,7 @@ #include "BKE_collection.h" #include "BKE_context.h" +#include "BKE_idtype.h" #include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" @@ -361,8 +362,14 @@ void outliner_collection_delete( break; } if (parent->flag & COLLECTION_IS_MASTER) { - Scene *parent_scene = BKE_collection_master_scene_search(bmain, parent); - if (ID_IS_LINKED(parent_scene)) { + BLI_assert(parent->id.flag & LIB_EMBEDDED_DATA); + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(&parent->id); + BLI_assert(id_type->owner_get != NULL); + + ID *scene_owner = id_type->owner_get(bmain, &parent->id); + BLI_assert(GS(scene_owner->name) == ID_SCE); + if (ID_IS_LINKED(scene_owner)) { skip = true; break; } @@ -592,11 +599,18 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) scene->master_collection; } else if (parent != NULL && (parent->flag & COLLECTION_IS_MASTER) != 0) { - Scene *scene = BKE_collection_master_scene_search(bmain, parent); - BLI_assert(scene != NULL); - if (ID_IS_LINKED(scene) || ID_IS_OVERRIDE_LIBRARY(scene)) { - scene = CTX_data_scene(C); - parent = ID_IS_LINKED(scene) ? NULL : scene->master_collection; + BLI_assert(parent->id.flag & LIB_EMBEDDED_DATA); + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(&parent->id); + BLI_assert(id_type->owner_get != NULL); + + Scene *scene_owner = (Scene *)id_type->owner_get(bmain, &parent->id); + BLI_assert(scene_owner != NULL); + BLI_assert(GS(scene_owner->id.name) == ID_SCE); + + if (ID_IS_LINKED(scene_owner) || ID_IS_OVERRIDE_LIBRARY(scene_owner)) { + scene_owner = CTX_data_scene(C); + parent = ID_IS_LINKED(scene_owner) ? NULL : scene_owner->master_collection; } } diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index d8c91cb2923..c5dd516d16e 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -5826,26 +5826,29 @@ ID *RNA_find_real_ID_and_path(Main *bmain, ID *id, const char **r_path) *r_path = ""; } - if ((id != NULL) && (id->flag & LIB_EMBEDDED_DATA)) { - switch (GS(id->name)) { - case ID_NT: - if (r_path) { - *r_path = "node_tree"; - } - return BKE_node_tree_find_owner_ID(bmain, (bNodeTree *)id); - case ID_GR: - if (r_path) { - *r_path = "collection"; - } - return (ID *)BKE_collection_master_scene_search(bmain, (struct Collection *)id); - - default: - return NULL; - } - } - else { + if ((id == NULL) || (id->flag & LIB_EMBEDDED_DATA) == 0) { return id; } + + const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id); + if (r_path) { + switch (GS(id->name)) { + case ID_NT: + *r_path = "node_tree"; + break; + case ID_GR: + *r_path = "collection"; + break; + default: + BLI_assert(!"Missing handling of embedded id type."); + } + } + + if (id_type->owner_get == NULL) { + BLI_assert(!"Missing handling of embedded id type."); + return id; + } + return id_type->owner_get(bmain, id); } static char *rna_prepend_real_ID_path(Main *bmain, ID *id, char *path, ID **r_real_id) diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index b43357b1462..a9c0d1dd8fe 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -272,6 +272,7 @@ IDTypeInfo IDType_ID_WM = { .make_local = NULL, .foreach_id = window_manager_foreach_id, .foreach_cache = NULL, + .owner_get = NULL, .blend_write = window_manager_blend_write, .blend_read_data = window_manager_blend_read_data, From adf1525171668b07a858e06982e8fae750716c3d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 11:50:38 +0100 Subject: [PATCH 473/519] install_deps: bump python version to 3.9.2. Also bump exlusive maximal version to 3.11, since 3.10 is now supported. Re T85365. --- build_files/build_environment/install_deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 8ae08fa0c9c..1cff996e924 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -376,10 +376,10 @@ USE_CXX11=true CLANG_FORMAT_VERSION_MIN="6.0" CLANG_FORMAT_VERSION_MAX="10.0" -PYTHON_VERSION="3.9.1" +PYTHON_VERSION="3.9.2" PYTHON_VERSION_SHORT="3.9" PYTHON_VERSION_MIN="3.7" -PYTHON_VERSION_MAX="3.10" +PYTHON_VERSION_MAX="3.11" PYTHON_VERSION_INSTALLED=$PYTHON_VERSION_SHORT PYTHON_FORCE_BUILD=false PYTHON_FORCE_REBUILD=false From 59c1029e200967314d6f50b4834ca9dd0c2f9bf3 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 11:56:14 +0100 Subject: [PATCH 474/519] install_deps: bump USD version to 21.02. Should have been part of D10367/rBa923a34de19c, but for some reasons it did not make it into final commit... Re T85365. --- build_files/build_environment/install_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 1cff996e924..259a0bd0c33 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -526,10 +526,10 @@ ALEMBIC_FORCE_BUILD=false ALEMBIC_FORCE_REBUILD=false ALEMBIC_SKIP=false -USD_VERSION="20.08" -USD_VERSION_SHORT="20.08" +USD_VERSION="21.02" +USD_VERSION_SHORT="21.02" USD_VERSION_MIN="20.05" -USD_VERSION_MAX="21.00" +USD_VERSION_MAX="22.00" USD_FORCE_BUILD=false USD_FORCE_REBUILD=false USD_SKIP=false From cccdd6626db9e8a1a4c1ecfffc7eefccb4e2c68b Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 25 Feb 2021 09:16:48 -0300 Subject: [PATCH 475/519] PyAPI Docs: Add 'gpu.state' module Also exclude `gpu.shader` from quick tests. --- doc/python_api/sphinx_doc_gen.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 9eeab6d82bc..973bc3a33e2 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -252,6 +252,8 @@ else: "gpu.types", "gpu.matrix", "gpu.select", + "gpu.shader", + "gpu.state", "gpu_extras", "idprop.types", "mathutils", @@ -1983,6 +1985,7 @@ def write_rst_importable_modules(basepath): "gpu.matrix": "GPU Matrix", "gpu.select": "GPU Select", "gpu.shader": "GPU Shader", + "gpu.state": "GPU State", "bmesh": "BMesh Module", "bmesh.ops": "BMesh Operators", "bmesh.types": "BMesh Types", From ae581f9445a2bb9980a5aeb205d591b642562fa4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 00:09:39 +1100 Subject: [PATCH 476/519] Fix T85976: Outliner crash deleting collection with multiple windows --- source/blender/editors/space_outliner/space_outliner.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 5fde6e381e0..419713035b6 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -395,7 +395,7 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl) return (SpaceLink *)space_outliner_new; } -static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id) +static void outliner_id_remap(ScrArea *area, SpaceLink *slink, ID *old_id, ID *new_id) { SpaceOutliner *space_outliner = (SpaceOutliner *)slink; @@ -427,6 +427,13 @@ static void outliner_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_i /* rebuild hash table, because it depends on ids too */ /* postpone a full rebuild because this can be called many times on-free */ space_outliner->storeflag |= SO_TREESTORE_REBUILD; + + if (new_id == NULL) { + /* Redraw is needed when removing data for multiple outlines show the same data. + * without this, the stale data won't get fully flushed when this outliner + * is not the active outliner the user is interacting with. See T85976. */ + ED_area_tag_redraw(area); + } } } } From bcd369c3c12e48dd2be544fbd3ebed2ce8b4c1fb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 25 Feb 2021 15:02:38 +0100 Subject: [PATCH 477/519] Fix macOS SSE support not detected correctly after recent changes Due to moving the code the test binary was incorrectly compiled with OpenMP flags. Move setting of the OpenMP flags to the appropriate place. --- CMakeLists.txt | 1 + build_files/cmake/platform/platform_apple.cmake | 2 +- build_files/cmake/platform/platform_win32.cmake | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b8d68a60f0..24201ae6869 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1215,6 +1215,7 @@ if(WITH_OPENMP) if(NOT WITH_OPENMP_STATIC) string(APPEND CMAKE_C_FLAGS " ${OpenMP_C_FLAGS}") string(APPEND CMAKE_CXX_FLAGS " ${OpenMP_CXX_FLAGS}") + string(APPEND CMAKE_EXE_LINKER_FLAGS " ${OpenMP_LINKER_FLAGS}") else() # Typically avoid adding flags as defines but we can't # pass OpenMP flags to the linker for static builds, meaning diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 31302bf1100..6e6c75c85f0 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -410,7 +410,7 @@ if(WITH_OPENMP) set(OPENMP_FOUND ON) set(OpenMP_C_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") - string(APPEND CMAKE_EXE_LINKER_FLAGS " -L'${LIBDIR}/openmp/lib' -lomp") + set(OpenMP_LINKER_FLAGS "-L'${LIBDIR}/openmp/lib' -lomp") # Copy libomp.dylib to allow executables like datatoc and tests to work. # `@executable_path/../Resources/lib/` is a default dylib search path. diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index e1cc1219249..acd6028e2ae 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -49,7 +49,7 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(NOT EXISTS "${CLANG_OPENMP_DLL}") message(FATAL_ERROR "Clang OpenMP library (${CLANG_OPENMP_DLL}) not found.") endif() - string(APPEND CMAKE_EXE_LINKER_FLAGS " \"${CLANG_OPENMP_LIB}\"") + set(OpenMP_LINKER_FLAGS "\"${CLANG_OPENMP_LIB}\"") endif() if(WITH_WINDOWS_STRIPPED_PDB) message(WARNING "stripped pdb not supported with clang, disabling..") From 626a8e0f10ef90415c3811567b789168484c0b88 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 25 Feb 2021 08:20:02 -0600 Subject: [PATCH 478/519] Fix T85979: Attribute missing warning with empty geometry An error doesn't make sense in these situations because we don't expect to find attributes on empty geometry, and an empty geometry set is a valid situation. Note that we can't use `component.is_empty` here, because often the component is visually "empty" but still has a point cloud with no points or a mesh with no vertices. --- source/blender/nodes/intern/node_geometry_exec.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index 532f9955a62..a2e0a4dd6a4 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -75,8 +75,9 @@ ReadAttributePtr GeoNodeExecParams::get_input_attribute(const StringRef name, } /* If the attribute doesn't exist, use the default value and output an error message - * (except when the field is empty, to avoid spamming error messages). */ - if (!name.empty()) { + * (except when the field is empty, to avoid spamming error messages, and not when + * the domain is empty and we don't expect an attribute anyway). */ + if (!name.empty() && component.attribute_domain_size(domain) != 0) { this->error_message_add(NodeWarningType::Error, std::string("No attribute with name '") + name + "'."); } From 400f2e4be67b8db1b85cacdcc21ca4c2d7bda2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 25 Feb 2021 15:04:17 +0100 Subject: [PATCH 479/519] Fix T85959 EEVEE: DOF with "Jitter Camera" broken Was caused by recent changes in window_translate_m4 by rBbb2af40ec7dd. --- source/blender/draw/engines/eevee/eevee_temporal_sampling.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 97bbf37a07e..e30f5d52d56 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -186,7 +186,7 @@ void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const dou sub_v2_v2v2(jitter_scaled, jitter_scaled, center); add_v2_v2(viewmat[3], jitter_scaled); - window_translate_m4(winmat, persmat, dof_jitter[0], dof_jitter[1]); + window_translate_m4(winmat, persmat, -dof_jitter[0], -dof_jitter[1]); } } From 35df354e4aa4b1c848dfa0e1d80951e103caacea Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 25 Feb 2021 16:55:08 +0100 Subject: [PATCH 480/519] Cleanup: quiet warning "loop variable 'item' is always a copy because the range of type ..." --- source/blender/blenkernel/intern/attribute_access.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 2146dc805d1..8974190d0e3 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -1221,7 +1221,7 @@ class VertexGroupsAttributeProvider final : public DynamicAttributesProvider { { BLI_assert(component.type() == GeometryComponentType::Mesh); const MeshComponent &mesh_component = static_cast(component); - for (const auto &item : mesh_component.vertex_group_names().items()) { + for (const auto item : mesh_component.vertex_group_names().items()) { const StringRefNull name = item.key; const int vertex_group_index = item.value; if (vertex_group_index >= 0) { From f908ff1ccdfb0133e1797877363f063b9daa696c Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 25 Feb 2021 17:17:45 +0100 Subject: [PATCH 481/519] BLI: simplify adding an arbitrary value to a resource container With this is becomes easily possible to store a lambda in a resource collector so that it will be freed when the resource collector is freed. --- source/blender/blenlib/BLI_resource_collector.hh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/blenlib/BLI_resource_collector.hh b/source/blender/blenlib/BLI_resource_collector.hh index 20180f3b2c9..ecae9b8c682 100644 --- a/source/blender/blenlib/BLI_resource_collector.hh +++ b/source/blender/blenlib/BLI_resource_collector.hh @@ -107,6 +107,15 @@ class ResourceCollector : NonCopyable, NonMovable { m_resources.append(data); } + /** + * Construct an object with the same value in the ResourceCollector and return a reference to the + * new value. + */ + template T &add_value(T &&value, const char *name) + { + return this->construct(name, std::forward(value)); + } + /** * Returns a reference to a linear allocator that is owned by the ResourcesCollector. Memory * allocated through this allocator will be freed when the collector is destructed. From 6daff9a08e79546a28a24a6306d9f067e7f7fa59 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 25 Feb 2021 10:28:39 -0600 Subject: [PATCH 482/519] UI: Fix icon width and padding in search menus Previously the padding size and the width saved for the icon were constant regardless of the zoom level. This resulted in overlapping icons and text, and ugly padding with more extreme zoom levels. We can retrieve the size of the row from the `rect` argument. --- source/blender/editors/interface/interface_widgets.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 5c59d0edeb5..0fa5999976b 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -5237,8 +5237,9 @@ void ui_draw_menu_item(const uiFontStyle *fstyle, { uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM); const rcti _rect = *rect; + const int row_height = BLI_rcti_size_y(rect); int max_hint_width = INT_MAX; - int padding = 0.25f * UI_UNIT_X; + int padding = 0.25f * row_height; char *cpoin = NULL; wt->state(wt, state, 0, UI_EMBOSS_UNDEFINED); @@ -5249,7 +5250,7 @@ void ui_draw_menu_item(const uiFontStyle *fstyle, /* text location offset */ rect->xmin += padding; if (iconid) { - rect->xmin += UI_DPI_ICON_SIZE; + rect->xmin += row_height; /* Use square area for icon. */ } /* cut string in 2 parts? */ From b958a59c791f3f3ecd9039886b85920f0b12548c Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 12:37:31 +0100 Subject: [PATCH 483/519] BKE_lib_query: Add a function to detect and tag all unused IDs. With the option to detect orphaned data recursively (i.e. if ID `a` is the only user of ID `b`, and ID `a` is unused, ID `b` will also get tagged as unused). To be used by the Purge operation. --- source/blender/blenkernel/BKE_lib_query.h | 7 + source/blender/blenkernel/intern/lib_query.c | 133 +++++++++++++++++++ 2 files changed, 140 insertions(+) diff --git a/source/blender/blenkernel/BKE_lib_query.h b/source/blender/blenkernel/BKE_lib_query.h index bdda5bb0372..f064d03261d 100644 --- a/source/blender/blenkernel/BKE_lib_query.h +++ b/source/blender/blenkernel/BKE_lib_query.h @@ -175,6 +175,13 @@ void BKE_library_ID_test_usages(struct Main *bmain, bool *is_used_local, bool *is_used_linked); +void BKE_lib_query_unused_ids_tag(struct Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + const bool do_tag_recursive, + int *r_num_tagged); + void BKE_library_unused_linked_data_set_tag(struct Main *bmain, const bool do_init_tag); void BKE_library_indirectly_used_data_tag_clear(struct Main *bmain); diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c index 1fd51544ba7..eaf1e2d46e6 100644 --- a/source/blender/blenkernel/intern/lib_query.c +++ b/source/blender/blenkernel/intern/lib_query.c @@ -599,6 +599,139 @@ void BKE_library_ID_test_usages(Main *bmain, void *idv, bool *is_used_local, boo } /* ***** IDs usages.checking/tagging. ***** */ +static void lib_query_unused_ids_tag_recurse(Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + ID *id, + int *r_num_tagged) +{ + /* We should never deal with embedded, not-in-main IDs here. */ + BLI_assert((id->flag & LIB_EMBEDDED_DATA) == 0); + + if ((!do_linked_ids && ID_IS_LINKED(id)) || (!do_local_ids && !ID_IS_LINKED(id))) { + return; + } + + MainIDRelationsEntry *id_relations = BLI_ghash_lookup(bmain->relations->relations_from_pointers, + id); + if ((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) != 0) { + return; + } + id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; + + if ((id->tag & tag) != 0) { + return; + } + + if ((id->flag & LIB_FAKEUSER) != 0) { + /* This ID is forcefully kept around, and therefore never unused, no need to check it further. + */ + return; + } + + if (ELEM(GS(id->name), ID_WM, ID_WS, ID_SCE, ID_SCR, ID_LI)) { + /* Some 'root' ID types are never unused (even though they may not have actual users), unless + * their actual usercount is set to 0. */ + return; + } + + /* An ID user is 'valid' (i.e. may affect the 'used'/'not used' status of the ID it uses) if it + * does not match `ignored_usages`, and does match `required_usages`. */ + const int ignored_usages = (IDWALK_CB_LOOPBACK | IDWALK_CB_EMBEDDED); + const int required_usages = (IDWALK_CB_USER | IDWALK_CB_USER_ONE); + + /* This ID may be tagged as unused if none of its users are 'valid', as defined above. + * + * First recursively check all its valid users, if all of them can be tagged as + * unused, then we can tag this ID as such too. */ + bool has_valid_from_users = false; + for (MainIDRelationsEntryItem *id_from_item = id_relations->from_ids; id_from_item != NULL; + id_from_item = id_from_item->next) { + if ((id_from_item->usage_flag & ignored_usages) != 0 || + (id_from_item->usage_flag & required_usages) == 0) { + continue; + } + + ID *id_from = id_from_item->id_pointer.from; + if ((id_from->flag & LIB_EMBEDDED_DATA) != 0) { + /* Directly 'by-pass' to actual real ID owner. */ + const IDTypeInfo *type_info_from = BKE_idtype_get_info_from_id(id_from); + BLI_assert(type_info_from->owner_get != NULL); + id_from = type_info_from->owner_get(bmain, id_from); + } + + lib_query_unused_ids_tag_recurse( + bmain, tag, do_local_ids, do_linked_ids, id_from, r_num_tagged); + if ((id_from->tag & tag) == 0) { + has_valid_from_users = true; + break; + } + } + if (!has_valid_from_users) { + /* This ID has no 'valid' users, tag it as unused. */ + id->tag |= tag; + if (r_num_tagged != NULL) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } + } +} + +/** + * Tag all unused IDs (a.k.a 'orphaned'). + * + * By default only tag IDs with `0` user count. + * If `do_tag_recursive` is set, it will check dependencies to detect all IDs that are not actually + * used in current file, including 'archipelagoes` (i.e. set of IDs referencing each other in + * loops, but without any 'external' valid usages. + * + * Valid usages here are defined as ref-counting usages, which are not towards embedded or + * loop-back data. + * + * \param r_num_tagged If non-NULL, must be a zero-initialized array of #INDEX_ID_MAX integers. + * Number of tagged-as-unused IDs is then set for each type, and as total in + * #INDEX_ID_NULL item. + */ +void BKE_lib_query_unused_ids_tag(Main *bmain, + const int tag, + const bool do_local_ids, + const bool do_linked_ids, + const bool do_tag_recursive, + int *r_num_tagged) +{ + /* First loop, to only check for immediatly unused IDs (those with 0 user count). + * NOTE: It also takes care of clearing given tag for used IDs. */ + ID *id; + FOREACH_MAIN_ID_BEGIN (bmain, id) { + if ((!do_linked_ids && ID_IS_LINKED(id)) || (!do_local_ids && !ID_IS_LINKED(id))) { + id->tag &= ~tag; + } + else if (id->us == 0) { + id->tag |= tag; + if (r_num_tagged != NULL) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } + } + else { + id->tag &= ~tag; + } + } + FOREACH_MAIN_ID_END; + + if (!do_tag_recursive) { + return; + } + + BKE_main_relations_create(bmain, 0); + FOREACH_MAIN_ID_BEGIN (bmain, id) { + lib_query_unused_ids_tag_recurse(bmain, tag, do_local_ids, do_linked_ids, id, r_num_tagged); + } + FOREACH_MAIN_ID_END; + BKE_main_relations_free(bmain); +} + static int foreach_libblock_used_linked_data_tag_clear_cb(LibraryIDLinkCallbackData *cb_data) { ID *self_id = cb_data->id_self; From 1df6cd67a15235baececea0d75739c68747a725c Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 15:48:28 +0100 Subject: [PATCH 484/519] Fix (unreported) bad usercount handling in batch ID deletion. This was rather obscure and non-critical issue, but in some cases ID usercount of some deleted IDs from batch-deletion code would not be properly nullified, which would then assert later in actual deletion code. --- source/blender/blenkernel/intern/lib_id_delete.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c index 8075660dcd1..7c5032c97f4 100644 --- a/source/blender/blenkernel/intern/lib_id_delete.c +++ b/source/blender/blenkernel/intern/lib_id_delete.c @@ -305,13 +305,16 @@ static size_t id_delete(Main *bmain, const bool do_tagged_deletion) /* Since we removed ID from Main, * we also need to unlink its own other IDs usages ourself. */ BKE_libblock_relink_ex(bmain, id, NULL, NULL, 0); - /* Now we can safely mark that ID as not being in Main database anymore. */ - id->tag |= LIB_TAG_NO_MAIN; - /* This is needed because we may not have remapped usages - * of that ID by other deleted ones. */ - // id->us = 0; /* Is it actually? */ } } + + /* Now we can safely mark that ID as not being in Main database anymore. */ + /* NOTE: This needs to be done in a separate loop than above, otherwise some usercounts of + * deleted IDs may not be properly decreased by the remappings (since `NO_MAIN` ID usercounts + * is never affected). */ + for (ID *id = tagged_deleted_ids.first; id; id = id->next) { + id->tag |= LIB_TAG_NO_MAIN; + } } else { /* First tag all datablocks directly from target lib. From ec4d412c9c7bcb579104bf1286ed98aa9927e86e Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 17:33:11 +0100 Subject: [PATCH 485/519] Py API: update `bpy.data.orphans_purge` to support new options. This API function can now purge recursively in a single call, and choose to ignore (not purge) local or linked IDs. Default behavior (with not argument) remains unchanged, so no API breackage here. --- .../python/intern/bpy_rna_id_collection.c | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/source/blender/python/intern/bpy_rna_id_collection.c b/source/blender/python/intern/bpy_rna_id_collection.c index bf6eba93b9f..d4127b26629 100644 --- a/source/blender/python/intern/bpy_rna_id_collection.c +++ b/source/blender/python/intern/bpy_rna_id_collection.c @@ -304,7 +304,7 @@ static PyObject *bpy_batch_remove(PyObject *UNUSED(self), PyObject *args, PyObje PyObject *ret = NULL; static const char *_keywords[] = {"ids", NULL}; - static _PyArg_Parser _parser = {"O:user_map", _keywords, 0}; + static _PyArg_Parser _parser = {"O:batch_remove", _keywords, 0}; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &ids)) { return ret; } @@ -353,12 +353,15 @@ PyDoc_STRVAR(bpy_orphans_purge_doc, "\n" " Remove (delete) all IDs with no user.\n" "\n" - " :return: The number of deleted IDs.\n" - "\n" - " WARNING: Considered experimental feature currently.\n"); -static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), - PyObject *UNUSED(args), - PyObject *UNUSED(kwds)) + " :arg do_local_ids: Include unused local IDs in the deletion, defaults to True\n" + " :type do_local_ids: bool, optional\n" + " :arg do_linked_ids: Include unused linked IDs in the deletion, defaults to True\n" + " :type do_linked_ids: bool, optional\n" + " :arg do_recursive: Recursively check for unused IDs, ensuring no orphaned one " + "remain after a single run of that function, defaults to False\n" + " :type do_recursive: bool, optional\n" + " :return: The number of deleted IDs.\n"); +static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), PyObject *args, PyObject *kwds) { #if 0 /* If someone knows how to get a proper 'self' in that case... */ BPy_StructRNA *pyrna = (BPy_StructRNA *)self; @@ -367,16 +370,26 @@ static PyObject *bpy_orphans_purge(PyObject *UNUSED(self), Main *bmain = G_MAIN; /* XXX Ugly, but should work! */ #endif - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - if (id->us == 0) { - id->tag |= LIB_TAG_DOIT; - } - else { - id->tag &= ~LIB_TAG_DOIT; - } + int num_tagged[INDEX_ID_MAX] = {0}; + + bool do_local_ids = true; + bool do_linked_ids = true; + bool do_recursive_cleanup = false; + + static const char *_keywords[] = {"do_local_ids", "do_linked_ids", "do_recursive", NULL}; + static _PyArg_Parser _parser = {"|$ppp:orphans_purge", _keywords, 0}; + if (!_PyArg_ParseTupleAndKeywordsFast( + args, kwds, &_parser, &do_local_ids, &do_linked_ids, &do_recursive_cleanup)) { + return NULL; + } + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); + + if (num_tagged[INDEX_ID_NULL] == 0) { + return PyLong_FromSize_t(0); } - FOREACH_MAIN_ID_END; const size_t num_datablocks_deleted = BKE_id_multi_tagged_delete(bmain); /* Force full redraw, mandatory to avoid crashes when running this from UI... */ From 2718ea80d26274464051c50bb12fb82c4a6571ea Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 25 Feb 2021 17:43:14 +0100 Subject: [PATCH 486/519] Improve Purge operator. The Purge operator to remove unused IDs can now also remove 'indirectly unused' data-blocks (those only used by unused ones, recursively). It can also now only operate on linked, or on local data. All those options are exposed in the `File -> Cleanup` main menu. The behavior of the `Purge` button in the Outliner remains unchanged, needs some UI/UX design task for that. --- release/scripts/startup/bl_ui/space_topbar.py | 29 ++++++++- .../editors/space_outliner/outliner_edit.c | 65 +++++++++++-------- 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 255b6326416..45460a1a5de 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -248,7 +248,34 @@ class TOPBAR_MT_file_cleanup(Menu): layout = self.layout layout.separator() - layout.operator("outliner.orphans_purge", text="Unused Data-Blocks") + op_props = layout.operator("outliner.orphans_purge", text="Unused Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = True + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = True + op_props.do_recursive = True + + layout.separator() + op_props = layout.operator("outliner.orphans_purge", text="Unused Linked Data-Blocks") + op_props.do_local_ids = False + op_props.do_linked_ids = True + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Linked Data-Blocks") + op_props.do_local_ids = False + op_props.do_linked_ids = True + op_props.do_recursive = True + + layout.separator() + op_props = layout.operator("outliner.orphans_purge", text="Unused Local Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = False + op_props.do_recursive = False + op_props = layout.operator("outliner.orphans_purge", text="Recursive Unused Local Data-Blocks") + op_props.do_local_ids = True + op_props.do_linked_ids = False + op_props.do_recursive = True class TOPBAR_MT_file(Menu): diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 7df8e9e1de4..d1260f02c67 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -2267,29 +2267,19 @@ static bool ed_operator_outliner_id_orphans_active(bContext *C) /** \} */ -static void outliner_orphans_purge_tag(ID *id, int *num_tagged) -{ - if (id->us == 0) { - id->tag |= LIB_TAG_DOIT; - num_tagged[INDEX_ID_NULL]++; - num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; - } - else { - id->tag &= ~LIB_TAG_DOIT; - } -} - static int outliner_orphans_purge_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(evt)) { Main *bmain = CTX_data_main(C); int num_tagged[INDEX_ID_MAX] = {0}; - /* Tag all IDs having zero users. */ - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - outliner_orphans_purge_tag(id, num_tagged); - } - FOREACH_MAIN_ID_END; + const bool do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); + const bool do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); + const bool do_recursive_cleanup = RNA_boolean_get(op->ptr, "do_recursive"); + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); + RNA_int_set(op->ptr, "num_deleted", num_tagged[INDEX_ID_NULL]); if (num_tagged[INDEX_ID_NULL] == 0) { @@ -2298,7 +2288,7 @@ static int outliner_orphans_purge_invoke(bContext *C, wmOperator *op, const wmEv } DynStr *dyn_str = BLI_dynstr_new(); - BLI_dynstr_append(dyn_str, "Purging unused data-blocks ("); + BLI_dynstr_appendf(dyn_str, "Purging %d unused data-blocks (", num_tagged[INDEX_ID_NULL]); bool is_first = true; for (int i = 0; i < INDEX_ID_MAX - 2; i++) { if (num_tagged[i] != 0) { @@ -2332,12 +2322,13 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) int num_tagged[INDEX_ID_MAX] = {0}; if ((num_tagged[INDEX_ID_NULL] = RNA_int_get(op->ptr, "num_deleted")) == 0) { - /* Tag all IDs having zero users. */ - ID *id; - FOREACH_MAIN_ID_BEGIN (bmain, id) { - outliner_orphans_purge_tag(id, num_tagged); - } - FOREACH_MAIN_ID_END; + const bool do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); + const bool do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); + const bool do_recursive_cleanup = RNA_boolean_get(op->ptr, "do_recursive"); + + /* Tag all IDs to delete. */ + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); if (num_tagged[INDEX_ID_NULL] == 0) { BKE_report(op->reports, RPT_INFO, "No orphaned data-blocks to purge"); @@ -2359,8 +2350,10 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) } DEG_relations_tag_update(bmain); - WM_event_add_notifier(C, NC_ID | NA_EDITED, NULL); - WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL); + WM_event_add_notifier(C, NC_ID | NA_REMOVED, NULL); + /* Force full redraw of the UI. */ + WM_main_add_notifier(NC_WINDOW, NULL); + return OPERATOR_FINISHED; } @@ -2382,6 +2375,24 @@ void OUTLINER_OT_orphans_purge(wmOperatorType *ot) /* properties */ PropertyRNA *prop = RNA_def_int(ot->srna, "num_deleted", 0, 0, INT_MAX, "", "", 0, INT_MAX); RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); + + RNA_def_boolean(ot->srna, + "do_local_ids", + true, + "Local Data-blocks", + "Include unused local data-blocks into deletion"); + RNA_def_boolean(ot->srna, + "do_linked_ids", + true, + "Linked Data-blocks", + "Include unused linked data-blocks into deletion"); + + RNA_def_boolean(ot->srna, + "do_recursive", + false, + "Recursive Delete", + "Recursively check for indirectly unused data-blocks, ensuring that no orphaned " + "data-blocks remain after execution"); } /** \} */ From 1981f04b0fe4e26c3a46aab3db148c6d8769322b Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 25 Feb 2021 17:39:11 +0100 Subject: [PATCH 487/519] Icons: Resaved blender_icons.svg in new Inkscape version Inkscape often does a number of unrelated changes when saving an SVG, not sure if these are just formatting changes in the source SVG text or if there's more to it. Either way this makes adding new icons hard since you want to avoid these unrelated changes. Saving the file in a new Inkscape version every once in a while should mitigate the problem a bit. Regenerating the icons (e.g. through `make icons`) shows no difference in the output. Note that I also ran "Clean Up Document" in Inkscape, but that doesn't seem to have changed anything/much. --- release/datafiles/blender_icons.svg | 23098 ++++++++++++++++++++------ 1 file changed, 17590 insertions(+), 5508 deletions(-) diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 6fa54c25de2..fe39fae23fe 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -1,5602 +1,17684 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + width="16" + id="rect13372" + style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" /> + + + + - - - - + id="path12946-5" + d="m 221.50195,227 c -0.35971,-0.001 -0.6028,0.36671 -0.46093,0.69727 l 3,7 c 0.18151,0.42185 0.78799,0.39645 0.93359,-0.0391 l 0.91992,-2.76367 2.76367,-0.91992 c 0.43555,-0.1456 0.46095,-0.75208 0.0391,-0.93359 l -7,-3 c -0.0617,-0.0266 -0.12814,-0.0406 -0.19535,-0.041 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + transform="translate(-1.8536743e-6,21.000005)" + id="g12888" + style="display:inline;fill:#ffffff;enable-background:new"> - - + id="path14234" + d="m 241.48438,452 c -0.12717,0.004 -0.248,0.0564 -0.3379,0.14648 l -3,3 c -0.31479,0.315 -0.0918,0.85335 0.35352,0.85352 h 3 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c 1.1e-4,-0.28235 -0.23341,-0.50879 -0.51562,-0.5 z M 243,452 v 5 h -5 v 1.5 c 2e-5,0.1326 0.0527,0.25976 0.14648,0.35352 l 2,2 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 l 2.64648,-2.64649 1.64648,1.64649 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 l 2.64648,-2.64649 0.64648,0.64649 1,1 c 0.315,0.31479 0.85335,0.0918 0.85352,-0.35352 v -6 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 4.49219,9 c -0.12989,0.002 -0.25387,0.0546 -0.34571,0.14648 l -2.64648,2.64649 -1.64648,-1.64649 c -0.19527,-0.19519 -0.51177,-0.19519 -0.70704,0 l -2.64648,2.64649 -1.64648,-1.64649 c -0.315,-0.31479 -0.85335,-0.0918 -0.85352,0.35352 v 2 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 2.00781 9.99219 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -2 c -2e-5,-0.1326 -0.0527,-0.25976 -0.14648,-0.35352 l -1,-1 -1,-1 c -0.0957,-0.0957 -0.22603,-0.14855 -0.36133,-0.14648 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + transform="translate(-21.000002,42.000005)" + id="g13069" + style="display:inline;fill:#ffffff;enable-background:new"> + sodipodi:nodetypes="ccccccccccccccc" /> - + id="path12979" + d="m 283.51562,517 a 0.50005,0.50005 0 0 0 -0.22656,0.0566 c -1.99745,1.00305 -3.4683,2.88412 -4.03515,5.13477 -0.56686,2.25064 -0.17629,4.64784 1.07421,6.56836 a 0.50005,0.50005 0 1 0 0.8379,-0.54493 c -1.09418,-1.68042 -1.44042,-3.798 -0.94141,-5.77929 0.49902,-1.9813 1.78869,-3.62011 3.51367,-4.48633 A 0.50005,0.50005 0 0 0 283.51562,517 Z m 0.98243,3 a 0.50005,0.50005 0 0 0 -0.26758,0.082 c -1.21391,0.77866 -2.01457,2.12204 -2.19336,3.63086 -0.17879,1.50883 0.2812,3.02564 1.26367,4.11719 a 0.50005,0.50005 0 1 0 0.74219,-0.66992 c -0.77619,-0.86237 -1.15757,-2.0993 -1.01172,-3.33008 0.14584,-1.23079 0.79828,-2.30329 1.73828,-2.90625 A 0.50005,0.50005 0 0 0 284.49805,520 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - - - + id="g13340" + transform="translate(336,21.000005)" + style="display:inline;fill:#ffffff;enable-background:new"> + + + + + + - - - - - - - - - - + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - From 16504ed4a21d085b9b1a36360fce0f777beda039 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 25 Feb 2021 17:41:11 +0100 Subject: [PATCH 488/519] Icons: Update blender_icons.svg to have a document background When opening the SVG you wouldn't even see the icons, since they are all white now. You'd always have to set up a document background color and make sure to undo that again before saving the file, so it's not written into it. Just make everyone's life easier by saving the file with a proper background (gray with checkerboard). --- release/datafiles/blender_icons.svg | 28739 +++++++++++++------------- 1 file changed, 14371 insertions(+), 14368 deletions(-) diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index fe39fae23fe..c2671666a47 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -7,18 +7,18 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\ICONS - no backdrop.png" - style="display:inline;enable-background:new" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:docname="blender_icons.svg" - version="1.0" - inkscape:version="1.0 (4035a4f, 2020-05-01)" - sodipodi:version="0.32" - id="svg2" + width="602" height="640" - width="602"> + id="svg2" + sodipodi:version="0.32" + inkscape:version="1.0 (4035a4f, 2020-05-01)" + version="1.0" + sodipodi:docname="blender_icons.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + style="display:inline;enable-background:new" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\ICONS - no backdrop.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -27,256 +27,250 @@ image/svg+xml + + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1792" + inkscape:window-height="968" + id="namedview34335" + showgrid="false" + inkscape:zoom="0.815521" + inkscape:cx="60.911776" + inkscape:cy="331.5525" + inkscape:window-x="-1" + inkscape:window-y="25" + inkscape:window-maximized="0" + inkscape:current-layer="layer2" /> - + + sodipodi:nodetypes="cc" + d="" /> + inkscape:label="grid" + style="display:inline;opacity:0.3" + sodipodi:insensitive="true"> + id="g40174" + transform="translate(0,2)"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - @@ -284,2849 +278,2717 @@ ry="0" rx="0" y="0" - x="443" + x="464" height="7" width="1" - id="rect23030" + id="rect23028" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + + width="1" + height="7" + x="527" + y="0" + rx="0" + ry="0" /> + id="g23711" + transform="translate(0,462)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23719" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23723" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23727" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23731" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23735" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23739" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23743" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23747" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23751" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23755" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23763" + inkscape:connector-curvature="0" /> + id="path10987" + inkscape:connector-curvature="0" /> + id="g23765" + transform="translate(0,441)"> + y="26" + x="0" + height="1" + width="6" + id="rect23767" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path23771" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23775" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23779" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23783" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23787" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23791" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23795" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23799" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23803" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23807" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23811" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23815" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g23819" + transform="translate(0,420)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23827" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23831" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23835" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23839" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23843" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23847" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23851" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23855" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23859" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23863" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23871" + inkscape:connector-curvature="0" /> + id="path10992" + inkscape:connector-curvature="0" /> + id="g23873" + transform="translate(0,399)"> + y="26" + x="0" + height="1" + width="6" + id="rect23875" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path23879" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23883" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23887" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23891" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23895" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23899" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23903" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23907" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23911" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23915" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23919" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23923" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g23927" + transform="translate(0,378)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23935" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23939" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23943" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23947" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23951" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23955" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23959" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23963" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23967" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23971" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23979" + inkscape:connector-curvature="0" /> + id="path10996" + inkscape:connector-curvature="0" /> + id="g23981" + transform="translate(0,357)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23989" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23993" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path23997" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24001" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24005" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24009" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24013" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24017" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24021" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24025" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24033" + inkscape:connector-curvature="0" /> + id="path10998" + inkscape:connector-curvature="0" /> + id="g24035" + transform="translate(0,336)"> + y="26" + x="0" + height="1" + width="6" + id="rect24037" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24041" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24045" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24049" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24053" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24057" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24061" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24065" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24069" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24073" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24077" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24081" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24085" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24089" + transform="translate(0,315)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24097" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24101" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24105" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24109" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24113" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24117" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24121" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24125" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24129" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24133" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24141" + inkscape:connector-curvature="0" /> + id="path11002" + inkscape:connector-curvature="0" /> + id="g24143" + transform="translate(0,294)"> + y="26" + x="0" + height="1" + width="6" + id="rect24145" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24149" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24153" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24157" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24161" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24165" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24169" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24173" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24177" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24181" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24185" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24189" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24193" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24197" + transform="translate(0,273)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24205" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24209" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24213" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24217" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24221" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24225" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24229" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24233" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24237" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24241" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24249" + inkscape:connector-curvature="0" /> + id="path11006" + inkscape:connector-curvature="0" /> + id="g24251" + transform="translate(0,252)"> + y="26" + x="0" + height="1" + width="6" + id="rect24253" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24257" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24261" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24265" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24269" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24273" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24277" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24281" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24285" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24289" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24293" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24297" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24301" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24305" + transform="translate(0,231)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24313" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24317" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24321" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24325" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24329" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24333" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24337" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24341" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24345" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24349" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24357" + inkscape:connector-curvature="0" /> + id="path11010" + inkscape:connector-curvature="0" /> + id="g24359" + transform="translate(0,210)"> + y="26" + x="0" + height="1" + width="6" + id="rect24361" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24365" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24369" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24373" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24377" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24381" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24385" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24389" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24393" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24397" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24401" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24405" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24409" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24413" + transform="translate(0,189)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24421" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24425" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24429" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24433" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24437" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24441" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24445" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24449" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24453" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24457" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24465" + inkscape:connector-curvature="0" /> + id="path11014" + inkscape:connector-curvature="0" /> + id="g24467" + transform="translate(0,168)"> + y="26" + x="0" + height="1" + width="6" + id="rect24469" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24473" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24477" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24481" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24485" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24489" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24493" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24497" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24501" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24505" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24509" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24513" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24517" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24521" + transform="translate(0,147)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24529" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24533" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24537" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24541" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24545" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24549" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24553" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24557" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24561" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24565" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24573" + inkscape:connector-curvature="0" /> + id="path11018" + inkscape:connector-curvature="0" /> + id="g24575" + transform="translate(0,126)"> + y="26" + x="0" + height="1" + width="6" + id="rect24577" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24581" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24585" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24589" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24593" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24597" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24601" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24605" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24609" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24613" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24617" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24621" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24625" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g24630" + transform="translate(0,105)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24638" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24642" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24646" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24650" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24654" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24658" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24662" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24666" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24670" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24674" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24682" + inkscape:connector-curvature="0" /> + id="path11022" + inkscape:connector-curvature="0" /> + id="g24684" + transform="translate(0,84)"> + y="26" + x="0" + height="1" + width="6" + id="rect24686" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g24738" + transform="translate(0,63)"> + id="g24742"> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24746" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24750" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24754" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24758" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24762" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24766" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24770" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24774" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24778" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24782" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24786" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24790" + inkscape:connector-curvature="0" /> + id="path11026" + inkscape:connector-curvature="0" /> + id="g24792" + transform="translate(0,42)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24854" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24858" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24862" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24866" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24870" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24874" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24878" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24882" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24886" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24890" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24898" + inkscape:connector-curvature="0" /> + id="path11030" + inkscape:connector-curvature="0" /> + y="26" + x="0" + height="1" + width="6" + id="rect24902" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path24906" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24910" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24914" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24918" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24922" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24926" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24930" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24934" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24938" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24942" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24946" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path24950" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + transform="translate(0,483)" + id="g39833"> + y="26" + x="0" + height="1" + width="6" + id="rect39835" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + id="path39840" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39844" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39848" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39852" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39856" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39860" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39864" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39868" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39872" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39876" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39880" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39884" + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g39892" + transform="translate(0,504)"> + width="6" + height="1" + x="0" + y="26" + rx="0" + ry="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39900" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39904" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39909" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39913" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39917" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39921" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39925" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39929" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39933" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39937" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path39945" + inkscape:connector-curvature="0" /> + id="path39947" + inkscape:connector-curvature="0" /> + transform="translate(0,525)" + id="g39949"> + y="26" + x="0" + height="1" + width="6" + id="rect39951" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> - + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g40005" + transform="translate(0,546)"> + id="g40009"> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40013" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40017" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40021" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40025" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40029" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40033" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40038" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40042" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40046" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40050" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40054" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40058" + inkscape:connector-curvature="0" /> + id="path40060" + inkscape:connector-curvature="0" /> + transform="translate(0,567)" + id="g40062"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40126" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40130" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40134" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40138" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40142" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40146" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40150" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40154" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40158" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40162" + inkscape:connector-curvature="0" /> - - + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path40170" + inkscape:connector-curvature="0" /> + id="path40172" + inkscape:connector-curvature="0" /> + transform="translate(0,633)" + id="g25954"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - @@ -4595,7385 +4589,7454 @@ ry="0" rx="0" y="0" - x="464" + x="485" height="7" width="1" - id="rect26000" + id="rect25998" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + y="0" + x="443" + height="7" + width="1" + id="rect26002" + style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" /> + + id="g30515" + transform="translate(-121.95685,2)"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + width="0" + height="0" + x="217.25" + y="263.5" /> + inkscape:label="sheet layout" + style="display:inline" + sodipodi:insensitive="true"> + id="g28552-1"> + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="path28566-8" + inkscape:connector-curvature="0" /> + id="path28568-2" + inkscape:connector-curvature="0" /> + id="path28570-4" + inkscape:connector-curvature="0" /> + id="path28572-5" + inkscape:connector-curvature="0" /> + id="g28574-5"> + id="path28576-1" + inkscape:connector-curvature="0" /> + id="path28580-1" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path28588-7" + inkscape:connector-curvature="0" /> + id="path28590-6" + inkscape:connector-curvature="0" /> + id="path28592-1" + inkscape:connector-curvature="0" /> + id="path28594-4" + inkscape:connector-curvature="0" /> + id="g28596-2"> + id="path28598-3" + inkscape:connector-curvature="0" /> + id="path28600-2" + inkscape:connector-curvature="0" /> + id="path28602-2" + inkscape:connector-curvature="0" /> + id="path28606-6" + inkscape:connector-curvature="0" /> + id="path28608-8" + inkscape:connector-curvature="0" /> + id="g28610-5"> + id="path28612-7" + inkscape:connector-curvature="0" /> + id="path28614-6" + inkscape:connector-curvature="0" /> + id="path28618-8" + inkscape:connector-curvature="0" /> + id="rect28620-9" + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /> + id="path28622-2" + inkscape:connector-curvature="0" /> + id="path28624-7" + inkscape:connector-curvature="0" /> + id="g28626-9"> + id="path28628-5" + inkscape:connector-curvature="0" /> + id="path28630-4" + inkscape:connector-curvature="0" /> + id="path28634-1" + inkscape:connector-curvature="0" /> + id="path28636-2" + inkscape:connector-curvature="0" /> + id="path28638-3" + inkscape:connector-curvature="0" /> + id="rect28640-3" + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /> + id="path28642-4" + inkscape:connector-curvature="0" /> + id="path28644-1" + inkscape:connector-curvature="0" /> + id="g28646-1"> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path28652-7" + inkscape:connector-curvature="0" /> + id="path28656-2" + inkscape:connector-curvature="0" /> + id="path28660-7" + inkscape:connector-curvature="0" /> + id="path28662-9" + inkscape:connector-curvature="0" /> + id="path28664-3" + inkscape:connector-curvature="0" /> + id="g28666-1"> + id="path28668-9" + inkscape:connector-curvature="0" /> + id="path28670-8" + inkscape:connector-curvature="0" /> + id="path28672-6" + inkscape:connector-curvature="0" /> + id="path28674-5" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path28678-2" + inkscape:connector-curvature="0" /> + id="path28680-8" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path28686-2" + inkscape:connector-curvature="0" /> + id="g28688-4"> + id="path28690-8" + inkscape:connector-curvature="0" /> + id="path28692-6" + inkscape:connector-curvature="0" /> + id="path28694-5" + inkscape:connector-curvature="0" /> + id="path28696-0" + inkscape:connector-curvature="0" /> + id="path28700-0" + inkscape:connector-curvature="0" /> + id="path28702-0" + inkscape:connector-curvature="0" /> + id="path28704-6" + inkscape:connector-curvature="0" /> + id="g28706-1"> + id="path28708-3" + inkscape:connector-curvature="0" /> + id="path28710-8" + inkscape:connector-curvature="0" /> + id="path28712-9" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g28716-4"> + id="path28718-4" + inkscape:connector-curvature="0" /> + id="path28720-6" + inkscape:connector-curvature="0" /> + id="path28722-0" + inkscape:connector-curvature="0" /> + id="path28724-6" + inkscape:connector-curvature="0" /> + id="path28726-6" + inkscape:connector-curvature="0" /> + id="g28728-1"> + id="path28730-8" + inkscape:connector-curvature="0" /> + id="path28732-4" + inkscape:connector-curvature="0" /> + id="path28736-6" + inkscape:connector-curvature="0" /> + id="path28738-3" + inkscape:connector-curvature="0" /> + id="path28740-7" + inkscape:connector-curvature="0" /> + id="path28742-8" + inkscape:connector-curvature="0" /> + id="g28744-8"> + id="path28746-2" + inkscape:connector-curvature="0" /> + id="path28748-9" + inkscape:connector-curvature="0" /> + id="path28750-1" + inkscape:connector-curvature="0" /> + id="path28752-3" + inkscape:connector-curvature="0" /> + id="path28754-5" + inkscape:connector-curvature="0" /> + id="path28756-9" + inkscape:connector-curvature="0" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="g28760-4"> + id="path28764-7" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="rect11044-9" + sodipodi:nodetypes="ccccccccccccccc" + inkscape:connector-curvature="0" /> - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="rect19480-0" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + + + + + + + + + + + + + + + + + id="path19537-6" + d="m 12,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + id="path19539-5" + d="m 33,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 V 2.75 H 35 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + id="path19541-3" + d="m 54,2 v 1 h 2 v 1 h 1 V 2.75 H 56 V 2 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 5 Z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + id="path19543-9" + d="m 75,2 v 3 h 1 1 v 2 h 1 V 3 H 77 V 4 H 76 V 2 Z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path19545-2" + d="m 96,2 v 3 h 1 1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 4.75 H 98 V 4 H 97 V 3 h 2 V 2 h -2 z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path19547-4" + d="m 118,2 v 0.75 h -1 V 6 h 0.75 v 1 h 1.5 V 6 H 120 V 5 h -0.75 V 4 H 118 V 3 h 1.5 V 2 Z m 0,3 h 1 v 1 h -1 z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path19549-6" + d="m 138,2 v 1 h 2 v 1 h -1 v 3 h 1 V 4.25 h 1 V 3 2 Z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path19551-18" + d="m 159.75,2 v 1 h -0.5 v 1 h 0.5 V 5 H 159 v 1 h 0.75 v 1 h 1.5 V 6 H 162 V 5 h -0.75 V 4 h 0.5 V 3 h -0.5 V 2 Z M 160,3 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> - - - - + inkscape:connector-curvature="0" + id="path19553-2" + d="M 180.75,2 V 3 H 180 v 1 h 0.75 V 5 H 182 v 1 h -1.5 V 7 H 182 V 6.25 h 1 V 3 h -0.75 V 2 Z M 181,3 h 1 v 1 h -1 z" + style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="rect11044-9-4" + sodipodi:nodetypes="ccccccccccccccc" + inkscape:connector-curvature="0" /> + id="g6033" + transform="rotate(-90,411.96778,491.48895)"> + width="1" + height="5" + x="522.48798" + y="673.52118" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + sodipodi:nodetypes="ccccccccccccc" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="rect5680" + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" /> + style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" + d="m 267.45673,672.52117 v 0.75 h -1 v 0.25 h -0.25 v 1 h -0.75 v 3 h 0.75 v 1 h 0.25 v 0.25 h 1 v 0.75 h 3 v -0.75 h 1 v -0.25 h 0.25 v -1 h 0.75 v -3 h -0.75 v -1 h -0.25 v -0.25 h -1 v -0.75 z m 0,1 h 3 v 1 h 1 v 3 h -1 v 1 h -3 v -1 h -1 v -3 h 1 z" + id="path5682" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccc" /> + + + + + + + + + + + + + + + style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccc" /> + inkscape:label="2.81" + style="display:inline"> + d="M 61.503909,123 A 6.5039066,6.5039066 0 0 1 55.000003,129.50391 6.5039066,6.5039066 0 0 1 48.496097,123 6.5039066,6.5039066 0 0 1 55.000003,116.4961 6.5039066,6.5039066 0 0 1 61.503909,123 Z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g12492" + transform="translate(20.999999)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /> + id="g12457" + transform="matrix(0.69230791,0,0,0.69230793,-403.07713,196.14887)" + style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.44444394;enable-background:new" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /> + + + - - - - - - + id="g13838" + transform="rotate(90,160.07935,395.5873)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> - - + id="g13835" + transform="matrix(0,1,1,0,205.49208,-205.33334)" + style="fill:#ffffff" /> + + + + + + + + + + + + + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + id="circle21483" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + r="4" + cy="335.5" + cx="493.5" + d="" + inkscape:connector-curvature="0" /> + + - - - - - - - - + style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.15384436;enable-background:new" + id="g22419" + transform="matrix(-0.866668,0,0,0.866668,728.467,163.39943)" /> - - - + style="display:inline;fill:#ffffff;stroke:#666666;enable-background:new" + id="g22765" + transform="translate(29.999999)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="display:inline;fill:#ffffff;enable-background:new" + transform="translate(46.999999,3)" + id="g23484" /> + id="g22604" + transform="translate(420,147)"> - + id="g22557" /> + + + + - - - - + transform="matrix(-1,0,0,1,985.8323,-544.99999)" /> + id="g6085" + style="fill:#ffffff"> - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="M 201.49219,224.99609 A 0.50005,0.50005 0 0 0 201,225.50391 v 3.91992 a 0.50005,0.50005 0 0 0 0.11328,0.40429 0.50005,0.50005 0 0 0 0.0156,0.0195 0.50005,0.50005 0 0 0 0.0176,0.0176 0.50005,0.50005 0 0 0 0.004,0.002 0.50005,0.50005 0 0 0 0.0332,0.0312 0.50005,0.50005 0 0 0 0.004,0.002 0.50005,0.50005 0 0 0 0.39453,0.10352 H 204.5 a 0.50005,0.50005 0 1 0 0,-1 H 202 v -3.5 a 0.50005,0.50005 0 0 0 -0.50781,-0.50782 z" + id="path17274" + inkscape:connector-curvature="0" /> + + + + + + + + + + + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + - + x="26" + y="52" + rx="0.5" + ry="0.5" /> + style="display:inline;opacity:1;fill:#ffffff;enable-background:new" + id="g10711" + transform="translate(598,-637)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 328,368 c -3.86007,0 -7,3.13993 -7,7 0,3.86007 3.13993,7 7,7 3.86007,0 7,-3.13993 7,-7 0,-3.86007 -3.13993,-7 -7,-7 z m 0,1 c 3.31963,0 6,2.68037 6,6 0,3.31963 -2.68037,6 -6,6 -3.31963,0 -6,-2.68037 -6,-6 0,-3.31963 2.68037,-6 6,-6 z" + id="path10721" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + id="path10927" + d="m 10.484375,452 c -0.752,0 -1.4538175,0.239 -2.0234375,0.64453 C 7.5752675,453.27508 7,454.31514 7,455.48438 V 458.5 c 3e-5,0.27537 0.2226769,0.4989 0.4980469,0.5 l 4.0097651,0.008 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 L 12,452.53516 v -0.002 -0.0352 C 11.999,452.22272 11.77534,452.00003 11.5,452 Z M 13,452 v 1 h 1.515625 C 15.900145,453 17,454.09985 17,455.48438 v 8.03124 C 17,464.90014 15.900145,466 14.515625,466 h -4.03125 C 9.099855,466 8,464.90014 8,463.51562 V 460 H 7 v 3.51562 C 7,465.43685 8.563145,467 10.484375,467 h 4.03125 C 16.436855,467 18,465.43686 18,463.51562 v -8.03124 C 18,453.56315 16.436855,452 14.515625,452 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + + + + + + transform="translate(-462.00711,-314.99994)" + id="g10872" + style="display:inline;opacity:1;fill:#ffffff;enable-background:new" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + + + + + + + + + id="g11167" + transform="matrix(0,-1,-1,0,688.99474,-44.97944)" + style="display:inline;fill:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g5614" + style="fill:#ffffff"> + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + transform="translate(-42.000002,21.000005)" + id="g4035-9" + style="display:inline;opacity:1;fill:#ffffff;enable-background:new"> + transform="translate(42.000002,-21.000005)" + id="path4031-4" + inkscape:connector-curvature="0" /> + id="g12132" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + transform="translate(1.8536743e-6,-4.4999696e-6)" + id="path4043-7" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + transform="translate(40.94871,1.10183)" + id="g9896-8" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g5506-8" + transform="translate(-44.000002,63.000005)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 556.57617,409.98047 a 0.55005501,0.55005501 0 0 0 -0.42383,0.18555 c -0.46657,0.51387 -1.20227,1.13094 -1.20312,2.14257 -10e-4,1.1847 0.85571,2.11411 1.94336,2.91797 1.08765,0.80386 2.47935,1.527 3.84765,2.25782 0.44143,0.23577 0.88243,0.47055 1.3086,0.70312 1.11316,0.60746 2.13512,1.2144 2.84375,1.81836 0.70862,0.60396 1.05894,1.15906 1.05859,1.68359 -4e-4,0.48086 -0.32771,1.0064 -0.79492,1.38086 a 0.55027044,0.55027044 0 1 0 0.6875,0.85938 c 0.65297,-0.52334 1.20625,-1.30182 1.20703,-2.23828 6.6e-4,-0.99421 -0.62031,-1.82029 -1.44531,-2.52344 -0.825,-0.70315 -1.89813,-1.32892 -3.03125,-1.94727 -0.43383,-0.23675 -0.87476,-0.47023 -1.31445,-0.70508 -1.37366,-0.73367 -2.73478,-1.45092 -3.71289,-2.17382 -0.97812,-0.72291 -1.49874,-1.40647 -1.49805,-2.03125 3.7e-4,-0.43907 0.39742,-0.83099 0.91797,-1.4043 a 0.55005501,0.55005501 0 0 0 -0.39063,-0.92578 z" + id="path5432-2" + inkscape:connector-curvature="0" /> + + - + transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,706.86353,657.75914)" + style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" + id="g10178-9" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + + + + + + + + + + + + d="m 363.5,431 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 1 a 0.50005,0.50005 0 0 0 0.14648,0.35352 L 368,437.70703 V 441.5 a 0.50005,0.50005 0 0 0 0.14648,0.35352 l 3,3 A 0.50005,0.50005 0 0 0 372,444.5 v -6.79297 l 4.85352,-4.85351 A 0.50005,0.50005 0 0 0 377,432.5 v -1 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 0.5,1 h 12 v 0.29297 l -4.85352,4.85351 A 0.50005,0.50005 0 0 0 371,437.5 v 5.79297 l -2,-2 V 437.5 a 0.50005,0.50005 0 0 0 -0.14648,-0.35352 L 364,432.29297 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + transform="translate(-314.99995,-567)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + height="16" + width="16" + id="rect6732-0" + style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none" /> + id="path6736-8" + inkscape:connector-curvature="0" /> + transform="translate(314.99995,567)" + id="path6744-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsccccccsccccccccc" /> + style="display:inline;opacity:1;fill:#ffffff;enable-background:new" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + style="fill:#ffffff"> + id="path23186-9" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="rect12547-2" + d="m 405,32 v 8 h 14 v -8 z m 2.50781,2 h 8.98438 c 0.67616,-0.0096 0.67616,1.009563 0,1 h -8.98438 c -0.67616,0.0096 -0.67616,-1.009563 0,-1 z m 0,3 h 8.98438 c 0.67616,-0.0096 0.67616,1.009563 0,1 h -8.98438 c -0.67616,0.0096 -0.67616,-1.009563 0,-1 z" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.00000003, 2.00000004;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" + sodipodi:nodetypes="ccccccccccccccc" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 282.56641,35 a 0.50005,0.50005 0 1 0 -0.008,1 l 4.9375,0.03125 a 0.50005,0.50005 0 1 0 0.008,-1 z m 0,2 a 0.50005,0.50005 0 1 0 -0.008,1 l 3.9375,0.03125 a 0.50005,0.50005 0 1 0 0.008,-1 z m 0.004,2 a 0.50006099,0.50006099 0 1 0 -0.0156,1 l 1.9375,0.03125 a 0.50006099,0.50006099 0 1 0 0.0156,-1 z m -0.006,2 a 0.50005,0.50005 0 1 0 -0.004,1 l 5.9375,0.03125 a 0.50005,0.50005 0 1 0 0.004,-1 z" + id="path12623-2" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + id="g12105" + transform="translate(-147.00001,-566.99994)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + + - - - - - - - - - + id="path8043-2" + d="m 470.49414,503 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 H 471.5 c 0.16717,-10e-6 0.32328,-0.0836 0.41602,-0.22266 l 1,-1.5 c 0.0559,-0.0838 0.0852,-0.18249 0.084,-0.2832 l -0.006,-0.5 c -0.003,-0.27384 -0.22614,-0.49413 -0.5,-0.49414 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.3;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" + d="m 115,32 v 2 h 6 v -2 z m 6,2 v 2 h 2 v -2 z m 2,2 v 6 h 2 v -6 z m 0,6 h -2 v 2 h 2 z m -2,2 h -6 v 2 h 6 z m -6,0 v -2 h -2 v 2 z m -2,-2 v -6 h -2 v 6 z m 0,-6 h 2 v -2 h -2 z" + id="rect23113-8" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 27.492188,598.99219 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 9 a 0.50005,0.50005 0 0 0 0.5,0.5 h 13 a 0.50005,0.50005 0 0 0 0.5,-0.49805 L 41,605 l -1,-0.002 -0.0059,2.99414 H 27.992188 v -8 h 8 v 3.5 c 2.9e-5,0.27613 0.223869,0.49997 0.5,0.5 h 4 c 0.44533,-1.7e-4 0.668305,-0.53852 0.353515,-0.85352 l -4,-4 c -0.09376,-0.0938 -0.22116,-0.14439 -0.353515,-0.14453 v -0.002 h -0.0078 z M 35,610 l -2,0.004 v 1.98828 h -2.507812 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 7 c 0.676159,0.01 0.676159,-1.00956 0,-1 H 35 Z" + transform="translate(420.00718,-439.99283)" + id="path7395-0-0" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 53.494141,601.99414 a 0.50005,0.50005 0 0 0 -0.347657,0.85938 l 3.646485,3.64648 -3.646485,3.64648 a 0.50005,0.50005 0 1 0 0.707032,0.70704 l 4,-4 a 0.50005,0.50005 0 0 0 0,-0.70704 l -4,-4 a 0.50005,0.50005 0 0 0 -0.359375,-0.15234 z" + id="path9518-7-7" + inkscape:connector-curvature="0" /> + id="rect4338" + style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /> + + id="g23052" + style="opacity:0.7;fill:#ffffff"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 27,536.90039 v 1.19922 h 0.75 c 0.646429,0 1.301953,0.38 1.880859,1.04297 0.578907,0.66296 1.046871,1.58637 1.289063,2.49023 0.207018,0.77346 1.367174,0.46292 1.160156,-0.31054 -0.287808,-1.07411 -0.818828,-2.13723 -1.544922,-2.96875 -0.726093,-0.83153 -1.681585,-1.45313 -2.785156,-1.45313 z m 13.25,9 c -1.91571,0 -2.93215,0.90502 -3.558594,1.66992 -0.313222,0.38245 -0.555819,0.7142 -0.798828,0.91797 -0.243008,0.20377 -0.458964,0.3125 -0.892578,0.3125 -0.401011,0 -0.71548,-0.20341 -1.054688,-0.64648 -0.339207,-0.44308 -0.639641,-1.1033 -0.878906,-1.79492 -0.238226,-0.80225 -1.442094,-0.38505 -1.132812,0.39257 0.260735,0.7537 0.585301,1.5146 1.058594,2.13282 C 33.46548,549.50298 34.151011,550 35,550 c 0.691386,0 1.25668,-0.25378 1.662109,-0.59375 0.405429,-0.33997 0.678457,-0.73364 0.958985,-1.07617 0.561056,-0.68506 1.044616,-1.23047 2.628906,-1.23047 H 41 v -1.19922 z" + transform="translate(42.000002,-503.9)" + id="path4334" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sodipodi:nodetypes="ccsssssccsssssc" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 218.5,472 a 0.50005,0.50005 0 1 0 0,1 h 3 a 0.50005,0.50005 0 1 0 0,-1 z m -2,2 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 12 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 7 c 0.67616,0.01 0.67616,-1.00956 0,-1 H 217 v -1 h 2.50781 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 477 H 229 v 2.5 c 0,0.525 -0.14815,0.87861 -0.38477,1.11523 C 228.37862,480.85186 228.02499,481 227.5,481 h -1 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2.5 h -4.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 482 h 0.5 c 0.72501,0 1.37138,-0.22683 1.82227,-0.67773 C 229.77315,480.87137 230,480.225 230,479.5 v -3 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 H 224 v -1.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 6 v 1 h -6 z m 4,3 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z" + id="path12120" + inkscape:connector-curvature="0" /> + id="g12136" + transform="translate(21.999998,314.99995)" + style="fill:#ffffff" /> + + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" + d="m 75,599 v 2 h 1 v -2 z m 3,0 v 1 h 2 v -1 z m 4,0 v 2 h 1 v -2 z m -6,3 c -2.197587,0 -4,1.80241 -4,4 0,0.91965 0.327327,1.75942 0.855469,2.4375 l -3.708985,3.70898 a 0.50005001,0.50005001 0 1 0 0.707032,0.70704 L 73.5625,609.14453 C 74.240452,609.67231 75.080704,610 76,610 c 2.197595,0 3.998047,-1.80241 3.998047,-4 0,-2.19759 -1.800452,-4 -3.998047,-4 z m 6,1 v 2 h 1 v -2 z m -6,0.002 c 1.652136,0 3,1.34592 3,2.99805 0,1.65213 -1.347864,3 -3,3 -1.652128,0 -3,-1.34787 -3,-3 0,-1.65214 1.347872,-2.99805 3,-2.99805 z M 82,607 v 2 h 1 v -2 z m -7,4 v 2 h 1 v -2 z m 7,0 v 2 h 1 v -2 z m -4,1 v 1 h 2 v -1 z" + transform="translate(21.000002,20.999995)" + id="rect12197" + inkscape:connector-curvature="0" /> + + id="g5759" + style="fill:#ffffff"> + id="path12148" + d="m 161.5,578 c -3.02272,0 -5.5,2.47726 -5.5,5.5 0,1.3328 0.48165,2.55856 1.2793,3.51367 l -4.13282,4.13281 a 0.50005,0.50005 0 1 0 0.70704,0.70704 l 4.13281,-4.13282 C 158.94144,588.51835 160.1672,589 161.5,589 c 3.02273,0 5.5,-2.47727 5.5,-5.5 0,-3.02274 -2.47727,-5.5 -5.5,-5.5 z m 0,1 c 2.47727,0 4.5,2.02272 4.5,4.5 0,2.47727 -2.02273,4.5 -4.5,4.5 -2.47726,0 -4.5,-2.02273 -4.5,-4.5 0,-2.47728 2.02274,-4.5 4.5,-4.5 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:connector-curvature="0" /> + id="path12161" + d="m 159.5,583 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2.2168 c -2.1e-4,0.14132 0.0594,0.27613 0.16406,0.37109 0.61652,0.55704 1.43526,0.91211 2.33594,0.91211 0.90068,0 1.71942,-0.35507 2.33594,-0.91211 0.10467,-0.095 0.16427,-0.22977 0.16406,-0.37109 V 583.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.97266,6.91992 c -0.2654,0.0146 -0.47303,0.2342 -0.47266,0.5 V 591.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 2 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -1.08008 c -4.1e-4,-0.30465 -0.27082,-0.53814 -0.57227,-0.49414 -0.31225,0.0453 -0.61944,0.0742 -0.92773,0.0742 -0.30829,0 -0.61548,-0.0289 -0.92773,-0.0742 -0.0329,-0.005 -0.0663,-0.007 -0.0996,-0.006 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g12207" + transform="translate(20.999998,4.4999696e-6)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + style="display:inline;fill:#ffffff;enable-background:new" + transform="translate(61.94871,1.10183)" + id="g12200" /> + + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 415.99805,494 c -0.46823,5.5e-4 -0.93866,0.108 -1.3711,0.32422 l -6.83789,3.39453 a 0.50005,0.50005 0 0 0 -0.0273,0.0137 c -2.00082,1.15513 -3.06722,3.4434 -2.66602,5.71875 0.40121,2.27536 2.18559,4.05973 4.46094,4.46094 0.56884,0.1003 1.13889,0.11012 1.69141,0.0352 1.65755,-0.22472 3.1599,-1.20077 4.02734,-2.70313 a 0.50005,0.50005 0 0 0 0.0156,-0.0293 l 3.38476,-6.84179 c 0.57659,-1.15316 0.3761,-2.57898 -0.54687,-3.50196 -0.57687,-0.57686 -1.35049,-0.872 -2.13086,-0.87109 z m 0.3125,1.02539 c 0.41467,0.0623 0.80824,0.24966 1.11133,0.55273 0.60613,0.60614 0.74722,1.57588 0.36132,2.34766 a 0.50005,0.50005 0 0 0 -0.002,0.002 l -3.375,6.82032 c -0.9493,1.63933 -2.81295,2.50814 -4.67578,2.17968 -1.86473,-0.3288 -3.32159,-1.78565 -3.65039,-3.65039 -0.3288,-1.86473 0.54196,-3.7311 2.18164,-4.67773 l 6.81055,-3.38086 a 0.50005,0.50005 0 0 0 0.002,0 c 0.38589,-0.19295 0.82165,-0.25567 1.23633,-0.19336 z m -0.29883,0.9707 c -0.54636,0 -1,0.45364 -1,1 0,0.54636 0.45364,1 1,1 0.54636,0 1,-0.45364 1,-1 0,-0.54636 -0.45364,-1 -1,-1 z m -5.5,3 c -1.92707,0 -3.5,1.57293 -3.5,3.5 0,1.92707 1.57293,3.5 3.5,3.5 1.92707,0 3.5,-1.57293 3.5,-3.5 0,-1.92707 -1.57293,-3.5 -3.5,-3.5 z m 0,1.97461 a 1.4874268,1.5 0 0 1 1.48828,1.5 1.4874268,1.5 0 0 1 -1.48828,1.5 1.4874268,1.5 0 0 1 -1.48828,-1.5 1.4874268,1.5 0 0 1 1.48828,-1.5 z" + transform="rotate(180,422.50583,500.99795)" + id="circle12201" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g13445"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 195.49805,367.99414 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 2 a 0.50005,0.50005 0 0 0 0.5,0.5 h 2 a 0.50005,0.50005 0 0 0 0.5,-0.5 V 370 H 199.5 c 0.67616,0.01 0.67616,-1.00956 0,-1 h -1.50195 v -0.50586 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 11,0 a 0.50005,0.50005 0 0 0 -0.5,0.5 V 369 H 204.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 1.49805 v 0.49414 a 0.50005,0.50005 0 0 0 0.5,0.5 h 2 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -2 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m -10.5,1 h 1 v 1 h -1 z m 11,0 h 1 v 1 h -1 z" + transform="translate(1.8536743e-6,-42.000005)" + id="path14367" + inkscape:connector-curvature="0" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g14422" + transform="translate(-1.8536743e-6,42.000005)"> + + style="opacity:0.6;fill:#ffffff" + id="g13453"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 216.49805,367.99414 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 2 a 0.50005,0.50005 0 0 0 0.5,0.5 h 2 a 0.50005,0.50005 0 0 0 0.5,-0.5 V 370 H 220.5 c 0.67616,0.01 0.67616,-1.00956 0,-1 h -1.50195 v -0.50586 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 11.00976,0 a 0.50005,0.50005 0 0 0 -0.5,0.5 V 369 h -1.5039 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 1.5039 v 0.49414 a 0.50005,0.50005 0 0 0 0.5,0.5 h 2 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -2 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m -10.50976,1 h 1 v 1 h -1 z m 11.00976,0 h 1 v 1 h -1 z" + transform="translate(1.8536743e-6,-42.000005)" + id="path14421" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="fill:#ffffff"> + transform="translate(760.99456,-488.99997)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + id="g13364" + style="fill:#ffffff"> + id="path13362" + inkscape:connector-curvature="0" /> - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + id="g14433" + transform="rotate(-90,380.52904,134)"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 390.04688,140.46484 a 0.50005,0.50005 0 0 0 -0.41797,0.20704 l -2.95508,3.93945 a 0.50005,0.50005 0 0 0 -0.01,0.70703 l 2.96485,3.95312 a 0.50019216,0.50019216 0 1 0 0.80078,-0.5996 l -2.40039,-3.20118 h 7.1914 l -0.63867,1.27735 a 0.50005635,0.50005635 0 1 0 0.89453,0.44726 l 0.96875,-1.93554 a 0.50005,0.50005 0 0 0 -0.006,-0.58399 l -0.96289,-1.92773 a 0.50005635,0.50005635 0 1 0 -0.89453,0.44726 l 0.63867,1.27539 h -7.1914 l 2.40039,-3.19922 a 0.50005,0.50005 0 0 0 -0.38281,-0.80664 z" + id="path17796-5" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 348.5,120 c -1.47879,0 -2.81353,0.43206 -3.80469,1.06641 C 343.70416,121.70075 343,122.54357 343,123.5 c 0,1.02778 0.79097,1.88608 1.87891,2.49805 1.08228,0.60878 2.52394,0.99597 4.09765,1 0.0129,9.4e-4 3.75669,0.27336 6.02344,-2.21094 V 127.5 a 0.50005,0.50005 0 1 0 1,0 v -4 a 0.50005,0.50005 0 0 0 -0.5,-0.5 h -4.25 a 0.50005,0.50005 0 1 0 0,1 h 3.10156 c -1.87731,2.16501 -5.32031,2 -5.32031,2 A 0.50005,0.50005 0 0 0 349,126 c -1.41667,0 -2.71684,-0.36001 -3.62891,-0.87305 C 344.45903,124.61392 344,123.97222 344,123.5 c 0,-0.41012 0.41561,-1.06779 1.23438,-1.5918 C 346.05313,121.38419 347.21846,121 348.5,121 a 0.50005,0.50005 0 1 0 0,-1 z" + id="path18766-5" + inkscape:connector-curvature="0" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g12950" + transform="translate(-42.000002,4.4999696e-6)"> + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 206.5,115.99219 c -1.39025,0 -2.5,1.19177 -2.5,2.61523 V 120.5 a 0.50004994,0.50004994 0 1 0 1,0 v -1.89258 c 0,-0.91233 0.68117,-1.61523 1.5,-1.61523 0.81884,0 1.5,0.70289 1.5,1.61523 V 120.5 a 0.50004994,0.50004994 0 1 0 1,0 v -1.89258 c 0,-1.42345 -1.10974,-2.61523 -2.5,-2.61523 z m -2.00781,9 A 0.50004994,0.50004994 0 0 0 204,125.5 v 1.88477 c 0,1.42346 1.10975,2.61523 2.5,2.61523 1.39026,0 2.5,-1.19178 2.5,-2.61523 V 125.5 a 0.50004994,0.50004994 0 1 0 -1,0 v 1.88477 c 0,0.91234 -0.68116,1.61523 -1.5,1.61523 -0.81883,0 -1.5,-0.7029 -1.5,-1.61523 V 125.5 a 0.50004994,0.50004994 0 0 0 -0.50781,-0.50781 z" + transform="translate(42.000002,-4.4999696e-6)" + id="path12537-3" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + id="path10907" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + sodipodi:nodetypes="cccccccc" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g20257" + transform="translate(171,5.7999696e-6)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + id="g20817" + style="fill:#ffffff" /> - - - - - - - - - - + transform="translate(-189,168)" + id="g21028"> + id="path21020" + d="m 342.5,348 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 3 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 3 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:nodetypes="ccccccccc" /> + + + + + + sodipodi:nodetypes="cccccccccsccccccccc" /> + + + + + + - - - - - - - + id="g19653" + transform="translate(-628,42.000005)"> + - - - - - - - - - - - + style="display:inline;fill:#ffffff;enable-background:new" + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + transform="translate(418,-4.7064591e-6)" + id="g19647" /> + id="path20483" + d="m 75.999998,620 c -3.860077,0 -7,3.13991 -7,7 0,3.86009 3.139924,7 7,7 3.860076,0 7,-3.13991 7,-7 0,-3.86009 -3.139923,-7 -7,-7 z m 2.990234,2.98633 a 1.0001,1.0001 0 0 1 0.716797,1.7207 L 77.41406,627 l 2.292969,2.29297 a 1.0001,1.0001 0 1 1 -1.414062,1.41406 l -2.292969,-2.29297 -2.292969,2.29297 a 1.0001,1.0001 0 1 1 -1.414062,-1.41406 L 74.585936,627 72.292967,624.70703 a 1.0001,1.0001 0 0 1 0.697265,-1.7168 1.0001,1.0001 0 0 1 0.716797,0.30274 l 2.292969,2.29297 2.292969,-2.29297 a 1.0001,1.0001 0 0 1 0.697265,-0.30664 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - - - - - - - + transform="translate(-1.8536743e-6,3.4999696e-6)" + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + id="g20495" + style="display:inline;opacity:1;fill:#ffffff;enable-background:new"> + transform="translate(-189,588)" + id="g20491" + style="fill:#ffffff" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transform="translate(-168,20.999995)" + id="path22458" + inkscape:connector-curvature="0" /> + id="rect22466" + inkscape:connector-curvature="0" /> + id="g22745"> + style="fill:#ffffff"> + id="g22751" + style="fill:#ffffff"> - + + id="path22747" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccc" /> - - - - - - - - - - - - - - - - - - + id="g21947" + transform="matrix(-1,0,0,1,67.986641,-20.999995)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g22083" + transform="translate(-1.8536743e-6,-42.000055)"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 205.49805,242 -3.00586,0.008 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 4 5 4 a 0.50005,0.50005 0 0 0 0.5,0.5 h 3 a 0.50005,0.50005 0 0 0 0.5,-0.5 L 206,252 h 2.5 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -5 A 0.50005,0.50005 0 0 0 208.5,246 H 206 v -3.5 A 0.50005,0.50005 0 0 0 205.49805,242 Z M 205,243.00195 V 246 h -2.00781 v -2.99414 z M 202.99219,247 H 205 v 4 h -2.00781 z M 206,247 h 2 v 4 h -2 z m -3.00781,5 h 2.00586 l -0.006,3.00781 h -2 z" + transform="translate(1.8536743e-6,42.000055)" + id="path22040" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 200.53711,284.16992 a 0.50005,0.50005 0 0 0 -0.13477,0.0156 c -3.14392,0.73681 -5.37898,3.53464 -5.40234,6.76367 -0.0234,3.22902 2.17176,6.05956 5.30469,6.8418 a 0.50005,0.50005 0 1 0 0.24219,-0.96875 c -2.69014,-0.67168 -4.56694,-3.09259 -4.54688,-5.86524 0.0201,-2.77265 1.93128,-5.16615 4.63086,-5.79883 a 0.50005,0.50005 0 0 0 -0.0937,-0.98828 z" + id="path22034" + inkscape:connector-curvature="0" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g21627" + transform="translate(2.8146326e-5,-41.999965)"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 495.5,305 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 1.5 h -3.5 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 3.5 h -1.5 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 7 a 0.50005,0.50005 0 1 0 1,0 V 312 h 1.5 a 0.50005,0.50005 0 0 0 0.5,-0.5 V 308 h 3.5 a 0.50005,0.50005 0 0 0 0.5,-0.5 V 306 h 6.5 a 0.50005,0.50005 0 1 0 0,-1 z" + id="path21618" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 502.5,308 c -5.79307,0 -10.5,4.70693 -10.5,10.5 a 0.50004997,0.50004997 0 1 0 1,0 c 0,-5.25263 4.24737,-9.5 9.5,-9.5 a 0.50004997,0.50004997 0 1 0 0,-1 z" + id="circle21622" + inkscape:connector-curvature="0" /> + style="display:inline;fill:#ffffff;enable-background:new" + id="g21555" + transform="translate(-1.8536743e-6,-20.999995)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + id="circle24230-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssss" /> + transform="translate(83.999995,110)"> + id="path24292" + inkscape:connector-curvature="0" /> + + + + + + + - - - - - - - + transform="matrix(-1,0,0,1,551.00038,4.4999696e-6)"> + id="g24356"> + transform="matrix(-1,0,0,1,363.00038,-63.000004)" + id="path24346" + inkscape:connector-curvature="0" /> + id="circle24448" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssss" /> + transform="matrix(0,1,1,0,-152.00318,47.006352)"> + id="g24612" + style="fill:#ffffff"> + transform="matrix(0,1,1,0,-47.006352,152.00318)" + id="circle24338" + inkscape:connector-curvature="0" /> + d="m 136.9668,349.03125 c -2.73852,0 -4.97071,2.23218 -4.97071,4.9707 0,2.73853 2.23219,4.96875 4.97071,4.96875 0.74568,0 1.44822,-0.1767 2.08398,-0.47265 -0.0209,-0.16376 -0.0508,-0.32518 -0.0508,-0.49414 0,-0.2598 0.0297,-0.51312 0.0781,-0.75977 -0.60661,0.39452 -1.33048,0.62695 -2.11132,0.62695 -2.14404,0 -3.8711,-1.72509 -3.8711,-3.86914 0,-2.14404 1.72706,-3.87109 3.8711,-3.87109 2.14405,0 3.86914,1.72705 3.86914,3.87109 0,0.23797 -0.0296,0.46946 -0.0703,0.69532 0.35109,-0.23908 0.74721,-0.40722 1.16407,-0.52539 0.002,-0.0568 0.008,-0.11267 0.008,-0.16993 0,-2.73852 -2.23217,-4.9707 -4.9707,-4.9707 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + inkscape:connector-curvature="0" /> + transform="translate(-1.8536743e-6,-20.999994)"> + id="path21998" + inkscape:connector-curvature="0" /> + transform="translate(1.8536743e-6,20.999994)" + id="path22786" + inkscape:connector-curvature="0" /> + width="16" + height="16" + x="110" + y="262" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g22709" + transform="matrix(0,-1,-1,0,408.99494,408.99999)"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="M 153.49219,289.73828 A 0.50005,0.50005 0 0 0 153,290.24414 l -0.008,7.26172 a 0.50005,0.50005 0 0 0 0.50195,0.50195 l 7.25586,-0.0137 a 0.50005,0.50005 0 1 0 0,-1 l -6.75781,0.0137 0.008,-6.76172 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z" + id="path21430-0" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 115.04297,242 -4,4 h 9.95117 l 0.006,9.95703 3.85352,-3.85351 L 125,251.95703 124.99414,242 Z m 0.41406,1 h 7.9707 l -2,2 h -7.9707 z m 8.53711,0.56641 0.006,7.97656 -2,2 -0.006,-7.97656 z" + transform="matrix(0,-1,-1,0,408.99999,408.99494)" + id="path21432-2" + inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transform="translate(582,-1322)"> + id="g25433" + style="display:inline;enable-background:new"> + + + + + + + + + + + + - - - - + transform="matrix(-1,0,0,1,-781.00069,0)" + id="g25455" + style="display:inline;enable-background:new"> - - - - - - - - + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" /> + id="g25378-9"> - - - - - - - - + transform="translate(1,-1)" + id="g26210-2"> + + + + + transform="translate(-21,-64)" + id="g25924-0"> - + sodipodi:nodetypes="ccsccc" + style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + d="m -511.49974,1341.4919 -2.6e-4,-2.1822 c 2e-5,-2.8698 1.14768,-5.4099 3,-6.8448 1.85234,-1.4349 4.14766,-1.4349 6,0 1.85233,1.4349 2.99998,4.0575 3,6.9272 v 2.0998" + id="path25802-2" + inkscape:connector-curvature="0" /> + + transform="matrix(1,0,0,-1,-21,2604.9941)" + id="g25919-9"> + d="m -464.5,1340.5001 v -2 h 2 v 2 z" + inkscape:connector-curvature="0" /> + + + + d="m -503.5,1348.5 h -2 v 2 h 2 z" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + id="path25851-1" /> + + id="g25861-1" + transform="translate(-47,-2)"> + + + + - - - - + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" + id="path25871-3" /> + transform="translate(-43,-61)" + id="g25301-4"> + d="m -510.49974,1338.4932 -2.6e-4,-0.2387 c 0,-2.5685 1.14768,-5.2795 3,-6.6953 1.85233,-1.4159 4.14765,-1.4159 5.99999,0 1.85233,1.4158 3,4.1268 3,6.6953 v 0.2387" + id="path25297-7" + inkscape:connector-curvature="0" /> + y="1328.5" + x="-503.5" + height="2" + width="1.9999762" + id="rect25299-7" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 324.95117,410.94531 c -0.75176,0.0616 -1.47366,0.37015 -2.05469,0.95117 -1.16941,1.16942 -1.16162,2.91055 -0.28906,4.30664 0.87256,1.3961 2.57397,2.52709 4.83399,2.79297 2.83908,0.33401 5.63985,-1.05664 6.5332,-3.3125 a 0.50005,0.50005 0 1 0 -0.92969,-0.36718 c -0.67177,1.69632 -3.05327,2.97373 -5.48633,2.6875 -1.98998,-0.23411 -3.41357,-1.22813 -4.10351,-2.33203 -0.68994,-1.10391 -0.68215,-2.23778 0.14844,-3.06836 0.83795,-0.83796 1.98844,-0.89361 3.08398,-0.26368 1.09554,0.62994 2.08242,1.9799 2.31641,3.96875 a 0.50005,0.50005 0 1 0 0.99218,-0.11718 c -0.26601,-2.26115 -1.40413,-3.91119 -2.80859,-4.71875 -0.70223,-0.40379 -1.48457,-0.58895 -2.23633,-0.52735 z m 3.54102,9.04883 a 0.50005,0.50005 0 0 0 -0.37696,0.1875 c -0.31249,0.377 -0.92604,0.69672 -1.66015,0.78906 a 0.50005,0.50005 0 1 0 0.125,0.99219 c 0.94034,-0.11828 1.77818,-0.50935 2.30469,-1.14453 a 0.50005,0.50005 0 0 0 -0.39258,-0.82422 z" + id="path22178" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + sodipodi:nodetypes="cccccccccccccccccc" /> + id="g22365" + transform="translate(-1.8536743e-6,-25.999995)"> + id="path22215" + d="m 302,649 v 8 h 4 v -8 z m 1,1 h 2 v 1 h -2 z m 0,2 h 2 v 1 h -2 z m 0,2 h 2 v 1 h -2 z" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + inkscape:connector-curvature="0" /> + id="rect21916" + d="m 301.5,647 c -0.82235,0 -1.5,0.67765 -1.5,1.5 v 9 c 0,0.82235 0.67765,1.5 1.5,1.5 h 11 c 0.82235,0 1.5,-0.67765 1.5,-1.5 v -9 c 0,-0.82235 -0.67765,-1.5 -1.5,-1.5 z m -0.5,1 h 12 v 10 h -12 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="g22423"> - - - - - - - - - - + - - - - - - - - - - - - - - - - + sodipodi:nodetypes="cccccccccccccccscccccccccccccc" + inkscape:connector-curvature="0" + id="path22769" + d="m 517.98438,9.9863345 c -0.55152,0.009 -0.99193,0.4621405 -0.98438,1.0136695 v 7 h -1.10156 l -0.91016,-6.14648 c -0.0643,-0.48249 -0.46671,-0.84859 -0.95312,-0.86719 -0.63083,-0.0229 -1.12488,0.53711 -1.02344,1.16015 L 514,18.816414 v 0.88671 1.296881 h -1 v -1.746091 l -2.58984,-1.16602 c -0.12175,-0.0548 -0.25324,-0.0847 -0.38672,-0.0879 -0.88449,-0.0197 -1.35703,1.03438 -0.75391,1.68164 l 3.5,3.750001 c 1.45044,1.55404 3.38812,2.64316 5.12305,2.55469 2.20226,-0.16055 4.09501,-1.6226 4.80664,-3.71289 l 2.25586,-6.269531 c 0.1808,-0.48082 -0.16432,-0.99701 -0.67774,-1.01368 -0.32862,-0.0101 -0.62553,0.19494 -0.73242,0.50586 l -0.90039,2.50392 h -0.74023 l 1.07812,-5.81836 c 0.12593,-0.63116 -0.36843,-1.215229 -1.01172,-1.19531 -0.47506,0.0156 -0.8735,0.36343 -0.95312,0.83203 l -1.14453,6.18164 H 519 v -7 c 0.008,-0.563769 -0.45189,-1.0224695 -1.01562,-1.0136695 z" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" /> + sodipodi:nodetypes="cccccccccc" /> - - - - - - - - - - - - - - - - - - - - + id="g23034"> - - - - - - - - - - - - - + style="display:inline;fill:#ffffff;enable-background:new" + id="g22949" + transform="matrix(1,0,0,-1,168,540.00935)"> + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + transform="matrix(0,-1,-1,0,558.00846,761.00467)" + id="g22540" + style="display:inline;opacity:1;fill:#ffffff;enable-background:new"> + + d="m 468.5,349 c -0.82251,0 -1.5,0.67749 -1.5,1.5 0,0.82251 0.67749,1.5 1.5,1.5 0.8225,0 1.5,-0.6775 1.5,-1.5 0,-0.82251 -0.67749,-1.5 -1.5,-1.5 z" + id="path22516" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssss" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:connector-curvature="0" /> @@ -13945,1402 +12523,2848 @@ inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" - style="display:inline;opacity:1;fill:#ffffff;enable-background:new" - transform="translate(-104.00001,-19.99995)" - id="g8734-0"> + transform="translate(-21.000002,42.000006)" + id="g12626" + style="display:inline;fill:#ffffff;enable-background:new"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="M 31.492188,367.99219 A 0.50005,0.50005 0 0 0 31,368.5 v 8.79297 l -3.853516,3.85351 a 0.50005,0.50005 0 1 0 0.707032,0.70704 L 31.707031,378 H 40.5 a 0.50005,0.50005 0 1 0 0,-1 H 32 v -8.5 a 0.50005,0.50005 0 0 0 -0.507812,-0.50781 z" + id="path12205" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccc" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(-21.000002,4.4999696e-6)" + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + style="display:inline;opacity:0.6;fill:#ffffff;enable-background:new" + id="g12548"> + style="display:inline;opacity:1;fill:#ffffff;enable-background:new" + transform="translate(640.00001,-112)" + id="g7753-3"> + - + transform="translate(-1.8536743e-6,4.4999696e-6)" + id="g23748" + style="display:inline;fill:#ffffff;enable-background:new"> + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + d="m 49,558 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z" + id="path10767" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /> + + + + + + + + + + + + + + + + + - - - + d="M 47.5,578 A 0.50005,0.50005 0 0 0 47,578.5 L 46.9922,589 c 0,1.51667 1.219298,3 2.984374,3 1.765077,0 3.015625,-1.475 3.015626,-3 L 53,578.5 A 0.50005,0.50005 0 0 0 52.5,578 Z m 0.5,1 h 4 l -0.0078,10 c 0,0.975 -0.811952,2 -2.015626,2 -1.203673,0 -1.984375,-1.01667 -1.984374,-2 z" + id="path13679-7-1" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 58.492188,586 a 0.50005,0.50005 0 1 0 0,1 H 60 v 4 h -6.257812 a 0.50005,0.50005 0 1 0 0,1 H 60.5 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -5 A 0.50005,0.50005 0 0 0 60.5,586 Z" + id="path13681-7-8" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 56.492188,579 a 0.50005,0.50005 0 0 0 -0.345704,0.14648 l -2,2 a 0.50005,0.50005 0 1 0 0.707032,0.70704 L 56.5,580.20703 58.792969,582.5 l -4.646485,4.64648 a 0.50005,0.50005 0 1 0 0.707032,0.70704 l 5,-5 a 0.50005,0.50005 0 0 0 0,-0.70704 l -3,-3 A 0.50005,0.50005 0 0 0 56.492188,579 Z" + id="path13684-4-3" + inkscape:connector-curvature="0" /> + - - - - - - - - - - - + id="g23993-7" + transform="matrix(1,0,0,-1,-1008,851.0067)"> - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 1437,595.60938 c 0,6.25034 4.6305,11.38281 10.4004,11.38281 a 0.60006002,0.60006002 0 1 0 0,-1.19922 c -5.0564,0 -9.2012,-4.52271 -9.2012,-10.18359 a 0.60006002,0.60006002 0 1 0 -1.1992,0 z" + id="path23981-7" + inkscape:connector-curvature="0" /> + + + - - - + transform="rotate(180,947.5,425.5)" + id="g24104-2"> + + + + + + + + + + id="g12049-3-5" + transform="translate(126,64.00005)" + style="display:inline;opacity:0.98999999;fill:#ffffff;enable-background:new"> + d="m 52.0071,410.99995 v 1 L 61.5,412 c 0.676161,0.01 0.676161,-1.00956 0,-1 z M 48.5,416 c -0.676161,-0.01 -0.676161,1.00956 0,1 l 5.5071,-5e-5 v -1 z m 10.5071,-5e-5 v 1 L 61.5,417 c 0.676161,0.01 0.676161,-1.00956 0,-1 z M 48.5,421 c -0.676161,-0.01 -0.676161,1.00956 0,1 l 9.5071,-5e-5 v -1 z" + id="path12047-5-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccccc" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 175.5,474 c -0.8225,0 -1.5,0.6775 -1.5,1.5 0,0.8225 0.6775,1.5 1.5,1.5 0.8225,0 1.5,-0.6775 1.5,-1.5 0,-0.8225 -0.6775,-1.5 -1.5,-1.5 z m 0,1 c 0.28206,0 0.5,0.21794 0.5,0.5 0,0.28206 -0.21794,0.5 -0.5,0.5 -0.28206,0 -0.5,-0.21794 -0.5,-0.5 0,-0.28206 0.21794,-0.5 0.5,-0.5 z m 7,4 c -0.8225,0 -1.5,0.6775 -1.5,1.5 0,0.8225 0.6775,1.5 1.5,1.5 0.8225,0 1.5,-0.6775 1.5,-1.5 0,-0.8225 -0.6775,-1.5 -1.5,-1.5 z m 0,1 c 0.28206,0 0.5,0.21794 0.5,0.5 0,0.28206 -0.21794,0.5 -0.5,0.5 -0.28206,0 -0.5,-0.21794 -0.5,-0.5 0,-0.28206 0.21794,-0.5 0.5,-0.5 z m 4,4 c -0.8225,0 -1.5,0.6775 -1.5,1.5 0,0.8225 0.6775,1.5 1.5,1.5 0.8225,0 1.5,-0.6775 1.5,-1.5 0,-0.8225 -0.6775,-1.5 -1.5,-1.5 z m 0,1 c 0.28206,0 0.5,0.21794 0.5,0.5 0,0.28206 -0.21794,0.5 -0.5,0.5 -0.28206,0 -0.5,-0.21794 -0.5,-0.5 0,-0.28206 0.21794,-0.5 0.5,-0.5 z" + id="circle14100-8-7" + inkscape:connector-curvature="0" /> + id="g24393-7" + transform="matrix(-1,0,0,1,1912.004,-92)"> + transform="translate(112.05535,339.92702)" + id="g44391" + style="display:inline;opacity:0.7;fill:#ffffff;enable-background:new"> + - - - - - - - - - - - + transform="matrix(-1,0,0,1,593.8323,-41.99999)" + style="display:inline;opacity:1;fill:#ffffff;enable-background:new" + id="g22538" /> - - - - - - - + id="g15557" + transform="translate(42)" + style="fill:#ffffff"> + transform="matrix(1,0,0,-1,-42,813.00707)" + id="g15497" + style="display:inline;fill:#ffffff;enable-background:new"> + + - + id="g6238" + style="fill:#ffffff"> + id="g15734" + style="fill:#ffffff"> + style="opacity:0.6;fill:#ffffff" + id="g15738"> + id="path15684" + d="m 532.57617,472.98047 a 0.55005501,0.55005501 0 0 0 -0.42383,0.18555 c -0.46657,0.51387 -1.20227,1.13094 -1.20312,2.14257 -10e-4,1.1847 0.85571,2.11411 1.94336,2.91797 1.08765,0.80386 2.47935,1.527 3.84765,2.25782 0.44144,0.23578 0.88242,0.47056 1.3086,0.70312 1.11316,0.60746 2.13512,1.2144 2.84375,1.81836 0.70862,0.60396 1.05894,1.15906 1.05859,1.68359 -4e-4,0.48086 -0.32771,1.0064 -0.79492,1.38086 a 0.55027044,0.55027044 0 1 0 0.6875,0.85938 c 0.65297,-0.52334 1.20625,-1.30182 1.20703,-2.23828 6.6e-4,-0.99421 -0.62031,-1.82029 -1.44531,-2.52344 -0.825,-0.70315 -1.89813,-1.32892 -3.03125,-1.94727 -0.43382,-0.23673 -0.87477,-0.47022 -1.31445,-0.70508 -1.37366,-0.73367 -2.73478,-1.45092 -3.71289,-2.17382 -0.97812,-0.72291 -1.49874,-1.40647 -1.49805,-2.03125 3.7e-4,-0.43907 0.39742,-0.83099 0.91797,-1.4043 a 0.55005501,0.55005501 0 0 0 -0.39063,-0.92578 z m 1.92578,7.9668 a 0.55005501,0.55005501 0 0 0 -0.24804,0.0605 c -0.75,0.375 -1.5313,0.75874 -2.16797,1.28907 -0.63668,0.53032 -1.13681,1.26964 -1.13867,2.20312 0,0.98843 0.53602,1.85319 1.19335,2.41797 a 0.55122854,0.55122854 0 1 0 0.71876,-0.83594 c -0.44771,-0.38466 -0.8125,-1.01968 -0.8125,-1.58203 0.002,-0.56635 0.25363,-0.95243 0.74218,-1.35938 0.48909,-0.40739 1.20703,-0.77343 1.95703,-1.14843 a 0.55005501,0.55005501 0 0 0 -0.24414,-1.04492 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - - - - - - - - - - + inkscape:connector-curvature="0" + id="path15690" + d="m 533.5,475 a 0.50005,0.50005 0 1 0 0,1 h 2 a 0.50005,0.50005 0 1 0 0,-1 z m 0,9 a 0.50005,0.50005 0 1 0 0,1 h 2 A 0.50005,0.50005 0 0 0 536,484.58008 0.50005,0.50005 0 0 0 536.5,485 h 4 a 0.50005,0.50005 0 1 0 0,-1 h -4 A 0.50005,0.50005 0 0 0 536,484.41992 0.50005,0.50005 0 0 0 535.5,484 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + + id="g15124-5" + transform="translate(-558,-200)"> - - + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + id="g15178-7" + style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" + transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,580.8635,617.75914)"> + id="g15176-5" + style="fill:#ffffff;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none"> + id="g15174-3" + style="fill:#ffffff"> + style="display:inline;fill:#ffffff;enable-background:new" + id="g15242-0" + transform="translate(-558,-305)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 134.49999,536.00009 c -1.3764,0 -2.5,1.1236 -2.5,2.5 v 7 c 0,1.3764 1.1236,2.5 2.5,2.5 h 0.5 v 2.5 c -8e-4,0.4686 0.5855,0.6809 0.8848,0.3203 l 2.3496,-2.8203 h 5.2656 c 1.3764,0 2.5,-1.1236 2.5,-2.5 v -7 c 0,-1.3764 -1.1236,-2.5 -2.5,-2.5 z m 3.5,2 h 2 v 2 h -2 z m -1,3 h 3 v 4 h 1 v 1 h -4 v -1 h 1 v -3 h -1 z" + id="path17991-2" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g6359" + transform="rotate(90,306.5,333.5)"> - - - - - + id="path6353" + d="m 469.5,356 c -1.37478,0 -2.5,1.12522 -2.5,2.5 0,1.37478 1.12522,2.5 2.5,2.5 1.37478,0 2.5,-1.12522 2.5,-2.5 0,-1.37478 -1.12522,-2.5 -2.5,-2.5 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + + + - - - - + id="g6505" + transform="translate(84,-21)"> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g22801-1" + transform="translate(696,857.9975)"> + + + + + + + + + id="path12633" + d="m 155.50195,139.99414 a 0.50005,0.50005 0 0 0 -0.36133,0.85352 C 156.37329,142.12237 157.775,144 160.5,144 c 2.725,0 4.12681,-1.87774 5.35938,-3.15234 a 0.50005,0.50005 0 1 0 -0.71876,-0.69532 C 163.83477,141.50274 162.775,143 160.5,143 c -2.275,0 -3.33487,-1.49737 -4.64062,-2.84766 a 0.50005,0.50005 0 0 0 -0.35743,-0.1582 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + id="path12645" + d="m 152.50195,143 a 0.50005,0.50005 0 0 0 -0.46093,0.69727 l 3,7 a 0.50005,0.50005 0 1 0 0.91796,-0.39454 l -2.50781,-5.85156 5.85156,2.50781 a 0.50005,0.50005 0 1 0 0.39454,-0.91796 l -7,-3 A 0.50005,0.50005 0 0 0 152.50195,143 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + style="display:inline;opacity:0.6;fill:#ffffff;enable-background:new" + id="g14837" + transform="translate(-210,-315)"> - - - + inkscape:connector-curvature="0" + id="path14829" + d="m 415.5,452.00781 a 0.50005018,0.50005018 0 0 0 -0.5,0.5 v 3.00781 a 0.50005018,0.50005018 0 0 0 0.5,0.5 c 1.00252,0 2.00529,0 3.00781,0 a 0.50005018,0.50005018 0 0 0 0.5,-0.5 v -3.00781 a 0.50005018,0.50005018 0 0 0 -0.5,-0.5 c -1.00251,0 -2.00529,0 -3.00781,0 z m 0.5,1 c 0.66922,0 1.33859,0 2.00781,0 v 2.00781 c -0.66921,0 -1.33859,10e-6 -2.00781,0 z m -10.5,9 a 0.50005018,0.50005018 0 0 0 -0.5,0.5 v 3.00781 a 0.50005018,0.50005018 0 0 0 0.5,0.5 c 1.00252,0 2.00529,0 3.00781,0 a 0.50005018,0.50005018 0 0 0 0.5,-0.5 v -3.00781 a 0.50005018,0.50005018 0 0 0 -0.5,-0.5 c -1.00251,0 -2.00529,0 -3.00781,0 z m 0.5,1 c 0.66922,0 1.33859,0 2.00781,0 v 2.00781 c -0.66921,0 -1.33859,10e-6 -2.00781,0 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> - - - - - + inkscape:connector-curvature="0" + id="path22198" + d="m 411.50391,454 a 0.50005,0.50005 0 0 0 -0.35743,0.14648 l -1,1 a 0.50005,0.50005 0 1 0 0.70704,0.70704 l 0.85156,-0.85157 0.78515,0.006 a 0.50005,0.50005 0 1 0 0.006,-1 z m -3.01368,2.99609 a 0.50005,0.50005 0 0 0 -0.34375,0.15039 l -1,1 A 0.50005,0.50005 0 0 0 407,458.5 v 1.00781 a 0.50005,0.50005 0 1 0 1,0 v -0.80078 l 0.85352,-0.85351 a 0.50005,0.50005 0 0 0 -0.36329,-0.85743 z m 7.99415,0.9961 A 0.50005,0.50005 0 0 0 415.99219,458.5 v 0.80078 l -0.85352,0.85352 a 0.50005,0.50005 0 1 0 0.70703,0.70703 l 1,-1 a 0.50005,0.50005 0 0 0 0.14649,-0.35352 V 458.5 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z m -3.00196,4.00976 a 0.50005,0.50005 0 0 0 -0.34375,0.15235 l -0.85156,0.85156 -0.7832,-0.006 a 0.50005,0.50005 0 1 0 -0.008,1 l 0.99219,0.008 a 0.50005,0.50005 0 0 0 0.35742,-0.14648 l 1,-1 a 0.50005,0.50005 0 0 0 -0.36328,-0.85938 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" + id="rect5375" + width="6" + height="5" + x="218" + y="119" /> + + transform="matrix(0.86666667,0,0,0.86666667,39.533341,-302.8)" + id="g12476-7-0" + style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.15384614;enable-background:new" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + inkscape:connector-curvature="0" + id="path12470-5-6" + d="m 454,555.92383 c -4.45393,0 -8.07617,3.62224 -8.07617,8.07617 0,4.45393 3.62224,8.07617 8.07617,8.07617 4.45393,0 8.07617,-3.62224 8.07617,-8.07617 0,-4.45393 -3.62224,-8.07617 -8.07617,-8.07617 z m 0,1.15234 c 3.83034,0 6.92383,3.09349 6.92383,6.92383 0,3.83034 -3.09349,6.92383 -6.92383,6.92383 -3.83034,0 -6.92383,-3.09349 -6.92383,-6.92383 0,-3.83034 3.09349,-6.92383 6.92383,-6.92383 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.15384614;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" + id="path12474-5-2" + d="m 454,561.69141 c -1.26767,-10e-6 -2.3086,1.04092 -2.30859,2.30859 -1e-5,1.26767 1.04092,2.3086 2.30859,2.30859 1.26767,10e-6 2.3086,-1.04092 2.30859,-2.30859 1e-5,-1.26767 -1.04092,-2.3086 -2.30859,-2.30859 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.15384603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + + style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.15384614;enable-background:new" + id="g12520-1-5" + transform="matrix(0.86666667,0,0,0.86666667,60.533341,-302.8)" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g6259" + style="fill:#ffffff"> - - - - - - - - - + id="path14478-2" + d="m 475,388.9375 c -3.89459,0 -7.0625,3.1679 -7.0625,7.0625 0,3.89459 3.16791,7.0625 7.0625,7.0625 3.89459,0 7.0625,-3.16791 7.0625,-7.0625 0,-3.8946 -3.16791,-7.0625 -7.0625,-7.0625 z m 0,1 c 3.35415,0 6.0625,2.70834 6.0625,6.0625 0,3.35415 -2.70835,6.0625 -6.0625,6.0625 -3.35415,0 -6.0625,-2.70835 -6.0625,-6.0625 0,-3.35416 2.70835,-6.0625 6.0625,-6.0625 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + - + id="g6251" + style="fill:#ffffff"> + inkscape:connector-curvature="0" + id="path14492-1-5" + d="m 452.5,389 c -0.79539,1.6e-4 -1.5587,0.31644 -2.12109,0.87891 l -2.5,2.5 C 447.31644,392.9413 447.00016,393.70461 447,394.5 v 5.5 c 1.7e-4,1.65084 1.34916,2.99983 3,3 h 5.5 c 0.79539,-1.6e-4 1.5587,-0.31644 2.12109,-0.87891 l 2.5,-2.5 c 0.56247,-0.56238 0.87875,-1.3257 0.87891,-2.12109 v -5.75 c -8e-5,-0.79524 -0.25969,-1.50187 -0.75391,-1.99609 C 459.75187,389.25969 459.04524,389.00008 458.25,389 Z m 0,1 h 5.75 c 0.58541,6e-5 1.00348,0.17535 1.28906,0.46094 0.28559,0.28558 0.46088,0.70365 0.46094,1.28906 v 5.75 c -10e-5,0.53061 -0.21073,1.03891 -0.58594,1.41406 l -2.5,2.5 C 456.53889,401.78928 456.03061,401.9999 455.5,402 H 450 c -1.11046,-1.1e-4 -1.99989,-0.88954 -2,-2 v -5.5 c 10e-5,-0.53061 0.21072,-1.03889 0.58594,-1.41406 l 2.5,-2.5 C 451.46111,390.21072 451.96939,390.0001 452.5,390 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + inkscape:connector-curvature="0" + id="path14494-2" + d="m 458.49023,390.99609 a 0.50005,0.50005 0 0 0 -0.34375,0.15039 l -1,1 a 0.50005,0.50005 0 1 0 0.70704,0.70704 l 1,-1 a 0.50005,0.50005 0 0 0 -0.36329,-0.85743 z M 450.5,393 a 0.50005,0.50005 0 1 0 0,1 h 4 a 0.50005,0.50005 0 1 0 0,-1 z m 5.99219,1.99219 A 0.50005,0.50005 0 0 0 456,395.5 v 4 a 0.50005,0.50005 0 1 0 1,0 v -4 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + id="g6275" + style="fill:#ffffff"> + inkscape:connector-curvature="0" + id="path14559-8" + d="m 519.02539,389.05664 c -1.23014,0.0645 -2.42356,0.6345 -3.37891,1.58984 l -4,4 c -0.95534,0.95535 -1.53001,2.15146 -1.59765,3.38477 -0.0676,1.23331 0.38786,2.49571 1.41406,3.50977 1.02392,1.0118 2.28158,1.46686 3.51172,1.40234 1.23014,-0.0645 2.42356,-0.6345 3.37891,-1.58984 l 4,-4 c 0.95534,-0.95535 1.53001,-2.15146 1.59765,-3.38477 0.0676,-1.23331 -0.38786,-2.4957 -1.41406,-3.50977 -1.02392,-1.0118 -2.28158,-1.46686 -3.51172,-1.40234 z m 0.0527,0.99805 c 0.95617,-0.0502 1.91199,0.28134 2.75586,1.11523 0.8416,0.83165 1.17171,1.78562 1.11914,2.74414 -0.0526,0.95853 -0.50462,1.93042 -1.30664,2.73242 l -4,4 c -0.80201,0.80202 -1.76844,1.24868 -2.7246,1.29883 -0.95617,0.0502 -1.91199,-0.28134 -2.75586,-1.11523 -0.8416,-0.83164 -1.17171,-1.78562 -1.11914,-2.74414 0.0526,-0.95853 0.50462,-1.93041 1.30664,-2.73242 l 4,-4 c 0.80201,-0.80202 1.76844,-1.24868 2.7246,-1.29883 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path14564" + d="m 517.47266,391.99414 a 0.50005,0.50005 0 0 0 -0.45899,0.62305 c 0.18668,0.77642 0.28491,1.42494 1.14063,2.24414 0.815,0.78022 1.39282,0.94312 2.24023,1.12695 a 0.50005,0.50005 0 1 0 0.21094,-0.97656 c -0.84931,-0.18425 -1.03849,-0.18255 -1.75977,-0.87305 -0.72218,-0.69136 -0.65665,-0.91268 -0.85937,-1.75586 a 0.50005,0.50005 0 0 0 -0.51367,-0.38867 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="g6267" + style="fill:#ffffff"> + inkscape:connector-curvature="0" + id="path14468-2" + d="m 499.91406,389.05664 c -0.77439,-0.15321 -1.63518,-0.1241 -2.51367,0.0664 -1.75698,0.38102 -3.63558,1.4051 -5.25391,3.02343 -1.61833,1.61833 -2.64241,3.49693 -3.02343,5.25391 -0.38103,1.75698 -0.11706,3.43764 0.96093,4.51563 1.07799,1.07798 2.75865,1.34196 4.51563,0.96093 1.75698,-0.38102 3.63558,-1.40511 5.25391,-3.02343 1.61832,-1.61833 2.64241,-3.49693 3.02343,-5.25391 0.38102,-1.75698 0.11705,-3.43764 -0.96093,-4.51563 -0.539,-0.53899 -1.22757,-0.87413 -2.00196,-1.02734 z m -0.21289,0.97656 c 0.61146,0.11888 1.12564,0.37564 1.50781,0.75782 0.76435,0.76434 1.0245,2.05973 0.69141,3.5957 -0.33309,1.53597 -1.26116,3.26702 -2.75391,4.75976 -1.49274,1.49275 -3.22379,2.42081 -4.75976,2.75391 -1.53597,0.3331 -2.83136,0.0729 -3.5957,-0.69141 -0.76435,-0.76434 -1.02451,-2.05973 -0.69141,-3.5957 0.33309,-1.53597 1.26117,-3.26702 2.75391,-4.75976 1.49274,-1.49275 3.22379,-2.42082 4.75976,-2.75391 0.76799,-0.16655 1.47643,-0.18529 2.08789,-0.0664 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + inkscape:connector-curvature="0" + id="path14550" + d="m 493.47266,393.99414 a 0.50005,0.50005 0 0 0 -0.45899,0.62305 c 0.22122,0.92011 0.78151,1.92168 1.64063,2.74414 0.81151,0.77689 1.74924,1.41197 2.74023,1.62695 a 0.50005,0.50005 0 1 0 0.21094,-0.97656 c -0.70573,-0.1531 -1.535,-0.67922 -2.25977,-1.37305 -0.71878,-0.6881 -1.19119,-1.55637 -1.35937,-2.25586 a 0.50005,0.50005 0 0 0 -0.51367,-0.38867 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + d="m 71.5,536 c -1.3819,0 -2.5,1.1181 -2.5,2.5 v 1 c 0,1.3818 1.118,2.5 2.5,2.5 h 9 c 1.382,0 2.5,-1.1182 2.5,-2.5 v -1 c 0,-1.3857 -1.13452,-2.48443 -2.51172,-2.48633 z m 3.5,1.00586 5.48633,0.008 c 0.8628,0 1.51367,0.63203 1.51367,1.48633 v 1 c 0,0.8578 -0.642,1.5 -1.5,1.5 H 75 Z M 71.5,544 c -1.3819,0 -2.5,1.1181 -2.5,2.5 v 1 c 0,1.3818 1.118,2.5 2.5,2.5 h 9 c 1.382,0 2.5,-1.1182 2.5,-2.5 v -1 c 0,-1.3857 -1.13452,-2.48443 -2.51172,-2.48633 z m 6.50977,1.00977 2.47656,0.004 c 0.8628,0 1.51367,0.63203 1.51367,1.48633 v 1 c 0,0.8578 -0.642,1.5 -1.5,1.5 H 78 Z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path18055-4" /> + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="path20420" + inkscape:connector-curvature="0" /> + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + inkscape:connector-curvature="0" /> + d="m 516,545 h 2 v -2 h -2 z m 0,-4 h 2 v -2 h -2 z" + style="display:inline;opacity:0.8;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + id="path19014-3-8" /> + id="g6098"> + + d="M 473.08594,412.25 C 471.30049,412.84735 470,414.51742 470,416.5 c 0,2.47936 2.02064,4.5 4.5,4.5 0.48878,0 0.95142,-0.0971 1.39258,-0.24219 -0.56289,-0.17378 -1.08535,-0.43906 -1.55664,-0.77343 C 472.47547,419.89744 471,418.3827 471,416.5 c 0,-1.08365 0.4989,-2.0367 1.26758,-2.67773 0.18577,-0.57127 0.46679,-1.09859 0.81836,-1.57227 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:connector-curvature="0" /> - + + + + + + + + + + + + + - - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 342.55078,494 a 0.50005,0.50005 0 0 1 0.33593,0.1641 l 2.64844,2.84179 h 1.00781 c 0.45995,0.6015 1.17678,1 1.97852,1 h -3.20312 a 0.50005,0.50005 0 0 1 -0.36719,-0.1582 l -2.79492,-2.99999 A 0.50005,0.50005 0 0 1 342.5,494 a 0.50005,0.50005 0 0 1 0.0508,0 z m 5.9707,4.00589 c 0.80174,0 1.51857,-0.3985 1.97852,-1 h 2.02148 a 0.50005,0.50005 0 0 1 0.35352,0.1465 l 3,3 a 0.50005,0.50005 0 1 1 -0.70704,0.707 l -2.85351,-2.8535 h -2.29297 v 3.832 c 0.96356,1.6489 2.8299,3.71521 5.58203,4.17391 A 0.50086299,0.50086299 0 1 1 355.43945,507 c -2.4267,-0.4044 -4.21553,-1.8644 -5.39844,-3.34761 a 0.50005,0.50005 0 0 1 -0.002,0 c -0.001,0 -0.003,0 -0.004,0 -1.00443,-0.9218 -2.17404,-1 -3.22851,-0.2383 -1.05449,0.76181 -1.78322,2.34671 -1.78321,4.09771 a 0.50005,0.50005 0 1 1 -1,0 c -10e-6,-2.0216 0.80114,-3.89961 2.19727,-4.90821 0.69807,-0.5043 1.49696,-0.7238 2.2832,-0.668 0.17359,0.012 0.34649,0.043 0.51758,0.082 a 0.50005,0.50005 0 0 1 0,-0.01 v -4 z m 0,-3.99999 c 0.8225,0 1.5,0.6775 1.5,1.49999 0,0.8225 -0.6775,1.5 -1.5,1.5 -0.8225,0 -1.5,-0.6775 -1.5,-1.5 0,-0.82249 0.6775,-1.49999 1.5,-1.49999 z" + id="path20567-5" + inkscape:connector-curvature="0" /> + - - - - - - - + id="g21552"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g20181-9" + style="display:inline;opacity:0.6;fill:#ffffff;enable-background:new" + transform="translate(-288.99602,63.999021)"> + id="g5276" + style="fill:#ffffff"> + - + + + transform="translate(0.00711,-0.00712)" + id="g26453-0"> + sodipodi:nodetypes="cccccccccccccccccccc" /> + sodipodi:nodetypes="ccccccccc" /> + id="g26527-9" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + transform="matrix(0,-1,-1,0,220.01421,219.98576)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + id="path24302" /> + d="m 385,621 a 1.0001,1.0001 0 1 0 0,2 h 12 a 1.0001,1.0001 0 1 0 0,-2 z m 0,5 a 1.0001,1.0001 0 1 0 0,2 h 12 a 1.0001,1.0001 0 1 0 0,-2 z m 0,5 a 1.0001,1.0001 0 1 0 0,2 h 12 a 1.0001,1.0001 0 1 0 0,-2 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="display:inline;fill:#ffffff;enable-background:new"> + id="g5447" + style="fill:#ffffff"> + id="path21358" + inkscape:connector-curvature="0" /> + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + inkscape:connector-curvature="0" /> - - - - + id="g24264-7" + transform="translate(-910,-1146)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g24819" + transform="translate(-1015,-999)"> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 1028,1556 c -3.2833,0 -6,2.4414 -6,5.5 0,1.7056 0.9046,3.146 2.1523,4.3594 l 0.9942,0.9941 a 0.50004997,0.50004997 0 0 0 0.3027,0.1485 0.50004997,0.50004997 0 0 0 0.051,0.998 h 5 a 0.50004997,0.50004997 0 0 0 0.045,-0.998 0.50004997,0.50004997 0 0 0 0.3086,-0.1485 l 0.9981,-0.998 v 0 c 1.2122,-1.1985 2.1465,-2.6518 2.1465,-4.3535 0,-3.0586 -2.7167,-5.5 -6,-5.5 z m 0,1 c 2.7919,0 5,2.0358 5,4.5 0,1.3342 -0.7428,2.5488 -1.8516,3.6445 l -1,1 a 0.50004997,0.50004997 0 0 0 0.2793,0.8535 h -4.8594 a 0.50004997,0.50004997 0 0 0 0.2871,-0.8535 l -1,-1 a 0.50004997,0.50004997 0 0 0 -0.01,-0.01 c -1.1397,-1.1082 -1.8477,-2.2864 -1.8477,-3.6406 0,-2.4642 2.2081,-4.5 5,-4.5 z m -2.5,12 a 0.50004997,0.50004997 0 1 0 0,1 h 1.5 v 0.5 a 0.50004997,0.50004997 0 0 0 0.5,0.5 h 1 a 0.50004997,0.50004997 0 0 0 0.5,-0.5 v -0.5 h 1.5 a 0.50004997,0.50004997 0 1 0 0,-1 z" + id="path24815" + inkscape:connector-curvature="0" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 1025.4902,1561.0059 a 0.50005,0.50005 0 0 0 -0.3437,0.8476 l 0.8535,0.8535 v 1.543 a 0.50005,0.50005 0 1 0 1,0 V 1563 h 2 v 1.25 a 0.50005,0.50005 0 1 0 1,0 v -1.543 l 0.8535,-0.8535 a 0.50005,0.50005 0 0 0 -0.707,-0.707 L 1029.293,1562 h -2.586 l -0.8535,-0.8535 a 0.50005,0.50005 0 0 0 -0.3633,-0.1406 z" + id="path24817" + inkscape:connector-curvature="0" /> - - - - + style="display:inline;fill:#ffffff;enable-background:new" + id="g25431" + transform="translate(-21)"> + + + + + + + + + + id="rect24246-3" + transform="translate(188.99644,1801.0029)" + d="m 489.00391,329.99805 v 2 h 1 v -1 h 1 v -1 z m 0,4 v 2 h 1 v -2 z m 0,4 v 2 h 2 v -1 h -1 v -1 z m 9,0 v 1 h -1 v 1 h 2 v -2 z m -5,1 v 1 h 2 v -1 z" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /> + + + + + + + + id="rect24376-2" + transform="translate(166.99644,1801.0029)" + d="M 515.00391,325.99609 V 326 H 515 v 2 h 1 v -1.00391 h 1.00391 v -1 z m 4,0 v 1 h 2 v -1 z M 523,326 v 1 h 1 v 1 h 1.00391 v -2.00391 z m 1.00391,3.99609 v 2 h 1 v -2 z m -13,0.002 v 2 h 1 v -1 h 1 v -1 z m 13,3.99804 v 1 h -1 v 1 h 2 v -2 z m -13,0.002 v 2 h 1 v -2 z m 0,4 v 2 h 2 v -1 h -1 v -1 z m 9,0 v 1 h -1 v 1 h 2 v -2 z m -5,1 v 1 h 2 v -1 z" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /> - + sodipodi:nodetypes="cccccccccccccccccccccccc" /> + + + + + + + + + + + + + style="display:inline;fill:#ffffff;enable-background:new" + id="g25445" + transform="translate(-218,-111)"> + + + + + + + + + + d="m 490,307 c -0.55226,6e-5 -0.99994,0.44774 -1,1 v 8 c 6e-5,0.55226 0.44774,0.99994 1,1 h 12 c 0.55226,-6e-5 0.99994,-0.44774 1,-1 v -8 c -6e-5,-0.55226 -0.44774,-0.99994 -1,-1 z m 6,1 a 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 z" + id="path25011-0" /> + id="g25234-0"> + id="path25232-0" + inkscape:connector-curvature="0" /> + d="m 542.77344,306 a 1.0001,1.0001 0 0 0 -0.41211,0.0781 l -4.74024,2 a 1.0004654,1.0004654 0 1 0 0.77735,1.84376 l 1.54883,-0.65235 -2.69532,5.375 -2.78906,-2.30078 a 1.50015,1.50015 0 1 0 -1.9082,2.3125 l 4.24023,3.5 a 1.50015,1.50015 0 0 0 2.29688,-0.48437 l 3.53711,-7.0586 0.41015,1.63086 a 1.0001,1.0001 0 1 0 1.93946,-0.48828 l -1.25977,-5 A 1.0001,1.0001 0 0 0 542.77344,306 Z" + id="path25427-8" /> + id="path25488-0" + inkscape:connector-curvature="0" /> + id="g5381" + style="fill:#ffffff"> + id="path4898" + inkscape:connector-curvature="0" /> + d="M 321.49219,347.97266 A 0.52004817,0.52004817 0 0 0 320.97852,348.5 v 11 a 0.520505,0.520505 0 0 0 1.04101,0 V 358 h 11.95899 v 1.5 a 0.520505,0.520505 0 0 0 1.04101,0 v -11 a 0.52004817,0.52004817 0 0 0 -0.52734,-0.52734 0.52004817,0.52004817 0 0 0 -0.51367,0.52734 v 1.5 h -11.95899 v -1.5 a 0.52004817,0.52004817 0 0 0 -0.52734,-0.52734 z M 322.01953,351 h 11.95899 v 6 h -11.95899 z" + id="path4902" /> + style="display:inline;fill:#ffffff;enable-background:new" /> - + id="g5375" + style="fill:#ffffff"> + + id="path9108-6-6" + inkscape:connector-curvature="0" /> + style="display:inline;fill:#ffffff;enable-background:new"> + id="circle25190-1-7" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" + r="0" /> + d="m 221,284 c -0.54636,0 -1,0.45364 -1,1 0,0.54636 0.45364,1 1,1 0.54636,0 1,-0.45364 1,-1 0,-0.54636 -0.45364,-1 -1,-1 z m 3,0 c -0.54636,0 -1,0.45364 -1,1 0,0.54636 0.45364,1 1,1 0.54636,0 1,-0.45364 1,-1 0,-0.54636 -0.45364,-1 -1,-1 z m 3,1 c -0.54636,0 -1,0.45364 -1,1 0,0.54636 0.45364,1 1,1 0.54636,0 1,-0.45364 1,-1 0,-0.54636 -0.45364,-1 -1,-1 z m -5.67188,2.04688 c -0.72617,0.0892 -1.40636,0.31348 -2.02343,0.63867 -1.23415,0.65038 -2.22638,1.68758 -2.94922,2.84375 -0.72284,1.15617 -1.1805,2.43169 -1.32227,3.60742 -0.14176,1.17573 0.0178,2.28295 0.6875,3.0293 0.68189,0.75993 1.69067,0.98063 2.61328,0.6914 C 219.35231,297.53818 220,296.54997 220,295.5 c 0,-0.87561 0.22937,-1.10992 0.64258,-1.29297 C 221.05579,294.02398 221.75437,294 222.5,294 c 0.79276,0 1.56488,-0.14919 2.20703,-0.5332 0.52292,-0.31271 0.89501,-0.8382 1.11524,-1.4668 h 1.13281 a 0.50004994,0.50004994 0 0 0 0.002,0 c 1.02746,0 1.90966,-0.75672 2.0293,-1.76953 0.11964,-1.01284 -0.5686,-1.95303 -1.57031,-2.17969 -0.73109,-0.16542 -1.38414,0.17264 -1.8711,0.68945 -0.49389,-0.69239 -1.0864,-1.29918 -1.91601,-1.52148 -0.80279,-0.21511 -1.57461,-0.26104 -2.30079,-0.17187 z m 0.11915,0.98632 c 0.59872,-0.0738 1.23897,-0.0331 1.92382,0.15039 0.66836,0.17909 1.23082,0.75735 1.69727,1.56446 a 0.50004994,0.50004994 0 0 0 0.90234,-0.0781 c 0.17721,-0.4818 0.69836,-0.76361 1.22461,-0.64453 0.52625,0.11908 0.85819,0.58537 0.79883,1.08789 C 227.93478,290.61583 227.49838,291 226.95703,291 H 225.5 a 0.50004994,0.50004994 0 0 0 -0.49219,0.41406 c -0.10308,0.5846 -0.38181,0.93776 -0.8125,1.19532 C 223.76463,292.86693 223.16312,293 222.5,293 c -0.74508,0 -1.54761,-0.0253 -2.26172,0.29102 C 219.52417,293.60735 219,294.37315 219,295.5 c 0,0.63163 -0.40649,1.2273 -0.96484,1.40234 -0.62221,0.19506 -1.12911,0.0874 -1.57032,-0.40429 -0.37675,-0.41988 -0.55858,-1.23603 -0.4375,-2.24024 0.12109,-1.00421 0.53101,-2.16478 1.17774,-3.19922 0.64673,-1.03443 1.52684,-1.94044 2.5664,-2.48828 0.51979,-0.27392 1.07706,-0.46333 1.67579,-0.53711 z" + inkscape:connector-curvature="0" /> + id="path25165" + inkscape:connector-curvature="0" /> - - - + d="m 473,628 a 1.0001,1.0001 0 1 0 0,2 h 2 a 1.0001,1.0001 0 1 0 0,-2 z m -4.5,-6 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 3 a 0.50005,0.50005 0 0 0 0.5,0.5 h 0.5 v 7.5 a 0.50005,0.50005 0 0 0 0.5,0.5 h 9 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -5 a 0.50005,0.50005 0 1 0 -1,0 v 4.5 h -8 v -7 h 3.5 a 0.50005,0.50005 0 1 0 0,-1 H 469 v -2 h 4.5 a 0.50005,0.50005 0 1 0 0,-1 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path24739-4" /> - - - - - - - - - - - + id="g27418" + transform="translate(83.999997,-84)"> - - + sodipodi:nodetypes="sssssccccccccccccc" /> + + + + + style="display:inline;enable-background:new" + id="g27444" + transform="translate(-18.000003,-64)"> + + + + - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 430.49414,284.99414 a 0.50005,0.50005 0 0 0 -0.34766,0.85938 l 2.64649,2.64648 -2.64649,2.64648 a 0.50005,0.50005 0 1 0 0.70704,0.70704 l 2.64648,-2.64649 2.64648,2.64649 a 0.50005,0.50005 0 1 0 0.70704,-0.70704 l -2.64649,-2.64648 2.64649,-2.64648 a 0.50005,0.50005 0 1 0 -0.70704,-0.70704 l -2.64648,2.64649 -2.64648,-2.64649 a 0.50005,0.50005 0 0 0 -0.35938,-0.15234 z" + id="path27679" + inkscape:connector-curvature="0" /> + + + + + + + + + + - + - + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 51.506493,224 c -0.27842,0 -0.50585,0.2216 -0.50586,0.5 v 7 c -6.1e-4,0.4051 0.45544,0.6427 0.78711,0.4102 l 5,-3.5 c 0.28542,-0.199 0.28542,-0.6214 0,-0.8204 l -5,-3.5 c -0.0826,-0.058 -0.1806,-0.089 -0.28125,-0.09 z m 6.49414,-1 v 10 h 2 v -10 z" /> - - - - + + + + - + - + - + + d="m 447.5,599 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 10 a 0.50005,0.50005 0 0 0 0.5,0.5 h 13 a 0.50005,0.50005 0 1 0 0,-1 H 448 v -9 h 9 v 7.5 a 0.50005,0.50005 0 1 0 1,0 v -8 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 9.99219,11.74219 A 0.50005,0.50005 0 0 0 457,611.25 v 1.25 a 0.50005,0.50005 0 1 0 1,0 v -1.25 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + d="m 455.5,602 c -0.58333,0 -1.08834,0.16632 -1.52734,0.45898 -0.43901,0.29267 -0.82618,0.6875 -1.32618,1.1875 l -1,1 c -0.5,0.5 -0.86283,0.85517 -1.17382,1.0625 C 450.16166,605.91632 449.91667,606 449.5,606 h -1 v 1 h 1 c 0.58333,0 1.08834,-0.16632 1.52734,-0.45898 0.43901,-0.29267 0.82618,-0.6875 1.32618,-1.1875 l 1,-1 c 0.5,-0.5 0.86283,-0.85517 1.17382,-1.0625 C 454.83834,603.08368 455.08333,603 455.5,603 h 1 v -1 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.65;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + id="path24895-4" + inkscape:connector-curvature="0" /> + id="path24923-3" + inkscape:connector-curvature="0" /> + id="g27937-4"> + id="path27667-4-6" + inkscape:connector-curvature="0" /> + id="path27669-6-3" + inkscape:connector-curvature="0" /> + id="g27941-8"> + id="path27716-4-8" + inkscape:connector-curvature="0" /> + id="path27721-4-5" + inkscape:connector-curvature="0" /> + d="m 61,288 v -2.5 c -2.8e-5,-0.27613 -0.223869,-0.49997 -0.5,-0.5 H 58 v 1 h 2 v 2 z m -13,0 v -2.5 c 2.8e-5,-0.27613 0.223869,-0.49997 0.5,-0.5 H 51 v 1 h -2 v 2 z m 13,7 v 2.5 c -2.8e-5,0.27613 -0.223869,0.49997 -0.5,0.5 H 58 v -1 h 2 v -2 z m -13,0 v 2.5 c 2.8e-5,0.27613 0.223869,0.49997 0.5,0.5 H 51 v -1 h -2 v -2 z" + inkscape:connector-curvature="0" /> + id="g10303" + transform="matrix(-1,0,0,1,68.007122,83.99992)"> + transform="translate(-0.012711,-83.995405)" + id="g10299"> + id="path10297" + transform="matrix(-1,0,0,1,68.019833,-0.004515)" + d="m 36.007812,284 v 2 h -1.5 c -0.27613,3e-5 -0.499969,0.22387 -0.5,0.5 v 1.49805 l -3.988281,0.006 c -0.812117,9.2e-4 -1.516225,0.45838 -1.832031,1.12695 -0.315807,0.66858 -0.189691,1.55835 0.478516,2.22656 l 4,4 c 0.413276,0.41327 0.416416,0.77582 0.271484,1.08789 -0.144932,0.31206 -0.483162,0.5586 -0.917969,0.5586 l -4.513672,0.006 c -0.676088,-0.008 -0.674098,1.01079 0.002,1 l 4.511719,-0.006 c 0.815193,0 1.513263,-0.46717 1.824219,-1.13672 0.310955,-0.66954 0.189571,-1.55652 -0.470703,-2.2168 l -4,-4 c -0.426033,-0.42603 -0.426504,-0.78429 -0.28125,-1.0918 0.145253,-0.30751 0.489852,-0.55418 0.927734,-0.55468 L 34,288.99805 c 0.0026,2e-5 0.0052,2e-5 0.0078,0 V 290.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1.5 v 2 h 1 v -2 h 1.5 c 0.27613,-3e-5 0.499971,-0.22387 0.5,-0.5 V 289 h 2 v -1 h -2 v -1.5 c -2.9e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.5 v -2 z m -1.027343,3 h 3.027343 v 3 h -3.027343 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + id="g10319" + transform="translate(-21,84)"> + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + id="path10313" /> + d="m 54,285 v 2 h 1 v -2 z m -2.5,3 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 6 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 6 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -6 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 5.027344 v 5 H 52 Z m -4,2 v 1 h 2 v -1 z m 11,0 v 1 h 2 v -1 z m -5,5 v 2 h 1 v -2 z" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + inkscape:connector-curvature="0" /> + id="g10335" + inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none" + id="g10333"> + transform="matrix(-0.94280903,-0.94280903,-0.94280903,0.94280903,832.14463,223.54416)" + d="m 262.58789,287.02734 a 0.60006001,0.60006001 0 0 0 -0.47266,0.95899 l 2.14844,3.02929 -2.14844,3.0293 a 0.60024527,0.60024527 0 1 0 0.97852,0.69531 l 1.90625,-2.6875 1.90625,2.6875 a 0.60024527,0.60024527 0 1 0 0.97852,-0.69531 l -2.14844,-3.0293 2.14844,-3.02929 a 0.60005997,0.60005997 0 0 0 -0.041,-0.75781 0.60005997,0.60005997 0 0 0 -0.9375,0.0625 l -1.90625,2.6875 -1.90625,-2.6875 a 0.60006001,0.60006001 0 0 0 -0.0645,-0.0781 0.60006001,0.60006001 0 0 0 -0.44141,-0.18555 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.33333337px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path10329-8" /> + transform="translate(105.00004,2.4e-4)" + id="g10345"> + style="opacity:0.7" + id="g10341"> + d="M 344.49219,287.99219 A 0.50005,0.50005 0 0 0 344,288.5 v 3 a 0.50005,0.50005 0 1 0 1,0 v -3 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z m 0,5 A 0.50005,0.50005 0 0 0 344,293.5 v 2 a 0.50005,0.50005 0 0 0 0.5,0.5 h 2 a 0.50005,0.50005 0 1 0 0,-1 H 345 v -1.5 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z M 348.5,295 a 0.50005,0.50005 0 1 0 0,1 h 3 a 0.50005,0.50005 0 1 0 0,-1 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + d="m 351.5,293 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 4 a 0.50005,0.50005 0 0 0 0.5,0.5 h 4 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -4 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 0.5,1 h 3 v 3 h -3 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + id="rect10343" + d="m 342.5,284 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 4 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 4 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -4 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g27713" + transform="translate(-80)"> + + + + style="display:inline;enable-background:new" + id="g28033" + transform="translate(21,-21)"> + + + - - - + id="rect28051-4" + transform="translate(21,-21)" + style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" + d="m 616,85 h 1 v 0.999999 h -1 z m -2,0 h 1 v 0.999999 h -1 z m -0.46289,-8 C 612.69436,77 612,77.694362 612,78.537109 v 7.925782 C 612,87.305638 612.69436,88 613.53711,88 h 5.92578 c 0.73741,0 1.36143,-0.531036 1.50586,-1.228516 0.0206,-0.09964 0.0312,-0.20325 0.0312,-0.308593 V 78.537109 C 621,77.694362 620.30564,77 619.46289,77 Z m 0,7 h 5.92578 C 619.76894,84 620,84.231065 620,84.537109 v 1.925782 C 620,86.768935 619.76894,87 619.46289,87 h -5.92578 C 613.23106,87 613,86.768935 613,86.462891 V 84.537109 C 613,84.231065 613.23106,84 613.53711,84 Z" /> + id="g27900" + transform="translate(-123,-21)"> + + + + + + + + + + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" + d="m 114.5,97 c -0.27613,2.8e-5 -0.49997,0.223869 -0.5,0.5 v 3 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 10 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c -3e-5,-0.276131 -0.22387,-0.499972 -0.5,-0.5 z m -3,6 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 3 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 10 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" + id="path27865" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(-357.00711,41.992878)"> + id="g12509-8" /> + id="path27987" + inkscape:connector-curvature="0" /> + style="display:inline;enable-background:new"> + id="path27916-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" /> + d="m 226.98047,602.99023 a 1.0001,1.0001 0 0 0 -0.6875,0.30274 L 222,607.58594 l -2.29297,-2.29297 a 1.0001,1.0001 0 1 0 -1.41406,1.41406 l 3,3 a 1.0001,1.0001 0 0 0 1.41406,0 l 5,-5 a 1.0001,1.0001 0 0 0 -0.72656,-1.7168 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - - - - + id="g28127" + transform="translate(-42,21)"> + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g27942" + style="fill:#ffffff" + transform="translate(-21)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 49.46875,159 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 11 a 0.50005,0.50005 0 0 0 0.5,0.5 h 11 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -11 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 0.5,1 h 10 v 10 h -10 z" + id="path26471-6-1" + inkscape:connector-curvature="0" /> - - - - - - - - - - - + sodipodi:nodetypes="ccccccccc" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g27959" + style="opacity:0.6;fill:#ffffff" + transform="translate(126)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g28608" + transform="rotate(180,370.00356,70.5)" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="g29030"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transform="translate(-2,-2)" + id="g25660" /> + id="g25684" + transform="matrix(1,0,0,-1,0,2500.0142)"> + transform="matrix(1,0,0,-1,62.999999,2500.0142)" + id="path25673" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sccccssscscccccccccccccss" /> + transform="matrix(-1,0,0,1,-263.99995,0)" + id="g25682" /> From 57c41a9c633e4c48aff716d85a0977e4b39a8bdd Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 25 Feb 2021 18:04:36 +0100 Subject: [PATCH 489/519] Icons: Add icon for the upcoming spreadsheet editor The editor is being worked on by the geometry nodes team. Icon created by Andrzej Ambroz (jendrzych). Addresses https://developer.blender.org/T85925. --- release/datafiles/blender_icons.svg | 16 ++++++++++++++++ .../blender_icons16/icon16_spreadsheet.dat | Bin 0 -> 1048 bytes .../blender_icons32/icon32_spreadsheet.dat | Bin 0 -> 4120 bytes source/blender/editors/datafiles/CMakeLists.txt | 1 + source/blender/editors/include/UI_icons.h | 2 +- 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 release/datafiles/blender_icons16/icon16_spreadsheet.dat create mode 100644 release/datafiles/blender_icons32/icon32_spreadsheet.dat diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index c2671666a47..f894ca3f298 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -17285,6 +17285,22 @@ id="g25682" /> + + + + )H;ub~*hD|_v3k#571>zA7{{R0!9f&uh;f0`J0g6chF*fiFDlY_-MAu6S zzYK?ddfC4aYCqUM^rQfk!|Q)^^~Cal=EA~l)P6|%8L;rj7iYAJe|&Z#%hAJrpdAAV zo(-hsK)XlnAJ_;O@bE{@Z|H1b(9op(N4EzTpC0xD?Eux+16KZy+CLipqv>xn|6wZw kf$4%K Date: Thu, 25 Feb 2021 17:51:48 -0500 Subject: [PATCH 490/519] PyAPI Docs: Update Sphinx to 3.5.1 --- doc/python_api/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/python_api/requirements.txt b/doc/python_api/requirements.txt index 0c6a6883145..11423966f06 100644 --- a/doc/python_api/requirements.txt +++ b/doc/python_api/requirements.txt @@ -1,2 +1,2 @@ -Sphinx==3.4.3 +Sphinx==3.5.1 sphinx_rtd_theme==0.5.1 From b1b9671c9329287a9fb56ef88cc59ca32926faa4 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Thu, 25 Feb 2021 18:27:57 -0500 Subject: [PATCH 491/519] Cleanup: commented/out of date rpdb2 import --- doc/python_api/sphinx_doc_gen.py | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 973bc3a33e2..2b659de1cf8 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -75,7 +75,6 @@ def rna_info_BuildRNAInfo_cache(): rna_info_BuildRNAInfo_cache.ret = None # --- end rna_info cache -# import rpdb2; rpdb2.start_embedded_debugger('test') import os import sys import inspect From 81e795e7f011e7746b969c877cfaaeeab100883a Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 25 Feb 2021 19:23:02 -0600 Subject: [PATCH 492/519] Fix T84953: Incorrect tooltip for dragging collections "Shift to parent" does not make any sense for collections since they don't have parenting like objects. This commit just adds a simple check for whether the first drag ID is an object before displaying that part of the message. Differential Revision: https://developer.blender.org/D10203 --- .../editors/space_outliner/outliner_dragdrop.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c index 6df1e449b97..3090cab75ae 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.c +++ b/source/blender/editors/space_outliner/outliner_dragdrop.c @@ -1213,11 +1213,23 @@ static bool collection_drop_poll(bContext *C, *r_tooltip = TIP_("Move after collection"); } break; - case TE_INSERT_INTO: + case TE_INSERT_INTO: { tselem->flag |= TSE_DRAG_INTO; changed = true; - *r_tooltip = TIP_("Move inside collection (Ctrl to link, Shift to parent)"); + + /* Check the type of the drag IDs to avoid the incorrect "Shift to parent" + * for collections. Checking the type of the first ID works fine here since + * all drag IDs are the same type. */ + wmDragID *drag_id = (wmDragID *)drag->ids.first; + const bool is_object = (GS(drag_id->id->name) == ID_OB); + if (is_object) { + *r_tooltip = TIP_("Move inside collection (Ctrl to link, Shift to parent)"); + } + else { + *r_tooltip = TIP_("Move inside collection (Ctrl to link)"); + } break; + } } } if (changed) { From c67b03b810f41c210b899e77c1e26e5b2db75b31 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Thu, 25 Feb 2021 20:31:22 -0500 Subject: [PATCH 493/519] Cleanup: Clang Format --- source/blender/editors/object/object_select.c | 3 ++- source/blender/makesrna/intern/rna_meta.c | 8 ++++++-- source/blender/makesrna/intern/rna_particle.c | 13 ++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 398ad89a694..9160190764c 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -1311,7 +1311,8 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot) /* identifiers */ ot->name = "Select Mirror"; - ot->description = "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\""; + ot->description = + "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\""; ot->idname = "OBJECT_OT_select_mirror"; /* api callbacks */ diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c index ffdd75e63ac..d5018a6911d 100644 --- a/source/blender/makesrna/intern/rna_meta.c +++ b/source/blender/makesrna/intern/rna_meta.c @@ -294,8 +294,12 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop) func = RNA_def_function(srna, "new", "rna_MetaBall_elements_new"); RNA_def_function_ui_description(func, "Add a new element to the metaball"); - RNA_def_enum( - func, "type", rna_enum_metaelem_type_items, MB_BALL, "", "Type for the new metaball element"); + RNA_def_enum(func, + "type", + rna_enum_metaelem_type_items, + MB_BALL, + "", + "Type for the new metaball element"); parm = RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaball element"); RNA_def_function_return(func, parm); diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 9e8a2b83f07..f81f965d0c8 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -1921,8 +1921,9 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna) PropertyRNA *prop; srna = RNA_def_struct(brna, "ParticleDupliWeight", NULL); - RNA_def_struct_ui_text( - srna, "Particle Instance Object Weight", "Weight of a particle instance object in a collection"); + RNA_def_struct_ui_text(srna, + "Particle Instance Object Weight", + "Weight of a particle instance object in a collection"); RNA_def_struct_sdna(srna, "ParticleDupliWeight"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); @@ -3170,7 +3171,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr"); RNA_def_property_range(prop, 0, 100000); RNA_def_property_ui_range(prop, 0, 10000, 1, -1); - RNA_def_property_ui_text(prop, "Rendered Children", "Number of children per parent for rendering"); + RNA_def_property_ui_text( + prop, "Rendered Children", "Number of children per parent for rendering"); prop = RNA_def_property(srna, "virtual_parents", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "parents"); @@ -3463,8 +3465,9 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "instance_weights", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "instance_weights", NULL); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); - RNA_def_property_ui_text( - prop, "Instance Collection Weights", "Weights for all of the objects in the instance collection"); + RNA_def_property_ui_text(prop, + "Instance Collection Weights", + "Weights for all of the objects in the instance collection"); prop = RNA_def_property(srna, "active_instanceweight", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "ParticleDupliWeight"); From c402cfa3085188dabcb7b8576f85d482b3efae1f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:30:06 +1100 Subject: [PATCH 494/519] Cleanup: move comment into function doc-string --- source/blender/editors/armature/editarmature_undo.c | 1 - source/blender/editors/curve/editcurve_undo.c | 1 - source/blender/editors/lattice/editlattice_undo.c | 1 - source/blender/editors/mesh/editmesh_undo.c | 1 - source/blender/editors/metaball/editmball_undo.c | 1 - source/blender/editors/undo/ed_undo.c | 3 +++ 6 files changed, 3 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/armature/editarmature_undo.c b/source/blender/editors/armature/editarmature_undo.c index 3768de96340..725945f8edc 100644 --- a/source/blender/editors/armature/editarmature_undo.c +++ b/source/blender/editors/armature/editarmature_undo.c @@ -187,7 +187,6 @@ static void armature_undosys_step_decode(struct bContext *C, { ArmatureUndoStep *us = (ArmatureUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c index 48666821732..b07c3c85f4a 100644 --- a/source/blender/editors/curve/editcurve_undo.c +++ b/source/blender/editors/curve/editcurve_undo.c @@ -248,7 +248,6 @@ static void curve_undosys_step_decode(struct bContext *C, { CurveUndoStep *us = (CurveUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); diff --git a/source/blender/editors/lattice/editlattice_undo.c b/source/blender/editors/lattice/editlattice_undo.c index 2a6edc3249f..d92a81179cc 100644 --- a/source/blender/editors/lattice/editlattice_undo.c +++ b/source/blender/editors/lattice/editlattice_undo.c @@ -221,7 +221,6 @@ static void lattice_undosys_step_decode(struct bContext *C, { LatticeUndoStep *us = (LatticeUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index 67816f069f6..79385e28aa9 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -775,7 +775,6 @@ static void mesh_undosys_step_decode(struct bContext *C, { MeshUndoStep *us = (MeshUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); diff --git a/source/blender/editors/metaball/editmball_undo.c b/source/blender/editors/metaball/editmball_undo.c index 457c5330595..a8b471a7c92 100644 --- a/source/blender/editors/metaball/editmball_undo.c +++ b/source/blender/editors/metaball/editmball_undo.c @@ -196,7 +196,6 @@ static void mball_undosys_step_decode(struct bContext *C, { MBallUndoStep *us = (MBallUndoStep *)us_p; - /* Load all our objects into edit-mode, clear everything else. */ ED_undo_object_editmode_restore_helper( C, &us->elems[0].obedit_ref.ptr, us->elems_len, sizeof(*us->elems)); diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index 2e5d233f207..7d8f72f3779 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -863,6 +863,9 @@ void ED_undo_object_set_active_or_warn( } } +/** + * Load all our objects from `object_array` into edit-mode, clear everything else. + */ void ED_undo_object_editmode_restore_helper(struct bContext *C, Object **object_array, uint object_array_len, From 0c9607312f83fa3bbbabe245e97dbc96665f6e70 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:30:07 +1100 Subject: [PATCH 495/519] Undo: don't log an error when the undo limit has been exceeded --- source/blender/blenkernel/intern/undo_system.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index bb871e84c7b..52f0fe3f5a2 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -768,10 +768,13 @@ bool BKE_undosys_step_load_data_ex(UndoStack *ustack, while (us_target_active != NULL && us_target_active->skip) { us_target_active = (undo_dir == -1) ? us_target_active->prev : us_target_active->next; } - } - if (us_target_active == NULL) { - CLOG_ERROR(&LOG, "could not find a valid final active target step"); - return false; + if (us_target_active == NULL) { + CLOG_INFO(&LOG, + 2, + "undo/redo did not find a step after stepping over skip-steps " + "(undo limit exceeded)"); + return false; + } } CLOG_INFO(&LOG, From b7939a059f9056ae57b4720a4c98dbe9025de407 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:30:07 +1100 Subject: [PATCH 496/519] Undo: use low level API calls to enable font edit-mode While I couldn't redo a bug in this case, it's possible for the active object to become out of sync in rare cases, so best use these functions. --- source/blender/editors/curve/editfont_undo.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/curve/editfont_undo.c b/source/blender/editors/curve/editfont_undo.c index 8f7eb19dfe8..a305a997d50 100644 --- a/source/blender/editors/curve/editfont_undo.c +++ b/source/blender/editors/curve/editfont_undo.c @@ -23,6 +23,8 @@ #include "MEM_guardedalloc.h" +#include "CLG_log.h" + #include "BLI_array_utils.h" #include "BLI_utildefines.h" @@ -39,6 +41,7 @@ #include "ED_curve.h" #include "ED_object.h" +#include "ED_undo.h" #include "WM_api.h" #include "WM_types.h" @@ -53,6 +56,9 @@ # define ARRAY_CHUNK_SIZE 32 #endif +/** Only needed this locally. */ +static CLG_LogRef LOG = {"ed.undo.font"}; + /* -------------------------------------------------------------------- */ /** \name Undo Conversion * \{ */ @@ -364,15 +370,22 @@ static void font_undosys_step_decode(struct bContext *C, const eUndoStepDir UNUSED(dir), bool UNUSED(is_final)) { - /* TODO(campbell): undo_system: use low-level API to set mode. */ - ED_object_mode_set_ex(C, OB_MODE_EDIT, false, NULL); - BLI_assert(font_undosys_poll(C)); FontUndoStep *us = (FontUndoStep *)us_p; Object *obedit = us->obedit_ref.ptr; + + /* Pass in an array of 1 (typically used for multi-object edit-mode). */ + ED_undo_object_editmode_restore_helper(C, &obedit, 1, sizeof(Object *)); + Curve *cu = obedit->data; undofont_to_editfont(&us->data, cu); DEG_id_tag_update(&obedit->id, ID_RECALC_GEOMETRY); + + ED_undo_object_set_active_or_warn( + CTX_data_scene(C), CTX_data_view_layer(C), obedit, us_p->name, &LOG); + + BLI_assert(font_undosys_poll(C)); + cu->editfont->needs_flush_to_id = 1; bmain->is_memfile_undo_flush_needed = true; WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL); From 9059ee81ef6be5c1eb6157db426165f5a9c2b74a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:30:08 +1100 Subject: [PATCH 497/519] Fix particle-edit crash on undo/redo Undo/redo was crashing & asserting. There ware two bugs: - Entering particle system edit-mode requires an evaluated depsgraph. - The active object could get out of sync when undo/redo moves between different modes. The new test 'view3d_mesh_particle_edit_mode_simple' in `tests/ui_simulate/test_undo.py` exposes both issues. --- source/blender/editors/physics/CMakeLists.txt | 1 + source/blender/editors/physics/particle_edit.c | 3 +++ .../blender/editors/physics/particle_edit_undo.c | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt index 2b9d9aaa0e1..a607663763e 100644 --- a/source/blender/editors/physics/CMakeLists.txt +++ b/source/blender/editors/physics/CMakeLists.txt @@ -25,6 +25,7 @@ set(INC ../../makesdna ../../makesrna ../../windowmanager + ../../../../intern/clog ../../../../intern/glew-mx ../../../../intern/guardedalloc ../../../../intern/mantaflow/extern diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index ec3eb9c6a3a..d0ebac82c90 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -5395,6 +5395,9 @@ static void free_all_psys_edit(Object *object) void ED_object_particle_edit_mode_enter_ex(Depsgraph *depsgraph, Scene *scene, Object *ob) { + /* Needed so #ParticleSystemModifierData.mesh_final is set. */ + BKE_scene_graph_evaluated_ensure(depsgraph, G_MAIN); + PTCacheEdit *edit; ob->mode |= OB_MODE_PARTICLE_EDIT; diff --git a/source/blender/editors/physics/particle_edit_undo.c b/source/blender/editors/physics/particle_edit_undo.c index 5d2e0e5b6ef..c764a5fd80f 100644 --- a/source/blender/editors/physics/particle_edit_undo.c +++ b/source/blender/editors/physics/particle_edit_undo.c @@ -27,6 +27,8 @@ #include "MEM_guardedalloc.h" +#include "CLG_log.h" + #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" @@ -44,11 +46,15 @@ #include "ED_object.h" #include "ED_particle.h" #include "ED_physics.h" +#include "ED_undo.h" #include "particle_edit_utildefines.h" #include "physics_intern.h" +/** Only needed this locally. */ +static CLG_LogRef LOG = {"ed.undo.particle_edit"}; + /* -------------------------------------------------------------------- */ /** \name Undo Conversion * \{ */ @@ -251,13 +257,13 @@ static void particle_undosys_step_decode(struct bContext *C, bool UNUSED(is_final)) { Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); - /* TODO(campbell): undo_system: use low-level API to set mode. */ - ED_object_mode_set_ex(C, OB_MODE_PARTICLE_EDIT, false, NULL); - BLI_assert(particle_undosys_poll(C)); ParticleUndoStep *us = (ParticleUndoStep *)us_p; Scene *scene = us->scene_ref.ptr; Object *ob = us->object_ref.ptr; + + ED_object_particle_edit_mode_enter_ex(depsgraph, scene, ob); + PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); if (edit) { undoptcache_to_editcache(&us->data, edit); @@ -267,6 +273,10 @@ static void particle_undosys_step_decode(struct bContext *C, BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); } DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + + ED_undo_object_set_active_or_warn(scene, CTX_data_view_layer(C), ob, us_p->name, &LOG); + + BLI_assert(particle_undosys_poll(C)); } else { BLI_assert(0); From 7cb55a79d82d3e2e9d330368492210b17f6e1eac Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:50:36 +1100 Subject: [PATCH 498/519] Cleanup: use boolean arguments --- source/blender/blenkernel/BKE_node.h | 2 +- source/blender/blenkernel/BKE_screen.h | 2 +- source/blender/blenkernel/intern/node.cc | 9 +++++---- source/blender/blenkernel/intern/screen.c | 2 +- source/blender/editors/physics/particle_edit.c | 6 +++--- source/blender/editors/render/render_internal.c | 2 +- source/blender/render/RE_pipeline.h | 2 +- source/blender/render/intern/engine.c | 10 +++++----- source/blender/render/intern/pipeline.c | 2 +- source/blender/render/intern/render_types.h | 2 +- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 76d5eb945bb..d675df6d868 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -777,7 +777,7 @@ void BKE_node_preview_free(struct bNodePreview *preview); void BKE_node_preview_init_tree(struct bNodeTree *ntree, int xsize, int ysize, - int create_previews); + bool create_previews); void BKE_node_preview_free_tree(struct bNodeTree *ntree); void BKE_node_preview_remove_unused(struct bNodeTree *ntree); void BKE_node_preview_clear(struct bNodePreview *preview); diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 32c888b058f..085851ba5e6 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -404,7 +404,7 @@ void BKE_spacetypes_free(void); /* only for quitting blender */ /* spacedata */ void BKE_spacedata_freelist(ListBase *lb); void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2); -void BKE_spacedata_draw_locks(int set); +void BKE_spacedata_draw_locks(bool set); struct ARegion *BKE_spacedata_find_region_type(const struct SpaceLink *slink, const struct ScrArea *area, diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 58003c03f8c..7bd7fb4a29b 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -2501,7 +2501,7 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews, bNodeInstanceKey parent_key, int xsize, int ysize, - int create) + bool create_previews) { LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { bNodeInstanceKey key = BKE_node_instance_key(parent_key, ntree, node); @@ -2510,16 +2510,17 @@ static void node_preview_init_tree_recursive(bNodeInstanceHash *previews, node->preview_xsize = xsize; node->preview_ysize = ysize; - BKE_node_preview_verify(previews, key, xsize, ysize, create); + BKE_node_preview_verify(previews, key, xsize, ysize, create_previews); } if (node->type == NODE_GROUP && node->id) { - node_preview_init_tree_recursive(previews, (bNodeTree *)node->id, key, xsize, ysize, create); + node_preview_init_tree_recursive( + previews, (bNodeTree *)node->id, key, xsize, ysize, create_previews); } } } -void BKE_node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize, int create_previews) +void BKE_node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize, bool create_previews) { if (!ntree) { return; diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 07619466bc5..8b911143668 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -533,7 +533,7 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2) /* facility to set locks for drawing to survive (render) threads accessing drawing data */ /* lock can become bitflag too */ /* should be replaced in future by better local data handling for threads */ -void BKE_spacedata_draw_locks(int set) +void BKE_spacedata_draw_locks(bool set) { LISTBASE_FOREACH (SpaceType *, st, &spacetypes) { LISTBASE_FOREACH (ARegionType *, art, &st->regiontypes) { diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index d0ebac82c90..1ee17d0e4b0 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -302,7 +302,7 @@ static void pe_update_hair_particle_edit_pointers(PTCacheEdit *edit) * * note: this function runs on poll, therefore it can runs many times a second * keep it fast! */ -static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob, int create) +static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob, bool create) { ParticleEditSettings *pset = PE_settings(scene); PTCacheEdit *edit = NULL; @@ -406,12 +406,12 @@ static PTCacheEdit *pe_get_current(Depsgraph *depsgraph, Scene *scene, Object *o PTCacheEdit *PE_get_current(Depsgraph *depsgraph, Scene *scene, Object *ob) { - return pe_get_current(depsgraph, scene, ob, 0); + return pe_get_current(depsgraph, scene, ob, false); } PTCacheEdit *PE_create_current(Depsgraph *depsgraph, Scene *scene, Object *ob) { - return pe_get_current(depsgraph, scene, ob, 1); + return pe_get_current(depsgraph, scene, ob, true); } void PE_current_changed(Depsgraph *depsgraph, Scene *scene, Object *ob) diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 50ba5907703..b525d8a373e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -800,7 +800,7 @@ static int render_break(void *UNUSED(rjv)) /* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */ /* maybe need a way to get job send notifier? */ -static void render_drawlock(void *rjv, int lock) +static void render_drawlock(void *rjv, bool lock) { RenderJob *rj = rjv; diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h index 688709d55f3..27dcd9e70ed 100644 --- a/source/blender/render/RE_pipeline.h +++ b/source/blender/render/RE_pipeline.h @@ -331,7 +331,7 @@ void RE_display_update_cb(struct Render *re, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect)); void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)); void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float)); -void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, int)); +void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock)); void RE_test_break_cb(struct Render *re, void *handle, int (*f)(void *handle)); void RE_current_scene_update_cb(struct Render *re, void *handle, diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index b199b1b0743..a43a78f5d3d 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -757,7 +757,7 @@ static void engine_render_view_layer(Render *re, { /* Lock UI so scene can't be edited while we read from it in this render thread. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 1); + re->draw_lock(re->dlh, true); } /* Create depsgraph with scene evaluated at render resolution. */ @@ -773,7 +773,7 @@ static void engine_render_view_layer(Render *re, } if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Perform render with engine. */ @@ -824,7 +824,7 @@ bool RE_engine_render(Render *re, bool do_all) /* Lock drawing in UI during data phase. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 1); + re->draw_lock(re->dlh, true); } /* update animation here so any render layer animation is applied before @@ -852,7 +852,7 @@ bool RE_engine_render(Render *re, bool do_all) if (re->result == NULL) { /* Clear UI drawing locks. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Too small image is handled earlier, here it could only happen if * there was no sufficient memory to allocate all passes. @@ -902,7 +902,7 @@ bool RE_engine_render(Render *re, bool do_all) /* Clear UI drawing locks. */ if (re->draw_lock) { - re->draw_lock(re->dlh, 0); + re->draw_lock(re->dlh, false); } /* Render view layers. */ diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index 0a8b8f24614..92bec9c6fd4 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -1017,7 +1017,7 @@ void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float)) re->prh = handle; } -void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, int i)) +void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, bool lock)) { re->draw_lock = f; re->dlh = handle; diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h index 7a4374dcf7c..0488bf6e87a 100644 --- a/source/blender/render/intern/render_types.h +++ b/source/blender/render/intern/render_types.h @@ -141,7 +141,7 @@ struct Render { void (*progress)(void *handle, float i); void *prh; - void (*draw_lock)(void *handle, int i); + void (*draw_lock)(void *handle, bool lock); void *dlh; int (*test_break)(void *handle); void *tbh; From 72ceab8ab256ea53e364a2e9ae9ef3f62b634373 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Feb 2021 16:59:26 +1100 Subject: [PATCH 499/519] Cleanup: use early exit --- .../editors/physics/particle_edit_undo.c | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/physics/particle_edit_undo.c b/source/blender/editors/physics/particle_edit_undo.c index c764a5fd80f..2c7b5c0de6a 100644 --- a/source/blender/editors/physics/particle_edit_undo.c +++ b/source/blender/editors/physics/particle_edit_undo.c @@ -265,22 +265,25 @@ static void particle_undosys_step_decode(struct bContext *C, ED_object_particle_edit_mode_enter_ex(depsgraph, scene, ob); PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob); - if (edit) { - undoptcache_to_editcache(&us->data, edit); - ParticleEditSettings *pset = &scene->toolsettings->particle; - if ((pset->flag & PE_DRAW_PART) != 0) { - psys_free_path_cache(NULL, edit); - BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); - } - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); - ED_undo_object_set_active_or_warn(scene, CTX_data_view_layer(C), ob, us_p->name, &LOG); - - BLI_assert(particle_undosys_poll(C)); - } - else { + /* While this shouldn't happen, entering particle edit-mode uses a more complex + * setup compared to most other modes which we can't ensure succeeds. */ + if (UNLIKELY(edit == NULL)) { BLI_assert(0); + return; } + + undoptcache_to_editcache(&us->data, edit); + ParticleEditSettings *pset = &scene->toolsettings->particle; + if ((pset->flag & PE_DRAW_PART) != 0) { + psys_free_path_cache(NULL, edit); + BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); + } + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + + ED_undo_object_set_active_or_warn(scene, CTX_data_view_layer(C), ob, us_p->name, &LOG); + + BLI_assert(particle_undosys_poll(C)); } static void particle_undosys_step_free(UndoStep *us_p) From 53d13b6f5387c686a7df84ea8ead801e42a84a7f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 26 Feb 2021 11:59:14 +0100 Subject: [PATCH 500/519] UX: Readfile: Libraries error messages: avoid wall of warnings. When a lot of libraries or linked IDs were missing/not found when loading a .blend file, Blender used to show one warning report for each missing item, potentially covering the user's screen with a giant unuable popup. Now it will instead generate a single warning with amount of missing lib files and linked IDs. Each missing item is still reported individually, but only as `INFO`, so it will still show up in the console or Info editor. --- source/blender/blenloader/intern/readfile.c | 18 ++++++++++++++++-- source/blender/blenloader/intern/readfile.h | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bea05699579..dd855ebae0b 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5273,12 +5273,13 @@ static void read_library_linked_id( } else { BLO_reportf_wrap(reports, - RPT_WARNING, + RPT_INFO, TIP_("LIB: %s: '%s' missing from '%s', parent '%s'"), BKE_idtype_idcode_to_name(GS(id->name)), id->name + 2, mainvar->curlib->filepath_abs, library_parent_filepath(mainvar->curlib)); + fd->library_id_missing_count++; /* Generate a placeholder for this ID (simplified version of read_libblock actually...). */ if (r_id) { @@ -5432,7 +5433,8 @@ static FileData *read_library_file_data(FileData *basefd, if (fd == NULL) { BLO_reportf_wrap( - basefd->reports, RPT_WARNING, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs); + basefd->reports, RPT_INFO, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs); + fd->library_file_missing_count++; } return fd; @@ -5481,6 +5483,9 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) /* Test if linked data-locks need to read further linked data-locks * and create link placeholders for them. */ BLO_expand_main(fd, mainptr); + + basefd->library_file_missing_count += fd->library_file_missing_count; + basefd->library_id_missing_count += fd->library_id_missing_count; } } } @@ -5526,6 +5531,15 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) mainptr->curlib->filedata = NULL; } BKE_main_free(main_newid); + + if (basefd->library_file_missing_count != 0 || basefd->library_id_missing_count != 0) { + BKE_reportf(basefd->reports, + RPT_WARNING, + "LIB: %d libraries and %d linked data-blocks are missing, please check the " + "Info and Outliner editors for details", + basefd->library_file_missing_count, + basefd->library_id_missing_count); + } } void *BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address) diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index 425932498f1..b81d8bd9a2b 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -138,6 +138,10 @@ typedef struct FileData { struct IDNameLib_Map *old_idmap; struct ReportList *reports; + /* Counters for amount of missing libraries, and missing IDs in libraries. + * Used to generate a synthetic report in the UI. */ + int library_file_missing_count; + int library_id_missing_count; } FileData; #define SIZEOFBLENDERHEADER 12 From e1a541c689b21e4aa759bb497dbcfc45b8220637 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Fri, 26 Feb 2021 12:23:41 +0100 Subject: [PATCH 501/519] CMake/Deps: Python 3.9.2 Straight up minor version bump, no anomalies to report Reviewed By: sebbas, sybren Differential Revision: https://developer.blender.org/D10523 --- build_files/build_environment/cmake/versions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 5b9c709d04b..c41a42ad873 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -143,11 +143,11 @@ set(OSL_VERSION 1.11.10.0) set(OSL_URI https://github.com/imageworks/OpenShadingLanguage/archive/Release-${OSL_VERSION}.tar.gz) set(OSL_HASH dfdc23597aeef083832cbada62211756) -set(PYTHON_VERSION 3.9.1) +set(PYTHON_VERSION 3.9.2) set(PYTHON_SHORT_VERSION 3.9) set(PYTHON_SHORT_VERSION_NO_DOTS 39) set(PYTHON_URI https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz) -set(PYTHON_HASH 61981498e75ac8f00adcb908281fadb6) +set(PYTHON_HASH f0dc9000312abeb16de4eccce9a870ab) set(TBB_VERSION 2020_U2) set(TBB_URI https://github.com/oneapi-src/oneTBB/archive/${TBB_VERSION}.tar.gz) From 17534e28ff44cf3d002e9ca198fd83909814c0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 26 Feb 2021 12:44:08 +0100 Subject: [PATCH 502/519] Assets: Preview rendering for Action datablocks Render previews for Action datablocks by rendering the scene camera with the Workbench (solid) engine. The //look// can be configured by setting the scene's render engine to Workbench and editing the scene's shading properties. It is assumed that the pose has already been applied and that the scene camera is capturing the pose. In other words, the render function just renders from the scene camera without evaluating/applying the Action stored in `preview->id`. The ID is only used to determine its type and to store the resulting preview. Not all code paths that lead to the `action_preview_render()` function actually provide a depsgraph. The "Refresh Asset Preview" button (`ED_OT_lib_id_generate_preview`) does, but `WM_OT_previews_ensure` does not. Reviewed By: Severin Differential Revision: https://developer.blender.org/D10543 --- source/blender/editors/include/ED_render.h | 1 + .../editors/interface/interface_icons.c | 9 +- .../blender/editors/render/render_preview.c | 91 +++++++++++++++++-- 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h index a49fe1aa544..ed35b9138f3 100644 --- a/source/blender/editors/include/ED_render.h +++ b/source/blender/editors/include/ED_render.h @@ -92,6 +92,7 @@ void ED_preview_shader_job(const struct bContext *C, int sizey, int method); void ED_preview_icon_render(struct Main *bmain, + struct Depsgraph *depsgraph, struct Scene *scene, struct ID *id, unsigned int *rect, diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 1739035f92c..c16c3d2c49a 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -1426,8 +1426,13 @@ static void icon_set_image(const bContext *C, scene = CTX_data_scene(C); } /* Immediate version */ - ED_preview_icon_render( - CTX_data_main(C), scene, id, prv_img->rect[size], prv_img->w[size], prv_img->h[size]); + ED_preview_icon_render(CTX_data_main(C), + CTX_data_ensure_evaluated_depsgraph(C), + scene, + id, + prv_img->rect[size], + prv_img->w[size], + prv_img->h[size]); } } diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 4e766841c24..9811b7caa38 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -145,6 +145,7 @@ typedef struct IconPreviewSize { typedef struct IconPreview { Main *bmain; + Depsgraph *depsgraph; /* May be NULL (see #WM_OT_previews_ensure). */ Scene *scene; void *owner; ID *id, *id_copy; /* May be NULL! (see ICON_TYPE_PREVIEW case in #ui_icon_ensure_deferred()) */ @@ -807,6 +808,59 @@ static void object_preview_render(IconPreview *preview, IconPreviewSize *preview /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Action Preview + * \{ */ + +/* Render a pose. It is assumed that the pose has already been applied and that the scene camera is + * capturing the pose. In other words, this function just renders from the scene camera without + * evaluating the Action stored in preview->id. */ +static void action_preview_render(IconPreview *preview, IconPreviewSize *preview_sized) +{ + char err_out[256] = ""; + + Depsgraph *depsgraph = preview->depsgraph; + /* Not all code paths that lead to this function actually provide a depsgraph. + * The "Refresh Asset Preview" button (ED_OT_lib_id_generate_preview) does, + * but WM_OT_previews_ensure does not. */ + BLI_assert(depsgraph != NULL); + BLI_assert(preview->scene == DEG_get_input_scene(depsgraph)); + + Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); + Object *camera_eval = scene_eval->camera; + if (camera_eval == NULL) { + printf("Scene has no camera, unable to render preview of %s without it.\n", + preview->id->name + 2); + return; + } + + /* This renders with the Workbench engine settings stored on the Scene. */ + ImBuf *ibuf = ED_view3d_draw_offscreen_imbuf_simple(depsgraph, + scene_eval, + NULL, + OB_SOLID, + camera_eval, + preview_sized->sizex, + preview_sized->sizey, + IB_rect, + V3D_OFSDRAW_NONE, + R_ALPHAPREMUL, + NULL, + NULL, + err_out); + + if (err_out[0] != '\0') { + printf("Error rendering Action %s preview: %s\n", preview->id->name + 2, err_out); + } + + if (ibuf) { + icon_copy_rect(ibuf, preview_sized->sizex, preview_sized->sizey, preview_sized->rect); + IMB_freeImBuf(ibuf); + } +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name New Shader Preview System * \{ */ @@ -1440,7 +1494,15 @@ static void icon_preview_startjob_all_sizes(void *customdata, continue; } - if (preview_method_is_render(pr_method) && !check_engine_supports_preview(ip->scene)) { + /* check_engine_supports_preview() checks whether the engine supports "preview mode" (think: + * Material Preview). This check is only relevant when the render function called below is + * going to use such a mode. Object and Action render functions use Solid mode, though, so they + * can skip this test. */ + /* TODO: Decouple the ID-type-specific render functions from this function, so that it's not + * necessary to know here what happens inside lower-level functions. */ + const bool use_solid_render_mode = (ip->id != NULL) && ELEM(GS(ip->id->name), ID_OB, ID_AC); + if (!use_solid_render_mode && preview_method_is_render(pr_method) && + !check_engine_supports_preview(ip->scene)) { continue; } @@ -1451,13 +1513,21 @@ static void icon_preview_startjob_all_sizes(void *customdata, } #endif - if (ip->id && ELEM(GS(ip->id->name), ID_OB)) { - /* Much simpler than the ShaderPreview mess used for other ID types. */ - object_preview_render(ip, cur_size); - } - else { - other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress); + if (ip->id != NULL) { + switch (GS(ip->id->name)) { + case ID_OB: + /* Much simpler than the ShaderPreview mess used for other ID types. */ + object_preview_render(ip, cur_size); + continue; + case ID_AC: + action_preview_render(ip, cur_size); + continue; + default: + /* Fall through to the same code as the `ip->id == NULL` case. */ + break; + } } + other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress); } } @@ -1537,7 +1607,8 @@ static void icon_preview_free(void *customdata) MEM_freeN(ip); } -void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, uint *rect, int sizex, int sizey) +void ED_preview_icon_render( + Main *bmain, Depsgraph *depsgraph, Scene *scene, ID *id, uint *rect, int sizex, int sizey) { IconPreview ip = {NULL}; short stop = false, update = false; @@ -1547,6 +1618,7 @@ void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, uint *rect, int s ip.bmain = bmain; ip.scene = scene; + ip.depsgraph = depsgraph; ip.owner = BKE_previewimg_id_ensure(id); ip.id = id; /* Control isn't given back to the caller until the preview is done. So we don't need to copy @@ -1591,7 +1663,8 @@ void ED_preview_icon_job( /* customdata for preview thread */ ip->bmain = CTX_data_main(C); - ip->scene = CTX_data_scene(C); + ip->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + ip->scene = DEG_get_input_scene(ip->depsgraph); ip->owner = owner; ip->id = id; ip->id_copy = duplicate_ids(id, false); From c489bb7c016fe4567516fbab4cc940b81f8e840f Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 25 Feb 2021 19:51:10 +0100 Subject: [PATCH 503/519] GPencil: Cancel Fill if the filled area is not closed Fill only if it never comes in contact with an edge. It is better not to fill than to fill the entire area, as this is confusing for the artist. Differential Revision: https://developer.blender.org/D10536 --- source/blender/editors/gpencil/gpencil_fill.c | 117 ++++++++++-------- 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index bf228af88a5..406daf9f92e 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -124,7 +124,8 @@ typedef struct tGPDfill { struct bGPDframe *gpf; /** Temp mouse position stroke. */ struct bGPDstroke *gps_mouse; - + /** Pointer to report messages. */ + struct ReportList *reports; /** flags */ short flag; /** avoid too fast events */ @@ -862,7 +863,7 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index * * \param tgpf: Temporary fill data. */ -static void gpencil_boundaryfill_area(tGPDfill *tgpf) +static bool gpencil_boundaryfill_area(tGPDfill *tgpf) { ImBuf *ibuf; float rgba[4]; @@ -870,6 +871,7 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) const float fill_col[4] = {0.0f, 1.0f, 0.0f, 1.0f}; ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); const int maxpixel = (ibuf->x * ibuf->y) - 1; + bool border_contact = false; BLI_Stack *stack = BLI_stack_new(sizeof(int), __func__); @@ -912,6 +914,11 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) get_pixel(ibuf, v, rgba); + /* Determine if the flood contacts with external borders. */ + if (rgba[3] == 0.5f) { + border_contact = true; + } + /* check if no border(red) or already filled color(green) */ if ((rgba[0] != 1.0f) && (rgba[1] != 1.0f)) { /* fill current pixel with green */ @@ -955,6 +962,8 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf) tgpf->ima->id.tag |= LIB_TAG_DOIT; /* free temp stack data */ BLI_stack_free(stack); + + return border_contact; } /* Set a border to create image limits. */ @@ -962,7 +971,7 @@ static void gpencil_set_borders(tGPDfill *tgpf, const bool transparent) { ImBuf *ibuf; void *lock; - const float fill_col[2][4] = {{1.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f, 0.0f}}; + const float fill_col[2][4] = {{1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f, 0.0f}}; ibuf = BKE_image_acquire_ibuf(tgpf->ima, NULL, &lock); int idx; int pixel = 0; @@ -1628,7 +1637,7 @@ static bool gpencil_fill_poll(bContext *C) } /* Allocate memory and initialize values */ -static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) +static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *op) { tGPDfill *tgpf = MEM_callocN(sizeof(tGPDfill), "GPencil Fill Data"); @@ -1650,6 +1659,7 @@ static tGPDfill *gpencil_session_init_fill(bContext *C, wmOperator *UNUSED(op)) tgpf->depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tgpf->win = CTX_wm_window(C); tgpf->active_cfra = CFRA; + tgpf->reports = op->reports; /* Setup space conversions. */ gpencil_point_conversion_init(C, &tgpf->gsc); @@ -1957,61 +1967,68 @@ static bool gpencil_do_frame_fill(tGPDfill *tgpf, const bool is_inverted) gpencil_set_borders(tgpf, true); /* apply boundary fill */ - gpencil_boundaryfill_area(tgpf); - - /* Invert direction if press Ctrl. */ - if (is_inverted) { - gpencil_invert_image(tgpf); - } - - /* Clean borders to avoid infinite loops. */ - gpencil_set_borders(tgpf, false); - WM_cursor_time(win, 50); - int totpoints_prv = 0; - int loop_limit = 0; - while (totpoints > 0) { - /* analyze outline */ - gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); - - /* create array of points from stack */ - totpoints = gpencil_points_from_stack(tgpf); - - /* create z-depth array for reproject */ - gpencil_get_depth_array(tgpf); - - /* create stroke and reproject */ - gpencil_stroke_from_buffer(tgpf); + const bool border_contact = gpencil_boundaryfill_area(tgpf); + /* Fill only if it never comes in contact with an edge. It is better not to fill than + * to fill the entire area, as this is confusing for the artist. */ + if ((!border_contact) || (is_inverted)) { + /* Invert direction if press Ctrl. */ if (is_inverted) { - gpencil_erase_processed_area(tgpf); - } - else { - /* Exit of the loop. */ - totpoints = 0; + gpencil_invert_image(tgpf); } - /* free temp stack data */ - if (tgpf->stack) { - BLI_stack_free(tgpf->stack); - } - WM_cursor_time(win, 100); + /* Clean borders to avoid infinite loops. */ + gpencil_set_borders(tgpf, false); + WM_cursor_time(win, 50); + int totpoints_prv = 0; + int loop_limit = 0; + while (totpoints > 0) { + /* analyze outline */ + gpencil_get_outline_points(tgpf, (totpoints == 1) ? true : false); - /* Free memory. */ - MEM_SAFE_FREE(tgpf->sbuffer); - MEM_SAFE_FREE(tgpf->depth_arr); + /* create array of points from stack */ + totpoints = gpencil_points_from_stack(tgpf); - /* Limit very small areas. */ - if (totpoints < 3) { - break; - } - /* Limit infinite loops is some corner cases. */ - if (totpoints_prv == totpoints) { - loop_limit++; - if (loop_limit > 3) { + /* create z-depth array for reproject */ + gpencil_get_depth_array(tgpf); + + /* create stroke and reproject */ + gpencil_stroke_from_buffer(tgpf); + + if (is_inverted) { + gpencil_erase_processed_area(tgpf); + } + else { + /* Exit of the loop. */ + totpoints = 0; + } + + /* free temp stack data */ + if (tgpf->stack) { + BLI_stack_free(tgpf->stack); + } + WM_cursor_time(win, 100); + + /* Free memory. */ + MEM_SAFE_FREE(tgpf->sbuffer); + MEM_SAFE_FREE(tgpf->depth_arr); + + /* Limit very small areas. */ + if (totpoints < 3) { break; } + /* Limit infinite loops is some corner cases. */ + if (totpoints_prv == totpoints) { + loop_limit++; + if (loop_limit > 3) { + break; + } + } + totpoints_prv = totpoints; } - totpoints_prv = totpoints; + } + else { + BKE_report(tgpf->reports, RPT_INFO, "Unable to fill unclosed areas"); } /* Delete temp image. */ From 87ace4682761bdeaa8f18ae12a186dbfb83d4e04 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 26 Feb 2021 14:13:15 +0100 Subject: [PATCH 504/519] Cryptomatte: Manifest Parsing. This patch adds manifest parsing to Cryptomatte. Normally when loading cryptomatte layer from an OpenEXR file the manifest contains data to convert a hash to its original name of the object/material. In the future we want to use this to support lookup of cryptomatte hashes and show it to the user. Currently this logic isn't available to users (for now), but is required by D3959 where a new cryptomatte workflow is implemented. --- source/blender/blenkernel/BKE_cryptomatte.h | 3 +- source/blender/blenkernel/BKE_cryptomatte.hh | 34 +- .../blender/blenkernel/intern/cryptomatte.cc | 383 ++++++++++++------ .../blenkernel/intern/cryptomatte_test.cc | 45 +- .../blenloader/intern/versioning_290.c | 2 +- .../compositor/intern/COM_MetaData.cpp | 2 +- .../operations/COM_OutputFileOperation.cpp | 5 +- .../operations/COM_RenderLayersProg.cpp | 11 +- source/blender/makesrna/intern/rna_nodetree.c | 2 +- 9 files changed, 348 insertions(+), 139 deletions(-) diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h index 4b62c795a5a..1b1c4deeb8a 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.h +++ b/source/blender/blenkernel/BKE_cryptomatte.h @@ -50,8 +50,7 @@ uint32_t BKE_cryptomatte_asset_hash(struct CryptomatteSession *session, float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash); char *BKE_cryptomatte_entries_to_matte_id(struct NodeCryptomatte *node_storage); -void BKE_cryptomatte_matte_id_to_entries(const struct Main *bmain, - struct NodeCryptomatte *node_storage, +void BKE_cryptomatte_matte_id_to_entries(struct NodeCryptomatte *node_storage, const char *matte_id); void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, diff --git a/source/blender/blenkernel/BKE_cryptomatte.hh b/source/blender/blenkernel/BKE_cryptomatte.hh index 4631bb2616e..c1da0339359 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.hh +++ b/source/blender/blenkernel/BKE_cryptomatte.hh @@ -23,11 +23,15 @@ #pragma once +#include #include +#include "BLI_map.hh" #include "BLI_string_ref.hh" -namespace blender { +struct ID; + +namespace blender::bke::cryptomatte { /* Format to a cryptomatte meta data key. * @@ -56,4 +60,30 @@ std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name, */ StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name); -} // namespace blender +struct CryptomatteHash { + uint32_t hash; + + CryptomatteHash(uint32_t hash); + CryptomatteHash(const char *name, const int name_len); + static CryptomatteHash from_hex_encoded(blender::StringRef hex_encoded); + + std::string hex_encoded() const; + float float_encoded() const; +}; + +struct CryptomatteLayer { + blender::Map hashes; + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") +#endif + + static std::unique_ptr read_from_manifest(blender::StringRefNull manifest); + uint32_t add_ID(const struct ID &id); + void add_hash(blender::StringRef name, CryptomatteHash cryptomatte_hash); + std::string manifest(); + + std::optional operator[](float encoded_hash) const; +}; + +} // namespace blender::bke::cryptomatte diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index 628c8c6e86a..89db7a93501 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -35,7 +35,6 @@ #include "BLI_dynstr.h" #include "BLI_hash_mm3.h" #include "BLI_listbase.h" -#include "BLI_map.hh" #include "BLI_string.h" #include "MEM_guardedalloc.h" @@ -47,61 +46,44 @@ #include #include -struct CryptomatteLayer { - blender::Map hashes; - -#ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") -#endif - std::string encode_hash(uint32_t cryptomatte_hash) - { - std::stringstream encoded; - encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex - << cryptomatte_hash; - return encoded.str(); - } - - void add_hash(blender::StringRef name, uint32_t cryptomatte_hash) - { - add_encoded_hash(name, encode_hash(cryptomatte_hash)); - } - - void add_encoded_hash(blender::StringRef name, blender::StringRefNull cryptomatte_encoded_hash) - { - hashes.add_overwrite(name, cryptomatte_encoded_hash); - } - - std::string manifest() - { - std::stringstream manifest; - - bool is_first = true; - const blender::Map &const_map = hashes; - manifest << "{"; - for (blender::Map::Item item : const_map.items()) { - if (is_first) { - is_first = false; - } - else { - manifest << ","; - } - manifest << quoted(item.key) << ":\"" << item.value << "\""; - } - manifest << "}"; - return manifest.str(); - } -}; - struct CryptomatteSession { - CryptomatteLayer objects; - CryptomatteLayer assets; - CryptomatteLayer materials; + blender::bke::cryptomatte::CryptomatteLayer objects; + blender::bke::cryptomatte::CryptomatteLayer assets; + blender::bke::cryptomatte::CryptomatteLayer materials; + + CryptomatteSession(); + CryptomatteSession(const Main *bmain); + + std::optional operator[](float encoded_hash) const; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteSession") #endif }; +CryptomatteSession::CryptomatteSession() +{ +} + +CryptomatteSession::CryptomatteSession(const Main *bmain) +{ + LISTBASE_FOREACH (ID *, id, &bmain->objects) { + objects.add_ID(*id); + } + LISTBASE_FOREACH (ID *, id, &bmain->materials) { + materials.add_ID(*id); + } +} + +std::optional CryptomatteSession::operator[](float encoded_hash) const +{ + std::optional result = objects[encoded_hash]; + if (result) { + return result; + } + return materials[encoded_hash]; +} + CryptomatteSession *BKE_cryptomatte_init(void) { CryptomatteSession *session = new CryptomatteSession(); @@ -116,26 +98,13 @@ void BKE_cryptomatte_free(CryptomatteSession *session) uint32_t BKE_cryptomatte_hash(const char *name, const int name_len) { - uint32_t cryptohash_int = BLI_hash_mm3((const unsigned char *)name, name_len, 0); - return cryptohash_int; -} - -static uint32_t cryptomatte_hash(CryptomatteLayer *layer, const ID *id) -{ - const char *name = &id->name[2]; - const int name_len = BLI_strnlen(name, MAX_NAME - 2); - uint32_t cryptohash_int = BKE_cryptomatte_hash(name, name_len); - - if (layer != nullptr) { - layer->add_hash(blender::StringRef(name, name_len), cryptohash_int); - } - - return cryptohash_int; + blender::bke::cryptomatte::CryptomatteHash hash(name, name_len); + return hash.hash; } uint32_t BKE_cryptomatte_object_hash(CryptomatteSession *session, const Object *object) { - return cryptomatte_hash(&session->objects, &object->id); + return session->objects.add_ID(object->id); } uint32_t BKE_cryptomatte_material_hash(CryptomatteSession *session, const Material *material) @@ -143,7 +112,7 @@ uint32_t BKE_cryptomatte_material_hash(CryptomatteSession *session, const Materi if (material == nullptr) { return 0.0f; } - return cryptomatte_hash(&session->materials, &material->id); + return session->materials.add_ID(material->id); } uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *object) @@ -152,54 +121,12 @@ uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const Object *o while (asset_object->parent != nullptr) { asset_object = asset_object->parent; } - return cryptomatte_hash(&session->assets, &asset_object->id); + return session->assets.add_ID(asset_object->id); } -/* Convert a cryptomatte hash to a float. - * - * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the - * cryptomatte specification. See Floating point conversion section in - * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. - * - * The conversion uses as many 32 bit floating point values as possible to minimize hash - * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. - * - * Note that this conversion assumes to be running on a L-endian system. */ float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash) { - uint32_t mantissa = cryptomatte_hash & ((1 << 23) - 1); - uint32_t exponent = (cryptomatte_hash >> 23) & ((1 << 8) - 1); - exponent = MAX2(exponent, (uint32_t)1); - exponent = MIN2(exponent, (uint32_t)254); - exponent = exponent << 23; - uint32_t sign = (cryptomatte_hash >> 31); - sign = sign << 31; - uint32_t float_bits = sign | exponent | mantissa; - float f; - memcpy(&f, &float_bits, sizeof(uint32_t)); - return f; -} - -static ID *cryptomatte_find_id(const ListBase *ids, const float encoded_hash) -{ - LISTBASE_FOREACH (ID *, id, ids) { - uint32_t hash = BKE_cryptomatte_hash((id->name + 2), BLI_strnlen(id->name + 2, MAX_NAME)); - if (BKE_cryptomatte_hash_to_float(hash) == encoded_hash) { - return id; - } - } - return nullptr; -} - -/* Find an ID in the given main that matches the given encoded float. */ -static struct ID *BKE_cryptomatte_find_id(const Main *bmain, const float encoded_hash) -{ - ID *result; - result = cryptomatte_find_id(&bmain->objects, encoded_hash); - if (result == nullptr) { - result = cryptomatte_find_id(&bmain->materials, encoded_hash); - } - return result; + return blender::bke::cryptomatte::CryptomatteHash(cryptomatte_hash).float_encoded(); } char *BKE_cryptomatte_entries_to_matte_id(NodeCryptomatte *node_storage) @@ -223,11 +150,10 @@ char *BKE_cryptomatte_entries_to_matte_id(NodeCryptomatte *node_storage) return result; } -void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, - NodeCryptomatte *node_storage, - const char *matte_id) +void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const char *matte_id) { BLI_freelistN(&node_storage->entries); + std::optional session = std::nullopt; std::istringstream ss(matte_id); while (ss.good()) { @@ -246,18 +172,12 @@ void BKE_cryptomatte_matte_id_to_entries(const Main *bmain, float encoded_hash = atof(token.substr(1, token.length() - 2).c_str()); entry = (CryptomatteEntry *)MEM_callocN(sizeof(CryptomatteEntry), __func__); entry->encoded_hash = encoded_hash; - if (bmain) { - ID *id = BKE_cryptomatte_find_id(bmain, encoded_hash); - if (id != nullptr) { - BLI_strncpy(entry->name, id->name + 2, sizeof(entry->name)); - } - } } else { const char *name = token.c_str(); int name_len = token.length(); entry = (CryptomatteEntry *)MEM_callocN(sizeof(CryptomatteEntry), __func__); - BLI_strncpy(entry->name, name, sizeof(entry->name)); + STRNCPY(entry->name, name); uint32_t hash = BKE_cryptomatte_hash(name, name_len); entry->encoded_hash = BKE_cryptomatte_hash_to_float(hash); } @@ -289,7 +209,7 @@ static void add_render_result_meta_data(RenderResult *render_result, { BKE_render_result_stamp_data( render_result, - blender::BKE_cryptomatte_meta_data_key(layer_name, key_name).c_str(), + blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(layer_name, key_name).c_str(), value.data()); } @@ -300,7 +220,7 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, const char *cryptomatte_layer_name) { /* Create Manifest. */ - CryptomatteLayer *layer = nullptr; + blender::bke::cryptomatte::CryptomatteLayer *layer = nullptr; switch (cryptomatte_layer) { case VIEW_LAYER_CRYPTOMATTE_OBJECT: layer = &session->objects; @@ -326,7 +246,134 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, add_render_result_meta_data(render_result, name, "manifest", manifest); } -namespace blender { +namespace blender::bke::cryptomatte { +namespace manifest { +static constexpr int skip_whitespaces_len_(blender::StringRef ref) +{ + int skip_len = 0; + while (skip_len < ref.size()) { + char front = ref[skip_len]; + if (!std::isspace(front, std::locale::classic())) { + break; + } + skip_len++; + } + return skip_len; +} + +static constexpr blender::StringRef skip_whitespaces_(blender::StringRef ref) +{ + return ref.drop_prefix(skip_whitespaces_len_(ref)); +} + +static constexpr int quoted_string_len_(blender::StringRef ref) +{ + int len = 1; + bool skip_next = false; + while (len < ref.size()) { + char current_char = ref[len]; + if (skip_next) { + skip_next = false; + } + else { + if (current_char == '\\') { + skip_next = true; + } + if (current_char == '\"') { + len += 1; + break; + } + } + len += 1; + } + return len; +} + +static std::string unquote_(const blender::StringRef ref) +{ + std::ostringstream stream; + for (char c : ref) { + if (c != '\\') { + stream << c; + } + } + return stream.str(); +} + +static bool from_manifest(CryptomatteLayer &layer, blender::StringRefNull manifest) +{ + StringRef ref = manifest; + ref = skip_whitespaces_(ref); + if (ref.is_empty() || ref.front() != '{') { + return false; + } + ref = ref.drop_prefix(1); + while (!ref.is_empty()) { + char front = ref.front(); + + if (front == '\"') { + const int quoted_name_len = quoted_string_len_(ref); + const int name_len = quoted_name_len - 2; + std::string name = unquote_(ref.substr(1, name_len)); + ref = ref.drop_prefix(quoted_name_len); + ref = skip_whitespaces_(ref); + + char colon = ref.front(); + if (colon != ':') { + return false; + } + ref = ref.drop_prefix(1); + ref = skip_whitespaces_(ref); + + if (ref.front() != '\"') { + return false; + } + + const int quoted_hash_len = quoted_string_len_(ref); + const int hash_len = quoted_hash_len - 2; + CryptomatteHash hash = CryptomatteHash::from_hex_encoded(ref.substr(1, hash_len)); + ref = ref.drop_prefix(quoted_hash_len); + layer.add_hash(name, hash); + } + else if (front == ',') { + ref = ref.drop_prefix(1); + } + else if (front == '}') { + ref = ref.drop_prefix(1); + ref = skip_whitespaces_(ref); + break; + } + ref = skip_whitespaces_(ref); + } + + if (!ref.is_empty()) { + return false; + } + + return true; +} + +static std::string to_manifest(const CryptomatteLayer *layer) +{ + std::stringstream manifest; + + bool is_first = true; + const blender::Map &const_map = layer->hashes; + manifest << "{"; + for (blender::Map::Item item : const_map.items()) { + if (is_first) { + is_first = false; + } + else { + manifest << ","; + } + manifest << quoted(item.key) << ":\"" << (item.value.hex_encoded()) << "\""; + } + manifest << "}"; + return manifest.str(); +} + +} // namespace manifest /* Return the hash of the given cryptomatte layer name. * @@ -361,4 +408,92 @@ StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name) return render_pass_name.substr(0, last_token); } -} // namespace blender +CryptomatteHash::CryptomatteHash(uint32_t hash) : hash(hash) +{ +} + +CryptomatteHash::CryptomatteHash(const char *name, const int name_len) +{ + hash = BLI_hash_mm3((const unsigned char *)name, name_len, 0); +} + +CryptomatteHash CryptomatteHash::from_hex_encoded(blender::StringRef hex_encoded) +{ + CryptomatteHash result(0); + std::istringstream(hex_encoded) >> std::hex >> result.hash; + return result; +} + +std::string CryptomatteHash::hex_encoded() const +{ + std::stringstream encoded; + encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex << hash; + return encoded.str(); +} + +/* Convert a cryptomatte hash to a float. + * + * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the + * cryptomatte specification. See Floating point conversion section in + * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. + * + * The conversion uses as many 32 bit floating point values as possible to minimize hash + * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. + * + * Note that this conversion assumes to be running on a L-endian system. */ +float CryptomatteHash::float_encoded() const +{ + uint32_t mantissa = hash & ((1 << 23) - 1); + uint32_t exponent = (hash >> 23) & ((1 << 8) - 1); + exponent = MAX2(exponent, (uint32_t)1); + exponent = MIN2(exponent, (uint32_t)254); + exponent = exponent << 23; + uint32_t sign = (hash >> 31); + sign = sign << 31; + uint32_t float_bits = sign | exponent | mantissa; + float f; + memcpy(&f, &float_bits, sizeof(uint32_t)); + return f; +} + +std::unique_ptr CryptomatteLayer::read_from_manifest( + blender::StringRefNull manifest) +{ + std::unique_ptr layer = std::make_unique(); + blender::bke::cryptomatte::manifest::from_manifest(*layer.get(), manifest); + return layer; +} + +uint32_t CryptomatteLayer::add_ID(const ID &id) +{ + const char *name = &id.name[2]; + const int name_len = BLI_strnlen(name, MAX_NAME - 2); + uint32_t cryptohash_int = BKE_cryptomatte_hash(name, name_len); + + add_hash(blender::StringRef(name, name_len), cryptohash_int); + + return cryptohash_int; +} + +void CryptomatteLayer::add_hash(blender::StringRef name, CryptomatteHash cryptomatte_hash) +{ + hashes.add_overwrite(name, cryptomatte_hash); +} + +std::optional CryptomatteLayer::operator[](float encoded_hash) const +{ + const blender::Map &const_map = hashes; + for (blender::Map::Item item : const_map.items()) { + if (BKE_cryptomatte_hash_to_float(item.value.hash) == encoded_hash) { + return std::make_optional(item.key); + } + } + return std::nullopt; +} + +std::string CryptomatteLayer::manifest() +{ + return blender::bke::cryptomatte::manifest::to_manifest(this); +} + +} // namespace blender::bke::cryptomatte diff --git a/source/blender/blenkernel/intern/cryptomatte_test.cc b/source/blender/blenkernel/intern/cryptomatte_test.cc index 3773b2b3bf9..4a25f5f7d87 100644 --- a/source/blender/blenkernel/intern/cryptomatte_test.cc +++ b/source/blender/blenkernel/intern/cryptomatte_test.cc @@ -19,7 +19,7 @@ #include "BKE_cryptomatte.hh" -namespace blender::bke::tests { +namespace blender::bke::cryptomatte::tests { TEST(cryptomatte, meta_data_key) { @@ -41,4 +41,45 @@ TEST(cryptomatte, extract_layer_name) ASSERT_EQ("", BKE_cryptomatte_extract_layer_name("")); } -} // namespace blender::bke::tests +TEST(cryptomatte, cryptomatte_layer) +{ + blender::bke::cryptomatte::CryptomatteLayer layer; + ASSERT_EQ("{}", layer.manifest()); + + layer.add_hash("Object", 123); + ASSERT_EQ("{\"Object\":\"0000007b\"}", layer.manifest()); + + layer.add_hash("Object2", 123245678); + ASSERT_EQ("{\"Object\":\"0000007b\",\"Object2\":\"0758946e\"}", layer.manifest()); +} + +TEST(cryptomatte, cryptomatte_layer_quoted) +{ + blender::bke::cryptomatte::CryptomatteLayer layer; + layer.add_hash("\"Object\"", 123); + ASSERT_EQ("{\"\\\"Object\\\"\":\"0000007b\"}", layer.manifest()); +} + +static void test_cryptomatte_manifest(std::string expected, std::string manifest) +{ + EXPECT_EQ(expected, + blender::bke::cryptomatte::CryptomatteLayer::read_from_manifest(manifest)->manifest()); +} + +TEST(cryptomatte, cryptomatte_layer_from_manifest) +{ + test_cryptomatte_manifest("{}", "{}"); + test_cryptomatte_manifest("{\"Object\":\"12345678\"}", "{\"Object\": \"12345678\"}"); + test_cryptomatte_manifest("{\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + "{\"Object\":\"12345678\",\"Object2\":\"87654321\"}"); + test_cryptomatte_manifest( + "{\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + " { \"Object\" : \"12345678\" , \"Object2\" : \"87654321\" } "); + test_cryptomatte_manifest("{\"Object\\\"01\\\"\":\"12345678\"}", + "{\"Object\\\"01\\\"\": \"12345678\"}"); + test_cryptomatte_manifest( + "{\"Object\\\"01\\\"\":\"12345678\",\"Object\":\"12345678\",\"Object2\":\"87654321\"}", + "{\"Object\\\"01\\\"\":\"12345678\",\"Object\":\"12345678\", \"Object2\":\"87654321\"}"); +} + +} // namespace blender::bke::cryptomatte::tests diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 29041f4ae9d..02de0b0ff08 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1431,7 +1431,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) if (matte_id == NULL || strlen(storage->matte_id) == 0) { continue; } - BKE_cryptomatte_matte_id_to_entries(NULL, storage, storage->matte_id); + BKE_cryptomatte_matte_id_to_entries(storage, storage->matte_id); MEM_SAFE_FREE(storage->matte_id); } } diff --git a/source/blender/compositor/intern/COM_MetaData.cpp b/source/blender/compositor/intern/COM_MetaData.cpp index 2b75947ff89..4bc4571face 100644 --- a/source/blender/compositor/intern/COM_MetaData.cpp +++ b/source/blender/compositor/intern/COM_MetaData.cpp @@ -34,7 +34,7 @@ void MetaData::addCryptomatteEntry(const blender::StringRef layer_name, const blender::StringRefNull key, const blender::StringRef value) { - add(blender::BKE_cryptomatte_meta_data_key(layer_name, key), value); + add(blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(layer_name, key), value); } /* Replace the hash neutral cryptomatte keys with hashed versions. diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp index 2f8740081a1..19d49bc2ae7 100644 --- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp +++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp @@ -347,8 +347,9 @@ StampData *OutputOpenExrMultiLayerOperation::createStampData() const } std::unique_ptr meta_data = layer->imageInput->getMetaData(); if (meta_data) { - blender::StringRef layer_name = blender::BKE_cryptomatte_extract_layer_name( - blender::StringRef(layer->name, BLI_strnlen(layer->name, sizeof(layer->name)))); + blender::StringRef layer_name = + blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( + blender::StringRef(layer->name, BLI_strnlen(layer->name, sizeof(layer->name)))); meta_data->replaceHashNeutralCryptomatteKeys(layer_name); meta_data->addToRenderResult(&render_result); } diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.cpp b/source/blender/compositor/operations/COM_RenderLayersProg.cpp index 2a0a6e33b6a..4f4116d6faa 100644 --- a/source/blender/compositor/operations/COM_RenderLayersProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersProg.cpp @@ -233,9 +233,12 @@ struct CallbackData { void setCryptomatteKeys(blender::StringRef cryptomatte_layer_name) { - manifest_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "manifest"); - hash_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "hash"); - conversion_key = blender::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, "conversion"); + manifest_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, + "manifest"); + hash_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key(cryptomatte_layer_name, + "hash"); + conversion_key = blender::bke::cryptomatte::BKE_cryptomatte_meta_data_key( + cryptomatte_layer_name, "conversion"); } }; @@ -276,7 +279,7 @@ std::unique_ptr RenderLayersProg::getMetaData() const view_layer->name, BLI_strnlen(view_layer->name, sizeof(view_layer->name))) + "." + m_passName; - blender::StringRef cryptomatte_layer_name = blender::BKE_cryptomatte_extract_layer_name( + blender::StringRef cryptomatte_layer_name = blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( full_layer_name); callback_data.setCryptomatteKeys(cryptomatte_layer_name); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index b8a3f0878b1..2c0d7ba3d06 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3728,7 +3728,7 @@ static void rna_NodeCryptomatte_matte_set(PointerRNA *ptr, const char *value) { bNode *node = (bNode *)ptr->data; NodeCryptomatte *nc = node->storage; - BKE_cryptomatte_matte_id_to_entries(NULL, nc, value); + BKE_cryptomatte_matte_id_to_entries(nc, value); } static void rna_NodeCryptomatte_update_add(Main *bmain, Scene *scene, PointerRNA *ptr) From 6ccfb9e0ea6e4e81e452181596278fb0b8e113d2 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 26 Feb 2021 15:36:04 +0100 Subject: [PATCH 505/519] Fix: Compile issue Windows. --- source/blender/blenkernel/intern/cryptomatte.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index 89db7a93501..39d02d43baa 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -253,7 +253,7 @@ static constexpr int skip_whitespaces_len_(blender::StringRef ref) int skip_len = 0; while (skip_len < ref.size()) { char front = ref[skip_len]; - if (!std::isspace(front, std::locale::classic())) { + if (front != ' ') { break; } skip_len++; From b2eb674731065b7f36c2219af94c8d0308dd87b9 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 26 Feb 2021 16:32:53 +0100 Subject: [PATCH 506/519] Cleanup: Use find_first_not_of. --- source/blender/blenkernel/intern/cryptomatte.cc | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index 39d02d43baa..42158dced96 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -248,22 +248,12 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session, namespace blender::bke::cryptomatte { namespace manifest { -static constexpr int skip_whitespaces_len_(blender::StringRef ref) -{ - int skip_len = 0; - while (skip_len < ref.size()) { - char front = ref[skip_len]; - if (front != ' ') { - break; - } - skip_len++; - } - return skip_len; -} +constexpr StringRef WHITESPACES = " \t\n\v\f\r"; static constexpr blender::StringRef skip_whitespaces_(blender::StringRef ref) { - return ref.drop_prefix(skip_whitespaces_len_(ref)); + size_t skip = ref.find_first_not_of(WHITESPACES); + return ref.drop_prefix(skip); } static constexpr int quoted_string_len_(blender::StringRef ref) From cd388ef2f11d85ac6fc5382cab18e33cd0bd5a59 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 26 Feb 2021 17:14:28 +0100 Subject: [PATCH 507/519] Fix (unreported) missing 3DView update after some Outliner Override operations. --- source/blender/editors/space_outliner/outliner_tools.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index 8bc32f5f3a7..8726fd768d4 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -892,6 +892,8 @@ static void id_override_library_resync_fn(bContext *C, } BKE_lib_override_library_resync(bmain, scene, CTX_data_view_layer(C), id_root); + + WM_event_add_notifier(C, NC_WINDOW, NULL); } else { CLOG_WARN(&LOG, "Could not resync library override of data block '%s'", id_root->name); @@ -926,6 +928,8 @@ static void id_override_library_delete_fn(bContext *C, } BKE_lib_override_library_delete(bmain, id_root); + + WM_event_add_notifier(C, NC_WINDOW, NULL); } else { CLOG_WARN(&LOG, "Could not delete library override of data block '%s'", id_root->name); From fb7751f3e6c3cc5295c1eb4004e2125ffd4e08de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastia=CC=81n=20Barschkis?= Date: Fri, 26 Feb 2021 17:37:51 +0100 Subject: [PATCH 508/519] CMake/deps: Fix LLVM and OSL builds This commit is addition to D10212. Apple arm64 support was left out in that patch. --- build_files/build_environment/cmake/ispc.cmake | 5 +++-- build_files/build_environment/cmake/osl.cmake | 5 +++++ build_files/build_environment/cmake/versions.cmake | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 58e3873097d..dd6cf5a7d40 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -24,11 +24,12 @@ if(WIN32) -DARM_ENABLED=Off ) elseif(APPLE) - # Use bison installed via Homebrew. - # The one which comes which Xcode toolset is too old. + # Use bison and flex installed via Homebrew. + # The ones that come with Xcode toolset are too old. if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "arm64") set(ISPC_EXTRA_ARGS_APPLE -DBISON_EXECUTABLE=/opt/homebrew/opt/bison/bin/bison + -DFLEX_EXECUTABLE=/opt/homebrew/opt/flex/bin/flex -DARM_ENABLED=On ) else() diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake index 78930182f2b..0628130134b 100644 --- a/build_files/build_environment/cmake/osl.cmake +++ b/build_files/build_environment/cmake/osl.cmake @@ -71,6 +71,11 @@ set(OSL_EXTRA_ARGS -DUSE_PYTHON=OFF ) +# Apple arm64 uses LLVM 11, LLVM 10+ requires C++14 +if (APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + list(APPEND OSL_EXTRA_ARGS -DCMAKE_CXX_STANDARD=14) +endif() + ExternalProject_Add(external_osl URL ${OSL_URI} DOWNLOAD_DIR ${DOWNLOAD_DIR} diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index c41a42ad873..96cffe6f3c2 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -116,8 +116,8 @@ set(OPENCOLORIO_HASH 1a2e3478b6cd9a1549f24e1b2205e3f0) if(APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")) # Newer version required by ISPC with arm support. set(LLVM_VERSION 11.0.1) - set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.tar.xz) - set(LLVM_HASH 6ec7ae9fd43da9b87cda15b3ab9cc7af) + set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz) + set(LLVM_HASH e700af40ab83463e4e9ab0ba3708312e) set(OPENMP_VERSION 9.0.1) set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${OPENMP_VERSION}/openmp-${OPENMP_VERSION}.src.tar.xz) From c0d8a14ae3466cb97386f950fff9720ebda5ba43 Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Fri, 26 Feb 2021 18:34:41 +0100 Subject: [PATCH 509/519] Fix crash with dyntopo on tools that use cached vertex info Tools can cache data related to the mesh topology for later use. This data is indexed by vertex index, so it will be invalid after dyntopo changes the topology during the stroke. Reviewed By: JacquesLucke Differential Revision: https://developer.blender.org/D10550 --- source/blender/editors/sculpt_paint/sculpt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 1b19fa2b976..3a18d7a10de 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5841,6 +5841,11 @@ static void sculpt_topology_update(Sculpt *sd, return; } + /* Free index based vertex info as it will become invalid after modifying the topology during the + * stroke. */ + MEM_SAFE_FREE(ss->vertex_info.boundary); + MEM_SAFE_FREE(ss->vertex_info.connected_component); + PBVHTopologyUpdateMode mode = 0; float location[3]; From 5c6cd5f8cd24d7384af06e2b85cfd18c214a0d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Fri, 26 Feb 2021 20:57:24 +0100 Subject: [PATCH 510/519] Cleanup: unused class member --- intern/cycles/render/alembic.h | 1 - 1 file changed, 1 deletion(-) diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h index 1bfdc9e6757..b986f46bc8a 100644 --- a/intern/cycles/render/alembic.h +++ b/intern/cycles/render/alembic.h @@ -276,7 +276,6 @@ class AlembicObject : public Node { MatrixSampleMap xform_samples; Alembic::AbcGeom::IObject iobject; - Transform xform; /* Set if the path points to a valid IObject whose type is supported. */ AbcSchemaType schema_type; From e00a87163cfd1b885afb4cb3ddff5f9fe911d2aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastia=CC=81n=20Barschkis?= Date: Fri, 26 Feb 2021 21:07:13 +0100 Subject: [PATCH 511/519] CMake/deps: Adjust OSL shader directory The location of the shaders changed with OSL 1.11.10. This commit is therefore in addition to D10212. @sybren With the latest SVN libraries, I am fairly certain there is a "OSL not found" in the CMake output. Can you check on Linux? @LazyDodo Since you haven't pushed the new OSL libs yet, this should not be a problem on Windows. So this will only be needed whenever those land. Reviewed By: LazyDodo Differential Revision: https://developer.blender.org/D10552 --- build_files/cmake/platform/platform_apple.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 6e6c75c85f0..12a7a6c504f 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -352,7 +352,7 @@ if(WITH_CYCLES_OSL) list(APPEND OSL_LIBRARIES ${OSL_LIB_COMP} -force_load ${OSL_LIB_EXEC} ${OSL_LIB_QUERY}) find_path(OSL_INCLUDE_DIR OSL/oslclosure.h PATHS ${CYCLES_OSL}/include) find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin) - find_path(OSL_SHADER_DIR NAMES stdosl.h PATHS ${CYCLES_OSL}/shaders) + find_path(OSL_SHADER_DIR NAMES stdosl.h PATHS ${CYCLES_OSL}/share/OSL/shaders) if(OSL_INCLUDE_DIR AND OSL_LIBRARIES AND OSL_COMPILER AND OSL_SHADER_DIR) set(OSL_FOUND TRUE) From f7933d0744df44c132f8b07b2cb2a8dea13fb30b Mon Sep 17 00:00:00 2001 From: Victor-Louis De Gusseme Date: Fri, 26 Feb 2021 15:23:09 -0600 Subject: [PATCH 512/519] Geometry Nodes: Add "Location" output to Attribute Proximity node This patch adds an output field to the Attribute Proximity node and renames the existing string socket from "Result" to "Distance". - The "Distance" output contains distance to the closest position on the Target geometry. - The new "Location" output contains the coordinates of the closest position on the Target geometry. A basic use case for this data is a simple shrinkwrap operation. Differential Revision: https://developer.blender.org/D10415 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_290.c | 29 +++-- .../nodes/node_geo_attribute_proximity.cc | 102 ++++++++++++------ 3 files changed, 90 insertions(+), 43 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 7db6980c91a..17eb6e19292 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 8 +#define BLENDER_FILE_SUBVERSION 9 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 02de0b0ff08..b05d5ae7d26 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -1722,16 +1722,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) FOREACH_NODETREE_END; } - /** - * Versioning code until next subversion bump goes here. - * - * \note Be sure to check when bumping the version: - * - "versioning_userdef.c", #blo_do_versions_userdef - * - "versioning_userdef.c", #do_versions_theme - * - * \note Keep this message at the bottom of the function. - */ - { + if (!MAIN_VERSION_ATLEAST(bmain, 293, 9)) { if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "bokeh_overblur")) { LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { scene->eevee.bokeh_neighbor_max = 10.0f; @@ -1753,6 +1744,24 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + if (ntree->type == NTREE_GEOMETRY) { + version_node_socket_name(ntree, GEO_NODE_ATTRIBUTE_PROXIMITY, "Result", "Distance"); + } + } + FOREACH_NODETREE_END; + } + + /** + * Versioning code until next subversion bump goes here. + * + * \note Be sure to check when bumping the version: + * - "versioning_userdef.c", #blo_do_versions_userdef + * - "versioning_userdef.c", #do_versions_theme + * + * \note Keep this message at the bottom of the function. + */ + { /* Keep this block, even when empty. */ } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc index 51f208ed07d..2ab76540bdf 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc @@ -31,7 +31,8 @@ static bNodeSocketTemplate geo_node_attribute_proximity_in[] = { {SOCK_GEOMETRY, N_("Geometry")}, {SOCK_GEOMETRY, N_("Target")}, - {SOCK_STRING, N_("Result")}, + {SOCK_STRING, N_("Distance")}, + {SOCK_STRING, N_("Location")}, {-1, ""}, }; @@ -60,50 +61,66 @@ static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node) namespace blender::nodes { static void proximity_calc(MutableSpan distance_span, + MutableSpan location_span, Span positions, BVHTreeFromMesh &tree_data_mesh, BVHTreeFromPointCloud &tree_data_pointcloud, const bool bvh_mesh_success, - const bool bvh_pointcloud_success) + const bool bvh_pointcloud_success, + const bool store_distances, + const bool store_locations) { - /* The pointcloud loop uses the values already in the span, - * which is only set if the mesh BVH is used (because it's first). */ - if (!bvh_mesh_success) { - distance_span.fill(FLT_MAX); - } - IndexRange range = positions.index_range(); parallel_for(range, 512, [&](IndexRange range) { - BVHTreeNearest nearest; + BVHTreeNearest nearest_from_mesh; + BVHTreeNearest nearest_from_pointcloud; - if (bvh_mesh_success) { - copy_v3_fl(nearest.co, FLT_MAX); - nearest.index = -1; + copy_v3_fl(nearest_from_mesh.co, FLT_MAX); + copy_v3_fl(nearest_from_pointcloud.co, FLT_MAX); - for (int i : range) { - nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]); + nearest_from_mesh.index = -1; + nearest_from_pointcloud.index = -1; + + for (int i : range) { + /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */ + nearest_from_mesh.dist_sq = len_squared_v3v3(nearest_from_mesh.co, positions[i]); + + if (bvh_mesh_success) { BLI_bvhtree_find_nearest(tree_data_mesh.tree, positions[i], - &nearest, + &nearest_from_mesh, tree_data_mesh.nearest_callback, &tree_data_mesh); - distance_span[i] = sqrtf(nearest.dist_sq); } - } - if (bvh_pointcloud_success) { - copy_v3_fl(nearest.co, FLT_MAX); - nearest.index = -1; + /* Use the distance to the closest point in the mesh to speedup the pointcloud bvh lookup. + * This is ok because we only need to find the closest point in the pointcloud if it's closer + * than the mesh. */ + nearest_from_pointcloud.dist_sq = nearest_from_mesh.dist_sq; - for (int i : range) { - /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */ - nearest.dist_sq = len_squared_v3v3(nearest.co, positions[i]); + if (bvh_pointcloud_success) { BLI_bvhtree_find_nearest(tree_data_pointcloud.tree, positions[i], - &nearest, + &nearest_from_pointcloud, tree_data_pointcloud.nearest_callback, &tree_data_pointcloud); - distance_span[i] = std::min(distance_span[i], sqrtf(nearest.dist_sq)); + } + + if (nearest_from_pointcloud.dist_sq < nearest_from_mesh.dist_sq) { + if (store_distances) { + distance_span[i] = sqrtf(nearest_from_pointcloud.dist_sq); + } + if (store_locations) { + location_span[i] = nearest_from_pointcloud.co; + } + } + else { + if (store_distances) { + distance_span[i] = sqrtf(nearest_from_mesh.dist_sq); + } + if (store_locations) { + location_span[i] = nearest_from_mesh.co; + } } } }); @@ -151,14 +168,18 @@ static void attribute_calc_proximity(GeometryComponent &component, /* This node works on the "point" domain, since that is where positions are stored. */ const AttributeDomain result_domain = ATTR_DOMAIN_POINT; - const std::string result_attribute_name = params.get_input("Result"); + const std::string distance_attribute_name = params.get_input("Distance"); OutputAttributePtr distance_attribute = component.attribute_try_get_for_output( - result_attribute_name, result_domain, CD_PROP_FLOAT); + distance_attribute_name, result_domain, CD_PROP_FLOAT); + + const std::string location_attribute_name = params.get_input("Location"); + OutputAttributePtr location_attribute = component.attribute_try_get_for_output( + location_attribute_name, result_domain, CD_PROP_FLOAT3); ReadAttributePtr position_attribute = component.attribute_try_get_for_read("position"); BLI_assert(position_attribute->custom_data_type() == CD_PROP_FLOAT3); - if (!distance_attribute || !position_attribute) { + if (!position_attribute || (!distance_attribute && !location_attribute)) { return; } @@ -183,12 +204,24 @@ static void attribute_calc_proximity(GeometryComponent &component, tree_data_pointcloud); } - proximity_calc(distance_attribute->get_span_for_write_only(), - position_attribute->get_span(), + Span position_span = position_attribute->get_span(); + + MutableSpan distance_span = distance_attribute ? + distance_attribute->get_span_for_write_only() : + MutableSpan(); + MutableSpan location_span = location_attribute ? + location_attribute->get_span_for_write_only() : + MutableSpan(); + + proximity_calc(distance_span, + location_span, + position_span, tree_data_mesh, tree_data_pointcloud, bvh_mesh_success, - bvh_pointcloud_success); + bvh_pointcloud_success, + distance_attribute, /* Boolean. */ + location_attribute); /* Boolean. */ if (bvh_mesh_success) { free_bvhtree_from_mesh(&tree_data_mesh); @@ -197,7 +230,12 @@ static void attribute_calc_proximity(GeometryComponent &component, free_bvhtree_from_pointcloud(&tree_data_pointcloud); } - distance_attribute.apply_span_and_save(); + if (distance_attribute) { + distance_attribute.apply_span_and_save(); + } + if (location_attribute) { + location_attribute.apply_span_and_save(); + } } static void geo_node_attribute_proximity_exec(GeoNodeExecParams params) From 9cfb320208b655a1d7f177f038179b87d98fb066 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 27 Feb 2021 16:17:01 +1100 Subject: [PATCH 513/519] RNA: add Region.data member to access RegionView3D Without this, the RegionView3D could only be accessed from `context.region_data`, not the region. --- source/blender/makesrna/intern/rna_screen.c | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index 784172b3ac9..6cf1d7a923b 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -56,6 +56,8 @@ const EnumPropertyItem rna_enum_region_type_items[] = { #ifdef RNA_RUNTIME +# include "RNA_access.h" + # include "BKE_global.h" # include "BKE_screen.h" # include "BKE_workspace.h" @@ -274,6 +276,25 @@ static void rna_Area_ui_type_update(bContext *C, PointerRNA *ptr) ED_area_tag_refresh(area); } +static PointerRNA rna_Region_data_get(PointerRNA *ptr) +{ + bScreen *screen = (bScreen *)ptr->owner_id; + ARegion *region = ptr->data; + + if (region->regiondata != NULL) { + if (region->regiontype == RGN_TYPE_WINDOW) { + /* We could make this static, it wont change at run-time. */ + SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D); + if (region->type == BKE_regiontype_from_id(st, region->regiontype)) { + PointerRNA newptr; + RNA_pointer_create(&screen->id, &RNA_RegionView3D, region->regiondata, &newptr); + return newptr; + } + } + } + return PointerRNA_NULL; +} + static void rna_View2D_region_to_view(struct View2D *v2d, float x, float y, float result[2]) { UI_view2d_region_to_view(v2d, x, y, &result[0], &result[1]); @@ -539,6 +560,13 @@ static void rna_def_region(BlenderRNA *brna) RNA_def_property_enum_funcs(prop, "rna_region_alignment_get", NULL, NULL); RNA_def_property_ui_text(prop, "Alignment", "Alignment of the region within the area"); + prop = RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text( + prop, "Region Data", "Region specific data (the type depends on the region type)"); + RNA_def_property_struct_type(prop, "AnyType"); + RNA_def_property_pointer_funcs(prop, "rna_Region_data_get", NULL, NULL, NULL); + RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw"); } From e3c11b36dae03c783234ca528fbcf7a85d346df3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 27 Feb 2021 22:05:01 +1100 Subject: [PATCH 514/519] Fix error converting simulated events press/release to clicks Move logic that sets previous event state into WM_event_add_simulate. --- source/blender/makesrna/intern/rna_wm_api.c | 5 ----- .../windowmanager/intern/wm_event_system.c | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index 6b96562b3f8..cb20b480ee5 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -647,11 +647,6 @@ static wmEvent *rna_Window_event_add_simulate(wmWindow *win, e.alt = alt; e.oskey = oskey; - e.prevx = win->eventstate->x; - e.prevy = win->eventstate->y; - e.prevval = win->eventstate->val; - e.prevtype = win->eventstate->type; - e.ascii = '\0'; e.utf8_buf[0] = '\0'; if (unicode != NULL) { diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 2406ba83bf4..dc38bd79b7d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -148,8 +148,29 @@ wmEvent *WM_event_add_simulate(wmWindow *win, const wmEvent *event_to_add) return NULL; } wmEvent *event = wm_event_add(win, event_to_add); + win->eventstate->x = event->x; win->eventstate->y = event->y; + + win->eventstate->prevval = event->prevval = win->eventstate->val; + win->eventstate->prevtype = event->prevtype = win->eventstate->type; + win->eventstate->prevx = event->prevx = win->eventstate->x; + win->eventstate->prevy = event->prevy = win->eventstate->y; + + if (event->type == MOUSEMOVE) { + /* Pass. */ + } + else { + win->eventstate->val = event->val; + win->eventstate->type = event->type; + + if (ISMOUSE_BUTTON(event->type)) { + if (event->val == KM_PRESS) { + win->eventstate->prevclickx = event->x; + win->eventstate->prevclicky = event->y; + } + } + } return event; } From 4b16cb1e9aff4410cda1e2182e73330c814f99ac Mon Sep 17 00:00:00 2001 From: Falk David Date: Sat, 27 Feb 2021 09:28:37 +0100 Subject: [PATCH 515/519] Fix T85987: Selection when GP is parented When a GP object was parented to e.g. a bone, box selection as well as point selection were broken in that the selection from the user would not correlate with what was actually being selected. The issue was that box and point selection did not use the active evaluated stroke data. The fix uses the correct data. Reviewed By: antoniov Maniphest Tasks: T85987 Differential Revision: https://developer.blender.org/D10555 --- source/blender/editors/gpencil/gpencil_select.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index e01c1ec54d7..aab08e9c8c4 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -1847,7 +1847,7 @@ static bool gpencil_generic_stroke_select(bContext *C, bGPDspoint *pt; int i; bool hit = false; - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { bGPDspoint *pt_active = (pt->runtime.pt_orig) ? pt->runtime.pt_orig : pt; /* convert point coords to screenspace */ @@ -2252,12 +2252,12 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) int i; /* firstly, check for hit-point */ - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + for (i = 0, pt = gps_active->points; i < gps_active->totpoints; i++, pt++) { int xy[2]; bGPDspoint pt2; gpencil_point_to_parent_space(pt, gpstroke_iter.diff_mat, &pt2); - gpencil_point_to_xy(&gsc, gps, &pt2, &xy[0], &xy[1]); + gpencil_point_to_xy(&gsc, gps_active, &pt2, &xy[0], &xy[1]); /* do boundbox check first */ if (!ELEM(V2D_IS_CLIPPED, xy[0], xy[1])) { From 28f0a4b27e5b98e9060c3c86062b4155d70d94f3 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 27 Feb 2021 13:07:11 +0100 Subject: [PATCH 516/519] Fix (unreported) broken OCIO from install_deps. Looks like they removed static libs by default in OCIO 2.0, for some historical reasons `install_deps` was enforcing using only static libs for this one, now removed it so that Blender buil can use usual so's. --- build_files/build_environment/install_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 259a0bd0c33..3b364c21f7d 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -1732,7 +1732,7 @@ compile_OCIO() { fi # To be changed each time we make edits that would modify the compiled result! - ocio_magic=2 + ocio_magic=3 _init_ocio # Force having own builds for the dependencies. @@ -1802,11 +1802,11 @@ compile_OCIO() { make -j$THREADS && make install # Force linking against static libs - rm -f $_inst/lib/*.so* + #rm -f $_inst/lib/*.so* # Additional depencencies - cp ext/dist/lib/libtinyxml.a $_inst/lib - cp ext/dist/lib/libyaml-cpp.a $_inst/lib + #cp ext/dist/lib/libtinyxml.a $_inst/lib + #cp ext/dist/lib/libyaml-cpp.a $_inst/lib make clean From aad2f1510a80313a2272d131327442dc50152cbd Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 27 Feb 2021 13:10:27 +0100 Subject: [PATCH 517/519] Fix T86028: Crash when loading file with missing libraries. Regression from rB53d13b6f5387c68. --- source/blender/blenloader/intern/readfile.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index dd855ebae0b..c0293c1f8f2 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5242,7 +5242,7 @@ static int has_linked_ids_to_read(Main *mainvar) } static void read_library_linked_id( - ReportList *reports, FileData *fd, Main *mainvar, ID *id, ID **r_id) + FileData *basefd, FileData *fd, Main *mainvar, ID *id, ID **r_id) { BHead *bhead = NULL; const bool is_valid = BKE_idtype_idcode_is_linkable(GS(id->name)) || @@ -5253,7 +5253,7 @@ static void read_library_linked_id( } if (!is_valid) { - BLO_reportf_wrap(reports, + BLO_reportf_wrap(basefd->reports, RPT_ERROR, TIP_("LIB: %s: '%s' is directly linked from '%s' (parent '%s'), but is a " "non-linkable data type"), @@ -5272,14 +5272,14 @@ static void read_library_linked_id( read_libblock(fd, mainvar, bhead, id->tag, false, r_id); } else { - BLO_reportf_wrap(reports, + BLO_reportf_wrap(basefd->reports, RPT_INFO, TIP_("LIB: %s: '%s' missing from '%s', parent '%s'"), BKE_idtype_idcode_to_name(GS(id->name)), id->name + 2, mainvar->curlib->filepath_abs, library_parent_filepath(mainvar->curlib)); - fd->library_id_missing_count++; + basefd->library_id_missing_count++; /* Generate a placeholder for this ID (simplified version of read_libblock actually...). */ if (r_id) { @@ -5313,7 +5313,7 @@ static void read_library_linked_ids(FileData *basefd, * we go back to a single linked data when loading the file. */ ID **realid = NULL; if (!BLI_ghash_ensure_p(loaded_ids, id->name, (void ***)&realid)) { - read_library_linked_id(basefd->reports, fd, mainvar, id, realid); + read_library_linked_id(basefd, fd, mainvar, id, realid); } /* realid shall never be NULL - unless some source file/lib is broken @@ -5434,7 +5434,7 @@ static FileData *read_library_file_data(FileData *basefd, if (fd == NULL) { BLO_reportf_wrap( basefd->reports, RPT_INFO, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs); - fd->library_file_missing_count++; + basefd->library_file_missing_count++; } return fd; @@ -5483,9 +5483,6 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) /* Test if linked data-locks need to read further linked data-locks * and create link placeholders for them. */ BLO_expand_main(fd, mainptr); - - basefd->library_file_missing_count += fd->library_file_missing_count; - basefd->library_id_missing_count += fd->library_id_missing_count; } } } From 92743cc895dd34bdaa165679bf9d06dfa3f8cb24 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Sat, 27 Feb 2021 17:10:18 -0300 Subject: [PATCH 518/519] Fix T85886: Rotate Tool and Adjust Last Operation - angles inverted The constraint was not set when redoing. This commit also removes `postInputRotation`. I really couldn't see a use for it. --- .../blender/editors/transform/transform_constraints.c | 2 +- source/blender/editors/transform/transform_generics.c | 10 ++++------ source/blender/editors/transform/transform_mode.c | 9 --------- source/blender/editors/transform/transform_mode.h | 1 - source/blender/editors/transform/transform_mode_bend.c | 1 - .../transform/transform_mode_edge_rotate_normal.c | 1 - .../blender/editors/transform/transform_mode_rotate.c | 3 +-- 7 files changed, 6 insertions(+), 21 deletions(-) diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 1f589a830fc..93d5d41e121 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -572,7 +572,7 @@ static void constraints_rotation_impl(TransInfo *t, break; } /* don't flip axis if asked to or if num input */ - if (r_angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) { + if (r_angle && !((mode & CON_NOFLIP) || hasNumInput(&t->num) || (t->flag & T_INPUT_IS_VALUES_FINAL))) { float view_vector[3]; view_vector_calc(t, t->center_global, view_vector); if (dot_v3v3(r_vec, view_vector) > 0.0f) { diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 6fca49495e9..e43a3ff3635 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -381,12 +381,10 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if (op && (prop = RNA_struct_find_property(op->ptr, "constraint_axis"))) { bool constraint_axis[3] = {false, false, false}; - if (t->flag & T_INPUT_IS_VALUES_FINAL) { - if (t_values_set_is_array) { - /* For operators whose `t->values` is array, set constraint so that the - * orientation is more intuitive in the Redo Panel. */ - constraint_axis[0] = constraint_axis[1] = constraint_axis[2] = true; - } + if (t_values_set_is_array && t->flag & T_INPUT_IS_VALUES_FINAL) { + /* For operators whose `t->values` is array (as Move and Scale), set constraint so that the + * orientation is more intuitive in the Redo Panel. */ + constraint_axis[0] = constraint_axis[1] = constraint_axis[2] = true; } else if (RNA_property_is_set(op->ptr, prop)) { RNA_property_boolean_get_array(op->ptr, prop, constraint_axis); diff --git a/source/blender/editors/transform/transform_mode.c b/source/blender/editors/transform/transform_mode.c index 9e6e4d8807e..d14f693da9c 100644 --- a/source/blender/editors/transform/transform_mode.c +++ b/source/blender/editors/transform/transform_mode.c @@ -554,15 +554,6 @@ void headerRotation(TransInfo *t, char str[UI_MAX_DRAW_STR], float final) } } -void postInputRotation(TransInfo *t, float values[3]) -{ - float axis_final[3]; - copy_v3_v3(axis_final, t->spacemtx[t->orient_axis]); - if ((t->con.mode & CON_APPLY) && t->con.applyRot) { - t->con.applyRot(t, NULL, NULL, axis_final, values); - } -} - /** * Applies values of rotation to `td->loc` and `td->ext->quat` * based on a rotation matrix (mat) and a pivot (center). diff --git a/source/blender/editors/transform/transform_mode.h b/source/blender/editors/transform/transform_mode.h index 7a05506e12c..6d7a0b528ae 100644 --- a/source/blender/editors/transform/transform_mode.h +++ b/source/blender/editors/transform/transform_mode.h @@ -47,7 +47,6 @@ void protectedTransBits(short protectflag, float vec[3]); void protectedSizeBits(short protectflag, float size[3]); void constraintTransLim(TransInfo *t, TransData *td); void constraintSizeLim(TransInfo *t, TransData *td); -void postInputRotation(TransInfo *t, float values[3]); void headerRotation(TransInfo *t, char *str, float final); void ElementRotation_ex(TransInfo *t, TransDataContainer *tc, diff --git a/source/blender/editors/transform/transform_mode_bend.c b/source/blender/editors/transform/transform_mode_bend.c index adf3a0346a0..038f7d48c66 100644 --- a/source/blender/editors/transform/transform_mode_bend.c +++ b/source/blender/editors/transform/transform_mode_bend.c @@ -254,7 +254,6 @@ void initBend(TransInfo *t) t->transform = Bend; t->handleEvent = handleEventBend; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE_SPRING); t->idx_max = 1; diff --git a/source/blender/editors/transform/transform_mode_edge_rotate_normal.c b/source/blender/editors/transform/transform_mode_edge_rotate_normal.c index 32f0d4bd365..c78115561b2 100644 --- a/source/blender/editors/transform/transform_mode_edge_rotate_normal.c +++ b/source/blender/editors/transform/transform_mode_edge_rotate_normal.c @@ -127,7 +127,6 @@ void initNormalRotation(TransInfo *t) t->mode = TFM_NORMAL_ROTATION; t->transform = applyNormalRotation; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE); t->idx_max = 0; diff --git a/source/blender/editors/transform/transform_mode_rotate.c b/source/blender/editors/transform/transform_mode_rotate.c index fa02e5382a7..8d8594d5775 100644 --- a/source/blender/editors/transform/transform_mode_rotate.c +++ b/source/blender/editors/transform/transform_mode_rotate.c @@ -197,7 +197,7 @@ static void applyRotation(TransInfo *t, const int UNUSED(mval[2])) float final = t->values[0]; if ((t->con.mode & CON_APPLY) && t->con.applyRot) { - t->con.applyRot(t, NULL, NULL, axis_final, NULL); + t->con.applyRot(t, NULL, NULL, axis_final, &final); } else { negate_v3_v3(axis_final, t->spacemtx[t->orient_axis]); @@ -234,7 +234,6 @@ void initRotation(TransInfo *t) t->tsnap.applySnap = ApplySnapRotation; t->tsnap.distance = RotationBetween; - setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE); t->idx_max = 0; From f3d60c68ef469a9a9de8d5dc4d7dbbd168950ceb Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Sat, 27 Feb 2021 18:51:48 -0500 Subject: [PATCH 519/519] Fix T85948 Exact boolean crash with some nonplanar ngons. Triangulating ngons could fail with the method that was being used: projecting along the dominant normal axis and then using CDT. It could fail if the ngon has self crossings or might be so after the described projection. Switched to using projection along the normal itself, and also to using polyfill which produces some kind of triangulation no matter what in such circumstances. This will also likely be faster if there are a lot of ngons in the meshes, since the exact arithmetic CDT was being used before, and now float arithmetic is used. --- source/blender/blenlib/intern/mesh_boolean.cc | 125 ++++++------------ 1 file changed, 40 insertions(+), 85 deletions(-) diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 37205ecef41..fcf5c5bfad3 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -38,6 +38,7 @@ # include "BLI_math_mpq.hh" # include "BLI_mesh_intersect.hh" # include "BLI_mpq3.hh" +# include "BLI_polyfill_2d.h" # include "BLI_set.hh" # include "BLI_span.hh" # include "BLI_stack.hh" @@ -2589,48 +2590,9 @@ static IMesh raycast_boolean(const IMesh &tm, return ans; } -/** - * Which CDT output edge index is for an edge between output verts - * v1 and v2 (in either order)? - * \return -1 if none. - */ -static int find_cdt_edge(const CDT_result &cdt_out, int v1, int v2) -{ - for (int e : cdt_out.edge.index_range()) { - const std::pair &edge = cdt_out.edge[e]; - if ((edge.first == v1 && edge.second == v2) || (edge.first == v2 && edge.second == v1)) { - return e; - } - } - return -1; -} - -/** - * Return the original edge id for the CDT output edge e_out, given that - * the only input to CDT was face f. Pick the first, if there are several. - */ -static int orig_edge_for_cdt_edge(const CDT_result &cdt_out, - int cdt_e_out, - const Face *f) -{ - for (int cdt_e_orig : cdt_out.edge_orig[cdt_e_out]) { - if (cdt_e_orig != NO_INDEX) { - BLI_assert(cdt_e_orig >= cdt_out.face_edge_offset); - int a = cdt_e_orig / cdt_out.face_edge_offset; - int b = cdt_e_orig % cdt_out.face_edge_offset; - /* It is the bth position within cdt input face a - 1. There is only one face, f. */ - BLI_assert(a == 1); - UNUSED_VARS_NDEBUG(a); - BLI_assert(b < f->size()); - return f->edge_orig[b]; - } - } - return NO_INDEX; -} - /** * Tessellate face f into triangles and return an array of `const Face *` - * giving that triangulation. + * giving that triangulation. Intended to be used when f has > 4 vertices. * Care is taken so that the original edge index associated with * each edge in the output triangles either matches the original edge * for the (identical) edge of f, or else is -1. So diagonals added @@ -2638,62 +2600,55 @@ static int orig_edge_for_cdt_edge(const CDT_result &cdt_out, */ static Array triangulate_poly(Face *f, IMeshArena *arena) { + /* Similar to loop body in BM_mesh_calc_tesselation. */ int flen = f->size(); - CDT_input cdt_in; - cdt_in.vert = Array(flen); - cdt_in.face = Array>(1); - cdt_in.face[0].reserve(flen); - for (int i : f->index_range()) { - cdt_in.face[0].append(i); - } - /* Project poly along dominant axis of normal to get 2d coords. */ + BLI_assert(flen > 4); if (!f->plane_populated()) { f->populate_plane(false); } + /* Project along negative face normal so (x,y) can be used in 2d. */ const double3 &poly_normal = f->plane->norm; - int axis = double3::dominant_axis(poly_normal); - /* If project down y axis as opposed to x or z, the orientation - * of the polygon will be reversed. - * Yet another reversal happens if the poly normal in the dominant - * direction is opposite that of the positive dominant axis. */ - bool rev1 = (axis == 1); - bool rev2 = poly_normal[axis] < 0; - bool rev = rev1 ^ rev2; - for (int i = 0; i < flen; ++i) { - int ii = rev ? flen - i - 1 : i; - mpq2 &p2d = cdt_in.vert[ii]; - int k = 0; - for (int j = 0; j < 3; ++j) { - if (j != axis) { - p2d[k++] = (*f)[ii]->co_exact[j]; - } - } + float no[3] = {float(poly_normal[0]), float(poly_normal[1]), float(poly_normal[2])}; + normalize_v3(no); + float axis_mat[3][3]; + float(*projverts)[2]; + unsigned int(*tris)[3]; + const int totfilltri = flen - 2; + /* Prepare projected vertices and array to receive triangles in tesselation. */ + tris = static_cast(MEM_malloc_arrayN(totfilltri, sizeof(*tris), __func__)); + projverts = static_cast(MEM_malloc_arrayN(flen, sizeof(*projverts), __func__)); + axis_dominant_v3_to_m3_negate(axis_mat, no); + for (int j = 0; j < flen; ++j) { + const double3 &dco = (*f)[j]->co; + float co[3] = {float(dco[0]), float(dco[1]), float(dco[2])}; + mul_v2_m3v3(projverts[j], axis_mat, co); } - CDT_result cdt_out = delaunay_2d_calc(cdt_in, CDT_INSIDE); - int n_tris = cdt_out.face.size(); - Array ans(n_tris); - for (int t = 0; t < n_tris; ++t) { - int i_v_out[3]; - const Vert *v[3]; + BLI_polyfill_calc(projverts, flen, 1, tris); + /* Put tesselation triangles into Face form. Record original edges where they exist. */ + Array ans(totfilltri); + for (int t = 0; t < totfilltri; ++t) { + unsigned int *tri = tris[t]; int eo[3]; - for (int i = 0; i < 3; ++i) { - i_v_out[i] = cdt_out.face[t][i]; - v[i] = (*f)[cdt_out.vert_orig[i_v_out[i]][0]]; - } - for (int i = 0; i < 3; ++i) { - int e_out = find_cdt_edge(cdt_out, i_v_out[i], i_v_out[(i + 1) % 3]); - BLI_assert(e_out != -1); - eo[i] = orig_edge_for_cdt_edge(cdt_out, e_out, f); - } - if (rev) { - ans[t] = arena->add_face( - {v[0], v[2], v[1]}, f->orig, {eo[2], eo[1], eo[0]}, {false, false, false}); - } - else { + const Vert *v[3]; + for (int k = 0; k < 3; k++) { + BLI_assert(tri[k] < flen); + v[k] = (*f)[tri[k]]; + /* If tri edge goes between two successive indices in + * the original face, then it is an original edge. */ + if ((tri[k] + 1) % flen == tri[(k + 1) % 3]) { + eo[k] = f->edge_orig[tri[k]]; + } + else { + eo[k] = NO_INDEX; + } ans[t] = arena->add_face( {v[0], v[1], v[2]}, f->orig, {eo[0], eo[1], eo[2]}, {false, false, false}); } } + + MEM_freeN(tris); + MEM_freeN(projverts); + return ans; }